package com.zulip.android.viewholders;
import android.content.Context;
import android.os.CountDownTimer;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.zulip.android.R;
import com.zulip.android.activities.RecyclerMessageAdapter;
import com.zulip.android.util.RemoveViewsOnScroll;
/**
* Custom view for In App Notification
* TopSnackBar
*/
public class TopSnackBar {
public static final int LENGTH_SHORT = 2000; //2 seconds
public static final int LENGTH_LONG = 4000; //4 seconds
public static final int LENGTH_INDEFINITE = -1; //shows until it manually dismissed
private Context context;
private LinearLayoutManager linearLayoutManager;
private RecyclerMessageAdapter adapter;
private TextView tvText;
private Button showButton;
private CountDownTimer countDownTimer;
private boolean isShown = false;
private LinearLayout linearLayout;
public TopSnackBar(Context context) {
linearLayout = new LinearLayout(context);
this.context = context;
make();
}
public LinearLayout getLinearLayout() {
return linearLayout;
}
/**
* make snackBar
*/
public void make() {
createAndAddLayout();
}
/**
* Show snackBar
*
* @param topMargin margin of top
* @param message to be shown in snackBar
* @param duration auto dismiss duration
*/
public void show(int topMargin, String message, int duration) {
setText(message);
if (isShown()) {
countDownTimer.cancel();
startTimer(duration);
return;
}
linearLayout.setY(topMargin);
linearLayout.setVisibility(View.VISIBLE);
Animation animation = AnimationUtils.loadAnimation(context,
R.anim.slide_down);
linearLayout.startAnimation(animation);
setLayoutBehaviour();
setShown(true);
startTimer(duration);
}
/**
* start timer to dismiss after duration
*
* @param duration time after which it is automatically dismissed
*/
private void startTimer(int duration) {
if (duration != LENGTH_INDEFINITE) {
countDownTimer = new CountDownTimer(duration, duration) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
if (isShown()) {
dismiss();
}
}
};
countDownTimer.start();
}
}
/**
* Dismiss snackBar
*/
public void dismiss() {
Animation slideUpAnimation = AnimationUtils.loadAnimation(context,
R.anim.slide_up);
slideUpAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
linearLayout.setVisibility(View.GONE);
setShown(false);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
linearLayout.startAnimation(slideUpAnimation);
removeLayoutBehaviour();
setShown(false);
}
/**
* Remove Layout Behaviour
*/
private void removeLayoutBehaviour() {
getLLLayoutParams().setBehavior(null);
}
/**
* Create And Add Layout
*/
private void createAndAddLayout() {
CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
linearLayout.setLayoutParams(layoutParams);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setWeightSum(1f);
linearLayout.setGravity(Gravity.CENTER_VERTICAL);
LinearLayout.LayoutParams tvLayoutParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
tvLayoutParams.weight = 0.7f;
LinearLayout.LayoutParams showButtonLayoutParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
showButtonLayoutParams.weight = 0.3f;
tvText = new TextView(context);
tvText.setLayoutParams(tvLayoutParams);
tvText.setTextColor(ContextCompat.getColor(context, R.color.top_snackbar_text_color));
tvText.setPadding(24, 0, 0, 0);
linearLayout.addView(tvText);
showButton = new Button(context);
showButton.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
showButton.setTextColor(ContextCompat.getColor(context, R.color.top_snackbar_show_button_text_color));
showButton.setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
showButton.setLayoutParams(showButtonLayoutParams);
linearLayout.addView(showButton);
linearLayout.setVisibility(View.GONE);
linearLayout.setBackgroundResource(R.drawable.top_snackbar_bg);
}
/**
* Get status of snackBar
*
* @return whether snackBar is in view or not currently
*/
public boolean isShown() {
return isShown;
}
/**
* Set status of snackBar
*
* @param shown is true if snackBar is in view currently
*/
private void setShown(boolean shown) {
isShown = shown;
}
/**
* Set LayoutBehaviour so that on scroll it can toggle
*/
public void setLayoutBehaviour() {
getLLLayoutParams().setBehavior(new RemoveViewsOnScroll(linearLayoutManager, adapter));
}
/**
* Fet LayoutParams of LinearLayout
*
* @return LayoutParams
*/
private CoordinatorLayout.LayoutParams getLLLayoutParams() {
return (CoordinatorLayout.LayoutParams) linearLayout.getLayoutParams();
}
/**
* Set LinearLayoutManager
*
* @param linearLayoutManager LinearLayoutManager
*/
public void setMessagesLayoutManager(LinearLayoutManager linearLayoutManager) {
this.linearLayoutManager = linearLayoutManager;
}
/**
* Set Adapter
*
* @param adapter RecyclerMessageAdapter
*/
public void setMessagesAdapter(RecyclerMessageAdapter adapter) {
this.adapter = adapter;
}
/**
* Set Message to SnackBar
*
* @param quantityString message
*/
public void setText(String quantityString) {
tvText.setText(quantityString);
}
/**
* Set Actions button attributes
*
* @param string button text
* @param onClickListener of button
*/
public void setAction(int string, View.OnClickListener onClickListener) {
showButton.setText(context.getString(string));
showButton.setOnClickListener(onClickListener);
}
}