diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/model/SysUiState.java | 151 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/model/SysUiState.kt | 140 |
2 files changed, 140 insertions, 151 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java deleted file mode 100644 index 1a5e605c96f8..000000000000 --- a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * 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 android.annotation.NonNull; -import android.util.Log; - -import com.android.systemui.Dumpable; -import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.settings.DisplayTracker; -import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; - -import dalvik.annotation.optimization.NeverCompile; - -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; - -/** - * Contains sysUi state flags and notifies registered - * listeners whenever changes happen. - */ -@SysUISingleton -public class SysUiState implements Dumpable { - - private static final String TAG = SysUiState.class.getSimpleName(); - public static final boolean DEBUG = false; - - private final DisplayTracker mDisplayTracker; - private final SceneContainerPlugin mSceneContainerPlugin; - private @SystemUiStateFlags long mFlags; - private final List<SysUiStateCallback> mCallbacks = new ArrayList<>(); - private long mFlagsToSet = 0; - private long mFlagsToClear = 0; - - public SysUiState(DisplayTracker displayTracker, SceneContainerPlugin sceneContainerPlugin) { - mDisplayTracker = displayTracker; - mSceneContainerPlugin = sceneContainerPlugin; - } - - /** - * 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); - } - - /** Returns the current sysui state flags. */ - @SystemUiStateFlags - public long getFlags() { - return mFlags; - } - - public boolean isFlagEnabled(@SystemUiStateFlags long flag) { - return (mFlags & flag) != 0; - } - - /** Methods to this call can be chained together before calling {@link #commitUpdate(int)}. */ - public SysUiState setFlag(@SystemUiStateFlags long flag, boolean enabled) { - final Boolean overrideOrNull = mSceneContainerPlugin != null - ? mSceneContainerPlugin.flagValueOverride(flag) : null; - if (overrideOrNull != null && enabled != overrideOrNull) { - if (DEBUG) { - Log.d(TAG, "setFlag for flag " + flag + " and value " + enabled + " overridden to " - + overrideOrNull + " by scene container plugin"); - } - - enabled = overrideOrNull; - } - - if (enabled) { - mFlagsToSet |= flag; - } else { - mFlagsToClear |= flag; - } - return this; - } - - /** Call to save all the flags updated from {@link #setFlag(long, boolean)}. */ - public void commitUpdate(int displayId) { - updateFlags(displayId); - mFlagsToSet = 0; - mFlagsToClear = 0; - } - - private void updateFlags(int displayId) { - if (displayId != mDisplayTracker.getDefaultDisplayId()) { - // Ignore non-default displays for now - Log.w(TAG, "Ignoring flag update for display: " + displayId, new Throwable()); - return; - } - - long newState = mFlags; - newState |= mFlagsToSet; - newState &= ~mFlagsToClear; - notifyAndSetSystemUiStateChanged(newState, mFlags); - } - - /** Notify all those who are registered that the state has changed. */ - private void notifyAndSetSystemUiStateChanged(long newFlags, long oldFlags) { - if (DEBUG) { - Log.d(TAG, "SysUiState changed: old=" + oldFlags + " new=" + newFlags); - } - if (newFlags != oldFlags) { - mCallbacks.forEach(callback -> callback.onSystemUiStateChanged(newFlags)); - mFlags = newFlags; - } - } - - @NeverCompile - @Override - public void dump(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, false /* forTrackpad */)); - 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(@SystemUiStateFlags long sysUiFlags); - } -} - - diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt b/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt new file mode 100644 index 000000000000..ed190a14e680 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2025 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 android.util.Log +import com.android.systemui.Dumpable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.DisplayTracker +import com.android.systemui.shared.system.QuickStepContract +import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags +import dalvik.annotation.optimization.NeverCompile +import java.io.PrintWriter + +/** Contains sysUi state flags and notifies registered listeners whenever changes happen. */ +@SysUISingleton +class SysUiState( + private val displayTracker: DisplayTracker, + private val sceneContainerPlugin: SceneContainerPlugin?, +) : Dumpable { + /** Returns the current sysui state flags. */ + @get:SystemUiStateFlags + @SystemUiStateFlags + var flags: Long = 0 + private set + + private val callbacks: MutableList<SysUiStateCallback> = ArrayList() + private var flagsToSet: Long = 0 + private var flagsToClear: Long = 0 + + /** + * Add listener to be notified of changes made to SysUI state. The callback will also be called + * as part of this function. + */ + fun addCallback(callback: SysUiStateCallback) { + callbacks.add(callback) + callback.onSystemUiStateChanged(flags) + } + + /** Callback will no longer receive events on state change */ + fun removeCallback(callback: SysUiStateCallback) { + callbacks.remove(callback) + } + + fun isFlagEnabled(@SystemUiStateFlags flag: Long): Boolean { + return (flags and flag) != 0L + } + + /** Methods to this call can be chained together before calling [.commitUpdate]. */ + fun setFlag(@SystemUiStateFlags flag: Long, enabled: Boolean): SysUiState { + var enabled = enabled + val overrideOrNull = sceneContainerPlugin?.flagValueOverride(flag) + if (overrideOrNull != null && enabled != overrideOrNull) { + if (DEBUG) { + Log.d( + TAG, + "setFlag for flag $flag and value $enabled overridden to $overrideOrNull by scene container plugin", + ) + } + + enabled = overrideOrNull + } + + if (enabled) { + flagsToSet = flagsToSet or flag + } else { + flagsToClear = flagsToClear or flag + } + return this + } + + /** Call to save all the flags updated from [.setFlag]. */ + fun commitUpdate(displayId: Int) { + updateFlags(displayId) + flagsToSet = 0 + flagsToClear = 0 + } + + private fun updateFlags(displayId: Int) { + if (displayId != displayTracker.defaultDisplayId) { + // Ignore non-default displays for now + Log.w(TAG, "Ignoring flag update for display: $displayId", Throwable()) + return + } + + var newState = flags + newState = newState or flagsToSet + newState = newState and flagsToClear.inv() + notifyAndSetSystemUiStateChanged(newState, flags) + } + + /** Notify all those who are registered that the state has changed. */ + private fun notifyAndSetSystemUiStateChanged(newFlags: Long, oldFlags: Long) { + if (DEBUG) { + Log.d(TAG, "SysUiState changed: old=$oldFlags new=$newFlags") + } + if (newFlags != oldFlags) { + callbacks.forEach { callback: SysUiStateCallback -> + callback.onSystemUiStateChanged(newFlags) + } + + flags = newFlags + } + } + + @NeverCompile + override fun dump(pw: PrintWriter, args: Array<String>) { + pw.println("SysUiState state:") + pw.print(" mSysUiStateFlags=") + pw.println(flags) + pw.println(" " + QuickStepContract.getSystemUiStateString(flags)) + pw.print(" backGestureDisabled=") + pw.println(QuickStepContract.isBackGestureDisabled(flags, false /* forTrackpad */)) + pw.print(" assistantGestureDisabled=") + pw.println(QuickStepContract.isAssistantGestureDisabled(flags)) + } + + /** Callback to be notified whenever system UI state flags are changed. */ + interface SysUiStateCallback { + /** To be called when any SysUiStateFlag gets updated */ + fun onSystemUiStateChanged(@SystemUiStateFlags sysUiFlags: Long) + } + + companion object { + private val TAG: String = SysUiState::class.java.simpleName + const val DEBUG: Boolean = false + } +} |