diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 7202d7af5..671b7b8d5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -80,6 +80,7 @@ public abstract class BaseStatusListFragment exten protected HashMap relationships=new HashMap<>(); protected Rect tmpRect=new Rect(); protected TypedObjectPool attachmentViewsPool=new TypedObjectPool<>(this::makeNewMediaAttachmentView); + protected boolean fabDisabled; public BaseStatusListFragment(){ super(20); @@ -102,8 +103,6 @@ public abstract class BaseStatusListFragment exten setRetainInstance(true); } - - @Override protected RecyclerView.Adapter getAdapter(){ return adapter=new DisplayItemsAdapter(); @@ -271,37 +270,55 @@ public abstract class BaseStatusListFragment exten }); } + public @Nullable View getFab() { + if (getParentFragment() instanceof HomeTabFragment home) return home.getFab(); + else return fab; + } + + public void animateFab(boolean show) { + View fab = getFab(); + if (fab == null) return; + if (show && fab.getVisibility() != View.VISIBLE) { + fab.setVisibility(View.VISIBLE); + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + fab.getHeight() * 2, + 0); + animate.setDuration(300); + fab.startAnimation(animate); + } else if (!show && fab.getVisibility() == View.VISIBLE) { + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + 0, + fab.getHeight() * 2); + animate.setDuration(300); + fab.startAnimation(animate); + fab.setVisibility(View.INVISIBLE); + scrollDiff = 0; + } + } + @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); fab=view.findViewById(R.id.fab); + fabDisabled = getArguments().getBoolean("__is_tab", false); + list.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){ if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); + View fab = getFab(); if (fab!=null && GlobalUserPreferences.autoHideFab) { if (dy > 0 && fab.getVisibility() == View.VISIBLE) { - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - 0, - fab.getHeight() * 2); - animate.setDuration(300); - fab.startAnimation(animate); - fab.setVisibility(View.INVISIBLE); - scrollDiff = 0; + animateFab(false); } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { if (list.getChildAt(0).getTop() == 0 || scrollDiff > 400) { - fab.setVisibility(View.VISIBLE); - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - fab.getHeight() * 2, - 0); - animate.setDuration(300); - fab.startAnimation(animate); + animateFab(true); scrollDiff = 0; } else { scrollDiff += Math.abs(dy); @@ -344,10 +361,12 @@ public abstract class BaseStatusListFragment exten ((UsableRecyclerView) list).setIncludeMarginsInItemHitbox(true); updateToolbar(); - if (withComposeButton()) { + if (withComposeButton() && !fabDisabled) { fab.setVisibility(View.VISIBLE); fab.setOnClickListener(this::onFabClick); fab.setOnLongClickListener(this::onFabLongClick); + } else if (fab != null) { + fab.setVisibility(View.GONE); } } @@ -656,13 +675,13 @@ public abstract class BaseStatusListFragment exten currentPhotoViewer.onPause(); } - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); Nav.go(getActivity(), ComposeFragment.class, args); } - protected boolean onFabLongClick(View v) { + public boolean onFabLongClick(View v) { return UiUtils.pickAccountForCompose(getActivity(), accountID); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java index ce95a9731..726fc380f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -138,12 +138,12 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment { } @Override - protected boolean onFabLongClick(View v) { + public boolean onFabLongClick(View v) { return UiUtils.pickAccountForCompose(getActivity(), accountID, '#'+hashtag+' '); } @Override - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); args.putString("prefilledText", '#'+hashtag+' '); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java index adf202bce..2a5b0dd42 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -24,6 +24,7 @@ import android.view.ViewParent; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; @@ -98,6 +99,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private PopupMenu overflowPopup; private View overflowActionView = null; private boolean announcementsBadged, settingsBadged; + private ImageButton fab; @Override public void onCreate(Bundle savedInstanceState) { @@ -122,6 +124,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { FrameLayout view = new FrameLayout(getContext()); + inflater.inflate(R.layout.compose_fab, view); + fab = view.findViewById(R.id.fab); + fab.setOnClickListener(this::onFabClick); + fab.setOnLongClickListener(this::onFabLongClick); pager = new ViewPager2(getContext()); toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false); @@ -280,6 +286,20 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab }).exec(accountID); } + private void onFabClick(View v){ + if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment l) { + l.onFabClick(v); + } + } + + private boolean onFabLongClick(View v) { + if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment l) { + return l.onFabLongClick(v); + } else { + return false; + } + } + private void addListsToOverflowMenu() { Context ctx = getContext(); listsMenu.clear(); @@ -430,6 +450,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private void updateSwitcherIcon(int i) { timelineIcon.setImageResource(timelines[i].getIcon().iconRes); timelineTitle.setText(timelines[i].getTitle(getContext())); + if (fragments[i] instanceof BaseStatusListFragment l) l.animateFab(true); } @Override @@ -657,6 +678,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab return hashtagsItems.values(); } + public ImageButton getFab() { + return fab; + } + private class HomePagerAdapter extends RecyclerView.Adapter { @NonNull @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java index 79422cbb7..3aa514e3b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java @@ -152,7 +152,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment { } @Override - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); Nav.go(getActivity(), ComposeFragment.class, args); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java index eed44b9e8..8979d91a5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java @@ -56,7 +56,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment