Merge "Add centralized DisplayTracker for SystemUI"
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
@@ -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() }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user