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