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