From dcd717453234dd927135432debfc6d3576255ea5 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 22 Feb 2023 15:05:34 +0800 Subject: [PATCH] [mobile] fix fab show hide --- .../com/fongmi/android/tv/utils/Utils.java | 20 ++++++++ .../tv/ui/custom/CustomFabBehavior.java | 46 ------------------- .../android/tv/ui/fragment/VodFragment.java | 35 ++++++++------ .../tv/ui/fragment/child/HomeFragment.java | 11 +++++ .../tv/ui/fragment/child/TypeFragment.java | 12 +++++ 5 files changed, 65 insertions(+), 59 deletions(-) delete mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomFabBehavior.java diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 5824fd645..8f01f89b7 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -22,6 +22,7 @@ import androidx.fragment.app.FragmentActivity; import com.fongmi.android.tv.App; import com.fongmi.android.tv.server.Server; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.permissionx.guolindev.PermissionX; import java.math.BigInteger; @@ -79,6 +80,25 @@ public class Utils { activity.getWindow().getDecorView().setSystemUiVisibility(flags); } + public static void toggleFab(int dy, FloatingActionButton fab) { + if (dy > 0) Utils.hideFab(fab); + else Utils.showFab(fab); + } + + public static void showFab(FloatingActionButton fab) { + if (fab.getVisibility() == View.INVISIBLE) fab.show(); + } + + public static void hideFab(FloatingActionButton fab) { + if (fab.getVisibility() != View.VISIBLE) return; + fab.hide(new FloatingActionButton.OnVisibilityChangedListener() { + @Override + public void onHidden(FloatingActionButton fab) { + fab.setVisibility(View.INVISIBLE); + } + }); + } + public static boolean hasPIP() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomFabBehavior.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomFabBehavior.java deleted file mode 100644 index 0eea48297..000000000 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomFabBehavior.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fongmi.android.tv.ui.custom; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.view.ViewCompat; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -public class CustomFabBehavior extends FloatingActionButton.Behavior { - - public CustomFabBehavior() { - super(); - } - - public CustomFabBehavior(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) { - return axes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type); - } - - @Override - public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type, @NonNull int[] consumed) { - super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed); - if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { - onHide(child); - } else if (dyConsumed < 0 && child.getVisibility() == View.INVISIBLE) { - child.show(); - } - } - - private void onHide(FloatingActionButton child) { - child.hide(new FloatingActionButton.OnVisibilityChangedListener() { - @Override - public void onHidden(FloatingActionButton fab) { - child.setVisibility(View.INVISIBLE); - } - }); - } -} \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index 7edc2cd28..d88d36c7f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -30,6 +30,7 @@ import com.fongmi.android.tv.ui.custom.dialog.LinkDialog; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; import com.fongmi.android.tv.ui.fragment.child.HomeFragment; import com.fongmi.android.tv.ui.fragment.child.TypeFragment; +import com.fongmi.android.tv.utils.Utils; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.greenrobot.eventbus.EventBus; @@ -50,6 +51,14 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal return new VodFragment(); } + private HomeFragment getHomeFragment() { + return (HomeFragment) mPageAdapter.instantiateItem(mBinding.pager, 0); + } + + private TypeFragment getTypeFragment() { + return (TypeFragment) mPageAdapter.instantiateItem(mBinding.pager, mBinding.pager.getCurrentItem()); + } + private Site getSite() { return ApiConfig.get().getHome(); } @@ -105,7 +114,7 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal Boolean filter = getSite().isFilterable() ? false : null; for (Class item : mTypeAdapter.getTypes()) if (result.getFilters().containsKey(item.getTypeId())) item.setFilter(filter); for (Class item : mTypeAdapter.getTypes()) if (result.getFilters().containsKey(item.getTypeId())) item.setFilters(result.getFilters().get(item.getTypeId())); - getSiteFragment().showContent(result); + getHomeFragment().showContent(result); mPageAdapter.notifyDataSetChanged(); } @@ -117,8 +126,8 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal private void setFabVisible(boolean filter) { if (filter) { - mBinding.link.hide(); mBinding.filter.show(); + mBinding.link.hide(); } else { mBinding.filter.hide(); mBinding.link.show(); @@ -129,16 +138,16 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal SiteDialog.create(this).filter(true).show(); } - private void onFilter(View view) { - for (Fragment fragment : getChildFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; - FilterDialog.create(this).filter(mTypeAdapter.get(mBinding.pager.getCurrentItem()).getFilters()).show(getChildFragmentManager(), null); - } - private void onLink(View view) { if (ApiConfig.hasPush()) LinkDialog.create(this).show(); else mBinding.link.hide(); } + private void onFilter(View view) { + for (Fragment fragment : getChildFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; + FilterDialog.create(this).filter(mTypeAdapter.get(mBinding.pager.getCurrentItem()).getFilters()).show(getChildFragmentManager(), null); + } + @Override public void setSite(Site item) { ApiConfig.get().setHome(item); @@ -160,7 +169,7 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal public void onRefreshEvent(RefreshEvent event) { switch (event.getType()) { case HISTORY: - getSiteFragment().getHistory(); + getHomeFragment().getHistory(); break; case VIDEO: homeContent(); @@ -176,17 +185,17 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal if (!getSite().getKey().isEmpty()) mViewModel.homeContent(); } - private HomeFragment getSiteFragment() { - return (HomeFragment) mPageAdapter.instantiateItem(mBinding.pager, 0); + public void toggleLink(int dy) { + Utils.toggleFab(dy, mBinding.link); } - private TypeFragment getTypeFragment() { - return (TypeFragment) mPageAdapter.instantiateItem(mBinding.pager, mBinding.pager.getCurrentItem()); + public void toggleFilter(int dy) { + Utils.toggleFab(dy, mBinding.filter); } public boolean canBack() { try { - if (mBinding.pager.getCurrentItem() == 0) return getSiteFragment().canBack(); + if (mBinding.pager.getCurrentItem() == 0) return getHomeFragment().canBack(); else return getTypeFragment().canBack(); } catch (Exception e) { return true; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java index cf51d6dce..749ffa812 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java @@ -6,6 +6,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.widget.NestedScrollView; import androidx.recyclerview.widget.GridLayoutManager; import androidx.viewbinding.ViewBinding; @@ -19,6 +20,7 @@ import com.fongmi.android.tv.ui.activity.BaseFragment; import com.fongmi.android.tv.ui.activity.DetailActivity; import com.fongmi.android.tv.ui.adapter.HistoryAdapter; import com.fongmi.android.tv.ui.adapter.VodAdapter; +import com.fongmi.android.tv.ui.fragment.VodFragment; public class HomeFragment extends BaseFragment implements VodAdapter.OnClickListener, HistoryAdapter.OnClickListener { @@ -32,6 +34,10 @@ public class HomeFragment extends BaseFragment implements VodAdapter.OnClickList return new HomeFragment(); } + private VodFragment getParent() { + return (VodFragment) getParentFragment(); + } + @Override protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { return mBinding = FragmentHomeBinding.inflate(inflater, container, false); @@ -44,6 +50,11 @@ public class HomeFragment extends BaseFragment implements VodAdapter.OnClickList getHistory(); } + @Override + protected void initEvent() { + mBinding.getRoot().setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> getParent().toggleLink(scrollY - oldScrollY)); + } + private void setRecyclerView() { mBinding.history.setHasFixedSize(true); mBinding.history.getItemAnimator().setChangeDuration(0); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java index b28cd3233..3a52214cc 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.Product; @@ -20,6 +21,7 @@ import com.fongmi.android.tv.ui.activity.BaseFragment; import com.fongmi.android.tv.ui.activity.DetailActivity; import com.fongmi.android.tv.ui.adapter.VodAdapter; import com.fongmi.android.tv.ui.custom.CustomScroller; +import com.fongmi.android.tv.ui.fragment.VodFragment; import java.util.ArrayList; import java.util.HashMap; @@ -44,6 +46,10 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac return fragment; } + private VodFragment getParent() { + return (VodFragment) getParentFragment(); + } + private String getTypeId() { return getArguments().getString("typeId"); } @@ -71,6 +77,12 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac @Override protected void initEvent() { mBinding.recycler.addOnScrollListener(mScroller = new CustomScroller(this)); + mBinding.recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + getParent().toggleFilter(dy); + } + }); } private void setRecyclerView() {