Skip to content
This repository has been archived by the owner on Jul 25, 2024. It is now read-only.

Issue#344 Snackbar added for user awareness resolved #358

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -86,6 +91,7 @@ public class MessageListFragment extends Fragment implements MessageListener {
private boolean paused = false;
private boolean initialized = false;
private List<Message> messageList;
private Snackbar snackbar;

public MessageListFragment() {
app = ZulipApp.get();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
160 changes: 160 additions & 0 deletions app/src/main/java/com/zulip/android/util/ShrinkBehaviorOfFab.java
Original file line number Diff line number Diff line change
@@ -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<FloatingActionButton> {

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<View> 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();
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
</android.support.design.widget.CoordinatorLayout>

<android.support.design.widget.NavigationView
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -156,4 +156,5 @@
<string name="copy_message_fetch">Copying message to clipboard</string>
<string name="copy_failed">Copying to clipboard failed</string>
<string name="try_again_error_msg">Something went wrong, try again</string>
<string name="no_new_messages">No new messages</string>
</resources>