package com.distantfuture.videos.donate;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.AnticipateOvershootInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.distantfuture.videos.R;
import com.distantfuture.videos.imageutils.ToolbarIcons;
import com.distantfuture.videos.misc.Utils;
public class DonateThanksHelper {
private Handler mRemoveHandler;
private Runnable mRemoveRunnable;
private ContentView mContentView;
private Animation inAnimation, outAnimation;
public DonateThanksHelper(Context context) {
super();
inAnimation = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
outAnimation = AnimationUtils.loadAnimation(context, android.R.anim.fade_out);
mRemoveHandler = new Handler(Looper.getMainLooper());
mRemoveRunnable = new Runnable() {
@Override
public void run() {
removeMsg();
}
};
}
public void install(Activity activity) {
mContentView = new ContentView(activity);
View view = mContentView.mView;
if (view.getParent() == null) {
activity.addContentView(view, mContentView.getLayoutParams());
}
view.startAnimation(inAnimation);
if (view.getVisibility() != View.VISIBLE) {
view.setVisibility(View.VISIBLE);
}
startRemoveTimer();
}
public void startRemoveTimer() {
mRemoveHandler.postDelayed(mRemoveRunnable, 6000);
}
private void removeMsg() {
ViewGroup parent = ((ViewGroup) mContentView.mView.getParent());
if (parent != null) {
mContentView.mView.startAnimation(outAnimation);
parent.removeView(mContentView.mView);
mContentView = null;
}
}
// ===========================================================================================
// ===========================================================================================
public static class ContentView {
private final static int mIconSize = 64;
private final Activity mActivity;
public ViewGroup mView;
Point mDisplaySize;
private ViewGroup.LayoutParams mLayoutParams;
private ImageView mImageView;
public ContentView(Activity activity) {
mActivity = activity;
LayoutInflater inflate = LayoutInflater.from(activity);
mView = (ViewGroup) inflate.inflate(R.layout.view_donate_thanks, null);
ObjectAnimator scaleXDown = ObjectAnimator.ofFloat(mView, "alpha", .8f);
scaleXDown.setRepeatMode(ValueAnimator.REVERSE);
scaleXDown.setDuration(1000);
scaleXDown.setRepeatCount(ValueAnimator.INFINITE);
scaleXDown.start();
Drawable heartDrawable = ToolbarIcons.icon(mView.getContext(), ToolbarIcons.IconID.HEART, 0xffffffff, mIconSize);
heartDrawable.setAlpha(233);
Bitmap heartBitmap = Utils.drawableToBitmap(heartDrawable, mIconSize, mIconSize);
int offsetX = 0;
int offsetY = 0;
View content = activity.getWindow().findViewById(android.R.id.content);
mDisplaySize = new Point(content.getWidth(), content.getHeight()); // Utils.getDisplaySize(activity);
int maxY = mDisplaySize.y - mIconSize;
int maxX = mDisplaySize.x - mIconSize;
for (int y = 0; y < maxY; y += mIconSize) {
for (int x = 0; x < maxX; x += mIconSize) {
addImageView(activity, heartBitmap, x, y);
}
}
showThankYouText();
}
private void showThankYouText() {
View theView = mView.findViewById(R.id.thank_you_text);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(theView, "scaleX", 2.0f);
scaleX.setRepeatMode(ValueAnimator.REVERSE);
scaleX.setRepeatCount(ValueAnimator.INFINITE);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(theView, "scaleY", 2.0f);
scaleY.setRepeatMode(ValueAnimator.REVERSE);
scaleY.setRepeatCount(ValueAnimator.INFINITE);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(scaleX).with(scaleY);
animatorSet.setDuration(2000);
animatorSet.start();
}
private void animateV(final View theView, int offsetX, int offsetY) {
float randomScale = 1.2f + (float) (Math.random() * 3.0f);
float randomScaleBack = .9f + (float) (Math.random() * .8f);
ObjectAnimator scaleXDown = ObjectAnimator.ofFloat(theView, "scaleX", randomScale);
ObjectAnimator scaleYDown = ObjectAnimator.ofFloat(theView, "scaleY", randomScale);
ObjectAnimator scaleXBack = ObjectAnimator.ofFloat(theView, "scaleX", randomScaleBack);
ObjectAnimator scaleYBack = ObjectAnimator.ofFloat(theView, "scaleY", randomScaleBack);
float alphav = .7f + (float) (Math.random() * .3f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(theView, "alpha", alphav);
long startDelay = (long) (Math.random() * 2000);
AnimatorSet bouncer = new AnimatorSet();
bouncer.setInterpolator(new AnticipateOvershootInterpolator());
bouncer.setStartDelay(startDelay);
bouncer.play(scaleXDown).with(scaleYDown).with(alpha);
bouncer.play(scaleXBack).with(scaleYBack);
bouncer.play(scaleXBack).after(scaleXDown);
ObjectAnimator transitionX = ObjectAnimator.ofFloat(theView, "translationX", mDisplaySize.x / 2);
ObjectAnimator transitionY = ObjectAnimator.ofFloat(theView, "translationY", mDisplaySize.y + 100);
AnimatorSet moveOffSet = new AnimatorSet();
moveOffSet.setStartDelay(2000);
moveOffSet.setDuration(200);
moveOffSet.setInterpolator(new AnticipateOvershootInterpolator());
moveOffSet.play(transitionX).with(transitionY);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(moveOffSet).after(bouncer);
animatorSet.start();
}
public ViewGroup.LayoutParams getLayoutParams() {
if (mLayoutParams == null) {
mLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.TOP);
}
return mLayoutParams;
}
private int shift(Activity activity) {
float kick = Utils.dpToPx(4, activity);
int shift = (int) (Math.random() * kick);
int neg = (int) (Math.random() * 100);
if (neg < 50)
shift *= -1;
return shift;
}
private void addImageView(Activity activity, Bitmap heartBitmap, int offsetX, int offsetY) {
mImageView = createImageView(activity, heartBitmap);
mImageView.setAlpha(0.0f);
mView.addView(mImageView);
mImageView.setTranslationY(offsetY + shift(activity));
mImageView.setTranslationX(offsetX + shift(activity));
animateV(mImageView, offsetX, offsetY);
}
private ImageView createImageView(Activity activity, Bitmap heartBitmap) {
ImageView imageView = new ImageView(activity);
imageView.setImageBitmap(heartBitmap);
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int marginPx = (int) Utils.dpToPx(2, activity);
imageParams.setMargins(marginPx, marginPx, marginPx, marginPx);
imageView.setLayoutParams(imageParams);
return imageView;
}
}
}