Merge "Add centralized DisplayTracker for SystemUI"

This commit is contained in:
Alex Stetson
2023-01-27 19:24:08 +00:00
committed by Android (Google) Code Review
71 changed files with 898 additions and 250 deletions

View File

@@ -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() {
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 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) {
}
@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);

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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() {

View File

@@ -40,6 +40,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 com.android.systemui.util.settings.SecureSettings;
@@ -64,6 +65,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;
@@ -115,7 +117,7 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba
public WindowMagnification(Context context, @Main Handler mainHandler,
CommandQueue commandQueue, ModeSwitchesController modeSwitchesController,
SysUiState sysUiState, OverviewProxyService overviewProxyService,
SecureSettings secureSettings) {
SecureSettings secureSettings, DisplayTracker displayTracker) {
mContext = context;
mHandler = mainHandler;
mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);
@@ -123,6 +125,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,
secureSettings);
@@ -144,14 +147,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());
}
}

View File

@@ -17,7 +17,6 @@
package com.android.systemui.accessibility.floatingmenu;
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static com.android.systemui.flags.Flags.A11Y_FLOATING_MENU_FLING_SPRING_ANIMATIONS;
@@ -40,6 +39,7 @@ import com.android.systemui.accessibility.AccessibilityButtonModeObserver.Access
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.util.settings.SecureSettings;
import javax.inject.Inject;
@@ -61,6 +61,7 @@ public class AccessibilityFloatingMenuController implements
private final AccessibilityManager mAccessibilityManager;
private final FeatureFlags mFeatureFlags;
private final SecureSettings mSecureSettings;
private final DisplayTracker mDisplayTracker;
@VisibleForTesting
IAccessibilityFloatingMenu mFloatingMenu;
private int mBtnMode;
@@ -105,7 +106,8 @@ public class AccessibilityFloatingMenuController implements
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
KeyguardUpdateMonitor keyguardUpdateMonitor,
FeatureFlags featureFlags,
SecureSettings secureSettings) {
SecureSettings secureSettings,
DisplayTracker displayTracker) {
mContext = context;
mWindowManager = windowManager;
mDisplayManager = displayManager;
@@ -115,6 +117,7 @@ public class AccessibilityFloatingMenuController implements
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mFeatureFlags = featureFlags;
mSecureSettings = secureSettings;
mDisplayTracker = displayTracker;
mIsKeyguardVisible = false;
}
@@ -185,7 +188,8 @@ public class AccessibilityFloatingMenuController implements
private void showFloatingMenu() {
if (mFloatingMenu == null) {
if (mFeatureFlags.isEnabled(A11Y_FLOATING_MENU_FLING_SPRING_ANIMATIONS)) {
final Display defaultDisplay = mDisplayManager.getDisplay(DEFAULT_DISPLAY);
final Display defaultDisplay = mDisplayManager.getDisplay(
mDisplayTracker.getDefaultDisplayId());
final Context windowContext = mContext.createWindowContext(defaultDisplay,
TYPE_NAVIGATION_BAR_PANEL, /* options= */ null);
mFloatingMenu = new MenuViewLayerController(windowContext, mWindowManager,

View File

@@ -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());
}
}
});

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -64,6 +64,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.shade.ShadeController;
import com.android.systemui.smartspace.dagger.SmartspaceModule;
import com.android.systemui.statusbar.CommandQueue;
@@ -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;
}

View File

@@ -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(),

View File

@@ -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;
@@ -79,6 +78,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;
@@ -94,6 +94,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) {
@@ -257,12 +258,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
@@ -295,7 +298,7 @@ public class KeyguardService extends Service {
definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE,
unoccludeAnimationAdapter);
ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay(
DEFAULT_DISPLAY, definition);
mDisplayTracker.getDefaultDisplayId(), definition);
return;
}
Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_GOING_AWAY");

View File

@@ -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;

View File

@@ -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_BOTTOM_MANDATORY_GESTURES;
import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT;
import static android.view.InsetsState.ITYPE_LEFT_GESTURES;
@@ -136,6 +135,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;
@@ -224,6 +224,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;
@@ -473,7 +474,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);
}
}
@@ -557,7 +559,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;
@@ -597,6 +600,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);
@@ -644,12 +648,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);
}
@@ -681,7 +687,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
@@ -1484,7 +1490,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) {

View File

@@ -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

View File

@@ -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;
@@ -66,6 +66,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;
@@ -102,12 +103,14 @@ 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();
@@ -115,7 +118,7 @@ public final class NavigationBarTransitions extends BarTransitions implements
mWallpaperVisibilityListener = new WallpaperVisibilityListener(this);
try {
mWallpaperVisible = mWindowManagerService.registerWallpaperVisibilityListener(
mWallpaperVisibilityListener, Display.DEFAULT_DISPLAY);
mWallpaperVisibilityListener, mDisplayTracker.getDefaultDisplayId());
} catch (RemoteException e) {
}
mView.addOnLayoutChangeListener(
@@ -141,7 +144,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();
@@ -150,7 +153,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);
@@ -234,7 +240,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;

