108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn/* 208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * you may not use this file except in compliance with the License. 608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * You may obtain a copy of the License at 708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 1008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * See the License for the specific language governing permissions and 1408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * limitations under the License. 1508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn */ 1608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 1708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornpackage com.android.internal.app; 1808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 1908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornimport android.app.Activity; 205f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandlerimport android.content.ActivityNotFoundException; 2106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandlerimport android.content.Context; 225f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandlerimport android.content.Intent; 23f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.graphics.Typeface; 242fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandlerimport android.provider.Settings; 25f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.os.Build; 2608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornimport android.os.Bundle; 275f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandlerimport android.os.Handler; 2806c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandlerimport android.text.method.AllCapsTransformationMethod; 2906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandlerimport android.text.method.TransformationMethod; 30f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.util.DisplayMetrics; 31f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.view.Gravity; 325f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandlerimport android.view.View; 33f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.view.ViewGroup; 3480c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandlerimport android.view.animation.AccelerateInterpolator; 3580c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandlerimport android.view.animation.AnticipateOvershootInterpolator; 3606c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandlerimport android.view.animation.DecelerateInterpolator; 3706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandlerimport android.widget.FrameLayout; 3808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornimport android.widget.ImageView; 39f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.widget.LinearLayout; 40f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandlerimport android.widget.TextView; 411ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.widget.Toast; 4208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 4308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornpublic class PlatLogoActivity extends Activity { 4406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler FrameLayout mContent; 455f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler int mCount; 465f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler final Handler mHandler = new Handler(); 4780c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler static final int BGCOLOR = 0xffed1d24; 485f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler 4906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler @Override 5006c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler protected void onCreate(Bundle savedInstanceState) { 5106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler super.onCreate(savedInstanceState); 5206c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 53f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler DisplayMetrics metrics = new DisplayMetrics(); 54f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler getWindowManager().getDefaultDisplay().getMetrics(metrics); 55f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler 5606c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler Typeface bold = Typeface.create("sans-serif", Typeface.BOLD); 57f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler Typeface light = Typeface.create("sans-serif-light", Typeface.NORMAL); 58f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler 5906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler mContent = new FrameLayout(this); 6080c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler mContent.setBackgroundColor(0xC0000000); 6106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 6206c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( 6306c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler FrameLayout.LayoutParams.WRAP_CONTENT, 6406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler FrameLayout.LayoutParams.WRAP_CONTENT); 6506c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler lp.gravity = Gravity.CENTER; 66f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler 6706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final ImageView logo = new ImageView(this); 6806c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler logo.setImageResource(com.android.internal.R.drawable.platlogo); 6906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler logo.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 7006c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler logo.setVisibility(View.INVISIBLE); 7106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 7280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler final View bg = new View(this); 7380c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler bg.setBackgroundColor(BGCOLOR); 7480c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler bg.setAlpha(0f); 7580c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler 7606c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final TextView letter = new TextView(this); 7706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 7806c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler letter.setTypeface(bold); 7906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler letter.setTextSize(300); 8006c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler letter.setTextColor(0xFFFFFFFF); 8106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler letter.setGravity(Gravity.CENTER); 8270966ec922256001053eb7cae957c28e4d6cb791Daniel Sandler letter.setText(String.valueOf(Build.ID).substring(0, 1)); 8306c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 8406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final int p = (int)(4 * metrics.density); 8506c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler 8606c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final TextView tv = new TextView(this); 87f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler if (light != null) tv.setTypeface(light); 8806c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setTextSize(30); 8906c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setPadding(p, p, p, p); 90f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler tv.setTextColor(0xFFFFFFFF); 9106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setGravity(Gravity.CENTER); 9206c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setTransformationMethod(new AllCapsTransformationMethod(this)); 93f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler tv.setText("Android " + Build.VERSION.RELEASE); 9406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setVisibility(View.INVISIBLE); 95f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler 9680c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler mContent.addView(bg); 9706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler mContent.addView(letter, lp); 9806c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler mContent.addView(logo, lp); 99c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 10006c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler final FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(lp); 10106c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler lp2.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; 10206c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler lp2.bottomMargin = 10*p; 103f89d5079e4e483baab1ce0bfc25e487cd920f58fDaniel Sandler 10406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler mContent.addView(tv, lp2); 1051ebccf531d1049853b3b0630035434619682c016Dianne Hackborn 1061a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler mContent.setOnClickListener(new View.OnClickListener() { 10780c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler int clicks; 1085f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler @Override 1091a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler public void onClick(View v) { 11080c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler clicks++; 11180c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler if (clicks >= 6) { 11280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler mContent.performLongClick(); 11380c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler return; 11480c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler } 11580c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler letter.animate().cancel(); 11680c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler final float offset = (int)letter.getRotation() % 360; 11780c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler letter.animate() 11880c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .rotationBy((Math.random() > 0.5f ? 360 : -360) - offset) 11980c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setInterpolator(new DecelerateInterpolator()) 12080c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setDuration(700).start(); 12180c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler } 12280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler }); 12380c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler 12480c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler mContent.setOnLongClickListener(new View.OnLongClickListener() { 12580c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler @Override 12680c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler public boolean onLongClick(View v) { 12706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler if (logo.getVisibility() != View.VISIBLE) { 12880c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler bg.setScaleX(0.01f); 12980c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler bg.animate().alpha(1f).scaleX(1f).setStartDelay(500).start(); 13080c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler letter.animate().alpha(0f).scaleY(0.5f).scaleX(0.5f) 13180c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .rotationBy(360) 13280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setInterpolator(new AccelerateInterpolator()) 13380c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setDuration(1000) 13406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler .start(); 13506c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler logo.setAlpha(0f); 13606c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler logo.setVisibility(View.VISIBLE); 13780c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler logo.setScaleX(0.5f); 13880c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler logo.setScaleY(0.5f); 13980c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler logo.animate().alpha(1f).scaleX(1f).scaleY(1f) 14080c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setDuration(1000).setStartDelay(500) 14180c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .setInterpolator(new AnticipateOvershootInterpolator()) 14280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler .start(); 14306c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setAlpha(0f); 14406c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.setVisibility(View.VISIBLE); 14506c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler tv.animate().alpha(1f).setDuration(1000).setStartDelay(1000).start(); 14680c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler return true; 14706c0e408c4f06fdb9a5785baebeb293391711e65Daniel Sandler } 14880c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler return false; 1491a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler } 1501a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler }); 1511a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler 15280c3c4e96039fe4e620d3fedc1e3fb2d01134b61Daniel Sandler logo.setOnLongClickListener(new View.OnLongClickListener() { 1531a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler @Override 1541a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler public boolean onLongClick(View v) { 1552fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler if (Settings.System.getLong(getContentResolver(), Settings.System.EGG_MODE, 0) 1562fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler == 0) { 1572fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler // For posterity: the moment this user unlocked the easter egg 1582fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler Settings.System.putLong(getContentResolver(), 1592fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler Settings.System.EGG_MODE, 1602fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler System.currentTimeMillis()); 1612fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler } 1621a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler try { 1631a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler startActivity(new Intent(Intent.ACTION_MAIN) 1641a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 1651a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler | Intent.FLAG_ACTIVITY_CLEAR_TASK 1661a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) 1671a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler .addCategory("com.android.internal.category.PLATLOGO")); 1681a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler } catch (ActivityNotFoundException ex) { 1692fdb68b3c2ac5e72fdaa590eb70fca0c6a9f5ef0Daniel Sandler android.util.Log.e("PlatLogoActivity", "Couldn't catch a break."); 1705f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler } 1711a0c9145dc32095acc250bdabc4a9b8f82d6bd3eDaniel Sandler finish(); 1725f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler return true; 1735f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler } 1745f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler }); 1755f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler 1765f839f8ee426cc42af3ee0eaf5236f2f6930dd15Daniel Sandler setContentView(mContent); 1771ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 17808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 179