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; 260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.PowerManager; 270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.RemoteException; 280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.ServiceManager; 290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.UserHandle; 300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.provider.Settings; 310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.widget.ImageView; 320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport java.util.ArrayList; 340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpublic class BrightnessController implements ToggleSlider.Listener { 360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private static final String TAG = "StatusBar.BrightnessController"; 376d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock private static final boolean SHOW_AUTOMATIC_ICON = false; 380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 39daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos /** 40daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos * {@link android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ} uses the range [-1, 1]. 41daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos * Using this factor, it is converted to [0, BRIGHTNESS_ADJ_RESOLUTION] for the SeekBar. 42daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos */ 43daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos private static final float BRIGHTNESS_ADJ_RESOLUTION = 100; 44daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos 450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final int mMinimumBacklight; 460087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final int mMaximumBacklight; 470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final Context mContext; 490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final ImageView mIcon; 500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final ToggleSlider mControl; 510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final boolean mAutomaticAvailable; 520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final IPowerManager mPower; 530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final CurrentUserTracker mUserTracker; 540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final Handler mHandler; 550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final BrightnessObserver mBrightnessObserver; 560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks = 580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright new ArrayList<BrightnessStateChangeCallback>(); 590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 60daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos private boolean mAutomatic; 613f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi private boolean mListening; 62b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos private boolean mExternalChange; 63daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos 640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public interface BrightnessStateChangeCallback { 650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onBrightnessLevelChanged(); 660087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 680087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright /** ContentObserver to watch brightness **/ 690087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private class BrightnessObserver extends ContentObserver { 700087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final Uri BRIGHTNESS_MODE_URI = 720087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); 730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private final Uri BRIGHTNESS_URI = 740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); 75daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos private final Uri BRIGHTNESS_ADJ_URI = 76daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ); 770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public BrightnessObserver(Handler handler) { 790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright super(handler); 800087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 820087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright @Override 830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onChange(boolean selfChange) { 840087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright onChange(selfChange, null); 850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright @Override 880087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onChange(boolean selfChange, Uri uri) { 890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright if (selfChange) return; 90b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos try { 91b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos mExternalChange = true; 92b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos if (BRIGHTNESS_MODE_URI.equals(uri)) { 93b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateMode(); 94b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateSlider(); 95b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) { 96b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateSlider(); 97b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) { 98b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateSlider(); 99b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } else { 100b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateMode(); 101b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos updateSlider(); 102b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } 103b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos for (BrightnessStateChangeCallback cb : mChangeCallbacks) { 104b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos cb.onBrightnessLevelChanged(); 105b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } 106b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos } finally { 107b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos mExternalChange = false; 1080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void startObserving() { 1120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright final ContentResolver cr = mContext.getContentResolver(); 1130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright cr.unregisterContentObserver(this); 1140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright cr.registerContentObserver( 1150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright BRIGHTNESS_MODE_URI, 1160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright false, this, UserHandle.USER_ALL); 1170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright cr.registerContentObserver( 1180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright BRIGHTNESS_URI, 1190087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright false, this, UserHandle.USER_ALL); 120daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos cr.registerContentObserver( 121daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos BRIGHTNESS_ADJ_URI, 122daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos false, this, UserHandle.USER_ALL); 1230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1250087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void stopObserving() { 1260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright final ContentResolver cr = mContext.getContentResolver(); 1270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright cr.unregisterContentObserver(this); 1280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public BrightnessController(Context context, ImageView icon, ToggleSlider control) { 1330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mContext = context; 1340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mIcon = icon; 1350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mControl = control; 1360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mHandler = new Handler(); 1370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mUserTracker = new CurrentUserTracker(mContext) { 1380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright @Override 1390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onUserSwitched(int newUserId) { 1400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright updateMode(); 1410087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright updateSlider(); 1420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright }; 1440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mBrightnessObserver = new BrightnessObserver(mHandler); 1450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1460087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 1470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mMinimumBacklight = pm.getMinimumScreenBrightnessSetting(); 1480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mMaximumBacklight = pm.getMaximumScreenBrightnessSetting(); 1490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mAutomaticAvailable = context.getResources().getBoolean( 1510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright com.android.internal.R.bool.config_automatic_brightness_available); 1520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); 1530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void addStateChangedCallback(BrightnessStateChangeCallback cb) { 1560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mChangeCallbacks.add(cb); 1570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) { 1600087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright return mChangeCallbacks.remove(cb); 1610087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1620087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1630087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright @Override 1640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onInit(ToggleSlider control) { 1650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright // Do nothing 1660087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 168f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi public void registerCallbacks() { 1693f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi if (mListening) { 1703f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi return; 1713f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi } 1725a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette 173f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi mBrightnessObserver.startObserving(); 174f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi mUserTracker.startTracking(); 175f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi 1765a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette // Update the slider and mode before attaching the listener so we don't 1775a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette // receive the onChanged notifications for the initial values. 178f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi updateMode(); 179f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi updateSlider(); 180f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi 181f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi mControl.setOnChangedListener(this); 1825a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette mListening = true; 183f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi } 184f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi 1850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright /** Unregister all call backs, both to and from the controller */ 1860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void unregisterCallbacks() { 1873f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi if (!mListening) { 1883f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi return; 1893f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi } 1905a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette 1910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mBrightnessObserver.stopObserving(); 1920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mUserTracker.stopTracking(); 193f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi mControl.setOnChangedListener(null); 1945a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette mListening = false; 1950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 1960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 1975fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos @Override 1980087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { 199daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos updateIcon(mAutomatic); 200b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos if (mExternalChange) return; 201b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos 202daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos if (!mAutomatic) { 2030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright final int val = value + mMinimumBacklight; 2040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright setBrightness(val); 2050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright if (!tracking) { 2060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright AsyncTask.execute(new Runnable() { 2070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright public void run() { 2080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.putIntForUser(mContext.getContentResolver(), 2090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.SCREEN_BRIGHTNESS, val, 2100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright UserHandle.USER_CURRENT); 2110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright }); 2130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 214daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } else { 215daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos final float adj = value / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1; 2166e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos setBrightnessAdj(adj); 217daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos if (!tracking) { 218daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos AsyncTask.execute(new Runnable() { 219daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos public void run() { 220daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.putFloatForUser(mContext.getContentResolver(), 221daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj, 222daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos UserHandle.USER_CURRENT); 223daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } 224daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos }); 225daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } 2260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright for (BrightnessStateChangeCallback cb : mChangeCallbacks) { 2290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright cb.onBrightnessLevelChanged(); 2300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private void setMode(int mode) { 2340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.putIntForUser(mContext.getContentResolver(), 2350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright Settings.System.SCREEN_BRIGHTNESS_MODE, mode, 2360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mUserTracker.getCurrentUserId()); 2370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private void setBrightness(int brightness) { 2400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright try { 2410087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mPower.setTemporaryScreenBrightnessSettingOverride(brightness); 2420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } catch (RemoteException ex) { 2430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2466e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos private void setBrightnessAdj(float adj) { 247daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos try { 248daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj); 249daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } catch (RemoteException ex) { 250daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } 251daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } 252daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos 2530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private void updateIcon(boolean automatic) { 2540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright if (mIcon != null) { 2556d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ? 2560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright com.android.systemui.R.drawable.ic_qs_brightness_auto_on : 2570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright com.android.systemui.R.drawable.ic_qs_brightness_auto_off); 2580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2600087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2610087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright /** Fetch the brightness mode from the system settings and update the icon */ 2620087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private void updateMode() { 2630087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright if (mAutomaticAvailable) { 2640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright int automatic; 265daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos automatic = Settings.System.getIntForUser(mContext.getContentResolver(), 266daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.SCREEN_BRIGHTNESS_MODE, 267daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, 268daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos UserHandle.USER_CURRENT); 2696e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL; 270daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos updateIcon(mAutomatic); 2710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } else { 2720087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright mControl.setChecked(false); 2730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright updateIcon(false /*automatic*/); 2740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2750087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2760087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright /** Fetch the brightness from the system settings and update the slider */ 2780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright private void updateSlider() { 279daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos if (mAutomatic) { 280daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos float value = Settings.System.getFloatForUser(mContext.getContentResolver(), 281daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, 282daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos UserHandle.USER_CURRENT); 283daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos mControl.setMax((int) BRIGHTNESS_ADJ_RESOLUTION); 284daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos mControl.setValue((int) ((value + 1) * BRIGHTNESS_ADJ_RESOLUTION / 2f)); 285daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos } else { 286daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos int value; 2870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright value = Settings.System.getIntForUser(mContext.getContentResolver(), 288daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos Settings.System.SCREEN_BRIGHTNESS, mMaximumBacklight, 2890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright UserHandle.USER_CURRENT); 290daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos mControl.setMax(mMaximumBacklight - mMinimumBacklight); 291daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos mControl.setValue(value - mMinimumBacklight); 2920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2930087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright } 2940087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright 2950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright} 296