diff options
3 files changed, 53 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java index 4f3c61e1119d..5b4a3f0039c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -28,10 +28,13 @@ import android.os.Handler; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.Log; import libcore.io.IoUtils; +import java.util.Objects; + /** * Manages the lockscreen wallpaper. */ @@ -42,11 +45,15 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen private final Context mContext; private final PhoneStatusBar mBar; private final IWallpaperManager mService; + private final WallpaperManager mWallpaperManager; private final Handler mH; private boolean mCached; private Bitmap mCache; - private int mUserId; + private int mCurrentUserId; + // The user selected in the UI, or null if no user is selected or UI doesn't support selecting + // users. + private UserHandle mSelectedUser; public LockscreenWallpaper(Context ctx, PhoneStatusBar bar, Handler h) { mContext = ctx; @@ -54,7 +61,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen mH = h; mService = IWallpaperManager.Stub.asInterface( ServiceManager.getService(Context.WALLPAPER_SERVICE)); - mUserId = ActivityManager.getCurrentUser(); + mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE); + mCurrentUserId = ActivityManager.getCurrentUser(); try { mService.setLockWallpaperCallback(this); @@ -73,8 +81,12 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen mCache = null; return null; } + // Prefer the selected user (when specified) over the current user for the FLAG_SET_LOCK + // wallpaper. + final int lockWallpaperUserId = + mSelectedUser != null ? mSelectedUser.getIdentifier() : mCurrentUserId; ParcelFileDescriptor fd = mService.getWallpaper(null, WallpaperManager.FLAG_SET_LOCK, - new Bundle(), mUserId); + new Bundle(), lockWallpaperUserId); if (fd != null) { try { BitmapFactory.Options options = new BitmapFactory.Options(); @@ -90,8 +102,17 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } } else { mCached = true; - mCache = null; - return null; + if (mSelectedUser != null && mSelectedUser.getIdentifier() != mCurrentUserId) { + // When selected user is different from the current user, show the selected + // user's static wallpaper. + mWallpaperManager.forgetLoadedWallpaper(); + mCache = mWallpaperManager.getBitmapAsUser(mSelectedUser.getIdentifier()); + } else { + // When there is no selected user, or it's same as the current user, show the + // system (possibly dynamic) wallpaper for the selected user. + mCache = null; + } + return mCache; } } catch (RemoteException e) { Log.e(TAG, "System dead?" + e); @@ -99,13 +120,23 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } } - public void setUser(int user) { - if (user != mUserId) { + public void setCurrentUser(int user) { + if (user != mCurrentUserId) { mCached = false; - mUserId = user; + mCurrentUserId = user; } } + public void setSelectedUser(UserHandle selectedUser) { + if (Objects.equals(selectedUser, mSelectedUser)) { + return; + } + mSelectedUser = selectedUser; + + mH.removeCallbacks(this); + mH.post(this); + } + @Override public void onWallpaperChanged() { // Called on Binder thread. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index e344df2bc2f2..d25e99baf0c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -27,7 +27,6 @@ import android.app.IWallpaperManagerCallback; import android.app.Notification; import android.app.PendingIntent; import android.app.StatusBarManager; -import android.app.WallpaperManager; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; import android.content.ComponentName; @@ -69,7 +68,6 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; @@ -296,7 +294,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, AccessibilityController mAccessibilityController; FingerprintUnlockController mFingerprintUnlockController; LightStatusBarController mLightStatusBarController; - private LockscreenWallpaper mLockscreenWallpaper; + protected LockscreenWallpaper mLockscreenWallpaper; int mNaturalBarHeight = -1; @@ -3171,7 +3169,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, resetUserSetupObserver(); setControllerUsers(); clearCurrentMediaNotification(); - mLockscreenWallpaper.setUser(newUserId); + mLockscreenWallpaper.setCurrentUser(newUserId); updateMediaMetaData(true, false); } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 2394842d25b5..0f0a6c5afce9 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2226,6 +2226,11 @@ public final class ActivityStackSupervisor implements DisplayListener { return; } + if (stackId == FREEFORM_WORKSPACE_STACK_ID && !mService.mSupportsFreeformWindowManagement) { + throw new IllegalArgumentException("moveTaskToStack:" + + "Attempt to move task " + taskId + " to unsupported freeform stack"); + } + final ActivityRecord topActivity = task.getTopActivity(); final int sourceStackId = task.stack != null ? task.stack.mStackId : INVALID_STACK_ID; final boolean mightReplaceWindow = @@ -2260,10 +2265,13 @@ public final class ActivityStackSupervisor implements DisplayListener { // Make sure the task has the appropriate bounds/size for the stack it is in. if (stackId == FULLSCREEN_WORKSPACE_STACK_ID && task.mBounds != null) { kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow); - } else if (stackId == FREEFORM_WORKSPACE_STACK_ID - && task.mBounds == null && task.mLastNonFullscreenBounds != null) { - kept = resizeTaskLocked(task, task.mLastNonFullscreenBounds, - RESIZE_MODE_SYSTEM, !mightReplaceWindow); + } else if (stackId == FREEFORM_WORKSPACE_STACK_ID) { + Rect bounds = task.getLaunchBounds(); + if (bounds == null) { + stack.layoutTaskInStack(task, null); + bounds = task.mBounds; + } + kept = resizeTaskLocked(task, bounds, RESIZE_MODE_FORCED, !mightReplaceWindow); } else if (stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID) { kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow); } |