diff --git a/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt b/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt index 7ccc26c063d3da3e830012aa41d77a4aeae95605..4a5cc641dcf1f329a215010167649f6b1109391d 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt @@ -16,7 +16,6 @@ package com.android.systemui.flags -import android.util.Log import com.android.systemui.Dependency /** @@ -65,8 +64,7 @@ private constructor( * } * ```` */ - fun assertInLegacyMode() = - check(!isEnabled) { "Legacy code path not supported when $flagName is enabled." } + fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, flagName) /** * Called to ensure code is only run when the flag is enabled. This protects users from the @@ -81,13 +79,8 @@ private constructor( * } * ``` */ - fun isUnexpectedlyInLegacyMode(): Boolean { - if (!isEnabled) { - val message = "New code path expects $flagName to be enabled." - Log.wtf(TAG, message, Exception(message)) - } - return !isEnabled - } + fun isUnexpectedlyInLegacyMode(): Boolean = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, flagName) companion object { private const val TAG = "RefactorFlag" diff --git a/packages/SystemUI/src/com/android/systemui/flags/RefactorFlagUtils.kt b/packages/SystemUI/src/com/android/systemui/flags/RefactorFlagUtils.kt new file mode 100644 index 0000000000000000000000000000000000000000..2aa397f3e74467431ce96ca26f64d0286f4cc647 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/flags/RefactorFlagUtils.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2023 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.flags + +import android.util.Log + +/** + * Utilities for writing your own objects to uphold refactor flag conventions. + * + * Example usage: + * ``` + * object SomeRefactor { + * const val FLAG_NAME = Flags.SOME_REFACTOR + * @JvmStatic inline val isEnabled get() = Flags.someRefactor() + * @JvmStatic inline fun isUnexpectedlyInLegacyMode() = + * RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + * @JvmStatic inline fun assertInLegacyMode() = + * RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) + * } + * ``` + */ +@Suppress("NOTHING_TO_INLINE") +object RefactorFlagUtils { + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + * + * Example usage: + * ``` + * public void setNewController(SomeController someController) { + * if (SomeRefactor.isUnexpectedlyInLegacyMode()) return; + * mSomeController = someController; + * } + * ``` + */ + inline fun isUnexpectedlyInLegacyMode(isEnabled: Boolean, flagName: Any): Boolean { + val inLegacyMode = !isEnabled + if (inLegacyMode) { + val message = "New code path expects $flagName to be enabled." + Log.wtf("RefactorFlag", message, IllegalStateException(message)) + } + return inLegacyMode + } + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + * + * Example usage: + * ``` + * public void setSomeLegacyController(SomeController someController) { + * SomeRefactor.assertInLegacyMode(); + * mSomeController = someController; + * } + * ```` + */ + inline fun assertInLegacyMode(isEnabled: Boolean, flagName: Any) = + check(!isEnabled) { "Legacy code path not supported when $flagName is enabled." } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/shared/FooterViewRefactor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/shared/FooterViewRefactor.kt new file mode 100644 index 0000000000000000000000000000000000000000..94e70e5521c32019a61bb90d93b9f329cd76810e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/shared/FooterViewRefactor.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 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.statusbar.notification.footer.shared + +import com.android.systemui.Flags +import com.android.systemui.flags.RefactorFlagUtils + +/** Helper for reading or using the FooterView refactor flag state. */ +@Suppress("NOTHING_TO_INLINE") +object FooterViewRefactor { + const val FLAG_NAME = Flags.FLAG_NOTIFICATIONS_FOOTER_VIEW_REFACTOR + + /** Is the refactor enabled */ + @JvmStatic + inline val isEnabled + get() = Flags.notificationsFooterViewRefactor() + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) +}