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 + } + } + } +}