From ab0af70407b6860eff2c576529f0567fd6d3374e Mon Sep 17 00:00:00 2001 From: Jeff DeCew <jeffdq@google.com> Date: Fri, 20 Oct 2023 19:04:50 +0000 Subject: [PATCH] Add RefactorFlagUtils and an example usage Fixes: 303809202 Test: atest SystemUITests Change-Id: Id2a5e113d76032496a654f3e9c2dee5c0a7e3a21 --- .../android/systemui/flags/RefactorFlag.kt | 13 +--- .../systemui/flags/RefactorFlagUtils.kt | 74 +++++++++++++++++++ .../footer/shared/FooterViewRefactor.kt | 47 ++++++++++++ 3 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/flags/RefactorFlagUtils.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/shared/FooterViewRefactor.kt diff --git a/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt b/packages/SystemUI/src/com/android/systemui/flags/RefactorFlag.kt index 7ccc26c063d3..4a5cc641dcf1 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 000000000000..2aa397f3e744 --- /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 000000000000..94e70e5521c3 --- /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) +} -- GitLab