diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt index e19bf4a0d..5c59ff20d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt @@ -9,7 +9,7 @@ data class Manga( val title: String, val localizedTitle: String? = null, val url: String, - val rating: Float = -1f, //normalized value [0..1] or -1 + val rating: Float = NO_RATING, //normalized value [0..1] or -1 val coverUrl: String, val largeCoverUrl: String? = null, val summary: String, @@ -18,4 +18,10 @@ data class Manga( val state: MangaState? = null, val chapters: List? = null, val source: MangaSource -) : Parcelable \ No newline at end of file +) : Parcelable { + + companion object { + + const val NO_RATING = -1f + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt index c6e637d23..b0b20d484 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt @@ -40,7 +40,7 @@ class ReadmangaRepository(loaderContext: MangaLoaderContext) : MangaRepository(l ?.substringBefore(' ') ?.toFloatOrNull() ?.div(10f) - } ?: -1f, + } ?: Manga.NO_RATING, tags = safe { descDiv.selectFirst("div.tile-info") ?.select("a.element-link") diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt index 28c4b4d46..287c29deb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.ui.common +import android.content.Context import android.content.SharedPreferences import android.os.Parcelable import androidx.annotation.IdRes @@ -21,4 +22,13 @@ abstract class BaseFragment(@LayoutRes contentLayoutId: Int) : fun arg(name: String) = ParcelableArgumentDelegate(name) override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) = Unit + + open fun getTitle(): CharSequence? = null + + override fun onAttach(context: Context) { + super.onAttach(context) + getTitle()?.let { + activity?.title = it + } + } } \ 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 c6650f01e..d4c38b256 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 @@ -4,13 +4,15 @@ import android.content.res.Configuration import android.os.Bundle import android.view.MenuItem import androidx.appcompat.app.ActionBarDrawerToggle +import androidx.fragment.app.Fragment +import com.google.android.material.navigation.NavigationView 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.MangaListFragment -class MainActivity : BaseActivity() { +class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { private lateinit var drawerToggle: ActionBarDrawerToggle @@ -18,21 +20,23 @@ class MainActivity : BaseActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - drawerToggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.open_menu, R.string.close_menu) + drawerToggle = + ActionBarDrawerToggle(this, drawer, toolbar, R.string.open_menu, R.string.close_menu) drawer.addDrawerListener(drawerToggle) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setHomeButtonEnabled(true) + navigationView.setNavigationItemSelectedListener(this) + if (!supportFragmentManager.isStateSaved) { - supportFragmentManager.beginTransaction() - .replace(R.id.container, MangaListFragment.newInstance(MangaSource.READMANGA_RU)) - .commit() + setPrimaryFragment(MangaListFragment.newInstance(MangaSource.READMANGA_RU)) } } override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) drawerToggle.syncState() + initSideMenu(MangaSource.values().asList()) } override fun onConfigurationChanged(newConfig: Configuration) { @@ -43,4 +47,33 @@ class MainActivity : BaseActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item) } + + override fun onNavigationItemSelected(item: MenuItem): Boolean { + if (item.groupId == R.id.group_remote_sources) { + val source = MangaSource.values().getOrNull(item.itemId) ?: return false + setPrimaryFragment(MangaListFragment.newInstance(source)) + } else when (item.itemId) { + R.id.nav_history -> Unit + R.id.nav_favourites -> Unit + R.id.nav_local_storage -> Unit + else -> return false + } + drawer.closeDrawers() + return true + } + + private fun initSideMenu(remoteSources: List) { + val submenu = navigationView.menu.findItem(R.id.nav_remote_sources).subMenu + submenu.removeGroup(R.id.group_remote_sources) + remoteSources.forEachIndexed { index, source -> + submenu.add(R.id.group_remote_sources, source.ordinal, index, source.title) + } + submenu.setGroupCheckable(R.id.group_remote_sources, true, true) + } + + private fun setPrimaryFragment(fragment: Fragment) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment) + .commit() + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/details/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/details/ChaptersFragment.kt index c08c665b4..c89433a91 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/details/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/details/ChaptersFragment.kt @@ -13,6 +13,7 @@ import org.koitharu.kotatsu.ui.common.BaseFragment class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsView { + @Suppress("unused") private val presenter by moxyPresenter { (activity as MangaDetailsActivity).presenter } private lateinit var adapter: ChaptersAdapter diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/details/MangaDetailsFragment.kt index 584913a2b..3f3cab43e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/details/MangaDetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/details/MangaDetailsFragment.kt @@ -10,20 +10,24 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.ui.common.BaseFragment import org.koitharu.kotatsu.utils.ext.setChips +import kotlin.math.roundToInt class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetailsView { + @Suppress("unused") private val presenter by moxyPresenter { (activity as MangaDetailsActivity).presenter } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - } - override fun onMangaUpdated(manga: Manga) { imageView_cover.load(manga.largeCoverUrl ?: manga.coverUrl) textView_title.text = manga.title textView_subtitle.text = manga.localizedTitle textView_description.text = manga.description + if (manga.rating == Manga.NO_RATING) { + ratingBar.isVisible = false + } else { + ratingBar.progress = (ratingBar.max * manga.rating).roundToInt() + ratingBar.isVisible = true + } chips_tags.setChips(manga.tags) { create( text = it.title, diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListDetailsHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListDetailsHolder.kt index 2cc84ff50..a875683f6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListDetailsHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListDetailsHolder.kt @@ -1,6 +1,8 @@ package org.koitharu.kotatsu.ui.main.list +import android.annotation.SuppressLint import android.view.ViewGroup +import androidx.core.view.isVisible import coil.api.load import coil.request.RequestDisposable import kotlinx.android.synthetic.main.item_manga_list_details.* @@ -8,11 +10,13 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.ui.common.list.BaseViewHolder import org.koitharu.kotatsu.utils.ext.textAndVisible +import kotlin.math.roundToInt class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_manga_list_details) { private var coverRequest: RequestDisposable? = null + @SuppressLint("SetTextI18n") override fun onBind(data: Manga) { coverRequest?.dispose() textView_title.text = data.title @@ -20,5 +24,14 @@ class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder(parent, coverRequest = imageView_cover.load(data.coverUrl) { crossfade(true) } + if(data.rating == Manga.NO_RATING) { + textView_rating.isVisible = false + } else { + textView_rating.text = "${(data.rating * 10).roundToInt()}/10" + textView_rating.isVisible = true + } + textView_tags.text = data.tags.joinToString(", ") { + it.title + } } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt index 317897e98..b3f39d78f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt @@ -100,6 +100,10 @@ class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView, swipeRefreshLayout.isEnabled = !progressBar.isVisible } + override fun getTitle(): CharSequence? { + return source.title + } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { when(key) { getString(R.string.key_list_mode) -> initListMode(settings.listMode) @@ -119,8 +123,8 @@ class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView, } recyclerView.adapter = adapter recyclerView.addItemDecoration(when(mode) { - ListMode.DETAILED_LIST, ListMode.LIST -> DividerItemDecoration(ctx, RecyclerView.VERTICAL) + ListMode.DETAILED_LIST, ListMode.GRID -> SpacingItemDecoration(resources.getDimensionPixelOffset(R.dimen.grid_spacing)) }) adapter.notifyDataSetChanged() diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..2fd4b74fb --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_star_rating.xml b/app/src/main/res/drawable/ic_star_rating.xml new file mode 100644 index 000000000..c96d7ace6 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_rating.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6fdfb3a3e..c00400d98 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -37,9 +37,11 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml index cdc0cca09..7f5037b8e 100644 --- a/app/src/main/res/layout/fragment_details.xml +++ b/app/src/main/res/layout/fragment_details.xml @@ -1,5 +1,6 @@ - + + + app:constraint_referenced_ids="imageView_cover, textView_subtitle, ratingBar" /> + app:layout_constraintTop_toBottomOf="@id/barrier_title" + app:lineSpacing="2dp" /> - + android:layout_height="@dimen/manga_list_details_item_height"> - - - + android:layout_height="match_parent"> + + + android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" + tools:text="@tools:sample/lorem[6]" /> + android:textColor="?android:textColorSecondary" + tools:text="@tools:sample/lorem[6]" /> - + - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_nav_header.xml b/app/src/main/res/layout/view_nav_header.xml new file mode 100644 index 000000000..29c2564d7 --- /dev/null +++ b/app/src/main/res/layout/view_nav_header.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/nav_drawer.xml b/app/src/main/res/menu/nav_drawer.xml index efbc3a91f..adc5231d0 100644 --- a/app/src/main/res/menu/nav_drawer.xml +++ b/app/src/main/res/menu/nav_drawer.xml @@ -1,6 +1,7 @@ - - + + - + + + + + + + + android:id="@+id/nav_action_settings" + android:icon="@drawable/ic_settings" + android:title="@string/settings" /> - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 90c803555..7353dbd1f 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 90c803555..7353dbd1f 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index a571e6009..a2fa3c5b1 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 61da551c5..e7ed9927a 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index c41dd2853..975375aff 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index db5080a75..07993775c 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 6dba46dab..c0cfeebe0 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index da31a871c..000967898 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 15ac68172..cd42682d1 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index b216f2d31..4535d82c8 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index f25a41974..88aa38344 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index e96783ccc..2b4551ef7 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 264ea459e..2774c78b7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #6200EE - #3700B3 - #03DAC5 + #0288D1 + #0D47A1 + #F4511E \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 000000000..c5d5899fd --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ 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 f0443ba7c..0d54b0f46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,4 +13,6 @@ Detailed list Grid List mode + Settings + Remote sources \ No newline at end of file