12e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko/* 22e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Copyright (C) 2016 The Android Open Source Project 32e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 42e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 52e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * you may not use this file except in compliance with the License. 62e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * You may obtain a copy of the License at 72e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 82e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 92e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 102e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * Unless required by applicable law or agreed to in writing, software 112e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 122e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * See the License for the specific language governing permissions and 142e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * limitations under the License. 152e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko */ 162e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.experiments; 1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.annotation.VisibleForTesting; 202e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 212e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko/** 2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Experiments return values based on user, device and other criteria. 232e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko */ 2465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopublic final class ExperimentFlag<T> { 256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private static boolean sAllowOverrides = false; 276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @VisibleForTesting 296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public static void initForTest() { 306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko sAllowOverrides = true; 316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** Returns a boolean experiment */ 3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public static ExperimentFlag<Boolean> createFlag( 3565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko boolean defaultValue) { 3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return new ExperimentFlag<>( 3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko defaultValue); 3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private final T mDefaultValue; 416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private T mOverrideValue = null; 436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko private boolean mOverridden = false; 446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private ExperimentFlag( 4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko T defaultValue) { 4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mDefaultValue = defaultValue; 4865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** Returns value for this experiment */ 5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public T get() { 526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return sAllowOverrides && mOverridden ? mOverrideValue : mDefaultValue; 532e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @VisibleForTesting 566ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void override(T t) { 576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (sAllowOverrides) { 586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mOverridden = true; 596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mOverrideValue = t; 606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @VisibleForTesting 646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void resetOverride() { 656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mOverridden = false; 666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 702e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko} 71