diff --git a/app/build.gradle b/app/build.gradle index f7a04f77..5c2e2d86 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,11 +75,11 @@ android { dependencies { - // FireBase +// FireBase googleImplementation platform('com.google.firebase:firebase-bom:32.7.4') googleImplementation 'com.google.firebase:firebase-analytics-ktx:21.5.1' googleImplementation 'com.google.firebase:firebase-crashlytics-ktx:18.6.2' -// Core +// Core implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.browser:browser:1.8.0' implementation 'androidx.core:core-ktx:1.12.0' @@ -96,7 +96,7 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.webkit:webkit:1.10.0' -// Glide +// Glide ext.glide_version = '4.16.0' api "com.github.bumptech.glide:glide:$glide_version" implementation "com.github.bumptech.glide:glide:$glide_version" @@ -104,7 +104,7 @@ dependencies { implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version" implementation 'jp.wasabeef:glide-transformations:4.3.0' -// Exoplayer +// Exoplayer ext.exo_version = '1.3.0' implementation "androidx.media3:media3-exoplayer:$exo_version" implementation "androidx.media3:media3-ui:$exo_version" @@ -116,10 +116,9 @@ dependencies { implementation "androidx.media3:media3-cast:$exo_version" implementation "androidx.mediarouter:mediarouter:1.6.0" -// UI +// UI implementation 'com.google.android.material:material:1.11.0' - //implementation 'nl.joery.animatedbottombar:library:1.1.0' - implementation 'com.github.rebelonion:AnimatedBottomBar:v1.1.0' + implementation 'com.github.RepoDevil:AnimatedBottomBar:514389d135' implementation 'com.flaviofaria:kenburnsview:1.0.7' implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' implementation 'com.alexvasilkov:gesture-views:2.8.3' @@ -128,7 +127,7 @@ dependencies { implementation 'com.github.eltos:simpledialogfragments:v3.7' implementation 'com.github.AAChartModel:AAChartCore-Kotlin:93972bc' - // Markwon +// Markwon ext.markwon_version = '4.6.2' implementation "io.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:editor:$markwon_version" @@ -138,15 +137,15 @@ dependencies { implementation "io.noties.markwon:html:$markwon_version" implementation "io.noties.markwon:image-glide:$markwon_version" -// Groupie +// Groupie ext.groupie_version = '2.10.1' implementation "com.github.lisawray.groupie:groupie:$groupie_version" implementation "com.github.lisawray.groupie:groupie-viewbinding:$groupie_version" -// string matching +// String Matching implementation 'me.xdrop:fuzzywuzzy:1.4.0' -// Aniyomi +// Aniyomi implementation 'io.reactivex:rxjava:1.3.8' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'ru.beryukhov:flowreactivenetwork:1.0.4' diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 0b933101..96fbb892 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -5,7 +5,6 @@ import android.annotation.SuppressLint import android.app.AlertDialog import android.content.Intent import android.content.res.Configuration -import android.content.res.Resources import android.graphics.drawable.Animatable import android.graphics.drawable.GradientDrawable import android.net.Uri @@ -14,7 +13,6 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import android.provider.Settings -import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index a680dd63..221d2b0f 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -23,7 +23,6 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import androidx.core.text.bold import androidx.core.text.color -import androidx.core.view.marginBottom import androidx.core.view.updateLayoutParams import androidx.core.view.updateMargins import androidx.fragment.app.Fragment @@ -48,7 +47,6 @@ import ani.dantotsu.media.manga.MangaReadFragment import ani.dantotsu.media.novel.NovelReadFragment import ani.dantotsu.navBarHeight import ani.dantotsu.openLinkInBrowser -import ani.dantotsu.others.AndroidBug5497Workaround import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.others.getSerialized import ani.dantotsu.settings.saving.PrefManager @@ -64,6 +62,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import nl.joery.animatedbottombar.AnimatedBottomBar import kotlin.math.abs @@ -72,8 +71,8 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi lateinit var binding: ActivityMediaBinding private val scope = lifecycleScope private val model: MediaDetailsViewModel by viewModels() - lateinit var tabLayout: TripleNavAdapter var selected = 0 + lateinit var navBar: AnimatedBottomBar var anime = true private var adult = false @@ -102,29 +101,20 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi binding = ActivityMediaBinding.inflate(layoutInflater) setContentView(binding.root) screenWidth = resources.displayMetrics.widthPixels.toFloat() + navBar = binding.mediaBottomBar - val isVertical = resources.configuration.orientation - //Ui init + // Ui init initActivity(this) binding.mediaViewPager.updateLayoutParams { bottomMargin = navBarHeight } - val oldMargin = binding.mediaViewPager.marginBottom - AndroidBug5497Workaround.assistActivity(this) { - if (it) { - binding.mediaViewPager.updateLayoutParams { - bottomMargin = 0 - } - binding.mediaTabContainer.visibility = View.GONE - } else { - binding.mediaViewPager.updateLayoutParams { - bottomMargin = oldMargin - } - binding.mediaTabContainer.visibility = View.VISIBLE - } - } - val navBarMargin = if (resources.configuration.orientation == + val navBarRightMargin = if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 - binding.mediaTabContainer.updateLayoutParams { rightMargin = navBarMargin } + val navBarBottomMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + navBar.updateLayoutParams { + rightMargin = navBarRightMargin + bottomMargin = navBarBottomMargin + } binding.mediaBanner.updateLayoutParams { height += statusBarHeight } binding.mediaBannerNoKen.updateLayoutParams { height += statusBarHeight } binding.mediaClose.updateLayoutParams { topMargin += statusBarHeight } @@ -152,7 +142,6 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi val banner = if (bannerAnimations) binding.mediaBanner else binding.mediaBannerNoKen val viewPager = binding.mediaViewPager - //tabLayout = binding.mediaTab as AnimatedBottomBar viewPager.isUserInputEnabled = false viewPager.setPageTransformer(ZoomOutPageTransformer()) @@ -347,14 +336,6 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi progress() } } - tabLayout = TripleNavAdapter( - binding.mediaTab1, - binding.mediaTab2, - binding.mediaTab3, - media.anime != null, - media.format ?: "", - isVertical == 1 - ) adult = media.isAdult if (media.anime != null) { viewPager.adapter = @@ -370,21 +351,38 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi anime = false } - selected = media.selected!!.window binding.mediaTitle.translationX = -screenWidth - tabLayout.selectionListener = { selected, newId -> - binding.commentInputLayout.visibility = if (selected == 2) View.VISIBLE else View.GONE - this.selected = selected - selectFromID(newId) - viewPager.setCurrentItem(selected, false) - val sel = model.loadSelected(media, isDownload) - sel.window = selected - model.saveSelected(media.id, sel) + val infoTab = navBar.createTab(R.drawable.ic_round_info_24, R.string.info, R.id.info) + val watchTab = if (anime) { + navBar.createTab(R.drawable.ic_round_movie_filter_24, R.string.watch, R.id.watch) + } else if (media.format == "NOVEL") { + navBar.createTab(R.drawable.ic_round_book_24, R.string.read, R.id.read) + } else { + navBar.createTab(R.drawable.ic_round_import_contacts_24, R.string.read, R.id.read) } - tabLayout.selectTab(selected) - selectFromID(tabLayout.selected) + val commentTab = navBar.createTab(R.drawable.ic_round_comment_24, R.string.comments, R.id.comment) + navBar.addTab(infoTab) + navBar.addTab(watchTab) + navBar.addTab(commentTab) + navBar.selectTabAt(selected) + navBar.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { + override fun onTabSelected( + lastIndex: Int, + lastTab: AnimatedBottomBar.Tab?, + newIndex: Int, + newTab: AnimatedBottomBar.Tab + ) { + selected = newIndex + binding.commentInputLayout.visibility = if (selected == 2) View.VISIBLE else View.GONE + viewPager.setCurrentItem(selected, true) + val sel = model.loadSelected(media, isDownload) + sel.window = selected + model.saveSelected(media.id, sel) + } + }) + binding.commentInputLayout.visibility = if (selected == 2) View.VISIBLE else View.GONE viewPager.setCurrentItem(selected, false) if (model.continueMedia == null && media.cameFromContinue) { @@ -407,48 +405,19 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } } - private fun selectFromID(id: Int) { - when (id) { - R.id.info -> { - selected = 0 - } - - R.id.watch, R.id.read -> { - selected = 1 - } - - R.id.comment -> { - selected = 2 - } - } - } - - private fun idFromSelect(): Int { - if (anime) when (selected) { - 0 -> return R.id.info - 1 -> return R.id.watch - 2 -> return R.id.comment - } - else when (selected) { - 0 -> return R.id.info - 1 -> return R.id.read - 2 -> return R.id.comment - } - return R.id.info - } - override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - val margin = if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + val rightMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + val bottomMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight val params : ViewGroup.MarginLayoutParams = - binding.mediaTabContainer.layoutParams as ViewGroup.MarginLayoutParams - params.updateMargins(right = margin) + navBar.layoutParams as ViewGroup.MarginLayoutParams + params.updateMargins(right = rightMargin, bottom = bottomMargin) } override fun onResume() { - if (this::tabLayout.isInitialized) { - tabLayout.selectTab(selected) - } + navBar.selectTabAt(selected) super.onResume() } @@ -456,7 +425,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi ANIME, MANGA, NOVEL } - //ViewPager + // ViewPager private class ViewPagerAdapter( fragmentManager: FragmentManager, lifecycle: Lifecycle, diff --git a/app/src/main/java/ani/dantotsu/media/TripleNavAdapter.kt b/app/src/main/java/ani/dantotsu/media/TripleNavAdapter.kt deleted file mode 100644 index b76a0dff..00000000 --- a/app/src/main/java/ani/dantotsu/media/TripleNavAdapter.kt +++ /dev/null @@ -1,136 +0,0 @@ -package ani.dantotsu.media - -import android.graphics.Color -import android.view.ViewGroup -import androidx.core.view.updateLayoutParams -import ani.dantotsu.R -import ani.dantotsu.navBarHeight -import nl.joery.animatedbottombar.AnimatedBottomBar - -class TripleNavAdapter( - private val nav1: AnimatedBottomBar, - private val nav2: AnimatedBottomBar, - private val nav3: AnimatedBottomBar, - anime: Boolean, - format: String, - private val isScreenVertical: Boolean = false -) { - var selected: Int = 0 - var selectionListener: ((Int, Int) -> Unit)? = null - init { - nav1.tabs.clear() - nav2.tabs.clear() - nav3.tabs.clear() - val infoTab = nav1.createTab(R.drawable.ic_round_info_24, R.string.info, R.id.info) - val watchTab = if (anime) { - nav2.createTab(R.drawable.ic_round_movie_filter_24, R.string.watch, R.id.watch) - } else if (format == "NOVEL") { - nav2.createTab(R.drawable.ic_round_book_24, R.string.read, R.id.read) - } else { - nav2.createTab(R.drawable.ic_round_import_contacts_24, R.string.read, R.id.read) - } - val commentTab = nav3.createTab(R.drawable.ic_round_comment_24, R.string.comments, R.id.comment) - nav1.addTab(infoTab) - nav1.visibility = ViewGroup.VISIBLE - if (isScreenVertical) { - nav2.visibility = ViewGroup.GONE - nav3.visibility = ViewGroup.GONE - nav1.addTab(watchTab) - nav1.addTab(commentTab) - nav1.updateLayoutParams { - bottomMargin = navBarHeight - } - nav2.updateLayoutParams { - bottomMargin = navBarHeight - } - nav3.updateLayoutParams { - bottomMargin = navBarHeight - } - } else { - nav1.indicatorColor = Color.TRANSPARENT - nav2.indicatorColor = Color.TRANSPARENT - nav3.indicatorColor = Color.TRANSPARENT - nav2.visibility = ViewGroup.VISIBLE - nav3.visibility = ViewGroup.VISIBLE - nav2.addTab(watchTab) - nav3.addTab(commentTab) - nav2.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { - override fun onTabSelected( - lastIndex: Int, - lastTab: AnimatedBottomBar.Tab?, - newIndex: Int, - newTab: AnimatedBottomBar.Tab - ) { - selected = 1 - deselectOthers(selected) - selectionListener?.invoke(selected, newTab.id) - } - }) - nav3.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { - override fun onTabSelected( - lastIndex: Int, - lastTab: AnimatedBottomBar.Tab?, - newIndex: Int, - newTab: AnimatedBottomBar.Tab - ) { - selected = 2 - deselectOthers(selected) - selectionListener?.invoke(selected, newTab.id) - } - }) - } - nav1.setOnTabSelectListener(object : AnimatedBottomBar.OnTabSelectListener { - override fun onTabSelected( - lastIndex: Int, - lastTab: AnimatedBottomBar.Tab?, - newIndex: Int, - newTab: AnimatedBottomBar.Tab - ) { - if (!isScreenVertical) { - selected = 0 - deselectOthers(selected) - } else selected = newIndex - selectionListener?.invoke(selected, newTab.id) - } - }) - } - - private fun deselectOthers(selected: Int) { - if (selected == 0) { - nav2.clearSelection() - nav3.clearSelection() - } - if (selected == 1) { - nav1.clearSelection() - nav3.clearSelection() - } - if (selected == 2) { - nav1.clearSelection() - nav2.clearSelection() - } - } - - fun selectTab(tab: Int) { - selected = tab - if (!isScreenVertical) { - when (tab) { - 0 -> nav1.selectTabAt(0) - 1 -> nav2.selectTabAt(0) - 2 -> nav3.selectTabAt(0) - } - deselectOthers(selected) - } else { - nav1.selectTabAt(selected) - } - } - - fun setVisibility(visibility: Int) { - if (isScreenVertical) { - nav1.visibility = visibility - return - } - nav1.visibility = visibility - nav2.visibility = visibility - nav3.visibility = visibility - } -} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt index 50eef688..a67191db 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -346,7 +346,7 @@ class AnimeWatchFragment : Fragment() { activity.findViewById(R.id.mediaCover).visibility = visibility activity.findViewById(R.id.mediaClose).visibility = visibility - activity.tabLayout.setVisibility(visibility) + activity.navBar.setVisibility(visibility) activity.findViewById(R.id.fragmentExtensionsContainer).visibility = if (show) View.GONE else View.VISIBLE diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt index 621e07fb..9f32049d 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -359,7 +359,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { activity.findViewById(R.id.mediaViewPager).visibility = visibility activity.findViewById(R.id.mediaCover).visibility = visibility activity.findViewById(R.id.mediaClose).visibility = visibility - activity.tabLayout.setVisibility(visibility) + activity.navBar.setVisibility(visibility) activity.findViewById(R.id.fragmentExtensionsContainer).visibility = if (show) View.GONE else View.VISIBLE } diff --git a/app/src/main/res/layout-land/activity_media.xml b/app/src/main/res/layout-land/activity_media.xml index d0a94b53..54f824f9 100644 --- a/app/src/main/res/layout-land/activity_media.xml +++ b/app/src/main/res/layout-land/activity_media.xml @@ -420,67 +420,22 @@ - - - - - - - - + android:layout_gravity="center_horizontal|bottom" + android:background="?attr/colorSurface" + android:padding="0dp" + app:abb_animationInterpolator="@anim/over_shoot" + app:abb_selectedTabType="text" + app:abb_textAppearance="@style/NavBarText" + app:itemActiveIndicatorStyle="@style/BottomNavBar" + app:itemIconTint="@color/tab_layout_icon" + app:itemRippleColor="#00000000" + app:itemTextAppearanceActive="@style/NavBarText" + app:itemTextAppearanceInactive="@style/NavBarText" + app:itemTextColor="@color/tab_layout_icon" + app:abb_isVerticalBar="true"/> diff --git a/app/src/main/res/layout-v23/activity_media.xml b/app/src/main/res/layout-v23/activity_media.xml deleted file mode 100644 index dd6fefbd..00000000 --- a/app/src/main/res/layout-v23/activity_media.xml +++ /dev/null @@ -1,497 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -