diff options
author | Danny Baumann <dannybaumann@web.de> | 2013-01-22 15:14:50 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2013-02-13 13:41:21 -0800 |
commit | 112b03eeb03ea3104c187063ce6c3a273d40d493 (patch) | |
tree | bd57dc69ae2016d1454792a9b56073c352ea2ca8 /src/com | |
parent | f699b2e215811dd9f401691ffefd1917e019fa63 (diff) | |
download | packages_apps_settings-112b03eeb03ea3104c187063ce6c3a273d40d493.zip packages_apps_settings-112b03eeb03ea3104c187063ce6c3a273d40d493.tar.gz packages_apps_settings-112b03eeb03ea3104c187063ce6c3a273d40d493.tar.bz2 |
Add back backlight curve adjustment.
Patch set 1-8: Initial commits
Patch set 9 : Shortened strings to better fit Design Guidelines
Change-Id: I1eb370f8911d1c92ef06e553cc1c1be81e83cb95
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/settings/BrightnessPreference.java | 43 | ||||
-rw-r--r-- | src/com/android/settings/cyanogenmod/AutoBrightnessCustomizeDialog.java | 548 |
2 files changed, 591 insertions, 0 deletions
diff --git a/src/com/android/settings/BrightnessPreference.java b/src/com/android/settings/BrightnessPreference.java index e4c6e90..6c2768d 100644 --- a/src/com/android/settings/BrightnessPreference.java +++ b/src/com/android/settings/BrightnessPreference.java @@ -16,8 +16,11 @@ package com.android.settings; +import android.app.AlertDialog; +import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; +import android.content.DialogInterface; import android.database.ContentObserver; import android.os.Bundle; import android.os.Handler; @@ -32,10 +35,13 @@ import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.util.AttributeSet; import android.view.View; +import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.SeekBar; +import com.android.settings.cyanogenmod.AutoBrightnessCustomizeDialog; + public class BrightnessPreference extends SeekBarDialogPreference implements SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener { // If true, enables the use of the screen auto-brightness adjustment setting. @@ -90,9 +96,37 @@ public class BrightnessPreference extends SeekBarDialogPreference implements } @Override + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + if (mAutomaticAvailable) { + builder.setNeutralButton(R.string.auto_brightness_adjust_button, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + } + } + + @Override protected void showDialog(Bundle state) { super.showDialog(state); + if (mAutomaticAvailable) { + // can't use onPrepareDialogBuilder for this as we want the dialog + // to be kept open on click + AlertDialog d = (AlertDialog) getDialog(); + Button adjustButton = d.getButton(DialogInterface.BUTTON_NEUTRAL); + adjustButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Dialog d = new AutoBrightnessCustomizeDialog(getContext()); + d.show(); + } + }); + } + + updateAutoBrightnessCustomizeButton(); + getContext().getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true, mBrightnessObserver); @@ -145,6 +179,15 @@ public class BrightnessPreference extends SeekBarDialogPreference implements mSeekBar.setProgress(getBrightness()); mSeekBar.setEnabled(!mAutomaticMode || USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT); setBrightness(mSeekBar.getProgress(), false); + updateAutoBrightnessCustomizeButton(); + } + + private void updateAutoBrightnessCustomizeButton() { + AlertDialog d = (AlertDialog) getDialog(); + if (d != null && mAutomaticAvailable) { + d.getButton(DialogInterface.BUTTON_NEUTRAL).setEnabled( + mCheckBox.isChecked()); + } } private int getBrightness() { diff --git a/src/com/android/settings/cyanogenmod/AutoBrightnessCustomizeDialog.java b/src/com/android/settings/cyanogenmod/AutoBrightnessCustomizeDialog.java new file mode 100644 index 0000000..f97ecbf --- /dev/null +++ b/src/com/android/settings/cyanogenmod/AutoBrightnessCustomizeDialog.java @@ -0,0 +1,548 @@ +package com.android.settings.cyanogenmod; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Bundle; +import android.os.PowerManager; +import android.provider.Settings; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.SeekBar; +import android.widget.TextView; + +import java.util.ArrayList; + +import com.android.settings.R; + +public class AutoBrightnessCustomizeDialog extends AlertDialog + implements DialogInterface.OnClickListener { + private static final String TAG = "AutoBrightnessCustomizeDialog"; + + private TextView mSensorLevel; + private TextView mBrightnessLevel; + private ListView mConfigList; + + private SensorManager mSensorManager; + private Sensor mLightSensor; + + private static class SettingRow { + int luxFrom; + int luxTo; + int backlight; + public SettingRow(int luxFrom, int luxTo, int backlight) { + this.luxFrom = luxFrom; + this.luxTo = luxTo; + this.backlight = backlight; + } + }; + + private SettingRowAdapter mAdapter; + private boolean mIsDefault; + + private SensorEventListener mLightSensorListener = new SensorEventListener() { + @Override + public void onSensorChanged(SensorEvent event) { + final int lux = Math.round(event.values[0]); + mSensorLevel.setText(getContext().getString(R.string.light_sensor_current_value, lux)); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + }; + + public AutoBrightnessCustomizeDialog(Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + final Context context = getContext(); + View view = getLayoutInflater().inflate(R.layout.dialog_auto_brightness_levels, null); + setView(view); + setTitle(R.string.auto_brightness_dialog_title); + setCancelable(true); + + setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.ok), this); + setButton(DialogInterface.BUTTON_NEUTRAL, + context.getString(R.string.auto_brightness_reset_button), this); + setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), this); + + super.onCreate(savedInstanceState); + + mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + + mSensorLevel = (TextView) view.findViewById(R.id.light_sensor_value); + mBrightnessLevel = (TextView) view.findViewById(R.id.current_brightness); + + mConfigList = (ListView) view.findViewById(android.R.id.list); + mAdapter = new SettingRowAdapter(context, new ArrayList<SettingRow>()); + mConfigList.setAdapter(mAdapter); + registerForContextMenu(mConfigList); + } + + @Override + protected void onStart() { + updateSettings(false); + + super.onStart(); + + mSensorManager.registerListener(mLightSensorListener, + mLightSensor, SensorManager.SENSOR_DELAY_NORMAL); + + Button neutralButton = getButton(DialogInterface.BUTTON_NEUTRAL); + neutralButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showResetConfirmation(); + } + }); + } + + @Override + protected void onStop() { + super.onStop(); + mSensorManager.unregisterListener(mLightSensorListener, mLightSensor); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; + + menu.setHeaderTitle(R.string.auto_brightness_level_options); + + menu.add(Menu.NONE, Menu.FIRST, 0, R.string.auto_brightness_menu_edit_lux) + .setEnabled(!mAdapter.isLastItem(info.position)); + menu.add(Menu.NONE, Menu.FIRST + 1, 1, R.string.auto_brightness_menu_split) + .setEnabled(mAdapter.canSplitRow(info.position)); + menu.add(Menu.NONE, Menu.FIRST + 2, 2, R.string.auto_brightness_menu_remove) + .setEnabled(mAdapter.getCount() > 1); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + AdapterView.AdapterContextMenuInfo info = + (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); + int position = info.position; + + switch (item.getItemId() - Menu.FIRST) { + case 0: + showLuxSetup(position); + return true; + case 1: + showSplitDialog(position); + break; + case 2: + mAdapter.removeRow(position); + return true; + } + + return false; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + putSettings(); + } else if (which == DialogInterface.BUTTON_NEGATIVE) { + cancel(); + } + } + + private void updateSettings(boolean forceDefault) { + int[] lux = null, values = null; + + if (!forceDefault) { + lux = fetchItems(Settings.System.AUTO_BRIGHTNESS_LUX); + values = fetchItems(Settings.System.AUTO_BRIGHTNESS_BACKLIGHT); + } + + if (lux != null && values != null && lux.length != values.length - 1) { + Log.e(TAG, "Found invalid backlight settings, ignoring"); + values = null; + } + + if (lux == null || values == null) { + final Resources res = getContext().getResources(); + lux = res.getIntArray(com.android.internal.R.array.config_autoBrightnessLevels); + values = res.getIntArray(com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); + mIsDefault = true; + } else { + mIsDefault = false; + } + + mAdapter.initFromSettings(lux, values); + } + + private void showLuxSetup(final int position) { + final SettingRow row = mAdapter.getItem(position); + final View v = getLayoutInflater().inflate(R.layout.auto_brightness_lux_config, null); + final EditText startLux = (EditText) v.findViewById(R.id.start_lux); + final EditText endLux = (EditText) v.findViewById(R.id.end_lux); + + final AlertDialog d = new AlertDialog.Builder(getContext()) + .setTitle(R.string.auto_brightness_lux_dialog_title) + .setCancelable(true) + .setView(v) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + try { + int newLux = Integer.valueOf(endLux.getText().toString()); + mAdapter.setLuxToForRow(position, newLux); + } catch (NumberFormatException e) { + //ignored + } + } + }) + .setNegativeButton(R.string.cancel, null) + .create(); + + startLux.setText(String.valueOf(row.luxFrom)); + endLux.setText(String.valueOf(row.luxTo)); + d.show(); + } + + private void showSplitDialog(final int position) { + final SettingRow row = mAdapter.getItem(position); + final View v = getLayoutInflater().inflate(R.layout.auto_brightness_split_dialog, null); + final TextView label = (TextView) v.findViewById(R.id.split_label); + final EditText value = (EditText) v.findViewById(R.id.split_position); + + final AlertDialog d = new AlertDialog.Builder(getContext()) + .setTitle(R.string.auto_brightness_lux_dialog_title) + .setCancelable(true) + .setView(v) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + int splitLux = Integer.valueOf(value.getText().toString()); + mAdapter.splitRow(position, splitLux); + } + }) + .setNegativeButton(R.string.cancel, null) + .create(); + + label.setText(getContext().getString(R.string.auto_brightness_split_lux_format, + row.luxFrom + 1, row.luxTo - 1)); + value.setText(String.valueOf(row.luxFrom + 1)); + value.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + @Override + public void afterTextChanged(Editable s) { + boolean ok = false; + try { + int newLux = Integer.valueOf(s.toString()); + ok = newLux > row.luxFrom && newLux < row.luxTo; + } catch (NumberFormatException e) { + //ignored, ok is false anyway + } + Button okButton = d.getButton(DialogInterface.BUTTON_POSITIVE); + if (okButton != null) { + okButton.setEnabled(ok); + } + } + }); + + d.show(); + } + + private void showResetConfirmation() { + final AlertDialog d = new AlertDialog.Builder(getContext()) + .setTitle(R.string.auto_brightness_reset_dialog_title) + .setCancelable(true) + .setMessage(R.string.auto_brightness_reset_confirmation) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + updateSettings(true); + } + }) + .setNegativeButton(R.string.cancel, null) + .create(); + + d.show(); + } + + private void putSettings() { + int[] lux = null, values = null; + + if (!mIsDefault) { + lux = mAdapter.getLuxValues(); + values = mAdapter.getBacklightValues(); + } + + putItems(Settings.System.AUTO_BRIGHTNESS_LUX, lux); + putItems(Settings.System.AUTO_BRIGHTNESS_BACKLIGHT, values); + } + + private int[] fetchItems(String setting) { + String value = Settings.System.getString(getContext().getContentResolver(), setting); + if (value != null) { + String[] values = value.split(","); + if (values != null && values.length != 0) { + int[] result = new int[values.length]; + int i; + + for (i = 0; i < values.length; i++) { + try { + result[i] = Integer.valueOf(values[i]); + } catch (NumberFormatException e) { + break; + } + } + if (i == values.length) { + return result; + } + } + } + + return null; + } + + private void putItems(String setting, int[] values) { + String value = null; + if (values != null) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < values.length; i++) { + if (i > 0) { + builder.append(","); + } + builder.append(values[i]); + } + value = builder.toString(); + } + Settings.System.putString(getContext().getContentResolver(), setting, value); + } + + private class SettingRowAdapter extends ArrayAdapter<SettingRow> { + public SettingRowAdapter(Context context, ArrayList<SettingRow> rows) { + super(context, 0, rows); + setNotifyOnChange(false); + } + + private boolean isLastItem(int position) { + return position == getCount() - 1; + } + + public boolean canSplitRow(int position) { + if (isLastItem(position)) { + return false; + } + + SettingRow row = getItem(position); + return row.luxTo > (row.luxFrom + 1); + } + + public void initFromSettings(int[] lux, int[] values) { + ArrayList<SettingRow> settings = new ArrayList<SettingRow>(values.length); + for (int i = 0; i < lux.length; i++) { + settings.add(new SettingRow(i == 0 ? 0 : lux[i - 1], lux[i], values[i])); + } + settings.add(new SettingRow(lux[lux.length - 1], Integer.MAX_VALUE, values[values.length - 1])); + + clear(); + addAll(settings); + notifyDataSetChanged(); + } + + public int[] getLuxValues() { + int count = getCount(); + int[] lux = new int[count - 1]; + + for (int i = 0; i < count - 1; i++) { + lux[i] = getItem(i).luxTo; + } + + return lux; + } + + public int[] getBacklightValues() { + int count = getCount(); + int[] values = new int[count]; + + for (int i = 0; i < count; i++) { + values[i] = getItem(i).backlight; + } + return values; + } + + public void splitRow(int position, int splitLux) { + if (!canSplitRow(position)) { + return; + } + + ArrayList<SettingRow> rows = new ArrayList<SettingRow>(); + for (int i = 0; i <= position; i++) { + rows.add(getItem(i)); + } + + SettingRow lastRow = getItem(position); + SettingRow nextRow = getItem(position + 1); + rows.add(new SettingRow(splitLux, nextRow.luxFrom, lastRow.backlight)); + + for (int i = position + 1; i < getCount(); i++) { + rows.add(getItem(i)); + } + + clear(); + addAll(rows); + sanitizeValuesAndNotify(); + } + + public void removeRow(int position) { + if (getCount() <= 1) { + return; + } + + remove(getItem(position)); + sanitizeValuesAndNotify(); + } + + public void setLuxToForRow(final int position, int newLuxTo) { + final SettingRow row = getItem(position); + + if (isLastItem(position) || row.luxTo == newLuxTo) { + return; + } + + row.luxTo = newLuxTo; + sanitizeValuesAndNotify(); + } + + public void sanitizeValuesAndNotify() { + final int count = getCount(); + + getItem(0).luxFrom = 0; + for (int i = 1; i < count; i++) { + SettingRow lastRow = getItem(i - 1); + SettingRow thisRow = getItem(i); + + thisRow.luxFrom = Math.max(lastRow.luxFrom + 1, thisRow.luxFrom); + thisRow.backlight = Math.max(lastRow.backlight, thisRow.backlight); + lastRow.luxTo = thisRow.luxFrom; + } + getItem(count - 1).luxTo = Integer.MAX_VALUE; + + mIsDefault = false; + mAdapter.notifyDataSetChanged(); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final Holder holder; + + if (convertView == null) { + convertView = getLayoutInflater().inflate( + R.layout.auto_brightness_list_item, parent, false); + holder = new Holder(); + holder.lux = (TextView) convertView.findViewById(R.id.lux); + holder.backlight = (SeekBar) convertView.findViewById(R.id.backlight); + holder.percent = (TextView) convertView.findViewById(R.id.backlight_percent); + convertView.setTag(holder); + + holder.backlight.setMax(100 * PowerManager.BRIGHTNESS_ON); + holder.backlight.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + private boolean mIsDragging = false; + + private void updateBrightness(float brightness) { + final Window window = getWindow(); + final WindowManager.LayoutParams params = window.getAttributes(); + params.screenBrightness = brightness; + window.setAttributes(params); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int pos = (Integer) seekBar.getTag(); + if (fromUser) { + int minValue = (pos == 0) ? 0 : getItem(pos - 1).backlight * 100; + int maxValue = isLastItem(pos) + ? seekBar.getMax() : getItem(pos + 1).backlight * 100; + + if (progress < minValue) { + seekBar.setProgress(minValue); + return; + } else if (progress > maxValue) { + seekBar.setProgress(maxValue); + return; + } + + getItem(pos).backlight = (progress + 50) / 100; + mIsDefault = false; + } + + if (mIsDragging) { + final float brightness = (float) progress / seekBar.getMax(); + updateBrightness(brightness); + } + + holder.updatePercent(); + } + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + final float brightness = (float) seekBar.getProgress() / seekBar.getMax(); + updateBrightness(brightness); + mIsDragging = true; + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + updateBrightness(WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE); + mIsDragging = false; + } + }); + } else { + holder = (Holder) convertView.getTag(); + } + + SettingRow row = (SettingRow) getItem(position); + + final String to = row.luxTo == Integer.MAX_VALUE ? "\u221e" : String.valueOf(row.luxTo); + holder.lux.setText(getContext().getString(R.string.auto_brightness_level_format, + String.valueOf(row.luxFrom), to)); + + holder.backlight.setTag(position); + holder.backlight.setProgress(100 * row.backlight); + holder.updatePercent(); + + return convertView; + } + + private class Holder { + TextView lux; + SeekBar backlight; + TextView percent; + + public void updatePercent() { + int percentValue = Math.round((float) backlight.getProgress() * 100F / backlight.getMax()); + percent.setText(getContext().getString( + R.string.auto_brightness_brightness_format, percentValue)); + } + }; + }; +} |