From ac4151864935f86cb8c0abc0c5bd6be481956c38 Mon Sep 17 00:00:00 2001 From: harshitagupta30 Date: Wed, 1 Feb 2017 23:09:32 +0530 Subject: [PATCH] Issue#344 Snackbar added for user awareness resolved --- .../activities/MessageListFragment.java | 21 +++ .../android/util/ShrinkBehaviorOfFab.java | 160 ++++++++++++++++++ app/src/main/res/layout/main.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 4 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/zulip/android/util/ShrinkBehaviorOfFab.java diff --git a/app/src/main/java/com/zulip/android/activities/MessageListFragment.java b/app/src/main/java/com/zulip/android/activities/MessageListFragment.java index 4957d62b3..766554c70 100644 --- a/app/src/main/java/com/zulip/android/activities/MessageListFragment.java +++ b/app/src/main/java/com/zulip/android/activities/MessageListFragment.java @@ -8,6 +8,10 @@ import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -46,6 +50,7 @@ import com.zulip.android.util.Constants; import com.zulip.android.util.MessageListener; import com.zulip.android.util.MutedTopics; +import com.zulip.android.util.ShrinkBehaviorOfFab; import com.zulip.android.util.ZLog; import com.zulip.android.viewholders.HeaderSpaceItemDecoration; @@ -86,6 +91,7 @@ public class MessageListFragment extends Fragment implements MessageListener { private boolean paused = false; private boolean initialized = false; private List messageList; + private Snackbar snackbar; public MessageListFragment() { app = ZulipApp.get(); @@ -182,6 +188,17 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { return view; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + CoordinatorLayout coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinatorLayout); + snackbar = Snackbar.make(coordinatorLayout, R.string.no_new_messages, Snackbar.LENGTH_SHORT) + .setDuration(1000); + FloatingActionButton floatingActionButton = (FloatingActionButton) coordinatorLayout.findViewById(R.id.fab); + CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) floatingActionButton.getLayoutParams(); + params.setBehavior(new ShrinkBehaviorOfFab()); + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); @@ -569,6 +586,10 @@ public void onMessages(Message[] messages, LoadPosition pos, if (!initialized) { return; } + + if (loadedToBottom){ + snackbar.show(); + } Log.i("onMessages", "Adding " + messages.length + " messages at " + pos); int topPosBefore = linearLayoutManager.findFirstVisibleItemPosition(); int addedCount = 0; diff --git a/app/src/main/java/com/zulip/android/util/ShrinkBehaviorOfFab.java b/app/src/main/java/com/zulip/android/util/ShrinkBehaviorOfFab.java new file mode 100644 index 000000000..9e3613500 --- /dev/null +++ b/app/src/main/java/com/zulip/android/util/ShrinkBehaviorOfFab.java @@ -0,0 +1,160 @@ +package com.zulip.android.util; + +import android.animation.Animator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.animation.FastOutSlowInInterpolator; +import android.support.v7.widget.LinearLayoutManager; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewPropertyAnimator; +import android.view.animation.Interpolator; +import android.widget.LinearLayout; + +import com.zulip.android.R; +import com.zulip.android.activities.RecyclerMessageAdapter; + +import java.util.List; + +public class ShrinkBehaviorOfFab extends CoordinatorLayout.Behavior { + + private static final Interpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator(); + private static float toolbarHeight; + private int changeInYDir; + private boolean mIsShowing; + private boolean isViewHidden; + private View chatBox; + private LinearLayoutManager linearLayoutManager; + private RecyclerMessageAdapter adapter; + + public ShrinkBehaviorOfFab(){ + } + + public ShrinkBehaviorOfFab(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { + return dependency instanceof Snackbar.SnackbarLayout; + } + + private float getFabTranslationYForSnackbar(CoordinatorLayout parent, + FloatingActionButton fab) { + float minOffset = 0; + final List dependencies = parent.getDependencies(fab); + for (int i = 0, z = dependencies.size(); i < z; i++) { + final View view = dependencies.get(i); + if (view instanceof Snackbar.SnackbarLayout && parent.doViewsOverlap(fab, view)) { + minOffset = Math.min(minOffset, + ViewCompat.getTranslationY(view) - view.getHeight()); + } + } + + return minOffset; + } + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) { + float translationY = getFabTranslationYForSnackbar(parent, child); + float percentComplete = -translationY / dependency.getHeight(); + float scaleFactor = 1 - percentComplete; + + child.setScaleX(scaleFactor); + child.setScaleY(scaleFactor); + return false; + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { + return true; + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); + if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { + hideView(child); + } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { + showView(child); + } + } + + @SuppressLint("NewApi") + private void hideView(final View view) { + isViewHidden = true; + int y = view.getHeight(); + ; + if (view instanceof AppBarLayout) { + y = -1 * view.getHeight(); + } else if (view instanceof LinearLayout) { + y = 0; + } + ViewPropertyAnimator animator = view.animate() + .translationY(y) + .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) + .setDuration(200); + + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + } + + @Override + public void onAnimationEnd(Animator animator) { + isViewHidden = false; + view.setVisibility(View.GONE); + } + + @Override + public void onAnimationCancel(Animator animator) { + isViewHidden = false; + if (!mIsShowing) + showView(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + } + }); + animator.start(); + } + + @SuppressLint("NewApi") + public void showView(final View view) { + mIsShowing = true; + ViewPropertyAnimator animator = view.animate() + .translationY((view.getId() == R.id.appBarLayout || view instanceof FloatingActionButton) ? 0 : toolbarHeight) + .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) + .setDuration(200); + + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + view.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Animator animator) { + mIsShowing = false; + } + + @Override + public void onAnimationCancel(Animator animator) { + mIsShowing = false; + if (!isViewHidden) + hideView(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + } + }); + animator.start(); + } +} diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index b1612c0d4..847dc6155 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -52,7 +52,7 @@ android:src="@drawable/ic_mode_edit_24dp" app:backgroundTint="@color/colorPrimary" app:borderWidth="0dp" - app:layout_behavior="com.zulip.android.util.RemoveViewsOnScroll" /> + app:layout_behavior="com.zulip.android.util.ShrinkBehaviorOfFab" /> Copying message to clipboard Copying to clipboard failed Something went wrong, try again + No new messages