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) {