From c6696e596be6ccbc2920e3e47050467eafacbf9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Pomini?= Date: Mon, 30 Jan 2023 23:03:38 +0000 Subject: [PATCH] Remove dependencies to LockscreenWallpaper Stop calling anything from LockscreenWallpaper (in particular, notificationMediaManager#updateMediaMetaData) if the config flag for the lockscreen live wallpaper project is enabled. This CL does not remove code, since it does not change any behaviour if the config flag is disabled. Test: atest CtsWallpaperTestCases Test: atest CentralSurfacesImplTest Test: atest SystemUITests:com.android.systemui.statusbar.NotificationMediaManagerTest Bug: 253507223 Change-Id: I2d0940bf4afc3c3fa283ed0773197360862ee480 --- .../statusbar/NotificationMediaManager.java | 19 ++++- .../CentralSurfacesDependenciesModule.java | 7 +- .../statusbar/phone/CentralSurfacesImpl.java | 11 ++- .../statusbar/phone/LockscreenWallpaper.java | 37 ++++++++-- .../statusbar/NotificationMediaManagerTest.kt | 70 +++++++++++++++++++ 5 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMediaManagerTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index ea9817c68c30d..72ae16e607c82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -24,6 +24,7 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Notification; +import android.app.WallpaperManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; @@ -43,6 +44,7 @@ import android.util.Log; import android.view.View; import android.widget.ImageView; +import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; import com.android.systemui.animation.Interpolators; import com.android.systemui.colorextraction.SysuiColorExtractor; @@ -117,6 +119,8 @@ public class NotificationMediaManager implements Dumpable { private ScrimController mScrimController; @Nullable private LockscreenWallpaper mLockscreenWallpaper; + @VisibleForTesting + boolean mIsLockscreenLiveWallpaperEnabled; private final DelayableExecutor mMainExecutor; @@ -179,7 +183,8 @@ public class NotificationMediaManager implements Dumpable { StatusBarStateController statusBarStateController, SysuiColorExtractor colorExtractor, KeyguardStateController keyguardStateController, - DumpManager dumpManager) { + DumpManager dumpManager, + WallpaperManager wallpaperManager) { mContext = context; mMediaArtworkProcessor = mediaArtworkProcessor; mKeyguardBypassController = keyguardBypassController; @@ -195,6 +200,7 @@ public class NotificationMediaManager implements Dumpable { mStatusBarStateController = statusBarStateController; mColorExtractor = colorExtractor; mKeyguardStateController = keyguardStateController; + mIsLockscreenLiveWallpaperEnabled = wallpaperManager.isLockscreenLiveWallpaperEnabled(); setupNotifPipeline(); @@ -474,13 +480,16 @@ public class NotificationMediaManager implements Dumpable { * Refresh or remove lockscreen artwork from media metadata or the lockscreen wallpaper. */ public void updateMediaMetaData(boolean metaDataChanged, boolean allowEnterAnimation) { + + if (mIsLockscreenLiveWallpaperEnabled) return; + Trace.beginSection("CentralSurfaces#updateMediaMetaData"); if (!SHOW_LOCKSCREEN_MEDIA_ARTWORK) { Trace.endSection(); return; } - if (mBackdrop == null) { + if (getBackDropView() == null) { Trace.endSection(); return; // called too early } @@ -709,6 +718,12 @@ public class NotificationMediaManager implements Dumpable { && (mBackdropFront.isVisibleToUser() || mBackdropBack.isVisibleToUser()); } + // TODO(b/273443374) temporary test helper; remove + @VisibleForTesting + BackDropView getBackDropView() { + return mBackdrop; + } + /** * {@link AsyncTask} to prepare album art for use as backdrop on lock screen. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java index 34300c7313434..f6c9a5cae34ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.dagger; import android.app.IActivityManager; +import android.app.WallpaperManager; import android.content.Context; import android.os.RemoteException; import android.service.dreams.IDreamManager; @@ -142,7 +143,8 @@ public interface CentralSurfacesDependenciesModule { StatusBarStateController statusBarStateController, SysuiColorExtractor colorExtractor, KeyguardStateController keyguardStateController, - DumpManager dumpManager) { + DumpManager dumpManager, + WallpaperManager wallpaperManager) { return new NotificationMediaManager( context, centralSurfacesOptionalLazy, @@ -157,7 +159,8 @@ public interface CentralSurfacesDependenciesModule { statusBarStateController, colorExtractor, keyguardStateController, - dumpManager); + dumpManager, + wallpaperManager); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 6cb9582c344e2..ccb7c103ce141 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -1359,8 +1359,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mHeadsUpManager); BackDropView backdrop = mNotificationShadeWindowView.findViewById(R.id.backdrop); - mMediaManager.setup(backdrop, backdrop.findViewById(R.id.backdrop_front), - backdrop.findViewById(R.id.backdrop_back), mScrimController, mLockscreenWallpaper); + if (mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { + mMediaManager.setup(null, null, null, mScrimController, null); + } else { + mMediaManager.setup(backdrop, backdrop.findViewById(R.id.backdrop_front), + backdrop.findViewById(R.id.backdrop_back), mScrimController, + mLockscreenWallpaper); + } float maxWallpaperZoom = mContext.getResources().getFloat( com.android.internal.R.dimen.config_wallpaperMaxScale); mNotificationShadeDepthControllerLazy.get().addListener(depth -> { @@ -2725,7 +2730,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { */ @Override public void setLockscreenUser(int newUserId) { - if (mLockscreenWallpaper != null) { + if (mLockscreenWallpaper != null && !mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { mLockscreenWallpaper.setCurrentUser(newUserId); } mScrimController.setCurrentUser(newUserId); 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 c16877a999f3a..c07b5e062d706 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -63,6 +63,11 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen private static final String TAG = "LockscreenWallpaper"; + // TODO(b/253507223): temporary; remove this + private static final String DISABLED_ERROR_MESSAGE = "Methods from LockscreenWallpaper.java " + + "should not be called in this version. The lock screen wallpaper should be " + + "managed by the WallpaperManagerService and not by this class."; + private final NotificationMediaManager mMediaManager; private final WallpaperManager mWallpaperManager; private final KeyguardUpdateMonitor mUpdateMonitor; @@ -91,7 +96,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen mMediaManager = mediaManager; mH = mainHandler; - if (iWallpaperManager != null) { + if (iWallpaperManager != null && !mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { // Service is disabled on some devices like Automotive try { iWallpaperManager.setLockWallpaperCallback(this); @@ -102,6 +107,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } public Bitmap getBitmap() { + assertLockscreenLiveWallpaperNotEnabled(); + if (mCached) { return mCache; } @@ -122,9 +129,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen public LoaderResult loadBitmap(int currentUserId, UserHandle selectedUser) { // May be called on any thread - only use thread safe operations. - if (mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { - return LoaderResult.success(null); - } + assertLockscreenLiveWallpaperNotEnabled(); + if (!mWallpaperManager.isWallpaperSupported()) { // When wallpaper is not supported, show the system wallpaper @@ -164,6 +170,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } public void setCurrentUser(int user) { + assertLockscreenLiveWallpaperNotEnabled(); + if (user != mCurrentUserId) { if (mSelectedUser == null || user != mSelectedUser.getIdentifier()) { mCached = false; @@ -173,6 +181,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } public void setSelectedUser(UserHandle selectedUser) { + assertLockscreenLiveWallpaperNotEnabled(); + if (Objects.equals(selectedUser, mSelectedUser)) { return; } @@ -182,16 +192,18 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen @Override public void onWallpaperChanged() { + assertLockscreenLiveWallpaperNotEnabled(); // Called on Binder thread. postUpdateWallpaper(); } @Override public void onWallpaperColorsChanged(WallpaperColors colors, int which, int userId) { - + assertLockscreenLiveWallpaperNotEnabled(); } private void postUpdateWallpaper() { + assertLockscreenLiveWallpaperNotEnabled(); if (mH == null) { Log.wtfStack(TAG, "Trying to use LockscreenWallpaper before initialization."); return; @@ -199,11 +211,12 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen mH.removeCallbacks(this); mH.post(this); } - @Override public void run() { // Called in response to onWallpaperChanged on the main thread. + assertLockscreenLiveWallpaperNotEnabled(); + if (mLoader != null) { mLoader.cancel(false /* interrupt */); } @@ -358,4 +371,16 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen } } } + + /** + * Feature b/253507223 will adapt the logic to always use the + * WallpaperManagerService to render the lock screen wallpaper. + * Methods of this class should not be called at all if the project flag is enabled. + * TODO(b/253507223) temporary assertion; remove this + */ + private void assertLockscreenLiveWallpaperNotEnabled() { + if (mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { + throw new IllegalStateException(DISABLED_ERROR_MESSAGE); + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMediaManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMediaManagerTest.kt new file mode 100644 index 0000000000000..9d6ea857fefc1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMediaManagerTest.kt @@ -0,0 +1,70 @@ +/* + * 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 + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.mockito.whenever +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.anyBoolean +import org.mockito.Mockito.doCallRealMethod +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +/** + * Temporary test for the lock screen live wallpaper project. + * + * TODO(b/273443374): remove this test + */ +@RunWith(AndroidTestingRunner::class) +@SmallTest +class NotificationMediaManagerTest : SysuiTestCase() { + + @Mock private lateinit var notificationMediaManager: NotificationMediaManager + + @Mock private lateinit var mockBackDropView: BackDropView + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + doCallRealMethod() + .whenever(notificationMediaManager) + .updateMediaMetaData(anyBoolean(), anyBoolean()) + doReturn(mockBackDropView).whenever(notificationMediaManager).backDropView + } + + @After fun tearDown() {} + + /** Check that updateMediaMetaData is a no-op with mIsLockscreenLiveWallpaperEnabled = true */ + @Test + fun testUpdateMediaMetaDataDisabled() { + notificationMediaManager.mIsLockscreenLiveWallpaperEnabled = true + for (metaDataChanged in listOf(true, false)) { + for (allowEnterAnimation in listOf(true, false)) { + notificationMediaManager.updateMediaMetaData(metaDataChanged, allowEnterAnimation) + verify(notificationMediaManager, never()).mediaMetadata + } + } + } +}