RESTRICT AUTOMERGE Center align the lock screen wallpaper
CP for UDC initial release where lockscreen live wallpaper is not enabled, and later we need to revert this for udc-qpr-dev.
On smaller display of a multi display device the lock screen wallpaper
should be showing the center area of the wallpaper. Check the display id
to find out which display the lock screen wallpaper is on, the check
needs to happened when we are adjusting the bounds to get the new
display id.
Bug: 263932616
Bug: 289079608
Test: set the lock screen wallpaper and observe the result
Change-Id: I32b93084a9e716a06e032f83a8cf625c25d3e5e5
(cherry picked from commit c979b74919)
This commit is contained in:
@@ -27,10 +27,12 @@ import android.app.Notification;
|
|||||||
import android.app.WallpaperManager;
|
import android.app.WallpaperManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Point;
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
import android.media.MediaMetadata;
|
import android.media.MediaMetadata;
|
||||||
import android.media.session.MediaController;
|
import android.media.session.MediaController;
|
||||||
import android.media.session.MediaSession;
|
import android.media.session.MediaSession;
|
||||||
@@ -41,6 +43,7 @@ import android.service.notification.NotificationStats;
|
|||||||
import android.service.notification.StatusBarNotification;
|
import android.service.notification.StatusBarNotification;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.Display;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
@@ -74,11 +77,15 @@ import com.android.systemui.util.concurrency.DelayableExecutor;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import dagger.Lazy;
|
import dagger.Lazy;
|
||||||
|
|
||||||
@@ -138,6 +145,14 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
private BackDropView mBackdrop;
|
private BackDropView mBackdrop;
|
||||||
private ImageView mBackdropFront;
|
private ImageView mBackdropFront;
|
||||||
private ImageView mBackdropBack;
|
private ImageView mBackdropBack;
|
||||||
|
private final Point mTmpDisplaySize = new Point();
|
||||||
|
|
||||||
|
private final DisplayManager mDisplayManager;
|
||||||
|
@Nullable
|
||||||
|
private List<String> mSmallerInternalDisplayUids;
|
||||||
|
private Display mCurrentDisplay;
|
||||||
|
|
||||||
|
private LockscreenWallpaper.WallpaperDrawable mWallapperDrawable;
|
||||||
|
|
||||||
private final MediaController.Callback mMediaListener = new MediaController.Callback() {
|
private final MediaController.Callback mMediaListener = new MediaController.Callback() {
|
||||||
@Override
|
@Override
|
||||||
@@ -184,7 +199,8 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
SysuiColorExtractor colorExtractor,
|
SysuiColorExtractor colorExtractor,
|
||||||
KeyguardStateController keyguardStateController,
|
KeyguardStateController keyguardStateController,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
WallpaperManager wallpaperManager) {
|
WallpaperManager wallpaperManager,
|
||||||
|
DisplayManager displayManager) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mMediaArtworkProcessor = mediaArtworkProcessor;
|
mMediaArtworkProcessor = mediaArtworkProcessor;
|
||||||
mKeyguardBypassController = keyguardBypassController;
|
mKeyguardBypassController = keyguardBypassController;
|
||||||
@@ -200,6 +216,7 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
mStatusBarStateController = statusBarStateController;
|
mStatusBarStateController = statusBarStateController;
|
||||||
mColorExtractor = colorExtractor;
|
mColorExtractor = colorExtractor;
|
||||||
mKeyguardStateController = keyguardStateController;
|
mKeyguardStateController = keyguardStateController;
|
||||||
|
mDisplayManager = displayManager;
|
||||||
mIsLockscreenLiveWallpaperEnabled = wallpaperManager.isLockscreenLiveWallpaperEnabled();
|
mIsLockscreenLiveWallpaperEnabled = wallpaperManager.isLockscreenLiveWallpaperEnabled();
|
||||||
|
|
||||||
setupNotifPipeline();
|
setupNotifPipeline();
|
||||||
@@ -476,6 +493,48 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
mMediaController = null;
|
mMediaController = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify lockscreen wallpaper drawable the current internal display.
|
||||||
|
*/
|
||||||
|
public void onDisplayUpdated(Display display) {
|
||||||
|
Trace.beginSection("NotificationMediaManager#onDisplayUpdated");
|
||||||
|
mCurrentDisplay = display;
|
||||||
|
if (mWallapperDrawable != null) {
|
||||||
|
mWallapperDrawable.onDisplayUpdated(isOnSmallerInternalDisplays());
|
||||||
|
}
|
||||||
|
Trace.endSection();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isOnSmallerInternalDisplays() {
|
||||||
|
if (mSmallerInternalDisplayUids == null) {
|
||||||
|
mSmallerInternalDisplayUids = findSmallerInternalDisplayUids();
|
||||||
|
}
|
||||||
|
return mSmallerInternalDisplayUids.contains(mCurrentDisplay.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> findSmallerInternalDisplayUids() {
|
||||||
|
if (mSmallerInternalDisplayUids != null) {
|
||||||
|
return mSmallerInternalDisplayUids;
|
||||||
|
}
|
||||||
|
List<Display> internalDisplays = Arrays.stream(mDisplayManager.getDisplays(
|
||||||
|
DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
|
||||||
|
.filter(display -> display.getType() == Display.TYPE_INTERNAL)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (internalDisplays.isEmpty()) {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
Display largestDisplay = internalDisplays.stream()
|
||||||
|
.max(Comparator.comparingInt(this::getRealDisplayArea))
|
||||||
|
.orElse(internalDisplays.get(0));
|
||||||
|
internalDisplays.remove(largestDisplay);
|
||||||
|
return internalDisplays.stream().map(Display::getUniqueId).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getRealDisplayArea(Display display) {
|
||||||
|
display.getRealSize(mTmpDisplaySize);
|
||||||
|
return mTmpDisplaySize.x * mTmpDisplaySize.y;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refresh or remove lockscreen artwork from media metadata or the lockscreen wallpaper.
|
* Refresh or remove lockscreen artwork from media metadata or the lockscreen wallpaper.
|
||||||
*/
|
*/
|
||||||
@@ -551,7 +610,7 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
mLockscreenWallpaper != null ? mLockscreenWallpaper.getBitmap() : null;
|
mLockscreenWallpaper != null ? mLockscreenWallpaper.getBitmap() : null;
|
||||||
if (lockWallpaper != null) {
|
if (lockWallpaper != null) {
|
||||||
artworkDrawable = new LockscreenWallpaper.WallpaperDrawable(
|
artworkDrawable = new LockscreenWallpaper.WallpaperDrawable(
|
||||||
mBackdropBack.getResources(), lockWallpaper);
|
mBackdropBack.getResources(), lockWallpaper, isOnSmallerInternalDisplays());
|
||||||
// We're in the SHADE mode on the SIM screen - yet we still need to show
|
// We're in the SHADE mode on the SIM screen - yet we still need to show
|
||||||
// the lockscreen wallpaper in that mode.
|
// the lockscreen wallpaper in that mode.
|
||||||
allowWhenShade = mStatusBarStateController.getState() == KEYGUARD;
|
allowWhenShade = mStatusBarStateController.getState() == KEYGUARD;
|
||||||
@@ -611,6 +670,10 @@ public class NotificationMediaManager implements Dumpable {
|
|||||||
mBackdropBack.setBackgroundColor(0xFFFFFFFF);
|
mBackdropBack.setBackgroundColor(0xFFFFFFFF);
|
||||||
mBackdropBack.setImageDrawable(new ColorDrawable(c));
|
mBackdropBack.setImageDrawable(new ColorDrawable(c));
|
||||||
} else {
|
} else {
|
||||||
|
if (artworkDrawable instanceof LockscreenWallpaper.WallpaperDrawable) {
|
||||||
|
mWallapperDrawable =
|
||||||
|
(LockscreenWallpaper.WallpaperDrawable) artworkDrawable;
|
||||||
|
}
|
||||||
mBackdropBack.setImageDrawable(artworkDrawable);
|
mBackdropBack.setImageDrawable(artworkDrawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.dagger;
|
|||||||
import android.app.IActivityManager;
|
import android.app.IActivityManager;
|
||||||
import android.app.WallpaperManager;
|
import android.app.WallpaperManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.service.dreams.IDreamManager;
|
import android.service.dreams.IDreamManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -144,7 +145,8 @@ public interface CentralSurfacesDependenciesModule {
|
|||||||
SysuiColorExtractor colorExtractor,
|
SysuiColorExtractor colorExtractor,
|
||||||
KeyguardStateController keyguardStateController,
|
KeyguardStateController keyguardStateController,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
WallpaperManager wallpaperManager) {
|
WallpaperManager wallpaperManager,
|
||||||
|
DisplayManager displayManager) {
|
||||||
return new NotificationMediaManager(
|
return new NotificationMediaManager(
|
||||||
context,
|
context,
|
||||||
centralSurfacesOptionalLazy,
|
centralSurfacesOptionalLazy,
|
||||||
@@ -160,7 +162,8 @@ public interface CentralSurfacesDependenciesModule {
|
|||||||
colorExtractor,
|
colorExtractor,
|
||||||
keyguardStateController,
|
keyguardStateController,
|
||||||
dumpManager,
|
dumpManager,
|
||||||
wallpaperManager);
|
wallpaperManager,
|
||||||
|
displayManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
|||||||
@@ -2267,6 +2267,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
|||||||
void updateDisplaySize() {
|
void updateDisplaySize() {
|
||||||
mDisplay.getMetrics(mDisplayMetrics);
|
mDisplay.getMetrics(mDisplayMetrics);
|
||||||
mDisplay.getSize(mCurrentDisplaySize);
|
mDisplay.getSize(mCurrentDisplaySize);
|
||||||
|
mMediaManager.onDisplayUpdated(mDisplay);
|
||||||
if (DEBUG_GESTURES) {
|
if (DEBUG_GESTURES) {
|
||||||
mGestureRec.tag("display",
|
mGestureRec.tag("display",
|
||||||
String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
|
String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
|
||||||
|
|||||||
@@ -281,19 +281,25 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Drawable that aligns left horizontally and center vertically (like ImageWallpaper).
|
* Drawable that aligns left horizontally and center vertically (like ImageWallpaper).
|
||||||
|
*
|
||||||
|
* <p>Aligns to the center when showing on the smaller internal display of a multi display
|
||||||
|
* device.
|
||||||
*/
|
*/
|
||||||
public static class WallpaperDrawable extends DrawableWrapper {
|
public static class WallpaperDrawable extends DrawableWrapper {
|
||||||
|
|
||||||
private final ConstantState mState;
|
private final ConstantState mState;
|
||||||
private final Rect mTmpRect = new Rect();
|
private final Rect mTmpRect = new Rect();
|
||||||
|
private boolean mIsOnSmallerInternalDisplays;
|
||||||
|
|
||||||
public WallpaperDrawable(Resources r, Bitmap b) {
|
public WallpaperDrawable(Resources r, Bitmap b, boolean isOnSmallerInternalDisplays) {
|
||||||
this(r, new ConstantState(b));
|
this(r, new ConstantState(b), isOnSmallerInternalDisplays);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WallpaperDrawable(Resources r, ConstantState state) {
|
private WallpaperDrawable(Resources r, ConstantState state,
|
||||||
|
boolean isOnSmallerInternalDisplays) {
|
||||||
super(new BitmapDrawable(r, state.mBackground));
|
super(new BitmapDrawable(r, state.mBackground));
|
||||||
mState = state;
|
mState = state;
|
||||||
|
mIsOnSmallerInternalDisplays = isOnSmallerInternalDisplays;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -332,10 +338,17 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
|
|||||||
}
|
}
|
||||||
dy = (vheight - dheight * scale) * 0.5f;
|
dy = (vheight - dheight * scale) * 0.5f;
|
||||||
|
|
||||||
|
int offsetX = 0;
|
||||||
|
// Offset to show the center area of the wallpaper on a smaller display for multi
|
||||||
|
// display device
|
||||||
|
if (mIsOnSmallerInternalDisplays) {
|
||||||
|
offsetX = bounds.centerX() - (Math.round(dwidth * scale) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
mTmpRect.set(
|
mTmpRect.set(
|
||||||
bounds.left,
|
bounds.left + offsetX,
|
||||||
bounds.top + Math.round(dy),
|
bounds.top + Math.round(dy),
|
||||||
bounds.left + Math.round(dwidth * scale),
|
bounds.left + Math.round(dwidth * scale) + offsetX,
|
||||||
bounds.top + Math.round(dheight * scale + dy));
|
bounds.top + Math.round(dheight * scale + dy));
|
||||||
|
|
||||||
super.onBoundsChange(mTmpRect);
|
super.onBoundsChange(mTmpRect);
|
||||||
@@ -346,6 +359,17 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
|
|||||||
return mState;
|
return mState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update bounds when the hosting display or the display size has changed.
|
||||||
|
*
|
||||||
|
* @param isOnSmallerInternalDisplays true if the drawable is on one of the internal
|
||||||
|
* displays with the smaller area.
|
||||||
|
*/
|
||||||
|
public void onDisplayUpdated(boolean isOnSmallerInternalDisplays) {
|
||||||
|
mIsOnSmallerInternalDisplays = isOnSmallerInternalDisplays;
|
||||||
|
onBoundsChange(getBounds());
|
||||||
|
}
|
||||||
|
|
||||||
static class ConstantState extends Drawable.ConstantState {
|
static class ConstantState extends Drawable.ConstantState {
|
||||||
|
|
||||||
private final Bitmap mBackground;
|
private final Bitmap mBackground;
|
||||||
@@ -361,7 +385,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Drawable newDrawable(@Nullable Resources res) {
|
public Drawable newDrawable(@Nullable Resources res) {
|
||||||
return new WallpaperDrawable(res, this);
|
return new WallpaperDrawable(res, this, /* isOnSmallerInternalDisplays= */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user