package com.example.jiangye.demo.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.transition.AutoTransition;
import android.transition.ChangeImageTransform;
import android.transition.TransitionManager;
import android.transition.TransitionSet;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.example.jiangye.demo.R;
import com.example.jiangye.demo.gyroscope.GyroscopeImageView;
import com.example.jiangye.demo.gyroscope.GyroscopeTransFormation;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;

public class CoverActivity extends Activity {

  private static final String COVER_URL = "cover_url";
  private static final String OFFSET_X = "OFFSET_X";
  private static final String OFFSET_Y = "OFFSET_Y";
  private static final long TRANSITIONS_DURATION = 1000L;   //做动画的时长

  /**
   * 屏幕宽度和高度
   */
  private int mScreenWidth;
  private int mScreenHeight;

  /**
   * 上一个页面 GyroscopeImageView 的宽度和高度
   */
  private int mOriginWidth;
  private int mOriginHeight;

  /**
   * Loading 覆盖图
   */
  private ImageView mIvCover;
  private String mCoverUrl;

  /**
   * 用于做 Transitions 动画的 ViewGroup
   */
  private ViewGroup mTransitionsContainer;

  /**
   * @param cover_url Loading 图 url
   * @param gyroscopeImageView 想要做动画的 GyroscopeImageView
   */
  public static void startActivityWithAnimation(final Activity activity, String cover_url,
      GyroscopeImageView gyroscopeImageView) {
    final Intent intent = new Intent(activity, CoverActivity.class);
    intent.putExtra(COVER_URL, cover_url);
    // 获取控件位置信息
    final Rect rect = new Rect();
    gyroscopeImageView.getGlobalVisibleRect(rect);
    intent.setSourceBounds(rect);
    intent.putExtra(OFFSET_X, gyroscopeImageView.getOffsetX());
    intent.putExtra(OFFSET_Y, gyroscopeImageView.getOffsetY());
    activity.startActivity(intent);
    activity.overridePendingTransition(0, 0);
  }

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cover);
    mCoverUrl = getIntent().getStringExtra(COVER_URL);
    mIvCover = findViewById(R.id.iv_cover);
    mTransitionsContainer = findViewById(R.id.container_layout);
    initial();
  }

  /**
   * 设置动画最初场景
   */
  private void initial() {
    // 获取上一个界面传入的控件位置信息
    Rect rect = getIntent().getSourceBounds();

    if (rect != null) {
      // 获取上一个界面中,控件的宽度和高度
      mOriginWidth = rect.right - rect.left;
      mOriginHeight = rect.bottom - rect.top;

      // 设置 ImageView 的位置,使其和上一个界面中图片的位置重合
      FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mOriginWidth, mOriginHeight);
      params.setMargins(rect.left, rect.top, rect.right, rect.bottom);
      mIvCover.setLayoutParams(params);
      mIvCover.setScaleType(ImageView.ScaleType.MATRIX);

      //拿到上个界面图片的偏移量
      final float offsetX = getIntent().getFloatExtra(OFFSET_X, 0);
      final float offsetY = getIntent().getFloatExtra(OFFSET_Y, 0);

      Picasso.get()
          .load(mCoverUrl)
          .transform(new GyroscopeTransFormation(mOriginWidth, mOriginHeight))
          .into(new Target() {
            @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
              mIvCover.setImageBitmap(bitmap);
              Matrix matrix = mIvCover.getImageMatrix();
              int width = bitmap.getWidth();
              int height = bitmap.getHeight();
              //保持上个界面图片的偏移量
              matrix.setTranslate((int) ((mOriginWidth - width) * 0.5f + 0.5f) + offsetX,
                  (int) ((mOriginHeight - height) * 0.5f + 0.5f) + offsetY);
              mIvCover.setImageMatrix(matrix);
            }

            @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) {

            }

            @Override public void onPrepareLoad(Drawable placeHolderDrawable) {
            }
          });

      //开始入场动画
      runEnterAnim();
    } else {
      //没有动画效果
      FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mScreenWidth, mScreenHeight);
      mIvCover.setLayoutParams(params);
      mIvCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
      Picasso.get().load(mCoverUrl).into(mIvCover);
    }
  }

  /**
   * 获取屏幕尺寸
   */
  private void getScreenSize() {
    mScreenWidth = getResources().getDisplayMetrics().widthPixels;
    mScreenHeight = getResources().getDisplayMetrics().heightPixels;
  }

  /**
   * 模拟入场动画
   */
  private void runEnterAnim() {
    getScreenSize();
    mIvCover.post(new Runnable() {
      @Override public void run() {
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mScreenWidth, mScreenHeight);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          ChangeImageTransform changeImageTransform = new ChangeImageTransform();
          AutoTransition autoTransition = new AutoTransition();
          changeImageTransform.setDuration(TRANSITIONS_DURATION);
          autoTransition.setDuration(TRANSITIONS_DURATION);
          TransitionSet transitionSet = new TransitionSet();
          transitionSet.addTransition(autoTransition);
          transitionSet.addTransition(changeImageTransform);
          TransitionManager.beginDelayedTransition(mTransitionsContainer, transitionSet);
          mIvCover.setLayoutParams(params);
          mIvCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
        } else {
          mIvCover.setLayoutParams(params);
          mIvCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
        }
      }
    });
  }
}