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