Merge "RESTRICT AUTOMERGE Center align the lock screen wallpaper" into tm-qpr-dev

This commit is contained in:
Austin Wang
2023-03-29 02:03:06 +00:00
committed by Android (Google) Code Review
5 changed files with 149 additions and 10 deletions

View File

@@ -26,10 +26,12 @@ import android.annotation.Nullable;
import android.app.Notification; import android.app.Notification;
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;
@@ -40,6 +42,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;
@@ -72,11 +75,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;
@@ -134,6 +141,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
@@ -179,7 +194,8 @@ public class NotificationMediaManager implements Dumpable {
StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController,
SysuiColorExtractor colorExtractor, SysuiColorExtractor colorExtractor,
KeyguardStateController keyguardStateController, KeyguardStateController keyguardStateController,
DumpManager dumpManager) { DumpManager dumpManager,
DisplayManager displayManager) {
mContext = context; mContext = context;
mMediaArtworkProcessor = mediaArtworkProcessor; mMediaArtworkProcessor = mediaArtworkProcessor;
mKeyguardBypassController = keyguardBypassController; mKeyguardBypassController = keyguardBypassController;
@@ -195,6 +211,7 @@ public class NotificationMediaManager implements Dumpable {
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
mColorExtractor = colorExtractor; mColorExtractor = colorExtractor;
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
mDisplayManager = displayManager;
setupNotifPipeline(); setupNotifPipeline();
@@ -470,6 +487,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.
*/ */
@@ -542,7 +601,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;
@@ -602,6 +661,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);
} }

View File

@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.dagger;
import android.app.IActivityManager; import android.app.IActivityManager;
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;
@@ -139,7 +140,8 @@ public interface CentralSurfacesDependenciesModule {
StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController,
SysuiColorExtractor colorExtractor, SysuiColorExtractor colorExtractor,
KeyguardStateController keyguardStateController, KeyguardStateController keyguardStateController,
DumpManager dumpManager) { DumpManager dumpManager,
DisplayManager displayManager) {
return new NotificationMediaManager( return new NotificationMediaManager(
context, context,
centralSurfacesOptionalLazy, centralSurfacesOptionalLazy,
@@ -154,7 +156,8 @@ public interface CentralSurfacesDependenciesModule {
statusBarStateController, statusBarStateController,
colorExtractor, colorExtractor,
keyguardStateController, keyguardStateController,
dumpManager); dumpManager,
displayManager);
} }
/** */ /** */

View File

@@ -2311,6 +2311,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));

View File

@@ -259,19 +259,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
@@ -310,10 +316,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);
@@ -324,6 +337,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 tru 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;
@@ -339,7 +363,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

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.phone
import android.graphics.Bitmap
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidTestingRunner::class)
@SmallTest
class LockscreenWallpaperTest : SysuiTestCase() {
@Test
fun testLockscreenWallpaper_onSmallerInternalDisplay_centerAlignsDrawable() {
val displaySize = Rect(0, 0, 1080, 2092)
val wallpaperDrawable =
LockscreenWallpaper.WallpaperDrawable(
context.resources,
Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888),
/* isOnSmallerInternalDisplays= */ false
)
.apply { bounds = displaySize }
wallpaperDrawable.onDisplayUpdated(true)
assertThat(wallpaperDrawable.drawable.bounds.centerX())
.isEqualTo(wallpaperDrawable.bounds.centerX())
}
}