Extract SysUi state management out of OverviewProxyService

Move all sysUi state flag handling into a
separate class.

fixes: 138601608
Test: atest SysUiStateFlagsContainerTest
Checked that callbacks were being sent in
OPS, EdgeHandler and in Launcher codebase via
debugger.

Change-Id: Ie8f7ef2e647db88d244af1062eb95dbb69a46919
This commit is contained in:
Vinit Nayak
2019-08-12 11:50:00 -07:00
parent ae04682de9
commit 59b114e633
12 changed files with 322 additions and 91 deletions

View File

@@ -41,6 +41,7 @@ import com.android.systemui.dock.DockManager;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.FalsingManager;
@@ -304,6 +305,7 @@ public class Dependency extends SystemUI {
@Inject Lazy<ChannelEditorDialogController> mChannelEditorDialogController;
@Inject Lazy<INotificationManager> mINotificationManager;
@Inject Lazy<FalsingManager> mFalsingManager;
@Inject Lazy<SysUiState> mSysUiStateFlagsContainer;
@Inject
public Dependency() {
@@ -482,6 +484,7 @@ public class Dependency extends SystemUI {
mProviders.put(ChannelEditorDialogController.class, mChannelEditorDialogController::get);
mProviders.put(INotificationManager.class, mINotificationManager::get);
mProviders.put(FalsingManager.class, mFalsingManager::get);
mProviders.put(SysUiState.class, mSysUiStateFlagsContainer::get);
// TODO(b/118592525): to support multi-display , we start to add something which is
// per-display, while others may be global. I think it's time to add

View File

@@ -30,6 +30,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.KeyguardIndicationController;

View File

@@ -20,6 +20,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageManager;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.util.AsyncSensorManager;
@@ -47,4 +48,11 @@ public abstract class SystemUIModule {
}
return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager);
}
@Singleton
@Provides
static SysUiState provideSysUiState() {
return new SysUiState();
}
}

View File

@@ -22,8 +22,8 @@ import androidx.annotation.Nullable;
import com.android.systemui.Dependency;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;
import java.io.PrintWriter;
@@ -41,15 +41,11 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
handleDozingChanged(isDozing);
}
};
private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
new OverviewProxyService.OverviewProxyListener() {
@Override
public void onSystemUiStateChanged(int sysuiStateFlags) {
handleSystemUiStateChange(sysuiStateFlags);
}
};
private final SysUiState.SysUiStateCallback mSysUiStateCallback =
this::handleSystemUiStateChange;
private final StatusBarStateController mStatusBarStateController;
private final OverviewProxyService mOverviewProxyService;
private final SysUiState mSysUiFlagContainer;
private boolean mIsDozing;
private boolean mIsHomeHandleHiding;
@@ -58,7 +54,7 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
AssistHandleLikeHomeBehavior() {
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mSysUiFlagContainer = Dependency.get(SysUiState.class);
}
@Override
@@ -66,14 +62,14 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
mAssistHandleCallbacks = callbacks;
mIsDozing = mStatusBarStateController.isDozing();
mStatusBarStateController.addCallback(mStatusBarStateListener);
mOverviewProxyService.addCallback(mOverviewProxyListener);
mSysUiFlagContainer.addCallback(mSysUiStateCallback);
callbackForCurrentState();
}
@Override
public void onModeDeactivated() {
mAssistHandleCallbacks = null;
mOverviewProxyService.removeCallback(mOverviewProxyListener);
mSysUiFlagContainer.removeCallback(mSysUiStateCallback);
}
private static boolean isHomeHandleHiding(int sysuiStateFlags) {

View File

@@ -32,6 +32,7 @@ import androidx.annotation.Nullable;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.Dependency;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -107,12 +108,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
public void onOverviewShown(boolean fromHome) {
handleOverviewShown();
}
@Override
public void onSystemUiStateChanged(int sysuiStateFlags) {
handleSystemUiStateChanged(sysuiStateFlags);
}
};
private final SysUiState.SysUiStateCallback mSysUiStateCallback =
this::handleSystemUiStateChanged;
private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -127,6 +126,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
private final StatusBarStateController mStatusBarStateController;
private final ActivityManagerWrapper mActivityManagerWrapper;
private final OverviewProxyService mOverviewProxyService;
private final SysUiState mSysUiFlagContainer;
private boolean mOnLockscreen;
private boolean mIsDozing;
@@ -154,6 +154,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mSysUiFlagContainer = Dependency.get(SysUiState.class);
mDefaultHomeIntentFilter = new IntentFilter();
for (String action : DEFAULT_HOME_CHANGE_ACTIONS) {
mDefaultHomeIntentFilter.addAction(action);
@@ -174,6 +175,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId;
mActivityManagerWrapper.registerTaskStackListener(mTaskStackChangeListener);
mOverviewProxyService.addCallback(mOverviewProxyListener);
mSysUiFlagContainer.addCallback(mSysUiStateCallback);
mLearningTimeElapsed = Settings.Secure.getLong(
context.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, /* default = */ 0);
@@ -199,6 +201,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackChangeListener);
mOverviewProxyService.removeCallback(mOverviewProxyListener);
mSysUiFlagContainer.removeCallback(mSysUiStateCallback);
}
@Override

