1c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler/*
2c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
3c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler *
4c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * you may not use this file except in compliance with the License.
6c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * You may obtain a copy of the License at
7c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler *
8c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler *
10c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * Unless required by applicable law or agreed to in writing, software
11c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * See the License for the specific language governing permissions and
14c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler * limitations under the License.
15c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler */
16c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
17c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerpackage com.android.dreams.bummer;
18c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
19c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.content.Context;
20c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.os.Handler;
21c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.os.Message;
22c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.util.AttributeSet;
23c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.view.View;
24c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerimport android.widget.TextView;
25c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
26c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandlerpublic class BummerView extends TextView {
27c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public static final int START = 1;
28c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public static final int MOVE = 2;
29c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
30c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    private int mDelay = 10000; // ms
31c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    private int mAnimTime = 2000; // ms
32c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    private boolean mAnimate = true;
33c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
34c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    private Handler mHandler = new Handler() {
35c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        @Override
36c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        public void handleMessage(Message m) {
37c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler            boolean animate = false;
38c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler            switch (m.what) {
39c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                case MOVE:
40c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    animate = mAnimate;
41c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    // fall through
42c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                case START:
43c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final View parent = (View) BummerView.this.getParent();
44c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    if (parent == null)
45c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                        return;
46c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
47c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float framew = parent.getMeasuredWidth();
48c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float frameh = parent.getMeasuredHeight();
49c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float textw = getMeasuredWidth();
50c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float texth = getMeasuredHeight();
51c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
52c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float newx = (float) (Math.random() * (framew - textw));
53c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    final float newy = (float) (Math.random() * (frameh - texth));
54c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    if (animate) {
55c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                        animate().x(newx)
56c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                                .y(newy)
57c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                                .setDuration(mAnimTime)
58c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                                .start();
59c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    } else {
60c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                        setX(newx);
61c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                        setY(newy);
62c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    }
63c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    setVisibility(View.VISIBLE);
64c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
65c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    removeMessages(MOVE);
66c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    sendEmptyMessageDelayed(MOVE, mDelay);
67c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    break;
68c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler            }
69c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        }
70c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    };
71c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
72c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public BummerView(Context context) {
73c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        super(context);
74c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    }
75c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
76c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public BummerView(Context context, AttributeSet attrs) {
77c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        this(context, attrs, 0);
78c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    }
79c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
80c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public BummerView(Context context, AttributeSet attrs, int flags) {
81c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        super(context, attrs, flags);
82c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    }
83c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
84c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public void setAnimationParams(boolean animate, int delay, int animTime) {
85c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        mAnimate = animate;
86c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        mDelay = delay;
87c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        mAnimTime = animTime;
88c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    }
89c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
90c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    @Override
91c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    public void onAttachedToWindow() {
92c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        final View parent = (View) this.getParent();
93c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        parent.addOnLayoutChangeListener(new OnLayoutChangeListener() {
94c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler            public void onLayoutChange(View v, int left, int top, int right, int bottom,
95c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
96c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                if (v == parent && right != oldRight) {
97c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    mHandler.removeMessages(MOVE);
98c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                    mHandler.sendEmptyMessage(START);
99c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler                }
100c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler            }
101c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        });
102c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
103c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler        mHandler.sendEmptyMessage(START);
104c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler    }
105c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler
106c0c316e9c6464538be9d227683ffcbe5a160e3c7Daniel Sandler}
107