diff options
| author | 2023-01-27 19:24:08 +0000 | |
|---|---|---|
| committer | 2023-01-27 19:24:08 +0000 | |
| commit | 690c929811f8b6f524e047594eaf5baea7f435a9 (patch) | |
| tree | 1b5f1d6165bdbc3b273a45830397919b853b21bc | |
| parent | eb34e33e3a3f8acc312d1133d2996be5f84c33e7 (diff) | |
| parent | f8999b1dda92a73f0f486758d3548d1ef2636e04 (diff) | |
Merge "[DO NOT MERGE] Add centralized DisplayTracker for SystemUI" into tm-qpr-dev
69 files changed, 890 insertions, 247 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java b/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java index 02776a295359..ec8fa921c6fa 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java @@ -15,8 +15,6 @@ */ package com.android.keyguard; -import static android.view.Display.DEFAULT_DISPLAY; - import android.app.Presentation; import android.content.Context; import android.graphics.Color; @@ -37,9 +35,11 @@ import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.dagger.KeyguardStatusViewComponent; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.navigationbar.NavigationBarController; import com.android.systemui.navigationbar.NavigationBarView; +import com.android.systemui.settings.DisplayTracker; import java.util.concurrent.Executor; @@ -53,6 +53,7 @@ public class KeyguardDisplayManager { private MediaRouter mMediaRouter = null; private final DisplayManager mDisplayService; + private final DisplayTracker mDisplayTracker; private final Lazy<NavigationBarController> mNavigationBarControllerLazy; private final KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; private final Context mContext; @@ -62,46 +63,43 @@ public class KeyguardDisplayManager { private final SparseArray<Presentation> mPresentations = new SparseArray<>(); - private final DisplayManager.DisplayListener mDisplayListener = - new DisplayManager.DisplayListener() { - - @Override - public void onDisplayAdded(int displayId) { - Trace.beginSection( - "KeyguardDisplayManager#onDisplayAdded(displayId=" + displayId + ")"); - final Display display = mDisplayService.getDisplay(displayId); - if (mShowing) { - updateNavigationBarVisibility(displayId, false /* navBarVisible */); - showPresentation(display); - } - Trace.endSection(); - } - - @Override - public void onDisplayChanged(int displayId) { - - } + private final DisplayTracker.Callback mDisplayCallback = + new DisplayTracker.Callback() { + @Override + public void onDisplayAdded(int displayId) { + Trace.beginSection( + "KeyguardDisplayManager#onDisplayAdded(displayId=" + displayId + ")"); + final Display display = mDisplayService.getDisplay(displayId); + if (mShowing) { + updateNavigationBarVisibility(displayId, false /* navBarVisible */); + showPresentation(display); + } + Trace.endSection(); + } - @Override - public void onDisplayRemoved(int displayId) { - Trace.beginSection( - "KeyguardDisplayManager#onDisplayRemoved(displayId=" + displayId + ")"); - hidePresentation(displayId); - Trace.endSection(); - } - }; + @Override + public void onDisplayRemoved(int displayId) { + Trace.beginSection( + "KeyguardDisplayManager#onDisplayRemoved(displayId=" + displayId + ")"); + hidePresentation(displayId); + Trace.endSection(); + } + }; @Inject public KeyguardDisplayManager(Context context, Lazy<NavigationBarController> navigationBarControllerLazy, KeyguardStatusViewComponent.Factory keyguardStatusViewComponentFactory, + DisplayTracker displayTracker, + @Main Executor mainExecutor, @UiBackground Executor uiBgExecutor) { mContext = context; mNavigationBarControllerLazy = navigationBarControllerLazy; mKeyguardStatusViewComponentFactory = keyguardStatusViewComponentFactory; uiBgExecutor.execute(() -> mMediaRouter = mContext.getSystemService(MediaRouter.class)); mDisplayService = mContext.getSystemService(DisplayManager.class); - mDisplayService.registerDisplayListener(mDisplayListener, null /* handler */); + mDisplayTracker = displayTracker; + mDisplayTracker.addDisplayChangeCallback(mDisplayCallback, mainExecutor); } private boolean isKeyguardShowable(Display display) { @@ -109,7 +107,7 @@ public class KeyguardDisplayManager { if (DEBUG) Log.i(TAG, "Cannot show Keyguard on null display"); return false; } - if (display.getDisplayId() == DEFAULT_DISPLAY) { + if (display.getDisplayId() == mDisplayTracker.getDefaultDisplayId()) { if (DEBUG) Log.i(TAG, "Do not show KeyguardPresentation on the default display"); return false; } @@ -224,7 +222,7 @@ public class KeyguardDisplayManager { protected boolean updateDisplays(boolean showing) { boolean changed = false; if (showing) { - final Display[] displays = mDisplayService.getDisplays(); + final Display[] displays = mDisplayTracker.getAllDisplays(); for (Display display : displays) { int displayId = display.getDisplayId(); updateNavigationBarVisibility(displayId, false /* navBarVisible */); @@ -247,7 +245,7 @@ public class KeyguardDisplayManager { // term solution in R. private void updateNavigationBarVisibility(int displayId, boolean navBarVisible) { // Leave this task to {@link StatusBarKeyguardViewManager} - if (displayId == DEFAULT_DISPLAY) return; + if (displayId == mDisplayTracker.getDefaultDisplayId()) return; NavigationBarView navBarView = mNavigationBarControllerLazy.get() .getNavigationBarView(displayId); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java index 0b2b1214e599..e3de8c7e5671 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java @@ -17,7 +17,6 @@ package com.android.keyguard; import static android.app.slice.Slice.HINT_LIST_ITEM; -import static android.view.Display.DEFAULT_DISPLAY; import android.app.PendingIntent; import android.net.Uri; @@ -43,6 +42,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardSliceProvider; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.ViewController; @@ -64,6 +64,7 @@ public class KeyguardSliceViewController extends ViewController<KeyguardSliceVie private final ConfigurationController mConfigurationController; private final TunerService mTunerService; private final DumpManager mDumpManager; + private final DisplayTracker mDisplayTracker; private int mDisplayId; private LiveData<Slice> mLiveData; private Uri mKeyguardSliceUri; @@ -108,12 +109,14 @@ public class KeyguardSliceViewController extends ViewController<KeyguardSliceVie ActivityStarter activityStarter, ConfigurationController configurationController, TunerService tunerService, - DumpManager dumpManager) { + DumpManager dumpManager, + DisplayTracker displayTracker) { super(keyguardSliceView); mActivityStarter = activityStarter; mConfigurationController = configurationController; mTunerService = tunerService; mDumpManager = dumpManager; + mDisplayTracker = displayTracker; } @Override @@ -124,7 +127,7 @@ public class KeyguardSliceViewController extends ViewController<KeyguardSliceVie } mTunerService.addTunable(mTunable, Settings.Secure.KEYGUARD_SLICE_URI); // Make sure we always have the most current slice - if (mDisplayId == DEFAULT_DISPLAY && mLiveData != null) { + if (mDisplayId == mDisplayTracker.getDefaultDisplayId() && mLiveData != null) { mLiveData.observeForever(mObserver); } mConfigurationController.addCallback(mConfigurationListener); @@ -137,7 +140,7 @@ public class KeyguardSliceViewController extends ViewController<KeyguardSliceVie @Override protected void onViewDetached() { // TODO(b/117344873) Remove below work around after this issue be fixed. - if (mDisplayId == DEFAULT_DISPLAY) { + if (mDisplayId == mDisplayTracker.getDefaultDisplayId()) { mLiveData.removeObserver(mObserver); } mTunerService.removeTunable(mTunable); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index e6f559b3da5f..71f98fa3613a 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -36,10 +36,10 @@ import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.hardware.display.DisplayManager; import android.hardware.graphics.common.AlphaInterpretation; import android.hardware.graphics.common.DisplayDecorationSupport; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.SystemProperties; import android.os.Trace; import android.provider.Settings.Secure; @@ -76,6 +76,7 @@ import com.android.systemui.decor.PrivacyDotDecorProviderFactory; import com.android.systemui.decor.RoundedCornerDecorProviderFactory; import com.android.systemui.decor.RoundedCornerResDelegate; import com.android.systemui.qs.SettingObserver; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.tuner.TunerService; @@ -120,7 +121,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { R.id.display_cutout_bottom }; - private DisplayManager mDisplayManager; + private DisplayTracker mDisplayTracker; @VisibleForTesting protected boolean mIsRegistered; private final Context mContext; @@ -128,7 +129,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { private final TunerService mTunerService; private final SecureSettings mSecureSettings; @VisibleForTesting - DisplayManager.DisplayListener mDisplayListener; + DisplayTracker.Callback mDisplayListener; private CameraAvailabilityListener mCameraListener; private final UserTracker mUserTracker; private final PrivacyDotViewController mDotViewController; @@ -302,6 +303,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { SecureSettings secureSettings, TunerService tunerService, UserTracker userTracker, + DisplayTracker displayTracker, PrivacyDotViewController dotViewController, ThreadFactory threadFactory, PrivacyDotDecorProviderFactory dotFactory, @@ -311,6 +313,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mSecureSettings = secureSettings; mTunerService = tunerService; mUserTracker = userTracker; + mDisplayTracker = displayTracker; mDotViewController = dotViewController; mThreadFactory = threadFactory; mDotFactory = dotFactory; @@ -376,7 +379,6 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { private void startOnScreenDecorationsThread() { Trace.beginSection("ScreenDecorations#startOnScreenDecorationsThread"); mWindowManager = mContext.getSystemService(WindowManager.class); - mDisplayManager = mContext.getSystemService(DisplayManager.class); mContext.getDisplay().getDisplayInfo(mDisplayInfo); mRotation = mDisplayInfo.rotation; mDisplayMode = mDisplayInfo.getMode(); @@ -393,17 +395,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { setupDecorations(); setupCameraListener(); - mDisplayListener = new DisplayManager.DisplayListener() { - @Override - public void onDisplayAdded(int displayId) { - // do nothing - } - - @Override - public void onDisplayRemoved(int displayId) { - // do nothing - } - + mDisplayListener = new DisplayTracker.Callback() { @Override public void onDisplayChanged(int displayId) { mContext.getDisplay().getDisplayInfo(mDisplayInfo); @@ -474,8 +466,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { } } }; - - mDisplayManager.registerDisplayListener(mDisplayListener, mHandler); + mDisplayTracker.addDisplayChangeCallback(mDisplayListener, new HandlerExecutor(mHandler)); updateConfiguration(); Trace.endSection(); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index 696437d115d5..ddac25b67766 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -36,7 +36,6 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; -import android.view.Display; import android.view.IWindowManager; import android.view.InputDevice; import android.view.KeyCharacterMap; @@ -50,6 +49,7 @@ import com.android.internal.util.ScreenshotHelper; import com.android.systemui.CoreStartable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.recents.Recents; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.CommandQueue; @@ -180,6 +180,7 @@ public class SystemActions implements CoreStartable { private final Context mContext; private final UserTracker mUserTracker; private final Optional<Recents> mRecentsOptional; + private final DisplayTracker mDisplayTracker; private Locale mLocale; private final AccessibilityManager mA11yManager; private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy; @@ -194,11 +195,13 @@ public class SystemActions implements CoreStartable { NotificationShadeWindowController notificationShadeController, ShadeController shadeController, Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, - Optional<Recents> recentsOptional) { + Optional<Recents> recentsOptional, + DisplayTracker displayTracker) { mContext = context; mUserTracker = userTracker; mShadeController = shadeController; mRecentsOptional = recentsOptional; + mDisplayTracker = displayTracker; mReceiver = new SystemActionsBroadcastReceiver(); mLocale = mContext.getResources().getConfiguration().getLocales().get(0); mA11yManager = (AccessibilityManager) mContext.getSystemService( @@ -523,7 +526,7 @@ public class SystemActions implements CoreStartable { private void handleAccessibilityButton() { AccessibilityManager.getInstance(mContext).notifyAccessibilityButtonClicked( - Display.DEFAULT_DISPLAY); + mDisplayTracker.getDefaultDisplayId()); } private void handleAccessibilityButtonChooser() { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index ab11fcea7b28..b3574bfc83cd 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -39,6 +39,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.CommandQueue; import java.io.PrintWriter; @@ -62,6 +63,7 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba private final AccessibilityManager mAccessibilityManager; private final CommandQueue mCommandQueue; private final OverviewProxyService mOverviewProxyService; + private final DisplayTracker mDisplayTracker; private WindowMagnificationConnectionImpl mWindowMagnificationConnectionImpl; private SysUiState mSysUiState; @@ -102,7 +104,8 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba @Inject public WindowMagnification(Context context, @Main Handler mainHandler, CommandQueue commandQueue, ModeSwitchesController modeSwitchesController, - SysUiState sysUiState, OverviewProxyService overviewProxyService) { + SysUiState sysUiState, OverviewProxyService overviewProxyService, + DisplayTracker displayTracker) { mContext = context; mHandler = mainHandler; mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); @@ -110,6 +113,7 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba mModeSwitchesController = modeSwitchesController; mSysUiState = sysUiState; mOverviewProxyService = overviewProxyService; + mDisplayTracker = displayTracker; mMagnificationControllerSupplier = new ControllerSupplier(context, mHandler, this, context.getSystemService(DisplayManager.class), sysUiState); } @@ -130,14 +134,14 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba private void updateSysUiStateFlag() { //TODO(b/187510533): support multi-display once SysuiState supports it. final WindowMagnificationController controller = - mMagnificationControllerSupplier.valueAt(Display.DEFAULT_DISPLAY); + mMagnificationControllerSupplier.valueAt(mDisplayTracker.getDefaultDisplayId()); if (controller != null) { controller.updateSysUIStateFlag(); } else { // The instance is initialized when there is an IPC request. Considering // self-crash cases, we need to reset the flag in such situation. mSysUiState.setFlag(SYSUI_STATE_MAGNIFICATION_OVERLAP, false) - .commitUpdate(Display.DEFAULT_DISPLAY); + .commitUpdate(mDisplayTracker.getDefaultDisplayId()); } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index da2e28c5522f..1ea173ea9f48 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -1,7 +1,5 @@ package com.android.systemui.assist; -import static android.view.Display.DEFAULT_DISPLAY; - import static com.android.systemui.DejankUtils.whitelistIpcs; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ASSIST_GESTURE_CONSTRAINED; @@ -35,6 +33,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -122,6 +121,7 @@ public class AssistManager { protected final Lazy<SysUiState> mSysUiState; protected final AssistLogger mAssistLogger; private final UserTracker mUserTracker; + private final DisplayTracker mDisplayTracker; private final SecureSettings mSecureSettings; private final DeviceProvisionedController mDeviceProvisionedController; @@ -141,6 +141,7 @@ public class AssistManager { AssistLogger assistLogger, @Main Handler uiHandler, UserTracker userTracker, + DisplayTracker displayTracker, SecureSettings secureSettings) { mContext = context; mDeviceProvisionedController = controller; @@ -150,6 +151,7 @@ public class AssistManager { mPhoneStateMonitor = phoneStateMonitor; mAssistLogger = assistLogger; mUserTracker = userTracker; + mDisplayTracker = displayTracker; mSecureSettings = secureSettings; registerVoiceInteractionSessionListener(); @@ -214,7 +216,7 @@ public class AssistManager { .setFlag( SYSUI_STATE_ASSIST_GESTURE_CONSTRAINED, hints.getBoolean(CONSTRAINED_KEY, false)) - .commitUpdate(DEFAULT_DISPLAY); + .commitUpdate(mDisplayTracker.getDefaultDisplayId()); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index f97d6af632b0..8c8ee8a325a0 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -17,7 +17,6 @@ package com.android.systemui.clipboardoverlay; import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.CLIPBOARD_OVERLAY_SHOW_ACTIONS; @@ -72,6 +71,7 @@ import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule.Overl import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.screenshot.TimeoutHandler; +import com.android.systemui.settings.DisplayTracker; import java.io.IOException; import java.util.Optional; @@ -96,6 +96,7 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv private final ClipboardLogger mClipboardLogger; private final BroadcastDispatcher mBroadcastDispatcher; private final DisplayManager mDisplayManager; + private final DisplayTracker mDisplayTracker; private final ClipboardOverlayWindow mWindow; private final TimeoutHandler mTimeoutHandler; private final ClipboardOverlayUtils mClipboardUtils; @@ -186,9 +187,11 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv FeatureFlags featureFlags, ClipboardOverlayUtils clipboardUtils, @Background Executor bgExecutor, - UiEventLogger uiEventLogger) { + UiEventLogger uiEventLogger, + DisplayTracker displayTracker) { mBroadcastDispatcher = broadcastDispatcher; mDisplayManager = requireNonNull(context.getSystemService(DisplayManager.class)); + mDisplayTracker = displayTracker; final Context displayContext = context.createDisplayContext(getDefaultDisplay()); mContext = displayContext.createWindowContext(TYPE_SCREENSHOT, null); @@ -514,7 +517,7 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv } private Display getDefaultDisplay() { - return mDisplayManager.getDisplay(DEFAULT_DISPLAY); + return mDisplayManager.getDisplay(mDisplayTracker.getDefaultDisplayId()); } static class ClipboardLogger { diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlayModule.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlayModule.java index 22448130f7e5..09b2e44c1be1 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlayModule.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/dagger/ClipboardOverlayModule.java @@ -16,7 +16,6 @@ package com.android.systemui.clipboardoverlay.dagger; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -28,6 +27,7 @@ import android.view.LayoutInflater; import com.android.systemui.R; import com.android.systemui.clipboardoverlay.ClipboardOverlayView; +import com.android.systemui.settings.DisplayTracker; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -46,8 +46,9 @@ public interface ClipboardOverlayModule { */ @Provides @OverlayWindowContext - static Context provideWindowContext(DisplayManager displayManager, Context context) { - Display display = displayManager.getDisplay(DEFAULT_DISPLAY); + static Context provideWindowContext(DisplayManager displayManager, + DisplayTracker displayTracker, Context context) { + Display display = displayManager.getDisplay(displayTracker.getDefaultDisplayId()); return context.createWindowContext(display, TYPE_SCREENSHOT, null); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 70aab92e2ad0..9ad7b8c7104b 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -63,6 +63,7 @@ import com.android.systemui.qs.footer.dagger.FooterActionsModule; import com.android.systemui.recents.Recents; import com.android.systemui.screenshot.dagger.ScreenshotModule; import com.android.systemui.security.data.repository.SecurityRepositoryModule; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.dagger.MultiUserUtilsModule; import com.android.systemui.shade.ShadeController; import com.android.systemui.smartspace.dagger.SmartspaceModule; @@ -198,8 +199,8 @@ public abstract class SystemUIModule { @SysUISingleton @Provides - static SysUiState provideSysUiState(DumpManager dumpManager) { - final SysUiState state = new SysUiState(); + static SysUiState provideSysUiState(DisplayTracker displayTracker, DumpManager dumpManager) { + final SysUiState state = new SysUiState(displayTracker); dumpManager.registerDumpable(state); return state; } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/InputSession.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/InputSession.java index 43827573470f..e1d03392044a 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/InputSession.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/InputSession.java @@ -21,10 +21,10 @@ import static com.android.systemui.dreams.touch.dagger.DreamTouchModule.PILFER_O import android.os.Looper; import android.view.Choreographer; -import android.view.Display; import android.view.GestureDetector; import android.view.MotionEvent; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.shared.system.InputMonitorCompat; @@ -55,8 +55,9 @@ public class InputSession { public InputSession(@Named(INPUT_SESSION_NAME) String sessionName, InputChannelCompat.InputEventListener inputEventListener, GestureDetector.OnGestureListener gestureListener, + DisplayTracker displayTracker, @Named(PILFER_ON_GESTURE_CONSUME) boolean pilferOnGestureConsume) { - mInputMonitor = new InputMonitorCompat(sessionName, Display.DEFAULT_DISPLAY); + mInputMonitor = new InputMonitorCompat(sessionName, displayTracker.getDefaultDisplayId()); mGestureDetector = new GestureDetector(gestureListener); mInputEventReceiver = mInputMonitor.getInputReceiver(Looper.getMainLooper(), diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index f4a1227a467c..47872d2d68bb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -17,7 +17,6 @@ package com.android.systemui.keyguard; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.TRANSIT_CLOSE; @@ -80,6 +79,7 @@ import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardStateCallback; import com.android.keyguard.mediator.ScreenOnCoordinator; import com.android.systemui.SystemUIApplication; +import com.android.systemui.settings.DisplayTracker; import com.android.wm.shell.transition.ShellTransitions; import com.android.wm.shell.transition.Transitions; @@ -123,6 +123,7 @@ public class KeyguardService extends Service { private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher; private final ScreenOnCoordinator mScreenOnCoordinator; private final ShellTransitions mShellTransitions; + private final DisplayTracker mDisplayTracker; private static int newModeToLegacyMode(int newMode) { switch (newMode) { @@ -286,12 +287,14 @@ public class KeyguardService extends Service { public KeyguardService(KeyguardViewMediator keyguardViewMediator, KeyguardLifecyclesDispatcher keyguardLifecyclesDispatcher, ScreenOnCoordinator screenOnCoordinator, - ShellTransitions shellTransitions) { + ShellTransitions shellTransitions, + DisplayTracker displayTracker) { super(); mKeyguardViewMediator = keyguardViewMediator; mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher; mScreenOnCoordinator = screenOnCoordinator; mShellTransitions = shellTransitions; + mDisplayTracker = displayTracker; } @Override @@ -328,7 +331,7 @@ public class KeyguardService extends Service { unoccludeAnimationAdapter); } ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay( - DEFAULT_DISPLAY, definition); + mDisplayTracker.getDefaultDisplayId(), definition); return; } if (sEnableRemoteKeyguardGoingAwayAnimation) { diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java index 3ecf15471c31..8d809908d78b 100644 --- a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java +++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java @@ -16,13 +16,12 @@ package com.android.systemui.model; -import static android.view.Display.DEFAULT_DISPLAY; - import android.annotation.NonNull; import android.util.Log; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.QuickStepContract; import java.io.PrintWriter; @@ -39,11 +38,16 @@ public class SysUiState implements Dumpable { private static final String TAG = SysUiState.class.getSimpleName(); public static final boolean DEBUG = false; + private final DisplayTracker mDisplayTracker; private @QuickStepContract.SystemUiStateFlags int mFlags; private final List<SysUiStateCallback> mCallbacks = new ArrayList<>(); private int mFlagsToSet = 0; private int mFlagsToClear = 0; + public SysUiState(DisplayTracker displayTracker) { + mDisplayTracker = displayTracker; + } + /** * Add listener to be notified of changes made to SysUI state. * The callback will also be called as part of this function. @@ -81,7 +85,7 @@ public class SysUiState implements Dumpable { } private void updateFlags(int displayId) { - if (displayId != DEFAULT_DISPLAY) { + if (displayId != mDisplayTracker.getDefaultDisplayId()) { // Ignore non-default displays for now Log.w(TAG, "Ignoring flag update for display: " + displayId, new Throwable()); return; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 5993e2eaadad..97c290d3e1f0 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -25,7 +25,6 @@ import static android.app.StatusBarManager.WindowType; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.ROTATION_UNDEFINED; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; @@ -130,6 +129,7 @@ import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; @@ -218,6 +218,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener; private final UserContextProvider mUserContextProvider; private final WakefulnessLifecycle mWakefulnessLifecycle; + private final DisplayTracker mDisplayTracker; private final RegionSamplingHelper mRegionSamplingHelper; private final int mNavColorSampleMargin; private NavigationBarFrame mFrame; @@ -461,7 +462,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements @Override public void onStartedWakingUp() { notifyScreenStateChanged(true); - if (isGesturalModeOnDefaultDisplay(getContext(), mNavBarMode)) { + if (isGesturalModeOnDefaultDisplay(getContext(), mDisplayTracker, + mNavBarMode)) { mRegionSamplingHelper.start(mSamplingBounds); } } @@ -545,7 +547,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements Optional<BackAnimation> backAnimation, UserContextProvider userContextProvider, WakefulnessLifecycle wakefulnessLifecycle, - TaskStackChangeListeners taskStackChangeListeners) { + TaskStackChangeListeners taskStackChangeListeners, + DisplayTracker displayTracker) { super(navigationBarView); mFrame = navigationBarFrame; mContext = context; @@ -585,6 +588,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mUserContextProvider = userContextProvider; mWakefulnessLifecycle = wakefulnessLifecycle; mTaskStackChangeListeners = taskStackChangeListeners; + mDisplayTracker = displayTracker; mNavColorSampleMargin = getResources() .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin); @@ -632,12 +636,14 @@ public class NavigationBar extends ViewController<NavigationBarView> implements @Override public boolean isSamplingEnabled() { - return isGesturalModeOnDefaultDisplay(getContext(), mNavBarMode); + return isGesturalModeOnDefaultDisplay(getContext(), mDisplayTracker, + mNavBarMode); } }, mainExecutor, bgExecutor); mView.setBackgroundExecutor(bgExecutor); mView.setEdgeBackGestureHandler(mEdgeBackGestureHandler); + mView.setDisplayTracker(mDisplayTracker); mNavBarMode = mNavigationModeController.addListener(mModeChangedListener); } @@ -665,7 +671,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration .getRotation())); mDisplayId = mContext.getDisplayId(); - mIsOnDefaultDisplay = mDisplayId == DEFAULT_DISPLAY; + mIsOnDefaultDisplay = mDisplayId == mDisplayTracker.getDefaultDisplayId(); // Ensure we try to get currentSysuiState from navBarHelper before command queue callbacks // start firing, since the latter is source of truth @@ -1468,7 +1474,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements private void onAccessibilityClick(View v) { final Display display = v.getDisplay(); mAccessibilityManager.notifyAccessibilityButtonClicked( - display != null ? display.getDisplayId() : DEFAULT_DISPLAY); + display != null ? display.getDisplayId() : mDisplayTracker.getDefaultDisplayId()); } private boolean onAccessibilityLongClick(View v) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index dce69bb7ac1e..8c19111cab24 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -19,7 +19,6 @@ package com.android.systemui.navigationbar; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; -import static android.view.Display.DEFAULT_DISPLAY; import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; import static com.android.systemui.shared.recents.utilities.Utilities.isTablet; @@ -55,6 +54,7 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.statusbar.CommandQueue; @@ -87,6 +87,7 @@ public class NavigationBarController implements private final NavigationBarComponent.Factory mNavigationBarComponentFactory; private FeatureFlags mFeatureFlags; private final SecureSettings mSecureSettings; + private final DisplayTracker mDisplayTracker; private final DisplayManager mDisplayManager; private final TaskbarDelegate mTaskbarDelegate; private int mNavMode; @@ -119,12 +120,14 @@ public class NavigationBarController implements Optional<Pip> pipOptional, Optional<BackAnimation> backAnimation, FeatureFlags featureFlags, - SecureSettings secureSettings) { + SecureSettings secureSettings, + DisplayTracker displayTracker) { mContext = context; mHandler = mainHandler; mNavigationBarComponentFactory = navigationBarComponentFactory; mFeatureFlags = featureFlags; mSecureSettings = secureSettings; + mDisplayTracker = displayTracker; mDisplayManager = mContext.getSystemService(DisplayManager.class); commandQueue.addCallback(this); configurationController.addCallback(this); @@ -296,9 +299,10 @@ public class NavigationBarController implements // Don't need to create nav bar on the default display if we initialize TaskBar. final boolean shouldCreateDefaultNavbar = includeDefaultDisplay && !initializeTaskbarIfNecessary(); - Display[] displays = mDisplayManager.getDisplays(); + Display[] displays = mDisplayTracker.getAllDisplays(); for (Display display : displays) { - if (shouldCreateDefaultNavbar || display.getDisplayId() != DEFAULT_DISPLAY) { + if (shouldCreateDefaultNavbar + || display.getDisplayId() != mDisplayTracker.getDefaultDisplayId()) { createNavigationBar(display, null /* savedState */, result); } } @@ -317,7 +321,7 @@ public class NavigationBarController implements } final int displayId = display.getDisplayId(); - final boolean isOnDefaultDisplay = displayId == DEFAULT_DISPLAY; + final boolean isOnDefaultDisplay = displayId == mDisplayTracker.getDefaultDisplayId(); // We may show TaskBar on the default display for large screen device. Don't need to create // navigation bar for this case. @@ -412,7 +416,7 @@ public class NavigationBarController implements /** @return {@link NavigationBarView} on the default display. */ public @Nullable NavigationBarView getDefaultNavigationBarView() { - return getNavigationBarView(DEFAULT_DISPLAY); + return getNavigationBarView(mDisplayTracker.getDefaultDisplayId()); } /** @@ -433,7 +437,8 @@ public class NavigationBarController implements final NavigationBarView navBarView = getNavigationBarView(displayId); if (navBarView != null) { navBarView.showPinningEnterExitToast(entering); - } else if (displayId == DEFAULT_DISPLAY && mTaskbarDelegate.isInitialized()) { + } else if (displayId == mDisplayTracker.getDefaultDisplayId() + && mTaskbarDelegate.isInitialized()) { mTaskbarDelegate.showPinningEnterExitToast(entering); } } @@ -442,7 +447,8 @@ public class NavigationBarController implements final NavigationBarView navBarView = getNavigationBarView(displayId); if (navBarView != null) { navBarView.showPinningEscapeToast(); - } else if (displayId == DEFAULT_DISPLAY && mTaskbarDelegate.isInitialized()) { + } else if (displayId == mDisplayTracker.getDefaultDisplayId() + && mTaskbarDelegate.isInitialized()) { mTaskbarDelegate.showPinningEscapeToast(); } } @@ -459,7 +465,7 @@ public class NavigationBarController implements /** @return {@link NavigationBar} on the default display. */ @Nullable public NavigationBar getDefaultNavigationBar() { - return mNavigationBars.get(DEFAULT_DISPLAY); + return mNavigationBars.get(mDisplayTracker.getDefaultDisplayId()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java index 6793f0163c43..a4de9ffbfa51 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java @@ -24,7 +24,6 @@ import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; import android.util.SparseArray; -import android.view.Display; import android.view.IWallpaperVisibilityListener; import android.view.IWindowManager; import android.view.View; @@ -32,6 +31,7 @@ import android.view.View; import com.android.systemui.R; import com.android.systemui.navigationbar.NavigationBarComponent.NavigationBarScope; import com.android.systemui.navigationbar.buttons.ButtonDispatcher; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarTransitionsController; @@ -65,6 +65,7 @@ public final class NavigationBarTransitions extends BarTransitions implements @org.jetbrains.annotations.NotNull private final IWindowManager mWindowManagerService; private final LightBarTransitionsController mLightTransitionsController; + private final DisplayTracker mDisplayTracker; private final boolean mAllowAutoDimWallpaperNotVisible; private boolean mWallpaperVisible; @@ -89,18 +90,20 @@ public final class NavigationBarTransitions extends BarTransitions implements public NavigationBarTransitions( NavigationBarView view, IWindowManager windowManagerService, - LightBarTransitionsController.Factory lightBarTransitionsControllerFactory) { + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, + DisplayTracker displayTracker) { super(view, R.drawable.nav_background); mView = view; mWindowManagerService = windowManagerService; mLightTransitionsController = lightBarTransitionsControllerFactory.create(this); + mDisplayTracker = displayTracker; mAllowAutoDimWallpaperNotVisible = view.getContext().getResources() .getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper); mDarkIntensityListeners = new ArrayList(); try { mWallpaperVisible = mWindowManagerService.registerWallpaperVisibilityListener( - mWallpaperVisibilityListener, Display.DEFAULT_DISPLAY); + mWallpaperVisibilityListener, mDisplayTracker.getDefaultDisplayId()); } catch (RemoteException e) { } mView.addOnLayoutChangeListener( @@ -126,7 +129,7 @@ public final class NavigationBarTransitions extends BarTransitions implements public void destroy() { try { mWindowManagerService.unregisterWallpaperVisibilityListener(mWallpaperVisibilityListener, - Display.DEFAULT_DISPLAY); + mDisplayTracker.getDefaultDisplayId()); } catch (RemoteException e) { } mLightTransitionsController.destroy(); @@ -135,7 +138,10 @@ public final class NavigationBarTransitions extends BarTransitions implements @Override public void setAutoDim(boolean autoDim) { // Ensure we aren't in gestural nav if we are triggering auto dim - if (autoDim && isGesturalModeOnDefaultDisplay(mView.getContext(), mNavBarMode)) return; + if (autoDim && isGesturalModeOnDefaultDisplay(mView.getContext(), mDisplayTracker, + mNavBarMode)) { + return; + } if (mAutoDim == autoDim) return; mAutoDim = autoDim; applyLightsOut(true, false); @@ -219,7 +225,7 @@ public final class NavigationBarTransitions extends BarTransitions implements @Override public int getTintAnimationDuration() { - if (isGesturalModeOnDefaultDisplay(mView.getContext(), mNavBarMode)) { + if (isGesturalModeOnDefaultDisplay(mView.getContext(), mDisplayTracker, mNavBarMode)) { return Math.max(DEFAULT_COLOR_ADAPT_TRANSITION_TIME, MIN_COLOR_ADAPT_TRANSITION_TIME); } return LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 88c4fd524b79..1a3be8e90b4e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -16,13 +16,11 @@ package com.android.systemui.navigationbar; -import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SEARCH_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; @@ -75,13 +73,12 @@ import com.android.systemui.navigationbar.buttons.NearestTouchFrame; import com.android.systemui.navigationbar.buttons.RotationContextButton; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.Recents; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shared.rotation.FloatingRotationButton; import com.android.systemui.shared.rotation.RotationButton.RotationButtonUpdatesCallback; import com.android.systemui.shared.rotation.RotationButtonController; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.LightBarTransitionsController; @@ -127,6 +124,7 @@ public class NavigationBarView extends FrameLayout { private int mDarkIconColor; private EdgeBackGestureHandler mEdgeBackGestureHandler; + private DisplayTracker mDisplayTracker; private final DeadZone mDeadZone; private NavigationBarTransitions mBarTransitions; @Nullable @@ -361,6 +359,10 @@ public class NavigationBarView extends FrameLayout { mBgExecutor = bgExecutor; } + public void setDisplayTracker(DisplayTracker displayTracker) { + mDisplayTracker = displayTracker; + } + public void setTouchHandler(Gefingerpoken touchHandler) { mTouchHandler = touchHandler; } @@ -558,7 +560,8 @@ public class NavigationBarView extends FrameLayout { } public void setBehavior(@Behavior int behavior) { - mRotationButtonController.onBehaviorChanged(Display.DEFAULT_DISPLAY, behavior); + mRotationButtonController.onBehaviorChanged(mDisplayTracker.getDefaultDisplayId(), + behavior); } @Override @@ -678,7 +681,7 @@ public class NavigationBarView extends FrameLayout { @VisibleForTesting boolean isRecentsButtonDisabled() { return mUseCarModeUi || !isOverviewEnabled() - || getContext().getDisplayId() != Display.DEFAULT_DISPLAY; + || getContext().getDisplayId() != mDisplayTracker.getDefaultDisplayId(); } private Display getContextDisplay() { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java index 1230708d780a..590efbb66454 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java @@ -16,8 +16,6 @@ package com.android.systemui.navigationbar.gestural; -import static android.view.Display.DEFAULT_DISPLAY; - import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE; import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; @@ -56,6 +54,7 @@ import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.NavigationEdgeBackPlugin; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.navigationbar.RegionSamplingHelper; import com.android.systemui.statusbar.VibratorHelper; @@ -289,7 +288,8 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl Context context, LatencyTracker latencyTracker, VibratorHelper vibratorHelper, - @Background Executor backgroundExecutor) { + @Background Executor backgroundExecutor, + DisplayTracker displayTracker) { super(context); mWindowManager = context.getSystemService(WindowManager.class); @@ -365,7 +365,7 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl setVisibility(GONE); - boolean isPrimaryDisplay = mContext.getDisplayId() == DEFAULT_DISPLAY; + boolean isPrimaryDisplay = mContext.getDisplayId() == displayTracker.getDefaultDisplayId(); mRegionSamplingHelper = new RegionSamplingHelper(this, new RegionSamplingHelper.SamplingCallback() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index cfda9fd6cb96..7c2536dac56e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -15,7 +15,6 @@ */ package com.android.systemui.qs.external; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; import android.app.PendingIntent; @@ -63,6 +62,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.settings.DisplayTracker; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; @@ -90,6 +90,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener private final TileServiceManager mServiceManager; private final int mUser; private final CustomTileStatePersister mCustomTileStatePersister; + private final DisplayTracker mDisplayTracker; @Nullable private android.graphics.drawable.Icon mDefaultIcon; @Nullable @@ -120,7 +121,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener String action, Context userContext, CustomTileStatePersister customTileStatePersister, - TileServices tileServices + TileServices tileServices, + DisplayTracker displayTracker ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); @@ -135,6 +137,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener mServiceManager = tileServices.getTileWrapper(this); mService = mServiceManager.getTileService(); mCustomTileStatePersister = customTileStatePersister; + mDisplayTracker = displayTracker; } @Override @@ -310,7 +313,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener mIsShowingDialog = false; try { if (DEBUG) Log.d(TAG, "Removing token"); - mWindowManager.removeWindowToken(mToken, DEFAULT_DISPLAY); + mWindowManager.removeWindowToken(mToken, mDisplayTracker.getDefaultDisplayId()); } catch (RemoteException e) { } } @@ -335,7 +338,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener if (mIsTokenGranted && !mIsShowingDialog) { try { if (DEBUG) Log.d(TAG, "Removing token"); - mWindowManager.removeWindowToken(mToken, DEFAULT_DISPLAY); + mWindowManager.removeWindowToken(mToken, + mDisplayTracker.getDefaultDisplayId()); } catch (RemoteException e) { } mIsTokenGranted = false; @@ -354,7 +358,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener if (mIsTokenGranted) { try { if (DEBUG) Log.d(TAG, "Removing token"); - mWindowManager.removeWindowToken(mToken, DEFAULT_DISPLAY); + mWindowManager.removeWindowToken(mToken, mDisplayTracker.getDefaultDisplayId()); } catch (RemoteException e) { } } @@ -398,8 +402,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener mViewClicked = view; try { if (DEBUG) Log.d(TAG, "Adding token"); - mWindowManager.addWindowToken(mToken, TYPE_QS_DIALOG, DEFAULT_DISPLAY, - null /* options */); + mWindowManager.addWindowToken(mToken, TYPE_QS_DIALOG, + mDisplayTracker.getDefaultDisplayId(), null /* options */); mIsTokenGranted = true; } catch (RemoteException e) { } @@ -566,6 +570,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener final QSLogger mQSLogger; final CustomTileStatePersister mCustomTileStatePersister; private TileServices mTileServices; + final DisplayTracker mDisplayTracker; Context mUserContext; String mSpec = ""; @@ -581,7 +586,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener ActivityStarter activityStarter, QSLogger qsLogger, CustomTileStatePersister customTileStatePersister, - TileServices tileServices + TileServices tileServices, + DisplayTracker displayTracker ) { mQSHostLazy = hostLazy; mBackgroundLooper = backgroundLooper; @@ -593,6 +599,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener mQSLogger = qsLogger; mCustomTileStatePersister = customTileStatePersister; mTileServices = tileServices; + mDisplayTracker = displayTracker; } Builder setSpec(@NonNull String spec) { @@ -623,7 +630,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener action, mUserContext, mCustomTileStatePersister, - mTileServices + mTileServices, + mDisplayTracker ); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index dd7ea7658cb1..a979e5a99fa8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -17,7 +17,6 @@ package com.android.systemui.recents; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; @@ -89,6 +88,7 @@ import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.buttons.KeyButtonView; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shared.recents.IOverviewProxy; @@ -145,6 +145,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private final UserTracker mUserTracker; private final KeyguardUnlockAnimationController mSysuiUnlockAnimationController; private final UiEventLogger mUiEventLogger; + private final DisplayTracker mDisplayTracker; private Region mActiveNavBarRegion; private SurfaceControl mNavigationBarSurface; @@ -226,11 +227,11 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis @Override public void onImeSwitcherPressed() { - // TODO(b/204901476) We're intentionally using DEFAULT_DISPLAY for now since + // TODO(b/204901476) We're intentionally using the default display for now since // Launcher/Taskbar isn't display aware. mContext.getSystemService(InputMethodManager.class) .showInputMethodPickerFromSystem(true /* showAuxiliarySubtypes */, - DEFAULT_DISPLAY); + mDisplayTracker.getDefaultDisplayId()); mUiEventLogger.log(KeyButtonView.NavBarButtonEvent.NAVBAR_IME_SWITCHER_BUTTON_TAP); } @@ -508,6 +509,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis UserTracker userTracker, ScreenLifecycle screenLifecycle, UiEventLogger uiEventLogger, + DisplayTracker displayTracker, KeyguardUnlockAnimationController sysuiUnlockAnimationController, AssistUtils assistUtils, DumpManager dumpManager) { @@ -535,6 +537,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mSysUiState = sysUiState; mSysUiState.addCallback(this::notifySystemUiStateFlags); mUiEventLogger = uiEventLogger; + mDisplayTracker = displayTracker; dumpManager.registerDumpable(getClass().getSimpleName(), this); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt index 01e32b7ada5f..aa8e2c039684 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt @@ -22,7 +22,6 @@ import android.os.Bundle import android.os.RemoteException import android.os.UserHandle import android.util.Log -import android.view.Display import android.view.IRemoteAnimationFinishedCallback import android.view.IRemoteAnimationRunner import android.view.RemoteAnimationAdapter @@ -33,6 +32,7 @@ import com.android.internal.infra.ServiceConnector import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.DisplayTracker import javax.inject.Inject import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineDispatcher @@ -47,6 +47,7 @@ constructor( @Application private val applicationScope: CoroutineScope, @Main private val mainDispatcher: CoroutineDispatcher, private val context: Context, + private val displayTracker: DisplayTracker ) { /** * Execute the given intent with startActivity while performing operations for screenshot action @@ -82,7 +83,7 @@ constructor( val runner = RemoteAnimationAdapter(SCREENSHOT_REMOTE_RUNNER, 0, 0) try { WindowManagerGlobal.getWindowManagerService() - .overridePendingAppTransitionRemote(runner, Display.DEFAULT_DISPLAY) + .overridePendingAppTransitionRemote(runner, displayTracker.defaultDisplayId) } catch (e: Exception) { Log.e(TAG, "Error overriding screenshot app transition", e) } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java index 814b8e90e0dd..4f5cb72438bc 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java @@ -16,8 +16,6 @@ package com.android.systemui.screenshot; -import static android.view.Display.DEFAULT_DISPLAY; - import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_EDIT; import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_SHARE; import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ACTION_INTENT; @@ -35,6 +33,7 @@ import android.util.Log; import android.view.RemoteAnimationAdapter; import android.view.WindowManagerGlobal; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -52,14 +51,17 @@ public class ActionProxyReceiver extends BroadcastReceiver { private final CentralSurfaces mCentralSurfaces; private final ActivityManagerWrapper mActivityManagerWrapper; private final ScreenshotSmartActions mScreenshotSmartActions; + private final DisplayTracker mDisplayTracker; @Inject public ActionProxyReceiver(Optional<CentralSurfaces> centralSurfacesOptional, ActivityManagerWrapper activityManagerWrapper, - ScreenshotSmartActions screenshotSmartActions) { + ScreenshotSmartActions screenshotSmartActions, + DisplayTracker displayTracker) { mCentralSurfaces = centralSurfacesOptional.orElse(null); mActivityManagerWrapper = activityManagerWrapper; mScreenshotSmartActions = screenshotSmartActions; + mDisplayTracker = displayTracker; } @Override @@ -78,7 +80,8 @@ public class ActionProxyReceiver extends BroadcastReceiver { ScreenshotController.SCREENSHOT_REMOTE_RUNNER, 0, 0); try { WindowManagerGlobal.getWindowManagerService() - .overridePendingAppTransitionRemote(runner, DEFAULT_DISPLAY); + .overridePendingAppTransitionRemote(runner, + mDisplayTracker.getDefaultDisplayId()); } catch (Exception e) { Log.e(TAG, "Error overriding screenshot app transition", e); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index adff6e1757f6..9f7d4f08b42d 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -17,7 +17,6 @@ package com.android.systemui.screenshot; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; import static com.android.systemui.flags.Flags.SCREENSHOT_WORK_PROFILE_POLICY; @@ -102,6 +101,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition; import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.util.Assert; import com.google.common.util.concurrent.ListenableFuture; @@ -273,6 +273,7 @@ public class ScreenshotController { private final ScrollCaptureClient mScrollCaptureClient; private final PhoneWindow mWindow; private final DisplayManager mDisplayManager; + private final DisplayTracker mDisplayTracker; private final ScrollCaptureController mScrollCaptureController; private final LongScreenshotData mLongScreenshotHolder; private final boolean mIsLowRamDevice; @@ -331,7 +332,8 @@ public class ScreenshotController { ActionIntentExecutor actionExecutor, UserManager userManager, WorkProfileMessageController workProfileMessageController, - AssistContentRequester assistContentRequester + AssistContentRequester assistContentRequester, + DisplayTracker displayTracker ) { mScreenshotSmartActions = screenshotSmartActions; mNotificationsController = screenshotNotificationsController; @@ -357,6 +359,7 @@ public class ScreenshotController { }); mDisplayManager = requireNonNull(context.getSystemService(DisplayManager.class)); + mDisplayTracker = displayTracker; final Context displayContext = context.createDisplayContext(getDefaultDisplay()); mContext = (WindowContext) displayContext.createWindowContext(TYPE_SCREENSHOT, null); mWindowManager = mContext.getSystemService(WindowManager.class); @@ -400,7 +403,8 @@ public class ScreenshotController { mCurrentRequestCallback = requestCallback; if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_FULLSCREEN) { Rect bounds = getFullScreenRect(); - screenshot.setBitmap(mImageCapture.captureDisplay(DEFAULT_DISPLAY, bounds)); + screenshot.setBitmap( + mImageCapture.captureDisplay(mDisplayTracker.getDefaultDisplayId(), bounds)); screenshot.setScreenBounds(bounds); } @@ -667,6 +671,7 @@ public class ScreenshotController { setWindowFocusable(false); } }, mActionExecutor, mFlags); + mScreenshotView.setDefaultDisplay(mDisplayTracker.getDefaultDisplayId()); mScreenshotView.setDefaultTimeoutMillis(mScreenshotHandler.getDefaultTimeoutMillis()); mScreenshotView.setOnKeyListener((v, keyCode, event) -> { @@ -700,7 +705,8 @@ public class ScreenshotController { // copy the input Rect, since SurfaceControl.screenshot can mutate it Rect screenRect = new Rect(crop); - Bitmap screenshot = mImageCapture.captureDisplay(DEFAULT_DISPLAY, crop); + Bitmap screenshot = mImageCapture.captureDisplay(mDisplayTracker.getDefaultDisplayId(), + crop); if (screenshot == null) { Log.e(TAG, "takeScreenshotInternal: Screenshot bitmap was null"); @@ -856,7 +862,7 @@ public class ScreenshotController { mLastScrollCaptureRequest.cancel(true); } final ListenableFuture<ScrollCaptureResponse> future = - mScrollCaptureClient.request(DEFAULT_DISPLAY); + mScrollCaptureClient.request(mDisplayTracker.getDefaultDisplayId()); mLastScrollCaptureRequest = future; mLastScrollCaptureRequest.addListener(() -> onScrollCaptureResponseReady(future, owner), mMainExecutor); @@ -887,7 +893,8 @@ public class ScreenshotController { mScreenshotView.showScrollChip(response.getPackageName(), /* onClick */ () -> { DisplayMetrics displayMetrics = new DisplayMetrics(); getDefaultDisplay().getRealMetrics(displayMetrics); - Bitmap newScreenshot = mImageCapture.captureDisplay(DEFAULT_DISPLAY, + Bitmap newScreenshot = mImageCapture.captureDisplay( + mDisplayTracker.getDefaultDisplayId(), new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)); mScreenshotView.prepareScrollingTransition(response, mScreenBitmap, newScreenshot, @@ -951,7 +958,8 @@ public class ScreenshotController { SCREENSHOT_REMOTE_RUNNER, 0, 0); try { WindowManagerGlobal.getWindowManagerService() - .overridePendingAppTransitionRemote(runner, DEFAULT_DISPLAY); + .overridePendingAppTransitionRemote(runner, + mDisplayTracker.getDefaultDisplayId()); } catch (Exception e) { Log.e(TAG, "Error overriding screenshot app transition", e); } @@ -1289,7 +1297,7 @@ public class ScreenshotController { } private Display getDefaultDisplay() { - return mDisplayManager.getDisplay(DEFAULT_DISPLAY); + return mDisplayManager.getDisplay(mDisplayTracker.getDefaultDisplayId()); } private boolean allowLongScreenshots() { diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt index 3a3528606302..21a73100da06 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt @@ -32,12 +32,12 @@ import android.os.RemoteException import android.os.UserHandle import android.os.UserManager import android.util.Log -import android.view.Display.DEFAULT_DISPLAY import com.android.internal.annotations.VisibleForTesting import com.android.internal.infra.ServiceConnector import com.android.systemui.SystemUIService import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.settings.DisplayTracker import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo import java.util.Arrays import javax.inject.Inject @@ -52,6 +52,7 @@ internal open class ScreenshotPolicyImpl @Inject constructor( private val userMgr: UserManager, private val atmService: IActivityTaskManager, @Background val bgDispatcher: CoroutineDispatcher, + private val displayTracker: DisplayTracker ) : ScreenshotPolicy { private val proxyConnector: ServiceConnector<IScreenshotProxy> = @@ -64,7 +65,7 @@ internal open class ScreenshotPolicyImpl @Inject constructor( ) override fun getDefaultDisplayId(): Int { - return DEFAULT_DISPLAY + return displayTracker.defaultDisplayId } override suspend fun isManagedProfile(@UserIdInt userId: Int): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index ce7f2e72a54d..8b73a57ffa46 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -135,6 +135,7 @@ public class ScreenshotView extends FrameLayout implements private final AccessibilityManager mAccessibilityManager; private final GestureDetector mSwipeDetector; + private int mDefaultDisplay = Display.DEFAULT_DISPLAY; private int mNavMode; private boolean mOrientationPortrait; private boolean mDirectionLTR; @@ -326,7 +327,7 @@ public class ScreenshotView extends FrameLayout implements private void startInputListening() { stopInputListening(); - mInputMonitor = new InputMonitorCompat("Screenshot", Display.DEFAULT_DISPLAY); + mInputMonitor = new InputMonitorCompat("Screenshot", mDefaultDisplay); mInputEventReceiver = mInputMonitor.getInputReceiver( Looper.getMainLooper(), Choreographer.getInstance(), ev -> { if (ev instanceof MotionEvent) { @@ -484,6 +485,10 @@ public class ScreenshotView extends FrameLayout implements mPackageName = packageName; } + void setDefaultDisplay(int displayId) { + mDefaultDisplay = displayId; + } + void updateInsets(WindowInsets insets) { int orientation = mContext.getResources().getConfiguration().orientation; mOrientationPortrait = (orientation == ORIENTATION_PORTRAIT); diff --git a/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt new file mode 100644 index 000000000000..bb7f721ad61f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2022 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.settings + +import android.view.Display +import java.util.concurrent.Executor + +/** + * Display tracker for SystemUI. + * + * This tracker provides async access to display information, as well as callbacks for display + * changes. + */ +interface DisplayTracker { + + /** The id for the default display for the current SystemUI instance. */ + val defaultDisplayId: Int + + /** All displays that should be associated with the current SystemUI instance. */ + val allDisplays: Array<Display> + + /** + * Add a [Callback] to be notified of display changes, including additions, removals, and + * configuration changes, on a particular [Executor]. + */ + fun addDisplayChangeCallback(callback: Callback, executor: Executor) + + /** + * Add a [Callback] to be notified of display brightness changes, on a particular [Executor]. + * This callback will trigger Callback#onDisplayChanged for a display brightness change. + */ + fun addBrightnessChangeCallback(callback: Callback, executor: Executor) + + /** Remove a [Callback] previously added. */ + fun removeCallback(callback: Callback) + + /** Ćallback for notifying of changes. */ + interface Callback { + + /** Notifies that a display has been added. */ + @JvmDefault fun onDisplayAdded(displayId: Int) {} + + /** Notifies that a display has been removed. */ + @JvmDefault fun onDisplayRemoved(displayId: Int) {} + + /** Notifies a display has been changed */ + @JvmDefault fun onDisplayChanged(displayId: Int) {} + } +} diff --git a/packages/SystemUI/src/com/android/systemui/settings/DisplayTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/DisplayTrackerImpl.kt new file mode 100644 index 000000000000..5169f88c373c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/settings/DisplayTrackerImpl.kt @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2022 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.settings + +import android.hardware.display.DisplayManager +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS +import android.os.Handler +import android.view.Display +import androidx.annotation.GuardedBy +import androidx.annotation.VisibleForTesting +import androidx.annotation.WorkerThread +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.util.Assert +import java.lang.ref.WeakReference +import java.util.concurrent.Executor + +class DisplayTrackerImpl +internal constructor( + val displayManager: DisplayManager, + @Background val backgroundHandler: Handler +) : DisplayTracker { + override val defaultDisplayId: Int = Display.DEFAULT_DISPLAY + override val allDisplays: Array<Display> + get() = displayManager.displays + + @GuardedBy("displayCallbacks") + private val displayCallbacks: MutableList<DisplayTrackerDataItem> = ArrayList() + @GuardedBy("brightnessCallbacks") + private val brightnessCallbacks: MutableList<DisplayTrackerDataItem> = ArrayList() + + @VisibleForTesting + val displayChangedListener: DisplayManager.DisplayListener = + object : DisplayManager.DisplayListener { + override fun onDisplayAdded(displayId: Int) { + val list = synchronized(displayCallbacks) { displayCallbacks.toList() } + onDisplayAdded(displayId, list) + } + + override fun onDisplayRemoved(displayId: Int) { + val list = synchronized(displayCallbacks) { displayCallbacks.toList() } + onDisplayRemoved(displayId, list) + } + + override fun onDisplayChanged(displayId: Int) { + val list = synchronized(displayCallbacks) { displayCallbacks.toList() } + onDisplayChanged(displayId, list) + } + } + + @VisibleForTesting + val displayBrightnessChangedListener: DisplayManager.DisplayListener = + object : DisplayManager.DisplayListener { + override fun onDisplayAdded(displayId: Int) {} + + override fun onDisplayRemoved(displayId: Int) {} + + override fun onDisplayChanged(displayId: Int) { + val list = synchronized(brightnessCallbacks) { brightnessCallbacks.toList() } + onDisplayChanged(displayId, list) + } + } + + override fun addDisplayChangeCallback(callback: DisplayTracker.Callback, executor: Executor) { + synchronized(displayCallbacks) { + if (displayCallbacks.isEmpty()) { + displayManager.registerDisplayListener(displayChangedListener, backgroundHandler) + } + displayCallbacks.add(DisplayTrackerDataItem(WeakReference(callback), executor)) + } + } + + override fun addBrightnessChangeCallback( + callback: DisplayTracker.Callback, + executor: Executor + ) { + synchronized(brightnessCallbacks) { + if (brightnessCallbacks.isEmpty()) { + displayManager.registerDisplayListener( + displayBrightnessChangedListener, + backgroundHandler, + EVENT_FLAG_DISPLAY_BRIGHTNESS + ) + } + brightnessCallbacks.add(DisplayTrackerDataItem(WeakReference(callback), executor)) + } + } + + override fun removeCallback(callback: DisplayTracker.Callback) { + synchronized(displayCallbacks) { + val changed = displayCallbacks.removeIf { it.sameOrEmpty(callback) } + if (changed && displayCallbacks.isEmpty()) { + displayManager.unregisterDisplayListener(displayChangedListener) + } + } + + synchronized(brightnessCallbacks) { + val changed = brightnessCallbacks.removeIf { it.sameOrEmpty(callback) } + if (changed && brightnessCallbacks.isEmpty()) { + displayManager.unregisterDisplayListener(displayBrightnessChangedListener) + } + } + } + + @WorkerThread + private fun onDisplayAdded(displayId: Int, list: List<DisplayTrackerDataItem>) { + Assert.isNotMainThread() + + notifySubscribers({ onDisplayAdded(displayId) }, list) + } + + @WorkerThread + private fun onDisplayRemoved(displayId: Int, list: List<DisplayTrackerDataItem>) { + Assert.isNotMainThread() + + notifySubscribers({ onDisplayRemoved(displayId) }, list) + } + + @WorkerThread + private fun onDisplayChanged(displayId: Int, list: List<DisplayTrackerDataItem>) { + Assert.isNotMainThread() + + notifySubscribers({ onDisplayChanged(displayId) }, list) + } + + private inline fun notifySubscribers( + crossinline action: DisplayTracker.Callback.() -> Unit, + list: List<DisplayTrackerDataItem> + ) { + list.forEach { + if (it.callback.get() != null) { + it.executor.execute { it.callback.get()?.action() } + } + } + } + + private data class DisplayTrackerDataItem( + val callback: WeakReference<DisplayTracker.Callback>, + val executor: Executor + ) { + fun sameOrEmpty(other: DisplayTracker.Callback): Boolean { + return callback.get()?.equals(other) ?: true + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java index 2f6081bc9f8d..8089d01e7343 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java @@ -27,10 +27,10 @@ import android.content.Context; import android.database.ContentObserver; import android.hardware.display.BrightnessInfo; import android.hardware.display.DisplayManager; -import android.hardware.display.DisplayManager.DisplayListener; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; @@ -49,6 +49,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.BrightnessMirrorController; @@ -78,19 +79,14 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig private final ToggleSlider mControl; private final DisplayManager mDisplayManager; private final UserTracker mUserTracker; + private final DisplayTracker mDisplayTracker; private final IVrManager mVrManager; private final Executor mMainExecutor; private final Handler mBackgroundHandler; private final BrightnessObserver mBrightnessObserver; - private final DisplayListener mDisplayListener = new DisplayListener() { - @Override - public void onDisplayAdded(int displayId) {} - - @Override - public void onDisplayRemoved(int displayId) {} - + private final DisplayTracker.Callback mBrightnessListener = new DisplayTracker.Callback() { @Override public void onDisplayChanged(int displayId) { mBackgroundHandler.post(mUpdateSliderRunnable); @@ -143,14 +139,14 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig cr.registerContentObserver( BRIGHTNESS_FOR_VR_FLOAT_URI, false, this, UserHandle.USER_ALL); - mDisplayManager.registerDisplayListener(mDisplayListener, mHandler, - DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS); + mDisplayTracker.addBrightnessChangeCallback(mBrightnessListener, + new HandlerExecutor(mHandler)); } public void stopObserving() { final ContentResolver cr = mContext.getContentResolver(); cr.unregisterContentObserver(this); - mDisplayManager.unregisterDisplayListener(mDisplayListener); + mDisplayTracker.removeCallback(mBrightnessListener); } } @@ -292,6 +288,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig Context context, ToggleSlider control, UserTracker userTracker, + DisplayTracker displayTracker, @Main Executor mainExecutor, @Background Handler bgHandler) { mContext = context; @@ -300,6 +297,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; mUserTracker = userTracker; + mDisplayTracker = displayTracker; mBrightnessObserver = new BrightnessObserver(mHandler); mDisplayId = mContext.getDisplayId(); @@ -450,6 +448,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig public static class Factory { private final Context mContext; private final UserTracker mUserTracker; + private final DisplayTracker mDisplayTracker; private final Executor mMainExecutor; private final Handler mBackgroundHandler; @@ -457,10 +456,12 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig public Factory( Context context, UserTracker userTracker, + DisplayTracker displayTracker, @Main Executor mainExecutor, @Background Handler bgHandler) { mContext = context; mUserTracker = userTracker; + mDisplayTracker = displayTracker; mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; } @@ -471,6 +472,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig mContext, toggleSlider, mUserTracker, + mDisplayTracker, mMainExecutor, mBackgroundHandler); } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java index e208be957510..8879501fa03d 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java @@ -36,6 +36,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import java.util.List; @@ -49,16 +50,19 @@ public class BrightnessDialog extends Activity { private BrightnessController mBrightnessController; private final BrightnessSliderController.Factory mToggleSliderFactory; private final UserTracker mUserTracker; + private final DisplayTracker mDisplayTracker; private final Executor mMainExecutor; private final Handler mBackgroundHandler; @Inject public BrightnessDialog( UserTracker userTracker, + DisplayTracker displayTracker, BrightnessSliderController.Factory factory, @Main Executor mainExecutor, @Background Handler bgHandler) { mUserTracker = userTracker; + mDisplayTracker = displayTracker; mToggleSliderFactory = factory; mMainExecutor = mainExecutor; mBackgroundHandler = bgHandler; @@ -106,7 +110,7 @@ public class BrightnessDialog extends Activity { frame.addView(controller.getRootView(), MATCH_PARENT, WRAP_CONTENT); mBrightnessController = new BrightnessController( - this, controller, mUserTracker, mMainExecutor, mBackgroundHandler); + this, controller, mUserTracker, mDisplayTracker, mMainExecutor, mBackgroundHandler); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/settings/dagger/MultiUserUtilsModule.java b/packages/SystemUI/src/com/android/systemui/settings/dagger/MultiUserUtilsModule.java index 809fa2976911..e9a1dd7e6ecb 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/dagger/MultiUserUtilsModule.java +++ b/packages/SystemUI/src/com/android/systemui/settings/dagger/MultiUserUtilsModule.java @@ -19,6 +19,7 @@ package com.android.systemui.settings.dagger; import android.app.ActivityManager; import android.app.IActivityManager; import android.content.Context; +import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.UserManager; @@ -26,6 +27,8 @@ import com.android.systemui.CoreStartable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dump.DumpManager; +import com.android.systemui.settings.DisplayTracker; +import com.android.systemui.settings.DisplayTrackerImpl; import com.android.systemui.settings.UserContentResolverProvider; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserFileManager; @@ -69,6 +72,15 @@ public abstract class MultiUserUtilsModule { return tracker; } + @SysUISingleton + @Provides + static DisplayTracker provideDisplayTracker( + DisplayManager displayManager, + @Background Handler handler + ) { + return new DisplayTrackerImpl(displayManager, handler); + } + @Binds @IntoMap @ClassKey(UserFileManagerImpl.class) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 17583793701c..f2e729d7967c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -20,7 +20,6 @@ import static android.app.StatusBarManager.DISABLE2_NONE; import static android.app.StatusBarManager.DISABLE_NONE; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import android.annotation.Nullable; @@ -38,7 +37,6 @@ import android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode; import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; -import android.hardware.display.DisplayManager; import android.hardware.fingerprint.IUdfpsHbmListener; import android.inputmethodservice.InputMethodService.BackDispositionMode; import android.media.INearbyMediaDevicesProvider; @@ -46,6 +44,7 @@ import android.media.MediaRoute2Info; import android.os.Binder; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -60,6 +59,7 @@ import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.android.internal.os.SomeArgs; import com.android.internal.statusbar.IAddTileResultCallback; @@ -70,6 +70,7 @@ import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.GcUtils; import com.android.internal.view.AppearanceRegion; import com.android.systemui.dump.DumpHandler; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.commandline.CommandRegistry; import com.android.systemui.statusbar.policy.CallbackController; @@ -89,8 +90,7 @@ import java.util.ArrayList; * are coalesced, note that they are all idempotent. */ public class CommandQueue extends IStatusBar.Stub implements - CallbackController<Callbacks>, - DisplayManager.DisplayListener { + CallbackController<Callbacks> { private static final String TAG = CommandQueue.class.getSimpleName(); private static final int INDEX_MASK = 0xffff; @@ -192,6 +192,7 @@ public class CommandQueue extends IStatusBar.Stub implements private ProtoTracer mProtoTracer; private final @Nullable CommandRegistry mRegistry; private final @Nullable DumpHandler mDumpHandler; + private final @Nullable DisplayTracker mDisplayTracker; /** * These methods are called back on the main thread. @@ -351,7 +352,7 @@ public class CommandQueue extends IStatusBar.Stub implements } /** - * @see DisplayManager.DisplayListener#onDisplayRemoved(int) + * @see DisplayTracker.Callback#onDisplayRemoved(int) */ default void onDisplayRemoved(int displayId) { } @@ -500,12 +501,14 @@ public class CommandQueue extends IStatusBar.Stub implements default void showMediaOutputSwitcher(String packageName) {} } - public CommandQueue(Context context) { - this(context, null, null, null); + @VisibleForTesting + public CommandQueue(Context context, DisplayTracker displayTracker) { + this(context, displayTracker, null, null, null); } public CommandQueue( Context context, + DisplayTracker displayTracker, ProtoTracer protoTracer, CommandRegistry registry, DumpHandler dumpHandler @@ -513,33 +516,28 @@ public class CommandQueue extends IStatusBar.Stub implements mProtoTracer = protoTracer; mRegistry = registry; mDumpHandler = dumpHandler; - context.getSystemService(DisplayManager.class).registerDisplayListener(this, mHandler); + mDisplayTracker = displayTracker; + mDisplayTracker.addDisplayChangeCallback(new DisplayTracker.Callback() { + @Override + public void onDisplayRemoved(int displayId) { + synchronized (mLock) { + mDisplayDisabled.remove(displayId); + } + // This callback is registered with {@link #mHandler} that already posts to run + // on main thread, so it is safe to dispatch directly. + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + mCallbacks.get(i).onDisplayRemoved(displayId); + } + } + }, new HandlerExecutor(mHandler)); // We always have default display. - setDisabled(DEFAULT_DISPLAY, DISABLE_NONE, DISABLE2_NONE); + setDisabled(mDisplayTracker.getDefaultDisplayId(), DISABLE_NONE, DISABLE2_NONE); } - @Override - public void onDisplayAdded(int displayId) { } - - @Override - public void onDisplayRemoved(int displayId) { - synchronized (mLock) { - mDisplayDisabled.remove(displayId); - } - // This callback is registered with {@link #mHandler} that already posts to run on main - // thread, so it is safe to dispatch directly. - for (int i = mCallbacks.size() - 1; i >= 0; i--) { - mCallbacks.get(i).onDisplayRemoved(displayId); - } - } - - @Override - public void onDisplayChanged(int displayId) { } - // TODO(b/118592525): add multi-display support if needed. public boolean panelsEnabled() { - final int disabled1 = getDisabled1(DEFAULT_DISPLAY); - final int disabled2 = getDisabled2(DEFAULT_DISPLAY); + final int disabled1 = getDisabled1(mDisplayTracker.getDefaultDisplayId()); + final int disabled2 = getDisabled2(mDisplayTracker.getDefaultDisplayId()); return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0 && (disabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0; } 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 098c6175a93e..d7568a9bd89c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java @@ -39,6 +39,7 @@ import com.android.systemui.media.controls.pipeline.MediaDataManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.carrier.QSCarrierGroupController; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.ActionClickLogger; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.MediaArtworkProcessor; @@ -184,11 +185,12 @@ public interface CentralSurfacesDependenciesModule { @SysUISingleton static CommandQueue provideCommandQueue( Context context, + DisplayTracker displayTracker, ProtoTracer protoTracer, CommandRegistry registry, DumpHandler dumpHandler ) { - return new CommandQueue(context, protoTracer, registry, dumpHandler); + return new CommandQueue(context, displayTracker, protoTracer, registry, dumpHandler); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt index 3a4731a5a6aa..92a8356b7f07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt @@ -20,9 +20,9 @@ package com.android.systemui.statusbar.gesture import android.annotation.CallSuper import android.os.Looper import android.view.Choreographer -import android.view.Display import android.view.InputEvent import android.view.MotionEvent +import com.android.systemui.settings.DisplayTracker import com.android.systemui.shared.system.InputChannelCompat import com.android.systemui.shared.system.InputMonitorCompat @@ -38,7 +38,8 @@ import com.android.systemui.shared.system.InputMonitorCompat * gesture is detected, they should call [onGestureDetected] (which will notify the callbacks). */ abstract class GenericGestureDetector( - private val tag: String + private val tag: String, + private val displayTracker: DisplayTracker ) { /** * Active callbacks, each associated with a tag. Gestures will only be monitored if @@ -86,7 +87,7 @@ abstract class GenericGestureDetector( internal open fun startGestureListening() { stopGestureListening() - inputMonitor = InputMonitorCompat(tag, Display.DEFAULT_DISPLAY).also { + inputMonitor = InputMonitorCompat(tag, displayTracker.defaultDisplayId).also { inputReceiver = it.getInputReceiver( Looper.getMainLooper(), Choreographer.getInstance(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt index 5ab3d7ce9bec..693ae6617feb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.gesture import android.content.Context import android.view.MotionEvent import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.window.StatusBarWindowController import javax.inject.Inject @@ -28,9 +29,10 @@ class SwipeStatusBarAwayGestureHandler @Inject constructor( context: Context, + displayTracker: DisplayTracker, logger: SwipeUpGestureLogger, private val statusBarWindowController: StatusBarWindowController, -) : SwipeUpGestureHandler(context, logger, loggerTag = LOGGER_TAG) { +) : SwipeUpGestureHandler(context, displayTracker, logger, loggerTag = LOGGER_TAG) { override fun startOfGestureIsWithinBounds(ev: MotionEvent): Boolean { // Gesture starts just below the status bar return ev.y >= statusBarWindowController.statusBarHeight && diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureHandler.kt index 5ecc35ca4576..452762d185a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureHandler.kt @@ -24,6 +24,7 @@ import android.view.MotionEvent.ACTION_DOWN import android.view.MotionEvent.ACTION_MOVE import android.view.MotionEvent.ACTION_UP import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.DisplayTracker /** * A class to detect a generic "swipe up" gesture. To be notified when the swipe up gesture is @@ -32,9 +33,10 @@ import com.android.systemui.dagger.SysUISingleton @SysUISingleton abstract class SwipeUpGestureHandler( context: Context, + displayTracker: DisplayTracker, private val logger: SwipeUpGestureLogger, - private val loggerTag: String, -) : GenericGestureDetector(SwipeUpGestureHandler::class.simpleName!!) { + private val loggerTag: String +) : GenericGestureDetector(SwipeUpGestureHandler::class.simpleName!!, displayTracker) { private var startY: Float = 0f private var startTime: Long = 0L diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt index 7ffb07aa77d0..a901d5979576 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt @@ -21,6 +21,7 @@ import android.view.GestureDetector import android.view.InputEvent import android.view.MotionEvent import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.DisplayTracker import javax.inject.Inject /** @@ -29,8 +30,9 @@ import javax.inject.Inject */ @SysUISingleton class TapGestureDetector @Inject constructor( - private val context: Context -) : GenericGestureDetector(TapGestureDetector::class.simpleName!!) { + private val context: Context, + displayTracker: DisplayTracker +) : GenericGestureDetector(TapGestureDetector::class.simpleName!!, displayTracker) { private val gestureListener = object : GestureDetector.SimpleOnGestureListener() { override fun onSingleTapUp(e: MotionEvent): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index 4d1454232853..fe2a9137c1a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone; -import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; @@ -38,6 +37,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.DarkIconDispatcher; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; import java.io.PrintWriter; @@ -94,7 +94,8 @@ public class LightBarController implements BatteryController.BatteryStateChangeC DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, - DumpManager dumpManager) { + DumpManager dumpManager, + DisplayTracker displayTracker) { mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone); mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone); mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher; @@ -104,7 +105,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC mNavigationMode = mode; }); - if (ctx.getDisplayId() == DEFAULT_DISPLAY) { + if (ctx.getDisplayId() == displayTracker.getDefaultDisplayId()) { dumpManager.registerDumpable(getClass().getSimpleName(), this); } } @@ -317,24 +318,27 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final BatteryController mBatteryController; private final NavigationModeController mNavModeController; private final DumpManager mDumpManager; + private final DisplayTracker mDisplayTracker; @Inject public Factory( DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, - DumpManager dumpManager) { + DumpManager dumpManager, + DisplayTracker displayTracker) { mDarkIconDispatcher = darkIconDispatcher; mBatteryController = batteryController; mNavModeController = navModeController; mDumpManager = dumpManager; + mDisplayTracker = displayTracker; } /** Create an {@link LightBarController} */ public LightBarController create(Context context) { return new LightBarController(context, mDarkIconDispatcher, mBatteryController, - mNavModeController, mDumpManager); + mNavModeController, mDumpManager, mDisplayTracker); } } } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandler.kt index 6e3cb4823afa..9dbc4b398ab3 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandler.kt @@ -19,6 +19,7 @@ package com.android.systemui.temporarydisplay.chipbar import android.content.Context import android.view.MotionEvent import android.view.View +import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.gesture.SwipeUpGestureHandler import com.android.systemui.statusbar.gesture.SwipeUpGestureLogger import com.android.systemui.util.boundsOnScreen @@ -31,8 +32,9 @@ import com.android.systemui.util.boundsOnScreen */ class SwipeChipbarAwayGestureHandler( context: Context, + displayTracker: DisplayTracker, logger: SwipeUpGestureLogger, -) : SwipeUpGestureHandler(context, logger, loggerTag = LOGGER_TAG) { +) : SwipeUpGestureHandler(context, displayTracker, logger, loggerTag = LOGGER_TAG) { private var viewFetcher: () -> View? = { null } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt index 933c0604a3b9..b1be4045eb43 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt @@ -21,6 +21,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBufferFactory import com.android.systemui.media.taptotransfer.MediaTttFlags import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.gesture.SwipeUpGestureLogger import com.android.systemui.temporarydisplay.chipbar.SwipeChipbarAwayGestureHandler import dagger.Module @@ -41,10 +42,11 @@ interface TemporaryDisplayModule { fun provideSwipeChipbarAwayGestureHandler( mediaTttFlags: MediaTttFlags, context: Context, + displayTracker: DisplayTracker, logger: SwipeUpGestureLogger, ): SwipeChipbarAwayGestureHandler? { return if (mediaTttFlags.isMediaTttDismissGestureEnabled()) { - SwipeChipbarAwayGestureHandler(context, logger) + SwipeChipbarAwayGestureHandler(context, displayTracker, logger) } else { null } diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt index 0069bb545ef4..19a0866cd0a8 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt @@ -38,6 +38,7 @@ import android.view.WindowlessWindowManager import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.LightRevealEffect import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.LinearLightRevealEffect @@ -68,6 +69,7 @@ constructor( @Main private val executor: Executor, private val threadFactory: ThreadFactory, private val rotationChangeProvider: RotationChangeProvider, + private val displayTracker: DisplayTracker ) { private val transitionListener = TransitionListener() @@ -104,7 +106,7 @@ constructor( .setName("unfold-overlay-container") displayAreaHelper.get().attachToRootDisplayArea( - Display.DEFAULT_DISPLAY, + displayTracker.defaultDisplayId, containerBuilder ) { builder -> executor.execute { diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java index d54de3fa9a3f..c2727fc32465 100644 --- a/packages/SystemUI/src/com/android/systemui/util/Utils.java +++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java @@ -14,8 +14,6 @@ package com.android.systemui.util; -import static android.view.Display.DEFAULT_DISPLAY; - import android.Manifest; import android.content.Context; import android.content.Intent; @@ -26,6 +24,7 @@ import android.view.DisplayCutout; import com.android.internal.policy.SystemBarUtils; import com.android.systemui.R; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.QuickStepContract; import java.util.List; @@ -71,8 +70,9 @@ public class Utils { * {@link android.view.WindowManagerPolicyConstants#NAV_BAR_MODE_GESTURAL} AND * the context is that of the default display */ - public static boolean isGesturalModeOnDefaultDisplay(Context context, int navMode) { - return context.getDisplayId() == DEFAULT_DISPLAY + public static boolean isGesturalModeOnDefaultDisplay(Context context, + DisplayTracker displayTracker, int navMode) { + return context.getDisplayId() == displayTracker.getDefaultDisplayId() && QuickStepContract.isGesturalMode(navMode); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 8ef98f08c60d..bd60401034b3 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -16,8 +16,6 @@ package com.android.systemui.wmshell; -import static android.view.Display.DEFAULT_DISPLAY; - import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED; @@ -50,6 +48,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.notetask.NoteTaskInitializer; +import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.tracing.ProtoTraceable; import com.android.systemui.statusbar.CommandQueue; @@ -124,6 +123,7 @@ public final class WMShell implements private final WakefulnessLifecycle mWakefulnessLifecycle; private final ProtoTracer mProtoTracer; private final UserTracker mUserTracker; + private final DisplayTracker mDisplayTracker; private final NoteTaskInitializer mNoteTaskInitializer; private final Executor mSysUiMainExecutor; @@ -186,6 +186,7 @@ public final class WMShell implements ProtoTracer protoTracer, WakefulnessLifecycle wakefulnessLifecycle, UserTracker userTracker, + DisplayTracker displayTracker, NoteTaskInitializer noteTaskInitializer, @Main Executor sysUiMainExecutor) { mContext = context; @@ -203,6 +204,7 @@ public final class WMShell implements mWakefulnessLifecycle = wakefulnessLifecycle; mProtoTracer = protoTracer; mUserTracker = userTracker; + mDisplayTracker = displayTracker; mNoteTaskInitializer = noteTaskInitializer; mSysUiMainExecutor = sysUiMainExecutor; } @@ -268,7 +270,7 @@ public final class WMShell implements public void onStartTransition(boolean isEntering) { mSysUiMainExecutor.execute(() -> { mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE, - true).commitUpdate(DEFAULT_DISPLAY); + true).commitUpdate(mDisplayTracker.getDefaultDisplayId()); }); } @@ -276,7 +278,7 @@ public final class WMShell implements public void onStartFinished(Rect bounds) { mSysUiMainExecutor.execute(() -> { mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE, - true).commitUpdate(DEFAULT_DISPLAY); + true).commitUpdate(mDisplayTracker.getDefaultDisplayId()); }); } @@ -284,7 +286,7 @@ public final class WMShell implements public void onStopFinished(Rect bounds) { mSysUiMainExecutor.execute(() -> { mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE, - false).commitUpdate(DEFAULT_DISPLAY); + false).commitUpdate(mDisplayTracker.getDefaultDisplayId()); }); } }); @@ -333,7 +335,8 @@ public final class WMShell implements @Override public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { - if (displayId == DEFAULT_DISPLAY && (vis & InputMethodService.IME_VISIBLE) != 0) { + if (displayId == mDisplayTracker.getDefaultDisplayId() + && (vis & InputMethodService.IME_VISIBLE) != 0) { oneHanded.stopOneHanded( OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_POP_IME_OUT); } @@ -346,7 +349,7 @@ public final class WMShell implements @Override public void onVisibilityChanged(boolean hasFreeformTasks) { mSysUiState.setFlag(SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE, hasFreeformTasks) - .commitUpdate(DEFAULT_DISPLAY); + .commitUpdate(mDisplayTracker.getDefaultDisplayId()); } }, mSysUiMainExecutor); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardDisplayManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardDisplayManagerTest.java index 01365b43b4b8..1a365ef9db17 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardDisplayManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardDisplayManagerTest.java @@ -25,9 +25,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerGlobal; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -39,6 +37,7 @@ import androidx.test.filters.SmallTest; import com.android.keyguard.dagger.KeyguardStatusViewComponent; import com.android.systemui.SysuiTestCase; import com.android.systemui.navigationbar.NavigationBarController; +import com.android.systemui.settings.FakeDisplayTracker; import org.junit.Before; import org.junit.Test; @@ -58,12 +57,12 @@ public class KeyguardDisplayManagerTest extends SysuiTestCase { @Mock private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; @Mock - private DisplayManager mDisplayManager; - @Mock private KeyguardDisplayManager.KeyguardPresentation mKeyguardPresentation; + private Executor mMainExecutor = Runnable::run; private Executor mBackgroundExecutor = Runnable::run; private KeyguardDisplayManager mManager; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); // The default and secondary displays are both in the default group private Display mDefaultDisplay; @@ -75,9 +74,9 @@ public class KeyguardDisplayManagerTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext.addMockSystemService(DisplayManager.class, mDisplayManager); mManager = spy(new KeyguardDisplayManager(mContext, () -> mNavigationBarController, - mKeyguardStatusViewComponentFactory, mBackgroundExecutor)); + mKeyguardStatusViewComponentFactory, mDisplayTracker, mMainExecutor, + mBackgroundExecutor)); doReturn(mKeyguardPresentation).when(mManager).createPresentation(any()); mDefaultDisplay = new Display(DisplayManagerGlobal.getInstance(), Display.DEFAULT_DISPLAY, @@ -96,23 +95,21 @@ public class KeyguardDisplayManagerTest extends SysuiTestCase { @Test public void testShow_defaultDisplayOnly() { - when(mDisplayManager.getDisplays()).thenReturn(new Display[]{mDefaultDisplay}); + mDisplayTracker.setAllDisplays(new Display[]{mDefaultDisplay}); mManager.show(); verify(mManager, never()).createPresentation(any()); } @Test public void testShow_includeSecondaryDisplay() { - when(mDisplayManager.getDisplays()).thenReturn( - new Display[]{mDefaultDisplay, mSecondaryDisplay}); + mDisplayTracker.setAllDisplays(new Display[]{mDefaultDisplay, mSecondaryDisplay}); mManager.show(); verify(mManager, times(1)).createPresentation(eq(mSecondaryDisplay)); } @Test public void testShow_includeAlwaysUnlockedDisplay() { - when(mDisplayManager.getDisplays()).thenReturn( - new Display[]{mDefaultDisplay, mAlwaysUnlockedDisplay}); + mDisplayTracker.setAllDisplays(new Display[]{mDefaultDisplay, mAlwaysUnlockedDisplay}); mManager.show(); verify(mManager, never()).createPresentation(any()); @@ -120,9 +117,8 @@ public class KeyguardDisplayManagerTest extends SysuiTestCase { @Test public void testShow_includeSecondaryAndAlwaysUnlockedDisplays() { - when(mDisplayManager.getDisplays()).thenReturn( + mDisplayTracker.setAllDisplays( new Display[]{mDefaultDisplay, mSecondaryDisplay, mAlwaysUnlockedDisplay}); - mManager.show(); verify(mManager, times(1)).createPresentation(eq(mSecondaryDisplay)); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewControllerTest.java index 06082b61ec26..68dc6c04bc79 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewControllerTest.java @@ -29,6 +29,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardSliceProvider; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; @@ -52,6 +53,7 @@ public class KeyguardSliceViewControllerTest extends SysuiTestCase { private ConfigurationController mConfigurationController; @Mock private ActivityStarter mActivityStarter; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private DumpManager mDumpManager = new DumpManager(); private KeyguardSliceViewController mController; @@ -63,7 +65,7 @@ public class KeyguardSliceViewControllerTest extends SysuiTestCase { when(mView.getContext()).thenReturn(mContext); mController = new KeyguardSliceViewController( mView, mActivityStarter, mConfigurationController, - mTunerService, mDumpManager); + mTunerService, mDumpManager, mDisplayTracker); mController.setupUri(KeyguardSliceProvider.KEYGUARD_SLICE_URI); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 0627fc6c542f..e918c1cc9b10 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -89,6 +89,7 @@ import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl; import com.android.systemui.decor.PrivacyDotDecorProviderFactory; import com.android.systemui.decor.RoundedCornerResDelegate; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.tuner.TunerService; @@ -117,6 +118,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { private DisplayManager mDisplayManager; private SecureSettings mSecureSettings; private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); + private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private FakeThreadFactory mThreadFactory; private ArrayList<DecorProvider> mPrivacyDecorProviders; private ArrayList<DecorProvider> mFaceScanningProviders; @@ -220,7 +222,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { mExecutor)); mScreenDecorations = spy(new ScreenDecorations(mContext, mExecutor, mSecureSettings, - mTunerService, mUserTracker, mDotViewController, mThreadFactory, + mTunerService, mUserTracker, mDisplayTracker, mDotViewController, mThreadFactory, mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory) { @Override public void start() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java index 58b4af43a9b7..da419d177d46 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java @@ -39,6 +39,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.CommandQueue; import org.junit.Before; @@ -76,6 +77,7 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { private IWindowMagnificationConnection mIWindowMagnificationConnection; private WindowMagnification mWindowMagnification; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Before public void setUp() throws Exception { @@ -88,7 +90,7 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { any(IWindowMagnificationConnection.class)); mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, - mModeSwitchesController, mSysUiState, mOverviewProxyService); + mModeSwitchesController, mSysUiState, mOverviewProxyService, mDisplayTracker); mWindowMagnification.mMagnificationControllerSupplier = new FakeControllerSupplier( mContext.getSystemService(DisplayManager.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java index cdf3f654899e..f4505f5a914e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -78,6 +78,7 @@ import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.model.SysUiState; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.util.leak.ReferenceTestUtils; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.utils.os.FakeHandler; @@ -120,11 +121,12 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { private Handler mHandler; private TestableWindowManager mWindowManager; - private SysUiState mSysUiState = new SysUiState(); + private SysUiState mSysUiState; private Resources mResources; private WindowMagnificationAnimationController mWindowMagnificationAnimationController; private WindowMagnificationController mWindowMagnificationController; private Instrumentation mInstrumentation; + private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private final ValueAnimator mValueAnimator = ValueAnimator.ofFloat(0, 1.0f).setDuration(0); @Before @@ -143,6 +145,7 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { return null; }).when(mSfVsyncFrameProvider).postFrameCallback( any(FrameCallback.class)); + mSysUiState = new SysUiState(mDisplayTracker); mSysUiState.addCallback(Mockito.mock(SysUiState.SysUiStateCallback.class)); when(mSecureSettings.getIntForUser(anyString(), anyInt(), anyInt())).then( returnsSecondArg()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java index ccf2f8b16f8a..f75dc03c7eae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -45,6 +45,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.CommandQueue; import org.junit.Before; @@ -74,6 +75,8 @@ public class WindowMagnificationTest extends SysuiTestCase { private CommandQueue mCommandQueue; private WindowMagnification mWindowMagnification; private OverviewProxyListener mOverviewProxyListener; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -87,10 +90,10 @@ public class WindowMagnificationTest extends SysuiTestCase { when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState); - mCommandQueue = new CommandQueue(getContext()); + mCommandQueue = new CommandQueue(getContext(), new FakeDisplayTracker(getContext())); mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, - mSysUiState, mOverviewProxyService); + mSysUiState, mOverviewProxyService, mDisplayTracker); mWindowMagnification.start(); final ArgumentCaptor<OverviewProxyListener> listenerArgumentCaptor = diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java index b4e85c06933a..ca5b7af5695a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java @@ -47,6 +47,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.screenshot.TimeoutHandler; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -81,6 +82,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase { private ClipboardOverlayUtils mClipboardUtils; @Mock private UiEventLogger mUiEventLogger; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); @Mock @@ -116,7 +118,8 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase { mFeatureFlags, mClipboardUtils, mExecutor, - mUiEventLogger); + mUiEventLogger, + mDisplayTracker); verify(mClipboardOverlayView).setCallbacks(mOverlayCallbacksCaptor.capture()); mCallbacks = mOverlayCallbacksCaptor.getValue(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/model/SysUiStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/model/SysUiStateTest.java index 9bcfd5b2ae52..1a93adc7a631 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/model/SysUiStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/model/SysUiStateTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.verify; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.settings.FakeDisplayTracker; import org.junit.Before; import org.junit.Test; @@ -46,7 +47,8 @@ public class SysUiStateTest extends SysuiTestCase { @Before public void setup() { - mFlagsContainer = new SysUiState(); + FakeDisplayTracker displayTracker = new FakeDisplayTracker(mContext); + mFlagsContainer = new SysUiState(displayTracker); mCallback = mock(SysUiState.SysUiStateCallback.class); mFlagsContainer.addCallback(mCallback); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java index 92652a788bcb..3eb73290636f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java @@ -40,6 +40,7 @@ import com.android.systemui.SysuiTestableContext; import com.android.systemui.assist.AssistManager; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.After; @@ -65,6 +66,7 @@ public class NavigationBarButtonTest extends SysuiTestCase { private ImageReader mReader; private NavigationBarView mNavBar; private VirtualDisplay mVirtualDisplay; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Before public void setup() { @@ -83,6 +85,7 @@ public class NavigationBarButtonTest extends SysuiTestCase { mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class, mEdgeBackGestureHandlerFactory); mNavBar = new NavigationBarView(context, null); + mNavBar.setDisplayTracker(mDisplayTracker); } private Display createVirtualDisplay() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java index 8058b85e205a..aacbf8f2adeb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java @@ -37,6 +37,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.res.Configuration; +import android.hardware.display.DisplayManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.util.SparseArray; @@ -50,6 +51,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.statusbar.CommandQueue; @@ -81,6 +83,7 @@ public class NavigationBarControllerTest extends SysuiTestCase { private NavigationBar mDefaultNavBar; private NavigationBar mSecondaryNavBar; private StaticMockitoSession mMockitoSession; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Mock private CommandQueue mCommandQueue; @@ -92,6 +95,7 @@ public class NavigationBarControllerTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); + DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); mNavigationBarController = spy( new NavigationBarController(mContext, mock(OverviewProxyService.class), @@ -110,7 +114,8 @@ public class NavigationBarControllerTest extends SysuiTestCase { Optional.of(mock(Pip.class)), Optional.of(mock(BackAnimation.class)), mock(FeatureFlags.class), - mock(SecureSettings.class))); + mock(SecureSettings.class), + mDisplayTracker)); initializeNavigationBars(); mMockitoSession = mockitoSession().mockStatic(Utilities.class).startMocking(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index 2ad865e6ef11..764ddc49d110 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -87,6 +87,7 @@ import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationShadeWindowView; @@ -495,7 +496,8 @@ public class NavigationBarTest extends SysuiTestCase { Optional.of(mock(BackAnimation.class)), mUserContextProvider, mWakefulnessLifecycle, - mTaskStackChangeListeners)); + mTaskStackChangeListeners, + new FakeDisplayTracker(mContext))); } private void processAllMessages() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java index cafd2cf7cea0..5270737b7f3e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java @@ -36,6 +36,7 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarTransitionsController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -63,6 +64,7 @@ public class NavigationBarTransitionsTest extends SysuiTestCase { IWindowManager mIWindowManager; private NavigationBarTransitions mTransitions; + private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Before public void setup() { @@ -86,7 +88,7 @@ public class NavigationBarTransitionsTest extends SysuiTestCase { when(navBar.getCurrentView()).thenReturn(navBar); when(navBar.findViewById(anyInt())).thenReturn(navBar); mTransitions = new NavigationBarTransitions( - navBar, mIWindowManager, mLightBarTransitionsFactory); + navBar, mIWindowManager, mLightBarTransitionsFactory, mDisplayTracker); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 42ef9c2914ce..4caa50fa847d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -60,6 +60,7 @@ import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.qs.external.TileServiceRequestController; import com.android.systemui.qs.footer.ui.binder.FooterActionsViewBinder; import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; @@ -494,7 +495,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { @Override protected Fragment instantiate(Context context, String className, Bundle arguments) { MockitoAnnotations.initMocks(this); - CommandQueue commandQueue = new CommandQueue(context); + CommandQueue commandQueue = new CommandQueue(context, new FakeDisplayTracker(context)); setupQsComponent(); setUpViews(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt index 2bd068a674ae..ad4f84d68c2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt @@ -41,6 +41,7 @@ import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.nullable @@ -90,6 +91,7 @@ class CustomTileTest : SysuiTestCase() { private lateinit var customTile: CustomTile private lateinit var testableLooper: TestableLooper private lateinit var customTileBuilder: CustomTile.Builder + private val displayTracker = FakeDisplayTracker(mContext) @Before fun setUp() { @@ -119,7 +121,8 @@ class CustomTileTest : SysuiTestCase() { activityStarter, qsLogger, customTileStatePersister, - tileServices + tileServices, + displayTracker ) customTile = CustomTile.create(customTileBuilder, TILE_SPEC, mContext) diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java index e1eda117177d..d5014fa366f1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java @@ -39,6 +39,7 @@ import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -67,6 +68,7 @@ public class ActionProxyReceiverTest extends SysuiTestCase { private PendingIntent mMockPendingIntent; private Intent mIntent; + private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Before public void setup() throws InterruptedException, ExecutionException, TimeoutException { @@ -135,10 +137,11 @@ public class ActionProxyReceiverTest extends SysuiTestCase { if (withStatusBar) { return new ActionProxyReceiver( Optional.of(mMockCentralSurfaces), mMockActivityManagerWrapper, - mMockScreenshotSmartActions); + mMockScreenshotSmartActions, mDisplayTracker); } else { return new ActionProxyReceiver( - Optional.empty(), mMockActivityManagerWrapper, mMockScreenshotSmartActions); + Optional.empty(), mMockActivityManagerWrapper, mMockScreenshotSmartActions, + mDisplayTracker); } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt index 17396b13036c..e70fa2f915bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt @@ -31,6 +31,7 @@ import android.os.UserManager import android.testing.AndroidTestingRunner import com.android.systemui.SysuiTestCase import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo +import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.Dispatchers @@ -126,8 +127,10 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { val userManager = mock<UserManager>() val atmService = mock<IActivityTaskManager>() val dispatcher = Dispatchers.Unconfined + val displayTracker = FakeDisplayTracker(mContext) - return object : ScreenshotPolicyImpl(context, userManager, atmService, dispatcher) { + return object : ScreenshotPolicyImpl(context, userManager, atmService, dispatcher, + displayTracker) { override suspend fun isManagedProfile(userId: Int) = (userId == MANAGED_PROFILE_USER) override suspend fun getAllRootTaskInfosOnDisplay(displayId: Int) = tasks override suspend fun isNotificationShadeExpanded() = shadeExpanded diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/DisplayTrackerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/DisplayTrackerImplTest.kt new file mode 100644 index 000000000000..ae976a0ea703 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/DisplayTrackerImplTest.kt @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2022 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.settings + +import android.hardware.display.DisplayManager +import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS +import android.hardware.display.DisplayManagerGlobal +import android.os.Handler +import android.testing.AndroidTestingRunner +import android.view.Display +import android.view.DisplayAdjustments +import android.view.DisplayInfo +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import java.util.concurrent.Executor +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.eq +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class DisplayTrackerImplTest : SysuiTestCase() { + @Mock private lateinit var displayManager: DisplayManager + @Mock private lateinit var handler: Handler + + private val executor = Executor(Runnable::run) + private lateinit var mDefaultDisplay: Display + private lateinit var mSecondaryDisplay: Display + private lateinit var tracker: DisplayTrackerImpl + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + mDefaultDisplay = + Display( + DisplayManagerGlobal.getInstance(), + Display.DEFAULT_DISPLAY, + DisplayInfo(), + DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS + ) + mSecondaryDisplay = + Display( + DisplayManagerGlobal.getInstance(), + Display.DEFAULT_DISPLAY + 1, + DisplayInfo(), + DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS + ) + + `when`(displayManager.displays).thenReturn(arrayOf(mDefaultDisplay, mSecondaryDisplay)) + + tracker = DisplayTrackerImpl(displayManager, handler) + } + + @Test + fun testGetDefaultDisplay() { + assertThat(tracker.defaultDisplayId).isEqualTo(Display.DEFAULT_DISPLAY) + } + + @Test + fun testGetAllDisplays() { + assertThat(tracker.allDisplays).isEqualTo(arrayOf(mDefaultDisplay, mSecondaryDisplay)) + } + + @Test + fun registerCallback_registersDisplayListener() { + tracker.addDisplayChangeCallback(TestCallback(), executor) + verify(displayManager).registerDisplayListener(any(), any()) + } + + @Test + fun registerBrightnessCallback_registersDisplayListener() { + tracker.addBrightnessChangeCallback(TestCallback(), executor) + verify(displayManager) + .registerDisplayListener(any(), any(), eq(EVENT_FLAG_DISPLAY_BRIGHTNESS)) + } + + @Test + fun unregisterCallback_displayListenerStillRegistered() { + val callback1 = TestCallback() + tracker.addDisplayChangeCallback(callback1, executor) + tracker.addDisplayChangeCallback(TestCallback(), executor) + tracker.removeCallback(callback1) + + verify(displayManager, never()).unregisterDisplayListener(any()) + } + + @Test + fun unregisterLastCallback_unregistersDisplayListener() { + val callback = TestCallback() + tracker.addDisplayChangeCallback(callback, executor) + tracker.removeCallback(callback) + + verify(displayManager).unregisterDisplayListener(any()) + } + + @Test + fun callbackCalledOnDisplayAdd() { + val testDisplay = 2 + val callback = TestCallback() + tracker.addDisplayChangeCallback(callback, executor) + tracker.displayChangedListener.onDisplayAdded(testDisplay) + + assertThat(callback.lastDisplayAdded).isEqualTo(testDisplay) + } + + @Test + fun callbackCalledOnDisplayRemoved() { + val testDisplay = 2 + val callback = TestCallback() + tracker.addDisplayChangeCallback(callback, executor) + tracker.displayChangedListener.onDisplayRemoved(testDisplay) + + assertThat(callback.lastDisplayRemoved).isEqualTo(testDisplay) + } + + @Test + fun callbackCalledOnDisplayChanged() { + val testDisplay = 2 + val callback = TestCallback() + tracker.addDisplayChangeCallback(callback, executor) + tracker.displayChangedListener.onDisplayChanged(testDisplay) + + assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay) + } + + @Test + fun callbackCalledOnBrightnessChanged() { + val testDisplay = 2 + val callback = TestCallback() + tracker.addBrightnessChangeCallback(callback, executor) + tracker.displayBrightnessChangedListener.onDisplayChanged(testDisplay) + + assertThat(callback.lastDisplayChanged).isEqualTo(testDisplay) + } + + private class TestCallback : DisplayTracker.Callback { + var lastDisplayAdded = -1 + var lastDisplayRemoved = -1 + var lastDisplayChanged = -1 + + override fun onDisplayAdded(displayId: Int) { + lastDisplayAdded = displayId + } + + override fun onDisplayRemoved(displayId: Int) { + lastDisplayRemoved = displayId + } + + override fun onDisplayChanged(displayId: Int) { + lastDisplayChanged = displayId + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt index 9d1802a686fa..58ade49648d6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt @@ -28,6 +28,7 @@ import androidx.test.rule.ActivityTestRule import androidx.test.runner.intercepting.SingleActivityFactory import com.android.systemui.R import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.any import com.google.common.truth.Truth.assertThat @@ -51,6 +52,7 @@ class BrightnessDialogTest : SysuiTestCase() { @Mock private lateinit var mainExecutor: Executor @Mock private lateinit var backgroundHandler: Handler @Mock private lateinit var brightnessSliderController: BrightnessSliderController + private val displayTracker = FakeDisplayTracker(mContext) @Rule @JvmField @@ -60,6 +62,7 @@ class BrightnessDialogTest : SysuiTestCase() { override fun create(intent: Intent?): TestDialog { return TestDialog( userTracker, + displayTracker, brightnessSliderControllerFactory, mainExecutor, backgroundHandler @@ -105,12 +108,14 @@ class BrightnessDialogTest : SysuiTestCase() { class TestDialog( userTracker: UserTracker, + displayTracker: FakeDisplayTracker, brightnessSliderControllerFactory: BrightnessSliderController.Factory, mainExecutor: Executor, backgroundHandler: Handler ) : BrightnessDialog( userTracker, + displayTracker, brightnessSliderControllerFactory, mainExecutor, backgroundHandler diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index 8aaa18129834..e68d3b465a07 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -45,6 +45,7 @@ import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.view.AppearanceRegion; import com.android.systemui.SysuiTestCase; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.CommandQueue.Callbacks; import org.junit.After; @@ -62,12 +63,14 @@ public class CommandQueueTest extends SysuiTestCase { }; private CommandQueue mCommandQueue; + + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private Callbacks mCallbacks; private static final int SECONDARY_DISPLAY = 1; @Before public void setup() { - mCommandQueue = new CommandQueue(mContext); + mCommandQueue = new CommandQueue(mContext, mDisplayTracker); mCallbacks = mock(Callbacks.class); mCommandQueue.addCallback(mCallbacks); verify(mCallbacks).disable(anyInt(), eq(0), eq(0), eq(false)); @@ -415,7 +418,7 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testOnDisplayRemoved() { - mCommandQueue.onDisplayRemoved(SECONDARY_DISPLAY); + mDisplayTracker.triggerOnDisplayRemoved(SECONDARY_DISPLAY); waitForIdleSync(); verify(mCallbacks).onDisplayRemoved(eq(SECONDARY_DISPLAY)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt index ea066471a802..a9c3d5d5eeb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt @@ -6,6 +6,7 @@ import android.view.InputEvent import android.view.MotionEvent import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.FakeDisplayTracker import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test @@ -17,6 +18,7 @@ import org.junit.runner.RunWith class GenericGestureDetectorTest : SysuiTestCase() { private lateinit var gestureDetector: TestGestureDetector + private val displayTracker = FakeDisplayTracker(mContext) @Before fun setUp() { @@ -101,12 +103,21 @@ class GenericGestureDetectorTest : SysuiTestCase() { gestureDetector.addOnGestureDetectedCallback("tag2"){} gestureDetector.removeOnGestureDetectedCallback("tag") - gestureDetector.onInputEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, CORRECT_X, 0f, 0)) + gestureDetector.onInputEvent( + MotionEvent.obtain( + 0, + 0, + MotionEvent.ACTION_DOWN, + CORRECT_X, + 0f, + 0 + ) + ) assertThat(oldCallbackNotified).isFalse() } - inner class TestGestureDetector : GenericGestureDetector("fakeTag") { + inner class TestGestureDetector : GenericGestureDetector("fakeTag", displayTracker) { var isGestureListening = false override fun onInputEvent(ev: InputEvent) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java index cc4abfcaa42f..529519a6246e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java @@ -38,6 +38,7 @@ import com.android.internal.view.AppearanceRegion; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; import org.junit.Before; @@ -67,7 +68,8 @@ public class LightBarControllerTest extends SysuiTestCase { mStatusBarIconController, mock(BatteryController.class), mock(NavigationModeController.class), - mock(DumpManager.class)); + mock(DumpManager.class), + new FakeDisplayTracker(mContext)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java index 189aa0f99b0f..0a68406882d4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java @@ -28,6 +28,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.LightBarTransitionsController.DarkIntensityApplier; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -56,7 +57,8 @@ public class LightBarTransitionsControllerTest extends SysuiTestCase { public void setup() { MockitoAnnotations.initMocks(this); mLightBarTransitionsController = new LightBarTransitionsController(mContext, mApplier, - new CommandQueue(mContext), mKeyguardStateController, mStatusBarStateController); + new CommandQueue(mContext, new FakeDisplayTracker(mContext)), + mKeyguardStateController, mStatusBarStateController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java index eef43bde1a23..8841521c19f5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java @@ -40,6 +40,7 @@ import com.android.systemui.InitController; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.ShadeController; @@ -92,7 +93,7 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { mMetricsLogger = new FakeMetricsLogger(); LockscreenGestureLogger lockscreenGestureLogger = new LockscreenGestureLogger( mMetricsLogger); - mCommandQueue = new CommandQueue(mContext); + mCommandQueue = new CommandQueue(mContext, new FakeDisplayTracker(mContext)); mDependency.injectTestDependency(StatusBarStateController.class, mock(SysuiStatusBarStateController.class)); mDependency.injectTestDependency(ShadeController.class, mShadeController); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java index 613238f7752e..929099a8f1f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java @@ -32,6 +32,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.ActionClickLogger; import com.android.systemui.statusbar.CommandQueue; @@ -78,7 +79,8 @@ public class StatusBarRemoteInputCallbackTest extends SysuiTestCase { mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext, mock(GroupExpansionManager.class), mNotificationLockscreenUserManager, mKeyguardStateController, mStatusBarStateController, mStatusBarKeyguardViewManager, - mActivityStarter, mShadeController, new CommandQueue(mContext), + mActivityStarter, mShadeController, + new CommandQueue(mContext, new FakeDisplayTracker(mContext)), mock(ActionClickLogger.class), mFakeExecutor)); mRemoteInputCallback.mChallengeReceiver = mRemoteInputCallback.new ChallengeReceiver(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt index a87a95060a7e..c539246d4902 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt @@ -22,6 +22,7 @@ import android.view.View import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever @@ -36,7 +37,7 @@ class SwipeChipbarAwayGestureHandlerTest : SysuiTestCase() { @Before fun setUp() { - underTest = SwipeChipbarAwayGestureHandler(context, mock()) + underTest = SwipeChipbarAwayGestureHandler(context, FakeDisplayTracker(mContext), mock()) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 68ccc301755d..bc3343993737 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -91,6 +91,7 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationShadeWindowControllerImpl; import com.android.systemui.shade.NotificationShadeWindowView; @@ -287,6 +288,8 @@ public class BubblesTest extends SysuiTestCase { private TestableLooper mTestableLooper; + private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -333,7 +336,7 @@ public class BubblesTest extends SysuiTestCase { mZenModeConfig.suppressedVisualEffects = 0; when(mZenModeController.getConfig()).thenReturn(mZenModeConfig); - mSysUiState = new SysUiState(); + mSysUiState = new SysUiState(mDisplayTracker); mSysUiState.addCallback(sysUiFlags -> { mSysUiStateBubblesManageMenuExpanded = (sysUiFlags diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java index 7ae47b41d5ae..45489d974195 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java @@ -29,6 +29,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.notetask.NoteTaskInitializer; +import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -63,6 +64,7 @@ import java.util.concurrent.Executor; @RunWith(AndroidJUnit4.class) public class WMShellTest extends SysuiTestCase { WMShell mWMShell; + FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @Mock ShellInterface mShellInterface; @Mock CommandQueue mCommandQueue; @@ -100,6 +102,7 @@ public class WMShellTest extends SysuiTestCase { mProtoTracer, mWakefulnessLifecycle, mUserTracker, + mDisplayTracker, mNoteTaskInitializer, mSysUiMainExecutor ); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/FakeDisplayTracker.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/FakeDisplayTracker.kt new file mode 100644 index 000000000000..6ae7c34e13f2 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/FakeDisplayTracker.kt @@ -0,0 +1,76 @@ +/* + * 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.settings + +import android.content.Context +import android.hardware.display.DisplayManager +import android.view.Display +import java.util.concurrent.Executor + +class FakeDisplayTracker internal constructor(val context: Context) : DisplayTracker { + val displayManager: DisplayManager = context.getSystemService(DisplayManager::class.java)!! + override var defaultDisplayId: Int = Display.DEFAULT_DISPLAY + override var allDisplays: Array<Display> = displayManager.displays + + private val displayCallbacks: MutableList<DisplayTracker.Callback> = ArrayList() + private val brightnessCallbacks: MutableList<DisplayTracker.Callback> = ArrayList() + override fun addDisplayChangeCallback(callback: DisplayTracker.Callback, executor: Executor) { + displayCallbacks.add(callback) + } + override fun addBrightnessChangeCallback( + callback: DisplayTracker.Callback, + executor: Executor + ) { + brightnessCallbacks.add(callback) + } + + override fun removeCallback(callback: DisplayTracker.Callback) { + displayCallbacks.remove(callback) + brightnessCallbacks.remove(callback) + } + + fun setDefaultDisplay(displayId: Int) { + defaultDisplayId = displayId + } + + fun setDisplays(displays: Array<Display>) { + allDisplays = displays + } + + fun triggerOnDisplayAdded(displayId: Int) { + notifyCallbacks({ onDisplayAdded(displayId) }, displayCallbacks) + } + + fun triggerOnDisplayRemoved(displayId: Int) { + notifyCallbacks({ onDisplayRemoved(displayId) }, displayCallbacks) + } + + fun triggerOnDisplayChanged(displayId: Int) { + notifyCallbacks({ onDisplayChanged(displayId) }, displayCallbacks) + } + + fun triggerOnDisplayBrightnessChanged(displayId: Int) { + notifyCallbacks({ onDisplayChanged(displayId) }, brightnessCallbacks) + } + + private inline fun notifyCallbacks( + crossinline action: DisplayTracker.Callback.() -> Unit, + list: List<DisplayTracker.Callback> + ) { + list.forEach { it.action() } + } +} |