package com.sunzxyong.android_scalingactivityanimator;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;

/**
 * Created by 晓勇 on 2015/8/21 0021.
 */
public class ScalingActivityAnimator {
    private Activity mActivity;
    private View mMainView;
    private View mPopupView;
    private PopupWindow mPopupWindow;
    private long duration =400;
    private int screenHeight;
    private int popHeight ;
    /**
     * @param context
     * @param act
     * @param mainViewId main layout id
     * @param displayLayoutId displayLayoutId
     */
    public ScalingActivityAnimator(Context context, Activity act, int mainViewId, int displayLayoutId){
        this.mActivity = act;
        this.mMainView = act.findViewById(mainViewId);
        this.mPopupView = LayoutInflater.from(context).inflate(displayLayoutId, null);
        Point outSize = new Point();
        mActivity.getWindowManager().getDefaultDisplay().getSize(outSize);
        screenHeight = outSize.y;
        popHeight = screenHeight/2;
    }

    /**
     * Open Animation
     * @return pop layout view
     */
    public View start(){
        startAnim();
        return mPopupView;
    }

    /**
     * Close Animation
     */
    public void resume(){
        if(mPopupWindow.isShowing()){
            mPopupWindow.dismiss();
            resumeAnim();
        }
    }
    private void startAnim() {
        int mainViewHeight = mMainView.getRootView().getHeight();
        ObjectAnimator mainViewScaleXAnim = ObjectAnimator.ofFloat(mMainView, "scaleX", 1.0f, 0.8f);
        ObjectAnimator mainViewScaleYAnim = ObjectAnimator.ofFloat(mMainView, "scaleY", 1.0f, 0.9f);
        ObjectAnimator mainViewAlphaAnim = ObjectAnimator.ofFloat(mMainView, "alpha", 1.0f, 0.5f);
        ObjectAnimator mainViewRotationXAnim = ObjectAnimator.ofFloat(mMainView, "rotationX", 0f, 8f);
        ObjectAnimator mainViewRotationXAnimResume = ObjectAnimator.ofFloat(mMainView, "rotationX", 8f, 0f);
        mainViewRotationXAnimResume.setStartDelay(200);
        ObjectAnimator mainViewTranslationYAnim = ObjectAnimator.ofFloat(mMainView, "translationY", 0, -(mainViewHeight / 20));
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(mainViewScaleXAnim, mainViewScaleYAnim, mainViewAlphaAnim, mainViewRotationXAnim, mainViewRotationXAnimResume, mainViewTranslationYAnim);
        animatorSet.setDuration(duration);
        animatorSet.start();
        showPopupWindow();
    }
    private void showPopupWindow() {
        mPopupWindow = new PopupWindow(mPopupView, ViewGroup.LayoutParams.MATCH_PARENT, popHeight, true);
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setAnimationStyle(R.style.showScalingAnimation);
        mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                resumeAnim();
            }
        });
        mPopupWindow.showAtLocation(mPopupView, Gravity.BOTTOM, 0, 0);
    }
    private void resumeAnim() {
        int mainViewHeight = mMainView.getRootView().getHeight();
        ObjectAnimator mainViewScaleXAnim = ObjectAnimator.ofFloat(mMainView, "scaleX", 0.8f, 1.0f);
        ObjectAnimator mainViewScaleYAnim = ObjectAnimator.ofFloat(mMainView, "scaleY", 0.9f, 1.0f);
        ObjectAnimator mainViewAlphaAnim = ObjectAnimator.ofFloat(mMainView, "alpha", 0.5f, 1.0f);
        ObjectAnimator mainViewRotationXAnim = ObjectAnimator.ofFloat(mMainView, "rotationX", 0f, 8f);
        ObjectAnimator mainViewRotationXAnimResume = ObjectAnimator.ofFloat(mMainView, "rotationX", 8f, 0f);
        mainViewRotationXAnimResume.setStartDelay(200);
        ObjectAnimator mainViewTranslationYAnim = ObjectAnimator.ofFloat(mMainView, "translationY", -(mainViewHeight / 20), 0);//将缩小后的主View向上平移height/20的高度,即在标题栏下方
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(mainViewScaleXAnim, mainViewScaleYAnim, mainViewAlphaAnim, mainViewRotationXAnim, mainViewRotationXAnimResume, mainViewTranslationYAnim);
        animatorSet.setDuration(duration);
        animatorSet.start();
    }

    /**
     * @return get Animated duration
     */
    public long getDuration() {
        return duration;
    }

    /**
     * @param duration animation duration in milliseconds
     */
    public void setDuration(long duration) {
        this.duration = duration;
    }

    /**
     * Setting pop-up view is one-third the height of the screen
     */
    public void setPopViewHeightIsOneThirdOfScreen(){
        popHeight = screenHeight/3;
    }

    /**
     * Setting pop-up view is two-thirds the height of the screen
     */
    public void setPopViewHeightIsTwoThirdOfScreen(){
        popHeight = 2*screenHeight/3;
    }
}