From 009604c27e72894358b2d11ae4bfc1fe7574de18 Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 4 Feb 2020 16:02:26 +0200 Subject: [PATCH] Favourites --- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 2 +- .../kotatsu/core/db/FavouriteCategoriesDao.kt | 20 +++++++++ .../koitharu/kotatsu/core/db/FavouritesDao.kt | 23 ++++++++++ .../koitharu/kotatsu/core/db/MangaDatabase.kt | 16 ++++--- .../core/db/entity/FavouriteCategoryEntity.kt | 22 ++++++++++ .../kotatsu/core/db/entity/FavouriteEntity.kt | 11 +++++ .../kotatsu/core/db/entity/FavouriteManga.kt | 25 +++++++++++ .../kotatsu/core/model/FavouriteCategory.kt | 12 +++++ .../domain/favourites/FavouritesRepository.kt | 43 ++++++++++++++++++ .../ui/details/MangaDetailsActivity.kt | 19 +++++++- .../koitharu/kotatsu/ui/main/MainActivity.kt | 3 +- .../main/list/favourites/CategoriesAdapter.kt | 34 ++++++++++++++ .../ui/main/list/favourites/CategoryHolder.kt | 16 +++++++ .../favourites/FavouriteCategoriesDialog.kt | 7 +++ .../list/favourites/FavouritesListFragment.kt | 43 ++++++++++++++++++ .../favourites/FavouritesListPresenter.kt | 44 +++++++++++++++++++ .../favourites/OnCategoryCheckListener.kt | 10 +++++ app/src/main/res/layout/activity_details.xml | 4 +- .../res/layout/dialog_favorite_categories.xml | 31 +++++++++++++ .../res/layout/item_caegory_checkable.xml | 16 +++++++ app/src/main/res/menu/opt_details.xml | 11 +++++ app/src/main/res/values/strings.xml | 1 + 22 files changed, 402 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteCategoryEntity.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteEntity.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteManga.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/model/FavouriteCategory.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoriesAdapter.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoryHolder.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouriteCategoriesDialog.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListFragment.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListPresenter.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/OnCategoryCheckListener.kt create mode 100644 app/src/main/res/layout/dialog_favorite_categories.xml create mode 100644 app/src/main/res/layout/item_caegory_checkable.xml create mode 100644 app/src/main/res/menu/opt_details.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 321e2dfb9..22e24649b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -54,5 +54,5 @@ class KotatsuApp : Application() { applicationContext, MangaDatabase::class.java, "kotatsu-db" - ).fallbackToDestructiveMigration() //TODO remove + ) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt new file mode 100644 index 000000000..141b64815 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt @@ -0,0 +1,20 @@ +package org.koitharu.kotatsu.core.db + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import org.koitharu.kotatsu.core.db.entity.FavouriteCategoryEntity + +@Dao +abstract class FavouriteCategoriesDao { + + @Query("SELECT category_id,title,created_at FROM favourite_categories ORDER BY :orderBy") + abstract suspend fun findAll(orderBy: String): List + + @Insert(onConflict = OnConflictStrategy.ABORT) + abstract suspend fun insert(category: FavouriteCategoryEntity): Long + + @Query("DELETE FROM favourite_categories WHERE category_id = :id") + abstract suspend fun delete(id: Long) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt new file mode 100644 index 000000000..c3e1252bc --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt @@ -0,0 +1,23 @@ +package org.koitharu.kotatsu.core.db + +import androidx.room.* +import org.koitharu.kotatsu.core.db.entity.FavouriteEntity +import org.koitharu.kotatsu.core.db.entity.FavouriteManga + +@Dao +abstract class FavouritesDao { + + @Transaction + @Query("SELECT * FROM favourites ORDER BY :orderBy LIMIT :limit OFFSET :offset") + abstract suspend fun findAll(offset: Int, limit: Int, orderBy: String): List + + @Transaction + @Query("SELECT * FROM favourites WHERE manga_id = :id") + abstract suspend fun find(id: Long): FavouriteManga? + + @Insert(onConflict = OnConflictStrategy.IGNORE) + abstract suspend fun add(favourite: FavouriteEntity) + + @Delete + abstract suspend fun delete(favourite: FavouriteEntity) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt index 59852d620..1668282e8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt @@ -2,12 +2,14 @@ package org.koitharu.kotatsu.core.db import androidx.room.Database import androidx.room.RoomDatabase -import org.koitharu.kotatsu.core.db.entity.HistoryEntity -import org.koitharu.kotatsu.core.db.entity.MangaEntity -import org.koitharu.kotatsu.core.db.entity.MangaTagsEntity -import org.koitharu.kotatsu.core.db.entity.TagEntity +import org.koitharu.kotatsu.core.db.entity.* -@Database(entities = [MangaEntity::class, TagEntity::class, HistoryEntity::class, MangaTagsEntity::class], version = 1) +@Database( + entities = [ + MangaEntity::class, TagEntity::class, HistoryEntity::class, MangaTagsEntity::class, + FavouriteCategoryEntity::class, FavouriteEntity::class + ], version = 1 +) abstract class MangaDatabase : RoomDatabase() { abstract fun historyDao(): HistoryDao @@ -15,4 +17,8 @@ abstract class MangaDatabase : RoomDatabase() { abstract fun tagsDao(): TagsDao abstract fun mangaDao(): MangaDao + + abstract fun favouritesDao(): FavouritesDao + + abstract fun favouriteCategoriesDao(): FavouriteCategoriesDao } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteCategoryEntity.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteCategoryEntity.kt new file mode 100644 index 000000000..4fa94c461 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteCategoryEntity.kt @@ -0,0 +1,22 @@ +package org.koitharu.kotatsu.core.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import org.koitharu.kotatsu.core.model.FavouriteCategory +import java.util.* + +@Entity(tableName = "favourite_categories") +data class FavouriteCategoryEntity( + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "category_id") val categoryId: Int, + @ColumnInfo(name = "created_at") val createdAt: Long, + @ColumnInfo(name = "title") val title: String +) { + + fun toFavouriteCategory(id: Long? = null) = FavouriteCategory( + id = id ?: categoryId.toLong(), + title = title, + createdAt = Date(createdAt) + ) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteEntity.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteEntity.kt new file mode 100644 index 000000000..c6e5ed23d --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteEntity.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.core.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity + +@Entity(tableName = "favourites", primaryKeys = ["manga_id", "category_id"]) +data class FavouriteEntity( + @ColumnInfo(name = "manga_id") val mangaId: Long, + @ColumnInfo(name = "category_id") val categoryId: Long, + @ColumnInfo(name = "created_at") val createdAt: Long +) \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteManga.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteManga.kt new file mode 100644 index 000000000..d641b2508 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/FavouriteManga.kt @@ -0,0 +1,25 @@ +package org.koitharu.kotatsu.core.db.entity + +import androidx.room.Embedded +import androidx.room.Junction +import androidx.room.Relation + +data class FavouriteManga( + @Embedded val favourite: FavouriteEntity, + @Relation( + parentColumn = "manga_id", + entityColumn = "manga_id" + ) + val manga: MangaEntity, + @Relation( + parentColumn = "category_id", + entityColumn = "category_id" + ) + val categories: List, + @Relation( + parentColumn = "manga_id", + entityColumn = "tag_id", + associateBy = Junction(MangaTagsEntity::class) + ) + val tags: List +) \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/FavouriteCategory.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/FavouriteCategory.kt new file mode 100644 index 000000000..0ab093179 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/FavouriteCategory.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.core.model + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize +import java.util.* + +@Parcelize +data class FavouriteCategory( + val id: Long, + val title: String, + val createdAt: Date +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt new file mode 100644 index 000000000..2115f6699 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt @@ -0,0 +1,43 @@ +package org.koitharu.kotatsu.domain.favourites + +import org.koin.core.KoinComponent +import org.koin.core.inject +import org.koitharu.kotatsu.core.db.MangaDatabase +import org.koitharu.kotatsu.core.db.entity.FavouriteCategoryEntity +import org.koitharu.kotatsu.core.db.entity.TagEntity +import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.model.Manga + +class FavouritesRepository : KoinComponent { + + private val db: MangaDatabase by inject() + + suspend fun getAllManga(offset: Int): List { + val entities = db.favouritesDao().findAll(offset, 20, "created_at") + return entities.map { it.manga.toManga(it.tags.map(TagEntity::toMangaTag).toSet()) } + } + + suspend fun getAllCategories(): List { + val entities = db.favouriteCategoriesDao().findAll("created_at") + return entities.map { it.toFavouriteCategory() } + } + + suspend fun getCategories(mangaId: Long): List { + val entities = db.favouritesDao().find(mangaId)?.categories + return entities?.map { it.toFavouriteCategory() }.orEmpty() + } + + suspend fun addCategory(title: String): FavouriteCategory { + val entity = FavouriteCategoryEntity( + title = title, + createdAt = System.currentTimeMillis(), + categoryId = 0 + ) + val id = db.favouriteCategoriesDao().insert(entity) + return entity.toFavouriteCategory(id) + } + + suspend fun removeCategory(id: Long) { + db.favouriteCategoriesDao().delete(id) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt index 2ab2db4f6..279b84bd7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt @@ -3,6 +3,8 @@ package org.koitharu.kotatsu.ui.details import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.Menu +import android.view.MenuItem import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.activity_details.* import moxy.ktx.moxyPresenter @@ -39,11 +41,24 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView { Snackbar.make(pager, e.getDisplayMessage(resources), Snackbar.LENGTH_LONG).show() } + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.opt_details, menu) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { + R.id.action_favourite -> { + true + } + else -> super.onOptionsItemSelected(item) + } + companion object { private const val EXTRA_MANGA = "manga" - fun newIntent(context: Context, manga: Manga) = Intent(context, MangaDetailsActivity::class.java) - .putExtra(EXTRA_MANGA, manga) + fun newIntent(context: Context, manga: Manga) = + Intent(context, MangaDetailsActivity::class.java) + .putExtra(EXTRA_MANGA, manga) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt index 0934d480b..c01a5217a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt @@ -10,6 +10,7 @@ import kotlinx.android.synthetic.main.activity_main.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.main.list.favourites.FavouritesListFragment import org.koitharu.kotatsu.ui.main.list.history.HistoryListFragment import org.koitharu.kotatsu.ui.main.list.remote.RemoteListFragment @@ -56,7 +57,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList setPrimaryFragment(RemoteListFragment.newInstance(source)) } else when (item.itemId) { R.id.nav_history -> setPrimaryFragment(HistoryListFragment.newInstance()) - R.id.nav_favourites -> Unit + R.id.nav_favourites -> setPrimaryFragment(FavouritesListFragment.newInstance()) R.id.nav_local_storage -> Unit else -> return false } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoriesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoriesAdapter.kt new file mode 100644 index 000000000..0545b280c --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoriesAdapter.kt @@ -0,0 +1,34 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import android.util.SparseBooleanArray +import android.view.ViewGroup +import android.widget.Checkable +import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.common.list.BaseViewHolder + +class CategoriesAdapter(private val listener: OnCategoryCheckListener) : + BaseRecyclerAdapter() { + + private val checkedIds = SparseBooleanArray() + + override fun getExtra(item: FavouriteCategory, position: Int) = + checkedIds.get(item.id.toInt(), false) + + override fun onCreateViewHolder(parent: ViewGroup) = CategoryHolder(parent) + + override fun onGetItemId(item: FavouriteCategory) = item.id + + override fun onViewHolderCreated(holder: BaseViewHolder) { + super.onViewHolderCreated(holder) + holder.itemView.setOnClickListener { + if (it !is Checkable) return@setOnClickListener + it.toggle() + if (it.isChecked) { + listener.onCategoryChecked(holder.requireData()) + } else { + listener.onCategoryUnchecked(holder.requireData()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoryHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoryHolder.kt new file mode 100644 index 000000000..aa31981a6 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/CategoryHolder.kt @@ -0,0 +1,16 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import android.view.ViewGroup +import kotlinx.android.synthetic.main.item_caegory_checkable.* +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.ui.common.list.BaseViewHolder + +class CategoryHolder(parent: ViewGroup) : + BaseViewHolder(parent, R.layout.item_caegory_checkable) { + + override fun onBind(data: FavouriteCategory, extra: Boolean) { + checkedTextView.text = data.title + checkedTextView.isChecked = extra + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouriteCategoriesDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouriteCategoriesDialog.kt new file mode 100644 index 000000000..d4ed778cf --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouriteCategoriesDialog.kt @@ -0,0 +1,7 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.common.AlertDialogFragment + +class FavouriteCategoriesDialog() : AlertDialogFragment(R.layout.dialog_favorite_categories) { +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListFragment.kt new file mode 100644 index 000000000..69b093706 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListFragment.kt @@ -0,0 +1,43 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import kotlinx.android.synthetic.main.fragment_list.* +import moxy.ktx.moxyPresenter +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.main.list.MangaListFragment +import org.koitharu.kotatsu.ui.main.list.MangaListView + +class FavouritesListFragment : MangaListFragment(), MangaListView{ + + private val presenter by moxyPresenter(factory = ::FavouritesListPresenter) + + override fun onRequestMoreItems(offset: Int) { + presenter.loadList(offset) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { +// inflater.inflate(R.menu.opt_history, menu) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem) = when(item.itemId) { + + else -> super.onOptionsItemSelected(item) + } + + override fun getTitle(): CharSequence? { + return getString(R.string.favourites) + } + + override fun setUpEmptyListHolder() { + textView_holder.setText(R.string.you_have_not_favourites_yet) + textView_holder.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0) + } + + companion object { + + fun newInstance() = FavouritesListFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListPresenter.kt new file mode 100644 index 000000000..9356fe005 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/FavouritesListPresenter.kt @@ -0,0 +1,44 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import moxy.InjectViewState +import org.koitharu.kotatsu.BuildConfig +import org.koitharu.kotatsu.domain.favourites.FavouritesRepository +import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.main.list.MangaListView + +@InjectViewState +class FavouritesListPresenter : BasePresenter>() { + + private lateinit var repository: FavouritesRepository + + override fun onFirstViewAttach() { + repository = FavouritesRepository() + super.onFirstViewAttach() + } + + fun loadList(offset: Int) { + launch { + viewState.onLoadingChanged(true) + try { + val list = withContext(Dispatchers.IO) { + repository.getAllManga(offset = offset) + } + if (offset == 0) { + viewState.onListChanged(list) + } else { + viewState.onListAppended(list) + } + } catch (e: Exception) { + if (BuildConfig.DEBUG) { + e.printStackTrace() + } + viewState.onError(e) + } finally { + viewState.onLoadingChanged(false) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/OnCategoryCheckListener.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/OnCategoryCheckListener.kt new file mode 100644 index 000000000..cc58880eb --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/OnCategoryCheckListener.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.ui.main.list.favourites + +import org.koitharu.kotatsu.core.model.FavouriteCategory + +interface OnCategoryCheckListener { + + fun onCategoryChecked(category: FavouriteCategory) + + fun onCategoryUnchecked(category: FavouriteCategory) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index b6a527f1b..2127e5beb 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -8,13 +8,13 @@ + android:layout_height="wrap_content" + android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"> diff --git a/app/src/main/res/layout/dialog_favorite_categories.xml b/app/src/main/res/layout/dialog_favorite_categories.xml new file mode 100644 index 000000000..f82d8441f --- /dev/null +++ b/app/src/main/res/layout/dialog_favorite_categories.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_caegory_checkable.xml b/app/src/main/res/layout/item_caegory_checkable.xml new file mode 100644 index 000000000..f04925170 --- /dev/null +++ b/app/src/main/res/layout/item_caegory_checkable.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/opt_details.xml b/app/src/main/res/menu/opt_details.xml new file mode 100644 index 000000000..196e33866 --- /dev/null +++ b/app/src/main/res/menu/opt_details.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d065462a..30d2658ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,4 +25,5 @@ Read Continue Add bookmark + You have not favourites yet \ No newline at end of file