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;
270bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandlerimport android.content.pm.PackageManager;
281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.drawable.AnimationDrawable;
291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.drawable.BitmapDrawable;
301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Bitmap;
311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Canvas;
321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Color;
331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.ColorMatrix;
341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.ColorMatrixColorFilter;
351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Matrix;
361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Paint;
371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Point;
381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.PorterDuffColorFilter;
391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.PorterDuffXfermode;
401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.Rect;
411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.graphics.RectF;
421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.os.Handler;
431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.os.SystemClock;
440bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandlerimport android.provider.Settings;
451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.AttributeSet;
461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.DisplayMetrics;
471a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.util.Pair;
481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.Gravity;
491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.MotionEvent;
501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.View;
511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.ViewGroup;
521a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.WindowManager;
531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.view.animation.AnimationUtils;
541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.widget.FrameLayout;
551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport android.widget.ImageView;
561a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport java.util.HashMap;
571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerimport java.util.Random;
581a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandlerpublic class BeanBag extends Activity {
601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    final static boolean DEBUG = false;
611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public static class Board extends FrameLayout
631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    {
641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static Random sRNG = new Random();
651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float lerp(float a, float b, float f) {
671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return (b-a)*f + a;
681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float randfrange(float a, float b) {
711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return lerp(a, b, sRNG.nextFloat());
721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int randsign() {
751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return sRNG.nextBoolean() ? 1 : -1;
761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static boolean flip() {
791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return sRNG.nextBoolean();
801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float mag(float x, float y) {
831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return (float) Math.sqrt(x*x+y*y);
841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
86aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        static float clamp(float x, float a, float b) {
87aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            return ((x<a)?a:((x>b)?b:x));
88aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
89aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float dot(float x1, float y1, float x2, float y2) {
911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return x1*x2+y1+y2;
921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static <E> E pick(E[] array) {
951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (array.length == 0) return null;
961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return array[sRNG.nextInt(array.length)];
971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int pickInt(int[] array) {
1001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (array.length == 0) return 0;
1011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return array[sRNG.nextInt(array.length)];
1021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
1031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int NUM_BEANS = 40;
1051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float MIN_SCALE = 0.2f;
1061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float MAX_SCALE = 1f;
1071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static float LUCKY = 0.001f;
1091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int MAX_RADIUS = (int)(576 * MAX_SCALE);
1111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int BEANS[] = {
1131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean0,
1171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean1,
1181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean1,
1191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean2,
1201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbean2,
1211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler          R.drawable.redbeandroid,
1221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        };
1231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        static int COLORS[] = {
1251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF00CC00,
1261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFCC0000,
1271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF0000CC,
1281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFFFF00,
1291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF8000,
1301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF00CCFF,
1311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF0080,
1321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF8000FF,
1331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFFF8080,
1341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF8080FF,
1351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFB0C0D0,
1361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFFDDDDDD,
1371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            0xFF333333,
1381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        };
1391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public class Bean extends ImageView {
1411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public static final float VMAX = 1000.0f;
1421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public static final float VMIN = 100.0f;
1431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float x, y, a;
1451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float va;
1471a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float vx, vy;
1481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float r;
1501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float z;
1521a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public int h,w;
1541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public boolean grabbed;
1561a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float grabx, graby;
1571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public long grabtime;
158aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            private float grabx_offset, graby_offset;
1591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public Bean(Context context, AttributeSet as) {
1611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                super(context, as);
1621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public String toString() {
1651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return String.format("<bean (%.1f, %.1f) (%d x %d)>",
1661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    getX(), getY(), getWidth(), getHeight());
1671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            private void pickBean() {
1701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                int beanId = pickInt(BEANS);
1711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (randfrange(0,1) <= LUCKY) {
1721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    beanId = R.drawable.jandycane;
1731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
1741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                BitmapDrawable bean = (BitmapDrawable) getContext().getResources().getDrawable(beanId);
1751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Bitmap beanBits = bean.getBitmap();
1761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                h=beanBits.getHeight();
1771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                w=beanBits.getWidth();
1781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (DEBUG) {
1801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    bean.setAlpha(0x80);
1811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
1821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                this.setImageDrawable(bean);
1831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Paint pt = new Paint();
1851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final int color = pickInt(COLORS);
1861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                ColorMatrix CM = new ColorMatrix();
1871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                float[] M = CM.getArray();
1881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                // we assume the color information is in the red channel
1891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* R */ M[0]  = (float)((color & 0x00FF0000) >> 16) / 0xFF;
1901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* G */ M[5]  = (float)((color & 0x0000FF00) >> 8)  / 0xFF;
1911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                /* B */ M[10] = (float)((color & 0x000000FF))       / 0xFF;
1921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColorFilter(new ColorMatrixColorFilter(M));
1931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                setLayerType(View.LAYER_TYPE_HARDWARE, (beanId == R.drawable.jandycane) ? null : pt);
1941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
1951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public void reset() {
1971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pickBean();
1981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
1991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float scale = lerp(MIN_SCALE,MAX_SCALE,z);
2001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                setScaleX(scale); setScaleY(scale);
2011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                r = 0.3f*Math.max(h,w)*scale;
2031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                a=(randfrange(0,360));
2051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                va = randfrange(-30,30);
2061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                vx = randfrange(-40,40) * z;
2081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                vy = randfrange(-40,40) * z;
2091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float boardh = boardHeight;
2101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float boardw = boardWidth;
2111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                //android.util.Log.d("BeanBag", "reset: w="+w+" h="+h);
2121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (flip()) {
2131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x=(vx < 0 ? boardw+2*r : -r*4f);
2141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y=(randfrange(0, boardh-3*r)*0.5f + ((vy < 0)?boardh*0.5f:0));
2151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                } else {
2161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y=(vy < 0 ? boardh+2*r : -r*4f);
2171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x=(randfrange(0, boardw-3*r)*0.5f + ((vx < 0)?boardw*0.5f:0));
2181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public void update(float dt) {
2221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                if (grabbed) {
2231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//                    final float interval = (SystemClock.uptimeMillis() - grabtime) / 1000f;
2241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    vx = (vx * 0.75f) + ((grabx - x) / dt) * 0.25f;
2251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x = grabx;
2261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    vy = (vy * 0.75f) + ((graby - y) / dt) * 0.25f;;
2271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y = graby;
2281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                } else {
2291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    x = (x + vx * dt);
2301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    y = (y + vy * dt);
2311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    a = (a + va * dt);
2321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public float overlap(Bean other) {
2361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float dx = (x - other.x);
2371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                final float dy = (y - other.y);
2381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return mag(dx, dy) - r - other.r;
2391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            @Override
2421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            public boolean onTouchEvent(MotionEvent e) {
2431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                switch (e.getAction()) {
2441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_DOWN:
2451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabbed = true;
246aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        grabx_offset = e.getRawX() - x;
247aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        graby_offset = e.getRawY() - y;
2481a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        va = 0;
2491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        // fall
2501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_MOVE:
251aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        grabx = e.getRawX() - grabx_offset;
252aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        graby = e.getRawY() - graby_offset;
2531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabtime = e.getEventTime();
2541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        break;
2551a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_CANCEL:
2561a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    case MotionEvent.ACTION_UP:
2571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        grabbed = false;
258aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        float a = randsign() * clamp(mag(vx, vy) * 0.33f, 0, 1080f);
259aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                        va = randfrange(a*0.5f, a);
2601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        break;
2611a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
2621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                return true;
2631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
2651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        TimeAnimator mAnim;
2671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private int boardWidth;
2681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private int boardHeight;
2691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public Board(Context context, AttributeSet as) {
2711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super(context, as);
2721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
2741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            setWillNotDraw(!DEBUG);
2761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
2771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        private void reset() {
2791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//            android.util.Log.d("Nyandroid", "board reset");
2801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            removeAllViews();
2811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(
2831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        ViewGroup.LayoutParams.WRAP_CONTENT,
2841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        ViewGroup.LayoutParams.WRAP_CONTENT);
2851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            for(int i=0; i<NUM_BEANS; i++) {
2871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Bean nv = new Bean(getContext(), null);
2881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                addView(nv, wrap);
2891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.z = ((float)i/NUM_BEANS);
2901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.z *= nv.z;
2911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.reset();
2921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.x = (randfrange(0, boardWidth));
2931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                nv.y = (randfrange(0, boardHeight));
2941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
2961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (mAnim != null) {
2971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                mAnim.cancel();
2981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
2991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            mAnim = new TimeAnimator();
3001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            mAnim.setTimeListener(new TimeAnimator.TimeListener() {
3011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                private long lastPrint = 0;
3021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
3031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    if (DEBUG && totalTime - lastPrint > 5000) {
3041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        lastPrint = totalTime;
3051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        for (int i=0; i<getChildCount(); i++) {
3061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            android.util.Log.d("BeanBag", "bean " + i + ": " + getChildAt(i));
3071a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3081a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    }
3091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3101a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    for (int i=0; i<getChildCount(); i++) {
3111a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        View v = getChildAt(i);
3121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        if (!(v instanceof Bean)) continue;
3131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        Bean nv = (Bean) v;
3141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.update(deltaTime / 1000f);
3151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3161a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        for (int j=i+1; j<getChildCount(); j++) {
3171a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            View v2 = getChildAt(j);
3181a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            if (!(v2 instanceof Bean)) continue;
3191a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            Bean nv2 = (Bean) v2;
3201a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            final float overlap = nv.overlap(nv2);
3211a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3221a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3231a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setRotation(nv.a);
3241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setX(nv.x-nv.getPivotX());
3251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        nv.setY(nv.y-nv.getPivotY());
3261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        if (   nv.x < - MAX_RADIUS
3281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.x > boardWidth + MAX_RADIUS
3291a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.y < -MAX_RADIUS
3301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            || nv.y > boardHeight + MAX_RADIUS)
3311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        {
3321a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                            nv.reset();
3331a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                        }
3341a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    }
3351a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3361a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    if (DEBUG) invalidate();
3371a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
3381a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            });
3391a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3401a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3411a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3421a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        protected void onSizeChanged (int w, int h, int oldw, int oldh) {
3431a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super.onSizeChanged(w,h,oldw,oldh);
3441a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            boardWidth = w;
3451a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            boardHeight = h;
3461a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler//            android.util.Log.d("Nyandroid", "resized: " + w + "x" + h);
347aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
348aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
349aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        public void startAnimation() {
350aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            stopAnimation();
351aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            if (mAnim == null) {
352aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                post(new Runnable() { public void run() {
353aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                    reset();
354aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                    startAnimation();
355aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler                } });
356aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            } else {
3571a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                mAnim.start();
358aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            }
3591a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3601a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
361aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        public void stopAnimation() {
362aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            if (mAnim != null) mAnim.cancel();
363aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        }
3641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        protected void onDetachedFromWindow() {
3671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            super.onDetachedFromWindow();
368aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler            stopAnimation();
3691a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3701a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3721a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public boolean isOpaque() {
3731a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            return false;
3741a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3751a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
3761a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        @Override
3771a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        public void onDraw(Canvas c) {
3781a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            if (DEBUG) {
3791a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                //android.util.Log.d("BeanBag", "onDraw");
3801a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                Paint pt = new Paint();
3811a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setAntiAlias(true);
3821a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStyle(Paint.Style.STROKE);
3831a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColor(0xFFFF0000);
3841a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStrokeWidth(4.0f);
3851a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                c.drawRect(0, 0, getWidth(), getHeight(), pt);
3861a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setColor(0xFFFFCC00);
3871a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                pt.setStrokeWidth(1.0f);
3881a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                for (int i=0; i<getChildCount(); i++) {
3891a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    Bean b = (Bean) getChildAt(i);
3901a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float a = (360-b.a)/180f*3.14159f;
3911a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float tx = b.getTranslationX();
3921a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    final float ty = b.getTranslationY();
3931a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawCircle(b.x, b.y, b.r, pt);
3941a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawCircle(tx, ty, 4, pt);
3951a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                    c.drawLine(b.x, b.y, (float)(b.x+b.r*Math.sin(a)), (float)(b.y+b.r*Math.cos(a)), pt);
3961a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                }
3971a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler            }
3981a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        }
3991a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
4001a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4011a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    private Board mBoard;
4021a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4031a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    @Override
4041a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public void onStart() {
4051a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        super.onStart();
4061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4070bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandler        // ACHIEVEMENT UNLOCKED
4080bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandler        PackageManager pm = getPackageManager();
4090bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandler        pm.setComponentEnabledSetting(new ComponentName(this, BeanBagDream.class),
4100bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandler                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
4110bcf4adcde601aff7d3894de2603e1f2cae41f1aDaniel Sandler
4121a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        getWindow().addFlags(
4131a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                  WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
4141a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
4151a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler                );
416aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard = new Board(this, null);
417aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        setContentView(mBoard);
418aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    }
419aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler
420aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    @Override
421aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler    public void onPause() {
422aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        super.onPause();
423aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard.stopAnimation();
4241a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
4251a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler
4261a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    @Override
4271a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    public void onResume() {
4281a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler        super.onResume();
429aa0a3b692337ec8b6431e8d046ea01f042157334Daniel Sandler        mBoard.startAnimation();
4301a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler    }
4311a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler}
432