diff --git a/XiinderBackend/src/main/kotlin/com/example/Application.kt b/XiinderBackend/src/main/kotlin/com/example/Application.kt index 50ffa61..71bf70b 100644 --- a/XiinderBackend/src/main/kotlin/com/example/Application.kt +++ b/XiinderBackend/src/main/kotlin/com/example/Application.kt @@ -5,6 +5,7 @@ import com.example.database.DatabaseFactory import io.ktor.server.application.* import io.ktor.server.netty.* import com.example.plugins.* +import io.ktor.client.plugins.* import io.ktor.server.plugins.contentnegotiation.* import io.ktor.serialization.kotlinx.json.* import kotlinx.serialization.modules.SerializersModule @@ -18,10 +19,12 @@ fun Application.module() { { json() } + SerializersModule { DateAsLongSerializer } DatabaseFactory.init(environment.config) configureSecurity() configureRouting() + } diff --git a/XiinderBackend/src/main/kotlin/com/example/CardService.kt b/XiinderBackend/src/main/kotlin/com/example/CardService.kt new file mode 100644 index 0000000..3b6a6ca --- /dev/null +++ b/XiinderBackend/src/main/kotlin/com/example/CardService.kt @@ -0,0 +1,26 @@ +package com.example + +import com.example.dao.CardsDAO +import com.example.dao.UserLoginInfoDAO +import com.example.models.Card +import com.example.plugins.CardItem +import com.example.plugins.User +import com.example.plugins.UserRegister +import com.example.repository.CardsRepository +import com.example.repository.UserLoginInfoRepository +import com.example.repository.UserRepository +import kotlinx.coroutines.runBlocking +import org.jetbrains.exposed.sql.transactions.transaction + +class CardService { + private val cardRepository: CardsRepository = CardsDAO() + private val userRepository: UserLoginInfoRepository =UserLoginInfoDAO() + fun addCard(card: CardItem): Boolean { + transaction { Card.new { namee=card.namee;title=card.title;info=card.info;contact=card.contacts;image=card.image; } } + return true + } + fun getCards(username: String): List? + { + return cardRepository.getBunchOfCards(username) + } +} \ No newline at end of file diff --git a/XiinderBackend/src/main/kotlin/com/example/dao/CardsDAO.kt b/XiinderBackend/src/main/kotlin/com/example/dao/CardsDAO.kt new file mode 100644 index 0000000..9d824b4 --- /dev/null +++ b/XiinderBackend/src/main/kotlin/com/example/dao/CardsDAO.kt @@ -0,0 +1,23 @@ +package com.example.dao + +import com.example.models.Card +import com.example.models.cards +import com.example.models.User +import com.example.repository.CardsRepository + +import org.jetbrains.exposed.sql.SqlExpressionBuilder.neq +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.selectAll +import org.jetbrains.exposed.sql.transactions.transaction + +class CardsDAO:CardsRepository { + override fun add(card: Card)= + transaction { + Card.new { namee=card.namee;title=card.title;info=card.info;contact=card.contact;image=card.image; } + } + + override fun getBunchOfCards(name: String)= transaction { cards + .select(cards.namee neq name) + .limit(10).let { Card.wrapRows(it) }.toList() } + +} \ No newline at end of file diff --git a/XiinderBackend/src/main/kotlin/com/example/database/Database.kt b/XiinderBackend/src/main/kotlin/com/example/database/Database.kt index 877f94f..6885941 100644 --- a/XiinderBackend/src/main/kotlin/com/example/database/Database.kt +++ b/XiinderBackend/src/main/kotlin/com/example/database/Database.kt @@ -2,6 +2,7 @@ package com.example.database import com.example.models.UserLoginInfos import com.example.models.Users +import com.example.models.cards import io.ktor.server.config.* import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.sql.* @@ -18,6 +19,7 @@ object DatabaseFactory { transaction(database) { SchemaUtils.create(Users) SchemaUtils.create(UserLoginInfos) + SchemaUtils.create(cards) } } diff --git a/XiinderBackend/src/main/kotlin/com/example/models/Card.kt b/XiinderBackend/src/main/kotlin/com/example/models/Card.kt new file mode 100644 index 0000000..7d07730 --- /dev/null +++ b/XiinderBackend/src/main/kotlin/com/example/models/Card.kt @@ -0,0 +1,27 @@ +package com.example.models + +import io.ktor.server.util.* +import org.jetbrains.exposed.dao.IntEntity +import org.jetbrains.exposed.dao.IntEntityClass +import org.jetbrains.exposed.dao.id.EntityID +import org.jetbrains.exposed.dao.id.IntIdTable + + +class Card(id: EntityID) : IntEntity(id) { + companion object : IntEntityClass(cards) + var namee by cards.namee + var title by cards.title + var info by cards.info + var contact by cards.contact + var image by cards.image + + +} +object cards : IntIdTable() { + val namee = varchar("namee", 40) + val title = varchar("title", 40) + val info = varchar("info",250) + val image= varchar("image",500) + val contact = varchar("telegram", 50) + +} \ No newline at end of file diff --git a/XiinderBackend/src/main/kotlin/com/example/plugins/Routing.kt b/XiinderBackend/src/main/kotlin/com/example/plugins/Routing.kt index aee15d9..852094e 100644 --- a/XiinderBackend/src/main/kotlin/com/example/plugins/Routing.kt +++ b/XiinderBackend/src/main/kotlin/com/example/plugins/Routing.kt @@ -1,14 +1,22 @@ package com.example.plugins +import com.example.CardService +import com.example.dao.CardsDAO import io.ktor.server.routing.* import io.ktor.server.application.* import io.ktor.server.auth.* +import io.ktor.server.request.* import io.ktor.server.response.* +import kotlinx.serialization.Serializable + +@Serializable +data class CardItem(val namee:String,val title:String, val info:String, val contacts:String, val image:String) fun Application.configureRouting() { routing { authorizedRouting() unauthorizedRouting() + cardsRouting() } } @@ -25,4 +33,18 @@ fun Route.unauthorizedRouting() { call.respondText("Hello, world!") } } +fun Route.cardsRouting() +{ + get("/get_cards") + { + val cards=CardService().getCards(call.receiveText()) + if (cards != null) { + call.respond(cards.map {CardItem(it.namee,it.title,it.info,it.contact,it.image) }) + } + } + post("/add_card") { + val cardItem=call.receive() + CardService().addCard(cardItem) + } +} diff --git a/XiinderBackend/src/main/kotlin/com/example/plugins/Security.kt b/XiinderBackend/src/main/kotlin/com/example/plugins/Security.kt index a239675..b06e79d 100644 --- a/XiinderBackend/src/main/kotlin/com/example/plugins/Security.kt +++ b/XiinderBackend/src/main/kotlin/com/example/plugins/Security.kt @@ -17,6 +17,7 @@ import io.ktor.server.response.* import io.ktor.server.routing.* import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers + import java.time.LocalDate import java.util.* diff --git a/XiinderBackend/src/main/kotlin/com/example/repository/CardsRepository.kt b/XiinderBackend/src/main/kotlin/com/example/repository/CardsRepository.kt new file mode 100644 index 0000000..2d92a8e --- /dev/null +++ b/XiinderBackend/src/main/kotlin/com/example/repository/CardsRepository.kt @@ -0,0 +1,10 @@ +package com.example.repository + +import com.example.models.Card +import com.example.models.User + + +interface CardsRepository { + fun add(card: Card) : Card + fun getBunchOfCards(name: String):List +} \ No newline at end of file diff --git a/XiinderFront/Screenshot_20230201_141629.png b/XiinderFront/Screenshot_20230201_141629.png new file mode 100644 index 0000000..5168a0c Binary files /dev/null and b/XiinderFront/Screenshot_20230201_141629.png differ diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/Card.kt b/XiinderFront/app/src/main/java/com/example/xiinder/Card.kt new file mode 100644 index 0000000..9c914e5 --- /dev/null +++ b/XiinderFront/app/src/main/java/com/example/xiinder/Card.kt @@ -0,0 +1,6 @@ +package com.example.xiinder + +import kotlinx.serialization.Serializable + +@Serializable +data class Card(val namee:String, val title:String, val info:String, val contacts:String, val image:String) diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/DataSetForCards.kt b/XiinderFront/app/src/main/java/com/example/xiinder/DataSetForCards.kt index 0e5a0c7..83e8b28 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/DataSetForCards.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/DataSetForCards.kt @@ -1,18 +1,49 @@ package com.example.xiinder +import android.widget.Toast +import androidx.core.content.ContentProviderCompat.requireContext +import androidx.lifecycle.ViewModel import com.example.xiinder.network.CardInfo import com.example.xiinder.network.ProfileInfo +import io.ktor.client.call.* +import io.ktor.client.plugins.* +import io.ktor.client.request.* +import io.ktor.client.utils.EmptyContent.contentType +import io.ktor.http.* +import kotlinx.coroutines.coroutineScope class DataSetForCards { - fun loadCards():Map + suspend fun loadCards(viewModel:SharedViewModel):Map { - return hashMapOf( - 0 to CardInfo(0,1,"Ищу сокомандника на icpc", "Let's go drink",R.drawable.mobile_01), - 1 to CardInfo(1,2,"Помогите с задачей по матанализу", "Let's go study",R.drawable.mobile_02), - 2 to CardInfo(2,3,"Продаю операционные системы Танненбаума", "Let's go sing",R.drawable.mobile_03), - 3 to CardInfo(3,4,"Нужен человек, знающий js, для работы в проекте", "Let's go swim",R.drawable.mobile_04), - 4 to CardInfo(4,5,"Придумайте заголовки за меня", "Let's go eat",R.drawable.mobile_05), - 5 to CardInfo(5,6,"Ваше такси до Верхней Пышмы", "Let's go",R.drawable.mobile_06) - ) + val message = viewModel.client.get("http://192.168.0.10:8888/get_cards"){ // or your data class + contentType(ContentType.Application.Json) + setBody(viewModel.getUsername()) + timeout { requestTimeoutMillis=10000 } + } + when (message.status.value) + { + 200-> + { + var a=message.body>() + print(a) + a.map { CardInfo(0,1,it.title,it.info,R.drawable.mobile_01) } + return a.associate { a.indexOf(it) to CardInfo(0, 1, it.title, it.info, R.drawable.mobile_01) } +// return hashMapOf( +// 0 to CardInfo(0,1,"Ищу сокомандника на icpc", "Let's go drink",R.drawable.mobile_01), +// 1 to CardInfo(1,2,"Помогите с задачей по матанализу", "Let's go study",R.drawable.mobile_02), +// 2 to CardInfo(2,3,"Продаю операционные системы Танненбаума", "Let's go sing",R.drawable.mobile_03), +// 3 to CardInfo(3,4,"Нужен человек, знающий js, для работы в проекте", "Let's go swim",R.drawable.mobile_04), +// 4 to CardInfo(4,5,"Придумайте заголовки за меня", "Let's go eat",R.drawable.mobile_05), +// 5 to CardInfo(5,6,"Ваше такси до Верхней Пышмы", "Let's go",R.drawable.mobile_06) + + } + 401-> + { + return hashMapOf() + } + else ->{ + return hashMapOf()} + } + } } \ No newline at end of file diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/MainActivity.kt b/XiinderFront/app/src/main/java/com/example/xiinder/MainActivity.kt index 1caab4d..7dde893 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/MainActivity.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/MainActivity.kt @@ -2,6 +2,8 @@ package com.example.xiinder import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import androidx.activity.viewModels import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/SharedViewModel.kt b/XiinderFront/app/src/main/java/com/example/xiinder/SharedViewModel.kt index ffe8c66..df68e0c 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/SharedViewModel.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/SharedViewModel.kt @@ -3,6 +3,8 @@ package com.example.xiinder import androidx.lifecycle.ViewModel import io.ktor.client.* import io.ktor.client.engine.cio.* +import io.ktor.client.engine.okhttp.* +import io.ktor.client.plugins.* import io.ktor.client.plugins.auth.* import io.ktor.client.plugins.auth.providers.* import io.ktor.client.plugins.contentnegotiation.* @@ -17,16 +19,23 @@ class SharedViewModel : ViewModel() { install(ContentNegotiation) { json() } + install(HttpTimeout) } private lateinit var storeToken:StoreToken - fun setTokenStorage(storeToken: StoreToken) + private lateinit var userName:String + fun setTokenStorage(storeToken: StoreToken,username:String) { this.storeToken=storeToken + this.userName=username } suspend fun getToken(): String? { return storeToken.getToken() } + suspend fun getUsername(): String? + { + return userName + } fun configAuthClient(token:Token) { client.config { install(Auth) @@ -40,7 +49,7 @@ class SharedViewModel : ViewModel() { } suspend fun clientCheck(token: Token) { - client.get("http://192.168.0.101:8888/hello"){ + client.get("http://192.168.0.10:8888/hello"){ bearerAuth(token.tokenData) } } diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/AuthFragment.kt b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/AuthFragment.kt index 6e34231..f7c7dab 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/AuthFragment.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/AuthFragment.kt @@ -66,7 +66,7 @@ class AuthFragment : Fragment() { private suspend fun check(email:String, password:String):Boolean { val user= User(email,password) - val message = viewModel.client.post("http://192.168.0.104:8888/login"){ // or your data class + val message = viewModel.client.post("http://192.168.0.10:8888/login"){ // or your data class contentType(ContentType.Application.Json) setBody(user) } @@ -77,7 +77,7 @@ class AuthFragment : Fragment() { val token= message.body>()["token"]?.let { Token(it) } viewModel.configAuthClient(token!!) coroutineScope { dataStore.saveToken(token.tokenData) } - viewModel.setTokenStorage(storeToken = dataStore) + viewModel.setTokenStorage(storeToken = dataStore, username = user.username) return true } 401-> diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardDetailsFragment.kt b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardDetailsFragment.kt index 3b8296a..d7d8efc 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardDetailsFragment.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardDetailsFragment.kt @@ -5,12 +5,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.example.xiinder.DataSetForCards +import com.example.xiinder.SharedViewModel import com.example.xiinder.databinding.FragmentCardDetailsBinding +import kotlinx.coroutines.launch class CardDetailsFragment : Fragment() { + private val viewModel: SharedViewModel by activityViewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -20,17 +25,18 @@ class CardDetailsFragment : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment + val args: CardDetailsFragmentArgs by navArgs() val cardId = args.cardId - val currentCard = DataSetForCards().loadCards()[cardId] val binding = FragmentCardDetailsBinding.inflate(layoutInflater) val rootView = binding.root + lifecycleScope.launch{ val currentCard = DataSetForCards().loadCards(viewModel)[cardId] if (currentCard != null) { binding.CardImage.setImageResource(currentCard.imageId) binding.CardInfo.text = currentCard.description binding.CardTitle.text = currentCard.title binding.executePendingBindings() - } + }} return rootView } } \ No newline at end of file diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardsFragment.kt b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardsFragment.kt index c1fa249..c487f50 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardsFragment.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CardsFragment.kt @@ -1,36 +1,52 @@ package com.example.xiinder.fragment +import android.annotation.SuppressLint import android.os.Bundle +import android.view.* +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import androidx.datastore.dataStore -import androidx.datastore.dataStoreFile -import androidx.navigation.fragment.NavHostFragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView import com.example.xiinder.* import com.example.xiinder.databinding.FragmentCardsBinding +import com.example.xiinder.MainActivity +import com.example.xiinder.network.CardInfo +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch + lateinit var binding: FragmentCardsBinding class CardsFragment : Fragment() { + private val viewModel:SharedViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentCardsBinding.inflate(inflater) - binding.photosLinear.adapter= this.context?.let { CardsAdapter(it, - DataForProfiles().getProfilesInfo(), DataSetForCards().loadCards(), - ::goToProfileFragment, ::goToCardDetailsFragment) } + binding = FragmentCardsBinding.inflate(inflater) + CoroutineScope(Dispatchers.Main).launch { binding.photosLinear.adapter= context?.let { CardsAdapter(it, + DataForProfiles().getProfilesInfo(), DataSetForCards().loadCards(viewModel), + ::goToProfileFragment, ::goToCardDetailsFragment) }} return binding.root } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + binding.toolbar.inflateMenu(R.menu.menu) + + binding.toolbar.setOnMenuItemClickListener { + findNavController().navigate(R.id.action_cardsFragment_to_createCard);true; + } + } + private fun goToProfileFragment(profileId: Int) { val action = CardsFragmentDirections.actionCardsFragmentToProfileFragment(profileId) findNavController().navigate(action) diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CreateCard.kt b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CreateCard.kt new file mode 100644 index 0000000..fb86ab5 --- /dev/null +++ b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/CreateCard.kt @@ -0,0 +1,83 @@ +package com.example.xiinder.fragment + +import android.app.Activity.RESULT_OK +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import com.example.xiinder.Card +import com.example.xiinder.R +import com.example.xiinder.SharedViewModel +import com.example.xiinder.databinding.FragmentCreateCardBinding +import io.ktor.client.plugins.* +import io.ktor.client.request.* +import io.ktor.http.* +import kotlinx.coroutines.launch + + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + + +/** + * A simple [Fragment] subclass. + * Use the [CreateCard.newInstance] factory method to + * create an instance of this fragment. + */ +class CreateCard : Fragment() { + private val PICK_IMAGE=100 + private var imageUri: Uri? = null + var binding: FragmentCreateCardBinding?=null + private val viewModel: SharedViewModel by activityViewModels() + // TODO: Rename and change types of parameters + + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val fragmentBinding=FragmentCreateCardBinding.inflate(inflater,container,false) + binding=fragmentBinding + binding!!.button2.setOnClickListener { + val title=binding!!.editTitle.text + val info=binding!!.editInfo.text + val contact=binding!!.editContacts.text + val image=binding!!.imageView.drawable + if (title.isNotEmpty()&&info.isNotEmpty()&&contact.isNotEmpty()&&image!=null) + {lifecycleScope.launch { viewModel.getUsername() + ?.let { it1 -> apply(it1,title.toString(),info.toString(),contact.toString(),"dataMock") } }} + } + binding!!.uploadImage.setOnClickListener { + val intent = Intent() + intent.type = "image/*" + intent.action = Intent.ACTION_GET_CONTENT + startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE) } + return fragmentBinding.root + } + suspend fun apply(uN:String,title:String, info:String, contacts:String, image:String) + { + val card= Card(uN,title,info,contacts,image) + viewModel.client.post("http://192.168.0.10:8888/add_card"){ // or your data class + contentType(ContentType.Application.Json) + setBody(card) + timeout { requestTimeoutMillis=10000 } + } + findNavController().navigate(R.id.action_createCard_to_cardsFragment) + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) { + imageUri = data?.data + binding?.imageView?.setImageURI(imageUri) + } + } +} \ No newline at end of file diff --git a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/SignUpFragment.kt b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/SignUpFragment.kt index a9407ea..42035bd 100644 --- a/XiinderFront/app/src/main/java/com/example/xiinder/fragment/SignUpFragment.kt +++ b/XiinderFront/app/src/main/java/com/example/xiinder/fragment/SignUpFragment.kt @@ -65,7 +65,7 @@ class SignUpFragment : Fragment() { ):Boolean { val usver=UserRegister(email,password,name, date,telegramId) - val message = viewModel.client.post("http://192.168.0.104:8888/register"){ // or your data class + val message = viewModel.client.post("http://192.168.0.10:8888/register"){ // or your data class contentType(ContentType.Application.Json) setBody(usver) } @@ -78,7 +78,7 @@ class SignUpFragment : Fragment() { val token= message.body>()["token"]?.let { Token(it) } viewModel.configAuthClient(token!!) coroutineScope { dataStore.saveToken(token.tokenData) } - viewModel.setTokenStorage(storeToken = dataStore) + viewModel.setTokenStorage(storeToken = dataStore,usver.username) return true } 409-> diff --git a/XiinderFront/app/src/main/res/drawable/ic_baseline_control_point_24.xml b/XiinderFront/app/src/main/res/drawable/ic_baseline_control_point_24.xml new file mode 100644 index 0000000..d1c91f7 --- /dev/null +++ b/XiinderFront/app/src/main/res/drawable/ic_baseline_control_point_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/XiinderFront/app/src/main/res/layout/fragment_cards.xml b/XiinderFront/app/src/main/res/layout/fragment_cards.xml index d38bd90..680f76e 100644 --- a/XiinderFront/app/src/main/res/layout/fragment_cards.xml +++ b/XiinderFront/app/src/main/res/layout/fragment_cards.xml @@ -10,10 +10,23 @@ type="com.example.xiinder.fragment.CardsFragment" /> + + + + + + tools:listitem="@layout/card_item" + /> + \ No newline at end of file diff --git a/XiinderFront/app/src/main/res/layout/fragment_create_card.xml b/XiinderFront/app/src/main/res/layout/fragment_create_card.xml new file mode 100644 index 0000000..f1fa873 --- /dev/null +++ b/XiinderFront/app/src/main/res/layout/fragment_create_card.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + +