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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
114
packages/SystemUI/src/com/android/systemui/model/SysUiState.java
Normal file
114
packages/SystemUI/src/com/android/systemui/model/SysUiState.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user