From b59fbc1a8b284409f3bd6e39ae98d2b9bd83b90a Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 5 Feb 2023 19:34:06 +0100 Subject: [PATCH] Just take the 0 --- .../data/UrbanDictionaryDatabase.kt | 3 +- .../data/definition/DefinitionDao.kt | 2 +- .../data/entry/EntryDao.kt | 20 ++- .../urbandictionarylight/model/Definition.kt | 3 +- .../iut/urbandictionarylight/model/Entry.kt | 2 +- .../model/EntryWithDefinitions.kt | 8 +- .../ui/fragment/EntryListFragment.kt | 2 +- .../ui/utils/EntryPagerAdapter.kt | 6 +- .../ui/utils/EntryRecyclerViewAdapter.kt | 4 +- .../ui/viewmodel/EntryViewModel.kt | 4 +- app/src/main/res/drawable/ic_thumb_up.xml | 5 + app/src/main/res/layout/fragment_entry.xml | 121 +++--------------- .../main/res/layout/fragment_list_entry.xml | 2 +- .../main/res/layout/item_list_definition.xml | 61 +++++++++ app/src/main/res/layout/item_list_entry.xml | 2 +- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 1 + 17 files changed, 122 insertions(+), 125 deletions(-) create mode 100644 app/src/main/res/drawable/ic_thumb_up.xml create mode 100644 app/src/main/res/layout/item_list_definition.xml diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/UrbanDictionaryDatabase.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/UrbanDictionaryDatabase.kt index 48ce3a2..d6f2171 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/UrbanDictionaryDatabase.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/UrbanDictionaryDatabase.kt @@ -4,6 +4,7 @@ import android.app.Application import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import fr.uca.iut.urbandictionarylight.data.definition.DefinitionDao import fr.uca.iut.urbandictionarylight.data.entry.EntryDao import fr.uca.iut.urbandictionarylight.model.Definition import fr.uca.iut.urbandictionarylight.model.Entry @@ -14,7 +15,7 @@ private const val DB_FILE = "u_d_light.db" abstract class UrbanDictionaryDatabase : RoomDatabase() { abstract fun entryDao(): EntryDao - abstract fun definitionDao(): fr.uca.iut.urbandictionarylight.data.definition.DefinitionDao + abstract fun definitionDao(): DefinitionDao companion object { private lateinit var application: Application diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/definition/DefinitionDao.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/definition/DefinitionDao.kt index 3150267..f95eefa 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/definition/DefinitionDao.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/definition/DefinitionDao.kt @@ -9,7 +9,7 @@ interface DefinitionDao { @Query("SELECT * FROM definitions") fun queryAll(): LiveData> - @Query("SELECT * FROM entries WHERE id = :id") + @Query("SELECT * FROM entries WHERE definitionId = :id") fun query(id: Long): LiveData @Insert(onConflict = OnConflictStrategy.REPLACE) diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/entry/EntryDao.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/entry/EntryDao.kt index faef797..55109e2 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/data/entry/EntryDao.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/data/entry/EntryDao.kt @@ -2,19 +2,35 @@ package fr.uca.iut.urbandictionarylight.data.entry import androidx.lifecycle.LiveData import androidx.room.* +import fr.uca.iut.urbandictionarylight.model.Definition +import fr.uca.iut.urbandictionarylight.model.Entry import fr.uca.iut.urbandictionarylight.model.EntryWithDefinitions @Dao interface EntryDao { + @Transaction @Query("SELECT * FROM entries") fun queryAll(): LiveData> - @Query("SELECT * FROM entries WHERE id = :id") + @Transaction + @Query("SELECT * FROM entries WHERE entryId = :id") fun query(id: Long): LiveData @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insert(entry: EntryWithDefinitions) + suspend fun insert(entry: EntryWithDefinitions) { + val entryId: Long = insert(entry.entry) + for (def in entry.definitions) { + def.correspondingEntryId = entryId + insert(def) + } + } + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(entry: Entry): Long + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(entry: Definition) @Update suspend fun update(entry: EntryWithDefinitions) diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Definition.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Definition.kt index 095f1b3..626eb90 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Definition.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Definition.kt @@ -10,5 +10,6 @@ data class Definition( val content: String, val example: String, var upvotes: Int = 0, - @PrimaryKey(autoGenerate = true) val id: Long = NEW_DEFINITION_ID + var correspondingEntryId: Long, + @PrimaryKey(autoGenerate = true) val definitionId: Long = NEW_DEFINITION_ID ) \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Entry.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Entry.kt index c4d2d1d..7330986 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Entry.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/Entry.kt @@ -8,5 +8,5 @@ const val NEW_ENTRY_ID = 0L @Entity(tableName = "entries") data class Entry( val phrase: String = "", - @PrimaryKey(autoGenerate = true) val id: Long = NEW_ENTRY_ID + @PrimaryKey(autoGenerate = true) val entryId: Long = NEW_ENTRY_ID ) \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/EntryWithDefinitions.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/EntryWithDefinitions.kt index bf48de9..0f20694 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/model/EntryWithDefinitions.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/model/EntryWithDefinitions.kt @@ -1,12 +1,14 @@ package fr.uca.iut.urbandictionarylight.model import androidx.room.Embedded +import androidx.room.Entity import androidx.room.Relation data class EntryWithDefinitions( @Embedded val entry: Entry = Entry(), @Relation( - parentColumn = "id", - entityColumn = "entryId" - ) val definitions: List = listOf() + parentColumn = "entryId", + entityColumn = "correspondingEntryId" + ) + val definitions: List = mutableListOf() ) \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/fragment/EntryListFragment.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/fragment/EntryListFragment.kt index 6d87898..9caf74b 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/fragment/EntryListFragment.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/fragment/EntryListFragment.kt @@ -28,7 +28,7 @@ class EntryListFragment : Fragment(), EntryRecyclerViewAdapter.Callbacks { val binding = FragmentListEntryBinding.inflate(inflater) binding.entryListVM = entryListVM binding.lifecycleOwner = viewLifecycleOwner - with(binding.recyclerView) { + with(binding.entriesRecyclerView) { adapter = entryListAdapter ItemTouchHelper(EntryListItemTouchHelper()).attachToRecyclerView(this) } diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryPagerAdapter.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryPagerAdapter.kt index f3f671b..5b47050 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryPagerAdapter.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryPagerAdapter.kt @@ -13,12 +13,12 @@ class EntryPagerAdapter(fragmentActivity: FragmentActivity) : override fun getItemCount() = entryList.size override fun createFragment(position: Int) = - EntryFragment.newInstance(entryList[position].entry.id) + EntryFragment.newInstance(entryList[position].entry.entryId) - fun positionFromId(entryId: Long) = entryList.indexOfFirst { it.entry.id == entryId } + fun positionFromId(entryId: Long) = entryList.indexOfFirst { it.entry.entryId == entryId } fun entryIdAt(position: Int) = - if (entryList.isEmpty()) NEW_ENTRY_ID else entryList[position].entry.id + if (entryList.isEmpty()) NEW_ENTRY_ID else entryList[position].entry.entryId fun submitList(entryList: List) { this.entryList = entryList diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryRecyclerViewAdapter.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryRecyclerViewAdapter.kt index fb1aeb6..932138d 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryRecyclerViewAdapter.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/utils/EntryRecyclerViewAdapter.kt @@ -15,7 +15,7 @@ class EntryRecyclerViewAdapter(private val listener: Callbacks) : private object DiffUtilEntryCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: EntryWithDefinitions, newItem: EntryWithDefinitions) = - oldItem.entry.id == newItem.entry.id + oldItem.entry.entryId == newItem.entry.entryId override fun areContentsTheSame( oldItem: EntryWithDefinitions, @@ -40,7 +40,7 @@ class EntryRecyclerViewAdapter(private val listener: Callbacks) : val entry: EntryWithDefinitions? get() = binding.entryWithDefinitions init { - itemView.setOnClickListener { entry?.let { listener.onEntrySelected(it.entry.id) } } + itemView.setOnClickListener { entry?.let { listener.onEntrySelected(it.entry.entryId) } } } fun bind(entryWithDefinitions: EntryWithDefinitions) { diff --git a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/viewmodel/EntryViewModel.kt b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/viewmodel/EntryViewModel.kt index a10e11c..bbbbc71 100644 --- a/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/viewmodel/EntryViewModel.kt +++ b/app/src/main/java/fr/uca/iut/urbandictionarylight/ui/viewmodel/EntryViewModel.kt @@ -23,13 +23,13 @@ class EntryViewModel(entryId: Long) : ViewModel() { false else { viewModelScope.launch { - if (it.entry.id == NEW_ENTRY_ID) entryRepo.insert(it) else entryRepo.update(it) + if (it.entry.entryId == NEW_ENTRY_ID) entryRepo.insert(it) else entryRepo.update(it) } true } } fun deleteEntry() = viewModelScope.launch { - entry.value?.let { if (it.entry.id != NEW_ENTRY_ID) entryRepo.delete(it) } + entry.value?.let { if (it.entry.entryId != NEW_ENTRY_ID) entryRepo.delete(it) } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_thumb_up.xml b/app/src/main/res/drawable/ic_thumb_up.xml new file mode 100644 index 0000000..8fc592b --- /dev/null +++ b/app/src/main/res/drawable/ic_thumb_up.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_entry.xml b/app/src/main/res/layout/fragment_entry.xml index 9fe8d21..a98ab56 100644 --- a/app/src/main/res/layout/fragment_entry.xml +++ b/app/src/main/res/layout/fragment_entry.xml @@ -22,120 +22,29 @@ android:padding="@dimen/activity_margin" tools:context=".ui.activity.EntryActivity"> - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + tools:text="Phrase goes here" /> - - + - - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_list_entry.xml b/app/src/main/res/layout/fragment_list_entry.xml index 56b6ee1..e635135 100644 --- a/app/src/main/res/layout/fragment_list_entry.xml +++ b/app/src/main/res/layout/fragment_list_entry.xml @@ -30,7 +30,7 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_list_entry.xml b/app/src/main/res/layout/item_list_entry.xml index 8c86529..8c34637 100644 --- a/app/src/main/res/layout/item_list_entry.xml +++ b/app/src/main/res/layout/item_list_entry.xml @@ -24,7 +24,7 @@ android:padding="@dimen/activity_margin"> 16dp 8dp 24dp + 24dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 78f65e7..6f6a666 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ Delete That\'s a woopsie sorry bud, no can do + Phrase, term or entry \ No newline at end of file