diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index ea50d890ae2e5..ddffea2446a48 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -74,6 +74,7 @@ import android.view.WindowManager; import android.view.WindowManager.KeyboardShortcutsReceiver; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityManager; +import android.app.KeyguardManager; import com.android.internal.app.AssistUtils; import com.android.internal.os.BackgroundThread; @@ -124,6 +125,7 @@ public class SystemServicesProxy { AssistUtils mAssistUtils; WindowManager mWm; IWindowManager mIwm; + KeyguardManager mKgm; UserManager mUm; Display mDisplay; String mRecentsPackage; @@ -212,6 +214,7 @@ public class SystemServicesProxy { mAssistUtils = new AssistUtils(context); mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); mIwm = WindowManagerGlobal.getWindowManagerService(); + mKgm = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); mUm = UserManager.get(context); mDisplay = mWm.getDefaultDisplay(); mRecentsPackage = context.getPackageName(); @@ -862,6 +865,16 @@ public class SystemServicesProxy { return label; } + /** + * Returns whether the provided {@param userId} is currently locked (and showing Keyguard). + */ + public boolean isDeviceLocked(int userId) { + if (mKgm == null) { + return false; + } + return mKgm.isDeviceLocked(userId); + } + /** Returns the package name of the home activity. */ public String getHomeActivityPackageName() { if (mPm == null) return null; diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index 9b48e4d02623c..587744065d77b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -28,6 +28,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.ArraySet; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.util.SparseIntArray; import com.android.systemui.Prefs; @@ -130,6 +131,7 @@ public class RecentsTaskLoadPlan { SparseArray affiliatedTasks = new SparseArray<>(); SparseIntArray affiliatedTaskCounts = new SparseIntArray(); + SparseBooleanArray lockedUsers = new SparseBooleanArray(); String dismissDescFormat = mContext.getString( R.string.accessibility_recents_item_will_be_dismissed); String appInfoDescFormat = mContext.getString( @@ -177,12 +179,17 @@ public class RecentsTaskLoadPlan { int backgroundColor = loader.getActivityBackgroundColor(t.taskDescription); boolean isSystemApp = (info != null) && ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); + if (lockedUsers.indexOfKey(t.userId) < 0) { + lockedUsers.put(t.userId, Recents.getSystemServices().isDeviceLocked(t.userId)); + } + boolean isLocked = lockedUsers.get(t.userId); // Add the task to the stack Task task = new Task(taskKey, t.affiliatedTaskId, t.affiliatedTaskColor, icon, thumbnail, title, titleDescription, dismissDescription, appInfoDescription, activityColor, backgroundColor, isLaunchTarget, isStackTask, isSystemApp, - t.isDockable, t.bounds, t.taskDescription, t.resizeMode, t.topActivity); + t.isDockable, t.bounds, t.taskDescription, t.resizeMode, t.topActivity, + isLocked); allTasks.add(task); affiliatedTaskCounts.put(taskKey.id, affiliatedTaskCounts.get(taskKey.id, 0) + 1); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java index 86a0315496a18..53f713a83cb03 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java @@ -189,6 +189,9 @@ public class Task { @ViewDebug.ExportedProperty(category="recents") public ComponentName topActivity; + @ViewDebug.ExportedProperty(category="recents") + public boolean isLocked; + private ArrayList mCallbacks = new ArrayList<>(); public Task() { @@ -200,7 +203,7 @@ public class Task { String appInfoDescription, int colorPrimary, int colorBackground, boolean isLaunchTarget, boolean isStackTask, boolean isSystemApp, boolean isDockable, Rect bounds, ActivityManager.TaskDescription taskDescription, - int resizeMode, ComponentName topActivity) { + int resizeMode, ComponentName topActivity, boolean isLocked) { boolean isInAffiliationGroup = (affiliationTaskId != key.id); boolean hasAffiliationGroupColor = isInAffiliationGroup && (affiliationColor != 0); this.key = key; @@ -224,6 +227,7 @@ public class Task { this.isDockable = isDockable; this.resizeMode = resizeMode; this.topActivity = topActivity; + this.isLocked = isLocked; } /** @@ -250,6 +254,7 @@ public class Task { this.isSystemApp = o.isSystemApp; this.isDockable = o.isDockable; this.resizeMode = o.resizeMode; + this.isLocked = o.isLocked; this.topActivity = o.topActivity; } @@ -355,6 +360,9 @@ public class Task { if (isFreeformTask()) { writer.print(" freeform=Y"); } + if (isLocked) { + writer.print(" locked=Y"); + } writer.print(" "); writer.print(title); writer.println(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java index c46adf15861fb..780cbca3c2b3c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java @@ -67,6 +67,7 @@ public class TaskViewThumbnail extends View { private float mDimAlpha; private Matrix mScaleMatrix = new Matrix(); private Paint mDrawPaint = new Paint(); + private Paint mLockedPaint = new Paint(); private Paint mBgFillPaint = new Paint(); private BitmapShader mBitmapShader; private LightingColorFilter mLightingColorFilter = new LightingColorFilter(0xffffffff, 0); @@ -102,6 +103,7 @@ public class TaskViewThumbnail extends View { mCornerRadius = getResources().getDimensionPixelSize( R.dimen.recents_task_view_rounded_corners_radius); mBgFillPaint.setColor(Color.WHITE); + mLockedPaint.setColor(Color.WHITE); mFullscreenThumbnailScale = context.getResources().getFraction( com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1); } @@ -133,7 +135,11 @@ public class TaskViewThumbnail extends View { (int) (mThumbnailRect.width() * mThumbnailScale)); int thumbnailHeight = Math.min(viewHeight, (int) (mThumbnailRect.height() * mThumbnailScale)); - if (mBitmapShader != null && thumbnailWidth > 0 && thumbnailHeight > 0) { + + if (mTask.isLocked) { + canvas.drawRoundRect(0, 0, viewWidth, viewHeight, mCornerRadius, mCornerRadius, + mLockedPaint); + } else if (mBitmapShader != null && thumbnailWidth > 0 && thumbnailHeight > 0) { int topOffset = mTaskBar != null ? mTaskBar.getHeight() - mCornerRadius : 0; @@ -200,11 +206,13 @@ public class TaskViewThumbnail extends View { ColorMatrixColorFilter filter = new ColorMatrixColorFilter(TMP_FILTER_COLOR_MATRIX); mDrawPaint.setColorFilter(filter); mBgFillPaint.setColorFilter(filter); + mLockedPaint.setColorFilter(filter); } else { mLightingColorFilter.setColorMultiply(Color.argb(255, mul, mul, mul)); mDrawPaint.setColorFilter(mLightingColorFilter); mDrawPaint.setColor(0xFFffffff); mBgFillPaint.setColorFilter(mLightingColorFilter); + mLockedPaint.setColorFilter(mLightingColorFilter); } } else { int grey = mul; @@ -299,6 +307,7 @@ public class TaskViewThumbnail extends View { if (t.colorBackground != 0) { mBgFillPaint.setColor(t.colorBackground); } + mLockedPaint.setColor(t.colorPrimary); } /**