View File

@@ -0,0 +1,114 @@
/*
* 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.
* 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.model;
import static android.view.Display.DEFAULT_DISPLAY;
import android.annotation.NonNull;
import com.android.systemui.Dumpable;
import com.android.systemui.shared.system.QuickStepContract;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Singleton;
/**
* Contains sysUi state flags and notifies registered
* listeners whenever changes happen.
*/
@Singleton
public class SysUiState implements Dumpable {
private @QuickStepContract.SystemUiStateFlags int mFlags;
private final List<SysUiStateCallback> mCallbacks = new ArrayList<>();
private int mFlagsToSet = 0;
private int mFlagsToClear = 0;
/**
* Add listener to be notified of changes made to SysUI state.
* The callback will also be called as part of this function.
*/
public void addCallback(@NonNull SysUiStateCallback callback) {
mCallbacks.add(callback);
callback.onSystemUiStateChanged(mFlags);
}
/** Callback will no longer receive events on state change */
public void removeCallback(@NonNull SysUiStateCallback callback) {
mCallbacks.remove(callback);
}
/** Methods to this call can be chained together before calling {@link #commitUpdate(int)}. */
public SysUiState setFlag(int flag, boolean enabled) {
if (enabled) {
mFlagsToSet |= flag;
} else {
mFlagsToClear |= flag;
}
return this;
}
/** Call to save all the flags updated from {@link #setFlag(int, boolean)}. */
public void commitUpdate(int displayId) {
updateFlags(displayId);
mFlagsToSet = 0;
mFlagsToClear = 0;
}
private void updateFlags(int displayId) {
if (displayId != DEFAULT_DISPLAY) {
// Ignore non-default displays for now
return;
}
int newState = mFlags;
newState |= mFlagsToSet;
newState &= ~mFlagsToClear;
notifyAndSetSystemUiStateChanged(newState, mFlags);
}
/** Notify all those who are registered that the state has changed. */
private void notifyAndSetSystemUiStateChanged(int newFlags, int oldFlags) {
if (newFlags != oldFlags) {
mCallbacks.forEach(callback -> callback.onSystemUiStateChanged(newFlags));
mFlags = newFlags;
}
}
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("SysUiState state:");
pw.print(" mSysUiStateFlags="); pw.println(mFlags);
pw.println(" " + QuickStepContract.getSystemUiStateString(mFlags));
pw.print(" backGestureDisabled=");
pw.println(QuickStepContract.isBackGestureDisabled(mFlags));
pw.print(" assistantGestureDisabled=");
pw.println(QuickStepContract.isAssistantGestureDisabled(mFlags));
}
/** Callback to be notified whenever system UI state flags are changed. */
public interface SysUiStateCallback{
/** To be called when any SysUiStateFlag gets updated */
void onSystemUiStateChanged(@QuickStepContract.SystemUiStateFlags int sysUiFlags);
}
}

View File

