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 305349e69..c62ca2c6f 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 clearedNavOptions = new NavOptions.Builder().build(); + getNavController().navigate(resId, clearedNavOptions); + } 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 clearedNavOptions = new NavOptions.Builder().build(); + getNavController().navigate(direction, clearedNavOptions); + } else { + getNavController().navigate(direction); + } return true; } catch (IllegalArgumentException ignored) { return false; 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 24659ed1a..04a46d1d1 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); @@ -359,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; 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 af43ad816..3dcab2aa2 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); 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 000000000..65de7d6a7 --- /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); + } +}