10087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright/*
20087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Copyright (C) 2013 The Android Open Source Project
30087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
40087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Licensed under the Apache License, Version 2.0 (the "License");
50087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * you may not use this file except in compliance with the License.
60087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * You may obtain a copy of the License at
70087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
80087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *      http://www.apache.org/licenses/LICENSE-2.0
90087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Unless required by applicable law or agreed to in writing, software
110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * distributed under the License is distributed on an "AS IS" BASIS,
120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * See the License for the specific language governing permissions and
140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * limitations under the License.
150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright */
160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpackage com.android.systemui.settings;
180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
19106b1c0d804bcf4b875f987d8f3855f1ff67734aFan Zhangimport static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
20106b1c0d804bcf4b875f987d8f3855f1ff67734aFan Zhangimport static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
21106b1c0d804bcf4b875f987d8f3855f1ff67734aFan Zhangimport static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
22106b1c0d804bcf4b875f987d8f3855f1ff67734aFan Zhang
23d846023804ddadcd692666152db420c54594ddb9Michael Wrightimport android.animation.ValueAnimator;
240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.ContentResolver;
250087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.Context;
260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.database.ContentObserver;
27d846023804ddadcd692666152db420c54594ddb9Michael Wrightimport android.hardware.display.DisplayManager;
280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.net.Uri;
290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.AsyncTask;
300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.Handler;
31c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggiimport android.os.Looper;
32c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggiimport android.os.Message;
330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.PowerManager;
340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.RemoteException;
350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.ServiceManager;
360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.UserHandle;
37eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingwimport android.os.UserManager;
380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.provider.Settings;
393107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.service.vr.IVrManager;
403107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.service.vr.IVrStateCallbacks;
413107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.util.Log;
420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.widget.ImageView;
430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4497b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monkimport com.android.internal.logging.MetricsLogger;
45383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
46eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingwimport com.android.settingslib.RestrictedLockUtils;
479c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency;
4897b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk
490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport java.util.ArrayList;
500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpublic class BrightnessController implements ToggleSlider.Listener {
520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private static final String TAG = "StatusBar.BrightnessController";
536d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock    private static final boolean SHOW_AUTOMATIC_ICON = false;
540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
55d846023804ddadcd692666152db420c54594ddb9Michael Wright    private static final int SLIDER_ANIMATION_DURATION = 3000;
56daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
57c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_UPDATE_ICON = 0;
58c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_UPDATE_SLIDER = 1;
59c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_SET_CHECKED = 2;
60c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_ATTACH_LISTENER = 3;
61c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_DETACH_LISTENER = 4;
623107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private static final int MSG_VR_MODE_CHANGED = 5;
63c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMinimumBacklight;
650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMaximumBacklight;
66585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright    private final int mDefaultBacklight;
673107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final int mMinimumBacklightForVr;
683107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final int mMaximumBacklightForVr;
69585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright    private final int mDefaultBacklightForVr;
700087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final Context mContext;
720087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ImageView mIcon;
730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ToggleSlider mControl;
740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final boolean mAutomaticAvailable;
75d846023804ddadcd692666152db420c54594ddb9Michael Wright    private final DisplayManager mDisplayManager;
760087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final CurrentUserTracker mUserTracker;
773107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final IVrManager mVrManager;
78c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
799c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk    private final Handler mBackgroundHandler;
800087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final BrightnessObserver mBrightnessObserver;
810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
820087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            new ArrayList<BrightnessStateChangeCallback>();
840087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
853107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private volatile boolean mAutomatic;  // Brightness adjusted automatically using ambient light.
863107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private volatile boolean mIsVrModeEnabled;
873f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi    private boolean mListening;
88b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos    private boolean mExternalChange;
89a72faf947f3efe23543d7cead4451641456e6ec9Michael Wright    private boolean mControlValueInitialized;
90d846023804ddadcd692666152db420c54594ddb9Michael Wright
91d846023804ddadcd692666152db420c54594ddb9Michael Wright    private ValueAnimator mSliderAnimator;
92daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
930087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public interface BrightnessStateChangeCallback {
940087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onBrightnessLevelChanged();
950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
970087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** ContentObserver to watch brightness **/
980087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private class BrightnessObserver extends ContentObserver {
990087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1000087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_MODE_URI =
1010087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
1020087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_URI =
1030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
1043107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        private final Uri BRIGHTNESS_FOR_VR_URI =
1053107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR);
1060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public BrightnessObserver(Handler handler) {
1080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            super(handler);
1090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
1120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange) {
1130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            onChange(selfChange, null);
1140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
1170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange, Uri uri) {
1180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            if (selfChange) return;
119c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
120c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            if (BRIGHTNESS_MODE_URI.equals(uri)) {
121c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
122c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
123d846023804ddadcd692666152db420c54594ddb9Michael Wright            } else if (BRIGHTNESS_URI.equals(uri)) {
124c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
1253107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } else if (BRIGHTNESS_FOR_VR_URI.equals(uri)) {
1263107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mBackgroundHandler.post(mUpdateSliderRunnable);
127c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
128c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
129c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
130c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
131c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
132c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                cb.onBrightnessLevelChanged();
1330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
1340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void startObserving() {
1370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_MODE_URI,
1410087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
1420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_URI,
1440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
145daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            cr.registerContentObserver(
1463107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    BRIGHTNESS_FOR_VR_URI,
1473107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    false, this, UserHandle.USER_ALL);
1480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void stopObserving() {
1510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
157c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mStartListeningRunnable = new Runnable() {
158c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
159c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
160c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mBrightnessObserver.startObserving();
161c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUserTracker.startTracking();
162c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
163c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            // Update the slider and mode before attaching the listener so we don't
164c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            // receive the onChanged notifications for the initial values.
165c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUpdateModeRunnable.run();
166c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUpdateSliderRunnable.run();
167c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
168c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mHandler.sendEmptyMessage(MSG_ATTACH_LISTENER);
169c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
170c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
171c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
172c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mStopListeningRunnable = new Runnable() {
173c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
174c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
175c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mBrightnessObserver.stopObserving();
176c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUserTracker.stopTracking();
177c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
178c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mHandler.sendEmptyMessage(MSG_DETACH_LISTENER);
179c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
180c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
181c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
182c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    /**
183c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * Fetch the brightness mode from the system settings and update the icon. Should be called from
184c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * background thread.
185c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     */
186c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mUpdateModeRunnable = new Runnable() {
187c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
188c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
189c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            if (mAutomaticAvailable) {
190c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                int automatic;
191c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
192c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_BRIGHTNESS_MODE,
193c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
194c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        UserHandle.USER_CURRENT);
195c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
196c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_ICON, mAutomatic ? 1 : 0).sendToTarget();
197c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
198c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_SET_CHECKED, 0).sendToTarget();
199c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_ICON, 0 /* automatic */).sendToTarget();
200c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
201c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
202c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
203c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
204c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    /**
205c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * Fetch the brightness from the system settings and update the slider. Should be called from
206c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * background thread.
207c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     */
208c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mUpdateSliderRunnable = new Runnable() {
209c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
210c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
211585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            final int val;
212585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            final boolean inVrMode = mIsVrModeEnabled;
213585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            if (inVrMode) {
214585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                val = Settings.System.getIntForUser(mContext.getContentResolver(),
215585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                        Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mDefaultBacklightForVr,
2163107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        UserHandle.USER_CURRENT);
217c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
218585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                val = Settings.System.getIntForUser(mContext.getContentResolver(),
219585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                        Settings.System.SCREEN_BRIGHTNESS, mDefaultBacklight,
220c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        UserHandle.USER_CURRENT);
221c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
222585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            mHandler.obtainMessage(MSG_UPDATE_SLIDER, val, inVrMode ? 1 : 0).sendToTarget();
223c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
224c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
225c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
2263107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
2273107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        @Override
2283107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        public void onVrStateChanged(boolean enabled) {
2293107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mHandler.obtainMessage(MSG_VR_MODE_CHANGED, enabled ? 1 : 0, 0)
2303107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    .sendToTarget();
2313107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
2323107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    };
2333107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
234c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Handler mHandler = new Handler() {
235c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
236c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void handleMessage(Message msg) {
237c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mExternalChange = true;
238c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            try {
239c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                switch (msg.what) {
240c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_UPDATE_ICON:
241c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        updateIcon(msg.arg1 != 0);
242c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
243c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_UPDATE_SLIDER:
244585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                        updateSlider(msg.arg1, msg.arg2 != 0);
245c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
246c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_SET_CHECKED:
247c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setChecked(msg.arg1 != 0);
248c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
249c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_ATTACH_LISTENER:
250c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setOnChangedListener(BrightnessController.this);
251c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
252c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_DETACH_LISTENER:
253c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setOnChangedListener(null);
2544adee26d9914f9b492d3fb09ff1512b2742dec41Jorim Jaggi                        break;
2553107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    case MSG_VR_MODE_CHANGED:
2563107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        updateVrMode(msg.arg1 != 0);
2573107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        break;
258c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    default:
259c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        super.handleMessage(msg);
260c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                }
261c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } finally {
262c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mExternalChange = false;
263c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
264c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
265c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
266c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
2670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
2680087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mContext = context;
2690087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mIcon = icon;
2700087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mControl = control;
271106b1c0d804bcf4b875f987d8f3855f1ff67734aFan Zhang        mControl.setMax(GAMMA_SPACE_MAX);
2729c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
2730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mUserTracker = new CurrentUserTracker(mContext) {
2740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            @Override
2750087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            public void onUserSwitched(int newUserId) {
276c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
277c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
2780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
2790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        };
2800087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mBrightnessObserver = new BrightnessObserver(mHandler);
2810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
282585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        PowerManager pm = context.getSystemService(PowerManager.class);
2830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
2840087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
285585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        mDefaultBacklight = pm.getDefaultScreenBrightnessSetting();
2863107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        mMinimumBacklightForVr = pm.getMinimumScreenBrightnessForVrSetting();
2873107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        mMaximumBacklightForVr = pm.getMaximumScreenBrightnessForVrSetting();
288585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        mDefaultBacklightForVr = pm.getDefaultScreenBrightnessForVrSetting();
2890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2900087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mAutomaticAvailable = context.getResources().getBoolean(
2910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                com.android.internal.R.bool.config_automatic_brightness_available);
292d846023804ddadcd692666152db420c54594ddb9Michael Wright        mDisplayManager = context.getSystemService(DisplayManager.class);
2938deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner        mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
2948deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner                Context.VR_SERVICE));
2950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2970087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
2980087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mChangeCallbacks.add(cb);
2990087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3000087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3010087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
3020087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        return mChangeCallbacks.remove(cb);
3030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    @Override
3060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void onInit(ToggleSlider control) {
3070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        // Do nothing
3080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
310f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    public void registerCallbacks() {
3113f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (mListening) {
3123f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
3133f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
3145a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
3153107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mVrManager != null) {
3163107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            try {
3173107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mVrManager.registerListener(mVrStateCallbacks);
3183107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mIsVrModeEnabled = mVrManager.getVrModeState();
3193107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } catch (RemoteException e) {
3203107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Log.e(TAG, "Failed to register VR mode state listener: ", e);
3213107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3223107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
3233107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
324c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        mBackgroundHandler.post(mStartListeningRunnable);
3255a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = true;
326f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    }
327f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi
3280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** Unregister all call backs, both to and from the controller */
3290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void unregisterCallbacks() {
3303f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (!mListening) {
3313f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
3323f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
3335a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
3343107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mVrManager != null) {
3353107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            try {
3363107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mVrManager.unregisterListener(mVrStateCallbacks);
3373107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } catch (RemoteException e) {
3383107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Log.e(TAG, "Failed to unregister VR mode state listener: ", e);
3393107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3403107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
3413107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
342c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        mBackgroundHandler.post(mStopListeningRunnable);
3435a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = false;
344a72faf947f3efe23543d7cead4451641456e6ec9Michael Wright        mControlValueInitialized = false;
3450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3460087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3475fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    @Override
3483b0f892c8f38d610679dc9f0aed123e8611a387fMuyuan Li    public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
3493b0f892c8f38d610679dc9f0aed123e8611a387fMuyuan Li            int value, boolean stopTracking) {
350daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        updateIcon(mAutomatic);
351b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos        if (mExternalChange) return;
352b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos
353d846023804ddadcd692666152db420c54594ddb9Michael Wright        if (mSliderAnimator != null) {
354d846023804ddadcd692666152db420c54594ddb9Michael Wright            mSliderAnimator.cancel();
355d846023804ddadcd692666152db420c54594ddb9Michael Wright        }
356d846023804ddadcd692666152db420c54594ddb9Michael Wright
357585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int min;
358585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int max;
359585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int metric;
360585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final String setting;
361585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
3623107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mIsVrModeEnabled) {
363585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            metric = MetricsEvent.ACTION_BRIGHTNESS_FOR_VR;
364585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            min = mMinimumBacklightForVr;
365585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            max = mMaximumBacklightForVr;
366585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            setting = Settings.System.SCREEN_BRIGHTNESS_FOR_VR;
367d846023804ddadcd692666152db420c54594ddb9Michael Wright        } else {
368585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            metric = mAutomatic
369585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                    ? MetricsEvent.ACTION_BRIGHTNESS_AUTO
370585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                    : MetricsEvent.ACTION_BRIGHTNESS;
371585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            min = mMinimumBacklight;
372585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            max = mMaximumBacklight;
373585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            setting = Settings.System.SCREEN_BRIGHTNESS;
374585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        }
375585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
376585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int val = convertGammaToLinear(value, min, max);
377585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
378585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        if (stopTracking) {
379585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            MetricsLogger.action(mContext, metric, val);
380585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        }
381585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
382585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        setBrightness(val);
383585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        if (!tracking) {
384585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            AsyncTask.execute(new Runnable() {
385585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                    public void run() {
386585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                        Settings.System.putIntForUser(mContext.getContentResolver(),
387585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                                setting, val, UserHandle.USER_CURRENT);
388585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                    }
389585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright                });
3900087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
3910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
3930087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cb.onBrightnessLevelChanged();
3940087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
3950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
397eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw    public void checkRestrictionAndSetEnabled() {
398eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw        mBackgroundHandler.post(new Runnable() {
399eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw            @Override
400eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw            public void run() {
401eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw                ((ToggleSliderView)mControl).setEnforcedAdmin(
402eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw                        RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
403eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw                                UserManager.DISALLOW_CONFIG_BRIGHTNESS,
404eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw                                mUserTracker.getCurrentUserId()));
405eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw            }
406eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw        });
407eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw    }
408eb2bf7d188b28096ae2b933483c121256c0d04eeyuemingw
4090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setMode(int mode) {
4100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        Settings.System.putIntForUser(mContext.getContentResolver(),
4110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
4120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                mUserTracker.getCurrentUserId());
4130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setBrightness(int brightness) {
416d846023804ddadcd692666152db420c54594ddb9Michael Wright        mDisplayManager.setTemporaryBrightness(brightness);
4170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4196e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos    private void setBrightnessAdj(float adj) {
420d846023804ddadcd692666152db420c54594ddb9Michael Wright        mDisplayManager.setTemporaryAutoBrightnessAdjustment(adj);
421daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    }
422daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
4230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void updateIcon(boolean automatic) {
4240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        if (mIcon != null) {
4256d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock            mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ?
4260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
4270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
4280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
4290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4303107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
4313107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private void updateVrMode(boolean isEnabled) {
4323107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mIsVrModeEnabled != isEnabled) {
4333107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mIsVrModeEnabled = isEnabled;
4343107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mBackgroundHandler.post(mUpdateSliderRunnable);
4353107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
4363107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    }
437d846023804ddadcd692666152db420c54594ddb9Michael Wright
438585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright    private void updateSlider(int val, boolean inVrMode) {
439585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int min;
440585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int max;
441585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        if (inVrMode) {
442585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            min = mMinimumBacklightForVr;
443585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            max = mMaximumBacklightForVr;
444585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        } else {
445585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            min = mMinimumBacklight;
446585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            max = mMaximumBacklight;
447585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        }
448585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        if (val == convertGammaToLinear(mControl.getValue(), min, max)) {
449585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            // If we have more resolution on the slider than we do in the actual setting, then
450585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            // multiple slider positions will map to the same setting value. Thus, if we see a
451585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            // setting value here that maps to the current slider position, we don't bother to
452585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            // calculate the new slider position since it may differ and look like a brightness
453585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            // change to the user even though it isn't one.
454585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright            return;
455585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        }
456585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        final int sliderVal = convertLinearToGamma(val, min, max);
457585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright        animateSliderTo(sliderVal);
458585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright    }
459585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
460d846023804ddadcd692666152db420c54594ddb9Michael Wright    private void animateSliderTo(int target) {
461a72faf947f3efe23543d7cead4451641456e6ec9Michael Wright        if (!mControlValueInitialized) {
462d846023804ddadcd692666152db420c54594ddb9Michael Wright            // Don't animate the first value since it's default state isn't meaningful to users.
463d846023804ddadcd692666152db420c54594ddb9Michael Wright            mControl.setValue(target);
464a72faf947f3efe23543d7cead4451641456e6ec9Michael Wright            mControlValueInitialized = true;
465d846023804ddadcd692666152db420c54594ddb9Michael Wright        }
466d846023804ddadcd692666152db420c54594ddb9Michael Wright        if (mSliderAnimator != null && mSliderAnimator.isStarted()) {
467d846023804ddadcd692666152db420c54594ddb9Michael Wright            mSliderAnimator.cancel();
468d846023804ddadcd692666152db420c54594ddb9Michael Wright        }
469d846023804ddadcd692666152db420c54594ddb9Michael Wright        mSliderAnimator = ValueAnimator.ofInt(mControl.getValue(), target);
470d846023804ddadcd692666152db420c54594ddb9Michael Wright        mSliderAnimator.addUpdateListener((ValueAnimator animation) -> {
471d846023804ddadcd692666152db420c54594ddb9Michael Wright            mExternalChange = true;
472d846023804ddadcd692666152db420c54594ddb9Michael Wright            mControl.setValue((int)animation.getAnimatedValue());
473d846023804ddadcd692666152db420c54594ddb9Michael Wright            mExternalChange = false;
474d846023804ddadcd692666152db420c54594ddb9Michael Wright        });
475d846023804ddadcd692666152db420c54594ddb9Michael Wright        mSliderAnimator.setDuration(SLIDER_ANIMATION_DURATION);
476d846023804ddadcd692666152db420c54594ddb9Michael Wright        mSliderAnimator.start();
477d846023804ddadcd692666152db420c54594ddb9Michael Wright    }
478585ff988bbc116f318741f3ed3916ed44558a3fbMichael Wright
4790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright}
480