From 5e6acd043bec7b64ccdfe7c9655b221b6d394556 Mon Sep 17 00:00:00 2001 From: Steven Xu Date: Sun, 9 Mar 2025 20:57:02 +1100 Subject: [PATCH 1/5] feat: disable logs tab transition --- .../lsposed/manager/ui/fragment/LogsFragment.java | 13 ++++++++++++- .../lsposed/manager/util/AccessibilityUtils.java | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java index 24659ed1a78..26f58c3a3fb 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java @@ -53,6 +53,7 @@ import org.lsposed.manager.databinding.SwiperefreshRecyclerviewBinding; import org.lsposed.manager.receivers.LSPManagerServiceHolder; import org.lsposed.manager.ui.widget.EmptyStateRecyclerView; +import org.lsposed.manager.util.AccessibilityUtils; import java.io.BufferedReader; import java.io.FileInputStream; @@ -109,7 +110,17 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c binding.toolbar.setSubtitle(ConfigManager.isVerboseLogEnabled() ? R.string.enabled_verbose_log : R.string.disabled_verbose_log); adapter = new LogPageAdapter(this); binding.viewPager.setAdapter(adapter); - new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText((int) adapter.getItemId(position))).attach(); + + var isAnimationEnabled = AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver()); + new TabLayoutMediator( + binding.tabLayout, + binding.viewPager, + // `autoRefresh = true` by default. Update the tabs automatically when the data set of the view pager's + // adapter changes. + true, + isAnimationEnabled, + (tab, position) -> tab.setText((int) adapter.getItemId(position)) + ).attach(); binding.tabLayout.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { ViewGroup vg = (ViewGroup) binding.tabLayout.getChildAt(0); diff --git a/app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java b/app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java new file mode 100644 index 00000000000..65de7d6a7c8 --- /dev/null +++ b/app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java @@ -0,0 +1,12 @@ +package org.lsposed.manager.util; + +import android.content.ContentResolver; +import android.provider.Settings; + +public class AccessibilityUtils { + public static boolean isAnimationEnabled(ContentResolver cr) { + return !(Settings.Global.getFloat(cr, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) == 0.0f + && Settings.Global.getFloat(cr, Settings.Global.TRANSITION_ANIMATION_SCALE, 1.0f) == 0.0f + && Settings.Global.getFloat(cr, Settings.Global.WINDOW_ANIMATION_SCALE, 1.0f) == 0.0f); + } +} From 51a8f7086d66823bde9927645b4e5c7095d736f7 Mon Sep 17 00:00:00 2001 From: Steven Xu Date: Sun, 9 Mar 2025 21:09:08 +1100 Subject: [PATCH 2/5] feat: disable logs horizontal overscroll --- .../java/org/lsposed/manager/ui/fragment/LogsFragment.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java index 26f58c3a3fb..04a46d1d147 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java @@ -370,6 +370,9 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c horizontalScrollView.setFillViewport(true); horizontalScrollView.setHorizontalScrollBarEnabled(false); horizontalScrollView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); + if (!AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver())) { + horizontalScrollView.setOverScrollMode(View.OVER_SCROLL_NEVER); + } binding.swipeRefreshLayout.addView(horizontalScrollView); horizontalScrollView.addView(binding.recyclerView); binding.recyclerView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; From faf83e65346b156ca68a918e93cc5453095678e3 Mon Sep 17 00:00:00 2001 From: Steven Xu Date: Sun, 9 Mar 2025 22:25:26 +1100 Subject: [PATCH 3/5] feat: disable fragment transitions --- .../manager/ui/fragment/BaseFragment.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java index 305349e6918..d769004825a 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java @@ -29,6 +29,7 @@ import androidx.fragment.app.Fragment; import androidx.navigation.NavController; import androidx.navigation.NavDirections; +import androidx.navigation.NavOptions; import androidx.navigation.fragment.NavHostFragment; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -36,6 +37,7 @@ import org.lsposed.manager.App; import org.lsposed.manager.R; +import org.lsposed.manager.util.AccessibilityUtils; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -53,7 +55,12 @@ public NavController getNavController() { public boolean safeNavigate(@IdRes int resId) { try { - getNavController().navigate(resId); + if (!AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver())) { + var animationOptions = new NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build(); + getNavController().navigate(resId, animationOptions); + } else { + getNavController().navigate(resId); + } return true; } catch (IllegalArgumentException ignored) { return false; @@ -62,7 +69,12 @@ public boolean safeNavigate(@IdRes int resId) { public boolean safeNavigate(NavDirections direction) { try { - getNavController().navigate(direction); + if (!AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver())) { + var animationOptions = new NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build(); + getNavController().navigate(direction, animationOptions); + } else { + getNavController().navigate(direction); + } return true; } catch (IllegalArgumentException ignored) { return false; From f5a5cffbd11247f48e7248806d7b522967041186 Mon Sep 17 00:00:00 2001 From: Steven Xu Date: Sun, 9 Mar 2025 22:33:00 +1100 Subject: [PATCH 4/5] feat: disable repository module tab transition --- .../manager/ui/fragment/RepoItemFragment.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java index af43ad8163e..3dcab2aa2ea 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java @@ -79,6 +79,7 @@ import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder; import org.lsposed.manager.ui.widget.EmptyStateRecyclerView; import org.lsposed.manager.ui.widget.LinkifyTextView; +import org.lsposed.manager.util.AccessibilityUtils; import org.lsposed.manager.util.NavUtil; import org.lsposed.manager.util.SimpleStatefulAdaptor; import org.lsposed.manager.util.chrome.CustomTabsURLSpan; @@ -122,7 +123,17 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c binding.toolbar.setSubtitle(modulePackageName); binding.viewPager.setAdapter(new PagerAdapter(this)); int[] titles = new int[]{R.string.module_readme, R.string.module_releases, R.string.module_information}; - new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles[position])).attach(); + + var isAnimationEnabled = AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver()); + new TabLayoutMediator( + binding.tabLayout, + binding.viewPager, + // `autoRefresh = true` by default. Update the tabs automatically when the data set of the view pager's + // adapter changes. + true, + isAnimationEnabled, + (tab, position) -> tab.setText(titles[position]) + ).attach(); binding.tabLayout.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { ViewGroup vg = (ViewGroup) binding.tabLayout.getChildAt(0); From 0a1aad2f57d0d12c2ce5bc8814e4c54715f94682 Mon Sep 17 00:00:00 2001 From: JingMatrix Date: Thu, 13 Mar 2025 10:36:37 +0100 Subject: [PATCH 5/5] Use default NavOptions constructor to clear animations To navigate without animations, the value for arguments of type @AnimatorRes should be -1. --- .../org/lsposed/manager/ui/fragment/BaseFragment.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java index d769004825a..c62ca2c6ff9 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java @@ -56,8 +56,8 @@ public NavController getNavController() { public boolean safeNavigate(@IdRes int resId) { try { if (!AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver())) { - var animationOptions = new NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build(); - getNavController().navigate(resId, animationOptions); + var clearedNavOptions = new NavOptions.Builder().build(); + getNavController().navigate(resId, clearedNavOptions); } else { getNavController().navigate(resId); } @@ -70,8 +70,8 @@ public boolean safeNavigate(@IdRes int resId) { public boolean safeNavigate(NavDirections direction) { try { if (!AccessibilityUtils.isAnimationEnabled(requireContext().getContentResolver())) { - var animationOptions = new NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build(); - getNavController().navigate(direction, animationOptions); + var clearedNavOptions = new NavOptions.Builder().build(); + getNavController().navigate(direction, clearedNavOptions); } else { getNavController().navigate(direction); }