package com.android.systemui.statusbar.powerwidget;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.IPowerManager;
import android.os.Power;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import com.android.systemui.R;
public class BrightnessButton extends PowerButton {
private static final String TAG = "BrightnessButton";
/**
* Minimum and maximum brightnesses. Don't go to 0 since that makes the
* display unusable
*/
private static final int MIN_BACKLIGHT = Power.BRIGHTNESS_DIM + 10;
private static final int MAX_BACKLIGHT = Power.BRIGHTNESS_ON;
// Auto-backlight level
private static final int AUTO_BACKLIGHT = -1;
// Mid-range brightness values + thresholds
private static final int LOW_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.25f);
private static final int MID_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.5f);
private static final int HIGH_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.75f);
// Defaults for now. MIN_BACKLIGHT will be replaced later
private static final int[] BACKLIGHTS = new int[] {
AUTO_BACKLIGHT, MIN_BACKLIGHT, LOW_BACKLIGHT, MID_BACKLIGHT, HIGH_BACKLIGHT,
MAX_BACKLIGHT
};
private static final Uri BRIGHTNESS_URI = Settings.System
.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
private static final Uri BRIGHTNESS_MODE_URI = Settings.System
.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
static {
OBSERVED_URIS.add(BRIGHTNESS_URI);
OBSERVED_URIS.add(BRIGHTNESS_MODE_URI);
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.LIGHT_SENSOR_CUSTOM));
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.LIGHT_SCREEN_DIM));
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_BRIGHTNESS_MODE));
}
private boolean mAutoBrightnessSupported = false;
private boolean mAutoBrightness = false;
private int mCurrentBrightness;
private int mCurrentBacklightIndex = 0;
private int[] mBacklightValues = new int[] {
0, 1, 2, 3, 4, 5
};
public BrightnessButton() {
mType = BUTTON_BRIGHTNESS;
}
@Override
protected void setupButton(View view) {
super.setupButton(view);
if (mView != null) {
Context context = mView.getContext();
mAutoBrightnessSupported = context.getResources().getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available);
updateSettings();
}
}
@Override
protected void updateState() {
if (mAutoBrightness) {
mIcon = R.drawable.stat_brightness_auto;
mState = STATE_ENABLED;
} else if (mCurrentBrightness <= LOW_BACKLIGHT) {
mIcon = R.drawable.stat_brightness_off;
mState = STATE_DISABLED;
} else if (mCurrentBrightness <= MID_BACKLIGHT) {
mIcon = R.drawable.stat_brightness_mid;
mState = STATE_INTERMEDIATE;
} else {
mIcon = R.drawable.stat_brightness_on;
mState = STATE_ENABLED;
}
}
@Override
protected void toggleState() {
try {
IPowerManager power = IPowerManager.Stub
.asInterface(ServiceManager.getService("power"));
if (power != null) {
ContentResolver resolver = mView.getContext().getContentResolver();
mCurrentBacklightIndex++;
if (mCurrentBacklightIndex > mBacklightValues.length - 1) {
mCurrentBacklightIndex = 0;
}
int backlightIndex = mBacklightValues[mCurrentBacklightIndex];
int brightness = BACKLIGHTS[backlightIndex];
if (brightness == AUTO_BACKLIGHT) {
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
} else {
if (mAutoBrightnessSupported) {
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}
power.setBacklightBrightness(brightness);
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
}
}
} catch (RemoteException e) {
Log.e(TAG, "toggleState()", e);
}
}
@Override
protected boolean handleLongClick() {
Intent intent = new Intent("android.settings.DISPLAY_SETTINGS");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mView.getContext().startActivity(intent);
return true;
}
@Override
protected List<Uri> getObservedUris() {
return OBSERVED_URIS;
}
@Override
protected void onChangeUri(Uri uri) {
ContentResolver resolver = mView.getContext().getContentResolver();
if (BRIGHTNESS_URI.equals(uri)) {
mCurrentBrightness = Settings.System.getInt(resolver,
Settings.System.SCREEN_BRIGHTNESS, 0);
} else if (BRIGHTNESS_MODE_URI.equals(uri)) {
mAutoBrightness = (Settings.System.getInt(resolver,
Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
} else {
updateSettings();
}
}
private void updateSettings() {
ContentResolver resolver = mView.getContext().getContentResolver();
boolean lightSensorCustom = (Settings.System.getInt(resolver,
Settings.System.LIGHT_SENSOR_CUSTOM, 0) != 0);
if (lightSensorCustom) {
BACKLIGHTS[1] = Settings.System.getInt(resolver, Settings.System.LIGHT_SCREEN_DIM,
MIN_BACKLIGHT);
} else {
BACKLIGHTS[1] = MIN_BACKLIGHT;
}
String[] modes = MultiSelectListPreference.parseStoredValue(Settings.System.getString(
resolver, Settings.System.EXPANDED_BRIGHTNESS_MODE));
if (modes != null) {
mBacklightValues = new int[modes.length];
for (int i = 0; i < modes.length; i++) {
mBacklightValues[i] = Integer.valueOf(modes[i]);
}
} else {
// If no modes configured default to just MAX_BACKLIGHT
mBacklightValues = new int[] {
5
};
}
mAutoBrightness = (Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
if (mAutoBrightness) {
mCurrentBrightness = AUTO_BACKLIGHT;
} else {
mCurrentBrightness = Settings.System.getInt(resolver,
Settings.System.SCREEN_BRIGHTNESS, -1);
for (int i = 0; i < BACKLIGHTS.length; i++) {
if (mCurrentBrightness == BACKLIGHTS[i]) {
mCurrentBacklightIndex = i;
break;
}
}
}
updateState();
}
}