diff options
author | Charles Chen <charlesccchen@google.com> | 2020-01-20 17:23:36 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-01-20 17:23:36 +0000 |
commit | eb0ebddc1a1cfe3225679f2c6b35a1fecca4915c (patch) | |
tree | 74faec8b545b833ad554c09afe6a5fbb6bf0ddda /packages/SystemUI/src | |
parent | 42132edbfdd486ca4c9334486df34cd7ad738b15 (diff) | |
parent | e832194dd0614a9c6f496e0f2ff03fd70f037462 (diff) |
Merge "Split status bar window (1/N)"
Diffstat (limited to 'packages/SystemUI/src')
32 files changed, 1724 insertions, 1515 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index d1495913d95f..aacc2c4f614b 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -89,6 +89,7 @@ import com.android.systemui.statusbar.phone.ManagedProfileController; import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -238,7 +239,8 @@ public class Dependency { @Inject Lazy<LeakReporter> mLeakReporter; @Inject Lazy<GarbageMonitor> mGarbageMonitor; @Inject Lazy<TunerService> mTunerService; - @Inject Lazy<StatusBarWindowController> mStatusBarWindowController; + @Inject Lazy<NotificationShadeWindowController> mNotificationShadeWindowController; + @Inject Lazy<StatusBarWindowController> mTempStatusBarWindowController; @Inject Lazy<DarkIconDispatcher> mDarkIconDispatcher; @Inject Lazy<ConfigurationController> mConfigurationController; @Inject Lazy<StatusBarIconController> mStatusBarIconController; @@ -400,7 +402,10 @@ public class Dependency { mProviders.put(TunerService.class, mTunerService::get); - mProviders.put(StatusBarWindowController.class, mStatusBarWindowController::get); + mProviders.put(NotificationShadeWindowController.class, + mNotificationShadeWindowController::get); + + mProviders.put(StatusBarWindowController.class, mTempStatusBarWindowController::get); mProviders.put(DarkIconDispatcher.class, mDarkIconDispatcher::get); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index c533755c76da..db8b5831faf1 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -455,17 +455,25 @@ public class ScreenDecorations extends SystemUI implements Tunable { private void setupStatusBarPadding(int padding) { // Add some padding to all the content near the edge of the screen. StatusBar statusBar = mStatusBarLazy.get(); - View statusBarWindow = statusBar.getStatusBarWindow(); - if (statusBarWindow != null) { - TunablePadding.addTunablePadding(statusBarWindow.findViewById(R.id.keyguard_header), + final View notificationShadeWindowView = statusBar.getNotificationShadeWindowView(); + if (notificationShadeWindowView != null) { + TunablePadding.addTunablePadding( + notificationShadeWindowView.findViewById(R.id.keyguard_header), PADDING, padding, FLAG_END); - FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBarWindow); - fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG, - new TunablePaddingTagListener(padding, R.id.status_bar)); + final FragmentHostManager fragmentHostManager = + FragmentHostManager.get(notificationShadeWindowView); fragmentHostManager.addTagListener(QS.TAG, new TunablePaddingTagListener(padding, R.id.header)); } + + final View statusBarWindow = statusBar.getStatusBarWindow(); + if (statusBarWindow != null) { + final FragmentHostManager fragmentHostManager = + FragmentHostManager.get(statusBarWindow); + fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG, + new TunablePaddingTagListener(padding, R.id.status_bar)); + } } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index d835ee1865bf..644d8c48c63c 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -89,9 +89,9 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; -import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.RemoteInputUriController; import com.android.systemui.statusbar.policy.ZenModeController; @@ -166,7 +166,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final HashSet<String> mUserBlockedBubbles; // Bubbles get added to the status bar view - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private final ZenModeController mZenModeController; private StatusBarStateListener mStatusBarStateListener; private final ScreenshotHelper mScreenshotHelper; @@ -245,7 +245,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi @Inject public BubbleController(Context context, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, StatusBarStateController statusBarStateController, ShadeController shadeController, BubbleData data, @@ -256,14 +256,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi NotificationGroupManager groupManager, NotificationEntryManager entryManager, RemoteInputUriController remoteInputUriController) { - this(context, statusBarWindowController, statusBarStateController, shadeController, + this(context, notificationShadeWindowController, statusBarStateController, shadeController, data, null /* synchronizer */, configurationController, interruptionStateProvider, zenModeController, notifUserManager, groupManager, entryManager, remoteInputUriController); } public BubbleController(Context context, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, StatusBarStateController statusBarStateController, ShadeController shadeController, BubbleData data, @@ -324,7 +324,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } }); - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mStatusBarStateListener = new StatusBarStateListener(); statusBarStateController.addCallback(mStatusBarStateListener); @@ -377,10 +377,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private void ensureStackViewCreated() { if (mStackView == null) { mStackView = new BubbleStackView(mContext, mBubbleData, mSurfaceSynchronizer); - ViewGroup sbv = mStatusBarWindowController.getStatusBarView(); - int bubbleScrimIndex = sbv.indexOfChild(sbv.findViewById(R.id.scrim_for_bubble)); + ViewGroup nsv = mNotificationShadeWindowController.getNotificationShadeView(); + int bubbleScrimIndex = nsv.indexOfChild(nsv.findViewById(R.id.scrim_for_bubble)); int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim. - sbv.addView(mStackView, stackIndex, + nsv.addView(mStackView, stackIndex, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); @@ -473,7 +473,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (listener != null) { listener.onBubbleExpandChanged(isExpanding, key); } - mStatusBarWindowController.setBubbleExpanded(isExpanding); + mNotificationShadeWindowController.setBubbleExpanded(isExpanding); }); if (mStackView != null) { mStackView.setExpandListener(mExpandListener); @@ -944,9 +944,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } // Let listeners know if bubble state changed. - boolean hadBubbles = mStatusBarWindowController.getBubblesShowing(); + boolean hadBubbles = mNotificationShadeWindowController.getBubblesShowing(); boolean hasBubblesShowing = hasBubbles() && mStackView.getVisibility() == VISIBLE; - mStatusBarWindowController.setBubblesShowing(hasBubblesShowing); + mNotificationShadeWindowController.setBubblesShowing(hasBubblesShowing); if (mStateChangeListener != null && hadBubbles != hasBubblesShowing) { mStateChangeListener.onHasBubblesChanged(hasBubblesShowing); } @@ -983,7 +983,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi && context.getDisplay().getDisplayId() == DEFAULT_DISPLAY; final Bubble expandedBubble = mStackView.getExpandedBubble(); if (defaultDisplay && expandedBubble != null && isStackExpanded() - && !mStatusBarWindowController.getPanelExpanded()) { + && !mNotificationShadeWindowController.getPanelExpanded()) { return expandedBubble; } return null; diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index c138462d06c4..36a4a10b8a3f 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -97,8 +97,8 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ScrimController; -import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.EmergencyDialerConstants; @@ -1528,7 +1528,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private float mScrimAlpha; private ResetOrientationData mResetOrientationData; private boolean mHadTopUi; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private boolean mControlsEnabled; ActionsDialog(Context context, MyAdapter adapter, @@ -1539,7 +1539,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter = adapter; mColorExtractor = Dependency.get(SysuiColorExtractor.class); mStatusBarService = Dependency.get(IStatusBarService.class); - mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); + mNotificationShadeWindowController = + Dependency.get(NotificationShadeWindowController.class); mControlsEnabled = controlsEnabled; // Window initialization @@ -1721,8 +1722,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, public void show() { super.show(); mShowing = true; - mHadTopUi = mStatusBarWindowController.getForceHasTopUi(); - mStatusBarWindowController.setForceHasTopUi(true); + mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi(); + mNotificationShadeWindowController.setForceHasTopUi(true); mBackgroundDrawable.setAlpha(0); mGlobalActionsLayout.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX()); mGlobalActionsLayout.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY()); @@ -1775,7 +1776,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private void completeDismiss() { - mStatusBarWindowController.setForceHasTopUi(mHadTopUi); + mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); super.dismiss(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index e13c3e087893..2fc7a9cf2434 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -88,9 +88,9 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.InjectionInflationController; import java.io.FileDescriptor; @@ -212,7 +212,7 @@ public class KeyguardViewMediator extends SystemUI { private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private final Executor mUiBgExecutor; private boolean mSystemReady; @@ -691,7 +691,7 @@ public class KeyguardViewMediator extends SystemUI { FalsingManager falsingManager, LockPatternUtils lockPatternUtils, BroadcastDispatcher broadcastDispatcher, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, Lazy<StatusBarKeyguardViewManager> statusBarKeyguardViewManagerLazy, DismissCallbackRegistry dismissCallbackRegistry, @UiBackground Executor uiBgExecutor) { @@ -699,7 +699,7 @@ public class KeyguardViewMediator extends SystemUI { mFalsingManager = falsingManager; mLockPatternUtils = lockPatternUtils; mBroadcastDispatcher = broadcastDispatcher; - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mStatusBarKeyguardViewManagerLazy = statusBarKeyguardViewManagerLazy; mDismissCallbackRegistry = dismissCallbackRegistry; mUiBgExecutor = uiBgExecutor; @@ -1819,7 +1819,7 @@ public class KeyguardViewMediator extends SystemUI { adjustStatusBarLocked(); userActivity(); mUpdateMonitor.setKeyguardGoingAway(false); - mStatusBarWindowController.setKeyguardGoingAway(false); + mNotificationShadeWindowController.setKeyguardGoingAway(false); mShowKeyguardWakeLock.release(); } mKeyguardDisplayManager.show(); @@ -1852,7 +1852,7 @@ public class KeyguardViewMediator extends SystemUI { } mUpdateMonitor.setKeyguardGoingAway(true); - mStatusBarWindowController.setKeyguardGoingAway(true); + mNotificationShadeWindowController.setKeyguardGoingAway(true); // Don't actually hide the Keyguard at the moment, wait for window // manager until it tells us it's safe to do so with diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index ae48db2f4200..569f660d1797 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -68,9 +68,9 @@ import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.phone.NavigationBarFragment; import com.android.systemui.statusbar.phone.NavigationBarView; import com.android.systemui.statusbar.phone.NavigationModeController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowCallback; -import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -109,7 +109,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private SysUiState mSysUiState; private final Handler mHandler; private final NavigationBarController mNavBarController; - private final StatusBarWindowController mStatusBarWinController; + private final NotificationShadeWindowController mStatusBarWinController; private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser; private final ComponentName mRecentsComponentName; private final DeviceProvisionedController mDeviceProvisionedController; @@ -476,8 +476,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis @Inject public OverviewProxyService(Context context, DeviceProvisionedController provisionController, NavigationBarController navBarController, NavigationModeController navModeController, - StatusBarWindowController statusBarWinController, SysUiState sysUiState, PipUI pipUI, - Optional<Divider> dividerOptional, Optional<Lazy<StatusBar>> statusBarOptionalLazy) { + NotificationShadeWindowController statusBarWinController, SysUiState sysUiState, + PipUI pipUI, Optional<Divider> dividerOptional, + Optional<Lazy<StatusBar>> statusBarOptionalLazy) { mContext = context; mPipUI = pipUI; mStatusBarOptionalLazy = statusBarOptionalLazy; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 246b0f0e19ff..a4572665ebf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -59,10 +59,10 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.LockscreenWallpaper; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ScrimState; import com.android.systemui.statusbar.phone.StatusBar; -import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.KeyguardStateController; import java.io.FileDescriptor; @@ -105,7 +105,7 @@ public class NotificationMediaManager implements Dumpable { private final NotificationEntryManager mEntryManager; @Nullable - private Lazy<StatusBarWindowController> mStatusBarWindowController; + private Lazy<NotificationShadeWindowController> mStatusBarWindowController; @Nullable private BiometricUnlockController mBiometricUnlockController; @@ -180,7 +180,7 @@ public class NotificationMediaManager implements Dumpable { public NotificationMediaManager( Context context, Lazy<StatusBar> statusBarLazy, - Lazy<StatusBarWindowController> statusBarWindowController, + Lazy<NotificationShadeWindowController> statusBarWindowController, NotificationEntryManager notificationEntryManager, MediaArtworkProcessor mediaArtworkProcessor, KeyguardBypassController keyguardBypassController) { @@ -525,7 +525,7 @@ public class NotificationMediaManager implements Dumpable { } } - StatusBarWindowController windowController = mStatusBarWindowController.get(); + NotificationShadeWindowController windowController = mStatusBarWindowController.get(); boolean hideBecauseOccluded = mStatusBarLazy.get().isOccluded(); final boolean hasArtwork = artworkDrawable != null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java index 9398e6f689f6..0ab5afaab696 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java @@ -23,6 +23,7 @@ import android.view.ViewGroup; import com.android.systemui.R; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationPanelView; +import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.util.InjectionInflationController; @@ -30,8 +31,8 @@ import javax.inject.Inject; import javax.inject.Singleton; /** - * Creates a single instance of super_status_bar that can be shared across various system ui - * objects. + * Creates a single instance of super_status_bar and super_notification_shade that can be shared + * across various system ui objects. */ @Singleton public class SuperStatusBarViewFactory { @@ -39,6 +40,7 @@ public class SuperStatusBarViewFactory { private final Context mContext; private final InjectionInflationController mInjectionInflationController; + private NotificationShadeWindowView mNotificationShadeWindowView; private StatusBarWindowView mStatusBarWindowView; private NotificationShelf mNotificationShelf; @@ -50,15 +52,42 @@ public class SuperStatusBarViewFactory { } /** - * Gets the inflated {@link StatusBarWindowView} from {@link R.layout#super_status_bar}. Returns - * a cached instance, if it has already been inflated. + * Gets the inflated {@link NotificationShadeWindowView} from + * {@link R.layout#super_notification_shade}. + * Returns a cached instance, if it has already been inflated. + */ + public NotificationShadeWindowView getNotificationShadeWindowView() { + if (mNotificationShadeWindowView != null) { + return mNotificationShadeWindowView; + } + + mNotificationShadeWindowView = (NotificationShadeWindowView) + mInjectionInflationController.injectable( + LayoutInflater.from(mContext)).inflate(R.layout.super_notification_shade, + /* root= */ null); + if (mNotificationShadeWindowView == null) { + throw new IllegalStateException( + "R.layout.super_notification_shade could not be properly inflated"); + } + return mNotificationShadeWindowView; + } + + /** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */ + public LockIcon getLockIcon() { + return getNotificationShadeWindowView().findViewById(R.id.lock_icon); + } + + /** + * Gets the inflated {@link StatusBarWindowView} from {@link R.layout#super_status_bar}. + * Returns a cached instance, if it has already been inflated. */ public StatusBarWindowView getStatusBarWindowView() { if (mStatusBarWindowView != null) { return mStatusBarWindowView; } - mStatusBarWindowView = (StatusBarWindowView) mInjectionInflationController.injectable( + mStatusBarWindowView = + (StatusBarWindowView) mInjectionInflationController.injectable( LayoutInflater.from(mContext)).inflate(R.layout.super_status_bar, /* root= */ null); if (mStatusBarWindowView == null) { @@ -68,11 +97,6 @@ public class SuperStatusBarViewFactory { return mStatusBarWindowView; } - /** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */ - public LockIcon getLockIcon() { - return getStatusBarWindowView().findViewById(R.id.lock_icon); - } - /** * Gets the inflated {@link NotificationShelf} from * {@link R.layout#status_bar_notification_shelf}. @@ -98,11 +122,11 @@ public class SuperStatusBarViewFactory { } public NotificationPanelView getNotificationPanelView() { - StatusBarWindowView statusBarWindowView = getStatusBarWindowView(); - if (statusBarWindowView == null) { + NotificationShadeWindowView notificationShadeWindowView = getNotificationShadeWindowView(); + if (notificationShadeWindowView == null) { return null; } - return mStatusBarWindowView.findViewById(R.id.notification_panel); + return mNotificationShadeWindowView.findViewById(R.id.notification_panel); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index 66605690b106..5fc043ada22d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -38,7 +38,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NotificationPanelViewController; -import com.android.systemui.statusbar.phone.StatusBarWindowViewController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController; /** * A class that allows activities to be launched in a seamless way where the notification @@ -56,7 +56,7 @@ public class ActivityLaunchAnimator { private final NotificationPanelViewController mNotificationPanel; private final NotificationListContainer mNotificationContainer; private final float mWindowCornerRadius; - private final StatusBarWindowViewController mStatusBarWindowViewController; + private final NotificationShadeWindowViewController mNotificationShadeWindowViewController; private Callback mCallback; private final Runnable mTimeoutRunnable = () -> { setAnimationPending(false); @@ -67,21 +67,23 @@ public class ActivityLaunchAnimator { private boolean mIsLaunchForActivity; public ActivityLaunchAnimator( - StatusBarWindowViewController statusBarWindowViewController, + NotificationShadeWindowViewController notificationShadeWindowViewController, Callback callback, NotificationPanelViewController notificationPanel, NotificationListContainer container) { mNotificationPanel = notificationPanel; mNotificationContainer = container; - mStatusBarWindowViewController = statusBarWindowViewController; + mNotificationShadeWindowViewController = notificationShadeWindowViewController; mCallback = callback; mWindowCornerRadius = ScreenDecorationsUtils - .getWindowCornerRadius(mStatusBarWindowViewController.getView().getResources()); + .getWindowCornerRadius(mNotificationShadeWindowViewController.getView() + .getResources()); } public RemoteAnimationAdapter getLaunchAnimation( View sourceView, boolean occluded) { - if (!(sourceView instanceof ExpandableNotificationRow) || !mCallback.areLaunchAnimationsEnabled() || occluded) { + if (!(sourceView instanceof ExpandableNotificationRow) + || !mCallback.areLaunchAnimationsEnabled() || occluded) { return null; } AnimationRunner animationRunner = new AnimationRunner( @@ -113,11 +115,12 @@ public class ActivityLaunchAnimator { private void setAnimationPending(boolean pending) { mAnimationPending = pending; - mStatusBarWindowViewController.setExpandAnimationPending(pending); + mNotificationShadeWindowViewController.setExpandAnimationPending(pending); if (pending) { - mStatusBarWindowViewController.getView().postDelayed(mTimeoutRunnable, LAUNCH_TIMEOUT); + mNotificationShadeWindowViewController.getView().postDelayed(mTimeoutRunnable, + LAUNCH_TIMEOUT); } else { - mStatusBarWindowViewController.getView().removeCallbacks(mTimeoutRunnable); + mNotificationShadeWindowViewController.getView().removeCallbacks(mTimeoutRunnable); } } @@ -247,7 +250,7 @@ public class ActivityLaunchAnimator { private void setExpandAnimationRunning(boolean running) { mNotificationPanel.setLaunchingNotification(running); mSourceNotification.setExpandAnimationRunning(running); - mStatusBarWindowViewController.setExpandAnimationRunning(running); + mNotificationShadeWindowViewController.setExpandAnimationRunning(running); mNotificationContainer.setExpandingNotification(running ? mSourceNotification : null); mAnimationRunning = running; if (!running) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 76fdfc6fbabc..874d81db0bd2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -47,7 +47,7 @@ import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; -import com.android.systemui.statusbar.phone.StatusBarWindowController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.util.Utils; import java.util.Timer; @@ -181,8 +181,9 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi final int[] compactActions = mRow.getEntry().getSbn().getNotification().extras .getIntArray(Notification.EXTRA_COMPACT_ACTIONS); int tintColor = getNotificationHeader().getOriginalIconColor(); - StatusBarWindowController ctrl = Dependency.get(StatusBarWindowController.class); - QuickQSPanel panel = ctrl.getStatusBarView().findViewById( + NotificationShadeWindowController ctrl = Dependency.get( + NotificationShadeWindowController.class); + QuickQSPanel panel = ctrl.getNotificationShadeView().findViewById( com.android.systemui.R.id.quick_qs_panel); StatusBarNotification sbn = mRow.getEntry().getSbn(); Notification notif = sbn.getNotification(); @@ -193,7 +194,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi mActions, compactActions, notif.contentIntent); - QSPanel bigPanel = ctrl.getStatusBarView().findViewById( + QSPanel bigPanel = ctrl.getNotificationShadeView().findViewById( com.android.systemui.R.id.quick_settings_panel); bigPanel.addMediaSession(token, notif.getSmallIcon(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 48805204160f..691e1c422bfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -141,7 +141,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private final KeyguardUpdateMonitor mUpdateMonitor; private final DozeParameters mDozeParameters; private final KeyguardStateController mKeyguardStateController; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private final Context mContext; private final int mWakeUpDelay; private int mMode; @@ -162,7 +162,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp public BiometricUnlockController(Context context, DozeScrimController dozeScrimController, KeyguardViewMediator keyguardViewMediator, ScrimController scrimController, StatusBar statusBar, ShadeController shadeController, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, KeyguardStateController keyguardStateController, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, @Main Resources resources, @@ -177,7 +177,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMediaManager = Dependency.get(NotificationMediaManager.class); Dependency.get(WakefulnessLifecycle.class).addObserver(mWakefulnessObserver); Dependency.get(ScreenLifecycle.class).addObserver(mScreenObserver); - mStatusBarWindowController = statusBarWindowController; + + mNotificationShadeWindowController = notificationShadeWindowController; mDozeScrimController = dozeScrimController; mKeyguardViewMediator = keyguardViewMediator; mScrimController = scrimController; @@ -284,7 +285,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp // notifications would light up first, creating an unpleasant animation. // Defer changing the screen brightness by forcing doze brightness on our window // until the clock and the notifications are faded out. - mStatusBarWindowController.setForceDozeBrightness(true); + mNotificationShadeWindowController.setForceDozeBrightness(true); } // During wake and unlock, we need to draw black before waking up to avoid abrupt // brightness changes due to display state transitions. @@ -340,7 +341,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp Trace.beginSection("MODE_WAKE_AND_UNLOCK_FROM_DREAM"); mUpdateMonitor.awakenFromDream(); } - mStatusBarWindowController.setStatusBarFocusable(false); + mNotificationShadeWindowController.setNotificationShadeFocusable(false); if (delayWakeUp) { mHandler.postDelayed(wakeUp, mWakeUpDelay); } else { @@ -508,7 +509,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mHandler.postDelayed(new Runnable() { @Override public void run() { - mStatusBarWindowController.setForceDozeBrightness(false); + mNotificationShadeWindowController.setForceDozeBrightness(false); } }, StatusBar.FADE_KEYGUARD_DURATION_PULSING); } @@ -522,7 +523,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private void resetMode() { mMode = MODE_NONE; - mStatusBarWindowController.setForceDozeBrightness(false); + mNotificationShadeWindowController.setForceDozeBrightness(false); if (mStatusBar.getNavigationBarView() != null) { mStatusBar.getNavigationBarView().setWakeAndUnlocking(false); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java index accd2a4fcc0d..04efc2d7558d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java @@ -85,9 +85,9 @@ public final class DozeServiceHost implements DozeHost { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final VisualStabilityManager mVisualStabilityManager; private final PulseExpansionHandler mPulseExpansionHandler; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private final NotificationWakeUpCoordinator mNotificationWakeUpCoordinator; - private StatusBarWindowViewController mStatusBarWindowViewController; + private NotificationShadeWindowViewController mNotificationShadeWindowViewController; private final LockscreenLockIconController mLockscreenLockIconController; private NotificationIconAreaController mNotificationIconAreaController; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @@ -108,7 +108,7 @@ public final class DozeServiceHost implements DozeHost { DozeScrimController dozeScrimController, KeyguardUpdateMonitor keyguardUpdateMonitor, VisualStabilityManager visualStabilityManager, PulseExpansionHandler pulseExpansionHandler, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, NotificationWakeUpCoordinator notificationWakeUpCoordinator, LockscreenLockIconController lockscreenLockIconController) { super(); @@ -127,7 +127,7 @@ public final class DozeServiceHost implements DozeHost { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mVisualStabilityManager = visualStabilityManager; mPulseExpansionHandler = pulseExpansionHandler; - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mNotificationWakeUpCoordinator = notificationWakeUpCoordinator; mLockscreenLockIconController = lockscreenLockIconController; } @@ -140,13 +140,13 @@ public final class DozeServiceHost implements DozeHost { public void initialize(StatusBar statusBar, NotificationIconAreaController notificationIconAreaController, StatusBarKeyguardViewManager statusBarKeyguardViewManager, - StatusBarWindowViewController statusBarWindowViewController, + NotificationShadeWindowViewController notificationShadeWindowViewController, NotificationPanelViewController notificationPanel, View ambientIndicationContainer) { mStatusBar = statusBar; mNotificationIconAreaController = notificationIconAreaController; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mNotificationPanel = notificationPanel; - mStatusBarWindowViewController = statusBarWindowViewController; + mNotificationShadeWindowViewController = notificationShadeWindowViewController; mAmbientIndicationContainer = ambientIndicationContainer; mBiometricUnlockController = mBiometricUnlockControllerLazy.get(); } @@ -292,7 +292,7 @@ public final class DozeServiceHost implements DozeHost { } mIgnoreTouchWhilePulsing = ignore; if (mStatusBarStateController.isDozing() && ignore) { - mStatusBarWindowViewController.cancelCurrentTouch(); + mNotificationShadeWindowViewController.cancelCurrentTouch(); } } @@ -391,7 +391,7 @@ public final class DozeServiceHost implements DozeHost { @Override public void setDozeScreenBrightness(int value) { - mStatusBarWindowController.setDozeScreenBrightness(value); + mNotificationShadeWindowController.setDozeScreenBrightness(value); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 7b20a7b7037c..c39ee3a90230 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -92,21 +92,22 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, public HeadsUpAppearanceController( NotificationIconAreaController notificationIconAreaController, - HeadsUpManagerPhone headsUpManager, View statusbarView, + HeadsUpManagerPhone headsUpManager, + View notificationShadeView, SysuiStatusBarStateController statusBarStateController, KeyguardBypassController keyguardBypassController, KeyguardStateController keyguardStateController, NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue, - NotificationPanelViewController notificationPanelViewController) { + NotificationPanelViewController notificationPanelViewController, View statusBarView) { this(notificationIconAreaController, headsUpManager, statusBarStateController, keyguardBypassController, wakeUpCoordinator, keyguardStateController, commandQueue, - statusbarView.findViewById(R.id.heads_up_status_bar_view), - statusbarView.findViewById(R.id.notification_stack_scroller), + statusBarView.findViewById(R.id.heads_up_status_bar_view), + notificationShadeView.findViewById(R.id.notification_stack_scroller), notificationPanelViewController, - statusbarView.findViewById(R.id.clock), - statusbarView.findViewById(R.id.operator_name_frame), - statusbarView.findViewById(R.id.centered_icon_area)); + statusBarView.findViewById(R.id.clock), + statusBarView.findViewById(R.id.operator_name_frame), + statusBarView.findViewById(R.id.centered_icon_area)); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index 6ac6d354cfff..c6e3fdefe701 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -65,7 +65,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private final StatusBarStateController mStatusBarStateController; private final KeyguardBypassController mBypassController; private final int mAutoHeadsUpNotificationDecay; - private View mStatusBarWindowView; + private View mNotificationShadeWindowView; private NotificationGroupManager mGroupManager; private VisualStabilityManager mVisualStabilityManager; private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; @@ -124,14 +124,13 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, initResources(); } - - public void setUp(@NonNull View statusBarWindowView, + public void setUp(@NonNull View notificationShadeWindowView, @NonNull NotificationGroupManager groupManager, @NonNull StatusBar bar, @NonNull VisualStabilityManager visualStabilityManager) { - mStatusBarWindowView = statusBarWindowView; - mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(mContext, this, bar, - statusBarWindowView); + mNotificationShadeWindowView = notificationShadeWindowView; + mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(this, bar, + notificationShadeWindowView); mGroupManager = groupManager; mVisualStabilityManager = visualStabilityManager; @@ -364,7 +363,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, // updated yet, but callbacks leading out of the headsUp manager, querying it. Let's // therefore also check if the topEntry is null. if (!hasPinnedHeadsUp() || topEntry == null) { - mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); + mTouchableRegion.set(0, 0, mNotificationShadeWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); } else { @@ -386,7 +385,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } private void updateRegionForNotch(Region region) { - WindowInsets windowInsets = mStatusBarWindowView.getRootWindowInsets(); + WindowInsets windowInsets = mNotificationShadeWindowView.getRootWindowInsets(); if (windowInsets == null) { Log.w(TAG, "StatusBarWindowView is not attached."); return; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 3554b54db99b..707138ee8dc0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -128,7 +128,7 @@ public class NotificationIconAreaController implements DarkReceiver, mAodIcons.setAnimationsEnabled(false); mAodIcons.removeAllViews(); } - mAodIcons = mStatusBar.getStatusBarWindow().findViewById( + mAodIcons = mStatusBar.getNotificationShadeWindowView().findViewById( R.id.clock_notification_icon_container); mAodIcons.setOnLockScreen(true); updateAodIconsVisibility(false /* animate */); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 90ec2a076e87..6112ae88f634 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1367,14 +1367,7 @@ public class NotificationPanelViewController extends PanelViewController { if (mExpectingSynthesizedDown) { mExpectingSynthesizedDown = false; maybeVibrateOnOpening(); - Runnable runnable = () -> fling(velocity > 1f ? 1000f * velocity : 0, - true /* expand */); - if (mStatusBar.getStatusBarWindow().getHeight() != mStatusBar.getStatusBarHeight()) { - // The panel is already expanded to its full size, let's expand directly - runnable.run(); - } else { - mExpandAfterLayoutRunnable = runnable; - } + fling(velocity > 1f ? 1000f * velocity : 0, true /* expand */); onTrackingStopped(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java new file mode 100644 index 000000000000..d346d395e444 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java @@ -0,0 +1,714 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + +import static com.android.systemui.DejankUtils.whitelistIpcs; +import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; + +import android.app.IActivityManager; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.os.Binder; +import android.os.RemoteException; +import android.os.SystemProperties; +import android.os.Trace; +import android.util.Log; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; + +import com.android.systemui.Dumpable; +import com.android.systemui.R; +import com.android.systemui.colorextraction.SysuiColorExtractor; +import com.android.systemui.keyguard.KeyguardViewMediator; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; +import com.android.systemui.statusbar.RemoteInputController.Callback; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SuperStatusBarViewFactory; +import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; + +import com.google.android.collect.Lists; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Encapsulates all logic for the notification shade window state management. + */ +@Singleton +public class NotificationShadeWindowController implements Callback, Dumpable, + ConfigurationListener { + + private static final String TAG = "NotificationShadeWindowController"; + private static final boolean DEBUG = false; + + private final Context mContext; + private final WindowManager mWindowManager; + private final IActivityManager mActivityManager; + private final DozeParameters mDozeParameters; + private final LayoutParams mLpChanged; + private final boolean mKeyguardScreenRotation; + private final long mLockScreenDisplayTimeout; + private final Display.Mode mKeyguardDisplayMode; + private final KeyguardBypassController mKeyguardBypassController; + private ViewGroup mNotificationShadeView; + private LayoutParams mLp; + private boolean mHasTopUi; + private boolean mHasTopUiChanged; + private float mScreenBrightnessDoze; + private final State mCurrentState = new State(); + private OtherwisedCollapsedListener mListener; + private ForcePluginOpenListener mForcePluginOpenListener; + private final ArrayList<WeakReference<StatusBarWindowCallback>> + mCallbacks = Lists.newArrayList(); + + private final SysuiColorExtractor mColorExtractor; + private final SuperStatusBarViewFactory mSuperStatusBarViewFactory; + + @Inject + public NotificationShadeWindowController(Context context, WindowManager windowManager, + IActivityManager activityManager, DozeParameters dozeParameters, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController, + KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor, + SuperStatusBarViewFactory superStatusBarViewFactory) { + mContext = context; + mWindowManager = windowManager; + mActivityManager = activityManager; + mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation(); + mDozeParameters = dozeParameters; + mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze(); + mLpChanged = new LayoutParams(); + mKeyguardBypassController = keyguardBypassController; + mColorExtractor = colorExtractor; + mSuperStatusBarViewFactory = superStatusBarViewFactory; + mNotificationShadeView = mSuperStatusBarViewFactory.getNotificationShadeWindowView(); + + mLockScreenDisplayTimeout = context.getResources() + .getInteger(R.integer.config_lockScreenDisplayTimeout); + ((SysuiStatusBarStateController) statusBarStateController) + .addCallback(mStateListener, + SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER); + configurationController.addCallback(this); + + Display.Mode[] supportedModes = context.getDisplay().getSupportedModes(); + Display.Mode currentMode = context.getDisplay().getMode(); + // Running on the highest frame rate available can be expensive. + // Let's specify a preferred refresh rate, and allow higher FPS only when we + // know that we're not falsing (because we unlocked.) + int keyguardRefreshRate = context.getResources() + .getInteger(R.integer.config_keyguardRefreshRate); + // Find supported display mode with the same resolution and requested refresh rate. + mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode -> + (int) mode.getRefreshRate() == keyguardRefreshRate + && mode.getPhysicalWidth() == currentMode.getPhysicalWidth() + && mode.getPhysicalHeight() == currentMode.getPhysicalHeight()) + .findFirst().orElse(null); + } + + /** + * Register to receive notifications about status bar window state changes. + */ + public void registerCallback(StatusBarWindowCallback callback) { + // Prevent adding duplicate callbacks + for (int i = 0; i < mCallbacks.size(); i++) { + if (mCallbacks.get(i).get() == callback) { + return; + } + } + mCallbacks.add(new WeakReference<StatusBarWindowCallback>(callback)); + } + + private boolean shouldEnableKeyguardScreenRotation() { + Resources res = mContext.getResources(); + return SystemProperties.getBoolean("lockscreen.rot_override", false) + || res.getBoolean(R.bool.config_enableLockScreenRotation); + } + + /** + * Adds the notification shade view to the window manager. + */ + public void attach() { + // Now that the notification shade encompasses the sliding panel and its + // translucent backdrop, the entire thing is made TRANSLUCENT and is + // hardware-accelerated. + mLp = new LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + LayoutParams.TYPE_NOTIFICATION_SHADE, + LayoutParams.FLAG_NOT_FOCUSABLE + | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING + | LayoutParams.FLAG_SPLIT_TOUCH + | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + PixelFormat.TRANSLUCENT); + mLp.token = new Binder(); + mLp.gravity = Gravity.TOP; + mLp.setFitWindowInsetsTypes(0 /* types */); + mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + mLp.setTitle("NotificationShade"); + mLp.packageName = mContext.getPackageName(); + mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + mWindowManager.addView(mNotificationShadeView, mLp); + mLpChanged.copyFrom(mLp); + onThemeChanged(); + } + + public ViewGroup getNotificationShadeView() { + return mNotificationShadeView; + } + + public void setDozeScreenBrightness(int value) { + mScreenBrightnessDoze = value / 255f; + } + + private void setKeyguardDark(boolean dark) { + int vis = mNotificationShadeView.getSystemUiVisibility(); + if (dark) { + vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + mNotificationShadeView.setSystemUiVisibility(vis); + } + + private void applyKeyguardFlags(State state) { + final boolean scrimsOccludingWallpaper = + state.mScrimsVisibility == ScrimController.OPAQUE; + final boolean keyguardOrAod = state.mKeyguardShowing + || (state.mDozing && mDozeParameters.getAlwaysOn()); + if (keyguardOrAod && !state.mBackdropShowing && !scrimsOccludingWallpaper) { + mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER; + } + + if (state.mDozing) { + mLpChanged.privateFlags |= LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + } else { + mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + } + + if (mKeyguardDisplayMode != null) { + boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled() + && state.mStatusBarState == StatusBarState.KEYGUARD + && !state.mKeyguardFadingAway && !state.mKeyguardGoingAway; + if (state.mDozing || bypassOnKeyguard) { + mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId(); + } else { + mLpChanged.preferredDisplayModeId = 0; + } + Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId); + } + } + + private void adjustScreenOrientation(State state) { + if (state.isKeyguardShowingAndNotOccluded() || state.mDozing) { + if (mKeyguardScreenRotation) { + mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; + } else { + mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; + } + } else { + mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; + } + } + + private void applyFocusableFlag(State state) { + boolean panelFocusable = state.mNotificationShadeFocusable && state.mPanelExpanded; + if (state.mBouncerShowing && (state.mKeyguardOccluded || state.mKeyguardNeedsInput) + || ENABLE_REMOTE_INPUT && state.mRemoteInputActive + || state.mBubbleExpanded) { + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) { + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags |= LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } else { + mLpChanged.flags |= LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } + + mLpChanged.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + } + + private void applyForceShowNavigationFlag(State state) { + if (state.mPanelExpanded || state.mBouncerShowing + || ENABLE_REMOTE_INPUT && state.mRemoteInputActive) { + mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; + } else { + mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; + } + } + + private void applyVisibility(State state) { + boolean visible = isExpanded(state); + if (state.mForcePluginOpen) { + if (mListener != null) { + mListener.setWouldOtherwiseCollapse(visible); + } + visible = true; + } + if (visible) { + mNotificationShadeView.setVisibility(View.VISIBLE); + } else { + mNotificationShadeView.setVisibility(View.INVISIBLE); + } + } + + private boolean isExpanded(State state) { + return !state.mForceCollapsed && (state.isKeyguardShowingAndNotOccluded() + || state.mPanelVisible || state.mKeyguardFadingAway || state.mBouncerShowing + || state.mHeadsUpShowing || state.mBubblesShowing + || state.mScrimsVisibility != ScrimController.TRANSPARENT); + } + + private void applyFitsSystemWindows(State state) { + boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded(); + if (mNotificationShadeView != null + && mNotificationShadeView.getFitsSystemWindows() != fitsSystemWindows) { + mNotificationShadeView.setFitsSystemWindows(fitsSystemWindows); + mNotificationShadeView.requestApplyInsets(); + } + } + + private void applyUserActivityTimeout(State state) { + if (state.isKeyguardShowingAndNotOccluded() + && state.mStatusBarState == StatusBarState.KEYGUARD + && !state.mQsExpanded) { + mLpChanged.userActivityTimeout = state.mBouncerShowing + ? KeyguardViewMediator.AWAKE_INTERVAL_BOUNCER_MS : mLockScreenDisplayTimeout; + } else { + mLpChanged.userActivityTimeout = -1; + } + } + + private void applyInputFeatures(State state) { + if (state.isKeyguardShowingAndNotOccluded() + && state.mStatusBarState == StatusBarState.KEYGUARD + && !state.mQsExpanded && !state.mForceUserActivity) { + mLpChanged.inputFeatures |= + LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; + } else { + mLpChanged.inputFeatures &= + ~LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; + } + } + + private void applyStatusBarColorSpaceAgnosticFlag(State state) { + if (!isExpanded(state)) { + mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; + } else { + mLpChanged.privateFlags &= + ~LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; + } + } + + private void apply(State state) { + applyKeyguardFlags(state); + applyFocusableFlag(state); + applyForceShowNavigationFlag(state); + adjustScreenOrientation(state); + applyVisibility(state); + applyUserActivityTimeout(state); + applyInputFeatures(state); + applyFitsSystemWindows(state); + applyModalFlag(state); + applyBrightness(state); + applyHasTopUi(state); + applyNotTouchable(state); + applyStatusBarColorSpaceAgnosticFlag(state); + if (mLp != null && mLp.copyFrom(mLpChanged) != 0) { + mWindowManager.updateViewLayout(mNotificationShadeView, mLp); + } + if (mHasTopUi != mHasTopUiChanged) { + whitelistIpcs(() -> { + try { + mActivityManager.setHasTopUi(mHasTopUiChanged); + } catch (RemoteException e) { + Log.e(TAG, "Failed to call setHasTopUi", e); + } + mHasTopUi = mHasTopUiChanged; + }); + } + notifyStateChangedCallbacks(); + } + + public void notifyStateChangedCallbacks() { + for (int i = 0; i < mCallbacks.size(); i++) { + StatusBarWindowCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onStateChanged(mCurrentState.mKeyguardShowing, + mCurrentState.mKeyguardOccluded, + mCurrentState.mBouncerShowing); + } + } + } + + private void applyModalFlag(State state) { + if (state.mHeadsUpShowing) { + mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCH_MODAL; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCH_MODAL; + } + } + + private void applyBrightness(State state) { + if (state.mForceDozeBrightness) { + mLpChanged.screenBrightness = mScreenBrightnessDoze; + } else { + mLpChanged.screenBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE; + } + } + + private void applyHasTopUi(State state) { + mHasTopUiChanged = state.mForceHasTopUi || isExpanded(state); + } + + private void applyNotTouchable(State state) { + if (state.mNotTouchable) { + mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCHABLE; + } else { + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCHABLE; + } + } + + public void setKeyguardShowing(boolean showing) { + mCurrentState.mKeyguardShowing = showing; + apply(mCurrentState); + } + + public void setKeyguardOccluded(boolean occluded) { + mCurrentState.mKeyguardOccluded = occluded; + apply(mCurrentState); + } + + public void setKeyguardNeedsInput(boolean needsInput) { + mCurrentState.mKeyguardNeedsInput = needsInput; + apply(mCurrentState); + } + + public void setPanelVisible(boolean visible) { + mCurrentState.mPanelVisible = visible; + mCurrentState.mNotificationShadeFocusable = visible; + apply(mCurrentState); + } + + public void setNotificationShadeFocusable(boolean focusable) { + mCurrentState.mNotificationShadeFocusable = focusable; + apply(mCurrentState); + } + + public void setBouncerShowing(boolean showing) { + mCurrentState.mBouncerShowing = showing; + apply(mCurrentState); + } + + public void setBackdropShowing(boolean showing) { + mCurrentState.mBackdropShowing = showing; + apply(mCurrentState); + } + + public void setKeyguardFadingAway(boolean keyguardFadingAway) { + mCurrentState.mKeyguardFadingAway = keyguardFadingAway; + apply(mCurrentState); + } + + public void setQsExpanded(boolean expanded) { + mCurrentState.mQsExpanded = expanded; + apply(mCurrentState); + } + + public void setForceUserActivity(boolean forceUserActivity) { + mCurrentState.mForceUserActivity = forceUserActivity; + apply(mCurrentState); + } + + public void setScrimsVisibility(int scrimsVisibility) { + mCurrentState.mScrimsVisibility = scrimsVisibility; + apply(mCurrentState); + } + + public void setHeadsUpShowing(boolean showing) { + mCurrentState.mHeadsUpShowing = showing; + apply(mCurrentState); + } + + public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) { + mCurrentState.mWallpaperSupportsAmbientMode = supportsAmbientMode; + apply(mCurrentState); + } + + /** + * @param state The {@link StatusBarStateController} of the status bar. + */ + private void setStatusBarState(int state) { + mCurrentState.mStatusBarState = state; + apply(mCurrentState); + } + + /** + * Force the window to be collapsed, even if it should theoretically be expanded. + * Used for when a heads-up comes in but we still need to wait for the touchable regions to + * be computed. + */ + public void setForceWindowCollapsed(boolean force) { + mCurrentState.mForceCollapsed = force; + apply(mCurrentState); + } + + public void setPanelExpanded(boolean isExpanded) { + mCurrentState.mPanelExpanded = isExpanded; + apply(mCurrentState); + } + + @Override + public void onRemoteInputActive(boolean remoteInputActive) { + mCurrentState.mRemoteInputActive = remoteInputActive; + apply(mCurrentState); + } + + /** + * Set whether the screen brightness is forced to the value we use for doze mode by the status + * bar window. + */ + public void setForceDozeBrightness(boolean forceDozeBrightness) { + mCurrentState.mForceDozeBrightness = forceDozeBrightness; + apply(mCurrentState); + } + + public void setDozing(boolean dozing) { + mCurrentState.mDozing = dozing; + apply(mCurrentState); + } + + public void setForcePluginOpen(boolean forcePluginOpen) { + mCurrentState.mForcePluginOpen = forcePluginOpen; + apply(mCurrentState); + if (mForcePluginOpenListener != null) { + mForcePluginOpenListener.onChange(forcePluginOpen); + } + } + + /** + * The forcePluginOpen state for the status bar. + */ + public boolean getForcePluginOpen() { + return mCurrentState.mForcePluginOpen; + } + + public void setNotTouchable(boolean notTouchable) { + mCurrentState.mNotTouchable = notTouchable; + apply(mCurrentState); + } + + /** + * Sets whether there are bubbles showing on the screen. + */ + public void setBubblesShowing(boolean bubblesShowing) { + mCurrentState.mBubblesShowing = bubblesShowing; + apply(mCurrentState); + } + + /** + * The bubbles showing state for the status bar. + */ + public boolean getBubblesShowing() { + return mCurrentState.mBubblesShowing; + } + + /** + * Sets if there is a bubble being expanded on the screen. + */ + public void setBubbleExpanded(boolean bubbleExpanded) { + mCurrentState.mBubbleExpanded = bubbleExpanded; + apply(mCurrentState); + } + + /** + * Whether the bubble is shown in expanded state for the status bar. + */ + public boolean getBubbleExpanded() { + return mCurrentState.mBubbleExpanded; + } + + /** + * Whether the status bar panel is expanded or not. + */ + public boolean getPanelExpanded() { + return mCurrentState.mPanelExpanded; + } + + public void setStateListener(OtherwisedCollapsedListener listener) { + mListener = listener; + } + + public void setForcePluginOpenListener(ForcePluginOpenListener listener) { + mForcePluginOpenListener = listener; + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("StatusBarWindowController:"); + pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode); + pw.println(mCurrentState); + } + + public boolean isShowingWallpaper() { + return !mCurrentState.mBackdropShowing; + } + + @Override + public void onThemeChanged() { + if (mNotificationShadeView == null) { + return; + } + + final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); + // Make sure we have the correct navbar/statusbar colors. + setKeyguardDark(useDarkText); + } + + /** + * When keyguard will be dismissed but didn't start animation yet. + */ + public void setKeyguardGoingAway(boolean goingAway) { + mCurrentState.mKeyguardGoingAway = goingAway; + apply(mCurrentState); + } + + public boolean getForceHasTopUi() { + return mCurrentState.mForceHasTopUi; + } + + public void setForceHasTopUi(boolean forceHasTopUi) { + mCurrentState.mForceHasTopUi = forceHasTopUi; + apply(mCurrentState); + } + + private static class State { + boolean mKeyguardShowing; + boolean mKeyguardOccluded; + boolean mKeyguardNeedsInput; + boolean mPanelVisible; + boolean mPanelExpanded; + boolean mNotificationShadeFocusable; + boolean mBouncerShowing; + boolean mKeyguardFadingAway; + boolean mKeyguardGoingAway; + boolean mQsExpanded; + boolean mHeadsUpShowing; + boolean mForceCollapsed; + boolean mForceDozeBrightness; + boolean mForceUserActivity; + boolean mBackdropShowing; + boolean mWallpaperSupportsAmbientMode; + boolean mNotTouchable; + boolean mBubblesShowing; + boolean mBubbleExpanded; + boolean mForceHasTopUi; + + /** + * The {@link StatusBar} state from the status bar. + */ + int mStatusBarState; + + boolean mRemoteInputActive; + boolean mForcePluginOpen; + boolean mDozing; + int mScrimsVisibility; + + private boolean isKeyguardShowingAndNotOccluded() { + return mKeyguardShowing && !mKeyguardOccluded; + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + String newLine = "\n"; + result.append("Window State {"); + result.append(newLine); + + Field[] fields = this.getClass().getDeclaredFields(); + + // Print field names paired with their values + for (Field field : fields) { + result.append(" "); + try { + result.append(field.getName()); + result.append(": "); + //requires access to private field: + result.append(field.get(this)); + } catch (IllegalAccessException ex) { + } + result.append(newLine); + } + result.append("}"); + + return result.toString(); + } + } + + private final StateListener mStateListener = new StateListener() { + @Override + public void onStateChanged(int newState) { + setStatusBarState(newState); + } + + @Override + public void onDozingChanged(boolean isDozing) { + setDozing(isDozing); + } + }; + + /** + * Custom listener to pipe data back to plugins about whether or not the status bar would be + * collapsed if not for the plugin. + * TODO: Find cleaner way to do this. + */ + public interface OtherwisedCollapsedListener { + void setWouldOtherwiseCollapse(boolean otherwiseCollapse); + } + + /** + * Listener to indicate forcePluginOpen has changed + */ + public interface ForcePluginOpenListener { + /** + * Called when mState.forcePluginOpen is changed + */ + void onChange(boolean forceOpen); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java new file mode 100644 index 000000000000..6979554303b3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java @@ -0,0 +1,614 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import android.annotation.ColorInt; +import android.annotation.DrawableRes; +import android.annotation.LayoutRes; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Insets; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.DisplayCutout; +import android.view.InputQueue; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.SurfaceHolder; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowInsets; +import android.view.WindowInsetsController; +import android.widget.FrameLayout; + +import com.android.internal.view.FloatingActionMode; +import com.android.internal.widget.FloatingToolbar; +import com.android.systemui.R; + +/** + * Combined keyguard and notification panel view. Also holding backdrop and scrims. + */ +public class NotificationShadeWindowView extends FrameLayout { + public static final String TAG = "NotificationShadeWindowView"; + public static final boolean DEBUG = StatusBar.DEBUG; + + private int mRightInset = 0; + private int mLeftInset = 0; + + // Implements the floating action mode for TextView's Cut/Copy/Past menu. Normally provided by + // DecorView, but since this is a special window we have to roll our own. + private View mFloatingActionModeOriginatingView; + private ActionMode mFloatingActionMode; + private FloatingToolbar mFloatingToolbar; + private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener; + + private InteractionEventHandler mInteractionEventHandler; + + public NotificationShadeWindowView(Context context, AttributeSet attrs) { + super(context, attrs); + setMotionEventSplittingEnabled(false); + } + + public NotificationPanelView getNotificationPanelView() { + return findViewById(R.id.notification_panel); + } + + @Override + public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) { + final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars()); + if (getFitsSystemWindows()) { + boolean paddingChanged = insets.top != getPaddingTop() + || insets.bottom != getPaddingBottom(); + + int rightCutout = 0; + int leftCutout = 0; + DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout(); + if (displayCutout != null) { + leftCutout = displayCutout.getSafeInsetLeft(); + rightCutout = displayCutout.getSafeInsetRight(); + } + + int targetLeft = Math.max(insets.left, leftCutout); + int targetRight = Math.max(insets.right, rightCutout); + + // Super-special right inset handling, because scrims and backdrop need to ignore it. + if (targetRight != mRightInset || targetLeft != mLeftInset) { + mRightInset = targetRight; + mLeftInset = targetLeft; + applyMargins(); + } + // Drop top inset, and pass through bottom inset. + if (paddingChanged) { + setPadding(0, 0, 0, 0); + } + } else { + if (mRightInset != 0 || mLeftInset != 0) { + mRightInset = 0; + mLeftInset = 0; + applyMargins(); + } + boolean changed = getPaddingLeft() != 0 + || getPaddingRight() != 0 + || getPaddingTop() != 0 + || getPaddingBottom() != 0; + if (changed) { + setPadding(0, 0, 0, 0); + } + } + return windowInsets; + } + + private void applyMargins() { + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + if (child.getLayoutParams() instanceof LayoutParams) { + LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (!lp.ignoreRightInset + && (lp.rightMargin != mRightInset || lp.leftMargin != mLeftInset)) { + lp.rightMargin = mRightInset; + lp.leftMargin = mLeftInset; + child.requestLayout(); + } + } + } + } + + @Override + public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected FrameLayout.LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + setWillNotDraw(!DEBUG); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (mInteractionEventHandler.interceptMediaKey(event)) { + return true; + } + + if (super.dispatchKeyEvent(event)) { + return true; + } + + return mInteractionEventHandler.dispatchKeyEvent(event); + } + + protected void setInteractionEventHandler(InteractionEventHandler listener) { + mInteractionEventHandler = listener; + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev); + + return result != null ? result : super.dispatchTouchEvent(ev); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + boolean intercept = mInteractionEventHandler.shouldInterceptTouchEvent(ev); + if (!intercept) { + intercept = super.onInterceptTouchEvent(ev); + } + if (intercept) { + mInteractionEventHandler.didIntercept(ev); + } + + return intercept; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + boolean handled = mInteractionEventHandler.handleTouchEvent(ev); + + if (!handled) { + handled = super.onTouchEvent(ev); + } + + if (!handled) { + mInteractionEventHandler.didNotHandleTouchEvent(ev); + } + + return handled; + } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (DEBUG) { + Paint pt = new Paint(); + pt.setColor(0x80FFFF00); + pt.setStrokeWidth(12.0f); + pt.setStyle(Paint.Style.STROKE); + canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt); + } + } + + class LayoutParams extends FrameLayout.LayoutParams { + + public boolean ignoreRightInset; + + LayoutParams(int width, int height) { + super(width, height); + } + + LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + + TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout); + ignoreRightInset = a.getBoolean( + R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false); + a.recycle(); + } + } + + @Override + public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback, + int type) { + if (type == ActionMode.TYPE_FLOATING) { + return startActionMode(originalView, callback, type); + } + return super.startActionModeForChild(originalView, callback, type); + } + + private ActionMode createFloatingActionMode( + View originatingView, ActionMode.Callback2 callback) { + if (mFloatingActionMode != null) { + mFloatingActionMode.finish(); + } + cleanupFloatingActionModeViews(); + mFloatingToolbar = new FloatingToolbar(mFakeWindow); + final FloatingActionMode mode = + new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar); + mFloatingActionModeOriginatingView = originatingView; + mFloatingToolbarPreDrawListener = + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + mode.updateViewLocationInWindow(); + return true; + } + }; + return mode; + } + + private void setHandledFloatingActionMode(ActionMode mode) { + mFloatingActionMode = mode; + mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary. + mFloatingActionModeOriginatingView.getViewTreeObserver() + .addOnPreDrawListener(mFloatingToolbarPreDrawListener); + } + + private void cleanupFloatingActionModeViews() { + if (mFloatingToolbar != null) { + mFloatingToolbar.dismiss(); + mFloatingToolbar = null; + } + if (mFloatingActionModeOriginatingView != null) { + if (mFloatingToolbarPreDrawListener != null) { + mFloatingActionModeOriginatingView.getViewTreeObserver() + .removeOnPreDrawListener(mFloatingToolbarPreDrawListener); + mFloatingToolbarPreDrawListener = null; + } + mFloatingActionModeOriginatingView = null; + } + } + + private ActionMode startActionMode( + View originatingView, ActionMode.Callback callback, int type) { + ActionMode.Callback2 wrappedCallback = new ActionModeCallback2Wrapper(callback); + ActionMode mode = createFloatingActionMode(originatingView, wrappedCallback); + if (mode != null && wrappedCallback.onCreateActionMode(mode, mode.getMenu())) { + setHandledFloatingActionMode(mode); + } else { + mode = null; + } + return mode; + } + + private class ActionModeCallback2Wrapper extends ActionMode.Callback2 { + private final ActionMode.Callback mWrapped; + + ActionModeCallback2Wrapper(ActionMode.Callback wrapped) { + mWrapped = wrapped; + } + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return mWrapped.onCreateActionMode(mode, menu); + } + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + requestFitSystemWindows(); + return mWrapped.onPrepareActionMode(mode, menu); + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return mWrapped.onActionItemClicked(mode, item); + } + + public void onDestroyActionMode(ActionMode mode) { + mWrapped.onDestroyActionMode(mode); + if (mode == mFloatingActionMode) { + cleanupFloatingActionModeViews(); + mFloatingActionMode = null; + } + requestFitSystemWindows(); + } + + @Override + public void onGetContentRect(ActionMode mode, View view, Rect outRect) { + if (mWrapped instanceof ActionMode.Callback2) { + ((ActionMode.Callback2) mWrapped).onGetContentRect(mode, view, outRect); + } else { + super.onGetContentRect(mode, view, outRect); + } + } + } + + interface InteractionEventHandler { + /** + * Returns a result for {@link ViewGroup#dispatchTouchEvent(MotionEvent)} or null to defer + * to the super method. + */ + Boolean handleDispatchTouchEvent(MotionEvent ev); + + /** + * Returns if the view should intercept the touch event. + * + * The touch event may still be interecepted if + * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)} decides to do so. + */ + boolean shouldInterceptTouchEvent(MotionEvent ev); + + /** + * Called when the view decides to intercept the touch event. + */ + void didIntercept(MotionEvent ev); + + boolean handleTouchEvent(MotionEvent ev); + + void didNotHandleTouchEvent(MotionEvent ev); + + boolean interceptMediaKey(KeyEvent event); + + boolean dispatchKeyEvent(KeyEvent event); + } + + /** + * Minimal window to satisfy FloatingToolbar. + */ + private Window mFakeWindow = new Window(mContext) { + @Override + public void takeSurface(SurfaceHolder.Callback2 callback) { + } + + @Override + public void takeInputQueue(InputQueue.Callback callback) { + } + + @Override + public boolean isFloating() { + return false; + } + + @Override + public void alwaysReadCloseOnTouchAttr() { + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + } + + @Override + public void setContentView(View view) { + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + } + + @Override + public void clearContentView() { + } + + @Override + public View getCurrentFocus() { + return null; + } + + @Override + public LayoutInflater getLayoutInflater() { + return null; + } + + @Override + public void setTitle(CharSequence title) { + } + + @Override + public void setTitleColor(@ColorInt int textColor) { + } + + @Override + public void openPanel(int featureId, KeyEvent event) { + } + + @Override + public void closePanel(int featureId) { + } + + @Override + public void togglePanel(int featureId, KeyEvent event) { + } + + @Override + public void invalidatePanelMenu(int featureId) { + } + + @Override + public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) { + return false; + } + + @Override + public boolean performPanelIdentifierAction(int featureId, int id, int flags) { + return false; + } + + @Override + public void closeAllPanels() { + } + + @Override + public boolean performContextMenuIdentifierAction(int id, int flags) { + return false; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + } + + @Override + public void setBackgroundDrawable(Drawable drawable) { + } + + @Override + public void setFeatureDrawableResource(int featureId, @DrawableRes int resId) { + } + + @Override + public void setFeatureDrawableUri(int featureId, Uri uri) { + } + + @Override + public void setFeatureDrawable(int featureId, Drawable drawable) { + } + + @Override + public void setFeatureDrawableAlpha(int featureId, int alpha) { + } + + @Override + public void setFeatureInt(int featureId, int value) { + } + + @Override + public void takeKeyEvents(boolean get) { + } + + @Override + public boolean superDispatchKeyEvent(KeyEvent event) { + return false; + } + + @Override + public boolean superDispatchKeyShortcutEvent(KeyEvent event) { + return false; + } + + @Override + public boolean superDispatchTouchEvent(MotionEvent event) { + return false; + } + + @Override + public boolean superDispatchTrackballEvent(MotionEvent event) { + return false; + } + + @Override + public boolean superDispatchGenericMotionEvent(MotionEvent event) { + return false; + } + + @Override + public View getDecorView() { + return NotificationShadeWindowView.this; + } + + @Override + public View peekDecorView() { + return null; + } + + @Override + public Bundle saveHierarchyState() { + return null; + } + + @Override + public void restoreHierarchyState(Bundle savedInstanceState) { + } + + @Override + protected void onActive() { + } + + @Override + public void setChildDrawable(int featureId, Drawable drawable) { + } + + @Override + public void setChildInt(int featureId, int value) { + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return false; + } + + @Override + public void setVolumeControlStream(int streamType) { + } + + @Override + public int getVolumeControlStream() { + return 0; + } + + @Override + public int getStatusBarColor() { + return 0; + } + + @Override + public void setStatusBarColor(@ColorInt int color) { + } + + @Override + public int getNavigationBarColor() { + return 0; + } + + @Override + public void setNavigationBarColor(@ColorInt int color) { + } + + @Override + public void setDecorCaptionShade(int decorCaptionShade) { + } + + @Override + public void setResizingCaptionDrawable(Drawable drawable) { + } + + @Override + public void onMultiWindowModeChanged() { + } + + @Override + public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { + } + + @Override + public void reportActivityRelaunched() { + } + + @Override + public WindowInsetsController getInsetsController() { + return null; + } + }; + +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java index 4935f0e8dd83..c691a35b566a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java @@ -16,7 +16,10 @@ package com.android.systemui.statusbar.phone; +import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; + import android.app.StatusBarManager; +import android.graphics.RectF; import android.hardware.display.AmbientDisplayConfiguration; import android.media.AudioManager; import android.media.session.MediaSessionLegacyHelper; @@ -56,9 +59,9 @@ import java.io.PrintWriter; import javax.inject.Inject; /** - * Controller for {@link StatusBarWindowView}. + * Controller for {@link NotificationShadeWindowView}. */ -public class StatusBarWindowViewController { +public class NotificationShadeWindowViewController { private final InjectionInflationController mInjectionInflationController; private final NotificationWakeUpCoordinator mCoordinator; private final PulseExpansionHandler mPulseExpansionHandler; @@ -74,7 +77,7 @@ public class StatusBarWindowViewController { private final DozeLog mDozeLog; private final DozeParameters mDozeParameters; private final CommandQueue mCommandQueue; - private final StatusBarWindowView mView; + private final NotificationShadeWindowView mView; private final ShadeController mShadeController; private GestureDetector mGestureDetector; @@ -93,8 +96,13 @@ public class StatusBarWindowViewController { private final DockManager mDockManager; private final NotificationPanelViewController mNotificationPanelViewController; + // Used for determining view / touch intersection + private int[] mTempLocation = new int[2]; + private RectF mTempRect = new RectF(); + private boolean mIsTrackingBarGesture = false; + @Inject - public StatusBarWindowViewController( + public NotificationShadeWindowViewController( InjectionInflationController injectionInflationController, NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler, @@ -112,7 +120,7 @@ public class StatusBarWindowViewController { CommandQueue commandQueue, ShadeController shadeController, DockManager dockManager, - StatusBarWindowView statusBarWindowView, + NotificationShadeWindowView statusBarWindowView, NotificationPanelViewController notificationPanelViewController) { mInjectionInflationController = injectionInflationController; mCoordinator = coordinator; @@ -182,7 +190,7 @@ public class StatusBarWindowViewController { }; mGestureDetector = new GestureDetector(mView.getContext(), gestureListener); - mView.setInteractionEventHandler(new StatusBarWindowView.InteractionEventHandler() { + mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() { @Override public Boolean handleDispatchTouchEvent(MotionEvent ev) { boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN; @@ -244,6 +252,26 @@ public class StatusBarWindowViewController { return mStatusBarView.dispatchTouchEvent(ev); } + if (!mIsTrackingBarGesture && isDown + && mNotificationPanelViewController.isFullyCollapsed()) { + float x = ev.getRawX(); + float y = ev.getRawY(); + if (isIntersecting(mStatusBarView, x, y)) { + if (mService.isSameStatusBarState(WINDOW_STATE_SHOWING)) { + mIsTrackingBarGesture = true; + return mStatusBarView.dispatchTouchEvent(ev); + } else { // it's hidden or hiding, don't send to notification shade. + return true; + } + } + } else if (mIsTrackingBarGesture) { + final boolean sendToNotification = mStatusBarView.dispatchTouchEvent(ev); + if (isUp || isCancel) { + mIsTrackingBarGesture = false; + } + return sendToNotification; + } + return null; } @@ -357,7 +385,7 @@ public class StatusBarWindowViewController { dragDownCallback, mFalsingManager)); } - public StatusBarWindowView getView() { + public NotificationShadeWindowView getView() { return mView; } @@ -414,4 +442,11 @@ public class StatusBarWindowViewController { void setDragDownHelper(DragDownHelper dragDownHelper) { mDragDownHelper = dragDownHelper; } + + private boolean isIntersecting(View view, float x, float y) { + mTempLocation = view.getLocationOnScreen(); + mTempRect.set(mTempLocation[0], mTempLocation[1], mTempLocation[0] + view.getWidth(), + mTempLocation[1] + view.getHeight()); + return mTempRect.contains(x, y); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index 3d8e09afea4d..af46f7bfa82d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -783,8 +783,7 @@ public abstract class PanelViewController { mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); return; } - if (mStatusBar.getStatusBarWindow().getHeight() - != mStatusBar.getStatusBarHeight()) { + if (mStatusBar.getNotificationShadeWindowView().isVisibleToUser()) { mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); if (mAnimateAfterExpanding) { notifyExpandingStarted(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 45f3bf986141..ffbbffc0d8d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -323,8 +323,7 @@ public class PhoneStatusBarView extends PanelBar { R.dimen.display_cutout_margin_consumption); ViewGroup.LayoutParams layoutParams = getLayoutParams(); - layoutParams.height = getResources().getDimensionPixelSize( - R.dimen.status_bar_height); + layoutParams.height = getResources().getDimensionPixelSize(R.dimen.status_bar_height); setLayoutParams(layoutParams); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java index 866dc2d51241..333061547d7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java @@ -44,7 +44,7 @@ public class ShadeControllerImpl implements ShadeController { private final CommandQueue mCommandQueue; private final StatusBarStateController mStatusBarStateController; - protected final StatusBarWindowController mStatusBarWindowController; + protected final NotificationShadeWindowController mNotificationShadeWindowController; private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final int mDisplayId; protected final Lazy<StatusBar> mStatusBarLazy; @@ -57,7 +57,7 @@ public class ShadeControllerImpl implements ShadeController { public ShadeControllerImpl( CommandQueue commandQueue, StatusBarStateController statusBarStateController, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, StatusBarKeyguardViewManager statusBarKeyguardViewManager, WindowManager windowManager, Lazy<StatusBar> statusBarLazy, @@ -66,7 +66,7 @@ public class ShadeControllerImpl implements ShadeController { ) { mCommandQueue = commandQueue; mStatusBarStateController = statusBarStateController; - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mDisplayId = windowManager.getDefaultDisplay().getDisplayId(); // TODO: Remove circular reference to StatusBar when possible. @@ -122,14 +122,15 @@ public class ShadeControllerImpl implements ShadeController { } // TODO(b/62444020): remove when this bug is fixed - Log.v(TAG, "mStatusBarWindow: " + getStatusBarWindowView() + " canPanelBeCollapsed(): " + Log.v(TAG, "NotificationShadeWindow: " + getNotificationShadeWindowView() + + " canPanelBeCollapsed(): " + getNotificationPanelViewController().canPanelBeCollapsed()); - if (getStatusBarWindowView() != null + if (getNotificationShadeWindowView() != null && getNotificationPanelViewController().canPanelBeCollapsed()) { // release focus immediately to kick off focus change transition - mStatusBarWindowController.setStatusBarFocusable(false); + mNotificationShadeWindowController.setNotificationShadeFocusable(false); - getStatusBar().getStatusBarWindowViewController().cancelExpandHelper(); + getStatusBar().getNotificationShadeWindowViewController().cancelExpandHelper(); getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor); } else { mBubbleControllerLazy.get().collapseStack(); @@ -154,8 +155,7 @@ public class ShadeControllerImpl implements ShadeController { new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { - if (getStatusBar().getStatusBarWindow().getHeight() - != getStatusBar().getStatusBarHeight()) { + if (getStatusBar().getNotificationShadeWindowView().isVisibleToUser()) { getNotificationPanelViewController().removeOnGlobalLayoutListener(this); getNotificationPanelViewController().getView().post(executable); } @@ -222,8 +222,8 @@ public class ShadeControllerImpl implements ShadeController { return getStatusBar().getPresenter(); } - protected StatusBarWindowView getStatusBarWindowView() { - return getStatusBar().getStatusBarWindow(); + protected NotificationShadeWindowView getNotificationShadeWindowView() { + return getStatusBar().getNotificationShadeWindowView(); } protected PhoneStatusBarView getStatusBarView() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index dc9cf7714e7e..4e8442f14dba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -342,9 +342,11 @@ public class StatusBar extends SystemUI implements DemoMode, private final Point mCurrentDisplaySize = new Point(); - protected StatusBarWindowView mStatusBarWindow; + protected NotificationShadeWindowView mNotificationShadeWindowView; + protected StatusBarWindowView mPhoneStatusBarWindow; protected PhoneStatusBarView mStatusBarView; private int mStatusBarWindowState = WINDOW_STATE_SHOWING; + protected NotificationShadeWindowController mNotificationShadeWindowController; protected StatusBarWindowController mStatusBarWindowController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final LockscreenLockIconController mLockscreenLockIconController; @@ -368,7 +370,7 @@ public class StatusBar extends SystemUI implements DemoMode, private final FalsingManager mFalsingManager; private final BroadcastDispatcher mBroadcastDispatcher; private final ConfigurationController mConfigurationController; - protected StatusBarWindowViewController mStatusBarWindowViewController; + protected NotificationShadeWindowViewController mNotificationShadeWindowViewController; private final DozeParameters mDozeParameters; private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy; private final Provider<StatusBarComponent.Builder> mStatusBarComponentBuilder; @@ -503,7 +505,7 @@ public class StatusBar extends SystemUI implements DemoMode, && ((info == null && imageWallpaperInAmbient) || (info != null && info.supportsAmbientMode())); - mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode); + mNotificationShadeWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode); mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode); } }; @@ -659,7 +661,7 @@ public class StatusBar extends SystemUI implements DemoMode, Lazy<AssistManager> assistManagerLazy, NotificationListener notificationListener, ConfigurationController configurationController, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, LockscreenLockIconController lockscreenLockIconController, DozeParameters dozeParameters, ScrimController scrimController, @@ -740,7 +742,7 @@ public class StatusBar extends SystemUI implements DemoMode, mAssistManagerLazy = assistManagerLazy; mNotificationListener = notificationListener; mConfigurationController = configurationController; - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mLockscreenLockIconController = lockscreenLockIconController; mDozeServiceHost = dozeServiceHost; mPowerManager = powerManager; @@ -912,7 +914,7 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardUpdateMonitor.registerCallback(mUpdateCallback); mDozeServiceHost.initialize(this, mNotificationIconAreaController, - mStatusBarKeyguardViewManager, mStatusBarWindowViewController, + mStatusBarKeyguardViewManager, mNotificationShadeWindowViewController, mNotificationPanelViewController, mAmbientIndicationContainer); mConfigurationController.addCallback(this); @@ -930,7 +932,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) { mMainThreadHandler.post( - () -> plugin.setup(getStatusBarWindow(), getNavigationBarView(), + () -> plugin.setup(getNotificationShadeWindowView(), + getNavigationBarView(), new Callback(plugin), mDozeParameters)); } @@ -938,7 +941,8 @@ public class StatusBar extends SystemUI implements DemoMode, public void onPluginDisconnected(OverlayPlugin plugin) { mMainThreadHandler.post(() -> { mOverlays.remove(plugin); - mStatusBarWindowController.setForcePluginOpen(mOverlays.size() != 0); + mNotificationShadeWindowController + .setForcePluginOpen(mOverlays.size() != 0); }); } @@ -957,10 +961,10 @@ public class StatusBar extends SystemUI implements DemoMode, mOverlays.remove(mPlugin); } mMainThreadHandler.post(() -> { - mStatusBarWindowController + mNotificationShadeWindowController .setStateListener(b -> mOverlays.forEach( o -> o.setCollapseDesired(b))); - mStatusBarWindowController + mNotificationShadeWindowController .setForcePluginOpen(mOverlays.size() != 0); }); } @@ -978,12 +982,13 @@ public class StatusBar extends SystemUI implements DemoMode, updateTheme(); inflateStatusBarWindow(); - mStatusBarWindowViewController.setService(this); - mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener()); + mNotificationShadeWindowViewController.setService(this); + mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener()); // TODO: Deal with the ugliness that comes from having some of the statusbar broken out // into fragments, but the rest here, it leaves some awkward lifecycle and whatnot. - mStackScroller = mStatusBarWindow.findViewById(R.id.notification_stack_scroller); + mStackScroller = mNotificationShadeWindowView.findViewById( + R.id.notification_stack_scroller); NotificationListContainer notifListContainer = (NotificationListContainer) mStackScroller; mNotificationLogger.setUpWithContainer(notifListContainer); @@ -1004,17 +1009,18 @@ public class StatusBar extends SystemUI implements DemoMode, // Allow plugins to reference DarkIconDispatcher and StatusBarStateController mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class); mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); - FragmentHostManager.get(mStatusBarWindow) + FragmentHostManager.get(mPhoneStatusBarWindow) .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> { CollapsedStatusBarFragment statusBarFragment = (CollapsedStatusBarFragment) fragment; - statusBarFragment.initNotificationIconArea(mNotificationIconAreaController); + PhoneStatusBarView oldStatusBarView = mStatusBarView; - mStatusBarView = (PhoneStatusBarView) fragment.getView(); + mStatusBarView = (PhoneStatusBarView) statusBarFragment.getView(); mStatusBarView.setBar(this); mStatusBarView.setPanel(mNotificationPanelViewController); mStatusBarView.setScrimController(mScrimController); + statusBarFragment.initNotificationIconArea(mNotificationIconAreaController); // CollapsedStatusBarFragment re-inflated PhoneStatusBarView and both of // mStatusBarView.mExpanded and mStatusBarView.mBouncerShowing are false. // PhoneStatusBarView's new instance will set to be gone in @@ -1038,16 +1044,18 @@ public class StatusBar extends SystemUI implements DemoMode, mHeadsUpAppearanceController.destroy(); } // TODO: this should probably be scoped to the StatusBarComponent + // TODO (b/136993073) Separate notification shade and status bar mHeadsUpAppearanceController = new HeadsUpAppearanceController( - mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow, + mNotificationIconAreaController, mHeadsUpManager, + mNotificationShadeWindowView, mStatusBarStateController, mKeyguardBypassController, mKeyguardStateController, mWakeUpCoordinator, mCommandQueue, - mNotificationPanelViewController); + mNotificationPanelViewController, mStatusBarView); mHeadsUpAppearanceController.readFrom(oldController); mLightsOutNotifController.setLightsOutNotifView( mStatusBarView.findViewById(R.id.notification_lights_out)); - mStatusBarWindowViewController.setStatusBarView(mStatusBarView); + mNotificationShadeWindowViewController.setStatusBarView(mStatusBarView); checkBarModes(); }).getFragmentManager() .beginTransaction() @@ -1055,7 +1063,8 @@ public class StatusBar extends SystemUI implements DemoMode, CollapsedStatusBarFragment.TAG) .commit(); - mHeadsUpManager.setUp(mStatusBarWindow, mGroupManager, this, mVisualStabilityManager); + mHeadsUpManager.setUp(mNotificationShadeWindowView, mGroupManager, this, + mVisualStabilityManager); mConfigurationController.addCallback(mHeadsUpManager); mHeadsUpManager.addListener(this); mHeadsUpManager.addListener(mNotificationPanelViewController.getOnHeadsUpChangedListener()); @@ -1075,12 +1084,12 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardIndicationController = SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, - mStatusBarWindow.findViewById(R.id.keyguard_indication_area), - mStatusBarWindow.findViewById(R.id.lock_icon)); + mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area), + mNotificationShadeWindowView.findViewById(R.id.lock_icon)); mNotificationPanelViewController.setKeyguardIndicationController( mKeyguardIndicationController); - mAmbientIndicationContainer = mStatusBarWindow.findViewById( + mAmbientIndicationContainer = mNotificationShadeWindowView.findViewById( R.id.ambient_indication_container); // TODO: Find better place for this callback. @@ -1101,13 +1110,13 @@ public class StatusBar extends SystemUI implements DemoMode, mAutoHideController.setStatusBar(this); - ScrimView scrimBehind = mStatusBarWindow.findViewById(R.id.scrim_behind); - ScrimView scrimInFront = mStatusBarWindow.findViewById(R.id.scrim_in_front); - ScrimView scrimForBubble = mStatusBarWindow.findViewById(R.id.scrim_for_bubble); + ScrimView scrimBehind = mNotificationShadeWindowView.findViewById(R.id.scrim_behind); + ScrimView scrimInFront = mNotificationShadeWindowView.findViewById(R.id.scrim_in_front); + ScrimView scrimForBubble = mNotificationShadeWindowView.findViewById(R.id.scrim_for_bubble); mScrimController.setScrimVisibleListener(scrimsVisible -> { - mStatusBarWindowController.setScrimsVisibility(scrimsVisible); - if (mStatusBarWindow != null) { + mNotificationShadeWindowController.setScrimsVisibility(scrimsVisible); + if (mNotificationShadeWindowView != null) { mLockscreenLockIconController.onScrimVisibilityChanged(scrimsVisible); } }); @@ -1116,7 +1125,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanelViewController.initDependencies(this, mGroupManager, mNotificationShelf, mNotificationIconAreaController, mScrimController); - BackDropView backdrop = mStatusBarWindow.findViewById(R.id.backdrop); + BackDropView backdrop = mNotificationShadeWindowView.findViewById(R.id.backdrop); mMediaManager.setup(backdrop, backdrop.findViewById(R.id.backdrop_front), backdrop.findViewById(R.id.backdrop_back), mScrimController, mLockscreenWallpaper); @@ -1129,7 +1138,7 @@ public class StatusBar extends SystemUI implements DemoMode, mLockscreenLockIconController::onShowingLaunchAffordanceChanged); // Set up the quick settings tile panel - View container = mStatusBarWindow.findViewById(R.id.qs_frame); + final View container = mNotificationShadeWindowView.findViewById(R.id.qs_frame); if (container != null) { FragmentHostManager fragmentHostManager = FragmentHostManager.get(container); ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame, @@ -1138,7 +1147,8 @@ public class StatusBar extends SystemUI implements DemoMode, .withPlugin(QS.class) .withDefault(this::createDefaultQSFragment) .build()); - mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow, + mBrightnessMirrorController = new BrightnessMirrorController( + mNotificationShadeWindowView, mNotificationPanelViewController, (visible) -> { mBrightnessMirrorVisible = visible; @@ -1153,7 +1163,8 @@ public class StatusBar extends SystemUI implements DemoMode, }); } - mReportRejectedTouch = mStatusBarWindow.findViewById(R.id.report_rejected_touch); + mReportRejectedTouch = mNotificationShadeWindowView + .findViewById(R.id.report_rejected_touch); if (mReportRejectedTouch != null) { updateReportRejectedTouchVisibility(); mReportRejectedTouch.setOnClickListener(v -> { @@ -1227,18 +1238,18 @@ public class StatusBar extends SystemUI implements DemoMode, } protected QS createDefaultQSFragment() { - return FragmentHostManager.get(mStatusBarWindow).create(QSFragment.class); + return FragmentHostManager.get(mNotificationShadeWindowView).create(QSFragment.class); } private void setUpPresenter() { // Set up the initial notification state. mActivityLaunchAnimator = new ActivityLaunchAnimator( - mStatusBarWindowViewController, this, mNotificationPanelViewController, + mNotificationShadeWindowViewController, this, mNotificationPanelViewController, (NotificationListContainer) mStackScroller); // TODO: inject this. mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanelViewController, - mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController, + mHeadsUpManager, mNotificationShadeWindowView, mStackScroller, mDozeScrimController, mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController, mNotificationAlertingManager, mNotificationRowBinder, mKeyguardStateController, mKeyguardIndicationController, @@ -1251,7 +1262,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDeviceProvisionedController); mNotificationShelf.setOnActivatedListener(mPresenter); - mRemoteInputManager.getController().addCallback(mStatusBarWindowController); + mRemoteInputManager.getController().addCallback(mNotificationShadeWindowController); mNotificationActivityStarter = mStatusBarNotificationActivityStarterBuilder @@ -1328,7 +1339,7 @@ public class StatusBar extends SystemUI implements DemoMode, mShadeController.animateCollapsePanels(); } } - return mStatusBarWindow.onTouchEvent(event); + return mNotificationShadeWindowView.onTouchEvent(event); }; } @@ -1384,17 +1395,20 @@ public class StatusBar extends SystemUI implements DemoMode, protected void createUserSwitcher() { mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext, - mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), - mStatusBarWindow.findViewById(R.id.keyguard_header), + mNotificationShadeWindowView.findViewById(R.id.keyguard_user_switcher), + mNotificationShadeWindowView.findViewById(R.id.keyguard_header), mNotificationPanelViewController); } private void inflateStatusBarWindow() { - mStatusBarWindow = mSuperStatusBarViewFactory.getStatusBarWindowView(); + mNotificationShadeWindowView = mSuperStatusBarViewFactory.getNotificationShadeWindowView(); StatusBarComponent statusBarComponent = mStatusBarComponentBuilder.get() - .statusBarWindowView(mStatusBarWindow).build(); - mStatusBarWindowViewController = statusBarComponent.getStatusBarWindowViewController(); - mStatusBarWindowViewController.setupExpandedStatusBar(); + .statusBarWindowView(mNotificationShadeWindowView).build(); + mNotificationShadeWindowViewController = statusBarComponent + .getNotificationShadeWindowViewController(); + mNotificationShadeWindowViewController.setupExpandedStatusBar(); + mStatusBarWindowController = statusBarComponent.getStatusBarWindowController(); + mPhoneStatusBarWindow = mSuperStatusBarViewFactory.getStatusBarWindowView(); mNotificationPanelViewController = statusBarComponent.getNotificationPanelViewController(); } @@ -1404,7 +1418,8 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarKeyguardViewManager.registerStatusBar( /* statusBar= */ this, getBouncerContainer(), mNotificationPanelViewController, mBiometricUnlockController, - mDismissCallbackRegistry, mStatusBarWindow.findViewById(R.id.lock_icon_container), + mDismissCallbackRegistry, + mNotificationShadeWindowView.findViewById(R.id.lock_icon_container), mStackScroller, mKeyguardBypassController, mFalsingManager); mKeyguardIndicationController .setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); @@ -1422,16 +1437,20 @@ public class StatusBar extends SystemUI implements DemoMode, return mStatusBarView; } + public NotificationShadeWindowView getNotificationShadeWindowView() { + return mNotificationShadeWindowView; + } + public StatusBarWindowView getStatusBarWindow() { - return mStatusBarWindow; + return mPhoneStatusBarWindow; } - public StatusBarWindowViewController getStatusBarWindowViewController() { - return mStatusBarWindowViewController; + public NotificationShadeWindowViewController getNotificationShadeWindowViewController() { + return mNotificationShadeWindowViewController; } protected ViewGroup getBouncerContainer() { - return mStatusBarWindow; + return mNotificationShadeWindowView; } public int getStatusBarHeight() { @@ -1641,7 +1660,7 @@ public class StatusBar extends SystemUI implements DemoMode, } public void setQsExpanded(boolean expanded) { - mStatusBarWindowController.setQsExpanded(expanded); + mNotificationShadeWindowController.setQsExpanded(expanded); mNotificationPanelViewController.setStatusAccessibilityImportance(expanded ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS : View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); @@ -1674,7 +1693,7 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { if (inPinnedMode) { - mStatusBarWindowController.setHeadsUpShowing(true); + mNotificationShadeWindowController.setHeadsUpShowing(true); mStatusBarWindowController.setForceStatusBarVisible(true); if (mNotificationPanelViewController.isFullyCollapsed()) { // We need to ensure that the touchable region is updated before the window will be @@ -1682,9 +1701,9 @@ public class StatusBar extends SystemUI implements DemoMode, // onComputeInternalInsets will be called and after that we can resize the layout. Let's // make sure that the window stays small for one frame until the touchableRegion is set. mNotificationPanelViewController.getView().requestLayout(); - mStatusBarWindowController.setForceWindowCollapsed(true); + mNotificationShadeWindowController.setForceWindowCollapsed(true); mNotificationPanelViewController.getView().post(() -> { - mStatusBarWindowController.setForceWindowCollapsed(false); + mNotificationShadeWindowController.setForceWindowCollapsed(false); }); } } else { @@ -1694,7 +1713,7 @@ public class StatusBar extends SystemUI implements DemoMode, || mNotificationPanelViewController.isTracking() || bypassKeyguard) { // We are currently tracking or is open and the shade doesn't need to be kept // open artificially. - mStatusBarWindowController.setHeadsUpShowing(false); + mNotificationShadeWindowController.setHeadsUpShowing(false); if (bypassKeyguard) { mStatusBarWindowController.setForceStatusBarVisible(false); } @@ -1704,7 +1723,7 @@ public class StatusBar extends SystemUI implements DemoMode, mHeadsUpManager.setHeadsUpGoingAway(true); mNotificationPanelViewController.runAfterAnimationFinished(() -> { if (!mHeadsUpManager.hasPinnedHeadsUp()) { - mStatusBarWindowController.setHeadsUpShowing(false); + mNotificationShadeWindowController.setHeadsUpShowing(false); mHeadsUpManager.setHeadsUpGoingAway(false); } mRemoteInputManager.onPanelCollapsed(); @@ -1732,7 +1751,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void setPanelExpanded(boolean isExpanded) { mPanelExpanded = isExpanded; updateHideIconsForBouncer(false /* animate */); - mStatusBarWindowController.setPanelExpanded(isExpanded); + mNotificationShadeWindowController.setPanelExpanded(isExpanded); mVisualStabilityManager.setPanelExpanded(isExpanded); if (isExpanded && mStatusBarStateController.getState() != StatusBarState.KEYGUARD) { if (DEBUG) { @@ -1991,7 +2010,7 @@ public class StatusBar extends SystemUI implements DemoMode, // Expand the window to encompass the full screen in anticipation of the drag. // This is only possible to do atomically because the status bar is at the top of the screen! - mStatusBarWindowController.setPanelVisible(true); + mNotificationShadeWindowController.setPanelVisible(true); visibilityChanged(true); mCommandQueue.recomputeDisableFlags(mDisplayId, !force /* animate */); @@ -2100,7 +2119,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (SPEW) Log.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible + " mExpandedVisible=" + mExpandedVisible); - if (!mExpandedVisible || mStatusBarWindow == null) { + if (!mExpandedVisible || mNotificationShadeWindowView == null) { return; } @@ -2113,8 +2132,8 @@ public class StatusBar extends SystemUI implements DemoMode, mExpandedVisible = false; visibilityChanged(false); - // Shrink the window to the size of the status bar only - mStatusBarWindowController.setPanelVisible(false); + // Update the visibility of notification shade and status bar window. + mNotificationShadeWindowController.setPanelVisible(false); mStatusBarWindowController.setForceStatusBarVisible(false); // Close any guts that might be visible @@ -2178,6 +2197,10 @@ public class StatusBar extends SystemUI implements DemoMode, return false; } + boolean isSameStatusBarState(int state) { + return mStatusBarWindowState == state; + } + public GestureRecorder getGestureRecorder() { return mGestureRec; } @@ -2193,7 +2216,7 @@ public class StatusBar extends SystemUI implements DemoMode, return; } boolean showing = state == WINDOW_STATE_SHOWING; - if (mStatusBarWindow != null + if (mNotificationShadeWindowView != null && window == StatusBarManager.WINDOW_STATUS_BAR && mStatusBarWindowState != state) { mStatusBarWindowState = state; @@ -2427,8 +2450,8 @@ public class StatusBar extends SystemUI implements DemoMode, dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions()); } pw.println(" StatusBarWindowView: "); - if (mStatusBarWindowViewController != null) { - mStatusBarWindowViewController.dump(fd, pw, args); + if (mNotificationShadeWindowViewController != null) { + mNotificationShadeWindowViewController.dump(fd, pw, args); } pw.println(" mMediaManager: "); @@ -2527,6 +2550,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void createAndAddWindows(@Nullable RegisterStatusBarResult result) { makeStatusBarView(result); + mNotificationShadeWindowController.attach(); mStatusBarWindowController.attach(); } @@ -2690,8 +2714,8 @@ public class StatusBar extends SystemUI implements DemoMode, } } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { - if (mStatusBarWindowController != null) { - mStatusBarWindowController.setNotTouchable(false); + if (mNotificationShadeWindowController != null) { + mNotificationShadeWindowController.setNotTouchable(false); } if (mBubbleController.isStackExpanded()) { mBubbleController.collapseStack(); @@ -2808,7 +2832,9 @@ public class StatusBar extends SystemUI implements DemoMode, mQSPanel.updateResources(); } - mStatusBarWindowController.refreshStatusBarHeight(); + if (mStatusBarWindowController != null) { + mStatusBarWindowController.refreshStatusBarHeight(); + } if (mStatusBarView != null) { mStatusBarView.updateResources(); @@ -3518,7 +3544,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (!mPresenter.isPresenterFullyCollapsed()) { // if we set it not to be focusable when collapsing, we have to undo it when we aborted // the closing - mStatusBarWindowController.setStatusBarFocusable(true); + mNotificationShadeWindowController.setNotificationShadeFocusable(true); } } @@ -3631,7 +3657,7 @@ public class StatusBar extends SystemUI implements DemoMode, */ public void collapseShade() { if (mNotificationPanelViewController.isTracking()) { - mStatusBarWindowViewController.cancelCurrentTouch(); + mNotificationShadeWindowViewController.cancelCurrentTouch(); } if (mPanelExpanded && mState == StatusBarState.SHADE) { mShadeController.animateCollapsePanels(); @@ -3652,7 +3678,7 @@ public class StatusBar extends SystemUI implements DemoMode, updateVisibleToUser(); updateNotificationPanelTouchState(); - mStatusBarWindowViewController.cancelCurrentTouch(); + mNotificationShadeWindowViewController.cancelCurrentTouch(); if (mLaunchCameraOnFinishedGoingToSleep) { mLaunchCameraOnFinishedGoingToSleep = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 407d25691798..de37cd955f9a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -92,7 +92,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private static String TAG = "StatusBarKeyguardViewManager"; protected final Context mContext; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() { @Override public void onFullyShown() { @@ -199,13 +199,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb KeyguardUpdateMonitor keyguardUpdateMonitor, NavigationModeController navigationModeController, DockManager dockManager, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, KeyguardStateController keyguardStateController, NotificationMediaManager notificationMediaManager) { mContext = context; mViewMediatorCallback = callback; mLockPatternUtils = lockPatternUtils; - mStatusBarWindowController = statusBarWindowController; + mNotificationShadeWindowController = notificationShadeWindowController; mKeyguardStateController = keyguardStateController; mMediaManager = notificationMediaManager; mKeyguardUpdateManager = keyguardUpdateMonitor; @@ -315,7 +315,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb */ public void show(Bundle options) { mShowing = true; - mStatusBarWindowController.setKeyguardShowing(true); + mNotificationShadeWindowController.setKeyguardShowing(true); mKeyguardStateController.notifyKeyguardState(mShowing, mKeyguardStateController.isOccluded()); reset(true /* hideBouncerWhenShowing */); @@ -491,11 +491,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public void setNeedsInput(boolean needsInput) { - mStatusBarWindowController.setKeyguardNeedsInput(needsInput); + mNotificationShadeWindowController.setKeyguardNeedsInput(needsInput); } public boolean isUnlockWithWallpaper() { - return mStatusBarWindowController.isShowingWallpaper(); + return mNotificationShadeWindowController.isShowingWallpaper(); } public void setOccluded(boolean occluded, boolean animate) { @@ -509,7 +509,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb new Runnable() { @Override public void run() { - mStatusBarWindowController.setKeyguardOccluded(mOccluded); + mNotificationShadeWindowController.setKeyguardOccluded(mOccluded); reset(true /* hideBouncerWhenShowing */); } }); @@ -524,7 +524,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (mShowing) { mMediaManager.updateMediaMetaData(false, animate && !occluded); } - mStatusBarWindowController.setKeyguardOccluded(occluded); + mNotificationShadeWindowController.setKeyguardOccluded(occluded); // setDozing(false) will call reset once we stop dozing. if (!mDozing) { @@ -578,8 +578,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() { @Override public void run() { - mStatusBarWindowController.setKeyguardShowing(false); - mStatusBarWindowController.setKeyguardFadingAway(true); + mNotificationShadeWindowController.setKeyguardShowing(false); + mNotificationShadeWindowController.setKeyguardFadingAway(true); hideBouncer(true /* destroyView */); updateStates(); } @@ -587,7 +587,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void run() { mStatusBar.hideKeyguard(); - mStatusBarWindowController.setKeyguardFadingAway(false); + mNotificationShadeWindowController.setKeyguardFadingAway(false); mViewMediatorCallback.keyguardGone(); executeAfterKeyguardGoneAction(); } @@ -624,7 +624,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } else { boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide(); if (!staying) { - mStatusBarWindowController.setKeyguardFadingAway(true); + mNotificationShadeWindowController.setKeyguardFadingAway(true); if (needsFading) { ViewGroupFadeHelper.fadeOutAllChildrenExcept( mNotificationPanelViewController.getView(), @@ -650,7 +650,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } updateLockIcon(); updateStates(); - mStatusBarWindowController.setKeyguardShowing(false); + mNotificationShadeWindowController.setKeyguardShowing(false); mViewMediatorCallback.keyguardGone(); } StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED, @@ -684,8 +684,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public void onKeyguardFadedAway() { - mContainer.postDelayed(() -> mStatusBarWindowController.setKeyguardFadingAway(false), - 100); + mContainer.postDelayed(() -> mNotificationShadeWindowController + .setKeyguardFadingAway(false), 100); ViewGroupFadeHelper.reset(mNotificationPanelViewController.getView()); mStatusBar.finishKeyguardFadingAway(); mBiometricUnlockController.finishKeyguardFadingAway(); @@ -818,7 +818,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) { - mStatusBarWindowController.setBouncerShowing(bouncerShowing); + mNotificationShadeWindowController.setBouncerShowing(bouncerShowing); mStatusBar.setBouncerShowing(bouncerShowing); updateLockIcon(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java index b4d5dadda5b8..7615bf826287 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java @@ -151,7 +151,7 @@ public class StatusBarModule { Lazy<AssistManager> assistManagerLazy, NotificationListener notificationListener, ConfigurationController configurationController, - StatusBarWindowController statusBarWindowController, + NotificationShadeWindowController notificationShadeWindowController, LockscreenLockIconController lockscreenLockIconController, DozeParameters dozeParameters, ScrimController scrimController, @@ -233,7 +233,7 @@ public class StatusBarModule { assistManagerLazy, notificationListener, configurationController, - statusBarWindowController, + notificationShadeWindowController, lockscreenLockIconController, dozeParameters, scrimController, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 720f22964915..1336b2de82d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -134,7 +134,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, public StatusBarNotificationPresenter(Context context, NotificationPanelViewController panel, HeadsUpManagerPhone headsUp, - StatusBarWindowView statusBarWindow, + NotificationShadeWindowView statusBarWindow, ViewGroup stackScroller, DozeScrimController dozeScrimController, ScrimController scrimController, @@ -191,7 +191,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, Dependency.get(NotificationRemoteInputManager.Callback.class), mNotificationPanel.createRemoteInputDelegate()); remoteInputManager.getController().addCallback( - Dependency.get(StatusBarWindowController.class)); + Dependency.get(NotificationShadeWindowController.class)); NotificationListContainer notifListContainer = (NotificationListContainer) stackScroller; initController.addPostInitTask(() -> { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java index 3d25749265f1..b8fb6d3ebacf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java @@ -17,15 +17,13 @@ package com.android.systemui.statusbar.phone; import android.annotation.NonNull; -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Rect; import android.view.View; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import com.android.systemui.Dependency; +import com.android.systemui.R; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; @@ -38,60 +36,62 @@ public final class StatusBarTouchableRegionManager implements OnComputeInternalInsetsListener, ConfigurationListener { private final BubbleController mBubbleController = Dependency.get(BubbleController.class); - private final Context mContext; private final HeadsUpManagerPhone mHeadsUpManager; private boolean mIsStatusBarExpanded = false; private boolean mShouldAdjustInsets = false; private final StatusBar mStatusBar; - private int mStatusBarHeight; - private final View mStatusBarWindowView; + private final View mNotificationShadeWindowView; + private View mNotificationPanelView; private boolean mForceCollapsedUntilLayout = false; - private final StatusBarWindowController mStatusBarWindowController; + private final NotificationShadeWindowController mNotificationShadeWindowController; - public StatusBarTouchableRegionManager(@NonNull Context context, - HeadsUpManagerPhone headsUpManager, + public StatusBarTouchableRegionManager(HeadsUpManagerPhone headsUpManager, @NonNull StatusBar statusBar, - @NonNull View statusBarWindowView) { - mContext = context; + @NonNull View notificationShadeWindowView) { mHeadsUpManager = headsUpManager; mStatusBar = statusBar; - mStatusBarWindowView = statusBarWindowView; - mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); - - initResources(); + mNotificationShadeWindowView = notificationShadeWindowView; + mNotificationShadeWindowController = + Dependency.get(NotificationShadeWindowController.class); mBubbleController.setBubbleStateChangeListener((hasBubbles) -> { updateTouchableRegion(); }); - mStatusBarWindowController.setForcePluginOpenListener((forceOpen) -> { + mNotificationShadeWindowController.setForcePluginOpenListener((forceOpen) -> { updateTouchableRegion(); }); Dependency.get(ConfigurationController.class).addCallback(this); + if (mNotificationShadeWindowView != null) { + mNotificationPanelView = mNotificationShadeWindowView.findViewById( + R.id.notification_panel); + } } /** * Set the touchable portion of the status bar based on what elements are visible. */ public void updateTouchableRegion() { - boolean hasCutoutInset = (mStatusBarWindowView != null) - && (mStatusBarWindowView.getRootWindowInsets() != null) - && (mStatusBarWindowView.getRootWindowInsets().getDisplayCutout() != null); + boolean hasCutoutInset = (mNotificationShadeWindowView != null) + && (mNotificationShadeWindowView.getRootWindowInsets() != null) + && (mNotificationShadeWindowView.getRootWindowInsets().getDisplayCutout() != null); boolean shouldObserve = mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpManager.isHeadsUpGoingAway() || mBubbleController.hasBubbles() || mForceCollapsedUntilLayout || hasCutoutInset - || mStatusBarWindowController.getForcePluginOpen(); + || mNotificationShadeWindowController.getForcePluginOpen(); if (shouldObserve == mShouldAdjustInsets) { return; } if (shouldObserve) { - mStatusBarWindowView.getViewTreeObserver().addOnComputeInternalInsetsListener(this); - mStatusBarWindowView.requestLayout(); + mNotificationShadeWindowView.getViewTreeObserver() + .addOnComputeInternalInsetsListener(this); + mNotificationShadeWindowView.requestLayout(); } else { - mStatusBarWindowView.getViewTreeObserver().removeOnComputeInternalInsetsListener(this); + mNotificationShadeWindowView.getViewTreeObserver() + .removeOnComputeInternalInsetsListener(this); } mShouldAdjustInsets = shouldObserve; } @@ -100,19 +100,20 @@ public final class StatusBarTouchableRegionManager implements * Calls {@code updateTouchableRegion()} after a layout pass completes. */ public void updateTouchableRegionAfterLayout() { - mForceCollapsedUntilLayout = true; - mStatusBarWindowView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, - int oldTop, int oldRight, int oldBottom) { - if (mStatusBarWindowView.getHeight() <= mStatusBarHeight) { - mStatusBarWindowView.removeOnLayoutChangeListener(this); - mForceCollapsedUntilLayout = false; - updateTouchableRegion(); + if (mNotificationPanelView != null) { + mForceCollapsedUntilLayout = true; + mNotificationPanelView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (!mNotificationPanelView.isVisibleToUser()) { + mNotificationPanelView.removeOnLayoutChangeListener(this); + mForceCollapsedUntilLayout = false; + updateTouchableRegion(); + } } - } - }); + }); + } } /** @@ -145,25 +146,4 @@ public final class StatusBarTouchableRegionManager implements info.touchableRegion.union(bubbleRect); } } - - @Override - public void onConfigChanged(Configuration newConfig) { - initResources(); - } - - @Override - public void onDensityOrFontScaleChanged() { - initResources(); - } - - @Override - public void onOverlayChanged() { - initResources(); - } - - private void initResources() { - Resources resources = mContext.getResources(); - mStatusBarHeight = resources.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index ce498a39d941..7cf5147a9f26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2019 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. @@ -11,55 +11,25 @@ * 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 + * limitations under the License. */ package com.android.systemui.statusbar.phone; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; -import static com.android.systemui.DejankUtils.whitelistIpcs; -import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; - -import android.app.IActivityManager; import android.content.Context; -import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Binder; -import android.os.RemoteException; -import android.os.SystemProperties; -import android.os.Trace; import android.util.Log; -import android.view.Display; import android.view.Gravity; -import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.view.WindowManager.LayoutParams; -import com.android.systemui.Dumpable; -import com.android.systemui.R; -import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; -import com.android.systemui.statusbar.RemoteInputController.Callback; -import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SuperStatusBarViewFactory; -import com.android.systemui.statusbar.SysuiStatusBarStateController; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; - -import com.google.android.collect.Lists; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.lang.ref.WeakReference; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; import javax.inject.Inject; import javax.inject.Singleton; @@ -68,101 +38,36 @@ import javax.inject.Singleton; * Encapsulates all logic for the status bar window state management. */ @Singleton -public class StatusBarWindowController implements Callback, Dumpable, ConfigurationListener { - +public class StatusBarWindowController { private static final String TAG = "StatusBarWindowController"; private static final boolean DEBUG = false; private final Context mContext; private final WindowManager mWindowManager; - private final IActivityManager mActivityManager; - private final DozeParameters mDozeParameters; - private final LayoutParams mLpChanged; - private final boolean mKeyguardScreenRotation; - private final long mLockScreenDisplayTimeout; - private final Display.Mode mKeyguardDisplayMode; - private final KeyguardBypassController mKeyguardBypassController; - private ViewGroup mStatusBarView; - private LayoutParams mLp; - private boolean mHasTopUi; - private boolean mHasTopUiChanged; + private final SuperStatusBarViewFactory mSuperStatusBarViewFactory; + private final Resources mResources; private int mBarHeight = -1; - private float mScreenBrightnessDoze; private final State mCurrentState = new State(); - private OtherwisedCollapsedListener mListener; - private ForcePluginOpenListener mForcePluginOpenListener; - private final ArrayList<WeakReference<StatusBarWindowCallback>> - mCallbacks = Lists.newArrayList(); - private final SysuiColorExtractor mColorExtractor; - private final SuperStatusBarViewFactory mSuperStatusBarViewFactory; - private final Resources mResources; + private ViewGroup mStatusBarView; + private WindowManager.LayoutParams mLp; + private final WindowManager.LayoutParams mLpChanged; @Inject public StatusBarWindowController(Context context, WindowManager windowManager, - IActivityManager activityManager, DozeParameters dozeParameters, - StatusBarStateController statusBarStateController, - ConfigurationController configurationController, - KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor, SuperStatusBarViewFactory superStatusBarViewFactory, @Main Resources resources) { mContext = context; mWindowManager = windowManager; - mActivityManager = activityManager; - mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation(); - mDozeParameters = dozeParameters; - mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze(); - mLpChanged = new LayoutParams(); - mKeyguardBypassController = keyguardBypassController; - mColorExtractor = colorExtractor; mSuperStatusBarViewFactory = superStatusBarViewFactory; mStatusBarView = mSuperStatusBarViewFactory.getStatusBarWindowView(); + mLpChanged = new WindowManager.LayoutParams(); mResources = resources; if (mBarHeight < 0) { mBarHeight = mResources.getDimensionPixelSize( com.android.internal.R.dimen.status_bar_height); } - - mLockScreenDisplayTimeout = context.getResources() - .getInteger(R.integer.config_lockScreenDisplayTimeout); - ((SysuiStatusBarStateController) statusBarStateController) - .addCallback(mStateListener, - SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER); - configurationController.addCallback(this); - - Display.Mode[] supportedModes = context.getDisplay().getSupportedModes(); - Display.Mode currentMode = context.getDisplay().getMode(); - // Running on the highest frame rate available can be expensive. - // Let's specify a preferred refresh rate, and allow higher FPS only when we - // know that we're not falsing (because we unlocked.) - int keyguardRefreshRate = context.getResources() - .getInteger(R.integer.config_keyguardRefreshRate); - // Find supported display mode with the same resolution and requested refresh rate. - mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode -> - (int) mode.getRefreshRate() == keyguardRefreshRate - && mode.getPhysicalWidth() == currentMode.getPhysicalWidth() - && mode.getPhysicalHeight() == currentMode.getPhysicalHeight()) - .findFirst().orElse(null); - } - - /** - * Register to receive notifications about status bar window state changes. - */ - public void registerCallback(StatusBarWindowCallback callback) { - // Prevent adding duplicate callbacks - for (int i = 0; i < mCallbacks.size(); i++) { - if (mCallbacks.get(i).get() == callback) { - return; - } - } - mCallbacks.add(new WeakReference<StatusBarWindowCallback>(callback)); - } - - private boolean shouldEnableKeyguardScreenRotation() { - Resources res = mContext.getResources(); - return SystemProperties.getBoolean("lockscreen.rot_override", false) - || res.getBoolean(R.bool.config_enableLockScreenRotation); } public int getStatusBarHeight() { @@ -192,574 +97,46 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat // Now that the status bar window encompasses the sliding panel and its // translucent backdrop, the entire thing is made TRANSLUCENT and is // hardware-accelerated. - mLp = new LayoutParams( + mLp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, mBarHeight, - LayoutParams.TYPE_STATUS_BAR, - LayoutParams.FLAG_NOT_FOCUSABLE - | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING - | LayoutParams.FLAG_SPLIT_TOUCH - | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + WindowManager.LayoutParams.TYPE_STATUS_BAR, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH + | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, PixelFormat.TRANSLUCENT); mLp.token = new Binder(); mLp.gravity = Gravity.TOP; - mLp.setFitWindowInsetsTypes(0 /* types */); - mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; mLp.setTitle("StatusBar"); mLp.packageName = mContext.getPackageName(); mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + mWindowManager.addView(mStatusBarView, mLp); mLpChanged.copyFrom(mLp); - onThemeChanged(); - } - - public ViewGroup getStatusBarView() { - return mStatusBarView; - } - - public void setDozeScreenBrightness(int value) { - mScreenBrightnessDoze = value / 255f; - } - - private void setKeyguardDark(boolean dark) { - int vis = mStatusBarView.getSystemUiVisibility(); - if (dark) { - vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; - vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } else { - vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; - vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } - mStatusBarView.setSystemUiVisibility(vis); - } - - private void applyKeyguardFlags(State state) { - if (state.keyguardShowing) { - mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_KEYGUARD; - } else { - mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_KEYGUARD; - } - - final boolean scrimsOccludingWallpaper = - state.scrimsVisibility == ScrimController.OPAQUE; - final boolean keyguardOrAod = state.keyguardShowing - || (state.dozing && mDozeParameters.getAlwaysOn()); - if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) { - mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER; - } else { - mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER; - } - - if (state.dozing) { - mLpChanged.privateFlags |= LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - } else { - mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - } - - if (mKeyguardDisplayMode != null) { - boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled() - && state.statusBarState == StatusBarState.KEYGUARD && !state.keyguardFadingAway - && !state.keyguardGoingAway; - if (state.dozing || bypassOnKeyguard) { - mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId(); - } else { - mLpChanged.preferredDisplayModeId = 0; - } - Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId); - } - } - - private void adjustScreenOrientation(State state) { - if (state.isKeyguardShowingAndNotOccluded() || state.dozing) { - if (mKeyguardScreenRotation) { - mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; - } else { - mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; - } - } else { - mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; - } - } - - private void applyFocusableFlag(State state) { - boolean panelFocusable = state.statusBarFocusable && state.panelExpanded; - if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput) - || ENABLE_REMOTE_INPUT && state.remoteInputActive - || state.bubbleExpanded) { - mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) { - mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags |= LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } else { - mLpChanged.flags |= LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } - - mLpChanged.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; - } - - private void applyForceShowNavigationFlag(State state) { - if (state.panelExpanded || state.bouncerShowing - || ENABLE_REMOTE_INPUT && state.remoteInputActive) { - mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; - } else { - mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; - } - } - - private void applyHeight(State state) { - boolean expanded = isExpanded(state); - if (state.forcePluginOpen) { - if (mListener != null) { - mListener.setWouldOtherwiseCollapse(expanded); - } - expanded = true; - } - if (expanded) { - mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT; - } else { - mLpChanged.height = mBarHeight; - } - } - - private boolean isExpanded(State state) { - return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded() - || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing - || state.headsUpShowing || state.bubblesShowing - || state.scrimsVisibility != ScrimController.TRANSPARENT); } - private void applyFitsSystemWindows(State state) { - boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded(); - if (mStatusBarView != null && mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) { - mStatusBarView.setFitsSystemWindows(fitsSystemWindows); - mStatusBarView.requestApplyInsets(); - } - } - - private void applyUserActivityTimeout(State state) { - if (state.isKeyguardShowingAndNotOccluded() - && state.statusBarState == StatusBarState.KEYGUARD - && !state.qsExpanded) { - mLpChanged.userActivityTimeout = state.bouncerShowing - ? KeyguardViewMediator.AWAKE_INTERVAL_BOUNCER_MS : mLockScreenDisplayTimeout; - } else { - mLpChanged.userActivityTimeout = -1; - } - } - - private void applyInputFeatures(State state) { - if (state.isKeyguardShowingAndNotOccluded() - && state.statusBarState == StatusBarState.KEYGUARD - && !state.qsExpanded && !state.forceUserActivity) { - mLpChanged.inputFeatures |= - LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; - } else { - mLpChanged.inputFeatures &= - ~LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; - } - } - - private void applyStatusBarColorSpaceAgnosticFlag(State state) { - if (!isExpanded(state)) { - mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; - } else { - mLpChanged.privateFlags &= - ~LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; - } + /** Set force status bar visible. */ + public void setForceStatusBarVisible(boolean forceStatusBarVisible) { + mCurrentState.mForceStatusBarVisible = forceStatusBarVisible; + apply(mCurrentState); } private void apply(State state) { - applyKeyguardFlags(state); applyForceStatusBarVisibleFlag(state); - applyFocusableFlag(state); - applyForceShowNavigationFlag(state); - adjustScreenOrientation(state); - applyHeight(state); - applyUserActivityTimeout(state); - applyInputFeatures(state); - applyFitsSystemWindows(state); - applyModalFlag(state); - applyBrightness(state); - applyHasTopUi(state); - applyNotTouchable(state); - applyStatusBarColorSpaceAgnosticFlag(state); if (mLp != null && mLp.copyFrom(mLpChanged) != 0) { mWindowManager.updateViewLayout(mStatusBarView, mLp); } - if (mHasTopUi != mHasTopUiChanged) { - whitelistIpcs(() -> { - try { - mActivityManager.setHasTopUi(mHasTopUiChanged); - } catch (RemoteException e) { - Log.e(TAG, "Failed to call setHasTopUi", e); - } - mHasTopUi = mHasTopUiChanged; - }); - } - notifyStateChangedCallbacks(); } - public void notifyStateChangedCallbacks() { - for (int i = 0; i < mCallbacks.size(); i++) { - StatusBarWindowCallback cb = mCallbacks.get(i).get(); - if (cb != null) { - cb.onStateChanged(mCurrentState.keyguardShowing, - mCurrentState.keyguardOccluded, - mCurrentState.bouncerShowing); - } - } + private static class State { + boolean mForceStatusBarVisible; } private void applyForceStatusBarVisibleFlag(State state) { - if (state.forceStatusBarVisible || state.forcePluginOpen) { - mLpChanged.privateFlags |= WindowManager - .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; - } else { - mLpChanged.privateFlags - &= ~LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; - } - } - - private void applyModalFlag(State state) { - if (state.headsUpShowing) { - mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCH_MODAL; + if (state.mForceStatusBarVisible) { + mLpChanged.privateFlags |= PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; } else { - mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCH_MODAL; - } - } - - private void applyBrightness(State state) { - if (state.forceDozeBrightness) { - mLpChanged.screenBrightness = mScreenBrightnessDoze; - } else { - mLpChanged.screenBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE; - } - } - - private void applyHasTopUi(State state) { - mHasTopUiChanged = state.forceHasTopUi || isExpanded(state); - } - - private void applyNotTouchable(State state) { - if (state.notTouchable) { - mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCHABLE; - } else { - mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCHABLE; - } - } - - public void setKeyguardShowing(boolean showing) { - mCurrentState.keyguardShowing = showing; - apply(mCurrentState); - } - - public void setKeyguardOccluded(boolean occluded) { - mCurrentState.keyguardOccluded = occluded; - apply(mCurrentState); - } - - public void setKeyguardNeedsInput(boolean needsInput) { - mCurrentState.keyguardNeedsInput = needsInput; - apply(mCurrentState); - } - - public void setPanelVisible(boolean visible) { - mCurrentState.panelVisible = visible; - mCurrentState.statusBarFocusable = visible; - apply(mCurrentState); - } - - public void setStatusBarFocusable(boolean focusable) { - mCurrentState.statusBarFocusable = focusable; - apply(mCurrentState); - } - - public void setBouncerShowing(boolean showing) { - mCurrentState.bouncerShowing = showing; - apply(mCurrentState); - } - - public void setBackdropShowing(boolean showing) { - mCurrentState.backdropShowing = showing; - apply(mCurrentState); - } - - public void setKeyguardFadingAway(boolean keyguardFadingAway) { - mCurrentState.keyguardFadingAway = keyguardFadingAway; - apply(mCurrentState); - } - - public void setQsExpanded(boolean expanded) { - mCurrentState.qsExpanded = expanded; - apply(mCurrentState); - } - - public void setForceUserActivity(boolean forceUserActivity) { - mCurrentState.forceUserActivity = forceUserActivity; - apply(mCurrentState); - } - - public void setScrimsVisibility(int scrimsVisibility) { - mCurrentState.scrimsVisibility = scrimsVisibility; - apply(mCurrentState); - } - - public void setHeadsUpShowing(boolean showing) { - mCurrentState.headsUpShowing = showing; - apply(mCurrentState); - } - - public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) { - mCurrentState.wallpaperSupportsAmbientMode = supportsAmbientMode; - apply(mCurrentState); - } - - /** - * @param state The {@link StatusBarStateController} of the status bar. - */ - private void setStatusBarState(int state) { - mCurrentState.statusBarState = state; - apply(mCurrentState); - } - - public void setForceStatusBarVisible(boolean forceStatusBarVisible) { - mCurrentState.forceStatusBarVisible = forceStatusBarVisible; - apply(mCurrentState); - } - - /** - * Force the window to be collapsed, even if it should theoretically be expanded. - * Used for when a heads-up comes in but we still need to wait for the touchable regions to - * be computed. - */ - public void setForceWindowCollapsed(boolean force) { - mCurrentState.forceCollapsed = force; - apply(mCurrentState); - } - - public void setPanelExpanded(boolean isExpanded) { - mCurrentState.panelExpanded = isExpanded; - apply(mCurrentState); - } - - @Override - public void onRemoteInputActive(boolean remoteInputActive) { - mCurrentState.remoteInputActive = remoteInputActive; - apply(mCurrentState); - } - - /** - * Set whether the screen brightness is forced to the value we use for doze mode by the status - * bar window. - */ - public void setForceDozeBrightness(boolean forceDozeBrightness) { - mCurrentState.forceDozeBrightness = forceDozeBrightness; - apply(mCurrentState); - } - - public void setDozing(boolean dozing) { - mCurrentState.dozing = dozing; - apply(mCurrentState); - } - - public void setForcePluginOpen(boolean forcePluginOpen) { - mCurrentState.forcePluginOpen = forcePluginOpen; - apply(mCurrentState); - if (mForcePluginOpenListener != null) { - mForcePluginOpenListener.onChange(forcePluginOpen); + mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; } } - - /** - * The forcePluginOpen state for the status bar. - */ - public boolean getForcePluginOpen() { - return mCurrentState.forcePluginOpen; - } - - public void setNotTouchable(boolean notTouchable) { - mCurrentState.notTouchable = notTouchable; - apply(mCurrentState); - } - - /** - * Sets whether there are bubbles showing on the screen. - */ - public void setBubblesShowing(boolean bubblesShowing) { - mCurrentState.bubblesShowing = bubblesShowing; - apply(mCurrentState); - } - - /** - * The bubbles showing state for the status bar. - */ - public boolean getBubblesShowing() { - return mCurrentState.bubblesShowing; - } - - /** - * Sets if there is a bubble being expanded on the screen. - */ - public void setBubbleExpanded(boolean bubbleExpanded) { - mCurrentState.bubbleExpanded = bubbleExpanded; - apply(mCurrentState); - } - - /** - * Whether the bubble is shown in expanded state for the status bar. - */ - public boolean getBubbleExpanded() { - return mCurrentState.bubbleExpanded; - } - - /** - * Whether the status bar panel is expanded or not. - */ - public boolean getPanelExpanded() { - return mCurrentState.panelExpanded; - } - - public void setStateListener(OtherwisedCollapsedListener listener) { - mListener = listener; - } - - public void setForcePluginOpenListener(ForcePluginOpenListener listener) { - mForcePluginOpenListener = listener; - } - - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("StatusBarWindowController:"); - pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode); - pw.println(mCurrentState); - } - - public boolean isShowingWallpaper() { - return !mCurrentState.backdropShowing; - } - - @Override - public void onThemeChanged() { - if (mStatusBarView == null) { - return; - } - - final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); - // Make sure we have the correct navbar/statusbar colors. - setKeyguardDark(useDarkText); - } - - /** - * When keyguard will be dismissed but didn't start animation yet. - */ - public void setKeyguardGoingAway(boolean goingAway) { - mCurrentState.keyguardGoingAway = goingAway; - apply(mCurrentState); - } - - public boolean getForceHasTopUi() { - return mCurrentState.forceHasTopUi; - } - - public void setForceHasTopUi(boolean forceHasTopUi) { - mCurrentState.forceHasTopUi = forceHasTopUi; - apply(mCurrentState); - } - - private static class State { - boolean keyguardShowing; - boolean keyguardOccluded; - boolean keyguardNeedsInput; - boolean panelVisible; - boolean panelExpanded; - boolean statusBarFocusable; - boolean bouncerShowing; - boolean keyguardFadingAway; - boolean keyguardGoingAway; - boolean qsExpanded; - boolean headsUpShowing; - boolean forceStatusBarVisible; - boolean forceCollapsed; - boolean forceDozeBrightness; - boolean forceUserActivity; - boolean backdropShowing; - boolean wallpaperSupportsAmbientMode; - boolean notTouchable; - boolean bubblesShowing; - boolean bubbleExpanded; - boolean forceHasTopUi; - - /** - * The {@link StatusBar} state from the status bar. - */ - int statusBarState; - - boolean remoteInputActive; - boolean forcePluginOpen; - boolean dozing; - int scrimsVisibility; - - private boolean isKeyguardShowingAndNotOccluded() { - return keyguardShowing && !keyguardOccluded; - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(); - String newLine = "\n"; - result.append("Window State {"); - result.append(newLine); - - Field[] fields = this.getClass().getDeclaredFields(); - - // Print field names paired with their values - for (Field field : fields) { - result.append(" "); - try { - result.append(field.getName()); - result.append(": "); - //requires access to private field: - result.append(field.get(this)); - } catch (IllegalAccessException ex) { - } - result.append(newLine); - } - result.append("}"); - - return result.toString(); - } - } - - private final StateListener mStateListener = new StateListener() { - @Override - public void onStateChanged(int newState) { - setStatusBarState(newState); - } - - @Override - public void onDozingChanged(boolean isDozing) { - setDozing(isDozing); - } - }; - - /** - * Custom listener to pipe data back to plugins about whether or not the status bar would be - * collapsed if not for the plugin. - * TODO: Find cleaner way to do this. - */ - public interface OtherwisedCollapsedListener { - void setWouldOtherwiseCollapse(boolean otherwiseCollapse); - } - - /** - * Listener to indicate forcePluginOpen has changed - */ - public interface ForcePluginOpenListener { - /** - * Called when mState.forcePluginOpen is changed - */ - void onChange(boolean forceOpen); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 1e3c5d608bf8..da5df6a72961 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2019 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. @@ -16,599 +16,19 @@ package com.android.systemui.statusbar.phone; -import android.annotation.ColorInt; -import android.annotation.DrawableRes; -import android.annotation.LayoutRes; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Insets; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; import android.util.AttributeSet; -import android.view.ActionMode; -import android.view.DisplayCutout; -import android.view.InputQueue; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.view.Window; -import android.view.WindowInsets; -import android.view.WindowInsetsController; import android.widget.FrameLayout; -import com.android.internal.view.FloatingActionMode; -import com.android.internal.widget.FloatingToolbar; -import com.android.systemui.R; - /** - * Combined status bar and notification panel view. Also holding backdrop and scrims. + * Status bar view. */ public class StatusBarWindowView extends FrameLayout { - public static final String TAG = "StatusBarWindowView"; - public static final boolean DEBUG = StatusBar.DEBUG; - - private int mRightInset = 0; - private int mLeftInset = 0; - - // Implements the floating action mode for TextView's Cut/Copy/Past menu. Normally provided by - // DecorView, but since this is a special window we have to roll our own. - private View mFloatingActionModeOriginatingView; - private ActionMode mFloatingActionMode; - private FloatingToolbar mFloatingToolbar; - private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener; - private InteractionEventHandler mInteractionEventHandler; + public static final String TAG = "PhoneStatusBarWindowView"; + public static final boolean DEBUG = StatusBar.DEBUG; public StatusBarWindowView(Context context, AttributeSet attrs) { super(context, attrs); - setMotionEventSplittingEnabled(false); - } - - public NotificationPanelView getNotificationPanelView() { - return findViewById(R.id.notification_panel); - } - - @Override - public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) { - final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars()); - if (getFitsSystemWindows()) { - boolean paddingChanged = insets.top != getPaddingTop() - || insets.bottom != getPaddingBottom(); - - int rightCutout = 0; - int leftCutout = 0; - DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout(); - if (displayCutout != null) { - leftCutout = displayCutout.getSafeInsetLeft(); - rightCutout = displayCutout.getSafeInsetRight(); - } - - int targetLeft = Math.max(insets.left, leftCutout); - int targetRight = Math.max(insets.right, rightCutout); - - // Super-special right inset handling, because scrims and backdrop need to ignore it. - if (targetRight != mRightInset || targetLeft != mLeftInset) { - mRightInset = targetRight; - mLeftInset = targetLeft; - applyMargins(); - } - // Drop top inset, and pass through bottom inset. - if (paddingChanged) { - setPadding(0, 0, 0, 0); - } - } else { - if (mRightInset != 0 || mLeftInset != 0) { - mRightInset = 0; - mLeftInset = 0; - applyMargins(); - } - boolean changed = getPaddingLeft() != 0 - || getPaddingRight() != 0 - || getPaddingTop() != 0 - || getPaddingBottom() != 0; - if (changed) { - setPadding(0, 0, 0, 0); - } - } - return windowInsets; - } - - private void applyMargins() { - final int N = getChildCount(); - for (int i = 0; i < N; i++) { - View child = getChildAt(i); - if (child.getLayoutParams() instanceof LayoutParams) { - LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.ignoreRightInset - && (lp.rightMargin != mRightInset || lp.leftMargin != mLeftInset)) { - lp.rightMargin = mRightInset; - lp.leftMargin = mLeftInset; - child.requestLayout(); - } - } - } - } - - @Override - public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new LayoutParams(getContext(), attrs); - } - - @Override - protected FrameLayout.LayoutParams generateDefaultLayoutParams() { - return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - } - - @Override - protected void onAttachedToWindow () { - super.onAttachedToWindow(); - setWillNotDraw(!DEBUG); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (mInteractionEventHandler.interceptMediaKey(event)) { - return true; - } - - if (super.dispatchKeyEvent(event)) { - return true; - } - - return mInteractionEventHandler.dispatchKeyEvent(event); - } - - protected void setInteractionEventHandler(InteractionEventHandler listener) { - mInteractionEventHandler = listener; - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev); - - return result != null ? result : super.dispatchTouchEvent(ev); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - boolean intercept = mInteractionEventHandler.shouldInterceptTouchEvent(ev); - if (!intercept) { - intercept = super.onInterceptTouchEvent(ev); - } - if (intercept) { - mInteractionEventHandler.didIntercept(ev); - } - - return intercept; } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - boolean handled = mInteractionEventHandler.handleTouchEvent(ev); - - if (!handled) { - handled = super.onTouchEvent(ev); - } - - if (!handled) { - mInteractionEventHandler.didNotHandleTouchEvent(ev); - } - - return handled; - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (DEBUG) { - Paint pt = new Paint(); - pt.setColor(0x80FFFF00); - pt.setStrokeWidth(12.0f); - pt.setStyle(Paint.Style.STROKE); - canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt); - } - } - - public class LayoutParams extends FrameLayout.LayoutParams { - - public boolean ignoreRightInset; - - public LayoutParams(int width, int height) { - super(width, height); - } - - public LayoutParams(Context c, AttributeSet attrs) { - super(c, attrs); - - TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout); - ignoreRightInset = a.getBoolean( - R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false); - a.recycle(); - } - } - - @Override - public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback, - int type) { - if (type == ActionMode.TYPE_FLOATING) { - return startActionMode(originalView, callback, type); - } - return super.startActionModeForChild(originalView, callback, type); - } - - private ActionMode createFloatingActionMode( - View originatingView, ActionMode.Callback2 callback) { - if (mFloatingActionMode != null) { - mFloatingActionMode.finish(); - } - cleanupFloatingActionModeViews(); - mFloatingToolbar = new FloatingToolbar(mFakeWindow); - final FloatingActionMode mode = - new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar); - mFloatingActionModeOriginatingView = originatingView; - mFloatingToolbarPreDrawListener = - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - mode.updateViewLocationInWindow(); - return true; - } - }; - return mode; - } - - private void setHandledFloatingActionMode(ActionMode mode) { - mFloatingActionMode = mode; - mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary. - mFloatingActionModeOriginatingView.getViewTreeObserver() - .addOnPreDrawListener(mFloatingToolbarPreDrawListener); - } - - private void cleanupFloatingActionModeViews() { - if (mFloatingToolbar != null) { - mFloatingToolbar.dismiss(); - mFloatingToolbar = null; - } - if (mFloatingActionModeOriginatingView != null) { - if (mFloatingToolbarPreDrawListener != null) { - mFloatingActionModeOriginatingView.getViewTreeObserver() - .removeOnPreDrawListener(mFloatingToolbarPreDrawListener); - mFloatingToolbarPreDrawListener = null; - } - mFloatingActionModeOriginatingView = null; - } - } - - private ActionMode startActionMode( - View originatingView, ActionMode.Callback callback, int type) { - ActionMode.Callback2 wrappedCallback = new ActionModeCallback2Wrapper(callback); - ActionMode mode = createFloatingActionMode(originatingView, wrappedCallback); - if (mode != null && wrappedCallback.onCreateActionMode(mode, mode.getMenu())) { - setHandledFloatingActionMode(mode); - } else { - mode = null; - } - return mode; - } - - private class ActionModeCallback2Wrapper extends ActionMode.Callback2 { - private final ActionMode.Callback mWrapped; - - public ActionModeCallback2Wrapper(ActionMode.Callback wrapped) { - mWrapped = wrapped; - } - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - return mWrapped.onCreateActionMode(mode, menu); - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - requestFitSystemWindows(); - return mWrapped.onPrepareActionMode(mode, menu); - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return mWrapped.onActionItemClicked(mode, item); - } - - public void onDestroyActionMode(ActionMode mode) { - mWrapped.onDestroyActionMode(mode); - if (mode == mFloatingActionMode) { - cleanupFloatingActionModeViews(); - mFloatingActionMode = null; - } - requestFitSystemWindows(); - } - - @Override - public void onGetContentRect(ActionMode mode, View view, Rect outRect) { - if (mWrapped instanceof ActionMode.Callback2) { - ((ActionMode.Callback2) mWrapped).onGetContentRect(mode, view, outRect); - } else { - super.onGetContentRect(mode, view, outRect); - } - } - } - - interface InteractionEventHandler { - /** - * Returns a result for {@link ViewGroup#dispatchTouchEvent(MotionEvent)} or null to defer - * to the super method. - */ - Boolean handleDispatchTouchEvent(MotionEvent ev); - - /** - * Returns if the view should intercept the touch event. - * - * The touch event may still be interecepted if - * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)} decides to do so. - */ - boolean shouldInterceptTouchEvent(MotionEvent ev); - - /** - * Called when the view decides to intercept the touch event. - */ - void didIntercept(MotionEvent ev); - - boolean handleTouchEvent(MotionEvent ev); - - void didNotHandleTouchEvent(MotionEvent ev); - - boolean interceptMediaKey(KeyEvent event); - - boolean dispatchKeyEvent(KeyEvent event); - } - - /** - * Minimal window to satisfy FloatingToolbar. - */ - private Window mFakeWindow = new Window(mContext) { - @Override - public void takeSurface(SurfaceHolder.Callback2 callback) { - } - - @Override - public void takeInputQueue(InputQueue.Callback callback) { - } - - @Override - public boolean isFloating() { - return false; - } - - @Override - public void alwaysReadCloseOnTouchAttr() { - } - - @Override - public void setContentView(@LayoutRes int layoutResID) { - } - - @Override - public void setContentView(View view) { - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - } - - @Override - public void addContentView(View view, ViewGroup.LayoutParams params) { - } - - @Override - public void clearContentView() { - } - - @Override - public View getCurrentFocus() { - return null; - } - - @Override - public LayoutInflater getLayoutInflater() { - return null; - } - - @Override - public void setTitle(CharSequence title) { - } - - @Override - public void setTitleColor(@ColorInt int textColor) { - } - - @Override - public void openPanel(int featureId, KeyEvent event) { - } - - @Override - public void closePanel(int featureId) { - } - - @Override - public void togglePanel(int featureId, KeyEvent event) { - } - - @Override - public void invalidatePanelMenu(int featureId) { - } - - @Override - public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) { - return false; - } - - @Override - public boolean performPanelIdentifierAction(int featureId, int id, int flags) { - return false; - } - - @Override - public void closeAllPanels() { - } - - @Override - public boolean performContextMenuIdentifierAction(int id, int flags) { - return false; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - } - - @Override - public void setBackgroundDrawable(Drawable drawable) { - } - - @Override - public void setFeatureDrawableResource(int featureId, @DrawableRes int resId) { - } - - @Override - public void setFeatureDrawableUri(int featureId, Uri uri) { - } - - @Override - public void setFeatureDrawable(int featureId, Drawable drawable) { - } - - @Override - public void setFeatureDrawableAlpha(int featureId, int alpha) { - } - - @Override - public void setFeatureInt(int featureId, int value) { - } - - @Override - public void takeKeyEvents(boolean get) { - } - - @Override - public boolean superDispatchKeyEvent(KeyEvent event) { - return false; - } - - @Override - public boolean superDispatchKeyShortcutEvent(KeyEvent event) { - return false; - } - - @Override - public boolean superDispatchTouchEvent(MotionEvent event) { - return false; - } - - @Override - public boolean superDispatchTrackballEvent(MotionEvent event) { - return false; - } - - @Override - public boolean superDispatchGenericMotionEvent(MotionEvent event) { - return false; - } - - @Override - public View getDecorView() { - return StatusBarWindowView.this; - } - - @Override - public View peekDecorView() { - return null; - } - - @Override - public Bundle saveHierarchyState() { - return null; - } - - @Override - public void restoreHierarchyState(Bundle savedInstanceState) { - } - - @Override - protected void onActive() { - } - - @Override - public void setChildDrawable(int featureId, Drawable drawable) { - } - - @Override - public void setChildInt(int featureId, int value) { - } - - @Override - public boolean isShortcutKey(int keyCode, KeyEvent event) { - return false; - } - - @Override - public void setVolumeControlStream(int streamType) { - } - - @Override - public int getVolumeControlStream() { - return 0; - } - - @Override - public int getStatusBarColor() { - return 0; - } - - @Override - public void setStatusBarColor(@ColorInt int color) { - } - - @Override - public int getNavigationBarColor() { - return 0; - } - - @Override - public void setNavigationBarColor(@ColorInt int color) { - } - - @Override - public void setDecorCaptionShade(int decorCaptionShade) { - } - - @Override - public void setResizingCaptionDrawable(Drawable drawable) { - } - - @Override - public void onMultiWindowModeChanged() { - } - - @Override - public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { - } - - @Override - public void reportActivityRelaunched() { - } - - @Override - public WindowInsetsController getInsetsController() { - return null; - } - }; - } - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java index 21d0bb8c2daf..802da3e8c21c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java @@ -19,8 +19,9 @@ package com.android.systemui.statusbar.phone.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.android.systemui.statusbar.phone.NotificationPanelViewController; -import com.android.systemui.statusbar.phone.StatusBarWindowView; -import com.android.systemui.statusbar.phone.StatusBarWindowViewController; +import com.android.systemui.statusbar.phone.NotificationShadeWindowView; +import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -41,7 +42,8 @@ public interface StatusBarComponent { */ @Subcomponent.Builder interface Builder { - @BindsInstance Builder statusBarWindowView(StatusBarWindowView statusBarWindowView); + @BindsInstance Builder statusBarWindowView( + NotificationShadeWindowView notificationShadeWindowView); StatusBarComponent build(); } @@ -54,10 +56,16 @@ public interface StatusBarComponent { @interface StatusBarScope {} /** + * Creates a NotificationShadeWindowViewController. + */ + @StatusBarScope + NotificationShadeWindowViewController getNotificationShadeWindowViewController(); + + /** * Creates a StatusBarWindowViewController. */ @StatusBarScope - StatusBarWindowViewController getStatusBarWindowViewController(); + StatusBarWindowController getStatusBarWindowController(); /** * Creates a NotificationPanelViewController. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index 20bd51d27050..37d8c9ae2958 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.phone.dagger; import com.android.systemui.statusbar.phone.NotificationPanelView; -import com.android.systemui.statusbar.phone.StatusBarWindowView; +import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import dagger.Module; import dagger.Provides; @@ -28,8 +28,8 @@ public abstract class StatusBarViewModule { @Provides @StatusBarComponent.StatusBarScope public static NotificationPanelView getNotificationPanelView( - StatusBarWindowView statusBarWindowView) { - return statusBarWindowView.getNotificationPanelView(); + NotificationShadeWindowView notificationShadeWindowView) { + return notificationShadeWindowView.getNotificationPanelView(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index 625d88481c5a..d62da10de3d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -25,7 +25,7 @@ import android.widget.FrameLayout; import com.android.systemui.R; import com.android.systemui.statusbar.phone.NotificationPanelViewController; -import com.android.systemui.statusbar.phone.StatusBarWindowView; +import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import java.util.Objects; import java.util.function.Consumer; @@ -36,14 +36,14 @@ import java.util.function.Consumer; public class BrightnessMirrorController implements CallbackController<BrightnessMirrorController.BrightnessMirrorListener> { - private final StatusBarWindowView mStatusBarWindow; + private final NotificationShadeWindowView mStatusBarWindow; private final Consumer<Boolean> mVisibilityCallback; private final NotificationPanelViewController mNotificationPanel; private final ArraySet<BrightnessMirrorListener> mBrightnessMirrorListeners = new ArraySet<>(); private final int[] mInt2Cache = new int[2]; private View mBrightnessMirror; - public BrightnessMirrorController(StatusBarWindowView statusBarWindow, + public BrightnessMirrorController(NotificationShadeWindowView statusBarWindow, NotificationPanelViewController notificationPanelViewController, @NonNull Consumer<Boolean> visibilityCallback) { mStatusBarWindow = statusBarWindow; |