View File

@@ -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() {

View File

@@ -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;
@@ -55,9 +53,9 @@ import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.MotionEventsHandlerBase;
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;
@@ -291,7 +289,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);
@@ -367,7 +366,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

View File

@@ -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
);
}
}

View File

@@ -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);

View File

@@ -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)
}

View File

@@ -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);
}

View File

@@ -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() {

View File

@@ -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 {

View File

@@ -137,6 +137,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;
@@ -333,7 +334,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) {
@@ -491,6 +492,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);

View File

@@ -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) {}
}
}

View File

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

View File

@@ -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;
@@ -73,19 +74,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);
@@ -133,14 +129,14 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
cr.registerContentObserver(
BRIGHTNESS_MODE_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);
}
}
@@ -282,6 +278,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
Context context,
ToggleSlider control,
UserTracker userTracker,
DisplayTracker displayTracker,
@Main Executor mainExecutor,
@Background Handler bgHandler) {
mContext = context;
@@ -290,6 +287,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
mMainExecutor = mainExecutor;
mBackgroundHandler = bgHandler;
mUserTracker = userTracker;
mDisplayTracker = displayTracker;
mBrightnessObserver = new BrightnessObserver(mHandler);
mDisplayId = mContext.getDisplayId();
@@ -424,6 +422,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;
@@ -431,10 +430,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;
}
@@ -445,6 +446,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
mContext,
toggleSlider,
mUserTracker,
mDisplayTracker,
mMainExecutor,
mBackgroundHandler);
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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.IUdfpsRefreshRateRequestCallback;
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;
@@ -189,6 +189,7 @@ public class CommandQueue extends IStatusBar.Stub implements
* event.
*/
private int mLastUpdatedImeDisplayId = INVALID_DISPLAY;
private final DisplayTracker mDisplayTracker;
private ProtoTracer mProtoTracer;
private final @Nullable CommandRegistry mRegistry;
private final @Nullable DumpHandler mDumpHandler;
@@ -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,46 +501,43 @@ 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
) {
mDisplayTracker = displayTracker;
mProtoTracer = protoTracer;
mRegistry = registry;
mDumpHandler = dumpHandler;
context.getSystemService(DisplayManager.class).registerDisplayListener(this, mHandler);
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;
}

View File

