summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java47
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java16
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);
}