diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7baaf4df9..4e805fb01 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -654,6 +654,10 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
pattern 5
Number of vibrates
New mail ringtone
+ Blink LED
+ Blink LED when mail arrives
+
+
Server settings
Message composition options
diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml
index 98517ec58..cd95dfd05 100644
--- a/res/xml/account_settings_preferences.xml
+++ b/res/xml/account_settings_preferences.xml
@@ -280,6 +280,14 @@
android:entryValues="@array/account_settings_vibrate_times_label"
android:dialogTitle="@string/account_settings_vibrate_times" />
+
+
identities;
+ private NotificationSetting mNotificationSetting = new NotificationSetting();
+
public enum FolderMode
{
NONE, ALL, FIRST_CLASS, FIRST_AND_SECOND_CLASS, NOT_SECOND_CLASS;
@@ -161,10 +157,6 @@ public class Account implements BaseAccount
mAccountNumber = -1;
mNotifyNewMail = true;
mNotifySync = true;
- mVibrate = false;
- mVibratePattern = 0;
- mVibrateTimes = 5;
- mRing = true;
mNotifySelfNewMail = true;
mFolderDisplayMode = FolderMode.NOT_SECOND_CLASS;
mFolderSyncMode = FolderMode.FIRST_CLASS;
@@ -174,13 +166,11 @@ public class Account implements BaseAccount
mHideMessageViewMoveButtons = HideButtons.NEVER;
mShowPictures = ShowPictures.NEVER;
mEnableMoveButtons = false;
- mRingtoneUri = "content://settings/system/notification_sound";
mIsSignatureBeforeQuotedText = false;
mExpungePolicy = EXPUNGE_IMMEDIATELY;
mAutoExpandFolderName = "INBOX";
mMaxPushFolders = 10;
mChipColor = (new Random()).nextInt(0xffffff) + 0xff000000;
- mLedColor = mChipColor;
goToUnreadMessageSearch = false;
subscribedFoldersOnly = false;
maximumPolledMessageAge = -1;
@@ -200,6 +190,14 @@ public class Account implements BaseAccount
identity.setSignature(context.getString(R.string.default_signature));
identity.setDescription(context.getString(R.string.default_identity_description));
identities.add(identity);
+
+ mNotificationSetting = new NotificationSetting();
+ mNotificationSetting.setVibrate(false);
+ mNotificationSetting.setVibratePattern(0);
+ mNotificationSetting.setVibrateTimes(5);
+ mNotificationSetting.setRing(true);
+ mNotificationSetting.setRingtone("content://settings/system/notification_sound");
+ mNotificationSetting.setLedColor(mChipColor);
}
protected Account(Preferences preferences, String uuid)
@@ -290,13 +288,6 @@ public class Account implements BaseAccount
(random.nextInt(0x70) * 0xff) +
(random.nextInt(0x70) * 0xffff) +
0xff000000);
- mLedColor = prefs.getInt(mUuid+".ledColor", mChipColor);
-
- mVibrate = prefs.getBoolean(mUuid + ".vibrate", false);
- mVibratePattern = prefs.getInt(mUuid + ".vibratePattern", 0);
- mVibrateTimes = prefs.getInt(mUuid + ".vibrateTimes", 5);
-
- mRing = prefs.getBoolean(mUuid + ".ring", true);
try
{
@@ -330,8 +321,15 @@ public class Account implements BaseAccount
mEnableMoveButtons = prefs.getBoolean(mUuid + ".enableMoveButtons", false);
- mRingtoneUri = prefs.getString(mUuid + ".ringtone",
- "content://settings/system/notification_sound");
+ mNotificationSetting.setVibrate(prefs.getBoolean(mUuid + ".vibrate", false));
+ mNotificationSetting.setVibratePattern(prefs.getInt(mUuid + ".vibratePattern", 0));
+ mNotificationSetting.setVibrateTimes(prefs.getInt(mUuid + ".vibrateTimes", 5));
+ mNotificationSetting.setRing(prefs.getBoolean(mUuid + ".ring", true));
+ mNotificationSetting.setRingtone(prefs.getString(mUuid + ".ringtone",
+ "content://settings/system/notification_sound"));
+ mNotificationSetting.setLed(prefs.getBoolean(mUuid + ".led", true));
+ mNotificationSetting.setLedColor(prefs.getInt(mUuid+".ledColor", mChipColor));
+
try
{
mFolderDisplayMode = FolderMode.valueOf(prefs.getString(mUuid + ".folderDisplayMode",
@@ -449,6 +447,7 @@ public class Account implements BaseAccount
editor.remove(mUuid + ".maxPushFolders");
editor.remove(mUuid + ".searchableFolders");
editor.remove(mUuid + ".chipColor");
+ editor.remove(mUuid + ".led");
editor.remove(mUuid + ".ledColor");
editor.remove(mUuid + ".goToUnreadMessageSearch");
editor.remove(mUuid + ".subscribedFoldersOnly");
@@ -525,15 +524,10 @@ public class Account implements BaseAccount
editor.putString(mUuid + ".outboxFolderName", mOutboxFolderName);
editor.putString(mUuid + ".autoExpandFolderName", mAutoExpandFolderName);
editor.putInt(mUuid + ".accountNumber", mAccountNumber);
- editor.putBoolean(mUuid + ".vibrate", mVibrate);
- editor.putInt(mUuid + ".vibratePattern", mVibratePattern);
- editor.putInt(mUuid + ".vibrateTimes", mVibrateTimes);
- editor.putBoolean(mUuid + ".ring", mRing);
editor.putString(mUuid + ".hideButtonsEnum", mHideMessageViewButtons.name());
editor.putString(mUuid + ".hideMoveButtonsEnum", mHideMessageViewMoveButtons.name());
editor.putString(mUuid + ".showPicturesEnum", mShowPictures.name());
editor.putBoolean(mUuid + ".enableMoveButtons", mEnableMoveButtons);
- editor.putString(mUuid + ".ringtone", mRingtoneUri);
editor.putString(mUuid + ".folderDisplayMode", mFolderDisplayMode.name());
editor.putString(mUuid + ".folderSyncMode", mFolderSyncMode.name());
editor.putString(mUuid + ".folderPushMode", mFolderPushMode.name());
@@ -544,7 +538,6 @@ public class Account implements BaseAccount
editor.putInt(mUuid + ".maxPushFolders", mMaxPushFolders);
editor.putString(mUuid + ".searchableFolders", searchableFolders.name());
editor.putInt(mUuid + ".chipColor", mChipColor);
- editor.putInt(mUuid + ".ledColor", mLedColor);
editor.putBoolean(mUuid + ".goToUnreadMessageSearch", goToUnreadMessageSearch);
editor.putBoolean(mUuid + ".subscribedFoldersOnly", subscribedFoldersOnly);
editor.putInt(mUuid + ".maximumPolledMessageAge", maximumPolledMessageAge);
@@ -553,6 +546,14 @@ public class Account implements BaseAccount
editor.putString(mUuid + ".cryptoApp", mCryptoApp);
editor.putBoolean(mUuid + ".cryptoAutoSignature", mCryptoAutoSignature);
+ editor.putBoolean(mUuid + ".vibrate", mNotificationSetting.isVibrate());
+ editor.putInt(mUuid + ".vibratePattern", mNotificationSetting.getVibratePattern());
+ editor.putInt(mUuid + ".vibrateTimes", mNotificationSetting.getVibrateTimes());
+ editor.putBoolean(mUuid + ".ring", mNotificationSetting.shouldRing());
+ editor.putString(mUuid + ".ringtone", mNotificationSetting.getRingtone());
+ editor.putBoolean(mUuid + ".led", mNotificationSetting.isLed());
+ editor.putInt(mUuid + ".ledColor", mNotificationSetting.getLedColor());
+
for (String type : networkTypes)
{
Boolean useCompression = compressionMap.get(type);
@@ -648,16 +649,6 @@ public class Account implements BaseAccount
}
- public synchronized void setLedColor(int color)
- {
- mLedColor = color;
- }
-
- public synchronized int getLedColor()
- {
- return mLedColor;
- }
-
public String getUuid()
{
return mUuid;
@@ -748,38 +739,6 @@ public class Account implements BaseAccount
this.mAlwaysBcc = alwaysBcc;
}
- public synchronized boolean isVibrate()
- {
- return mVibrate;
- }
-
- public synchronized void setVibrate(boolean vibrate)
- {
- mVibrate = vibrate;
- }
-
- public synchronized int getVibratePattern()
- {
- return mVibratePattern;
- }
-
- public synchronized void setVibratePattern(int pattern)
- {
- mVibratePattern = pattern;
- }
-
- public synchronized int getVibrateTimes()
- {
- return mVibrateTimes;
- }
-
- public synchronized void setVibrateTimes(int times)
- {
- mVibrateTimes = times;
- }
-
-
-
/* Have we sent a new mail notification on this account */
public boolean isRingNotified()
{
@@ -791,16 +750,6 @@ public class Account implements BaseAccount
mRingNotified = ringNotified;
}
- public synchronized String getRingtone()
- {
- return mRingtoneUri;
- }
-
- public synchronized void setRingtone(String ringtoneUri)
- {
- mRingtoneUri = ringtoneUri;
- }
-
public synchronized String getLocalStoreUri()
{
return mLocalStoreUri;
@@ -1096,16 +1045,6 @@ public class Account implements BaseAccount
return oldMaxPushFolders != maxPushFolders;
}
- public synchronized boolean shouldRing()
- {
- return mRing;
- }
-
- public synchronized void setRing(boolean ring)
- {
- mRing = ring;
- }
-
public LocalStore getLocalStore() throws MessagingException
{
return Store.getLocalInstance(this, K9.app);
@@ -1514,4 +1453,10 @@ public class Account implements BaseAccount
}
return mCryptoProvider;
}
+
+ public synchronized NotificationSetting getNotificationSetting()
+ {
+ return mNotificationSetting;
+ }
+
}
diff --git a/src/com/fsck/k9/NotificationSetting.java b/src/com/fsck/k9/NotificationSetting.java
new file mode 100644
index 000000000..434865873
--- /dev/null
+++ b/src/com/fsck/k9/NotificationSetting.java
@@ -0,0 +1,115 @@
+package com.fsck.k9;
+
+/**
+ * Describes how a notification should behave.
+ */
+public class NotificationSetting
+{
+
+ /**
+ * Ring notification kill switch. Allow disabling ringtones without losing
+ * ringtone selection.
+ */
+ private boolean mRing;
+
+ private String mRingtoneUri;
+
+ /**
+ * LED kill switch.
+ */
+ private boolean mLed;
+
+ private int mLedColor;
+
+ /**
+ * Vibration kill switch.
+ */
+ private boolean mVibrate;
+
+ private int mVibratePattern;
+
+ private int mVibrateTimes;
+
+ /**
+ * Set the ringtone kill switch. Allow to disable ringtone without losing
+ * ringtone selection.
+ *
+ * @param ring
+ * true
to allow ringtones, false
+ * otherwise.
+ */
+ public synchronized void setRing(boolean ring)
+ {
+ mRing = ring;
+ }
+
+ /**
+ * @return true
if ringtone is allowed to play,
+ * false
otherwise.
+ */
+ public synchronized boolean shouldRing()
+ {
+ return mRing;
+ }
+
+ public synchronized String getRingtone()
+ {
+ return mRingtoneUri;
+ }
+
+ public synchronized void setRingtone(String ringtoneUri)
+ {
+ mRingtoneUri = ringtoneUri;
+ }
+
+ public synchronized boolean isLed()
+ {
+ return mLed;
+ }
+
+ public synchronized void setLed(final boolean led)
+ {
+ mLed = led;
+ }
+
+ public synchronized int getLedColor()
+ {
+ return mLedColor;
+ }
+
+ public synchronized void setLedColor(int color)
+ {
+ mLedColor = color;
+ }
+
+ public synchronized boolean isVibrate()
+ {
+ return mVibrate;
+ }
+
+ public synchronized void setVibrate(boolean vibrate)
+ {
+ mVibrate = vibrate;
+ }
+
+ public synchronized int getVibratePattern()
+ {
+ return mVibratePattern;
+ }
+
+ public synchronized int getVibrateTimes()
+ {
+ return mVibrateTimes;
+ }
+
+ public synchronized void setVibratePattern(int pattern)
+ {
+ mVibratePattern = pattern;
+ }
+
+ public synchronized void setVibrateTimes(int times)
+ {
+ mVibrateTimes = times;
+ }
+
+}
diff --git a/src/com/fsck/k9/activity/setup/AccountSettings.java b/src/com/fsck/k9/activity/setup/AccountSettings.java
index 7e34a4434..ff8f3c200 100644
--- a/src/com/fsck/k9/activity/setup/AccountSettings.java
+++ b/src/com/fsck/k9/activity/setup/AccountSettings.java
@@ -55,6 +55,7 @@ public class AccountSettings extends K9PreferenceActivity
private static final String PREFERENCE_VIBRATE_PATTERN = "account_vibrate_pattern";
private static final String PREFERENCE_VIBRATE_TIMES = "account_vibrate_times";
private static final String PREFERENCE_RINGTONE = "account_ringtone";
+ private static final String PREFERENCE_NOTIFICATION_LED = "account_led";
private static final String PREFERENCE_INCOMING = "incoming";
private static final String PREFERENCE_OUTGOING = "outgoing";
private static final String PREFERENCE_DISPLAY_MODE = "folder_display_mode";
@@ -92,6 +93,7 @@ public class AccountSettings extends K9PreferenceActivity
private CheckBoxPreference mAccountEnableMoveButtons;
private CheckBoxPreference mAccountNotifySync;
private CheckBoxPreference mAccountVibrate;
+ private CheckBoxPreference mAccountLed;
private ListPreference mAccountVibratePattern;
private ListPreference mAccountVibrateTimes;
private RingtonePreference mAccountRingtone;
@@ -420,14 +422,14 @@ public class AccountSettings extends K9PreferenceActivity
// XXX: The following two lines act as a workaround for the RingtonePreference
// which does not let us set/get the value programmatically
SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences();
- String currentRingtone = (!mAccount.shouldRing() ? null : mAccount.getRingtone());
+ String currentRingtone = (!mAccount.getNotificationSetting().shouldRing() ? null : mAccount.getNotificationSetting().getRingtone());
prefs.edit().putString(PREFERENCE_RINGTONE, currentRingtone).commit();
mAccountVibrate = (CheckBoxPreference) findPreference(PREFERENCE_VIBRATE);
- mAccountVibrate.setChecked(mAccount.isVibrate());
+ mAccountVibrate.setChecked(mAccount.getNotificationSetting().isVibrate());
mAccountVibratePattern = (ListPreference) findPreference(PREFERENCE_VIBRATE_PATTERN);
- mAccountVibratePattern.setValue(String.valueOf(mAccount.getVibratePattern()));
+ mAccountVibratePattern.setValue(String.valueOf(mAccount.getNotificationSetting().getVibratePattern()));
mAccountVibratePattern.setSummary(mAccountVibratePattern.getEntry());
mAccountVibratePattern.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{
@@ -443,8 +445,8 @@ public class AccountSettings extends K9PreferenceActivity
});
mAccountVibrateTimes = (ListPreference) findPreference(PREFERENCE_VIBRATE_TIMES);
- mAccountVibrateTimes.setValue(String.valueOf(mAccount.getVibrateTimes()));
- mAccountVibrateTimes.setSummary(String.valueOf(mAccount.getVibrateTimes()));
+ mAccountVibrateTimes.setValue(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes()));
+ mAccountVibrateTimes.setSummary(String.valueOf(mAccount.getNotificationSetting().getVibrateTimes()));
mAccountVibrateTimes.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{
@Override
@@ -458,6 +460,9 @@ public class AccountSettings extends K9PreferenceActivity
}
});
+ mAccountLed = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFICATION_LED);
+ mAccountLed.setChecked(mAccount.getNotificationSetting().isLed());
+
mNotificationOpensUnread = (CheckBoxPreference)findPreference(PREFERENCE_NOTIFICATION_OPENS_UNREAD);
mNotificationOpensUnread.setChecked(mAccount.goToUnreadMessageSearch());
@@ -616,9 +621,10 @@ public class AccountSettings extends K9PreferenceActivity
mAccount.setDisplayCount(Integer.parseInt(mDisplayCount.getValue()));
mAccount.setMaximumPolledMessageAge(Integer.parseInt(mMessageAge.getValue()));
mAccount.setMaximumAutoDownloadMessageSize(Integer.parseInt(mMessageSize.getValue()));
- mAccount.setVibrate(mAccountVibrate.isChecked());
- mAccount.setVibratePattern(Integer.parseInt(mAccountVibratePattern.getValue()));
- mAccount.setVibrateTimes(Integer.parseInt(mAccountVibrateTimes.getValue()));
+ mAccount.getNotificationSetting().setVibrate(mAccountVibrate.isChecked());
+ mAccount.getNotificationSetting().setVibratePattern(Integer.parseInt(mAccountVibratePattern.getValue()));
+ mAccount.getNotificationSetting().setVibrateTimes(Integer.parseInt(mAccountVibrateTimes.getValue()));
+ mAccount.getNotificationSetting().setLed(mAccountLed.isChecked());
mAccount.setGoToUnreadMessageSearch(mNotificationOpensUnread.isChecked());
mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue()));
mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue()));
@@ -646,14 +652,14 @@ public class AccountSettings extends K9PreferenceActivity
String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null);
if (newRingtone != null)
{
- mAccount.setRing(true);
- mAccount.setRingtone(newRingtone);
+ mAccount.getNotificationSetting().setRing(true);
+ mAccount.getNotificationSetting().setRingtone(newRingtone);
}
else
{
- if (mAccount.shouldRing())
+ if (mAccount.getNotificationSetting().shouldRing())
{
- mAccount.setRingtone(null);
+ mAccount.getNotificationSetting().setRingtone(null);
}
}
@@ -743,10 +749,10 @@ public class AccountSettings extends K9PreferenceActivity
{
public void colorChanged(int color)
{
- mAccount.setLedColor(color);
+ mAccount.getNotificationSetting().setLedColor(color);
}
},
- mAccount.getLedColor()).show();
+ mAccount.getNotificationSetting().getLedColor()).show();
}
public void onChooseAutoExpandFolder()
diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java
index 9171f7923..f7f348627 100644
--- a/src/com/fsck/k9/controller/MessagingController.java
+++ b/src/com/fsck/k9/controller/MessagingController.java
@@ -39,6 +39,7 @@ import android.util.Log;
import com.fsck.k9.Account;
import com.fsck.k9.AccountStats;
import com.fsck.k9.K9;
+import com.fsck.k9.NotificationSetting;
import com.fsck.k9.Preferences;
import com.fsck.k9.R;
import com.fsck.k9.SearchSpecification;
@@ -4221,7 +4222,7 @@ public class MessagingController implements Runnable
if (K9.NOTIFICATION_LED_WHILE_SYNCING)
{
notif.flags |= Notification.FLAG_SHOW_LIGHTS;
- notif.ledARGB = account.getLedColor();
+ notif.ledARGB = account.getNotificationSetting().getLedColor();
notif.ledOnMS = K9.NOTIFICATION_LED_FAST_ON_TIME;
notif.ledOffMS = K9.NOTIFICATION_LED_FAST_OFF_TIME;
}
@@ -4327,7 +4328,7 @@ public class MessagingController implements Runnable
if (K9.NOTIFICATION_LED_WHILE_SYNCING)
{
notif.flags |= Notification.FLAG_SHOW_LIGHTS;
- notif.ledARGB = account.getLedColor();
+ notif.ledARGB = account.getNotificationSetting().getLedColor();
notif.ledOnMS = K9.NOTIFICATION_LED_FAST_ON_TIME;
notif.ledOffMS = K9.NOTIFICATION_LED_FAST_OFF_TIME;
}
@@ -4637,31 +4638,54 @@ public class MessagingController implements Runnable
// Only ring or vibrate if we have not done so already on this
// account and fetch
+ boolean ringAndVibrate = false;
if (!account.isRingNotified())
{
account.setRingNotified(true);
- if (account.shouldRing())
- {
- String ringtone = account.getRingtone();
- notif.sound = TextUtils.isEmpty(ringtone) ? null : Uri.parse(ringtone);
- }
- if (account.isVibrate())
- {
- long[] pattern = getVibratePattern(account.getVibratePattern(), account.getVibrateTimes());
- notif.vibrate = pattern;
- }
+ ringAndVibrate = true;
}
- notif.flags |= Notification.FLAG_SHOW_LIGHTS;
- notif.ledARGB = account.getLedColor();
- notif.ledOnMS = K9.NOTIFICATION_LED_ON_TIME;
- notif.ledOffMS = K9.NOTIFICATION_LED_OFF_TIME;
- notif.audioStreamType = AudioManager.STREAM_NOTIFICATION;
+ configureNotification(account.getNotificationSetting(), notif, ringAndVibrate);
notifMgr.notify(account.getAccountNumber(), notif);
return true;
}
+ /**
+ * @param setting
+ * Configuration template. Never null
.
+ * @param notification
+ * Object to configure. Never null
.
+ * @param ringAndVibrate
+ * true
if ringtone/vibration are allowed,
+ * false
otherwise.
+ */
+ private void configureNotification(final NotificationSetting setting, final Notification notification, final boolean ringAndVibrate)
+ {
+ if (ringAndVibrate)
+ {
+ if (setting.shouldRing())
+ {
+ String ringtone = setting.getRingtone();
+ notification.sound = TextUtils.isEmpty(ringtone) ? null : Uri.parse(ringtone);
+ notification.audioStreamType = AudioManager.STREAM_NOTIFICATION;
+ }
+ if (setting.isVibrate())
+ {
+ long[] pattern = getVibratePattern(setting.getVibratePattern(), setting.getVibrateTimes());
+ notification.vibrate = pattern;
+ }
+ }
+
+ if (setting.isLed())
+ {
+ notification.flags |= Notification.FLAG_SHOW_LIGHTS;
+ notification.ledARGB = setting.getLedColor();
+ notification.ledOnMS = K9.NOTIFICATION_LED_ON_TIME;
+ notification.ledOffMS = K9.NOTIFICATION_LED_OFF_TIME;
+ }
+ }
+
/*
* Fetch a vibration pattern.
*
diff --git a/src/com/fsck/k9/service/RemoteControlService.java b/src/com/fsck/k9/service/RemoteControlService.java
index 6a060d9d0..1b131bc76 100644
--- a/src/com/fsck/k9/service/RemoteControlService.java
+++ b/src/com/fsck/k9/service/RemoteControlService.java
@@ -105,11 +105,11 @@ public class RemoteControlService extends CoreService
}
if (ringEnabled != null)
{
- account.setRing(Boolean.parseBoolean(ringEnabled));
+ account.getNotificationSetting().setRing(Boolean.parseBoolean(ringEnabled));
}
if (vibrateEnabled != null)
{
- account.setVibrate(Boolean.parseBoolean(vibrateEnabled));
+ account.getNotificationSetting().setVibrate(Boolean.parseBoolean(vibrateEnabled));
}
if (pushClasses != null)
{