package com.wangdaye.mysplash.common.utils;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import com.wangdaye.mysplash.Mysplash;
import com.wangdaye.mysplash.R;
import com.wangdaye.mysplash.common.ui.activity.SettingsActivity;
import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollAppBarLayout;
import com.wangdaye.mysplash.common.utils.helper.NotificationHelper;
import com.wangdaye.mysplash.common.utils.manager.SettingsOptionManager;
/**
* Back to top utils.
*
* An utils class that can control list view to scroll to the top.
*
* */
public class BackToTopUtils {
private static class ShowTopBarAnim extends Animation {
// widget
private View topBar;
// data
private float topBarStartY;
// life cycle.
ShowTopBarAnim(View topBar) {
this.topBar = topBar;
this.topBarStartY = topBar.getY();
}
// parent methods.
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
topBar.setY(topBarStartY * (1 - interpolatedTime));
}
}
private static class ShowContentAnim extends Animation {
// widget
private View content;
// data
private float contentStartY;
private float contentEndY;
// life cycle.
ShowContentAnim(View topBar, View content) {
this.content = content;
this.contentStartY = content.getY();
this.contentEndY = topBar.getMeasuredHeight();
}
// parent methods.
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
content.setY(contentStartY + (contentEndY - contentStartY) * interpolatedTime);
}
}
private static class ShowTopBarListener implements Animation.AnimationListener {
// widget
private NestedScrollAppBarLayout topBar;
// life cycle.
ShowTopBarListener(NestedScrollAppBarLayout bar) {
topBar = bar;
}
// interface.
@Override
public void onAnimationStart(Animation animation) {
// do nothing.
}
@Override
public void onAnimationEnd(Animation animation) {
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) topBar.getLayoutParams();
params.setBehavior(new NestedScrollAppBarLayout.Behavior());
topBar.setLayoutParams(params);
}
@Override
public void onAnimationRepeat(Animation animation) {
// do nothing.
}
}
public static boolean isSetBackToTop(boolean home) {
if (home) {
return !SettingsOptionManager.getInstance(Mysplash.getInstance())
.getBackToTopType().equals("none");
} else {
return SettingsOptionManager.getInstance(Mysplash.getInstance())
.getBackToTopType().equals("all");
}
}
private static void showSetBackToTopSnackbar() {
if (!SettingsOptionManager.getInstance(Mysplash.getInstance())
.isNotifiedSetBackToTop()) {
final Context c = Mysplash.getInstance().getTopActivity();
if (c != null) {
SharedPreferences.Editor editor = PreferenceManager
.getDefaultSharedPreferences(Mysplash.getInstance())
.edit();
editor.putBoolean(
c.getString(R.string.key_notified_set_back_to_top),
true);
editor.apply();
SettingsOptionManager.getInstance(Mysplash.getInstance())
.setNotifiedSetBackToTop(Mysplash.getInstance(), true);
NotificationHelper.showActionSnackbar(
c.getString(R.string.feedback_notify_set_back_to_top),
c.getString(R.string.set),
Snackbar.LENGTH_LONG,
new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent s = new Intent(c, SettingsActivity.class);
c.startActivity(s);
}
});
}
}
}
public static void scrollToTop(RecyclerView recyclerView) {
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
int firstVisibleItemPosition = 0;
if (manager instanceof LinearLayoutManager) {
firstVisibleItemPosition = getFirstVisibleItemPosition((LinearLayoutManager) manager);
} else if (manager instanceof StaggeredGridLayoutManager) {
firstVisibleItemPosition = getFirstVisibleItemPosition((StaggeredGridLayoutManager) manager);
}
if (firstVisibleItemPosition > 5) {
recyclerView.scrollToPosition(5);
}
recyclerView.smoothScrollToPosition(0);
if (!SettingsOptionManager.getInstance(Mysplash.getInstance())
.isNotifiedSetBackToTop()) {
BackToTopUtils.showSetBackToTopSnackbar();
}
}
private static int getFirstVisibleItemPosition(LinearLayoutManager manager) {
return manager.findFirstVisibleItemPosition();
}
private static int getFirstVisibleItemPosition(StaggeredGridLayoutManager manager) {
return manager.findFirstVisibleItemPositions(null)[0];
}
/**
* Expand top bar, like {@link NestedScrollAppBarLayout}.
*
* @param topBar The top bar that needs to be expand.
* @param contentView Content view with the top bar.
* */
public static void showTopBar(NestedScrollAppBarLayout topBar, View contentView) {
if (topBar.getY() < 0) {
ShowTopBarAnim topBarAnim = new ShowTopBarAnim(topBar);
topBarAnim.setDuration(300);
topBarAnim.setAnimationListener(new ShowTopBarListener(topBar));
ShowContentAnim contentAnim = new ShowContentAnim(topBar, contentView);
contentAnim.setDuration(300);
topBar.clearAnimation();
contentView.clearAnimation();
topBar.startAnimation(topBarAnim);
contentView.startAnimation(contentAnim);
}
}
}