From e1b50c86f34f0796253dfa1498ebfa85a965fcb3 Mon Sep 17 00:00:00 2001 From: Sadwhy <99601717+Sadwhy@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:11:16 +0600 Subject: [PATCH 001/300] feet(watch): Fixed one inconsistent switch (#273) * feet(watch): Fixed one inconsistent switch --- app/src/main/res/layout/item_anime_watch.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_anime_watch.xml b/app/src/main/res/layout/item_anime_watch.xml index ae95f1d7..9fc4224a 100644 --- a/app/src/main/res/layout/item_anime_watch.xml +++ b/app/src/main/res/layout/item_anime_watch.xml @@ -154,7 +154,7 @@ android:orientation="horizontal" android:visibility="gone"> - + android:scaleX="0.80" + android:scaleY="0.80" + app:useMaterialThemeColors="true"/> @@ -373,3 +375,4 @@ + From 3016792f95525872517b6b7352610bc48cb2b866 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Fri, 22 Mar 2024 11:24:36 +0530 Subject: [PATCH 002/300] fix(activity): blur banner --- app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt | 2 -- app/src/main/res/layout/item_activity.xml | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index 980c70c5..e361199d 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -143,8 +143,6 @@ class ProfileFragment : Fragment() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() - setFavPeople() - model.refresh() } } diff --git a/app/src/main/res/layout/item_activity.xml b/app/src/main/res/layout/item_activity.xml index 03b96d30..816c1732 100644 --- a/app/src/main/res/layout/item_activity.xml +++ b/app/src/main/res/layout/item_activity.xml @@ -113,7 +113,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start|center_vertical" - android:backgroundTint="?attr/colorSurface" + app:cardBackgroundColor="@color/nav_bg" app:cardCornerRadius="24dp" app:strokeColor="@color/transparent"> @@ -150,7 +150,7 @@ android:layout_height="160dp" android:layout_gravity="center" android:scaleType="centerCrop" - app:srcCompat="@drawable/ic_round_add_circle_24" + tools:srcCompat="@tools:sample/backgrounds/scenic" tools:ignore="ContentDescription,ImageContrastCheck" tools:tint="@color/transparent" /> From 02efc01a10b2218d11fbd83be68fff4701331d37 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Fri, 22 Mar 2024 12:50:04 +0530 Subject: [PATCH 003/300] feat(profile): round chips --- app/src/main/res/layout/activity_profile.xml | 94 +++++++++----------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 13870e1e..068e1e41 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -128,145 +128,137 @@ app:tint="@color/bg_opp" /> + - - - + android:layout_marginStart="8dp" + android:backgroundTint="?attr/colorSurfaceVariant" + app:cardCornerRadius="16dp"> + android:textColor="?attr/colorPrimary" + tools:text="1" /> + - - - - + android:layout_marginStart="8dp" + android:backgroundTint="?attr/colorSurfaceVariant" + app:cardCornerRadius="16dp"> + android:textColor="?attr/colorPrimary" + tools:text="2" /> - + - - + android:layout_marginStart="8dp" + android:backgroundTint="?attr/colorSurfaceVariant" + app:cardCornerRadius="16dp"> + android:textColor="?attr/colorPrimary" + tools:text="3" /> - + - - - + android:layout_marginStart="8dp" + android:backgroundTint="?attr/colorSurfaceVariant" + app:cardCornerRadius="16dp"> + android:textColor="?attr/colorPrimary" + tools:text="4" /> - + - - Date: Fri, 22 Mar 2024 20:38:34 +0530 Subject: [PATCH 004/300] feat: something --- .../download/anime/OfflineAnimeAdapter.kt | 2 +- .../download/manga/OfflineMangaAdapter.kt | 2 +- app/src/main/res/layout/item_activity.xml | 4 ++-- app/src/main/res/layout/item_follower.xml | 21 +++++++++---------- app/src/main/res/layout/item_notification.xml | 4 ++-- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt index ef0c4148..63cc384a 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt @@ -62,7 +62,7 @@ class OfflineAnimeAdapter( val bannerView = view.findViewById(R.id.itemCompactBanner) // for large view val episodes = view.findViewById(R.id.itemTotal) episodes.text = " Episodes" - bannerView.setImageURI(item.banner) + bannerView.setImageURI(item.banner ?: item.image) totalepisodes.text = item.totalEpisodeList } else if (style == 1) { val watchedEpisodes = diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt index 4ef12c03..0bc9ef08 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt @@ -61,7 +61,7 @@ class OfflineMangaAdapter( val bannerView = view.findViewById(R.id.itemCompactBanner) // for large view val chapters = view.findViewById(R.id.itemTotal) chapters.text = " Chapters" - bannerView.setImageURI(item.banner) + bannerView.setImageURI(item.banner ?: item.image) totalChapter.text = item.totalChapter } else if (style == 1) { val readChapter = diff --git a/app/src/main/res/layout/item_activity.xml b/app/src/main/res/layout/item_activity.xml index 816c1732..e45d45ca 100644 --- a/app/src/main/res/layout/item_activity.xml +++ b/app/src/main/res/layout/item_activity.xml @@ -109,7 +109,7 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp"> - - + - + app:cardCornerRadius="24dp" + app:strokeColor="@color/transparent"> + tools:ignore="ContentDescription" + tools:srcCompat="@tools:sample/backgrounds/scenic" /> + app:cardCornerRadius="64dp" + app:strokeColor="@color/transparent"> - + android:textSize="18sp" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index 77868138..b20359ef 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -8,7 +8,7 @@ android:layout_margin="8dp" android:orientation="horizontal"> - - + \ No newline at end of file From d1e03b8237a9c389fb144e209c8bb1a29ed67f82 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Fri, 22 Mar 2024 23:44:51 +0530 Subject: [PATCH 005/300] feat(media): fav and popularity count --- .../connections/anilist/AnilistQueries.kt | 5 +- app/src/main/java/ani/dantotsu/media/Media.kt | 4 +- .../ani/dantotsu/media/MediaInfoFragment.kt | 2 + app/src/main/res/layout/activity_profile.xml | 224 +++++++++--------- .../main/res/layout/fragment_media_info.xml | 39 +++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 167 insertions(+), 109 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index c9ff694d..c83fd07f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -72,7 +72,7 @@ class AnilistQueries { media.cameFromContinue = false val query = - """{Media(id:${media.id}){id mediaListEntry{id status score(format:POINT_100)progress private notes repeat customLists updatedAt startedAt{year month day}completedAt{year month day}}isFavourite siteUrl idMal nextAiringEpisode{episode airingAt}source countryOfOrigin format duration season seasonYear startDate{year month day}endDate{year month day}genres studios(isMain:true){nodes{id name siteUrl}}description trailer{site id}synonyms tags{name rank isMediaSpoiler}characters(sort:[ROLE,FAVOURITES_DESC],perPage:25,page:1){edges{role node{id image{medium}name{userPreferred}isFavourite}}}relations{edges{relationType(version:2)node{id idMal mediaListEntry{progress private score(format:POINT_100)status}episodes chapters nextAiringEpisode{episode}popularity meanScore isAdult isFavourite format title{english romaji userPreferred}type status(version:2)bannerImage coverImage{large}}}}staffPreview:staff(perPage:8,sort:[RELEVANCE,ID]){edges{role node{id image{large medium}name{userPreferred}}}}recommendations(sort:RATING_DESC){nodes{mediaRecommendation{id idMal mediaListEntry{progress private score(format:POINT_100)status}episodes chapters nextAiringEpisode{episode}meanScore isAdult isFavourite format title{english romaji userPreferred}type status(version:2)bannerImage coverImage{large}}}}externalLinks{url site}}}""" + """{Media(id:${media.id}){id favourites popularity mediaListEntry{id status score(format:POINT_100)progress private notes repeat customLists updatedAt startedAt{year month day}completedAt{year month day}}isFavourite siteUrl idMal nextAiringEpisode{episode airingAt}source countryOfOrigin format duration season seasonYear startDate{year month day}endDate{year month day}genres studios(isMain:true){nodes{id name siteUrl}}description trailer{site id}synonyms tags{name rank isMediaSpoiler}characters(sort:[ROLE,FAVOURITES_DESC],perPage:25,page:1){edges{role node{id image{medium}name{userPreferred}isFavourite}}}relations{edges{relationType(version:2)node{id idMal mediaListEntry{progress private score(format:POINT_100)status}episodes chapters nextAiringEpisode{episode}popularity meanScore isAdult isFavourite format title{english romaji userPreferred}type status(version:2)bannerImage coverImage{large}}}}staffPreview:staff(perPage:8,sort:[RELEVANCE,ID]){edges{role node{id image{large medium}name{userPreferred}}}}recommendations(sort:RATING_DESC){nodes{mediaRecommendation{id idMal mediaListEntry{progress private score(format:POINT_100)status}episodes chapters nextAiringEpisode{episode}meanScore isAdult isFavourite format title{english romaji userPreferred}type status(version:2)bannerImage coverImage{large}}}}externalLinks{url site}}}""" runBlocking { val anilist = async { var response = executeQuery(query, force = true, show = true) @@ -83,7 +83,8 @@ class AnilistQueries { media.source = fetchedMedia.source?.toString() media.countryOfOrigin = fetchedMedia.countryOfOrigin media.format = fetchedMedia.format?.toString() - + media.favourites = fetchedMedia.favourites + media.popularity = fetchedMedia.popularity media.startDate = fetchedMedia.startDate media.endDate = fetchedMedia.endDate diff --git a/app/src/main/java/ani/dantotsu/media/Media.kt b/app/src/main/java/ani/dantotsu/media/Media.kt index d26a5048..c0196218 100644 --- a/app/src/main/java/ani/dantotsu/media/Media.kt +++ b/app/src/main/java/ani/dantotsu/media/Media.kt @@ -25,7 +25,7 @@ data class Media( var cover: String? = null, var banner: String? = null, var relation: String? = null, - var popularity: Int? = null, + var favourites: Int? = null, var isAdult: Boolean, var isFav: Boolean = false, @@ -56,6 +56,7 @@ data class Media( var trailer: String? = null, var startDate: FuzzyDate? = null, var endDate: FuzzyDate? = null, + var popularity: Int? = null, var characters: ArrayList? = null, var staff: ArrayList? = null, @@ -95,6 +96,7 @@ data class Media( meanScore = apiMedia.meanScore, startDate = apiMedia.startDate, endDate = apiMedia.endDate, + favourites = apiMedia.favourites, anime = if (apiMedia.type == MediaType.ANIME) Anime( totalEpisodes = apiMedia.episodes, nextAiringEpisode = apiMedia.nextAiringEpisode?.episode?.minus(1) diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt index 06fb3aa9..1cec1eb6 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt @@ -97,6 +97,8 @@ class MediaInfoFragment : Fragment() { binding.mediaInfoSource.text = media.source binding.mediaInfoStart.text = media.startDate?.toString() ?: "??" binding.mediaInfoEnd.text = media.endDate?.toString() ?: "??" + binding.mediaInfoPopularity.text = media.popularity.toString() + binding.mediaInfoFavorites.text = media.favourites.toString() if (media.anime != null) { val episodeDuration = media.anime.episodeDuration diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 068e1e41..5b61ea3d 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -129,133 +129,145 @@ - + app:cardCornerRadius="16dp"> - + android:orientation="horizontal" + tools:ignore="HardcodedText"> - + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> - + + + + + + + + - + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> + - + - + + + + + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> - + + + + + + + + + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> - + + - - - - - - - - - - - - - - - - - + + + diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 0cc14a6a..29ae8ff9 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -303,7 +303,46 @@ android:fontFamily="@font/poppins_bold" android:textAlignment="textEnd" /> + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a974ff47..9b0ec0f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -124,6 +124,8 @@ Characters Relations Staff + Favourites + Popularity Roles Details From e5f58f20c74457a88c6c51ad121fba6408dd0d8a Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX Date: Mon, 18 Mar 2024 18:18:35 -0400 Subject: [PATCH 006/300] fix: undo all of the margin hacks Using 72dp as the height appears to have been a bit of a hack to appear beyond the navigation bar. In cases where the bar is not present, such as landscape, this left a gap between the bottom of the screen and bar. On API 23, the result was the opposite. All of this can be addressed by simply relying on the actual measurements and not compensating for compensation. --- app/src/main/AndroidManifest.xml | 2 + app/src/main/java/ani/dantotsu/Functions.kt | 7 + .../main/java/ani/dantotsu/MainActivity.kt | 10 +- .../dantotsu/media/MediaDetailsActivity.kt | 17 ++- .../ani/dantotsu/profile/ProfileActivity.kt | 15 +- .../dantotsu/profile/activity/FeedActivity.kt | 20 ++- .../main/res/layout-land/activity_media.xml | 128 +++++++++--------- app/src/main/res/layout/activity_feed.xml | 5 +- app/src/main/res/layout/activity_media.xml | 1 - app/src/main/res/layout/activity_profile.xml | 3 +- 10 files changed, 124 insertions(+), 84 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cf650323..5e5e6c34 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -108,6 +108,7 @@ android:parentActivityName=".MainActivity" /> Unit) { diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 9a528b80..a680dd63 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -5,6 +5,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.Rect +import android.content.res.Configuration import android.os.Bundle import android.text.SpannableStringBuilder import android.util.TypedValue @@ -24,6 +25,7 @@ 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 import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle @@ -105,7 +107,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi //Ui init initActivity(this) - binding.mediaViewPager.updateLayoutParams { bottomMargin += navBarHeight } + binding.mediaViewPager.updateLayoutParams { bottomMargin = navBarHeight } val oldMargin = binding.mediaViewPager.marginBottom AndroidBug5497Workaround.assistActivity(this) { if (it) { @@ -120,6 +122,9 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi binding.mediaTabContainer.visibility = View.VISIBLE } } + val navBarMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + binding.mediaTabContainer.updateLayoutParams { rightMargin = navBarMargin } binding.mediaBanner.updateLayoutParams { height += statusBarHeight } binding.mediaBannerNoKen.updateLayoutParams { height += statusBarHeight } binding.mediaClose.updateLayoutParams { topMargin += statusBarHeight } @@ -432,6 +437,14 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi return R.id.info } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val margin = if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + val params : ViewGroup.MarginLayoutParams = + binding.mediaTabContainer.layoutParams as ViewGroup.MarginLayoutParams + params.updateMargins(right = margin) + } + override fun onResume() { if (this::tabLayout.isInitialized) { tabLayout.selectTab(selected) @@ -602,4 +615,4 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi companion object { var mediaSingleton: Media? = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index 78867e37..668af45a 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -3,6 +3,7 @@ package ani.dantotsu.profile import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import android.util.TypedValue import android.view.View @@ -11,6 +12,7 @@ import android.widget.PopupMenu import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams +import androidx.core.view.updateMargins import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle @@ -56,7 +58,9 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene setContentView(binding.root) screenWidth = resources.displayMetrics.widthPixels.toFloat() navBar = binding.profileNavBar - navBar.updateLayoutParams { bottomMargin = navBarHeight } + val navBarMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + navBar.updateLayoutParams { bottomMargin = navBarMargin } val feedTab = navBar.createTab(R.drawable.ic_round_filter_24, "Feed") val profileTab = navBar.createTab(R.drawable.ic_round_person_24, "Profile") @@ -279,6 +283,13 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val margin = if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + val params : ViewGroup.MarginLayoutParams = navBar.layoutParams as ViewGroup.MarginLayoutParams + params.updateMargins(bottom = margin) + } + override fun onResume() { if (this::navBar.isInitialized) { navBar.selectTabAt(selected) @@ -301,4 +312,4 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene else -> ProfileFragment.newInstance(user) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt index 98f0492b..6a85c640 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt @@ -1,9 +1,11 @@ package ani.dantotsu.profile.activity +import android.content.res.Configuration import android.os.Bundle import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.core.view.updateLayoutParams +import androidx.core.view.updateMargins import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle @@ -28,14 +30,16 @@ class FeedActivity : AppCompatActivity() { binding = ActivityFeedBinding.inflate(layoutInflater) setContentView(binding.root) navBar = binding.feedNavBar - navBar.updateLayoutParams { bottomMargin += navBarHeight } + val navBarMargin = if (resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + navBar.updateLayoutParams { bottomMargin = navBarMargin } val personalTab = navBar.createTab(R.drawable.ic_round_person_24, "Following") val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global") navBar.addTab(personalTab) navBar.addTab(globalTab) binding.listTitle.text = getString(R.string.activities) binding.feedViewPager.updateLayoutParams { - bottomMargin += navBarHeight + bottomMargin = navBarMargin topMargin += statusBarHeight } binding.listToolbar.updateLayoutParams { topMargin += statusBarHeight } @@ -61,6 +65,16 @@ class FeedActivity : AppCompatActivity() { } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val margin = if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + val params : ViewGroup.MarginLayoutParams = + binding.feedViewPager.layoutParams as ViewGroup.MarginLayoutParams + val paramsNav : ViewGroup.MarginLayoutParams = navBar.layoutParams as ViewGroup.MarginLayoutParams + params.updateMargins(bottom = margin) + paramsNav.updateMargins(bottom = margin) + } + override fun onResume() { super.onResume() navBar.selectTabAt(selected) @@ -80,4 +94,4 @@ class FeedActivity : AppCompatActivity() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout-land/activity_media.xml b/app/src/main/res/layout-land/activity_media.xml index 247c86a9..d0a94b53 100644 --- a/app/src/main/res/layout-land/activity_media.xml +++ b/app/src/main/res/layout-land/activity_media.xml @@ -6,71 +6,10 @@ android:layout_height="match_parent" android:orientation="horizontal"> - - - - - - - - - + android:layout_height="match_parent" + android:layout_weight="1"> + + + + + + + + + diff --git a/app/src/main/res/layout/activity_feed.xml b/app/src/main/res/layout/activity_feed.xml index 295a8a10..6537b261 100644 --- a/app/src/main/res/layout/activity_feed.xml +++ b/app/src/main/res/layout/activity_feed.xml @@ -43,14 +43,13 @@ android:id="@+id/feedViewPager" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="72dp" android:layout_marginTop="48dp" tools:ignore="SpeakableTextPresentCheck" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_media.xml b/app/src/main/res/layout/activity_media.xml index 3f7708a6..4f9590ed 100644 --- a/app/src/main/res/layout/activity_media.xml +++ b/app/src/main/res/layout/activity_media.xml @@ -235,7 +235,6 @@ android:id="@+id/mediaViewPager" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="72dp" android:nestedScrollingEnabled="true" tools:ignore="SpeakableTextPresentCheck" /> diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 5b61ea3d..b88d8778 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -276,7 +276,6 @@ @@ -292,7 +291,7 @@ Date: Tue, 19 Mar 2024 01:47:31 -0400 Subject: [PATCH 007/300] fix: vertical AnimatedBottomBar --- app/build.gradle | 21 +- .../main/java/ani/dantotsu/MainActivity.kt | 2 - .../dantotsu/media/MediaDetailsActivity.kt | 125 ++--- .../ani/dantotsu/media/TripleNavAdapter.kt | 136 ----- .../media/anime/AnimeWatchFragment.kt | 2 +- .../dantotsu/media/manga/MangaReadFragment.kt | 2 +- .../main/res/layout-land/activity_media.xml | 75 +-- .../main/res/layout-v23/activity_media.xml | 497 ------------------ app/src/main/res/layout/activity_media.xml | 81 +-- 9 files changed, 90 insertions(+), 851 deletions(-) delete mode 100644 app/src/main/java/ani/dantotsu/media/TripleNavAdapter.kt delete mode 100644 app/src/main/res/layout-v23/activity_media.xml 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -