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
190087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.ContentResolver;
200087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.Context;
210087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.database.ContentObserver;
220087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.net.Uri;
230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.AsyncTask;
240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.Handler;
250087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.IPowerManager;
26c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggiimport android.os.Looper;
27c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggiimport android.os.Message;
280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.PowerManager;
290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.RemoteException;
300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.ServiceManager;
310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.UserHandle;
320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.provider.Settings;
333107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.service.vr.IVrManager;
343107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.service.vr.IVrStateCallbacks;
353107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordonimport android.util.Log;
360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.widget.ImageView;
370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3897b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monkimport com.android.internal.logging.MetricsLogger;
39383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
409c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency;
4197b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk
420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport java.util.ArrayList;
430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpublic class BrightnessController implements ToggleSlider.Listener {
450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private static final String TAG = "StatusBar.BrightnessController";
466d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock    private static final boolean SHOW_AUTOMATIC_ICON = false;
470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
48daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    /**
49daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     * {@link android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ} uses the range [-1, 1].
50daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     * Using this factor, it is converted to [0, BRIGHTNESS_ADJ_RESOLUTION] for the SeekBar.
51daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     */
5227a2ce2e425f0a291344bd1d41fbbaf8afa14f0eAdrian Roos    private static final float BRIGHTNESS_ADJ_RESOLUTION = 2048;
53daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
54c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_UPDATE_ICON = 0;
55c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_UPDATE_SLIDER = 1;
56c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_SET_CHECKED = 2;
57c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_ATTACH_LISTENER = 3;
58c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private static final int MSG_DETACH_LISTENER = 4;
593107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private static final int MSG_VR_MODE_CHANGED = 5;
60c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
610087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMinimumBacklight;
620087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMaximumBacklight;
633107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final int mMinimumBacklightForVr;
643107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final int mMaximumBacklightForVr;
650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
660087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final Context mContext;
670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ImageView mIcon;
680087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ToggleSlider mControl;
690087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final boolean mAutomaticAvailable;
700087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final IPowerManager mPower;
710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final CurrentUserTracker mUserTracker;
723107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final IVrManager mVrManager;
73c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
749c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk    private final Handler mBackgroundHandler;
750087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final BrightnessObserver mBrightnessObserver;
760087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            new ArrayList<BrightnessStateChangeCallback>();
790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
803107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private volatile boolean mAutomatic;  // Brightness adjusted automatically using ambient light.
813107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private volatile boolean mIsVrModeEnabled;
823f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi    private boolean mListening;
83b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos    private boolean mExternalChange;
84daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public interface BrightnessStateChangeCallback {
860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onBrightnessLevelChanged();
870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
880087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** ContentObserver to watch brightness **/
900087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private class BrightnessObserver extends ContentObserver {
910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_MODE_URI =
930087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
940087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_URI =
950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
963107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        private final Uri BRIGHTNESS_FOR_VR_URI =
973107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR);
98daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        private final Uri BRIGHTNESS_ADJ_URI =
99daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ);
1000087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1010087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public BrightnessObserver(Handler handler) {
1020087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            super(handler);
1030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
1060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange) {
1070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            onChange(selfChange, null);
1080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
1110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange, Uri uri) {
1120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            if (selfChange) return;
113c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
114c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            if (BRIGHTNESS_MODE_URI.equals(uri)) {
115c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
116c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
117c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) {
118c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
1193107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } else if (BRIGHTNESS_FOR_VR_URI.equals(uri)) {
1203107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mBackgroundHandler.post(mUpdateSliderRunnable);
121c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) {
122c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
123c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
124c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
125c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
126c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
127c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
128c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                cb.onBrightnessLevelChanged();
1290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
1300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void startObserving() {
1330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_MODE_URI,
1370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
1380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_URI,
1400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
141daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            cr.registerContentObserver(
1423107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    BRIGHTNESS_FOR_VR_URI,
1433107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    false, this, UserHandle.USER_ALL);
1443107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            cr.registerContentObserver(
145daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    BRIGHTNESS_ADJ_URI,
146daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    false, this, UserHandle.USER_ALL);
1470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void stopObserving() {
1500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
156c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mStartListeningRunnable = new Runnable() {
157c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
158c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
159c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mBrightnessObserver.startObserving();
160c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUserTracker.startTracking();
161c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
162c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            // Update the slider and mode before attaching the listener so we don't
163c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            // receive the onChanged notifications for the initial values.
164c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUpdateModeRunnable.run();
165c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUpdateSliderRunnable.run();
166c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
167c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mHandler.sendEmptyMessage(MSG_ATTACH_LISTENER);
168c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
169c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
170c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
171c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mStopListeningRunnable = new Runnable() {
172c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
173c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
174c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mBrightnessObserver.stopObserving();
175c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mUserTracker.stopTracking();
176c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
177c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mHandler.sendEmptyMessage(MSG_DETACH_LISTENER);
178c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
179c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
180c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
181c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    /**
182c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * Fetch the brightness mode from the system settings and update the icon. Should be called from
183c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * background thread.
184c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     */
185c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mUpdateModeRunnable = new Runnable() {
186c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
187c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
188c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            if (mAutomaticAvailable) {
189c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                int automatic;
190c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
191c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_BRIGHTNESS_MODE,
192c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
193c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        UserHandle.USER_CURRENT);
194c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
195c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_ICON, mAutomatic ? 1 : 0).sendToTarget();
196c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
197c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_SET_CHECKED, 0).sendToTarget();
198c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_ICON, 0 /* automatic */).sendToTarget();
199c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
200c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
201c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
202c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
203c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    /**
204c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * Fetch the brightness from the system settings and update the slider. Should be called from
205c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     * background thread.
206c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi     */
207c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Runnable mUpdateSliderRunnable = new Runnable() {
208c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
209c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void run() {
2103107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            if (mIsVrModeEnabled) {
2113107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                int value = Settings.System.getIntForUser(mContext.getContentResolver(),
2123107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mMaximumBacklight,
2133107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        UserHandle.USER_CURRENT);
2143107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mHandler.obtainMessage(MSG_UPDATE_SLIDER,
2153107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        mMaximumBacklightForVr - mMinimumBacklightForVr,
2163107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        value - mMinimumBacklightForVr).sendToTarget();
2173107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } else if (mAutomatic) {
218c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                float value = Settings.System.getFloatForUser(mContext.getContentResolver(),
219c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0,
220c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        UserHandle.USER_CURRENT);
221c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_SLIDER, (int) BRIGHTNESS_ADJ_RESOLUTION,
222c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        (int) ((value + 1) * BRIGHTNESS_ADJ_RESOLUTION / 2f)).sendToTarget();
223c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } else {
224c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                int value;
225c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                value = Settings.System.getIntForUser(mContext.getContentResolver(),
226c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        Settings.System.SCREEN_BRIGHTNESS, mMaximumBacklight,
227c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        UserHandle.USER_CURRENT);
228c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mHandler.obtainMessage(MSG_UPDATE_SLIDER, mMaximumBacklight - mMinimumBacklight,
229c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        value - mMinimumBacklight).sendToTarget();
230c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
231c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
232c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
233c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
2343107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
2353107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        @Override
2363107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        public void onVrStateChanged(boolean enabled) {
2373107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mHandler.obtainMessage(MSG_VR_MODE_CHANGED, enabled ? 1 : 0, 0)
2383107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    .sendToTarget();
2393107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
2403107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    };
2413107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
242c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    private final Handler mHandler = new Handler() {
243c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        @Override
244c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        public void handleMessage(Message msg) {
245c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            mExternalChange = true;
246c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            try {
247c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                switch (msg.what) {
248c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_UPDATE_ICON:
249c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        updateIcon(msg.arg1 != 0);
250c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
251c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_UPDATE_SLIDER:
252c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setMax(msg.arg1);
253c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setValue(msg.arg2);
254c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
255c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_SET_CHECKED:
256c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setChecked(msg.arg1 != 0);
257c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
258c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_ATTACH_LISTENER:
259c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setOnChangedListener(BrightnessController.this);
260c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        break;
261c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    case MSG_DETACH_LISTENER:
262c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        mControl.setOnChangedListener(null);
2634adee26d9914f9b492d3fb09ff1512b2742dec41Jorim Jaggi                        break;
2643107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    case MSG_VR_MODE_CHANGED:
2653107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        updateVrMode(msg.arg1 != 0);
2663107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        break;
267c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                    default:
268c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                        super.handleMessage(msg);
269c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                }
270c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            } finally {
271c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mExternalChange = false;
272c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi            }
273c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        }
274c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi    };
275c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi
2760087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
2770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mContext = context;
2780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mIcon = icon;
2790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mControl = control;
2809c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
2810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mUserTracker = new CurrentUserTracker(mContext) {
2820087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            @Override
2830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            public void onUserSwitched(int newUserId) {
284c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateModeRunnable);
285c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi                mBackgroundHandler.post(mUpdateSliderRunnable);
2860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
2870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        };
2880087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mBrightnessObserver = new BrightnessObserver(mHandler);
2890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2900087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
2910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
2920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
2933107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        mMinimumBacklightForVr = pm.getMinimumScreenBrightnessForVrSetting();
2943107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        mMaximumBacklightForVr = pm.getMaximumScreenBrightnessForVrSetting();
2950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mAutomaticAvailable = context.getResources().getBoolean(
2970087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                com.android.internal.R.bool.config_automatic_brightness_available);
2988deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner        mPower = IPowerManager.Stub.asInterface(ServiceManager.getService(
2998deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner                Context.POWER_SERVICE));
3008deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner        mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
3018deb67cb64b0cd93be545caf7887a12ed3611841Craig Donner                Context.VR_SERVICE));
3020087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
3050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mChangeCallbacks.add(cb);
3060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
3090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        return mChangeCallbacks.remove(cb);
3100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    @Override
3130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void onInit(ToggleSlider control) {
3140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        // Do nothing
3150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
317f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    public void registerCallbacks() {
3183f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (mListening) {
3193f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
3203f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
3215a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
3223107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mVrManager != null) {
3233107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            try {
3243107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mVrManager.registerListener(mVrStateCallbacks);
3253107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mIsVrModeEnabled = mVrManager.getVrModeState();
3263107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } catch (RemoteException e) {
3273107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Log.e(TAG, "Failed to register VR mode state listener: ", e);
3283107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3293107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
3303107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
331c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        mBackgroundHandler.post(mStartListeningRunnable);
3325a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = true;
333f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    }
334f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi
3350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** Unregister all call backs, both to and from the controller */
3360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void unregisterCallbacks() {
3373f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (!mListening) {
3383f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
3393f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
3405a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
3413107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mVrManager != null) {
3423107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            try {
3433107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                mVrManager.unregisterListener(mVrStateCallbacks);
3443107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            } catch (RemoteException e) {
3453107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                Log.e(TAG, "Failed to unregister VR mode state listener: ", e);
3463107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3473107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
3483107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
349c6da82fb9cfd7bfd01c658bcbb19b1a2cbe8dc25Jorim Jaggi        mBackgroundHandler.post(mStopListeningRunnable);
3505a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = false;
3510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
3520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
3535fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    @Override
3543b0f892c8f38d610679dc9f0aed123e8611a387fMuyuan Li    public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
3553b0f892c8f38d610679dc9f0aed123e8611a387fMuyuan Li            int value, boolean stopTracking) {
356daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        updateIcon(mAutomatic);
357b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos        if (mExternalChange) return;
358b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos
3593107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mIsVrModeEnabled) {
3603107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            final int val = value + mMinimumBacklightForVr;
3613107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            if (stopTracking) {
3623107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS_FOR_VR, val);
3633107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3643107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            setBrightness(val);
3653107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            if (!tracking) {
3663107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                AsyncTask.execute(new Runnable() {
3673107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        public void run() {
3683107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                            Settings.System.putIntForUser(mContext.getContentResolver(),
3693107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                                    Settings.System.SCREEN_BRIGHTNESS_FOR_VR, val,
3703107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                                    UserHandle.USER_CURRENT);
3713107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                        }
3723107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon                    });
3733107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            }
3743107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        } else if (!mAutomatic) {
3750087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final int val = value + mMinimumBacklight;
37697b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk            if (stopTracking) {
377f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS, val);
37897b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk            }
3790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            setBrightness(val);
3800087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            if (!tracking) {
3810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                AsyncTask.execute(new Runnable() {
3820087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                        public void run() {
3830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                            Settings.System.putIntForUser(mContext.getContentResolver(),
3840087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                                    Settings.System.SCREEN_BRIGHTNESS, val,
3850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                                    UserHandle.USER_CURRENT);
3860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                        }
3870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    });
3880087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
389daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        } else {
390daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            final float adj = value / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1;
39197b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk            if (stopTracking) {
392f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS_AUTO, value);
39397b87a99297144e9c3e4a57a444fe1402dee7e4fJason Monk            }
3946e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos            setBrightnessAdj(adj);
395daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            if (!tracking) {
396daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                AsyncTask.execute(new Runnable() {
397daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    public void run() {
398daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                        Settings.System.putFloatForUser(mContext.getContentResolver(),
399daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj,
400daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                                UserHandle.USER_CURRENT);
401daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    }
402daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                });
403daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            }
4040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
4050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
4070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cb.onBrightnessLevelChanged();
4080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
4090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setMode(int mode) {
4120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        Settings.System.putIntForUser(mContext.getContentResolver(),
4130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
4140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                mUserTracker.getCurrentUserId());
4150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setBrightness(int brightness) {
4180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        try {
4190087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
4200087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        } catch (RemoteException ex) {
4210087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
4220087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
4246e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos    private void setBrightnessAdj(float adj) {
425daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        try {
426daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj);
427daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        } catch (RemoteException ex) {
428daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        }
429daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    }
430daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
4310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void updateIcon(boolean automatic) {
4320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        if (mIcon != null) {
4336d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock            mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ?
4340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
4350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
4360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
4370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
4383107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon
4393107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    private void updateVrMode(boolean isEnabled) {
4403107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        if (mIsVrModeEnabled != isEnabled) {
4413107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mIsVrModeEnabled = isEnabled;
4423107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon            mBackgroundHandler.post(mUpdateSliderRunnable);
4433107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon        }
4443107d29c8f6f40b98533978a7e19e5c328f73d24Santos Cordon    }
4450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright}
446