@@ -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);
}
/**

View File

@@ -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(),

View File

@@ -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 &&

View File

@@ -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!!) {
) : GenericGestureDetector(SwipeUpGestureHandler::class.simpleName!!, displayTracker) {
private var startY: Float = 0f
private var startTime: Long = 0L

View File

@@ -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 {

View File

@@ -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);
}
}
}

View File

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

View File

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

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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,7 +117,7 @@ public class KeyguardDisplayManagerTest extends SysuiTestCase {
@Test
public void testShow_includeSecondaryAndAlwaysUnlockedDisplays() {
when(mDisplayManager.getDisplays()).thenReturn(
mDisplayTracker.setAllDisplays(
new Display[]{mDefaultDisplay, mSecondaryDisplay, mAlwaysUnlockedDisplay});
mManager.show();

View File

@@ -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);
}

View File

@@ -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() {

View File

@@ -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 com.android.systemui.util.settings.SecureSettings;
@@ -79,6 +80,7 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase {
private IWindowMagnificationConnection mIWindowMagnificationConnection;
private WindowMagnification mWindowMagnification;
private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext);
@Before
public void setUp() throws Exception {
@@ -91,7 +93,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase {
any(IWindowMagnificationConnection.class));
mWindowMagnification = new WindowMagnification(getContext(),
getContext().getMainThreadHandler(), mCommandQueue,
mModeSwitchesController, mSysUiState, mOverviewProxyService, mSecureSettings);
mModeSwitchesController, mSysUiState, mOverviewProxyService, mSecureSettings,
mDisplayTracker);
mWindowMagnification.mMagnificationControllerSupplier = new FakeControllerSupplier(
mContext.getSystemService(DisplayManager.class));

View File

@@ -87,6 +87,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;
@@ -131,12 +132,13 @@ 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 ValueAnimator mValueAnimator = ValueAnimator.ofFloat(0, 1.0f).setDuration(0);
private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext);
private IWindowSession mWindowSessionSpy;
@@ -162,6 +164,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());

View File

@@ -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 com.android.systemui.util.settings.SecureSettings;
@@ -77,6 +78,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);
@@ -90,10 +93,10 @@ public class WindowMagnificationTest extends SysuiTestCase {
when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
mCommandQueue = new CommandQueue(getContext());
mCommandQueue = new CommandQueue(getContext(), mDisplayTracker);
mWindowMagnification = new WindowMagnification(getContext(),
getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController,
mSysUiState, mOverviewProxyService, mSecureSettings);
mSysUiState, mOverviewProxyService, mSecureSettings, mDisplayTracker);
mWindowMagnification.start();
final ArgumentCaptor<OverviewProxyListener> listenerArgumentCaptor =

View File

@@ -47,6 +47,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.util.settings.SecureSettings;
import org.junit.After;
@@ -353,13 +354,14 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
private AccessibilityFloatingMenuController setUpController(FakeFeatureFlags featureFlags) {
final WindowManager windowManager = mContext.getSystemService(WindowManager.class);
final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
final FakeDisplayTracker displayTracker = new FakeDisplayTracker(mContext);
mTargetsObserver = spy(Dependency.get(AccessibilityButtonTargetsObserver.class));
mModeObserver = spy(Dependency.get(AccessibilityButtonModeObserver.class));
mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
final AccessibilityFloatingMenuController controller =
new AccessibilityFloatingMenuController(mContextWrapper, windowManager,
displayManager, mAccessibilityManager, mTargetsObserver, mModeObserver,
mKeyguardUpdateMonitor, featureFlags, mSecureSettings);
mKeyguardUpdateMonitor, featureFlags, mSecureSettings, displayTracker);
controller.init();
return controller;

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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() {

View File

@@ -50,6 +50,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 +82,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;
@@ -110,7 +112,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();
}

View File

@@ -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() {

View File

@@ -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 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

View File

@@ -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();

View File

@@ -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
@@ -87,6 +88,7 @@ class CustomTileTest : SysuiTestCase() {
@Mock private lateinit var serviceInfo: ServiceInfo
@Mock private lateinit var customTileStatePersister: CustomTileStatePersister
private var displayTracker = FakeDisplayTracker(mContext)
private lateinit var customTile: CustomTile
private lateinit var testableLooper: TestableLooper
private lateinit var customTileBuilder: CustomTile.Builder
@@ -119,7 +121,8 @@ class CustomTileTest : SysuiTestCase() {
activityStarter,
qsLogger,
customTileStatePersister,
tileServices
tileServices,
displayTracker
)
customTile = CustomTile.create(customTileBuilder, TILE_SPEC, mContext)

View File

@@ -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 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);
}
}
}

View File

@@ -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(context)
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

View File

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

View File

@@ -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
@@ -52,6 +53,8 @@ class BrightnessDialogTest : SysuiTestCase() {
@Mock private lateinit var backgroundHandler: Handler
@Mock private lateinit var brightnessSliderController: BrightnessSliderController
private var displayTracker = FakeDisplayTracker(mContext)
@Rule
@JvmField
var activityRule =
@@ -60,6 +63,7 @@ class BrightnessDialogTest : SysuiTestCase() {
override fun create(intent: Intent?): TestDialog {
return TestDialog(
userTracker,
displayTracker,
brightnessSliderControllerFactory,
mainExecutor,
backgroundHandler
@@ -105,12 +109,14 @@ class BrightnessDialogTest : SysuiTestCase() {
class TestDialog(
userTracker: UserTracker,
displayTracker: FakeDisplayTracker,
brightnessSliderControllerFactory: BrightnessSliderController.Factory,
mainExecutor: Executor,
backgroundHandler: Handler
) :
BrightnessDialog(
userTracker,
displayTracker,
brightnessSliderControllerFactory,
mainExecutor,
backgroundHandler

View File

@@ -46,6 +46,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;
@@ -63,12 +64,13 @@ 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));
@@ -418,7 +420,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));
}

View File

@@ -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,9 +18,11 @@ import org.junit.runner.RunWith
class GenericGestureDetectorTest : SysuiTestCase() {
private lateinit var gestureDetector: TestGestureDetector
private lateinit var displayTracker: FakeDisplayTracker
@Before
fun setUp() {
displayTracker = FakeDisplayTracker(mContext)
gestureDetector = TestGestureDetector()
}
@@ -101,12 +104,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) {

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
@@ -84,6 +85,7 @@ public class WMShellTest extends SysuiTestCase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeDisplayTracker displayTracker = new FakeDisplayTracker(mContext);
mWMShell = new WMShell(
mContext,
mShellInterface,
@@ -100,6 +102,7 @@ public class WMShellTest extends SysuiTestCase {
mProtoTracer,
mWakefulnessLifecycle,
mUserTracker,
displayTracker,
mNoteTaskInitializer,
mSysUiMainExecutor
);

View File

@@ -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() }
}
}