PlatLogoActivity.java revision 33f577cfea7b5cc7c7167716522bf74c5e3219da
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.internal.app; 18 19import android.animation.ObjectAnimator; 20import android.app.Activity; 21import android.content.ActivityNotFoundException; 22import android.content.ContentResolver; 23import android.content.Intent; 24import android.content.res.ColorStateList; 25import android.graphics.Canvas; 26import android.graphics.Outline; 27import android.graphics.Paint; 28import android.graphics.Path; 29import android.graphics.drawable.Drawable; 30import android.graphics.drawable.GradientDrawable; 31import android.graphics.drawable.RippleDrawable; 32import android.graphics.drawable.ShapeDrawable; 33import android.graphics.drawable.shapes.OvalShape; 34import android.os.Bundle; 35import android.provider.Settings; 36import android.util.DisplayMetrics; 37import android.util.Log; 38import android.view.Gravity; 39import android.view.KeyEvent; 40import android.view.View; 41import android.view.ViewGroup; 42import android.view.ViewOutlineProvider; 43import android.view.animation.PathInterpolator; 44import android.widget.FrameLayout; 45import android.widget.ImageView; 46 47public class PlatLogoActivity extends Activity { 48 final static int[] FLAVORS = { 49 0xFF9C27B0, 0xFFBA68C8, // grape 50 0xFFFF9800, 0xFFFFB74D, // orange 51 0xFFF06292, 0xFFF8BBD0, // bubblegum 52 0xFFAFB42B, 0xFFCDDC39, // lime 53 0xFFFFEB3B, 0xFFFFF176, // lemon 54 0xFF795548, 0xFFA1887F, // mystery flavor 55 }; 56 FrameLayout mLayout; 57 int mTapCount; 58 int mKeyCount; 59 PathInterpolator mInterpolator = new PathInterpolator(0f, 0f, 0.5f, 1f); 60 61 static int newColorIndex() { 62 return 2*((int) (Math.random()*FLAVORS.length/2)); 63 } 64 65 Drawable makeRipple() { 66 final int idx = newColorIndex(); 67 final ShapeDrawable popbg = new ShapeDrawable(new OvalShape()); 68 popbg.getPaint().setColor(FLAVORS[idx]); 69 final RippleDrawable ripple = new RippleDrawable( 70 ColorStateList.valueOf(FLAVORS[idx+1]), 71 popbg, null); 72 return ripple; 73 } 74 75 @Override 76 protected void onCreate(Bundle savedInstanceState) { 77 super.onCreate(savedInstanceState); 78 79 mLayout = new FrameLayout(this); 80 setContentView(mLayout); 81 } 82 83 @Override 84 public void onAttachedToWindow() { 85 final DisplayMetrics dm = getResources().getDisplayMetrics(); 86 final float dp = dm.density; 87 final int size = (int) 88 (Math.min(Math.min(dm.widthPixels, dm.heightPixels), 600*dp) - 100*dp); 89 90 final View stick = new View(this) { 91 Paint mPaint = new Paint(); 92 Path mShadow = new Path(); 93 94 @Override 95 public void onAttachedToWindow() { 96 super.onAttachedToWindow(); 97 setWillNotDraw(false); 98 setOutlineProvider(new ViewOutlineProvider() { 99 @Override 100 public void getOutline(View view, Outline outline) { 101 outline.setRect(0, getHeight() / 2, getWidth(), getHeight()); 102 } 103 }); 104 } 105 @Override 106 public void onDraw(Canvas c) { 107 final int w = c.getWidth(); 108 final int h = c.getHeight() / 2; 109 c.translate(0, h); 110 final GradientDrawable g = new GradientDrawable(); 111 g.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT); 112 g.setGradientCenter(w * 0.75f, 0); 113 g.setColors(new int[] { 0xFFFFFFFF, 0xFFAAAAAA }); 114 g.setBounds(0, 0, w, h); 115 g.draw(c); 116 mPaint.setColor(0xFFAAAAAA); 117 mShadow.reset(); 118 mShadow.moveTo(0,0); 119 mShadow.lineTo(w, 0); 120 mShadow.lineTo(w, size/2 + 1.5f*w); 121 mShadow.lineTo(0, size/2); 122 mShadow.close(); 123 c.drawPath(mShadow, mPaint); 124 } 125 }; 126 mLayout.addView(stick, new FrameLayout.LayoutParams((int) (32 * dp), 127 ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER_HORIZONTAL)); 128 stick.setAlpha(0f); 129 130 final ImageView im = new ImageView(this); 131 im.setTranslationZ(20); 132 im.setScaleX(0); 133 im.setScaleY(0); 134 final Drawable platlogo = getDrawable(com.android.internal.R.drawable.platlogo); 135 platlogo.setAlpha(0); 136 im.setImageDrawable(platlogo); 137 im.setBackground(makeRipple()); 138 im.setClickable(true); 139 final ShapeDrawable highlight = new ShapeDrawable(new OvalShape()); 140 highlight.getPaint().setColor(0x10FFFFFF); 141 highlight.setBounds((int)(size*.15f), (int)(size*.15f), 142 (int)(size*.6f), (int)(size*.6f)); 143 im.getOverlay().add(highlight); 144 im.setOnClickListener(new View.OnClickListener() { 145 @Override 146 public void onClick(View v) { 147 if (mTapCount == 0) { 148 im.animate() 149 .translationZ(40) 150 .scaleX(1) 151 .scaleY(1) 152 .setInterpolator(mInterpolator) 153 .setDuration(700) 154 .setStartDelay(500) 155 .start(); 156 157 final ObjectAnimator a = ObjectAnimator.ofInt(platlogo, "alpha", 0, 255); 158 a.setInterpolator(mInterpolator); 159 a.setStartDelay(1000); 160 a.start(); 161 162 stick.animate() 163 .translationZ(20) 164 .alpha(1) 165 .setInterpolator(mInterpolator) 166 .setDuration(700) 167 .setStartDelay(750) 168 .start(); 169 170 im.setOnLongClickListener(new View.OnLongClickListener() { 171 @Override 172 public boolean onLongClick(View v) { 173 if (mTapCount < 5) return false; 174 175 final ContentResolver cr = getContentResolver(); 176 if (Settings.System.getLong(cr, Settings.System.EGG_MODE, 0) 177 == 0) { 178 // For posterity: the moment this user unlocked the easter egg 179 Settings.System.putLong(cr, 180 Settings.System.EGG_MODE, 181 System.currentTimeMillis()); 182 } 183 im.post(new Runnable() { 184 @Override 185 public void run() { 186 try { 187 startActivity(new Intent(Intent.ACTION_MAIN) 188 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 189 | Intent.FLAG_ACTIVITY_CLEAR_TASK 190 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) 191 .addCategory("com.android.internal.category.PLATLOGO")); 192 } catch (ActivityNotFoundException ex) { 193 Log.e("PlatLogoActivity", "No more eggs."); 194 } 195 finish(); 196 } 197 }); 198 return true; 199 } 200 }); 201 } else { 202 im.setBackground(makeRipple()); 203 } 204 mTapCount++; 205 } 206 }); 207 208 // Enable hardware keyboard input for TV compatibility. 209 im.setFocusable(true); 210 im.requestFocus(); 211 im.setOnKeyListener(new View.OnKeyListener() { 212 @Override 213 public boolean onKey(View v, int keyCode, KeyEvent event) { 214 if (keyCode != KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { 215 ++mKeyCount; 216 if (mKeyCount > 2) { 217 if (mTapCount > 5) { 218 im.performLongClick(); 219 } else { 220 im.performClick(); 221 } 222 } 223 return true; 224 } else { 225 return false; 226 } 227 } 228 }); 229 230 mLayout.addView(im, new FrameLayout.LayoutParams(size, size, Gravity.CENTER)); 231 232 im.animate().scaleX(0.3f).scaleY(0.3f) 233 .setInterpolator(mInterpolator) 234 .setDuration(500) 235 .setStartDelay(800) 236 .start(); 237 } 238} 239