diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 59270a06dfbc2..f9452e2519447 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -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 mChannelEditorDialogController; @Inject Lazy mINotificationManager; @Inject Lazy mFalsingManager; + @Inject Lazy 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 diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 3ce8a4bb34db1..b67d7dff4d79a 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -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; diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java index edd2463984c8f..5d103eb1da7b2 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java @@ -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(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java index 6cf2034e6c9b6..763315d2c4e2d 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java @@ -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) { diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java index f9ddeaef3e86d..1e20b99221215 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java new file mode 100644 index 0000000000000..029ab4393f322 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java @@ -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 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); + } +} + + diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 16f0b15be24c3..9268ee0705a28 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -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= 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