diff options
24 files changed, 387 insertions, 13 deletions
diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java index 9fbbb3d..a0e125a 100644 --- a/core/java/com/android/internal/app/PlatLogoActivity.java +++ b/core/java/com/android/internal/app/PlatLogoActivity.java @@ -17,32 +17,79 @@ package com.android.internal.app; import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Vibrator; import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; import android.widget.ImageView; import android.widget.Toast; public class PlatLogoActivity extends Activity { Toast mToast; + ImageView mContent; + Vibrator mZzz = new Vibrator(); + int mCount; + final Handler mHandler = new Handler(); + + Runnable mSuperLongPress = new Runnable() { + public void run() { + mCount++; + mZzz.vibrate(50 * mCount); + final float scale = 1f + 0.25f * mCount * mCount; + mContent.setScaleX(scale); + mContent.setScaleY(scale); + + if (mCount <= 3) { + mHandler.postDelayed(mSuperLongPress, ViewConfiguration.getLongPressTimeout()); + } else { + try { + startActivity(new Intent(Intent.ACTION_MAIN) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .setClassName("com.android.systemui","com.android.systemui.Nyandroid")); + } catch (ActivityNotFoundException ex) { + android.util.Log.e("PlatLogoActivity", "Couldn't find platlogo screensaver."); + } + finish(); + } + } + }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mToast = Toast.makeText(this, "REZZZZZZZ...", Toast.LENGTH_SHORT); + mToast = Toast.makeText(this, "Android 4.0: Ice Cream Sandwich", Toast.LENGTH_SHORT); - ImageView content = new ImageView(this); - content.setImageResource(com.android.internal.R.drawable.platlogo); - content.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - - setContentView(content); - } + mContent = new ImageView(this); + mContent.setImageResource(com.android.internal.R.drawable.platlogo); + mContent.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_UP) { - mToast.show(); - } - return super.dispatchTouchEvent(ev); + mContent.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + final int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + mContent.setPressed(true); + mHandler.removeCallbacks(mSuperLongPress); + mCount = 0; + mHandler.postDelayed(mSuperLongPress, 2*ViewConfiguration.getLongPressTimeout()); + } else if (action == MotionEvent.ACTION_UP) { + if (mContent.isPressed()) { + mContent.setPressed(false); + mHandler.removeCallbacks(mSuperLongPress); + mToast.show(); + } + } + return true; + } + }); + + setContentView(mContent); } } diff --git a/core/res/res/drawable-nodpi/platlogo.png b/core/res/res/drawable-nodpi/platlogo.png Binary files differindex e619ed5..8aa3b9e 100644 --- a/core/res/res/drawable-nodpi/platlogo.png +++ b/core/res/res/drawable-nodpi/platlogo.png diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index a2452c4..64c54d9 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -101,5 +101,21 @@ android:taskAffinity="com.android.systemui.net" android:excludeFromRecents="true" /> + <!-- started from ... somewhere --> + <activity + android:name=".Nyandroid" + android:exported="true" + android:label="Nyandroid" + android:icon="@drawable/nyandroid04" + android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" + android:hardwareAccelerated="true" + android:launchMode="singleInstance" + android:excludeFromRecents="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.DREAM" /> + </intent-filter> + </activity> </application> </manifest> diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid00.png b/packages/SystemUI/res/drawable-nodpi/nyandroid00.png Binary files differnew file mode 100644 index 0000000..6cea873 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid00.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid01.png b/packages/SystemUI/res/drawable-nodpi/nyandroid01.png Binary files differnew file mode 100644 index 0000000..82b8a21 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid01.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid02.png b/packages/SystemUI/res/drawable-nodpi/nyandroid02.png Binary files differnew file mode 100644 index 0000000..fde0033 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid02.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid03.png b/packages/SystemUI/res/drawable-nodpi/nyandroid03.png Binary files differnew file mode 100644 index 0000000..54c5f46 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid03.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid04.png b/packages/SystemUI/res/drawable-nodpi/nyandroid04.png Binary files differnew file mode 100644 index 0000000..35e5ab5 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid04.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid05.png b/packages/SystemUI/res/drawable-nodpi/nyandroid05.png Binary files differnew file mode 100644 index 0000000..d3eaace --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid05.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid06.png b/packages/SystemUI/res/drawable-nodpi/nyandroid06.png Binary files differnew file mode 100644 index 0000000..0e0d3b1 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid06.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid07.png b/packages/SystemUI/res/drawable-nodpi/nyandroid07.png Binary files differnew file mode 100644 index 0000000..edb0b17 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid07.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid08.png b/packages/SystemUI/res/drawable-nodpi/nyandroid08.png Binary files differnew file mode 100644 index 0000000..10fc4f6 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid08.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid09.png b/packages/SystemUI/res/drawable-nodpi/nyandroid09.png Binary files differnew file mode 100644 index 0000000..57ade54 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid09.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid10.png b/packages/SystemUI/res/drawable-nodpi/nyandroid10.png Binary files differnew file mode 100644 index 0000000..36feb2f --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid10.png diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid11.png b/packages/SystemUI/res/drawable-nodpi/nyandroid11.png Binary files differnew file mode 100644 index 0000000..125935b --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/nyandroid11.png diff --git a/packages/SystemUI/res/drawable-nodpi/star0.png b/packages/SystemUI/res/drawable-nodpi/star0.png Binary files differnew file mode 100644 index 0000000..f2ca960 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star0.png diff --git a/packages/SystemUI/res/drawable-nodpi/star1.png b/packages/SystemUI/res/drawable-nodpi/star1.png Binary files differnew file mode 100644 index 0000000..69ef4da --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star1.png diff --git a/packages/SystemUI/res/drawable-nodpi/star2.png b/packages/SystemUI/res/drawable-nodpi/star2.png Binary files differnew file mode 100644 index 0000000..b95968a --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star2.png diff --git a/packages/SystemUI/res/drawable-nodpi/star3.png b/packages/SystemUI/res/drawable-nodpi/star3.png Binary files differnew file mode 100644 index 0000000..ad0f589 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star3.png diff --git a/packages/SystemUI/res/drawable-nodpi/star4.png b/packages/SystemUI/res/drawable-nodpi/star4.png Binary files differnew file mode 100644 index 0000000..934c45b --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star4.png diff --git a/packages/SystemUI/res/drawable-nodpi/star5.png b/packages/SystemUI/res/drawable-nodpi/star5.png Binary files differnew file mode 100644 index 0000000..46a4435 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/star5.png diff --git a/packages/SystemUI/res/drawable/nyandroid_anim.xml b/packages/SystemUI/res/drawable/nyandroid_anim.xml new file mode 100644 index 0000000..855a0c2 --- /dev/null +++ b/packages/SystemUI/res/drawable/nyandroid_anim.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animation-list + xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + <item android:drawable="@drawable/nyandroid00" android:duration="80" /> + <item android:drawable="@drawable/nyandroid01" android:duration="80" /> + <item android:drawable="@drawable/nyandroid02" android:duration="80" /> + <item android:drawable="@drawable/nyandroid03" android:duration="80" /> + <item android:drawable="@drawable/nyandroid04" android:duration="80" /> + <item android:drawable="@drawable/nyandroid05" android:duration="80" /> + <item android:drawable="@drawable/nyandroid06" android:duration="80" /> + <item android:drawable="@drawable/nyandroid07" android:duration="80" /> + <item android:drawable="@drawable/nyandroid08" android:duration="80" /> + <item android:drawable="@drawable/nyandroid09" android:duration="80" /> + <item android:drawable="@drawable/nyandroid10" android:duration="80" /> + <item android:drawable="@drawable/nyandroid11" android:duration="80" /> +</animation-list> + diff --git a/packages/SystemUI/res/drawable/star_anim.xml b/packages/SystemUI/res/drawable/star_anim.xml new file mode 100644 index 0000000..d7f2d8f --- /dev/null +++ b/packages/SystemUI/res/drawable/star_anim.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animation-list + xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + <item android:drawable="@drawable/star0" android:duration="200" /> + <item android:drawable="@drawable/star1" android:duration="200" /> + <item android:drawable="@drawable/star2" android:duration="200" /> + <item android:drawable="@drawable/star3" android:duration="200" /> + <item android:drawable="@drawable/star4" android:duration="200" /> + <item android:drawable="@drawable/star5" android:duration="200" /> +</animation-list> + diff --git a/packages/SystemUI/src/com/android/systemui/Nyandroid.java b/packages/SystemUI/src/com/android/systemui/Nyandroid.java new file mode 100644 index 0000000..6f168ba --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/Nyandroid.java @@ -0,0 +1,253 @@ +/*); + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import android.animation.AnimatorSet; +import android.animation.PropertyValuesHolder; +import android.animation.ObjectAnimator; +import android.animation.TimeAnimator; +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.Handler; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Pair; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.ImageView; +import java.util.HashMap; +import java.util.Random; + +public class Nyandroid extends Activity { + final static boolean DEBUG = false; + + public static class Board extends FrameLayout + { + public static final boolean FIXED_STARS = true; + public static final int NUM_CATS = 20; + + static Random sRNG = new Random(); + + static float lerp(float a, float b, float f) { + return (b-a)*f + a; + } + + static float randfrange(float a, float b) { + return lerp(a, b, sRNG.nextFloat()); + } + + static int randsign() { + return sRNG.nextBoolean() ? 1 : -1; + } + + static <E> E pick(E[] array) { + if (array.length == 0) return null; + return array[sRNG.nextInt(array.length)]; + } + + public class FlyingCat extends ImageView { + public static final float VMAX = 1000.0f; + public static final float VMIN = 100.0f; + + public float v, vr; + + public float dist; + public float z; + + public ComponentName component; + + public FlyingCat(Context context, AttributeSet as) { + super(context, as); + setImageResource(R.drawable.nyandroid_anim); // @@@ + + if (DEBUG) setBackgroundColor(0x80FF0000); + } + + public String toString() { + return String.format("<cat (%.1f, %.1f) (%d x %d)>", + getX(), getY(), getWidth(), getHeight()); + } + + public void reset() { + final float scale = lerp(0.1f,2f,z); + setScaleX(scale); setScaleY(scale); + + setX(-scale*getWidth()+1); + setY(randfrange(0, Board.this.getHeight()-scale*getHeight())); + v = lerp(VMIN, VMAX, z); + + dist = 0; + +// android.util.Log.d("Nyandroid", "reset cat: " + this); + } + + public void update(float dt) { + dist += v * dt; + setX(getX() + v * dt); + } + } + + TimeAnimator mAnim; + + public Board(Context context, AttributeSet as) { + super(context, as); + + setLayerType(View.LAYER_TYPE_HARDWARE, null); + setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); + setBackgroundColor(0xFF003366); + } + + private void reset() { +// android.util.Log.d("Nyandroid", "board reset"); + removeAllViews(); + + final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + + if (FIXED_STARS) { + for(int i=0; i<20; i++) { + ImageView fixedStar = new ImageView(getContext(), null); + if (DEBUG) fixedStar.setBackgroundColor(0x8000FF80); + fixedStar.setImageResource(R.drawable.star_anim); // @@@ + addView(fixedStar, wrap); + final float scale = randfrange(0.1f, 1f); + fixedStar.setScaleX(scale); fixedStar.setScaleY(scale); + fixedStar.setX(randfrange(0, getWidth())); + fixedStar.setY(randfrange(0, getHeight())); + final AnimationDrawable anim = (AnimationDrawable) fixedStar.getDrawable(); + postDelayed(new Runnable() { + public void run() { + anim.start(); + }}, (int) randfrange(0, 1000)); + } + } + + for(int i=0; i<NUM_CATS; i++) { + FlyingCat nv = new FlyingCat(getContext(), null); + addView(nv, wrap); + nv.z = ((float)i/NUM_CATS); + nv.z *= nv.z; + nv.reset(); + nv.setX(randfrange(0,Board.this.getWidth())); + final AnimationDrawable anim = (AnimationDrawable) nv.getDrawable(); + postDelayed(new Runnable() { + public void run() { + anim.start(); + }}, (int) randfrange(0, 1000)); + } + + if (mAnim != null) { + mAnim.cancel(); + } + mAnim = new TimeAnimator(); + mAnim.setTimeListener(new TimeAnimator.TimeListener() { + public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { + // setRotation(totalTime * 0.01f); // not as cool as you would think +// android.util.Log.d("Nyandroid", "t=" + totalTime); + + for (int i=0; i<getChildCount(); i++) { + View v = getChildAt(i); + if (!(v instanceof FlyingCat)) continue; + FlyingCat nv = (FlyingCat) v; + nv.update(deltaTime / 1000f); + final float catWidth = nv.getWidth() * nv.getScaleX(); + final float catHeight = nv.getHeight() * nv.getScaleY(); + if ( nv.getX() + catWidth < -2 + || nv.getX() > getWidth() + 2 + || nv.getY() + catHeight < -2 + || nv.getY() > getHeight() + 2) + { + nv.reset(); + } + } + } + }); + } + + @Override + protected void onSizeChanged (int w, int h, int oldw, int oldh) { + super.onSizeChanged(w,h,oldw,oldh); +// android.util.Log.d("Nyandroid", "resized: " + w + "x" + h); + post(new Runnable() { public void run() { + reset(); + mAnim.start(); + } }); + } + + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mAnim.cancel(); + } + + @Override + public boolean isOpaque() { + return true; + } + } + + private Board mBoard; + + @Override + public void onStart() { + super.onStart(); + + getWindow().addFlags( + WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + ); + } + + @Override + public void onResume() { + super.onResume(); + mBoard = new Board(this, null); + setContentView(mBoard); + + mBoard.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { + @Override + public void onSystemUiVisibilityChange(int vis) { + if (0 == (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) { + Nyandroid.this.finish(); + } + } + }); + } + + @Override + public void onUserInteraction() { +// android.util.Log.d("Nyandroid", "finishing on user interaction"); + finish(); + } +} |