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