| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.base; |
| |
| /** |
| * Flags of this type are un-cached flags that may be called before native, |
| * but not primarily. They have good default values to use before native is loaded, |
| * and will switch to using the native value once native is loaded. |
| * These flags replace code like: |
| * if (FeatureList.isInitialized() && SomeFeatureMap.isEnabled(featureName)) |
| * or |
| * if (!FeatureList.isInitialized() || SomeFeatureMap.isEnabled(featureName)). |
| */ |
| public class MutableFlagWithSafeDefault extends Flag { |
| private final boolean mDefaultValue; |
| private final FeatureMap mFeatureMap; |
| private Boolean mInMemoryCachedValue; |
| |
| public MutableFlagWithSafeDefault( |
| FeatureMap featureMap, String featureName, boolean defaultValue) { |
| super(featureName); |
| mFeatureMap = featureMap; |
| mDefaultValue = defaultValue; |
| } |
| |
| @Override |
| public boolean isEnabled() { |
| if (mInMemoryCachedValue != null) return mInMemoryCachedValue; |
| if (FeatureList.hasTestFeature(mFeatureName)) { |
| return mFeatureMap.isEnabledInNative(mFeatureName); |
| } |
| |
| if (FeatureList.isNativeInitialized()) { |
| mInMemoryCachedValue = mFeatureMap.isEnabledInNative(mFeatureName); |
| return mInMemoryCachedValue; |
| } |
| |
| return mDefaultValue; |
| } |
| |
| @Override |
| protected void clearInMemoryCachedValueForTesting() { |
| mInMemoryCachedValue = null; |
| } |
| } |