@@ -17,7 +17,6 @@
package com.android.systemui.recents;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
@@ -58,12 +57,12 @@ import android.view.accessibility.AccessibilityManager;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.systemui.Dumpable;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.phone.NavigationBarFragment;
@@ -101,6 +100,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private static final long MAX_BACKOFF_MILLIS = 10 * 60 * 1000;
private final Context mContext;
private SysUiState mSysUiState;
private final Handler mHandler;
private final NavigationBarController mNavBarController;
private final StatusBarWindowController mStatusBarWinController;
@@ -114,7 +114,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private IOverviewProxy mOverviewProxy;
private int mConnectionBackoffAttempts;
private @SystemUiStateFlags int mSysUiStateFlags;
private boolean mBound;
private boolean mIsEnabled;
private int mCurrentBoundedUserId = -1;
@@ -464,7 +463,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
@Inject
public OverviewProxyService(Context context, DeviceProvisionedController provisionController,
NavigationBarController navBarController, NavigationModeController navModeController,
StatusBarWindowController statusBarWinController) {
StatusBarWindowController statusBarWinController,
SysUiState sysUiState) {
mContext = context;
mHandler = new Handler();
mNavBarController = navBarController;
@@ -478,6 +478,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources());
mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils
.supportsRoundedCornersOnWindows(mContext.getResources());
mSysUiState = sysUiState;
mSysUiState.addCallback(this::notifySystemUiStateFlags);
// Assumes device always starts with back button until launcher tells it that it does not
mNavBarButtonAlpha = 1.0f;
@@ -512,36 +514,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
public void setSystemUiStateFlag(int flag, boolean enabled, int displayId) {
if (displayId != DEFAULT_DISPLAY) {
// Ignore non-default displays for now
return;
}
int newState = mSysUiStateFlags;
if (enabled) {
newState |= flag;
} else {
newState &= ~flag;
}
if (mSysUiStateFlags != newState) {
mSysUiStateFlags = newState;
notifySystemUiStateChanged(mSysUiStateFlags);
notifySystemUiStateFlags(mSysUiStateFlags);
}
}
public int getSystemUiStateFlags() {
return mSysUiStateFlags;
}
private void updateSystemUiStateFlags() {
final NavigationBarFragment navBarFragment =
mNavBarController.getDefaultNavigationBarFragment();
final NavigationBarView navBarView =
mNavBarController.getNavigationBarView(mContext.getDisplayId());
mSysUiStateFlags = 0;
if (navBarFragment != null) {
navBarFragment.updateSystemUiStateFlags(-1);
}
@@ -552,7 +530,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
if (mStatusBarWinController != null) {
mStatusBarWinController.notifyStateChangedCallbacks();
}
notifySystemUiStateFlags(mSysUiStateFlags);
}
private void notifySystemUiStateFlags(int flags) {
@@ -568,11 +545,13 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private void onStatusBarStateChanged(boolean keyguardShowing, boolean keyguardOccluded,
boolean bouncerShowing) {
int displayId = mContext.getDisplayId();
setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
keyguardShowing && !keyguardOccluded, displayId);
setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,
keyguardShowing && keyguardOccluded, displayId);
setSystemUiStateFlag(SYSUI_STATE_BOUNCER_SHOWING, bouncerShowing, displayId);
mSysUiState.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
keyguardShowing && !keyguardOccluded)
.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,
keyguardShowing && keyguardOccluded)
.setFlag(SYSUI_STATE_BOUNCER_SHOWING, bouncerShowing)
.commitUpdate(displayId);
}
/**
@@ -665,7 +644,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
mConnectionCallbacks.add(listener);
listener.onConnectionChanged(mOverviewProxy != null);
listener.onNavBarButtonAlphaChanged(mNavBarButtonAlpha, false);
listener.onSystemUiStateChanged(mSysUiStateFlags);
}
@Override
@@ -736,12 +714,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
private void notifySystemUiStateChanged(int sysuiStateFlags) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
mConnectionCallbacks.get(i).onSystemUiStateChanged(sysuiStateFlags);
}
}
private void notifyStartAssistant(Bundle bundle) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
mConnectionCallbacks.get(i).startAssistant(bundle);
@@ -782,12 +754,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);
pw.print(" quickStepIntentResolved="); pw.println(isEnabled());
pw.print(" mSysUiStateFlags="); pw.println(mSysUiStateFlags);
pw.println(" " + QuickStepContract.getSystemUiStateString(mSysUiStateFlags));
pw.print(" backGestureDisabled=");
pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags));
pw.print(" assistantGestureDisabled=");
pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags));
mSysUiState.dump(fd, pw, args);
pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
}

View File

@@ -55,6 +55,7 @@ import android.view.WindowManagerGlobal;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -166,8 +167,10 @@ public class EdgeBackGestureHandler implements DisplayListener {
private RegionSamplingHelper mRegionSamplingHelper;
private int mLeftInset;
private int mRightInset;
private int mSysUiFlags;
public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService) {
public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService,
SysUiState sysUiFlagContainer) {
final Resources res = context.getResources();
mContext = context;
mDisplayId = context.getDisplayId();
@@ -186,6 +189,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
mMinArrowPosition = res.getDimensionPixelSize(R.dimen.navigation_edge_arrow_min_y);
mFingerOffset = res.getDimensionPixelSize(R.dimen.navigation_edge_finger_offset);
updateCurrentUserResources(res);
sysUiFlagContainer.addCallback(sysUiFlags -> mSysUiFlags = sysUiFlags);
}
public void updateCurrentUserResources(Resources res) {
@@ -352,10 +356,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
if (action == MotionEvent.ACTION_DOWN) {
// Verify if this is in within the touch region and we aren't in immersive mode, and
// either the bouncer is showing or the notification panel is hidden
int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
mIsOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset;
mInRejectedExclusion = false;
mAllowGesture = !QuickStepContract.isBackGestureDisabled(stateFlags)
mAllowGesture = !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
&& isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
if (mAllowGesture) {
mEdgePanelLp.gravity = mIsOnLeftEdge

View File

@@ -91,6 +91,7 @@ import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
@@ -134,6 +135,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
private final AccessibilityManagerWrapper mAccessibilityManagerWrapper;
protected final AssistManager mAssistManager;
private SysUiState mSysUiFlagsContainer;
private final MetricsLogger mMetricsLogger;
private final DeviceProvisionedController mDeviceProvisionedController;
private final StatusBarStateController mStatusBarStateController;
@@ -245,12 +247,14 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger,
AssistManager assistManager, OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController,
StatusBarStateController statusBarStateController) {
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer) {
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
mDeviceProvisionedController = deviceProvisionedController;
mStatusBarStateController = statusBarStateController;
mMetricsLogger = metricsLogger;
mAssistManager = assistManager;
mSysUiFlagsContainer = sysUiFlagsContainer;
mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
mOverviewProxyService = overviewProxyService;
mNavBarMode = navigationModeController.addListener(this);
@@ -884,12 +888,11 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
}
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE,
clickable, mDisplayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE,
longClickable, mDisplayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NAV_BAR_HIDDEN,
!isNavBarWindowVisible(), mDisplayId);
mSysUiFlagsContainer.setFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE, clickable)
.setFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, longClickable)
.setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isNavBarWindowVisible())
.commitUpdate(mDisplayId);
}
/**

View File

@@ -68,6 +68,7 @@ import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsOnboarding;
@@ -92,6 +93,7 @@ public class NavigationBarView extends FrameLayout implements
final static boolean ALTERNATE_CAR_MODE_UI = false;
private final RegionSamplingHelper mRegionSamplingHelper;
private final int mNavColorSampleMargin;
private final SysUiState mSysUiFlagContainer;
View mCurrentView = null;
private View mVertical;
@@ -266,6 +268,7 @@ public class NavigationBarView extends FrameLayout implements
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
boolean isGesturalMode = isGesturalMode(mNavBarMode);
mSysUiFlagContainer = Dependency.get(SysUiState.class);
// Set up the context group of buttons
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
@@ -307,11 +310,10 @@ public class NavigationBarView extends FrameLayout implements
mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
mDeadZone = new DeadZone(this);
mNavColorSampleMargin =
getResources()
mNavColorSampleMargin = getResources()
.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
mEdgeBackGestureHandler = new EdgeBackGestureHandler(context, mOverviewProxyService);
mEdgeBackGestureHandler =
new EdgeBackGestureHandler(context, mOverviewProxyService, mSysUiFlagContainer);
mRegionSamplingHelper = new RegionSamplingHelper(this,
new RegionSamplingHelper.SamplingCallback() {
@Override
@@ -745,23 +747,26 @@ public class NavigationBarView extends FrameLayout implements
public void updateDisabledSystemUiStateFlags() {
int displayId = mContext.getDisplayId();
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive(), displayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0, displayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_HOME_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0, displayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SEARCH_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0, displayId);
mSysUiFlagContainer.setFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
.setFlag(SYSUI_STATE_HOME_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
.setFlag(SYSUI_STATE_SEARCH_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0)
.commitUpdate(displayId);
}
public void updatePanelSystemUiStateFlags() {
int displayId = mContext.getDisplayId();
if (mPanelView != null) {
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED,
mPanelView.isFullyExpanded() && !mPanelView.isInSettings(), displayId);
mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED,
mPanelView.isInSettings(), displayId);
mSysUiFlagContainer.setFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED,
mPanelView.isFullyExpanded() && !mPanelView.isInSettings())
.setFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED,
mPanelView.isInSettings())
.commitUpdate(displayId);
}
}

View File

@@ -0,0 +1,119 @@
/*
* 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.
* 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.model;
import static android.view.Display.DEFAULT_DISPLAY;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
@SmallTest
@RunWith(MockitoJUnitRunner.class)
public class SysUiStateTest extends SysuiTestCase {
private static final int FLAG_1 = 1;
private static final int FLAG_2 = 1 << 1;
private static final int FLAG_3 = 1 << 2;
private static final int FLAG_4 = 1 << 3;
private static final int DISPLAY_ID = DEFAULT_DISPLAY;
private SysUiState.SysUiStateCallback mCallback;
private SysUiState mFlagsContainer;
@Before
public void setup() {
mFlagsContainer = new SysUiState();
mCallback = mock(SysUiState.SysUiStateCallback.class);
mFlagsContainer.addCallback(mCallback);
}
@Test
public void addSingle_setFlag() {
setFlags(FLAG_1);
verify(mCallback, times(1)).onSystemUiStateChanged(FLAG_1);
}
@Test
public void addMultiple_setFlag() {
setFlags(FLAG_1);
setFlags(FLAG_2);
verify(mCallback, times(1)).onSystemUiStateChanged(FLAG_1);
verify(mCallback, times(1))
.onSystemUiStateChanged(FLAG_1 | FLAG_2);
}
@Test
public void addMultipleRemoveOne_setFlag() {
setFlags(FLAG_1);
setFlags(FLAG_2);
mFlagsContainer.setFlag(FLAG_1, false)
.commitUpdate(DISPLAY_ID);
verify(mCallback, times(1)).onSystemUiStateChanged(FLAG_1);
verify(mCallback, times(1))
.onSystemUiStateChanged(FLAG_1 | FLAG_2);
verify(mCallback, times(1)).onSystemUiStateChanged(FLAG_2);
}
@Test
public void addMultiple_setFlags() {
setFlags(FLAG_1, FLAG_2, FLAG_3, FLAG_4);
int expected = FLAG_1 | FLAG_2 | FLAG_3 | FLAG_4;
verify(mCallback, times(1)).onSystemUiStateChanged(expected);
}
@Test
public void addMultipleRemoveOne_setFlags() {
setFlags(FLAG_1, FLAG_2, FLAG_3, FLAG_4);
mFlagsContainer.setFlag(FLAG_2, false)
.commitUpdate(DISPLAY_ID);
int expected1 = FLAG_1 | FLAG_2 | FLAG_3 | FLAG_4;
verify(mCallback, times(1)).onSystemUiStateChanged(expected1);
int expected2 = FLAG_1 | FLAG_3 | FLAG_4;
verify(mCallback, times(1)).onSystemUiStateChanged(expected2);
}
@Test
public void removeCallback() {
mFlagsContainer.removeCallback(mCallback);
setFlags(FLAG_1, FLAG_2, FLAG_3, FLAG_4);
int expected = FLAG_1 | FLAG_2 | FLAG_3 | FLAG_4;
verify(mCallback, times(0)).onSystemUiStateChanged(expected);
}
private void setFlags(int... flags) {
for (int i = 0; i < flags.length; i++) {
mFlagsContainer.setFlag(flags[i], true);
}
mFlagsContainer.commitUpdate(DISPLAY_ID);
}
}

View File

@@ -24,6 +24,8 @@ import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -56,6 +58,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.SysuiTestableContext;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
@@ -82,6 +85,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
private OverviewProxyService mOverviewProxyService =
mDependency.injectMockDependency(OverviewProxyService.class);
private CommandQueue mCommandQueue;
private SysUiState mMockSysUiState;
private AccessibilityManagerWrapper mAccessibilityWrapper =
new AccessibilityManagerWrapper(mContext) {
Tracker mTracker = mLeakCheck.getTracker("accessibility_manager");
@@ -156,6 +161,9 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
mDependency.injectTestDependency(Dependency.BG_LOOPER, Looper.getMainLooper());
mDependency.injectTestDependency(AccessibilityManagerWrapper.class, mAccessibilityWrapper);
mMockSysUiState = mock(SysUiState.class);
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
}
@Test
@@ -217,7 +225,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
mock(AssistManager.class),
mOverviewProxyService,
mock(NavigationModeController.class),
mock(StatusBarStateController.class));
mock(StatusBarStateController.class),
mMockSysUiState);
}
private class HostCallbacksForExternalDisplay extends