/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dreams.phototable;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

public class BummerView extends TextView {
    public static final int START = 1;
    public static final int MOVE = 2;

    private int mDelay = 10000; // ms
    private int mAnimTime = 2000; // ms
    private boolean mAnimate = false;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message m) {
            boolean animate = false;
            switch (m.what) {
                case MOVE:
                    animate = mAnimate;
                    // fall through
                case START:
                    final View parent = (View) BummerView.this.getParent();
                    if (parent == null)
                        return;

                    final float framew = parent.getMeasuredWidth();
                    final float frameh = parent.getMeasuredHeight();
                    final float textw = getMeasuredWidth();
                    final float texth = getMeasuredHeight();

                    final float newx = (float) (Math.random() * (framew - textw));
                    final float newy = (float) (Math.random() * (frameh - texth));
                    if (animate) {
                        animate().x(newx)
                                .y(newy)
                                .setDuration(mAnimTime)
                                .start();
                    } else {
                        setX(newx);
                        setY(newy);
                    }
                    setVisibility(View.VISIBLE);

                    removeMessages(MOVE);
                    sendEmptyMessageDelayed(MOVE, mDelay);
                    break;
            }
        }
    };

    public BummerView(Context context) {
        super(context);
    }

    public BummerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BummerView(Context context, AttributeSet attrs, int flags) {
        super(context, attrs, flags);
    }

    public void setAnimationParams(boolean animate, int delay, int animTime) {
        mAnimate = animate;
        mDelay = delay;
        mAnimTime = animTime;
    }

    @Override
    public void onAttachedToWindow() {
        final View parent = (View) this.getParent();
        parent.addOnLayoutChangeListener(new OnLayoutChangeListener() {
            public void onLayoutChange(View v, int left, int top, int right, int bottom,
                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (v == parent && right != oldRight) {
                    mHandler.removeMessages(MOVE);
                    mHandler.sendEmptyMessage(START);
                }
            }
        });

        mHandler.sendEmptyMessage(START);
    }

}
