Loading packages/SystemUI/src/com/android/systemui/recents/DozeTrigger.java +9 −2 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public class DozeTrigger { /** Starts dozing. This also resets the trigger flag. */ public void startDozing() { poke(); forcePoke(); mHasTriggered = false; } Loading @@ -59,8 +59,15 @@ public class DozeTrigger { mIsDozing = false; } /** Poke this dozer to wake it up for a little bit. */ /** Poke this dozer to wake it up for a little bit, if it is dozing. */ public void poke() { if (mIsDozing) { forcePoke(); } } /** Poke this dozer to wake it up for a little bit. */ void forcePoke() { mHandler.removeCallbacks(mDozeRunnable); mHandler.postDelayed(mDozeRunnable, mDozeDurationSeconds * 1000); mIsDozing = true; Loading packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +34 −93 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.UserHandle; import android.util.Pair; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; Loading @@ -39,6 +38,7 @@ import com.android.systemui.recents.model.SpaceNode; import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.views.FullScreenTransitionView; import com.android.systemui.recents.views.RecentsView; import com.android.systemui.recents.views.SystemBarScrimViews; import com.android.systemui.recents.views.ViewAnimation; import java.lang.reflect.InvocationTargetException; Loading @@ -50,6 +50,26 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks, FullScreenTransitionView.FullScreenTransitionViewCallbacks { FrameLayout mContainerView; RecentsView mRecentsView; SystemBarScrimViews mScrimViews; View mEmptyView; FullScreenTransitionView mFullScreenshotView; RecentsConfiguration mConfig; RecentsAppWidgetHost mAppWidgetHost; AppWidgetProviderInfo mSearchAppWidgetInfo; AppWidgetHostView mSearchAppWidgetHostView; boolean mVisible; boolean mTaskLaunched; // Runnables to finish the Recents activity FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true); FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false); FinishRecentsRunnable mFinishLaunchHomeRunnable; /** * A Runnable to finish Recents either with/without a transition, and either by calling finish() * or just launching the specified intent. Loading Loading @@ -90,40 +110,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } FrameLayout mContainerView; RecentsView mRecentsView; View mEmptyView; View mStatusBarScrimView; View mNavBarScrimView; FullScreenTransitionView mFullScreenshotView; RecentsConfiguration mConfig; RecentsAppWidgetHost mAppWidgetHost; AppWidgetProviderInfo mSearchAppWidgetInfo; AppWidgetHostView mSearchAppWidgetHostView; boolean mVisible; boolean mTaskLaunched; // Runnables to finish the Recents activity FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true); FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false); FinishRecentsRunnable mFinishLaunchHomeRunnable; private static Method sPropertyMethod; static { try { Class<?> c = Class.forName("android.view.GLES20Canvas"); sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class); if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } // Broadcast receiver to handle messages from our RecentsService BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() { @Override Loading Loading @@ -192,10 +178,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView mConfig.launchedWithNoRecentTasks = !root.hasTasks(); // Show the scrim if we animate into Recents without window transitions mNavBarScrimView.setVisibility(mConfig.hasNavBarScrim() && !mConfig.shouldAnimateNavBarScrim() ? View.VISIBLE : View.INVISIBLE); mStatusBarScrimView.setVisibility(mConfig.hasStatusBarScrim() && !mConfig.shouldAnimateStatusBarScrim() ? View.VISIBLE : View.INVISIBLE); mScrimViews.prepareEnterRecentsAnimation(); // Add the default no-recents layout if (mConfig.launchedWithNoRecentTasks) { Loading Loading @@ -348,14 +331,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Create the empty view LayoutInflater inflater = LayoutInflater.from(this); mEmptyView = inflater.inflate(R.layout.recents_empty, mContainerView, false); mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, mContainerView, false); mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP)); mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, mContainerView, false); mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM)); mScrimViews = new SystemBarScrimViews(mConfig); mScrimViews.inflate(inflater, mContainerView); if (Constants.DebugFlags.App.EnableScreenshotAppTransition) { mFullScreenshotView = new FullScreenTransitionView(this, this); mFullScreenshotView.setLayoutParams(new FrameLayout.LayoutParams( Loading @@ -364,13 +341,13 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Add the views to the layout mContainerView = new FrameLayout(this); mContainerView.addView(mStatusBarScrimView); mContainerView.addView(mScrimViews.getStatusBarScrimView()); mContainerView.addView(mRecentsView); mContainerView.addView(mEmptyView); if (Constants.DebugFlags.App.EnableScreenshotAppTransition) { mContainerView.addView(mFullScreenshotView); } mContainerView.addView(mNavBarScrimView); mContainerView.addView(mScrimViews.getNavBarScrimView()); setContentView(mContainerView); // Update the recent tasks Loading @@ -391,10 +368,10 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView onConfigurationChange(); } // XXX: Update the shadows // Private API calls to make the shadows look better try { sPropertyMethod.invoke(null, "ambientShadowStrength", String.valueOf(35f)); sPropertyMethod.invoke(null, "ambientRatio", String.valueOf(0.5f)); Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f)); Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { Loading Loading @@ -589,37 +566,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } public void onEnterAnimationTriggered() { // Fade in the scrims if (mConfig.hasStatusBarScrim() && mConfig.shouldAnimateStatusBarScrim()) { mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); mStatusBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mStatusBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) { mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); mNavBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mNavBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } // Animate the scrims in mScrimViews.startEnterRecentsAnimation(); } /**** FullScreenTransitionView.FullScreenTransitionViewCallbacks Implementation ****/ Loading @@ -642,16 +590,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView /**** RecentsView.RecentsViewCallbacks Implementation ****/ @Override public void onExitAnimationTriggered() { // Fade out the scrim if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) { mNavBarScrimView.animate() .translationY(mNavBarScrimView.getMeasuredHeight()) .setStartDelay(0) .setDuration(mConfig.taskBarExitAnimDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } public void onExitToHomeAnimationTriggered() { // Animate the scrims out mScrimViews.startExitRecentsAnimation(); } @Override Loading packages/SystemUI/src/com/android/systemui/recents/Utilities.java +24 −0 Original line number Diff line number Diff line Loading @@ -20,8 +20,26 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* Common code */ public class Utilities { // Reflection methods for altering shadows private static Method sPropertyMethod; static { try { Class<?> c = Class.forName("android.view.GLES20Canvas"); sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class); if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } /** * Calculates a consistent animation duration (ms) for all animations depending on the movement * of the object being animated. Loading Loading @@ -66,4 +84,10 @@ public class Utilities { int greyscale = colorToGreyscale(color); return (greyscale < 128) ? lightRes : darkRes; } /** Sets some private shadow properties. */ public static void setShadowProperty(String property, String value) throws IllegalAccessException, InvocationTargetException { sPropertyMethod.invoke(null, property, value); } } packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +2 −2 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV /** The RecentsView callbacks */ public interface RecentsViewCallbacks { public void onTaskLaunching(); public void onExitAnimationTriggered(); public void onExitToHomeAnimationTriggered(); } RecentsConfiguration mConfig; Loading Loading @@ -194,7 +194,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV ctx.postAnimationTrigger.decrement(); // Notify of the exit animation mCb.onExitAnimationTriggered(); mCb.onExitToHomeAnimationTriggered(); } /** Adds the search bar */ Loading packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java 0 → 100644 +132 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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.recents.views; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.R; import com.android.systemui.recents.RecentsConfiguration; /** Manages the scrims for the various system bars. */ public class SystemBarScrimViews { RecentsConfiguration mConfig; View mStatusBarScrimView; View mNavBarScrimView; boolean mHasNavBarScrim; boolean mShouldAnimateStatusBarScrim; boolean mHasStatusBarScrim; boolean mShouldAnimateNavBarScrim; public SystemBarScrimViews(RecentsConfiguration config) { mConfig = config; } /** Inflates the scrim views */ public void inflate(LayoutInflater inflater, ViewGroup parent) { mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, parent, false); mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP)); mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, parent, false); mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM)); } /** * Prepares the scrim views for animating when entering Recents. This will be called before * the first draw. */ public void prepareEnterRecentsAnimation() { mHasNavBarScrim = mConfig.hasNavBarScrim(); mShouldAnimateNavBarScrim = mConfig.shouldAnimateNavBarScrim(); mHasStatusBarScrim = mConfig.hasStatusBarScrim(); mShouldAnimateStatusBarScrim = mConfig.shouldAnimateStatusBarScrim(); mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ? View.VISIBLE : View.INVISIBLE); mStatusBarScrimView.setVisibility(mHasStatusBarScrim && !mShouldAnimateStatusBarScrim ? View.VISIBLE : View.INVISIBLE); } /** * Starts animating the scrim views when entering Recents. */ public void startEnterRecentsAnimation() { if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) { mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); mStatusBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mStatusBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); mNavBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mNavBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } } /** * Starts animating the scrim views when leaving Recents (either via launching a task, or * going home). */ public void startExitRecentsAnimation() { if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { mNavBarScrimView.animate() .translationY(mNavBarScrimView.getMeasuredHeight()) .setStartDelay(0) .setDuration(mConfig.taskBarExitAnimDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } } /** Returns the status bar scrim view. */ public View getStatusBarScrimView() { return mStatusBarScrimView; } /** Returns the nav bar scrim view. */ public View getNavBarScrimView() { return mNavBarScrimView; } } Loading
packages/SystemUI/src/com/android/systemui/recents/DozeTrigger.java +9 −2 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public class DozeTrigger { /** Starts dozing. This also resets the trigger flag. */ public void startDozing() { poke(); forcePoke(); mHasTriggered = false; } Loading @@ -59,8 +59,15 @@ public class DozeTrigger { mIsDozing = false; } /** Poke this dozer to wake it up for a little bit. */ /** Poke this dozer to wake it up for a little bit, if it is dozing. */ public void poke() { if (mIsDozing) { forcePoke(); } } /** Poke this dozer to wake it up for a little bit. */ void forcePoke() { mHandler.removeCallbacks(mDozeRunnable); mHandler.postDelayed(mDozeRunnable, mDozeDurationSeconds * 1000); mIsDozing = true; Loading
packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +34 −93 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.UserHandle; import android.util.Pair; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; Loading @@ -39,6 +38,7 @@ import com.android.systemui.recents.model.SpaceNode; import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.views.FullScreenTransitionView; import com.android.systemui.recents.views.RecentsView; import com.android.systemui.recents.views.SystemBarScrimViews; import com.android.systemui.recents.views.ViewAnimation; import java.lang.reflect.InvocationTargetException; Loading @@ -50,6 +50,26 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks, FullScreenTransitionView.FullScreenTransitionViewCallbacks { FrameLayout mContainerView; RecentsView mRecentsView; SystemBarScrimViews mScrimViews; View mEmptyView; FullScreenTransitionView mFullScreenshotView; RecentsConfiguration mConfig; RecentsAppWidgetHost mAppWidgetHost; AppWidgetProviderInfo mSearchAppWidgetInfo; AppWidgetHostView mSearchAppWidgetHostView; boolean mVisible; boolean mTaskLaunched; // Runnables to finish the Recents activity FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true); FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false); FinishRecentsRunnable mFinishLaunchHomeRunnable; /** * A Runnable to finish Recents either with/without a transition, and either by calling finish() * or just launching the specified intent. Loading Loading @@ -90,40 +110,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } FrameLayout mContainerView; RecentsView mRecentsView; View mEmptyView; View mStatusBarScrimView; View mNavBarScrimView; FullScreenTransitionView mFullScreenshotView; RecentsConfiguration mConfig; RecentsAppWidgetHost mAppWidgetHost; AppWidgetProviderInfo mSearchAppWidgetInfo; AppWidgetHostView mSearchAppWidgetHostView; boolean mVisible; boolean mTaskLaunched; // Runnables to finish the Recents activity FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true); FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false); FinishRecentsRunnable mFinishLaunchHomeRunnable; private static Method sPropertyMethod; static { try { Class<?> c = Class.forName("android.view.GLES20Canvas"); sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class); if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } // Broadcast receiver to handle messages from our RecentsService BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() { @Override Loading Loading @@ -192,10 +178,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView mConfig.launchedWithNoRecentTasks = !root.hasTasks(); // Show the scrim if we animate into Recents without window transitions mNavBarScrimView.setVisibility(mConfig.hasNavBarScrim() && !mConfig.shouldAnimateNavBarScrim() ? View.VISIBLE : View.INVISIBLE); mStatusBarScrimView.setVisibility(mConfig.hasStatusBarScrim() && !mConfig.shouldAnimateStatusBarScrim() ? View.VISIBLE : View.INVISIBLE); mScrimViews.prepareEnterRecentsAnimation(); // Add the default no-recents layout if (mConfig.launchedWithNoRecentTasks) { Loading Loading @@ -348,14 +331,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Create the empty view LayoutInflater inflater = LayoutInflater.from(this); mEmptyView = inflater.inflate(R.layout.recents_empty, mContainerView, false); mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, mContainerView, false); mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP)); mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, mContainerView, false); mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM)); mScrimViews = new SystemBarScrimViews(mConfig); mScrimViews.inflate(inflater, mContainerView); if (Constants.DebugFlags.App.EnableScreenshotAppTransition) { mFullScreenshotView = new FullScreenTransitionView(this, this); mFullScreenshotView.setLayoutParams(new FrameLayout.LayoutParams( Loading @@ -364,13 +341,13 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Add the views to the layout mContainerView = new FrameLayout(this); mContainerView.addView(mStatusBarScrimView); mContainerView.addView(mScrimViews.getStatusBarScrimView()); mContainerView.addView(mRecentsView); mContainerView.addView(mEmptyView); if (Constants.DebugFlags.App.EnableScreenshotAppTransition) { mContainerView.addView(mFullScreenshotView); } mContainerView.addView(mNavBarScrimView); mContainerView.addView(mScrimViews.getNavBarScrimView()); setContentView(mContainerView); // Update the recent tasks Loading @@ -391,10 +368,10 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView onConfigurationChange(); } // XXX: Update the shadows // Private API calls to make the shadows look better try { sPropertyMethod.invoke(null, "ambientShadowStrength", String.valueOf(35f)); sPropertyMethod.invoke(null, "ambientRatio", String.valueOf(0.5f)); Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f)); Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { Loading Loading @@ -589,37 +566,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } public void onEnterAnimationTriggered() { // Fade in the scrims if (mConfig.hasStatusBarScrim() && mConfig.shouldAnimateStatusBarScrim()) { mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); mStatusBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mStatusBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) { mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); mNavBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mNavBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } // Animate the scrims in mScrimViews.startEnterRecentsAnimation(); } /**** FullScreenTransitionView.FullScreenTransitionViewCallbacks Implementation ****/ Loading @@ -642,16 +590,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView /**** RecentsView.RecentsViewCallbacks Implementation ****/ @Override public void onExitAnimationTriggered() { // Fade out the scrim if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) { mNavBarScrimView.animate() .translationY(mNavBarScrimView.getMeasuredHeight()) .setStartDelay(0) .setDuration(mConfig.taskBarExitAnimDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } public void onExitToHomeAnimationTriggered() { // Animate the scrims out mScrimViews.startExitRecentsAnimation(); } @Override Loading
packages/SystemUI/src/com/android/systemui/recents/Utilities.java +24 −0 Original line number Diff line number Diff line Loading @@ -20,8 +20,26 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* Common code */ public class Utilities { // Reflection methods for altering shadows private static Method sPropertyMethod; static { try { Class<?> c = Class.forName("android.view.GLES20Canvas"); sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class); if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } /** * Calculates a consistent animation duration (ms) for all animations depending on the movement * of the object being animated. Loading Loading @@ -66,4 +84,10 @@ public class Utilities { int greyscale = colorToGreyscale(color); return (greyscale < 128) ? lightRes : darkRes; } /** Sets some private shadow properties. */ public static void setShadowProperty(String property, String value) throws IllegalAccessException, InvocationTargetException { sPropertyMethod.invoke(null, property, value); } }
packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +2 −2 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV /** The RecentsView callbacks */ public interface RecentsViewCallbacks { public void onTaskLaunching(); public void onExitAnimationTriggered(); public void onExitToHomeAnimationTriggered(); } RecentsConfiguration mConfig; Loading Loading @@ -194,7 +194,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV ctx.postAnimationTrigger.decrement(); // Notify of the exit animation mCb.onExitAnimationTriggered(); mCb.onExitToHomeAnimationTriggered(); } /** Adds the search bar */ Loading
packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java 0 → 100644 +132 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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.recents.views; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.R; import com.android.systemui.recents.RecentsConfiguration; /** Manages the scrims for the various system bars. */ public class SystemBarScrimViews { RecentsConfiguration mConfig; View mStatusBarScrimView; View mNavBarScrimView; boolean mHasNavBarScrim; boolean mShouldAnimateStatusBarScrim; boolean mHasStatusBarScrim; boolean mShouldAnimateNavBarScrim; public SystemBarScrimViews(RecentsConfiguration config) { mConfig = config; } /** Inflates the scrim views */ public void inflate(LayoutInflater inflater, ViewGroup parent) { mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, parent, false); mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP)); mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, parent, false); mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM)); } /** * Prepares the scrim views for animating when entering Recents. This will be called before * the first draw. */ public void prepareEnterRecentsAnimation() { mHasNavBarScrim = mConfig.hasNavBarScrim(); mShouldAnimateNavBarScrim = mConfig.shouldAnimateNavBarScrim(); mHasStatusBarScrim = mConfig.hasStatusBarScrim(); mShouldAnimateStatusBarScrim = mConfig.shouldAnimateStatusBarScrim(); mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ? View.VISIBLE : View.INVISIBLE); mStatusBarScrimView.setVisibility(mHasStatusBarScrim && !mShouldAnimateStatusBarScrim ? View.VISIBLE : View.INVISIBLE); } /** * Starts animating the scrim views when entering Recents. */ public void startEnterRecentsAnimation() { if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) { mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); mStatusBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mStatusBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); mNavBarScrimView.animate() .translationY(0) .setStartDelay(mConfig.taskBarEnterAnimDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @Override public void run() { mNavBarScrimView.setVisibility(View.VISIBLE); } }) .start(); } } /** * Starts animating the scrim views when leaving Recents (either via launching a task, or * going home). */ public void startExitRecentsAnimation() { if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { mNavBarScrimView.animate() .translationY(mNavBarScrimView.getMeasuredHeight()) .setStartDelay(0) .setDuration(mConfig.taskBarExitAnimDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } } /** Returns the status bar scrim view. */ public View getStatusBarScrimView() { return mStatusBarScrimView; } /** Returns the nav bar scrim view. */ public View getNavBarScrimView() { return mNavBarScrimView; } }