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