11e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato/* 21e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Copyright (C) 2010 The Android Open Source Project 31e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * 41e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 51e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * you may not use this file except in compliance with the License. 61e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * You may obtain a copy of the License at 71e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * 81e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 91e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * 101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Unless required by applicable law or agreed to in writing, software 111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * See the License for the specific language governing permissions and 141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * limitations under the License. 151e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato */ 161e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 171e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopackage com.android.systemui.statusbar.policy; 181e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 191e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.ContentResolver; 201e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.Context; 21c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onoratoimport android.os.AsyncTask; 221e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.IPowerManager; 239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.PowerManager; 241e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.RemoteException; 251e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.ServiceManager; 261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.provider.Settings; 271e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.provider.Settings.SettingNotFoundException; 281e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.util.Slog; 291e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.view.IWindowManager; 301e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.CompoundButton; 31f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlockimport android.widget.ImageView; 321e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 335f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chungimport com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; 345f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 355f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chungimport java.util.ArrayList; 365f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopublic class BrightnessController implements ToggleSlider.Listener { 381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato private static final String TAG = "StatusBar.BrightnessController"; 391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final int mMinimumBacklight; 419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final int mMaximumBacklight; 421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 4348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock private final Context mContext; 44f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock private final ImageView mIcon; 4548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock private final ToggleSlider mControl; 4648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock private final boolean mAutomaticAvailable; 4748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock private final IPowerManager mPower; 4848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock private final CurrentUserTracker mUserTracker; 491e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 505f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks = 515f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung new ArrayList<BrightnessStateChangeCallback>(); 525f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 535f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung public interface BrightnessStateChangeCallback { 545f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung public void onBrightnessLevelChanged(); 555f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung } 565f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 57f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock public BrightnessController(Context context, ImageView icon, ToggleSlider control) { 581e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato mContext = context; 59f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock mIcon = icon; 601e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato mControl = control; 6148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mUserTracker = new CurrentUserTracker(mContext); 621e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mMinimumBacklight = pm.getMinimumScreenBrightnessSetting(); 659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mMaximumBacklight = pm.getMaximumScreenBrightnessSetting(); 669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 6748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mAutomaticAvailable = context.getResources().getBoolean( 681e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato com.android.internal.R.bool.config_automatic_brightness_available); 691e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); 701e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 7148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock control.setOnChangedListener(this); 7248f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock } 7348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock 7448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock public void addStateChangedCallback(BrightnessStateChangeCallback cb) { 7548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mChangeCallbacks.add(cb); 7648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock } 7748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock 7848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock @Override 7948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock public void onInit(ToggleSlider control) { 8048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock if (mAutomaticAvailable) { 811e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato int automatic; 821e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato try { 8348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock automatic = Settings.System.getIntForUser(mContext.getContentResolver(), 8448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.SCREEN_BRIGHTNESS_MODE, 8548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mUserTracker.getCurrentUserId()); 861e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } catch (SettingNotFoundException snfe) { 871e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato automatic = 0; 881e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 891e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato control.setChecked(automatic != 0); 90f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock updateIcon(automatic != 0); 911e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } else { 921e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato control.setChecked(false); 93f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock updateIcon(false /*automatic*/); 941e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato //control.hideToggle(); 951e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 961e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 971e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato int value; 981e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato try { 9948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock value = Settings.System.getIntForUser(mContext.getContentResolver(), 10048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.SCREEN_BRIGHTNESS, 10148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mUserTracker.getCurrentUserId()); 1021e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } catch (SettingNotFoundException ex) { 1039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown value = mMaximumBacklight; 1041e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 1051e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 1069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown control.setMax(mMaximumBacklight - mMinimumBacklight); 1079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown control.setValue(value - mMinimumBacklight); 1085f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung } 1095f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 1101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { 1111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC 1121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); 113f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock updateIcon(automatic); 1141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato if (!automatic) { 1159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown final int val = value + mMinimumBacklight; 116c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato setBrightness(val); 117772f5600ef720945b98054246982fd3b711830a9Joe Onorato if (!tracking) { 118c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato AsyncTask.execute(new Runnable() { 119c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato public void run() { 12048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.putIntForUser(mContext.getContentResolver(), 12148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.SCREEN_BRIGHTNESS, val, 12248f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mUserTracker.getCurrentUserId()); 123c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato } 124c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato }); 125772f5600ef720945b98054246982fd3b711830a9Joe Onorato } 1261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 1275f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung 1285f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung for (BrightnessStateChangeCallback cb : mChangeCallbacks) { 1295f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung cb.onBrightnessLevelChanged(); 1305f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung } 1311e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 1321e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 1331e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato private void setMode(int mode) { 13448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.putIntForUser(mContext.getContentResolver(), 13548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock Settings.System.SCREEN_BRIGHTNESS_MODE, mode, 13648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock mUserTracker.getCurrentUserId()); 1371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 1381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato 1391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato private void setBrightness(int brightness) { 1401e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato try { 1419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mPower.setTemporaryScreenBrightnessSettingOverride(brightness); 1421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } catch (RemoteException ex) { 1431e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 1441e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato } 145f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock 146f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock private void updateIcon(boolean automatic) { 147f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock if (mIcon != null) { 148f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock mIcon.setImageResource(automatic ? 149f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock com.android.systemui.R.drawable.ic_qs_brightness_auto_on : 150f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock com.android.systemui.R.drawable.ic_qs_brightness_auto_off); 151f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock } 152f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock } 1531e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato} 154