11a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler/*);
21a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * Copyright (C) 2012 The Android Open Source Project
31a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler *
41a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
51a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * you may not use this file except in compliance with the License.
61a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * You may obtain a copy of the License at
71a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler *
81a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
91a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler *
101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * Unless required by applicable law or agreed to in writing, software
111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * See the License for the specific language governing permissions and
141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler * limitations under the License.
151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler */
161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerpackage com.android.systemui;
181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.animation.AnimatorSet;
201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.animation.PropertyValuesHolder;
211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.animation.ObjectAnimator;
221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.animation.TimeAnimator;
231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.app.Activity;
241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.content.ComponentName;
251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.content.Context;
261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.content.Intent;
271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.drawable.AnimationDrawable;
281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.drawable.BitmapDrawable;
291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Bitmap;
301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Canvas;
311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Color;
321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.ColorMatrix;
331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.ColorMatrixColorFilter;
341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Matrix;
351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Paint;
361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Point;
371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.PorterDuffColorFilter;
381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.PorterDuffXfermode;
391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Rect;
401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.RectF;
411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.os.Handler;
421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.os.SystemClock;
431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.AttributeSet;
441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.DisplayMetrics;
451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.Pair;
461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.Gravity;
471a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.MotionEvent;
481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.View;
491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.ViewGroup;
501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.WindowManager;
511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.animation.AnimationUtils;
521a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.widget.FrameLayout;
531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.widget.ImageView;
541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport java.util.HashMap;
551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport java.util.Random;
561a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerpublic class BeanBag extends Activity {
581a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    final static boolean DEBUG = false;
591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public static class Board extends FrameLayout
611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    {
621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static Random sRNG = new Random();
631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float lerp(float a, float b, float f) {
651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return (b-a)*f + a;
661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float randfrange(float a, float b) {
691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return lerp(a, b, sRNG.nextFloat());
701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int randsign() {
731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return sRNG.nextBoolean() ? 1 : -1;
741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static boolean flip() {
771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return sRNG.nextBoolean();
781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float mag(float x, float y) {
811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return (float) Math.sqrt(x*x+y*y);
821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
84aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        static float clamp(float x, float a, float b) {
85aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            return ((x<a)?a:((x>b)?b:x));
86aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
87aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float dot(float x1, float y1, float x2, float y2) {
891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return x1*x2+y1+y2;
901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static <E> E pick(E[] array) {
931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (array.length == 0) return null;
941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return array[sRNG.nextInt(array.length)];
951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int pickInt(int[] array) {
981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (array.length == 0) return 0;
991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return array[sRNG.nextInt(array.length)];
1001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
1011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int NUM_BEANS = 40;
1031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float MIN_SCALE = 0.2f;
1041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float MAX_SCALE = 1f;
1051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float LUCKY = 0.001f;
1071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int MAX_RADIUS = (int)(576 * MAX_SCALE);
1091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int BEANS[] = {
1111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean1,
1161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean1,
1171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean2,
1181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean2,
1191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbeandroid,
1201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        };
1211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int COLORS[] = {
1231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF00CC00,
1241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFCC0000,
1251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF0000CC,
1261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFFFF00,
1271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF8000,
1281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF00CCFF,
1291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF0080,
1301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF8000FF,
1311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF8080,
1321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF8080FF,
1331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFB0C0D0,
1341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFDDDDDD,
1351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF333333,
1361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        };
1371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public class Bean extends ImageView {
1391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public static final float VMAX = 1000.0f;
1401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public static final float VMIN = 100.0f;
1411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float x, y, a;
1431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float va;
1451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float vx, vy;
1461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1471a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float r;
1481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float z;
1501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public int h,w;
1521a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public boolean grabbed;
1541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float grabx, graby;
1551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public long grabtime;
156aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            private float grabx_offset, graby_offset;
1571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1581a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public Bean(Context context, AttributeSet as) {
1591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                super(context, as);
1601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public String toString() {
1631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return String.format("<bean (%.1f, %.1f) (%d x %d)>",
1641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    getX(), getY(), getWidth(), getHeight());
1651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            private void pickBean() {
1681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                int beanId = pickInt(BEANS);
1691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (randfrange(0,1) <= LUCKY) {
1701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    beanId = R.drawable.jandycane;
1711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
1721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                BitmapDrawable bean = (BitmapDrawable) getContext().getResources().getDrawable(beanId);
1731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Bitmap beanBits = bean.getBitmap();
1741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                h=beanBits.getHeight();
1751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                w=beanBits.getWidth();
1761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (DEBUG) {
1781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    bean.setAlpha(0x80);
1791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
1801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                this.setImageDrawable(bean);
1811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Paint pt = new Paint();
1831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final int color = pickInt(COLORS);
1841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                ColorMatrix CM = new ColorMatrix();
1851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                float[] M = CM.getArray();
1861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                // we assume the color information is in the red channel
1871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* R */ M[0]  = (float)((color & 0x00FF0000) >> 16) / 0xFF;
1881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* G */ M[5]  = (float)((color & 0x0000FF00) >> 8)  / 0xFF;
1891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* B */ M[10] = (float)((color & 0x000000FF))       / 0xFF;
1901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColorFilter(new ColorMatrixColorFilter(M));
1911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                setLayerType(View.LAYER_TYPE_HARDWARE, (beanId == R.drawable.jandycane) ? null : pt);
1921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public void reset() {
1951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pickBean();
1961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float scale = lerp(MIN_SCALE,MAX_SCALE,z);
1981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                setScaleX(scale); setScaleY(scale);
1991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                r = 0.3f*Math.max(h,w)*scale;
2011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                a=(randfrange(0,360));
2031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                va = randfrange(-30,30);
2041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                vx = randfrange(-40,40) * z;
2061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                vy = randfrange(-40,40) * z;
2071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float boardh = boardHeight;
2081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float boardw = boardWidth;
2091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                //android.util.Log.d("BeanBag", "reset: w="+w+" h="+h);
2101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (flip()) {
2111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x=(vx < 0 ? boardw+2*r : -r*4f);
2121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y=(randfrange(0, boardh-3*r)*0.5f + ((vy < 0)?boardh*0.5f:0));
2131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                } else {
2141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y=(vy < 0 ? boardh+2*r : -r*4f);
2151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x=(randfrange(0, boardw-3*r)*0.5f + ((vx < 0)?boardw*0.5f:0));
2161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public void update(float dt) {
2201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (grabbed) {
2211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//                    final float interval = (SystemClock.uptimeMillis() - grabtime) / 1000f;
2221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    vx = (vx * 0.75f) + ((grabx - x) / dt) * 0.25f;
2231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x = grabx;
2241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    vy = (vy * 0.75f) + ((graby - y) / dt) * 0.25f;;
2251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y = graby;
2261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                } else {
2271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x = (x + vx * dt);
2281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y = (y + vy * dt);
2291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    a = (a + va * dt);
2301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float overlap(Bean other) {
2341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float dx = (x - other.x);
2351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float dy = (y - other.y);
2361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return mag(dx, dy) - r - other.r;
2371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            @Override
2401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public boolean onTouchEvent(MotionEvent e) {
2411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                switch (e.getAction()) {
2421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_DOWN:
2431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabbed = true;
244aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        grabx_offset = e.getRawX() - x;
245aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        graby_offset = e.getRawY() - y;
2461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        va = 0;
2471a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        // fall
2481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_MOVE:
249aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        grabx = e.getRawX() - grabx_offset;
250aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        graby = e.getRawY() - graby_offset;
2511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabtime = e.getEventTime();
2521a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        break;
2531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_CANCEL:
2541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_UP:
2551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabbed = false;
256aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        float a = randsign() * clamp(mag(vx, vy) * 0.33f, 0, 1080f);
257aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        va = randfrange(a*0.5f, a);
2581a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        break;
2591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return true;
2611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
2631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        TimeAnimator mAnim;
2651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private int boardWidth;
2661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private int boardHeight;
2671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public Board(Context context, AttributeSet as) {
2691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super(context, as);
2701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
2721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            setWillNotDraw(!DEBUG);
2741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
2751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private void reset() {
2771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//            android.util.Log.d("Nyandroid", "board reset");
2781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            removeAllViews();
2791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(
2811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        ViewGroup.LayoutParams.WRAP_CONTENT,
2821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        ViewGroup.LayoutParams.WRAP_CONTENT);
2831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            for(int i=0; i<NUM_BEANS; i++) {
2851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Bean nv = new Bean(getContext(), null);
2861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                addView(nv, wrap);
2871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.z = ((float)i/NUM_BEANS);
2881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.z *= nv.z;
2891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.reset();
2901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.x = (randfrange(0, boardWidth));
2911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.y = (randfrange(0, boardHeight));
2921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (mAnim != null) {
2951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                mAnim.cancel();
2961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            mAnim = new TimeAnimator();
2981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            mAnim.setTimeListener(new TimeAnimator.TimeListener() {
2991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                private long lastPrint = 0;
3001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
3011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    if (DEBUG && totalTime - lastPrint > 5000) {
3021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        lastPrint = totalTime;
3031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        for (int i=0; i<getChildCount(); i++) {
3041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            android.util.Log.d("BeanBag", "bean " + i + ": " + getChildAt(i));
3051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    }
3071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    for (int i=0; i<getChildCount(); i++) {
3091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        View v = getChildAt(i);
3101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        if (!(v instanceof Bean)) continue;
3111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        Bean nv = (Bean) v;
3121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.update(deltaTime / 1000f);
3131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        for (int j=i+1; j<getChildCount(); j++) {
3151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            View v2 = getChildAt(j);
3161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            if (!(v2 instanceof Bean)) continue;
3171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            Bean nv2 = (Bean) v2;
3181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            final float overlap = nv.overlap(nv2);
3191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setRotation(nv.a);
3221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setX(nv.x-nv.getPivotX());
3231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setY(nv.y-nv.getPivotY());
3241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        if (   nv.x < - MAX_RADIUS
3261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.x > boardWidth + MAX_RADIUS
3271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.y < -MAX_RADIUS
3281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.y > boardHeight + MAX_RADIUS)
3291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        {
3301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            nv.reset();
3311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    }
3331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    if (DEBUG) invalidate();
3351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
3361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            });
3371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        protected void onSizeChanged (int w, int h, int oldw, int oldh) {
3411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super.onSizeChanged(w,h,oldw,oldh);
3421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            boardWidth = w;
3431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            boardHeight = h;
3441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//            android.util.Log.d("Nyandroid", "resized: " + w + "x" + h);
345aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
346aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
347aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        public void startAnimation() {
348aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            stopAnimation();
349aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            if (mAnim == null) {
350aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                post(new Runnable() { public void run() {
351aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                    reset();
352aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                    startAnimation();
353aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                } });
354aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            } else {
3551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                mAnim.start();
356aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            }
3571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3581a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
359aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        public void stopAnimation() {
360aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            if (mAnim != null) mAnim.cancel();
361aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
3621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        protected void onDetachedFromWindow() {
3651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super.onDetachedFromWindow();
366aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            stopAnimation();
3671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public boolean isOpaque() {
3711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return false;
3721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public void onDraw(Canvas c) {
3761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (DEBUG) {
3771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                //android.util.Log.d("BeanBag", "onDraw");
3781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Paint pt = new Paint();
3791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setAntiAlias(true);
3801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStyle(Paint.Style.STROKE);
3811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColor(0xFFFF0000);
3821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStrokeWidth(4.0f);
3831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                c.drawRect(0, 0, getWidth(), getHeight(), pt);
3841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColor(0xFFFFCC00);
3851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStrokeWidth(1.0f);
3861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                for (int i=0; i<getChildCount(); i++) {
3871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    Bean b = (Bean) getChildAt(i);
3881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float a = (360-b.a)/180f*3.14159f;
3891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float tx = b.getTranslationX();
3901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float ty = b.getTranslationY();
3911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawCircle(b.x, b.y, b.r, pt);
3921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawCircle(tx, ty, 4, pt);
3931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawLine(b.x, b.y, (float)(b.x+b.r*Math.sin(a)), (float)(b.y+b.r*Math.cos(a)), pt);
3941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
3951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
3961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
3981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    private Board mBoard;
4001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    @Override
4021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public void onStart() {
4031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        super.onStart();
4041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        getWindow().addFlags(
4061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                  WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
4071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
4081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                );
409aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard = new Board(this, null);
410aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        setContentView(mBoard);
411aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    }
412aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
413aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    @Override
414aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    public void onPause() {
415aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        super.onPause();
416aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard.stopAnimation();
4171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
4181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    @Override
4201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public void onResume() {
4211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        super.onResume();
422aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard.startAnimation();
4231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
4241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler}
425