package com.android.settings.widget.buttons;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.IPowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.widget.SettingsAppWidgetProvider;
import com.android.settings.widget.WidgetSettings;
public class BrightnessButton extends WidgetButton {
/**
* Minimum and maximum brightnesses. Don't go to 0 since that makes the
* display unusable
*/
private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
private static int DEFAULT_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.4f);
private static int LOW_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.25f);
private static int MID_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.5f);
private static int HIGH_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.75f);
private static final int AUTO_BACKLIGHT = -1;
private static final int MODE_AUTO_MIN_DEF_MAX=0;
private static final int MODE_AUTO_MIN_LOW_MID_HIGH_MAX=1;
private static final int MODE_AUTO_LOW_MAX=2;
private static final int MODE_MIN_MAX=3;
private static final int DEFAULT_SETTTING = 0;
private static Boolean supportsAutomaticMode=null;
static BrightnessButton ownButton=null;
private static int currentMode;
/*
*
Auto_Min_Low_Max
Auto_Min . Max
Auto. Min . Low High. Max
Auto_Low / High
Auto_Low / High / Max
Min / Max
Min Low Max
Min Low High Max
Low High
Low High Max
*/
public static int getMinBacklight(Context context) {
if (Settings.System.getInt(context.getContentResolver(),Settings.System.LIGHT_SENSOR_CUSTOM, 0) != 0) {
return Settings.System.getInt(context.getContentResolver(),Settings.System.LIGHT_SCREEN_DIM, MINIMUM_BACKLIGHT);
} else {
return MINIMUM_BACKLIGHT;
}
}
private static boolean isAutomaticModeSupported(Context context) {
if (supportsAutomaticMode==null) {
if (context
.getResources()
.getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available)) {
supportsAutomaticMode=true;
} else {
supportsAutomaticMode=false;
}
}
return supportsAutomaticMode;
}
/**
* Gets state of brightness mode.
*
* @param context
* @return true if auto brightness is on.
*/
private static boolean isBrightnessSetToAutomatic(Context context) {
try {
IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager
.getService("power"));
if (power != null) {
int brightnessMode = Settings.System.getInt(context
.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE);
return brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
}
} catch (Exception e) {
Log.d(SettingsAppWidgetProvider.TAG, "getBrightnessMode: " + e);
}
return false;
}
private int getNextBrightnessValue(Context context) {
int brightness = Settings.System.getInt(context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS,0);
/*
private static final int MODE_AUTO_MIN_DEF_MAX=0;
private static final int MODE_AUTO_MIN_LOW_MID_HIGH_MAX=1;
private static final int MODE_AUTO_LOW_MAX=2;
*
*/
if (isAutomaticModeSupported(context) && isBrightnessSetToAutomatic(context)) {
if (currentMode==MODE_AUTO_LOW_MAX) {
return LOW_BACKLIGHT;
} else {
return getMinBacklight(context);
}
} else if (brightness < LOW_BACKLIGHT) {
if (currentMode==MODE_AUTO_LOW_MAX) {
return LOW_BACKLIGHT;
} else if (currentMode==MODE_MIN_MAX) {
return MAXIMUM_BACKLIGHT;
} else {
return DEFAULT_BACKLIGHT;
}
} else if (brightness < DEFAULT_BACKLIGHT) {
if (currentMode==MODE_AUTO_MIN_DEF_MAX) {
return DEFAULT_BACKLIGHT;
} else if (currentMode==MODE_AUTO_LOW_MAX || currentMode==MODE_MIN_MAX) {
return MAXIMUM_BACKLIGHT;
} else {
return MID_BACKLIGHT;
}
} else if (brightness < MID_BACKLIGHT) {
if (currentMode==MODE_AUTO_MIN_LOW_MID_HIGH_MAX) {
return MID_BACKLIGHT;
} else {
return MAXIMUM_BACKLIGHT;
}
} else if (brightness < HIGH_BACKLIGHT) {
if (currentMode==MODE_AUTO_MIN_LOW_MID_HIGH_MAX) {
return HIGH_BACKLIGHT;
} else {
return MAXIMUM_BACKLIGHT;
}
} else if (brightness < MAXIMUM_BACKLIGHT) {
return MAXIMUM_BACKLIGHT;
} else if (isAutomaticModeSupported(context) && currentMode!=MODE_MIN_MAX) {
return AUTO_BACKLIGHT;
} else if(currentMode == MODE_AUTO_LOW_MAX){
return LOW_BACKLIGHT;
} else {
return getMinBacklight(context);
}
}
/**
* Increases or decreases the brightness.
*
* @param context
*/
public void toggleState(Context context) {
try {
IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager
.getService("power"));
if (power != null) {
int brightness = getNextBrightnessValue(context);
ContentResolver contentResolver = context.getContentResolver();
if (brightness==AUTO_BACKLIGHT) {
Settings.System.putInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
} else {
if (isAutomaticModeSupported(context)) {
Settings.System.putInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}
power.setBacklightBrightness(brightness);
Settings.System.putInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS, brightness);
}
}
} catch (RemoteException e) {
Log.d(SettingsAppWidgetProvider.TAG, "toggleBrightness: " + e);
}
}
public static BrightnessButton getInstance() {
if (ownButton==null)
ownButton = new BrightnessButton();
return ownButton;
}
@Override
void initButton() {
buttonID=WidgetButton.BUTTON_BRIGHTNESS;
preferenceName=WidgetSettings.TOGGLE_BRIGHTNESS;
}
@Override
public void updateState(Context context,
SharedPreferences globalPreferences, int[] appWidgetIds) {
currentMode=globalPreferences.getInt(WidgetSettings.BRIGHTNESS_SPINNER, DEFAULT_SETTTING);
if (isBrightnessSetToAutomatic(context)) {
currentIcon=R.drawable.ic_appwidget_settings_brightness_auto;
currentState=SettingsAppWidgetProvider.STATE_ENABLED;
} else if (getBrightnessState(context)==SettingsAppWidgetProvider.STATE_ENABLED) {
currentIcon=R.drawable.ic_appwidget_settings_brightness_on;
currentState=SettingsAppWidgetProvider.STATE_ENABLED;
} else if (getBrightnessState(context)==SettingsAppWidgetProvider.STATE_TURNING_ON) {
currentIcon=R.drawable.ic_appwidget_settings_brightness_on;
currentState=SettingsAppWidgetProvider.STATE_INTERMEDIATE;
} else if (getBrightnessState(context)==SettingsAppWidgetProvider.STATE_TURNING_OFF) {
currentIcon=R.drawable.ic_appwidget_settings_brightness_off;
currentState=SettingsAppWidgetProvider.STATE_INTERMEDIATE;
} else {
currentIcon=R.drawable.ic_appwidget_settings_brightness_off;
currentState=SettingsAppWidgetProvider.STATE_DISABLED;
}
}
private int getBrightnessState(Context context) {
int brightness = Settings.System.getInt(context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS,0);
if (brightness < LOW_BACKLIGHT) {
return SettingsAppWidgetProvider.STATE_DISABLED;
} else if (brightness < DEFAULT_BACKLIGHT) {
return SettingsAppWidgetProvider.STATE_DISABLED;
} else if (brightness < MID_BACKLIGHT) {
if (currentMode==MODE_AUTO_MIN_LOW_MID_HIGH_MAX) {
return SettingsAppWidgetProvider.STATE_DISABLED;
} else {
return SettingsAppWidgetProvider.STATE_TURNING_OFF;
}
} else if (brightness < HIGH_BACKLIGHT) {
if (currentMode==MODE_AUTO_MIN_LOW_MID_HIGH_MAX) {
return SettingsAppWidgetProvider.STATE_TURNING_OFF;
} else {
return SettingsAppWidgetProvider.STATE_TURNING_ON;
}
} else if (brightness < MAXIMUM_BACKLIGHT) {
return SettingsAppWidgetProvider.STATE_TURNING_ON;
} else {
return SettingsAppWidgetProvider.STATE_ENABLED;
}
}
}