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