From 652fb0f7c311644442ebd427366d6d9dd9d86440 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Sun, 2 Dec 2012 18:17:22 +0100 Subject: [PATCH] Added option to have settings not applied after area change. --- res/layout/volume_preference.xml | 77 +++++++++++ res/menu/profile_list_context.xml | 28 ++++ res/values/strings.xml | 1 + res/values/values.xml | 1 + .../nutomic/pegasus/LocationService.java | 38 ++++-- .../nutomic/pegasus/VolumePreference.java | 122 +++++++++++++----- .../nutomic/pegasus/content/Database.java | 19 +-- .../pegasus/content/ProfileColumns.java | 12 ++ 8 files changed, 243 insertions(+), 55 deletions(-) create mode 100644 res/layout/volume_preference.xml create mode 100644 res/menu/profile_list_context.xml diff --git a/res/layout/volume_preference.xml b/res/layout/volume_preference.xml new file mode 100644 index 0000000..9d6fade --- /dev/null +++ b/res/layout/volume_preference.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/menu/profile_list_context.xml b/res/menu/profile_list_context.xml new file mode 100644 index 0000000..47f297f --- /dev/null +++ b/res/menu/profile_list_context.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 06f93d0..0aea73b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -74,6 +74,7 @@ Ringer Mode Wifi Enabled + Keep previous Normal Silent Vibrate only diff --git a/res/values/values.xml b/res/values/values.xml index 28ecaf3..c7361b5 100644 --- a/res/values/values.xml +++ b/res/values/values.xml @@ -42,6 +42,7 @@ + "-1" "2" "0" "1" diff --git a/src/com/github/nutomic/pegasus/LocationService.java b/src/com/github/nutomic/pegasus/LocationService.java index 66e9341..51b5453 100644 --- a/src/com/github/nutomic/pegasus/LocationService.java +++ b/src/com/github/nutomic/pegasus/LocationService.java @@ -252,23 +252,35 @@ public class LocationService extends Service { WifiManager wm = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); - am.setStreamVolume(AudioManager.STREAM_RING, - c.getInt(c.getColumnIndex(ProfileColumns.RINGTONE_VOLUME)), - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + // Value smaller zero means the volume should not change. + if (c.getInt(c.getColumnIndex(ProfileColumns.RINGTONE_VOLUME)) >= 0) { + am.setStreamVolume(AudioManager.STREAM_RING, + c.getInt(c.getColumnIndex(ProfileColumns.RINGTONE_VOLUME)), + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + } - am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, - c.getInt(c.getColumnIndex(ProfileColumns.NOTIFICATION_VOLUME)), - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + if (c.getInt(c.getColumnIndex(ProfileColumns.NOTIFICATION_VOLUME)) >= 0) { + am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, + c.getInt(c.getColumnIndex(ProfileColumns.NOTIFICATION_VOLUME)), + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + } - am.setStreamVolume(AudioManager.STREAM_MUSIC, - c.getInt(c.getColumnIndex(ProfileColumns.MEDIA_VOLUME)), - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + if (c.getInt(c.getColumnIndex(ProfileColumns.MEDIA_VOLUME)) >= 0) { + am.setStreamVolume(AudioManager.STREAM_MUSIC, + c.getInt(c.getColumnIndex(ProfileColumns.MEDIA_VOLUME)), + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + } - am.setStreamVolume(AudioManager.STREAM_ALARM, - c.getInt(c.getColumnIndex(ProfileColumns.ALARM_VOLUME)), - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + if (c.getInt(c.getColumnIndex(ProfileColumns.ALARM_VOLUME)) >= 0) { + am.setStreamVolume(AudioManager.STREAM_ALARM, + c.getInt(c.getColumnIndex(ProfileColumns.ALARM_VOLUME)), + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + } - am.setRingerMode(c.getInt(c.getColumnIndex(ProfileColumns.RINGER_MODE))); + if (c.getInt(c.getColumnIndex(ProfileColumns.RINGER_MODE)) != + ProfileColumns.RINGER_MODE_KEEP) { + am.setRingerMode(c.getInt(c.getColumnIndex(ProfileColumns.RINGER_MODE))); + } wm.setWifiEnabled((c.getInt(c.getColumnIndex(ProfileColumns.WIFI_ENABLED)) == 0) ? true : false); diff --git a/src/com/github/nutomic/pegasus/VolumePreference.java b/src/com/github/nutomic/pegasus/VolumePreference.java index 8ddcb73..8dfa0e4 100644 --- a/src/com/github/nutomic/pegasus/VolumePreference.java +++ b/src/com/github/nutomic/pegasus/VolumePreference.java @@ -16,23 +16,35 @@ package com.github.nutomic.pegasus; +import android.app.AlertDialog; import android.content.Context; -import android.preference.DialogPreference; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.preference.Preference; import android.util.AttributeSet; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.SeekBar; +import com.github.nutomic.pegasus.content.ProfileColumns; + /** - * Preference that opens a SeekBar dialog. + * Preference that opens a SeekBar dialog and has a CheckBox, only if the + * CheckBox is checked is the value applied (but it is always saved). * * @author Felix Ableitner * */ -public class VolumePreference extends DialogPreference { +public class VolumePreference extends Preference implements + OnCheckedChangeListener, android.view.View.OnClickListener { - private int mMax; + private CheckBox mCheckBox; private int mProgress; - private SeekBar mSeekBar; + private int mMax; /** * Initialize layout, set Preference not persistent- @@ -41,20 +53,23 @@ public class VolumePreference extends DialogPreference { super(context, attrs); setPersistent(false); - setDialogLayoutResource(R.layout.seekbar_dialog); - - setPositiveButtonText(android.R.string.ok); - setNegativeButtonText(android.R.string.cancel); + setLayoutResource(R.layout.volume_preference); } - + + /** + * Initialize OnClickListeners. + */ @Override - protected void onBindDialogView(View view) { - super.onBindDialogView(view); - - mSeekBar = (SeekBar) view.findViewById(R.id.seekbar); + public View getView(View convertView, ViewGroup parent) { + View view = super.getView(convertView, parent); - mSeekBar.setProgress(mProgress); - mSeekBar.setMax(mMax); + View layout = view.findViewById(R.id.text_layout); + layout.setOnClickListener(this); + + mCheckBox = (CheckBox) view.findViewById(R.id.profile_checkbox); + mCheckBox.setOnCheckedChangeListener(this); + + return view; } /** @@ -62,30 +77,71 @@ public class VolumePreference extends DialogPreference { */ @Override public void setDefaultValue(Object defaultValue) { - mProgress = (Integer) defaultValue; - if (mSeekBar != null) { - mSeekBar.setProgress((Integer) defaultValue); - } + mProgress = (Integer) defaultValue; + if (mProgress >= 0) { + mCheckBox.setChecked(true); + } + else { + mCheckBox.setChecked(false); + // Set progress to the actual volume value. + mProgress += ProfileColumns.VOLUME_APPLY_FALSE; + } } /** * Set the maximum value for the SeekBar. */ public void setMaxValue(int max) { - mMax = max; - if (mSeekBar != null) { - mSeekBar.setMax(max); - } + mMax = max; } - - /** - * Send new value to listener (if positive button was clicked). - */ + + /** + * CheckBox value was changed. + */ @Override - protected void onDialogClosed(boolean positiveResult) { - if (positiveResult) { - mProgress = mSeekBar.getProgress(); - callChangeListener(mProgress); - } + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + callChangeListener(); } + + /** + * Calls the change listener for this preference, with VOLUME_APPLY_FALSE + * subtracted if the CheckBox is unchecked. + */ + private void callChangeListener() { + callChangeListener((mCheckBox.isChecked()) + ? mProgress + : mProgress - ProfileColumns.VOLUME_APPLY_FALSE); + } + + /** + * Left part (text) clicked, show volume dialog. + */ + @Override + public void onClick(View v) { + // Initialize dialog layout. + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View view = inflater.inflate(R.layout.seekbar_dialog, null); + final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekbar); + seekBar.setMax(mMax); + seekBar.setProgress((mProgress >= 0) + ? mProgress + : mProgress + ProfileColumns.VOLUME_APPLY_FALSE); + + // Create and show dialog. + new AlertDialog.Builder(getContext()) + .setTitle(getTitle()) + .setView(view) + .setPositiveButton(android.R.string.ok, new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + mProgress = seekBar.getProgress(); + callChangeListener(); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + } \ No newline at end of file diff --git a/src/com/github/nutomic/pegasus/content/Database.java b/src/com/github/nutomic/pegasus/content/Database.java index aa79c3b..0007d74 100644 --- a/src/com/github/nutomic/pegasus/content/Database.java +++ b/src/com/github/nutomic/pegasus/content/Database.java @@ -75,26 +75,27 @@ public class Database extends SQLiteOpenHelper { db.execSQL(CellColumns.CREATE_TABLE); db.execSQL(CellLogColumns.CREATE_TABLE); - // Insert "Normal" profile. + // Insert "Normal" profile. Does not change any settings by default. ContentValues cv = new ContentValues(); cv.put(ProfileColumns.NAME, mContext.getResources() .getString(R.string.sql_profile_normal)); - cv.put(ProfileColumns.RINGTONE_VOLUME, 5); - cv.put(ProfileColumns.NOTIFICATION_VOLUME, 5); - cv.put(ProfileColumns.MEDIA_VOLUME, 9); - cv.put(ProfileColumns.ALARM_VOLUME, 5); + cv.put(ProfileColumns.RINGTONE_VOLUME, 5 - ProfileColumns.VOLUME_APPLY_FALSE); + cv.put(ProfileColumns.NOTIFICATION_VOLUME, 5 - ProfileColumns.VOLUME_APPLY_FALSE); + cv.put(ProfileColumns.MEDIA_VOLUME, 9 - ProfileColumns.VOLUME_APPLY_FALSE); + cv.put(ProfileColumns.ALARM_VOLUME, 5 - ProfileColumns.VOLUME_APPLY_FALSE); cv.put(ProfileColumns.WIFI_ENABLED, true); - cv.put(ProfileColumns.RINGER_MODE, AudioManager.RINGER_MODE_NORMAL); + cv.put(ProfileColumns.RINGER_MODE, ProfileColumns.RINGER_MODE_KEEP); long normal = db.insert(ProfileColumns.TABLE_NAME, null, cv); - // Insert "Silent" profile. + // Insert "Silent" profile. Changes ringtone and notification + // volume by default and enables vibration. cv = new ContentValues(); cv.put(ProfileColumns.NAME, mContext.getResources() .getString(R.string.sql_profile_silent)); cv.put(ProfileColumns.RINGTONE_VOLUME, 0); cv.put(ProfileColumns.NOTIFICATION_VOLUME, 0); - cv.put(ProfileColumns.MEDIA_VOLUME, 0); - cv.put(ProfileColumns.ALARM_VOLUME, 0); + cv.put(ProfileColumns.MEDIA_VOLUME, 0 - ProfileColumns.VOLUME_APPLY_FALSE); + cv.put(ProfileColumns.ALARM_VOLUME, 0 - ProfileColumns.VOLUME_APPLY_FALSE); cv.put(ProfileColumns.WIFI_ENABLED, true); cv.put(ProfileColumns.RINGER_MODE, AudioManager.RINGER_MODE_VIBRATE); long silent = db.insert(ProfileColumns.TABLE_NAME, null, cv); diff --git a/src/com/github/nutomic/pegasus/content/ProfileColumns.java b/src/com/github/nutomic/pegasus/content/ProfileColumns.java index 9742856..d737963 100644 --- a/src/com/github/nutomic/pegasus/content/ProfileColumns.java +++ b/src/com/github/nutomic/pegasus/content/ProfileColumns.java @@ -48,5 +48,17 @@ public class ProfileColumns implements BaseColumns { WIFI_ENABLED + " INTEGER," + RINGER_MODE + " INTEGER" + ");"; + + /** + * This value is subtracted from any volume value if it should not + * be applied (only saved). Generally allows for easy testing by + * checking if the value is smaller than zero. + */ + public static final int VOLUME_APPLY_FALSE = 100; + + /** + * Value to indicate that AlarmManager.setRingerMode should not be used. + */ + public static final int RINGER_MODE_KEEP = -1; }