Loading packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +17 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Runnables to finish the Recents activity FinishRecentsRunnable mFinishLaunchHomeRunnable; // Runnable to be executed after we paused ourselves Runnable mAfterPauseRunnable; /** * A common Runnable to finish Recents either by calling finish() (with a custom animation) or * launching Home with some ActivityOptions. Generally we always launch home when we exit Loading Loading @@ -447,6 +450,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } @Override protected void onPause() { super.onPause(); if (mAfterPauseRunnable != null) { mRecentsView.post(mAfterPauseRunnable); mAfterPauseRunnable = null; } } @Override protected void onStop() { super.onStop(); Loading Loading @@ -628,6 +640,11 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView Recents.startScreenPinning(this, ssp); } @Override public void runAfterPause(Runnable r) { mAfterPauseRunnable = r; } /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/ @Override Loading packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +70 −28 Original line number Diff line number Diff line Loading @@ -24,12 +24,17 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.os.IRemoteCallback; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.WindowInsets; import android.view.WindowManagerGlobal; import android.widget.FrameLayout; import com.android.systemui.R; Loading @@ -52,6 +57,8 @@ import java.util.List; public class RecentsView extends FrameLayout implements TaskStackView.TaskStackViewCallbacks, RecentsPackageMonitor.PackageCallbacks { private static final String TAG = "RecentsView"; /** The RecentsView callbacks */ public interface RecentsViewCallbacks { public void onTaskViewClicked(); Loading @@ -59,8 +66,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV public void onAllTaskViewsDismissed(); public void onExitToHomeAnimationTriggered(); public void onScreenPinningRequest(); public void onTaskResize(Task t); public void runAfterPause(Runnable r); } RecentsConfiguration mConfig; Loading Loading @@ -438,6 +445,62 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } } private void postDrawHeaderThumbnailTransitionRunnable(final TaskView tv, final int offsetX, final int offsetY, final TaskViewTransform transform, final ActivityOptions.OnAnimationStartedListener animStartedListener) { Runnable r = new Runnable() { @Override public void run() { // Disable any focused state before we draw the header if (tv.isFocusedTask()) { tv.unsetFocusedTask(); } float scale = tv.getScaleX(); int fromHeaderWidth = (int) (tv.mHeaderView.getMeasuredWidth() * scale); int fromHeaderHeight = (int) (tv.mHeaderView.getMeasuredHeight() * scale); Bitmap b = Bitmap.createBitmap(fromHeaderWidth, fromHeaderHeight, Bitmap.Config.ARGB_8888); if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) { b.eraseColor(0xFFff0000); } else { Canvas c = new Canvas(b); c.scale(tv.getScaleX(), tv.getScaleY()); tv.mHeaderView.draw(c); c.setBitmap(null); } b = b.createAshmemBitmap(); int[] pts = new int[2]; tv.getLocationOnScreen(pts); try { WindowManagerGlobal.getWindowManagerService() .overridePendingAppTransitionAspectScaledThumb(b, pts[0] + offsetX, pts[1] + offsetY, transform.rect.width(), transform.rect.height(), new IRemoteCallback.Stub() { @Override public void sendResult(Bundle data) throws RemoteException { post(new Runnable() { @Override public void run() { if (animStartedListener != null) { animStartedListener.onAnimationStarted(); } } }); } }, true); } catch (RemoteException e) { Log.w(TAG, "Error overriding app transition", e); } } }; mCb.runAfterPause(r); } /**** TaskStackView.TaskStackCallbacks Implementation ****/ @Override Loading Loading @@ -474,32 +537,6 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV ActivityOptions opts = null; if (task.thumbnail != null && task.thumbnail.getWidth() > 0 && task.thumbnail.getHeight() > 0) { Bitmap b; if (tv != null) { // Disable any focused state before we draw the header if (tv.isFocusedTask()) { tv.unsetFocusedTask(); } float scale = tv.getScaleX(); int fromHeaderWidth = (int) (tv.mHeaderView.getMeasuredWidth() * scale); int fromHeaderHeight = (int) (tv.mHeaderView.getMeasuredHeight() * scale); b = Bitmap.createBitmap(fromHeaderWidth, fromHeaderHeight, Bitmap.Config.ARGB_8888); if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) { b.eraseColor(0xFFff0000); } else { Canvas c = new Canvas(b); c.scale(tv.getScaleX(), tv.getScaleY()); tv.mHeaderView.draw(c); c.setBitmap(null); } } else { // Notify the system to skip the thumbnail layer by using an ALPHA_8 bitmap b = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); } Bitmap bImmut = b.createAshmemBitmap(); ActivityOptions.OnAnimationStartedListener animStartedListener = null; if (lockToTask) { animStartedListener = new ActivityOptions.OnAnimationStartedListener() { Loading @@ -518,6 +555,10 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } }; } if (tv != null) { postDrawHeaderThumbnailTransitionRunnable(tv, offsetX, offsetY, transform, animStartedListener); } if (mConfig.multiStackEnabled) { opts = ActivityOptions.makeCustomAnimation(sourceView.getContext(), R.anim.recents_from_unknown_enter, Loading @@ -525,7 +566,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV sourceView.getHandler(), animStartedListener); } else { opts = ActivityOptions.makeThumbnailAspectScaleUpAnimation(sourceView, bImmut, offsetX, offsetY, transform.rect.width(), transform.rect.height(), Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8).createAshmemBitmap(), offsetX, offsetY, transform.rect.width(), transform.rect.height(), sourceView.getHandler(), animStartedListener); } } Loading Loading
packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +17 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Runnables to finish the Recents activity FinishRecentsRunnable mFinishLaunchHomeRunnable; // Runnable to be executed after we paused ourselves Runnable mAfterPauseRunnable; /** * A common Runnable to finish Recents either by calling finish() (with a custom animation) or * launching Home with some ActivityOptions. Generally we always launch home when we exit Loading Loading @@ -447,6 +450,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } @Override protected void onPause() { super.onPause(); if (mAfterPauseRunnable != null) { mRecentsView.post(mAfterPauseRunnable); mAfterPauseRunnable = null; } } @Override protected void onStop() { super.onStop(); Loading Loading @@ -628,6 +640,11 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView Recents.startScreenPinning(this, ssp); } @Override public void runAfterPause(Runnable r) { mAfterPauseRunnable = r; } /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/ @Override Loading
packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +70 −28 Original line number Diff line number Diff line Loading @@ -24,12 +24,17 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.os.IRemoteCallback; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.WindowInsets; import android.view.WindowManagerGlobal; import android.widget.FrameLayout; import com.android.systemui.R; Loading @@ -52,6 +57,8 @@ import java.util.List; public class RecentsView extends FrameLayout implements TaskStackView.TaskStackViewCallbacks, RecentsPackageMonitor.PackageCallbacks { private static final String TAG = "RecentsView"; /** The RecentsView callbacks */ public interface RecentsViewCallbacks { public void onTaskViewClicked(); Loading @@ -59,8 +66,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV public void onAllTaskViewsDismissed(); public void onExitToHomeAnimationTriggered(); public void onScreenPinningRequest(); public void onTaskResize(Task t); public void runAfterPause(Runnable r); } RecentsConfiguration mConfig; Loading Loading @@ -438,6 +445,62 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } } private void postDrawHeaderThumbnailTransitionRunnable(final TaskView tv, final int offsetX, final int offsetY, final TaskViewTransform transform, final ActivityOptions.OnAnimationStartedListener animStartedListener) { Runnable r = new Runnable() { @Override public void run() { // Disable any focused state before we draw the header if (tv.isFocusedTask()) { tv.unsetFocusedTask(); } float scale = tv.getScaleX(); int fromHeaderWidth = (int) (tv.mHeaderView.getMeasuredWidth() * scale); int fromHeaderHeight = (int) (tv.mHeaderView.getMeasuredHeight() * scale); Bitmap b = Bitmap.createBitmap(fromHeaderWidth, fromHeaderHeight, Bitmap.Config.ARGB_8888); if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) { b.eraseColor(0xFFff0000); } else { Canvas c = new Canvas(b); c.scale(tv.getScaleX(), tv.getScaleY()); tv.mHeaderView.draw(c); c.setBitmap(null); } b = b.createAshmemBitmap(); int[] pts = new int[2]; tv.getLocationOnScreen(pts); try { WindowManagerGlobal.getWindowManagerService() .overridePendingAppTransitionAspectScaledThumb(b, pts[0] + offsetX, pts[1] + offsetY, transform.rect.width(), transform.rect.height(), new IRemoteCallback.Stub() { @Override public void sendResult(Bundle data) throws RemoteException { post(new Runnable() { @Override public void run() { if (animStartedListener != null) { animStartedListener.onAnimationStarted(); } } }); } }, true); } catch (RemoteException e) { Log.w(TAG, "Error overriding app transition", e); } } }; mCb.runAfterPause(r); } /**** TaskStackView.TaskStackCallbacks Implementation ****/ @Override Loading Loading @@ -474,32 +537,6 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV ActivityOptions opts = null; if (task.thumbnail != null && task.thumbnail.getWidth() > 0 && task.thumbnail.getHeight() > 0) { Bitmap b; if (tv != null) { // Disable any focused state before we draw the header if (tv.isFocusedTask()) { tv.unsetFocusedTask(); } float scale = tv.getScaleX(); int fromHeaderWidth = (int) (tv.mHeaderView.getMeasuredWidth() * scale); int fromHeaderHeight = (int) (tv.mHeaderView.getMeasuredHeight() * scale); b = Bitmap.createBitmap(fromHeaderWidth, fromHeaderHeight, Bitmap.Config.ARGB_8888); if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) { b.eraseColor(0xFFff0000); } else { Canvas c = new Canvas(b); c.scale(tv.getScaleX(), tv.getScaleY()); tv.mHeaderView.draw(c); c.setBitmap(null); } } else { // Notify the system to skip the thumbnail layer by using an ALPHA_8 bitmap b = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); } Bitmap bImmut = b.createAshmemBitmap(); ActivityOptions.OnAnimationStartedListener animStartedListener = null; if (lockToTask) { animStartedListener = new ActivityOptions.OnAnimationStartedListener() { Loading @@ -518,6 +555,10 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } }; } if (tv != null) { postDrawHeaderThumbnailTransitionRunnable(tv, offsetX, offsetY, transform, animStartedListener); } if (mConfig.multiStackEnabled) { opts = ActivityOptions.makeCustomAnimation(sourceView.getContext(), R.anim.recents_from_unknown_enter, Loading @@ -525,7 +566,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV sourceView.getHandler(), animStartedListener); } else { opts = ActivityOptions.makeThumbnailAspectScaleUpAnimation(sourceView, bImmut, offsetX, offsetY, transform.rect.width(), transform.rect.height(), Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8).createAshmemBitmap(), offsetX, offsetY, transform.rect.width(), transform.rect.height(), sourceView.getHandler(), animStartedListener); } } Loading