Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab0af704 authored by Jeff DeCew's avatar Jeff DeCew
Browse files

Add RefactorFlagUtils and an example usage

Fixes: 303809202
Test: atest SystemUITests
Change-Id: Id2a5e113d76032496a654f3e9c2dee5c0a7e3a21
parent 21c63a92
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -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"
+74 −0
Original line number Diff line number Diff line
/*
 * 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." }
}
+47 −0
Original line number Diff line number Diff line
/*
 * 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)
}