From dd2f49edb68996ef8d1a62e68a0493d9f98d5fea Mon Sep 17 00:00:00 2001 From: Mike Digman Date: Fri, 16 Mar 2018 10:54:22 -0700 Subject: [PATCH] Add disable2 flag for rotate suggestions The SUW team has requested a programmatic way to hide rotation suggestions during setup. Piggyback on disable2 with new flag, callbacks already available in NavBarFragment. Downgrade permissions for disable2 to match disable so SUW can use. Test: manual with SUW variant Fixes: 75291849 Change-Id: I1021ee5e1628c36ebf53afe843f903006474163e --- core/java/android/app/StatusBarManager.java | 6 ++-- .../statusbar/phone/NavigationBarFragment.java | 37 ++++++++++++++++++++-- .../server/statusbar/StatusBarManagerService.java | 2 +- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 85a9be355878..b83b44d295b4 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -74,11 +74,12 @@ public class StatusBarManager { public static final int DISABLE2_SYSTEM_ICONS = 1 << 1; public static final int DISABLE2_NOTIFICATION_SHADE = 1 << 2; public static final int DISABLE2_GLOBAL_ACTIONS = 1 << 3; + public static final int DISABLE2_ROTATE_SUGGESTIONS = 1 << 4; public static final int DISABLE2_NONE = 0x00000000; public static final int DISABLE2_MASK = DISABLE2_QUICK_SETTINGS | DISABLE2_SYSTEM_ICONS - | DISABLE2_NOTIFICATION_SHADE | DISABLE2_GLOBAL_ACTIONS; + | DISABLE2_NOTIFICATION_SHADE | DISABLE2_GLOBAL_ACTIONS | DISABLE2_ROTATE_SUGGESTIONS; @IntDef(flag = true, prefix = { "DISABLE2_" }, value = { DISABLE2_NONE, @@ -86,7 +87,8 @@ public class StatusBarManager { DISABLE2_QUICK_SETTINGS, DISABLE2_SYSTEM_ICONS, DISABLE2_NOTIFICATION_SHADE, - DISABLE2_GLOBAL_ACTIONS + DISABLE2_GLOBAL_ACTIONS, + DISABLE2_ROTATE_SUGGESTIONS }) @Retention(RetentionPolicy.SOURCE) public @interface Disable2Flags {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 91483bcd358c..b493d7a0e7ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -114,6 +114,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private static final boolean DEBUG = false; private static final boolean DEBUG_ROTATION = true; private static final String EXTRA_DISABLE_STATE = "disabled_state"; + private static final String EXTRA_DISABLE2_STATE = "disabled2_state"; private final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100; private final static int NAVBAR_HIDDEN_PENDING_ICON_TIMEOUT_MS = 20000; @@ -137,6 +138,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private int mDisabledFlags1; + private int mDisabledFlags2; private StatusBar mStatusBar; private Recents mRecents; private Divider mDivider; @@ -212,6 +214,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); + mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0); } mAssistManager = Dependency.get(AssistManager.class); mOverviewProxyService = Dependency.get(OverviewProxyService.class); @@ -277,6 +280,8 @@ public class NavigationBarFragment extends Fragment implements Callbacks { prepareNavigationBarView(); checkNavBarModes(); + setDisabled2Flags(mDisabledFlags2); + IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); @@ -296,6 +301,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(EXTRA_DISABLE_STATE, mDisabledFlags1); + outState.putInt(EXTRA_DISABLE2_STATE, mDisabledFlags2); if (mNavigationBarView != null) { mNavigationBarView.getLightTransitionsController().saveState(outState); } @@ -398,15 +404,20 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void onRotationProposal(final int rotation, boolean isValid) { final int winRotation = mWindowManager.getDefaultDisplay().getRotation(); + final boolean rotateSuggestionsDisabled = hasDisable2RotateSuggestionFlag(mDisabledFlags2); if (DEBUG_ROTATION) { Log.v(TAG, "onRotationProposal proposedRotation=" + Surface.rotationToString(rotation) + ", winRotation=" + Surface.rotationToString(winRotation) + ", isValid=" + isValid + ", mNavBarWindowState=" + StatusBarManager.windowStateToString(mNavigationBarWindowState) + + ", rotateSuggestionsDisabled=" + rotateSuggestionsDisabled + ", isRotateButtonVisible=" + (mNavigationBarView == null ? "null" : mNavigationBarView.isRotateButtonVisible())); } + // Respect the disabled flag, no need for action as flag change callback will handle hiding + if (rotateSuggestionsDisabled) return; + // This method will be called on rotation suggestion changes even if the proposed rotation // is not valid for the top app. Use invalid rotation choices as a signal to remove the // rotate button if shown. @@ -450,6 +461,12 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } } + private void onRotationSuggestionsDisabled() { + // Immediately hide the rotate button and clear any planned removal + setRotateSuggestionButtonState(false, true); + getView().removeCallbacks(mRemoveRotationProposal); + } + private void showAndLogRotationSuggestion() { setRotateSuggestionButtonState(true); rescheduleRotationTimeout(false); @@ -643,8 +660,8 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void disable(int state1, int state2, boolean animate) { - // All navigation bar flags are in state1. - int masked = state1 & (StatusBarManager.DISABLE_HOME + // Navigation bar flags are in both state1 and state2. + final int masked = state1 & (StatusBarManager.DISABLE_HOME | StatusBarManager.DISABLE_RECENT | StatusBarManager.DISABLE_BACK | StatusBarManager.DISABLE_SEARCH); @@ -653,6 +670,22 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (mNavigationBarView != null) mNavigationBarView.setDisabledFlags(state1); updateScreenPinningGestures(); } + + final int masked2 = state2 & (StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS); + if (masked2 != mDisabledFlags2) { + mDisabledFlags2 = masked2; + setDisabled2Flags(masked2); + } + } + + private void setDisabled2Flags(int state2) { + // Method only called on change of disable2 flags + final boolean rotateSuggestionsDisabled = hasDisable2RotateSuggestionFlag(state2); + if (rotateSuggestionsDisabled) onRotationSuggestionsDisabled(); + } + + private boolean hasDisable2RotateSuggestionFlag(int disable2Flags) { + return (disable2Flags & StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS) != 0; } // ----- Internal stuffz ----- diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 59fce64b2f2c..0678d0805b82 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -629,7 +629,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub { */ @Override public void disable2ForUser(int what, IBinder token, String pkg, int userId) { - enforceStatusBarService(); + enforceStatusBar(); synchronized (mLock) { disableLocked(userId, what, token, pkg, 2); -- 2.11.0