package com.example.android.support.wearable.notifications;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Random;

/**
 * Custom display activity for an animated sample notification.
 */
public class AnimatedNotificationDisplayActivity extends Activity {
    public static final String EXTRA_TITLE = "title";

    private static final int BASE_ANIMATION_DURATION_MS = 2000;

    private Random mRandom;
    private int mAnimationRange;
    private ImageView mImageView;
    private Animator mAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animated_notification_display);

        mRandom = new Random(System.currentTimeMillis());
        mAnimationRange = getResources().getDimensionPixelSize(R.dimen.animation_range);

        String title = getIntent().getStringExtra(EXTRA_TITLE);
        ((TextView) findViewById(R.id.title)).setText(title);

        mImageView = new ImageView(this);
        mImageView.setImageResource(R.drawable.example_big_picture);

        ImageZoomView zoomView = new ImageZoomView(this, mImageView, mAnimationRange);
        zoomView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));

        ((FrameLayout) findViewById(R.id.container)).addView(zoomView, 0);

        createNextAnimation(false);
    }

    private void createNextAnimation(boolean start) {
        float startX = mImageView.getTranslationX();
        float startY = mImageView.getTranslationY();
        float endX = -mRandom.nextInt(mAnimationRange);
        float endY = -mRandom.nextInt(mAnimationRange);
        float distance = (float) Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2));

        mAnimation = ObjectAnimator.ofPropertyValuesHolder(mImageView,
                PropertyValuesHolder.ofFloat("translationX", startX, endX),
                PropertyValuesHolder.ofFloat("translationY", startY, endY));
        mAnimation.setInterpolator(new AccelerateDecelerateInterpolator());

        mAnimation.setDuration(Math.max(BASE_ANIMATION_DURATION_MS / 10,
                (int) (distance * BASE_ANIMATION_DURATION_MS / mAnimationRange)));

        mAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                createNextAnimation(true);
            }
        });
        if (start) {
            mAnimation.start();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mAnimation.start();
    }

    @Override
    protected void onPause() {
        mAnimation.pause();
        super.onPause();
    }

    /** Helper view that zooms in on a child image view */
    private static class ImageZoomView extends ViewGroup {
        private final int mZoomLength;

        public ImageZoomView(Context context, ImageView imageView, int zoomLength) {
            super(context);
            addView(imageView);
            mZoomLength = zoomLength;
        }

        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            ImageView imageView = (ImageView) getChildAt(0);

            // Resize the image view to be at least mZoomLength pixels larger in both
            // dimensions than the containing view.
            int imageWidth = imageView.getDrawable().getIntrinsicWidth();
            int imageHeight = imageView.getDrawable().getIntrinsicHeight();
            int minSize = Math.max(right - left, bottom - top) + mZoomLength;
            if (imageWidth > imageHeight) {
                imageWidth = minSize * imageWidth / imageHeight;
                imageHeight = minSize;
            } else {
                imageHeight = minSize * imageHeight / imageWidth;
                imageWidth = minSize;
            }
            imageView.layout(left, top, left + imageWidth, top + imageHeight);
        }
    }
}