diff options
| author | 2023-04-18 16:34:38 -0700 | |
|---|---|---|
| committer | 2023-04-18 16:34:38 -0700 | |
| commit | 4042e26988acfecda45dbcc4d01ac1be7813b42e (patch) | |
| tree | 970a428d34bfaad9fd8e70ad12619586033d18a7 /java/src-debug | |
| parent | d36ad81bb94eb3178d53a227c98692e559465ea2 (diff) | |
| parent | 4bc99bb4b351fe2304b3c7e147248a28c507ae57 (diff) | |
Merge Android 13 QPR3 tm-qpr-dev-plus-aosp-without-vendor@9936994
Bug: 275386652
Merged-In: I392de610b3d3e044e23c83d29fd11061fbc7192d
Change-Id: Ib64b6b991713c518faaab01935cad9e8a57e0d98
Diffstat (limited to 'java/src-debug')
| -rw-r--r-- | java/src-debug/com/android/intentresolver/flags/DebugFeatureFlagRepository.kt | 81 | ||||
| -rw-r--r-- | java/src-debug/com/android/intentresolver/flags/FeatureFlagRepositoryFactory.kt | 30 | 
2 files changed, 111 insertions, 0 deletions
diff --git a/java/src-debug/com/android/intentresolver/flags/DebugFeatureFlagRepository.kt b/java/src-debug/com/android/intentresolver/flags/DebugFeatureFlagRepository.kt new file mode 100644 index 00000000..5067c0ee --- /dev/null +++ b/java/src-debug/com/android/intentresolver/flags/DebugFeatureFlagRepository.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2022 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.intentresolver.flags + +import android.util.SparseBooleanArray +import androidx.annotation.GuardedBy +import com.android.systemui.flags.BooleanFlag +import com.android.systemui.flags.FlagManager +import com.android.systemui.flags.ReleasedFlag +import com.android.systemui.flags.UnreleasedFlag +import javax.annotation.concurrent.ThreadSafe + +@ThreadSafe +internal class DebugFeatureFlagRepository( +    private val flagManager: FlagManager, +    private val deviceConfig: DeviceConfigProxy, +) : FeatureFlagRepository { +    @GuardedBy("self") +    private val cache = hashMapOf<String, Boolean>() + +    override fun isEnabled(flag: UnreleasedFlag): Boolean = isFlagEnabled(flag) + +    override fun isEnabled(flag: ReleasedFlag): Boolean = isFlagEnabled(flag) + +    private fun isFlagEnabled(flag: BooleanFlag): Boolean { +        synchronized(cache) { +            cache[flag.name]?.let { return it } +        } +        val flagValue = readFlagValue(flag) +        return synchronized(cache) { +            // the first read saved in the cache wins +            cache.getOrPut(flag.name) { flagValue } +        } +    } + +    private fun readFlagValue(flag: BooleanFlag): Boolean { +        val localOverride = runCatching { +            flagManager.isEnabled(flag.name) +        }.getOrDefault(null) +        val remoteOverride = deviceConfig.isEnabled(flag) + +        // Only check for teamfood if the default is false +        // and there is no server override. +        if (remoteOverride == null +            && !flag.default +            && localOverride == null +            && !flag.isTeamfoodFlag +            && flag.teamfood +        ) { +            return flagManager.isTeamfoodEnabled +        } +        return localOverride ?: remoteOverride ?: flag.default +    } + +    companion object { +        /** keep in sync with [com.android.systemui.flags.Flags] */ +        private const val TEAMFOOD_FLAG_NAME = "teamfood" + +        private val BooleanFlag.isTeamfoodFlag: Boolean +            get() = name == TEAMFOOD_FLAG_NAME + +        private val FlagManager.isTeamfoodEnabled: Boolean +            get() = runCatching { +                isEnabled(TEAMFOOD_FLAG_NAME) ?: false +            }.getOrDefault(false) +    } +} diff --git a/java/src-debug/com/android/intentresolver/flags/FeatureFlagRepositoryFactory.kt b/java/src-debug/com/android/intentresolver/flags/FeatureFlagRepositoryFactory.kt new file mode 100644 index 00000000..4ddb0447 --- /dev/null +++ b/java/src-debug/com/android/intentresolver/flags/FeatureFlagRepositoryFactory.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 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.intentresolver.flags + +import android.content.Context +import android.os.Handler +import android.os.Looper +import com.android.systemui.flags.FlagManager + +class FeatureFlagRepositoryFactory { +    fun create(context: Context): FeatureFlagRepository = +        DebugFeatureFlagRepository( +            FlagManager(context, Handler(Looper.getMainLooper())), +            DeviceConfigProxy(), +        ) +}  |