From b22fc0a139e24a9f5480939b87903563c3e601d2 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Thu, 14 Feb 2019 18:03:48 +0100 Subject: Messaging: Implement per conversation channels Test: manual - Tested the messaging UI. Ran the following CTS tests on Emulator. $ make -j $ make messagingtests -j $ find out -name "messaging*.apk" -print -exec ls -l {} \; out/target/product/generic_x86/system/product/app/messaging/messaging.apk -rw-r--r-- 1 luca users 10253068 Sep 10 16:05 out/target/product/generic_x86/system/product/app/messaging/messaging.apk out/target/product/generic_x86/testcases/messaging/messaging.apk -rw-r--r-- 1 luca users 10253068 Sep 10 12:57 out/target/product/generic_x86/testcases/messaging/messaging.apk $ adb install -r -d out/target/product/generic_x86/system/product/app/messaging/messaging.apk $ adb install -r -d out/target/product/generic_x86/testcases/messagingtests/x86/messagingtests.apk $ adb shell am instrument -w com.android.messaging.test Time: 12.766 OK (113 tests) CTS tests for Mesaging app --------------------------- $ ./development/testrunner/runtest.py --path cts/tests/app/src/android/app/cts/NotificationTest.java adb shell am instrument -e class 'android.app.cts.NotificationTest' -w 'android.app.cts/androidx.test.runner.AndroidJUnitRunner' android.app.cts.NotificationTest:........................... Time: 0.2 OK (27 tests) atest ----- $ cd packages/apps/Messaging $ atest Summary ------- messagingtests: Passed: 113, Failed: 0, Ignored: 0 Signed-off-by: Luca Stefani Signed-off-by: Joey Signed-off-by: Danny Baumann Signed-off-by: Arne Coucheron Change-Id: Idb39ca32751d40b3376934775d2119dd6cc7e297 --- AndroidManifest.xml | 2 +- res/drawable-hdpi/ic_notifications_off_dark.png | Bin 1264 -> 0 bytes res/drawable-hdpi/ic_notifications_off_light.png | Bin 1092 -> 0 bytes .../ic_notifications_off_small_light.png | Bin 839 -> 0 bytes res/drawable-hdpi/ic_notifications_on_dark.png | Bin 1291 -> 0 bytes res/drawable-hdpi/ic_notifications_on_light.png | Bin 1192 -> 0 bytes res/drawable-mdpi/ic_notifications_off_dark.png | Bin 914 -> 0 bytes res/drawable-mdpi/ic_notifications_off_light.png | Bin 820 -> 0 bytes .../ic_notifications_off_small_light.png | Bin 613 -> 0 bytes res/drawable-mdpi/ic_notifications_on_dark.png | Bin 946 -> 0 bytes res/drawable-mdpi/ic_notifications_on_light.png | Bin 880 -> 0 bytes res/drawable-xhdpi/ic_notifications_off_dark.png | Bin 1671 -> 0 bytes res/drawable-xhdpi/ic_notifications_off_light.png | Bin 1447 -> 0 bytes .../ic_notifications_off_small_light.png | Bin 1060 -> 0 bytes res/drawable-xhdpi/ic_notifications_on_dark.png | Bin 1660 -> 0 bytes res/drawable-xhdpi/ic_notifications_on_light.png | Bin 1584 -> 0 bytes res/drawable-xxhdpi/ic_notifications_off_dark.png | Bin 1967 -> 0 bytes res/drawable-xxhdpi/ic_notifications_off_light.png | Bin 1902 -> 0 bytes .../ic_notifications_off_small_light.png | Bin 1883 -> 0 bytes res/drawable-xxhdpi/ic_notifications_on_dark.png | Bin 2077 -> 0 bytes res/drawable-xxhdpi/ic_notifications_on_light.png | Bin 1938 -> 0 bytes res/drawable-xxxhdpi/ic_notifications_off_dark.png | Bin 1985 -> 0 bytes .../ic_notifications_off_light.png | Bin 1938 -> 0 bytes .../ic_notifications_off_small_light.png | Bin 1726 -> 0 bytes res/drawable-xxxhdpi/ic_notifications_on_dark.png | Bin 2404 -> 0 bytes res/drawable-xxxhdpi/ic_notifications_on_light.png | Bin 2257 -> 0 bytes res/layout/conversation_list_item_view.xml | 11 -- res/layout/people_options_item_view.xml | 20 --- res/layout/widget_conversation_list_item.xml | 12 -- .../conversation_list_fragment_select_menu.xml | 12 -- res/values-ldrtl/styles.xml | 4 - res/values/colors.xml | 1 - res/values/constants.xml | 3 +- res/values/dimens.xml | 2 - res/values/strings.xml | 13 +- res/values/styles.xml | 10 -- res/xml-v21/preferences_application.xml | 27 +--- res/xml-v23/preferences_application.xml | 27 +--- res/xml/preferences_application.xml | 27 +--- .../datamodel/BugleDatabaseOperations.java | 29 +--- .../messaging/datamodel/BugleNotifications.java | 134 +++++++----------- .../messaging/datamodel/DatabaseHelper.java | 12 -- .../datamodel/MessageNotificationState.java | 38 ----- .../messaging/datamodel/NotificationState.java | 9 -- .../android/messaging/datamodel/SyncManager.java | 27 +--- .../datamodel/action/DeleteConversationAction.java | 5 + .../action/GetOrCreateConversationAction.java | 2 +- .../datamodel/action/InsertNewMessageAction.java | 2 +- .../action/UpdateConversationOptionsAction.java | 156 --------------------- .../datamodel/data/ConversationListItemData.java | 61 ++------ .../datamodel/data/PeopleAndOptionsData.java | 34 +---- .../datamodel/data/PeopleOptionsItemData.java | 83 +---------- .../android/messaging/receiver/SmsReceiver.java | 10 +- src/com/android/messaging/ui/UIIntents.java | 10 -- src/com/android/messaging/ui/UIIntentsImpl.java | 11 -- .../appsettings/ApplicationSettingsActivity.java | 100 ++----------- .../AbstractConversationListActivity.java | 18 --- .../conversationlist/ConversationListItemView.java | 5 - .../MultiSelectActionModeCallback.java | 29 +--- .../PeopleAndOptionsFragment.java | 46 ++---- .../PeopleOptionsItemView.java | 29 +--- .../android/messaging/util/NotificationsUtil.java | 101 +++++++++++++ src/com/android/messaging/util/RingtoneUtil.java | 53 ------- .../widget/WidgetConversationListService.java | 4 - tests/AndroidManifest.xml | 2 +- .../action/ReadWriteDraftMessageActionTest.java | 4 +- 66 files changed, 243 insertions(+), 942 deletions(-) delete mode 100644 res/drawable-hdpi/ic_notifications_off_dark.png delete mode 100644 res/drawable-hdpi/ic_notifications_off_light.png delete mode 100644 res/drawable-hdpi/ic_notifications_off_small_light.png delete mode 100644 res/drawable-hdpi/ic_notifications_on_dark.png delete mode 100644 res/drawable-hdpi/ic_notifications_on_light.png delete mode 100644 res/drawable-mdpi/ic_notifications_off_dark.png delete mode 100644 res/drawable-mdpi/ic_notifications_off_light.png delete mode 100644 res/drawable-mdpi/ic_notifications_off_small_light.png delete mode 100644 res/drawable-mdpi/ic_notifications_on_dark.png delete mode 100644 res/drawable-mdpi/ic_notifications_on_light.png delete mode 100644 res/drawable-xhdpi/ic_notifications_off_dark.png delete mode 100644 res/drawable-xhdpi/ic_notifications_off_light.png delete mode 100644 res/drawable-xhdpi/ic_notifications_off_small_light.png delete mode 100644 res/drawable-xhdpi/ic_notifications_on_dark.png delete mode 100644 res/drawable-xhdpi/ic_notifications_on_light.png delete mode 100644 res/drawable-xxhdpi/ic_notifications_off_dark.png delete mode 100644 res/drawable-xxhdpi/ic_notifications_off_light.png delete mode 100644 res/drawable-xxhdpi/ic_notifications_off_small_light.png delete mode 100644 res/drawable-xxhdpi/ic_notifications_on_dark.png delete mode 100644 res/drawable-xxhdpi/ic_notifications_on_light.png delete mode 100644 res/drawable-xxxhdpi/ic_notifications_off_dark.png delete mode 100644 res/drawable-xxxhdpi/ic_notifications_off_light.png delete mode 100644 res/drawable-xxxhdpi/ic_notifications_off_small_light.png delete mode 100644 res/drawable-xxxhdpi/ic_notifications_on_dark.png delete mode 100644 res/drawable-xxxhdpi/ic_notifications_on_light.png delete mode 100644 src/com/android/messaging/datamodel/action/UpdateConversationOptionsAction.java create mode 100644 src/com/android/messaging/util/NotificationsUtil.java delete mode 100644 src/com/android/messaging/util/RingtoneUtil.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f9ba40a..ea945c5 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -18,7 +18,7 @@ package="com.android.messaging" android:installLocation="internalOnly"> - + diff --git a/res/drawable-hdpi/ic_notifications_off_dark.png b/res/drawable-hdpi/ic_notifications_off_dark.png deleted file mode 100644 index 9bcdc62..0000000 Binary files a/res/drawable-hdpi/ic_notifications_off_dark.png and /dev/null differ diff --git a/res/drawable-hdpi/ic_notifications_off_light.png b/res/drawable-hdpi/ic_notifications_off_light.png deleted file mode 100644 index 433b6a9..0000000 Binary files a/res/drawable-hdpi/ic_notifications_off_light.png and /dev/null differ diff --git a/res/drawable-hdpi/ic_notifications_off_small_light.png b/res/drawable-hdpi/ic_notifications_off_small_light.png deleted file mode 100644 index fbd0ad5..0000000 Binary files a/res/drawable-hdpi/ic_notifications_off_small_light.png and /dev/null differ diff --git a/res/drawable-hdpi/ic_notifications_on_dark.png b/res/drawable-hdpi/ic_notifications_on_dark.png deleted file mode 100644 index 21e48a5..0000000 Binary files a/res/drawable-hdpi/ic_notifications_on_dark.png and /dev/null differ diff --git a/res/drawable-hdpi/ic_notifications_on_light.png b/res/drawable-hdpi/ic_notifications_on_light.png deleted file mode 100644 index 6b39fec..0000000 Binary files a/res/drawable-hdpi/ic_notifications_on_light.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_notifications_off_dark.png b/res/drawable-mdpi/ic_notifications_off_dark.png deleted file mode 100644 index 4a5a7e9..0000000 Binary files a/res/drawable-mdpi/ic_notifications_off_dark.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_notifications_off_light.png b/res/drawable-mdpi/ic_notifications_off_light.png deleted file mode 100644 index 33e0b4a..0000000 Binary files a/res/drawable-mdpi/ic_notifications_off_light.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_notifications_off_small_light.png b/res/drawable-mdpi/ic_notifications_off_small_light.png deleted file mode 100644 index 4bd9563..0000000 Binary files a/res/drawable-mdpi/ic_notifications_off_small_light.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_notifications_on_dark.png b/res/drawable-mdpi/ic_notifications_on_dark.png deleted file mode 100644 index 77a2a7d..0000000 Binary files a/res/drawable-mdpi/ic_notifications_on_dark.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_notifications_on_light.png b/res/drawable-mdpi/ic_notifications_on_light.png deleted file mode 100644 index eae03a5..0000000 Binary files a/res/drawable-mdpi/ic_notifications_on_light.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_notifications_off_dark.png b/res/drawable-xhdpi/ic_notifications_off_dark.png deleted file mode 100644 index 4f3b924..0000000 Binary files a/res/drawable-xhdpi/ic_notifications_off_dark.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_notifications_off_light.png b/res/drawable-xhdpi/ic_notifications_off_light.png deleted file mode 100644 index 16ae132..0000000 Binary files a/res/drawable-xhdpi/ic_notifications_off_light.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_notifications_off_small_light.png b/res/drawable-xhdpi/ic_notifications_off_small_light.png deleted file mode 100644 index e54fc52..0000000 Binary files a/res/drawable-xhdpi/ic_notifications_off_small_light.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_notifications_on_dark.png b/res/drawable-xhdpi/ic_notifications_on_dark.png deleted file mode 100644 index 40f2909..0000000 Binary files a/res/drawable-xhdpi/ic_notifications_on_dark.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_notifications_on_light.png b/res/drawable-xhdpi/ic_notifications_on_light.png deleted file mode 100644 index 3c44f93..0000000 Binary files a/res/drawable-xhdpi/ic_notifications_on_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_notifications_off_dark.png b/res/drawable-xxhdpi/ic_notifications_off_dark.png deleted file mode 100644 index 27d3754..0000000 Binary files a/res/drawable-xxhdpi/ic_notifications_off_dark.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_notifications_off_light.png b/res/drawable-xxhdpi/ic_notifications_off_light.png deleted file mode 100644 index a2aedec..0000000 Binary files a/res/drawable-xxhdpi/ic_notifications_off_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_notifications_off_small_light.png b/res/drawable-xxhdpi/ic_notifications_off_small_light.png deleted file mode 100644 index 2a90e07..0000000 Binary files a/res/drawable-xxhdpi/ic_notifications_off_small_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_notifications_on_dark.png b/res/drawable-xxhdpi/ic_notifications_on_dark.png deleted file mode 100644 index e64da6b..0000000 Binary files a/res/drawable-xxhdpi/ic_notifications_on_dark.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_notifications_on_light.png b/res/drawable-xxhdpi/ic_notifications_on_light.png deleted file mode 100644 index f8f7d15..0000000 Binary files a/res/drawable-xxhdpi/ic_notifications_on_light.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_notifications_off_dark.png b/res/drawable-xxxhdpi/ic_notifications_off_dark.png deleted file mode 100644 index 10ac318..0000000 Binary files a/res/drawable-xxxhdpi/ic_notifications_off_dark.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_notifications_off_light.png b/res/drawable-xxxhdpi/ic_notifications_off_light.png deleted file mode 100644 index 8eb5782..0000000 Binary files a/res/drawable-xxxhdpi/ic_notifications_off_light.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_notifications_off_small_light.png b/res/drawable-xxxhdpi/ic_notifications_off_small_light.png deleted file mode 100644 index 3756943..0000000 Binary files a/res/drawable-xxxhdpi/ic_notifications_off_small_light.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_notifications_on_dark.png b/res/drawable-xxxhdpi/ic_notifications_on_dark.png deleted file mode 100644 index 3896212..0000000 Binary files a/res/drawable-xxxhdpi/ic_notifications_on_dark.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_notifications_on_light.png b/res/drawable-xxxhdpi/ic_notifications_on_light.png deleted file mode 100644 index 47794fd..0000000 Binary files a/res/drawable-xxxhdpi/ic_notifications_on_light.png and /dev/null differ diff --git a/res/layout/conversation_list_item_view.xml b/res/layout/conversation_list_item_view.xml index 43cb3ee..c89e470 100644 --- a/res/layout/conversation_list_item_view.xml +++ b/res/layout/conversation_list_item_view.xml @@ -121,17 +121,6 @@ android:layout_height="wrap_content" android:layout_weight="1" android:background="@android:color/transparent"> - - - - - - - diff --git a/res/layout/widget_conversation_list_item.xml b/res/layout/widget_conversation_list_item.xml index e0115a2..c1a140a 100644 --- a/res/layout/widget_conversation_list_item.xml +++ b/res/layout/widget_conversation_list_item.xml @@ -67,18 +67,6 @@ android:layout_alignParentTop="true" android:gravity="center_vertical" android:background="@android:color/transparent"> - - - - @color/conversation_list_name - - diff --git a/res/values/colors.xml b/res/values/colors.xml index 3f9288b..e55ad8e 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -120,7 +120,6 @@ #99aaaaaa #4d4d4d - #6d6d6d #6d6d6d #cccccc diff --git a/res/values/constants.xml b/res/values/constants.xml index 8985fd1..cd77e0e 100644 --- a/res/values/constants.xml +++ b/res/values/constants.xml @@ -21,8 +21,7 @@ notifications_category mms_messaging_category advanced_category - notifications_enabled - true + notifications_enabled notification_sound notification_vibration true diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 5ff0eb7..ff966d5 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -34,7 +34,6 @@ 56dp 42dp 96dp - 4dp 30dp 16dp @@ -105,7 +104,6 @@ 2dp 12dp 18sp - 14sp 16sp 240dp 240dp diff --git a/res/values/strings.xml b/res/values/strings.xml index 0e91156..dd23405 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -253,10 +253,6 @@ Archive Unarchive - - Turn off notifications - - Turn on notifications Add contact @@ -436,13 +432,9 @@ Debug - Notifications + Notifications - Sound - Silent - - Vibrate Blocked SMS delivery reports @@ -975,4 +967,7 @@ %s selected Work Profile contacts + + + Messages diff --git a/res/values/styles.xml b/res/values/styles.xml index 5762d4d..26a8020 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -286,10 +286,6 @@ @color/conversation_list_name - - @@ -342,12 +338,6 @@ @dimen/copy_contact_dialog_right_padding - - diff --git a/res/xml-v21/preferences_application.xml b/res/xml-v21/preferences_application.xml index c403c06..3b2d453 100644 --- a/res/xml-v21/preferences_application.xml +++ b/res/xml-v21/preferences_application.xml @@ -42,29 +42,10 @@ android:defaultValue="@bool/send_sound_pref_default" android:persistent="true" /> - - - - - + - - - - - + - - - - - + participants = getConversationParticipantsFromRecipients(recipients, refSubId); - return getOrCreateConversation(db, threadId, senderBlocked, participants, false, false, - null); + return getOrCreateConversation(db, threadId, senderBlocked, participants); } /** @@ -190,7 +189,7 @@ public class BugleDatabaseOperations { Assert.isNotMainThread(); final ArrayList recipients = new ArrayList<>(1); recipients.add(recipient); - return getOrCreateConversation(db, threadId, senderBlocked, recipients, false, false, null); + return getOrCreateConversation(db, threadId, senderBlocked, recipients); } /** @@ -200,15 +199,11 @@ public class BugleDatabaseOperations { * @param threadId The message's thread * @param archived Flag whether the conversation should be created archived * @param participants list of conversation participants - * @param noNotification If notification should be disabled - * @param noVibrate If vibrate on notification should be disabled - * @param soundUri If there is custom sound URI * @return a conversation id */ @DoesNotRunOnMainThread public static String getOrCreateConversation(final DatabaseWrapper db, final long threadId, - final boolean archived, final ArrayList participants, - boolean noNotification, boolean noVibrate, String soundUri) { + final boolean archived, final ArrayList participants) { Assert.isNotMainThread(); // Check to see if this conversation is already in out local db cache @@ -231,8 +226,7 @@ public class BugleDatabaseOperations { BugleDatabaseOperations.getOrCreateParticipantInTransaction(db, self); // Create a new conversation conversationId = BugleDatabaseOperations.createConversationInTransaction( - db, threadId, conversationName, selfId, participants, archived, - noNotification, noVibrate, soundUri); + db, threadId, conversationName, selfId, participants, archived); db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -357,15 +351,11 @@ public class BugleDatabaseOperations { * @param threadId The message's thread * @param selfId The selfId to make default for this conversation * @param archived Flag whether the conversation should be created archived - * @param noNotification If notification should be disabled - * @param noVibrate If vibrate on notification should be disabled - * @param soundUri The customized sound * @return The existing conversation id or new conversation id */ static String createConversationInTransaction(final DatabaseWrapper dbWrapper, final long threadId, final String conversationName, final String selfId, - final List participants, final boolean archived, - boolean noNotification, boolean noVibrate, String soundUri) { + final List participants, final boolean archived) { // We want conversation and participant creation to be atomic Assert.isTrue(dbWrapper.getDatabase().inTransaction()); boolean hasEmailAddress = false; @@ -389,15 +379,6 @@ public class BugleDatabaseOperations { if (archived) { values.put(ConversationColumns.ARCHIVE_STATUS, 1); } - if (noNotification) { - values.put(ConversationColumns.NOTIFICATION_ENABLED, 0); - } - if (noVibrate) { - values.put(ConversationColumns.NOTIFICATION_VIBRATION, 0); - } - if (!TextUtils.isEmpty(soundUri)) { - values.put(ConversationColumns.NOTIFICATION_SOUND_URI, soundUri); - } fillParticipantData(values, participants); diff --git a/src/com/android/messaging/datamodel/BugleNotifications.java b/src/com/android/messaging/datamodel/BugleNotifications.java index 9358f14..ae25308 100644 --- a/src/com/android/messaging/datamodel/BugleNotifications.java +++ b/src/com/android/messaging/datamodel/BugleNotifications.java @@ -17,6 +17,8 @@ package com.android.messaging.datamodel; import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; @@ -74,10 +76,10 @@ import com.android.messaging.util.ConversationIdSet; import com.android.messaging.util.ImageUtils; import com.android.messaging.util.LogUtil; import com.android.messaging.util.NotificationPlayer; +import com.android.messaging.util.NotificationsUtil; import com.android.messaging.util.OsUtil; import com.android.messaging.util.PendingIntentConstants; import com.android.messaging.util.PhoneUtils; -import com.android.messaging.util.RingtoneUtil; import com.android.messaging.util.ThreadUtil; import com.android.messaging.util.UriUtil; @@ -173,18 +175,10 @@ public class BugleNotifications { } Assert.isNotMainThread(); checkInitialized(); - - if (!shouldNotify()) { - if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { - LogUtil.v(TAG, "Notifications disabled"); - } - cancel(PendingIntentConstants.SMS_NOTIFICATION_ID); - return; - } else { - if ((coverage & UPDATE_MESSAGES) != 0) { - createMessageNotification(silent, conversationId); - } + if ((coverage & UPDATE_MESSAGES) != 0) { + createMessageNotification(silent, conversationId); } + if ((coverage & UPDATE_ERRORS) != 0) { MessageNotificationState.checkFailedMessages(); } @@ -195,8 +189,7 @@ public class BugleNotifications { * */ public static void playClassZeroNotification() { - final Uri ringtoneUri = RingtoneUtil.getNotificationRingtoneUri(null); - playObservableConversationNotificationSound(ringtoneUri); + playObservableConversationNotificationSound(null); } /** @@ -297,56 +290,6 @@ public class BugleNotifications { } } - /** - * Returns {@code true} if incoming notifications should display a - * notification, {@code false} otherwise. - * - * @return true if the notification should occur - */ - private static boolean shouldNotify() { - // If we're not the default sms app, don't put up any notifications. - if (!PhoneUtils.getDefault().isDefaultSmsApp()) { - return false; - } - - // Now check prefs (i.e. settings) to see if the user turned off notifications. - final BuglePrefs prefs = BuglePrefs.getApplicationPrefs(); - final Context context = Factory.get().getApplicationContext(); - final String prefKey = context.getString(R.string.notifications_enabled_pref_key); - final boolean defaultValue = context.getResources().getBoolean( - R.bool.notifications_enabled_pref_default); - return prefs.getBoolean(prefKey, defaultValue); - } - - /** - * Returns {@code true} if incoming notifications for the given {@link NotificationState} - * should vibrate the device, {@code false} otherwise. - * - * @return true if vibration should be used - */ - public static boolean shouldVibrate(final NotificationState state) { - // The notification should vibrate if the global setting is turned on AND - // the per-conversation setting is turned on (default). - if (!state.getNotificationVibrate()) { - return false; - } else { - final BuglePrefs prefs = BuglePrefs.getApplicationPrefs(); - final Context context = Factory.get().getApplicationContext(); - final String prefKey = context.getString(R.string.notification_vibration_pref_key); - final boolean defaultValue = context.getResources().getBoolean( - R.bool.notification_vibration_pref_default); - return prefs.getBoolean(prefKey, defaultValue); - } - } - - private static Uri getNotificationRingtoneUriForConversationId(final String conversationId) { - final DatabaseWrapper db = DataModel.get().getDatabase(); - final ConversationListItemData convData = - ConversationListItemData.getExistingConversation(db, conversationId); - return RingtoneUtil.getNotificationRingtoneUri( - convData != null ? convData.getNotificationSoundUri() : null); - } - /** * Returns a unique tag to identify a notification. * @@ -420,13 +363,15 @@ public class BugleNotifications { private static void processAndSend(final NotificationState state, final boolean silent, final boolean softSound) { final Context context = Factory.get().getApplicationContext(); - final NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context); - notifBuilder.setCategory(Notification.CATEGORY_MESSAGE); // TODO: Need to fix this for multi conversation notifications to rate limit dings. final String conversationId = state.mConversationIds.first(); + String id = NotificationsUtil.DEFAULT_CHANNEL_ID; + if (NotificationsUtil.getNotificationChannel(context, conversationId) != null) { + id = conversationId; + } + final NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context, id); + notifBuilder.setCategory(Notification.CATEGORY_MESSAGE); - - final Uri ringtoneUri = RingtoneUtil.getNotificationRingtoneUri(state.getRingtoneUri()); // If the notification's conversation is currently observable (focused or in the // conversation list), then play a notification beep at a low volume and don't display an // actual notification. @@ -436,7 +381,7 @@ public class BugleNotifications { "sCurrentlyDisplayedConversationId so NOT showing notification," + " but playing soft sound. conversationId: " + conversationId); } - playObservableConversationNotificationSound(ringtoneUri); + playObservableConversationNotificationSound(conversationId); return; } state.mBaseRequestCode = state.mType; @@ -449,7 +394,7 @@ public class BugleNotifications { notifBuilder.setDeleteIntent(clearIntent); } - updateBuilderAudioVibrate(state, notifBuilder, silent, ringtoneUri, conversationId); + updateBuilderAudioVibrate(state, notifBuilder, silent, conversationId); // Set the content intent PendingIntent destinationIntent; @@ -607,8 +552,7 @@ public class BugleNotifications { if (state == null) { cancel(PendingIntentConstants.SMS_NOTIFICATION_ID); if (softSound && !TextUtils.isEmpty(conversationId)) { - final Uri ringtoneUri = getNotificationRingtoneUriForConversationId(conversationId); - playObservableConversationNotificationSound(ringtoneUri); + playObservableConversationNotificationSound(conversationId); } return; } @@ -646,8 +590,8 @@ public class BugleNotifications { private static void updateBuilderAudioVibrate(final NotificationState state, final NotificationCompat.Builder notifBuilder, final boolean silent, - final Uri ringtoneUri, final String conversationId) { - int defaults = Notification.DEFAULT_LIGHTS; + final String conversationId) { + int defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE; if (!silent) { final BuglePrefs prefs = Factory.get().getApplicationPrefs(); final long latestNotificationTimestamp = prefs.getLong( @@ -669,10 +613,6 @@ public class BugleNotifications { if (lastTime == null || SystemClock.elapsedRealtime() - lastTime > sTimeBetweenDingsMs) { sLastMessageDingTime.put(conversationId, SystemClock.elapsedRealtime()); - notifBuilder.setSound(ringtoneUri); - if (shouldVibrate(state)) { - defaults |= Notification.DEFAULT_VIBRATE; - } } } } @@ -826,8 +766,14 @@ public class BugleNotifications { notificationState.mNotificationBuilder.setLargeIcon(smallBitmap); // Add a wearable page with no visible card so you can more easily see the photo. + String conversationId = notificationState.mConversationIds.first(); + String id = NotificationsUtil.DEFAULT_CHANNEL_ID; + if (NotificationsUtil.getNotificationChannel(context, conversationId) != null) { + id = conversationId; + } final NotificationCompat.Builder photoPageNotifBuilder = - new NotificationCompat.Builder(Factory.get().getApplicationContext()); + new NotificationCompat.Builder(Factory.get().getApplicationContext(), + NotificationsUtil.DEFAULT_CHANNEL_ID); final WearableExtender photoPageWearableExtender = new WearableExtender(); photoPageWearableExtender.setHintShowBackgroundOnly(true); if (attachmentBitmap != null) { @@ -999,6 +945,16 @@ public class BugleNotifications { notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.defaults |= Notification.DEFAULT_LIGHTS; + Context context = Factory.get().getApplicationContext(); + + NotificationsUtil.createNotificationChannelGroup(context, + NotificationsUtil.CONVERSATION_GROUP_NAME, + R.string.notification_channel_messages_title); + NotificationsUtil.createNotificationChannel(context, + NotificationsUtil.DEFAULT_CHANNEL_ID, + R.string.notification_channel_messages_title, + NotificationManager.IMPORTANCE_DEFAULT, + NotificationsUtil.CONVERSATION_GROUP_NAME); notificationManager.notify(notificationTag, type, notification); LogUtil.i(TAG, "Notifying for conversation " + conversationId + "; " @@ -1122,7 +1078,7 @@ public class BugleNotifications { * Play the observable conversation notification sound (it's the regular notification sound, but * played at half-volume) */ - private static void playObservableConversationNotificationSound(final Uri ringtoneUri) { + private static void playObservableConversationNotificationSound(final String conversationId) { final Context context = Factory.get().getApplicationContext(); final AudioManager audioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); @@ -1133,7 +1089,11 @@ public class BugleNotifications { } final NotificationPlayer player = new NotificationPlayer(LogUtil.BUGLE_TAG); - player.play(ringtoneUri, false, + NotificationChannel channel = NotificationsUtil.getNotificationChannel(context, conversationId); + if (channel == null) { + channel = NotificationsUtil.getNotificationChannel(context, NotificationsUtil.DEFAULT_CHANNEL_ID); + } + player.play(channel != null ? channel.getSound() : null, false, AudioManager.STREAM_NOTIFICATION, OBSERVABLE_CONVERSATION_NOTIFICATION_VOLUME); @@ -1228,7 +1188,8 @@ public class BugleNotifications { final PendingIntent destinationIntent = UIIntents.get() .getPendingIntentForConversationActivity(context, conversationId, null /* draft */); - final NotificationCompat.Builder builder = new NotificationCompat.Builder(context); + final NotificationCompat.Builder builder = + new NotificationCompat.Builder(context, NotificationsUtil.DEFAULT_CHANNEL_ID); builder.setTicker(line1) .setContentTitle(line1) .setContentText(line2) @@ -1238,6 +1199,15 @@ public class BugleNotifications { .setSound(UriUtil.getUriForResourceId(context, R.raw.message_failure)); final String tag = context.getPackageName() + ":emergency_sms_error"; + + NotificationsUtil.createNotificationChannelGroup(context, + NotificationsUtil.CONVERSATION_GROUP_NAME, + R.string.notification_channel_messages_title); + NotificationsUtil.createNotificationChannel(context, + NotificationsUtil.DEFAULT_CHANNEL_ID, + R.string.notification_channel_messages_title, + NotificationManager.IMPORTANCE_HIGH, + null); NotificationManagerCompat.from(context).notify( tag, PendingIntentConstants.MSG_SEND_ERROR, diff --git a/src/com/android/messaging/datamodel/DatabaseHelper.java b/src/com/android/messaging/datamodel/DatabaseHelper.java index 2025e2c..b8f97cf 100644 --- a/src/com/android/messaging/datamodel/DatabaseHelper.java +++ b/src/com/android/messaging/datamodel/DatabaseHelper.java @@ -133,15 +133,6 @@ public class DatabaseHelper extends SQLiteOpenHelper { /* Participant count not including self (so will be 1 for 1:1 or bigger for group) */ public static final String PARTICIPANT_COUNT = "participant_count"; - /* Should notifications be enabled for this conversation? */ - public static final String NOTIFICATION_ENABLED = "notification_enabled"; - - /* Notification sound used for the conversation */ - public static final String NOTIFICATION_SOUND_URI = "notification_sound_uri"; - - /* Should vibrations be enabled for the conversation's notification? */ - public static final String NOTIFICATION_VIBRATION = "notification_vibration"; - /* Conversation recipients include email address */ public static final String INCLUDE_EMAIL_ADDRESS = "include_email_addr"; @@ -181,9 +172,6 @@ public class DatabaseHelper extends SQLiteOpenHelper { + ConversationColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION + " TEXT, " + ConversationColumns.CURRENT_SELF_ID + " TEXT, " + ConversationColumns.PARTICIPANT_COUNT + " INT DEFAULT(0), " - + ConversationColumns.NOTIFICATION_ENABLED + " INT DEFAULT(1), " - + ConversationColumns.NOTIFICATION_SOUND_URI + " TEXT, " - + ConversationColumns.NOTIFICATION_VIBRATION + " INT DEFAULT(1), " + ConversationColumns.INCLUDE_EMAIL_ADDRESS + " INT DEFAULT(0), " + ConversationColumns.SMS_SERVICE_CENTER + " TEXT ," + ConversationColumns.IS_ENTERPRISE + " INT DEFAULT(0)" diff --git a/src/com/android/messaging/datamodel/MessageNotificationState.java b/src/com/android/messaging/datamodel/MessageNotificationState.java index a7af329..4f62599 100644 --- a/src/com/android/messaging/datamodel/MessageNotificationState.java +++ b/src/com/android/messaging/datamodel/MessageNotificationState.java @@ -198,15 +198,6 @@ public abstract class MessageNotificationState extends NotificationState { // line infos is capped. int mTotalMessageCount; - // Custom ringtone if set - final String mRingtoneUri; - - // Should notification be enabled for this conversation? - final boolean mNotificationEnabled; - - // Should notifications vibrate for this conversation? - final boolean mNotificationVibrate; - // Avatar uri of sender final Uri mAvatarUri; @@ -225,9 +216,6 @@ public abstract class MessageNotificationState extends NotificationState { final boolean includeEmailAddress, final long receivedTimestamp, final String selfParticipantId, - final String ringtoneUri, - final boolean notificationEnabled, - final boolean notificationVibrate, final Uri avatarUri, final Uri contactUri, final int subId, @@ -240,11 +228,8 @@ public abstract class MessageNotificationState extends NotificationState { mSelfParticipantId = selfParticipantId; mLineInfos = new ArrayList(); mTotalMessageCount = 0; - mRingtoneUri = ringtoneUri; mAvatarUri = avatarUri; mContactUri = contactUri; - mNotificationEnabled = notificationEnabled; - mNotificationVibrate = notificationVibrate; mSubId = subId; mParticipantCount = participantCount; } @@ -876,10 +861,6 @@ public abstract class MessageNotificationState extends NotificationState { if (currConvInfo == null) { final ConversationListItemData convData = ConversationListItemData.getExistingConversation(db, convId); - if (!convData.getNotificationEnabled()) { - // Skip conversations that have notifications disabled. - continue; - } final int subId = BugleDatabaseOperations.getSelfSubscriptionId(db, convData.getSelfId()); groupConversationName = convData.getName(); @@ -894,9 +875,6 @@ public abstract class MessageNotificationState extends NotificationState { convData.getIncludeEmailAddress(), convMessageData.getReceivedTimeStamp(), convData.getSelfId(), - convData.getNotificationSoundUri(), - convData.getNotificationEnabled(), - convData.getNotifiationVibrate(), avatarUri, convMessageData.getSenderContactLookupUri(), subId, @@ -1107,22 +1085,6 @@ public abstract class MessageNotificationState extends NotificationState { return BugleNotifications.LOCAL_SMS_NOTIFICATION; } - @Override - public String getRingtoneUri() { - if (mConvList.mConvInfos.size() > 0) { - return mConvList.mConvInfos.get(0).mRingtoneUri; - } - return null; - } - - @Override - public boolean getNotificationVibrate() { - if (mConvList.mConvInfos.size() > 0) { - return mConvList.mConvInfos.get(0).mNotificationVibrate; - } - return false; - } - protected CharSequence getTicker() { return BugleNotifications.buildColonSeparatedMessage( mTickerSender != null ? mTickerSender : mTitle, diff --git a/src/com/android/messaging/datamodel/NotificationState.java b/src/com/android/messaging/datamodel/NotificationState.java index 576a692..4c11537 100644 --- a/src/com/android/messaging/datamodel/NotificationState.java +++ b/src/com/android/messaging/datamodel/NotificationState.java @@ -144,15 +144,6 @@ public abstract class NotificationState { */ public abstract int getPriority(); - /** @return custom ringtone URI or null if not set */ - public String getRingtoneUri() { - return null; - } - - public boolean getNotificationVibrate() { - return false; - } - public long getLatestReceivedTimestamp() { return Long.MIN_VALUE; } diff --git a/src/com/android/messaging/datamodel/SyncManager.java b/src/com/android/messaging/datamodel/SyncManager.java index 28fc696..e5d4935 100644 --- a/src/com/android/messaging/datamodel/SyncManager.java +++ b/src/com/android/messaging/datamodel/SyncManager.java @@ -51,33 +51,14 @@ public class SyncManager { */ public static class ConversationCustomization { private final boolean mArchived; - private final boolean mMuted; - private final boolean mNoVibrate; - private final String mNotificationSoundUri; - public ConversationCustomization(final boolean archived, final boolean muted, - final boolean noVibrate, final String notificationSoundUri) { + public ConversationCustomization(final boolean archived) { mArchived = archived; - mMuted = muted; - mNoVibrate = noVibrate; - mNotificationSoundUri = notificationSoundUri; } public boolean isArchived() { return mArchived; } - - public boolean isMuted() { - return mMuted; - } - - public boolean noVibrate() { - return mNoVibrate; - } - - public String getNotificationSoundUri() { - return mNotificationSoundUri; - } } SyncManager() { @@ -436,15 +417,13 @@ public class SyncManager { if (customization != null) { // There is user customization we need to recover conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - customization.isArchived(), participants, customization.isMuted(), - customization.noVibrate(), customization.getNotificationSoundUri()); + customization.isArchived(), participants); if (customization.isArchived()) { mArchivedConversations.add(conversationId); } } else { conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - false/*archived*/, participants, false/*noNotification*/, - false/*noVibrate*/, null/*soundUri*/); + false/*archived*/, participants); } if (conversationId != null) { diff --git a/src/com/android/messaging/datamodel/action/DeleteConversationAction.java b/src/com/android/messaging/datamodel/action/DeleteConversationAction.java index a00f6d6..6b81aa6 100644 --- a/src/com/android/messaging/datamodel/action/DeleteConversationAction.java +++ b/src/com/android/messaging/datamodel/action/DeleteConversationAction.java @@ -35,6 +35,7 @@ import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.sms.MmsUtils; import com.android.messaging.util.Assert; import com.android.messaging.util.LogUtil; +import com.android.messaging.util.NotificationsUtil; import com.android.messaging.widget.WidgetConversationProvider; import java.util.ArrayList; @@ -118,6 +119,10 @@ public class DeleteConversationAction extends Action implements Parcelable { + " has an invalid telephony thread id; will delete messages individually"); deleteConversationMessagesFromTelephony(); } + + // Finally, remove the conversation specific notification channel + NotificationsUtil.deleteNotificationChannel(Factory.get().getApplicationContext(), + conversationId); } else { LogUtil.e(TAG, "DeleteConversationAction: conversationId is empty"); } diff --git a/src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java b/src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java index b262141..7dd09c1 100644 --- a/src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java +++ b/src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java @@ -110,7 +110,7 @@ public class GetOrCreateConversationAction extends Action implements Parcelable } final String conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - false, participants, false, false, null); + false, participants); return conversationId; } diff --git a/src/com/android/messaging/datamodel/action/InsertNewMessageAction.java b/src/com/android/messaging/datamodel/action/InsertNewMessageAction.java index 2567ca9..783372e 100644 --- a/src/com/android/messaging/datamodel/action/InsertNewMessageAction.java +++ b/src/com/android/messaging/datamodel/action/InsertNewMessageAction.java @@ -273,7 +273,7 @@ public class InsertNewMessageAction extends Action implements Parcelable { } final String conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - false, participants, false, false, null); + false, participants); final ParticipantData self = BugleDatabaseOperations.getOrCreateSelf(db, subId); diff --git a/src/com/android/messaging/datamodel/action/UpdateConversationOptionsAction.java b/src/com/android/messaging/datamodel/action/UpdateConversationOptionsAction.java deleted file mode 100644 index 6c9e739..0000000 --- a/src/com/android/messaging/datamodel/action/UpdateConversationOptionsAction.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.messaging.datamodel.action; - -import android.content.ContentValues; -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.messaging.datamodel.BugleDatabaseOperations; -import com.android.messaging.datamodel.DataModel; -import com.android.messaging.datamodel.DatabaseHelper.ConversationColumns; -import com.android.messaging.datamodel.DatabaseWrapper; -import com.android.messaging.datamodel.MessagingContentProvider; -import com.android.messaging.util.Assert; - -/** - * Action used to update conversation options such as notification settings. - */ -public class UpdateConversationOptionsAction extends Action - implements Parcelable { - /** - * Enable/disable conversation notifications. - */ - public static void enableConversationNotifications(final String conversationId, - final boolean enableNotification) { - Assert.notNull(conversationId); - - final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction( - conversationId, enableNotification, null, null); - action.start(); - } - - /** - * Sets conversation notification sound. - */ - public static void setConversationNotificationSound(final String conversationId, - final String ringtoneUri) { - Assert.notNull(conversationId); - - final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction( - conversationId, null, ringtoneUri, null); - action.start(); - } - - /** - * Enable/disable vibrations for conversation notification. - */ - public static void enableVibrationForConversationNotification(final String conversationId, - final boolean enableVibration) { - Assert.notNull(conversationId); - - final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction( - conversationId, null, null, enableVibration); - action.start(); - } - - private static final String KEY_CONVERSATION_ID = "conversation_id"; - - // Keys for all settable settings. - private static final String KEY_ENABLE_NOTIFICATION = "enable_notification"; - private static final String KEY_RINGTONE_URI = "ringtone_uri"; - private static final String KEY_ENABLE_VIBRATION = "enable_vibration"; - - protected UpdateConversationOptionsAction(final String conversationId, - final Boolean enableNotification, final String ringtoneUri, - final Boolean enableVibration) { - Assert.notNull(conversationId); - actionParameters.putString(KEY_CONVERSATION_ID, conversationId); - if (enableNotification != null) { - actionParameters.putBoolean(KEY_ENABLE_NOTIFICATION, enableNotification); - } - - if (ringtoneUri != null) { - actionParameters.putString(KEY_RINGTONE_URI, ringtoneUri); - } - - if (enableVibration != null) { - actionParameters.putBoolean(KEY_ENABLE_VIBRATION, enableVibration); - } - } - - protected void putOptionValuesInTransaction(final ContentValues values, - final DatabaseWrapper dbWrapper) { - Assert.isTrue(dbWrapper.getDatabase().inTransaction()); - if (actionParameters.containsKey(KEY_ENABLE_NOTIFICATION)) { - values.put(ConversationColumns.NOTIFICATION_ENABLED, - actionParameters.getBoolean(KEY_ENABLE_NOTIFICATION)); - } - - if (actionParameters.containsKey(KEY_RINGTONE_URI)) { - values.put(ConversationColumns.NOTIFICATION_SOUND_URI, - actionParameters.getString(KEY_RINGTONE_URI)); - } - - if (actionParameters.containsKey(KEY_ENABLE_VIBRATION)) { - values.put(ConversationColumns.NOTIFICATION_VIBRATION, - actionParameters.getBoolean(KEY_ENABLE_VIBRATION)); - } - } - - @Override - protected Object executeAction() { - final String conversationId = actionParameters.getString(KEY_CONVERSATION_ID); - - final DatabaseWrapper db = DataModel.get().getDatabase(); - db.beginTransaction(); - try { - final ContentValues values = new ContentValues(); - putOptionValuesInTransaction(values, db); - - BugleDatabaseOperations.updateConversationRowIfExists(db, conversationId, values); - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - MessagingContentProvider.notifyConversationMetadataChanged(conversationId); - return null; - } - - protected UpdateConversationOptionsAction(final Parcel in) { - super(in); - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - @Override - public UpdateConversationOptionsAction createFromParcel(final Parcel in) { - return new UpdateConversationOptionsAction(in); - } - - @Override - public UpdateConversationOptionsAction[] newArray(final int size) { - return new UpdateConversationOptionsAction[size]; - } - }; - - @Override - public void writeToParcel(final Parcel parcel, final int flags) { - writeActionToParcel(parcel, flags); - } -} diff --git a/src/com/android/messaging/datamodel/data/ConversationListItemData.java b/src/com/android/messaging/datamodel/data/ConversationListItemData.java index f627a09..46d4b64 100644 --- a/src/com/android/messaging/datamodel/data/ConversationListItemData.java +++ b/src/com/android/messaging/datamodel/data/ConversationListItemData.java @@ -52,9 +52,6 @@ public class ConversationListItemData { private String mOtherParticipantNormalizedDestination; private String mSelfId; private int mParticipantCount; - private boolean mNotificationEnabled; - private String mNotificationSoundUri; - private boolean mNotificationVibrate; private boolean mIncludeEmailAddress; private int mMessageStatus; private int mMessageRawTelephonyStatus; @@ -92,9 +89,6 @@ public class ConversationListItemData { INDEX_OTHER_PARTICIPANT_NORMALIZED_DESTINATION); mSelfId = cursor.getString(INDEX_SELF_ID); mParticipantCount = cursor.getInt(INDEX_PARTICIPANT_COUNT); - mNotificationEnabled = cursor.getInt(INDEX_NOTIFICATION_ENABLED) == 1; - mNotificationSoundUri = cursor.getString(INDEX_NOTIFICATION_SOUND_URI); - mNotificationVibrate = cursor.getInt(INDEX_NOTIFICATION_VIBRATION) == 1; mIncludeEmailAddress = cursor.getInt(INDEX_INCLUDE_EMAIL_ADDRESS) == 1; mMessageStatus = cursor.getInt(INDEX_MESSAGE_STATUS); mMessageRawTelephonyStatus = cursor.getInt(INDEX_MESSAGE_RAW_TELEPHONY_STATUS); @@ -199,18 +193,6 @@ public class ConversationListItemData { return mIncludeEmailAddress; } - public boolean getNotificationEnabled() { - return mNotificationEnabled; - } - - public String getNotificationSoundUri() { - return mNotificationSoundUri; - } - - public boolean getNotifiationVibrate() { - return mNotificationVibrate; - } - public final boolean getIsFailedStatus() { return (mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_FAILED || mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_FAILED_EMERGENCY_NUMBER || @@ -328,12 +310,6 @@ public class ConversationListItemData { + " as " + ConversationListViewColumns.PREVIEW_CONTENT_TYPE + ", " + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PARTICIPANT_COUNT + " as " + ConversationListViewColumns.PARTICIPANT_COUNT + ", " - + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_ENABLED - + " as " + ConversationListViewColumns.NOTIFICATION_ENABLED + ", " - + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_SOUND_URI - + " as " + ConversationListViewColumns.NOTIFICATION_SOUND_URI + ", " - + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_VIBRATION - + " as " + ConversationListViewColumns.NOTIFICATION_VIBRATION + ", " + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.INCLUDE_EMAIL_ADDRESS + " as " + ConversationListViewColumns.INCLUDE_EMAIL_ADDRESS + ", " @@ -396,9 +372,6 @@ public class ConversationListItemData { ConversationColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION; static final String CURRENT_SELF_ID = ConversationColumns.CURRENT_SELF_ID; static final String PARTICIPANT_COUNT = ConversationColumns.PARTICIPANT_COUNT; - static final String NOTIFICATION_ENABLED = ConversationColumns.NOTIFICATION_ENABLED; - static final String NOTIFICATION_SOUND_URI = ConversationColumns.NOTIFICATION_SOUND_URI; - static final String NOTIFICATION_VIBRATION = ConversationColumns.NOTIFICATION_VIBRATION; static final String INCLUDE_EMAIL_ADDRESS = ConversationColumns.INCLUDE_EMAIL_ADDRESS; static final String MESSAGE_STATUS = MessageColumns.STATUS; @@ -424,9 +397,6 @@ public class ConversationListItemData { ConversationListViewColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION, ConversationListViewColumns.PARTICIPANT_COUNT, ConversationListViewColumns.CURRENT_SELF_ID, - ConversationListViewColumns.NOTIFICATION_ENABLED, - ConversationListViewColumns.NOTIFICATION_SOUND_URI, - ConversationListViewColumns.NOTIFICATION_VIBRATION, ConversationListViewColumns.INCLUDE_EMAIL_ADDRESS, ConversationListViewColumns.MESSAGE_STATUS, ConversationListViewColumns.SHOW_DRAFT, @@ -456,23 +426,20 @@ public class ConversationListItemData { private static final int INDEX_OTHER_PARTICIPANT_NORMALIZED_DESTINATION = 10; private static final int INDEX_PARTICIPANT_COUNT = 11; private static final int INDEX_SELF_ID = 12; - private static final int INDEX_NOTIFICATION_ENABLED = 13; - private static final int INDEX_NOTIFICATION_SOUND_URI = 14; - private static final int INDEX_NOTIFICATION_VIBRATION = 15; - private static final int INDEX_INCLUDE_EMAIL_ADDRESS = 16; - private static final int INDEX_MESSAGE_STATUS = 17; - private static final int INDEX_SHOW_DRAFT = 18; - private static final int INDEX_DRAFT_PREVIEW_URI = 19; - private static final int INDEX_DRAFT_PREVIEW_CONTENT_TYPE = 20; - private static final int INDEX_DRAFT_SNIPPET_TEXT = 21; - private static final int INDEX_ARCHIVE_STATUS = 22; - private static final int INDEX_MESSAGE_ID = 23; - private static final int INDEX_SUBJECT_TEXT = 24; - private static final int INDEX_DRAFT_SUBJECT_TEXT = 25; - private static final int INDEX_MESSAGE_RAW_TELEPHONY_STATUS = 26; - private static final int INDEX_SNIPPET_SENDER_FIRST_NAME = 27; - private static final int INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION = 28; - private static final int INDEX_IS_ENTERPRISE = 29; + private static final int INDEX_INCLUDE_EMAIL_ADDRESS = 13; + private static final int INDEX_MESSAGE_STATUS = 14; + private static final int INDEX_SHOW_DRAFT = 15; + private static final int INDEX_DRAFT_PREVIEW_URI = 16; + private static final int INDEX_DRAFT_PREVIEW_CONTENT_TYPE = 17; + private static final int INDEX_DRAFT_SNIPPET_TEXT = 18; + private static final int INDEX_ARCHIVE_STATUS = 19; + private static final int INDEX_MESSAGE_ID = 20; + private static final int INDEX_SUBJECT_TEXT = 21; + private static final int INDEX_DRAFT_SUBJECT_TEXT = 22; + private static final int INDEX_MESSAGE_RAW_TELEPHONY_STATUS = 23; + private static final int INDEX_SNIPPET_SENDER_FIRST_NAME = 24; + private static final int INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION = 25; + private static final int INDEX_IS_ENTERPRISE = 26; private static final String DIVIDER_TEXT = ", "; diff --git a/src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java b/src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java index 650a037..b8b4a41 100644 --- a/src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java +++ b/src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java @@ -26,7 +26,6 @@ import android.os.Bundle; import com.android.messaging.datamodel.BoundCursorLoader; import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.action.BugleActionToasts; -import com.android.messaging.datamodel.action.UpdateConversationOptionsAction; import com.android.messaging.datamodel.action.UpdateDestinationBlockedAction; import com.android.messaging.datamodel.binding.BindableData; import com.android.messaging.datamodel.binding.BindingBase; @@ -74,7 +73,7 @@ public class PeopleAndOptionsData extends BindableData implements final Uri uri = MessagingContentProvider.buildConversationMetadataUri(mConversationId); return new BoundCursorLoader(bindingId, mContext, uri, - PeopleOptionsItemData.PROJECTION, null, null, null); + new String[]{}, null, null, null); } case PARTICIPANT_LOADER: { @@ -169,33 +168,6 @@ public class PeopleAndOptionsData extends BindableData implements } } - public void enableConversationNotifications(final BindingBase binding, - final boolean enable) { - final String bindingId = binding.getBindingId(); - if (isBound(bindingId)) { - UpdateConversationOptionsAction.enableConversationNotifications( - mConversationId, enable); - } - } - - public void setConversationNotificationSound(final BindingBase binding, - final String ringtoneUri) { - final String bindingId = binding.getBindingId(); - if (isBound(bindingId)) { - UpdateConversationOptionsAction.setConversationNotificationSound(mConversationId, - ringtoneUri); - } - } - - public void enableConversationNotificationVibration( - final BindingBase binding, final boolean enable) { - final String bindingId = binding.getBindingId(); - if (isBound(bindingId)) { - UpdateConversationOptionsAction.enableVibrationForConversationNotification( - mConversationId, enable); - } - } - public void setDestinationBlocked(final BindingBase binding, final boolean blocked) { final String bindingId = binding.getBindingId(); @@ -207,4 +179,8 @@ public class PeopleAndOptionsData extends BindableData implements BugleActionToasts.makeUpdateDestinationBlockedActionListener(mContext)); } } + + public String getConversationId() { + return mConversationId; + } } diff --git a/src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java b/src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java index 5af6a30..7441afc 100644 --- a/src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java +++ b/src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java @@ -17,44 +17,19 @@ package com.android.messaging.datamodel.data; import android.content.Context; import android.database.Cursor; -import android.media.Ringtone; -import android.media.RingtoneManager; import android.net.Uri; import com.android.messaging.R; import com.android.messaging.datamodel.data.ConversationListItemData.ConversationListViewColumns; import com.android.messaging.util.Assert; -import com.android.messaging.util.RingtoneUtil; public class PeopleOptionsItemData { - public static final String[] PROJECTION = { - ConversationListViewColumns.NOTIFICATION_ENABLED, - ConversationListViewColumns.NOTIFICATION_SOUND_URI, - ConversationListViewColumns.NOTIFICATION_VIBRATION, - }; - - // Column index for query projection. - private static final int INDEX_NOTIFICATION_ENABLED = 0; - private static final int INDEX_NOTIFICATION_SOUND_URI = 1; - private static final int INDEX_NOTIFICATION_VIBRATION = 2; - // Identification for each setting that's surfaced to the UI layer. - public static final int SETTING_NOTIFICATION_ENABLED = 0; - public static final int SETTING_NOTIFICATION_SOUND_URI = 1; - public static final int SETTING_NOTIFICATION_VIBRATION = 2; - public static final int SETTING_BLOCKED = 3; - public static final int SETTINGS_COUNT = 4; - - // Type of UI switch to show for the toggle button. - public static final int TOGGLE_TYPE_CHECKBOX = 0; - public static final int TOGGLE_TYPE_SWITCH = 1; + public static final int SETTING_NOTIFICATION = 0; + public static final int SETTING_BLOCKED = 1; + public static final int SETTINGS_COUNT = 2; private String mTitle; - private String mSubtitle; - private Uri mRingtoneUri; - private boolean mCheckable; - private boolean mChecked; - private boolean mEnabled; private int mItemId; private ParticipantData mOtherParticipant; @@ -71,41 +46,12 @@ public class PeopleOptionsItemData { */ public void bind( final Cursor cursor, final ParticipantData otherParticipant, final int settingType) { - mSubtitle = null; - mRingtoneUri = null; - mCheckable = true; - mEnabled = true; mItemId = settingType; mOtherParticipant = otherParticipant; - final boolean notificationEnabled = cursor.getInt(INDEX_NOTIFICATION_ENABLED) == 1; switch (settingType) { - case SETTING_NOTIFICATION_ENABLED: + case SETTING_NOTIFICATION: mTitle = mContext.getString(R.string.notifications_enabled_conversation_pref_title); - mChecked = notificationEnabled; - break; - - case SETTING_NOTIFICATION_SOUND_URI: - mTitle = mContext.getString(R.string.notification_sound_pref_title); - final String ringtoneString = cursor.getString(INDEX_NOTIFICATION_SOUND_URI); - Uri ringtoneUri = RingtoneUtil.getNotificationRingtoneUri(ringtoneString); - - mSubtitle = mContext.getString(R.string.silent_ringtone); - if (ringtoneUri != null) { - final Ringtone ringtone = RingtoneManager.getRingtone(mContext, ringtoneUri); - if (ringtone != null) { - mSubtitle = ringtone.getTitle(mContext); - } - } - mCheckable = false; - mRingtoneUri = ringtoneUri; - mEnabled = notificationEnabled; - break; - - case SETTING_NOTIFICATION_VIBRATION: - mTitle = mContext.getString(R.string.notification_vibrate_pref_title); - mChecked = cursor.getInt(INDEX_NOTIFICATION_VIBRATION) == 1; - mEnabled = notificationEnabled; break; case SETTING_BLOCKED: @@ -113,7 +59,6 @@ public class PeopleOptionsItemData { final int resourceId = otherParticipant.isBlocked() ? R.string.unblock_contact_title : R.string.block_contact_title; mTitle = mContext.getString(resourceId, otherParticipant.getDisplayDestination()); - mCheckable = false; break; default: @@ -125,30 +70,10 @@ public class PeopleOptionsItemData { return mTitle; } - public String getSubtitle() { - return mSubtitle; - } - - public boolean getCheckable() { - return mCheckable; - } - - public boolean getChecked() { - return mChecked; - } - - public boolean getEnabled() { - return mEnabled; - } - public int getItemId() { return mItemId; } - public Uri getRingtoneUri() { - return mRingtoneUri; - } - public ParticipantData getOtherParticipant() { return mOtherParticipant; } diff --git a/src/com/android/messaging/receiver/SmsReceiver.java b/src/com/android/messaging/receiver/SmsReceiver.java index f1f9bcd..c36e9ab 100644 --- a/src/com/android/messaging/receiver/SmsReceiver.java +++ b/src/com/android/messaging/receiver/SmsReceiver.java @@ -252,11 +252,6 @@ public final class SmsReceiver extends BroadcastReceiver { protected Style build(Builder builder) { return null; } - - @Override - public boolean getNotificationVibrate() { - return true; - } } public static void postNewMessageSecondaryUserNotification() { @@ -282,10 +277,7 @@ public final class SmsReceiver extends BroadcastReceiver { final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(Factory.get().getApplicationContext()); - int defaults = Notification.DEFAULT_LIGHTS; - if (BugleNotifications.shouldVibrate(new SecondaryUserNotificationState())) { - defaults |= Notification.DEFAULT_VIBRATE; - } + int defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE; notification.defaults = defaults; notificationManager.notify(getNotificationTag(), diff --git a/src/com/android/messaging/ui/UIIntents.java b/src/com/android/messaging/ui/UIIntents.java index 3eabbdc..e028de4 100644 --- a/src/com/android/messaging/ui/UIIntents.java +++ b/src/com/android/messaging/ui/UIIntents.java @@ -256,16 +256,6 @@ public abstract class UIIntents { */ public abstract Intent getViewUrlIntent(final String url); - /** - * Get an intent to launch the ringtone picker - * @param title the title to show in the ringtone picker - * @param existingUri the currently set uri - * @param defaultUri the default uri if none is currently set - * @param toneType type of ringtone to pick, maybe any of RingtoneManager.TYPE_* - */ - public abstract Intent getRingtonePickerIntent(final String title, final Uri existingUri, - final Uri defaultUri, final int toneType); - /** * Get an intent to launch the wireless alert viewer. */ diff --git a/src/com/android/messaging/ui/UIIntentsImpl.java b/src/com/android/messaging/ui/UIIntentsImpl.java index 90eb376..b156c90 100644 --- a/src/com/android/messaging/ui/UIIntentsImpl.java +++ b/src/com/android/messaging/ui/UIIntentsImpl.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.Point; import android.graphics.Rect; -import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.Contacts; @@ -451,16 +450,6 @@ public class UIIntentsImpl extends UIIntents { return resultPendingIntent; } - @Override - public Intent getRingtonePickerIntent(final String title, final Uri existingUri, - final Uri defaultUri, final int toneType) { - return new Intent(RingtoneManager.ACTION_RINGTONE_PICKER) - .putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, toneType) - .putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, title) - .putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, existingUri) - .putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, defaultUri); - } - @Override public PendingIntent getPendingIntentForLowStorageNotifications(final Context context) { final TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); diff --git a/src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java b/src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java index 1d67308..19979a9 100644 --- a/src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java +++ b/src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java @@ -18,18 +18,12 @@ package com.android.messaging.ui.appsettings; import android.app.FragmentTransaction; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.media.Ringtone; -import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; -import android.preference.RingtonePreference; import android.preference.SwitchPreference; -import android.preference.TwoStatePreference; import android.provider.Settings; import androidx.core.app.NavUtils; import android.text.TextUtils; @@ -85,14 +79,10 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { return super.onOptionsItemSelected(item); } - public static class ApplicationSettingsFragment extends PreferenceFragment implements - OnSharedPreferenceChangeListener { + public static class ApplicationSettingsFragment extends PreferenceFragment { - private String mNotificationsEnabledPreferenceKey; - private TwoStatePreference mNotificationsEnabledPreference; - private String mRingtonePreferenceKey; - private RingtonePreference mRingtonePreference; - private Preference mVibratePreference; + private String mNotificationsPreferenceKey; + private Preference mNotificationsPreference; private String mSmsDisabledPrefKey; private Preference mSmsDisabledPreference; private String mSmsEnabledPrefKey; @@ -112,14 +102,9 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { getPreferenceManager().setSharedPreferencesName(BuglePrefs.SHARED_PREFERENCES_NAME); addPreferencesFromResource(R.xml.preferences_application); - mNotificationsEnabledPreferenceKey = - getString(R.string.notifications_enabled_pref_key); - mNotificationsEnabledPreference = (TwoStatePreference) findPreference( - mNotificationsEnabledPreferenceKey); - mRingtonePreferenceKey = getString(R.string.notification_sound_pref_key); - mRingtonePreference = (RingtonePreference) findPreference(mRingtonePreferenceKey); - mVibratePreference = findPreference( - getString(R.string.notification_vibration_pref_key)); + mNotificationsPreferenceKey = + getString(R.string.notifications_pref_key); + mNotificationsPreference = findPreference(mNotificationsPreferenceKey); mSmsDisabledPrefKey = getString(R.string.sms_disabled_pref_key); mSmsDisabledPreference = findPreference(mSmsDisabledPrefKey); mSmsEnabledPrefKey = getString(R.string.sms_enabled_pref_key); @@ -130,9 +115,6 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { (SwitchPreference) findPreference(mSwipeRightToDeleteConversationkey); mIsSmsPreferenceClicked = false; - final SharedPreferences prefs = getPreferenceScreen().getSharedPreferences(); - updateSoundSummary(prefs); - if (!DebugUtils.isDebugEnabled()) { final Preference debugCategory = findPreference(getString( R.string.debug_pref_key)); @@ -154,8 +136,13 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { } @Override - public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (preference.getKey() == mNotificationsPreferenceKey) { + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName()); + startActivity(intent); + } if (preference.getKey() == mSmsDisabledPrefKey || preference.getKey() == mSmsEnabledPrefKey) { mIsSmsPreferenceClicked = true; @@ -163,35 +150,6 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { return super.onPreferenceTreeClick(preferenceScreen, preference); } - private void updateSoundSummary(final SharedPreferences sharedPreferences) { - // The silent ringtone just returns an empty string - String ringtoneName = mRingtonePreference.getContext().getString( - R.string.silent_ringtone); - - String ringtoneString = sharedPreferences.getString(mRingtonePreferenceKey, null); - - // Bootstrap the default setting in the preferences so that we have a valid selection - // in the dialog the first time that the user opens it. - if (ringtoneString == null) { - ringtoneString = Settings.System.DEFAULT_NOTIFICATION_URI.toString(); - final SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(mRingtonePreferenceKey, ringtoneString); - editor.apply(); - } - - if (!TextUtils.isEmpty(ringtoneString)) { - final Uri ringtoneUri = Uri.parse(ringtoneString); - final Ringtone tone = RingtoneManager.getRingtone(mRingtonePreference.getContext(), - ringtoneUri); - - if (tone != null) { - ringtoneName = tone.getTitle(mRingtonePreference.getContext()); - } - } - - mRingtonePreference.setSummary(ringtoneName); - } - private void updateSmsEnabledPreferences() { if (!OsUtil.isAtLeastKLP()) { getPreferenceScreen().removePreference(mSmsDisabledPreference); @@ -222,48 +180,14 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity { getPreferenceScreen().removePreference(mSmsEnabledPreference); mSmsDisabledPreference.setSummary(defaultSmsAppLabel); } - updateNotificationsPreferences(); } mIsSmsPreferenceClicked = false; } - private void updateNotificationsPreferences() { - final boolean canNotify = !OsUtil.isAtLeastKLP() - || PhoneUtils.getDefault().isDefaultSmsApp(); - mNotificationsEnabledPreference.setEnabled(canNotify); - } - - @Override - public void onStart() { - super.onStart(); - // We do this on start rather than on resume because the sound picker is in a - // separate activity. - getPreferenceScreen().getSharedPreferences() - .registerOnSharedPreferenceChangeListener(this); - } - @Override public void onResume() { super.onResume(); updateSmsEnabledPreferences(); - updateNotificationsPreferences(); - } - - @Override - public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, - final String key) { - if (key.equals(mNotificationsEnabledPreferenceKey)) { - updateNotificationsPreferences(); - } else if (key.equals(mRingtonePreferenceKey)) { - updateSoundSummary(sharedPreferences); - } - } - - @Override - public void onStop() { - super.onStop(); - getPreferenceScreen().getSharedPreferences() - .unregisterOnSharedPreferenceChangeListener(this); } } } diff --git a/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java b/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java index f3de0ab..5fd7315 100644 --- a/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java +++ b/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java @@ -30,7 +30,6 @@ import android.view.View; import com.android.messaging.R; import com.android.messaging.datamodel.action.DeleteConversationAction; import com.android.messaging.datamodel.action.UpdateConversationArchiveStatusAction; -import com.android.messaging.datamodel.action.UpdateConversationOptionsAction; import com.android.messaging.datamodel.action.UpdateDestinationBlockedAction; import com.android.messaging.datamodel.data.ConversationListData; import com.android.messaging.datamodel.data.ConversationListItemData; @@ -189,23 +188,6 @@ public abstract class AbstractConversationListActivity extends BugleActionBarAc exitMultiSelectState(); } - @Override - public void onActionBarNotification(final Iterable conversations, - final boolean isNotificationOn) { - for (final SelectedConversation conversation : conversations) { - UpdateConversationOptionsAction.enableConversationNotifications( - conversation.conversationId, isNotificationOn); - } - - final int textId = isNotificationOn ? - R.string.notification_on_toast_message : R.string.notification_off_toast_message; - final String message = getResources().getString(textId, 1); - UiUtils.showSnackBar(this, findViewById(android.R.id.list), message, - null /* undoRunnable */, - SnackBar.Action.SNACK_BAR_UNDO, mConversationListFragment.getSnackBarInteractions()); - exitMultiSelectState(); - } - @Override public void onActionBarAddContact(final SelectedConversation conversation) { final Uri avatarUri; diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java b/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java index de036fc..9331d10 100644 --- a/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java +++ b/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java @@ -127,7 +127,6 @@ public class ConversationListItemView extends FrameLayout implements OnClickList private TextView mTimestampTextView; private ContactIconView mContactIconView; private ImageView mContactCheckmarkView; - private ImageView mNotificationBellView; private ImageView mFailedStatusIconView; private ImageView mCrossSwipeArchiveLeftImageView; private ImageView mCrossSwipeArchiveRightImageView; @@ -153,7 +152,6 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mTimestampTextView = (TextView) findViewById(R.id.conversation_timestamp); mContactIconView = (ContactIconView) findViewById(R.id.conversation_icon); mContactCheckmarkView = (ImageView) findViewById(R.id.conversation_checkmark); - mNotificationBellView = (ImageView) findViewById(R.id.conversation_notification_bell); mFailedStatusIconView = (ImageView) findViewById(R.id.conversation_failed_status_icon); mCrossSwipeArchiveLeftImageView = (ImageView) findViewById(R.id.crossSwipeArchiveIconLeft); mCrossSwipeArchiveRightImageView = @@ -503,9 +501,6 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mAudioAttachmentView.setOnLongClickListener(this); mAudioAttachmentView.setVisibility(audioPreviewVisiblity); - final int notificationBellVisiblity = mData.getNotificationEnabled() ? GONE : VISIBLE; - mNotificationBellView.setVisibility(notificationBellVisiblity); - if (PrefsUtils.isSwipeRightToDeleteEnabled()) { mCrossSwipeArchiveLeftImageView.setImageDrawable(getResources() .getDrawable(R.drawable.ic_delete_small_dark)); diff --git a/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java b/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java index 64d1436..96c962e 100644 --- a/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java +++ b/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java @@ -37,8 +37,6 @@ public class MultiSelectActionModeCallback implements Callback { void onActionBarDelete(Collection conversations); void onActionBarArchive(Iterable conversations, boolean isToArchive); - void onActionBarNotification(Iterable conversations, - boolean isNotificationOn); void onActionBarAddContact(final SelectedConversation conversation); void onActionBarBlock(final SelectedConversation conversation); void onActionBarHome(); @@ -52,7 +50,6 @@ public class MultiSelectActionModeCallback implements Callback { public final CharSequence participantLookupKey; public final boolean isGroup; public final boolean isArchived; - public final boolean notificationEnabled; public SelectedConversation(ConversationListItemData data) { conversationId = data.getConversationId(); timestamp = data.getTimestamp(); @@ -61,7 +58,6 @@ public class MultiSelectActionModeCallback implements Callback { participantLookupKey = data.getParticipantLookupKey(); isGroup = data.getIsGroup(); isArchived = data.getIsArchived(); - notificationEnabled = data.getNotificationEnabled(); } } @@ -72,8 +68,6 @@ public class MultiSelectActionModeCallback implements Callback { private MenuItem mUnarchiveMenuItem; private MenuItem mAddContactMenuItem; private MenuItem mBlockMenuItem; - private MenuItem mNotificationOnMenuItem; - private MenuItem mNotificationOffMenuItem; private boolean mHasInflated; public MultiSelectActionModeCallback(final Listener listener) { @@ -89,8 +83,6 @@ public class MultiSelectActionModeCallback implements Callback { mUnarchiveMenuItem = menu.findItem(R.id.action_unarchive); mAddContactMenuItem = menu.findItem(R.id.action_add_contact); mBlockMenuItem = menu.findItem(R.id.action_block); - mNotificationOffMenuItem = menu.findItem(R.id.action_notification_off); - mNotificationOnMenuItem = menu.findItem(R.id.action_notification_on); mHasInflated = true; updateActionIconsVisiblity(); return true; @@ -113,12 +105,6 @@ public class MultiSelectActionModeCallback implements Callback { case R.id.action_unarchive: mListener.onActionBarArchive(mSelectedConversations.values(), false); return true; - case R.id.action_notification_off: - mListener.onActionBarNotification(mSelectedConversations.values(), false); - return true; - case R.id.action_notification_on: - mListener.onActionBarNotification(mSelectedConversations.values(), true); - return true; case R.id.action_add_contact: Assert.isTrue(mSelectedConversations.size() == 1); mListener.onActionBarAddContact(mSelectedConversations.valueAt(0)); @@ -186,16 +172,8 @@ public class MultiSelectActionModeCallback implements Callback { boolean hasCurrentlyArchived = false; boolean hasCurrentlyUnarchived = false; - boolean hasCurrentlyOnNotification = false; - boolean hasCurrentlyOffNotification = false; final Iterable conversations = mSelectedConversations.values(); for (final SelectedConversation conversation : conversations) { - if (conversation.notificationEnabled) { - hasCurrentlyOnNotification = true; - } else { - hasCurrentlyOffNotification = true; - } - if (conversation.isArchived) { hasCurrentlyArchived = true; } else { @@ -203,15 +181,10 @@ public class MultiSelectActionModeCallback implements Callback { } // If we found at least one of each example we don't need to keep looping. - if (hasCurrentlyOffNotification && hasCurrentlyOnNotification && - hasCurrentlyArchived && hasCurrentlyUnarchived) { + if (hasCurrentlyArchived && hasCurrentlyUnarchived) { break; } } - // If we have notification off conversations we show on button, if we have notification on - // conversation we show off button. We can show both if we have a mixture. - mNotificationOffMenuItem.setVisible(hasCurrentlyOnNotification); - mNotificationOnMenuItem.setVisible(hasCurrentlyOffNotification); mArchiveMenuItem.setVisible(hasCurrentlyUnarchived); mUnarchiveMenuItem.setVisible(hasCurrentlyArchived); diff --git a/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java b/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java index b86d952..00b31ef 100644 --- a/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java +++ b/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java @@ -18,12 +18,12 @@ package com.android.messaging.ui.conversationsettings; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; +import android.app.NotificationManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; -import android.media.RingtoneManager; import android.os.Bundle; import android.os.Parcelable; import android.provider.Settings; @@ -49,6 +49,7 @@ import com.android.messaging.ui.CompositeAdapter; import com.android.messaging.ui.PersonItemView; import com.android.messaging.ui.UIIntents; import com.android.messaging.ui.conversation.ConversationActivity; +import com.android.messaging.util.NotificationsUtil; import com.android.messaging.util.Assert; import java.util.ArrayList; @@ -65,8 +66,6 @@ public class PeopleAndOptionsFragment extends Fragment private final Binding mBinding = BindingBase.createBinding(this); - private static final int REQUEST_CODE_RINGTONE_PICKER = 1000; - @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -89,17 +88,6 @@ public class PeopleAndOptionsFragment extends Fragment return view; } - @Override - public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_RINGTONE_PICKER) { - final Parcelable pick = data.getParcelableExtra( - RingtoneManager.EXTRA_RINGTONE_PICKED_URI); - final String pickedUri = pick == null ? "" : pick.toString(); - mBinding.getData().setConversationNotificationSound(mBinding, pickedUri); - } - } - @Override public void onDestroy() { super.onDestroy(); @@ -131,24 +119,20 @@ public class PeopleAndOptionsFragment extends Fragment } @Override - public void onOptionsItemViewClicked(final PeopleOptionsItemData item, - final boolean isChecked) { + public void onOptionsItemViewClicked(final PeopleOptionsItemData item) { switch (item.getItemId()) { - case PeopleOptionsItemData.SETTING_NOTIFICATION_ENABLED: - mBinding.getData().enableConversationNotifications(mBinding, isChecked); - break; - - case PeopleOptionsItemData.SETTING_NOTIFICATION_SOUND_URI: - final Intent ringtonePickerIntent = UIIntents.get().getRingtonePickerIntent( - getString(R.string.notification_sound_pref_title), - item.getRingtoneUri(), Settings.System.DEFAULT_NOTIFICATION_URI, - RingtoneManager.TYPE_NOTIFICATION); - startActivityForResult(ringtonePickerIntent, REQUEST_CODE_RINGTONE_PICKER); - break; - - case PeopleOptionsItemData.SETTING_NOTIFICATION_VIBRATION: - mBinding.getData().enableConversationNotificationVibration(mBinding, - isChecked); + case PeopleOptionsItemData.SETTING_NOTIFICATION: + NotificationsUtil.createNotificationChannelGroup(getActivity(), + NotificationsUtil.CONVERSATION_GROUP_NAME, + R.string.notification_channel_messages_title); + NotificationsUtil.createNotificationChannel(getActivity(), + mBinding.getData().getConversationId(), + item.getOtherParticipant().getDisplayName(true), + NotificationManager.IMPORTANCE_DEFAULT, + NotificationsUtil.CONVERSATION_GROUP_NAME); + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName()); + startActivity(intent); break; case PeopleOptionsItemData.SETTING_BLOCKED: diff --git a/src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java b/src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java index 5b6f3b0..91fd10c 100644 --- a/src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java +++ b/src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java @@ -38,7 +38,7 @@ public class PeopleOptionsItemView extends LinearLayout { * Implemented by the host of this view that handles options click event. */ public interface HostInterface { - void onOptionsItemViewClicked(PeopleOptionsItemData item, boolean isChecked); + void onOptionsItemViewClicked(PeopleOptionsItemData item); } private TextView mTitle; @@ -55,12 +55,10 @@ public class PeopleOptionsItemView extends LinearLayout { @Override protected void onFinishInflate () { mTitle = (TextView) findViewById(R.id.title); - mSubtitle = (TextView) findViewById(R.id.subtitle); - mSwitch = (SwitchCompat) findViewById(R.id.switch_button); setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { - mHostInterface.onOptionsItemViewClicked(mData, !mData.getChecked()); + mHostInterface.onOptionsItemViewClicked(mData); } }); } @@ -72,28 +70,5 @@ public class PeopleOptionsItemView extends LinearLayout { mHostInterface = hostInterface; mTitle.setText(mData.getTitle()); - final String subtitle = mData.getSubtitle(); - if (TextUtils.isEmpty(subtitle)) { - mSubtitle.setVisibility(GONE); - } else { - mSubtitle.setVisibility(VISIBLE); - mSubtitle.setText(subtitle); - } - - if (mData.getCheckable()) { - mSwitch.setVisibility(VISIBLE); - mSwitch.setChecked(mData.getChecked()); - } else { - mSwitch.setVisibility(GONE); - } - - final boolean enabled = mData.getEnabled(); - if (enabled != isEnabled()) { - mTitle.setEnabled(enabled); - mSubtitle.setEnabled(enabled); - mSwitch.setEnabled(enabled); - setAlpha(enabled ? 1.0f : 0.5f); - setEnabled(enabled); - } } } diff --git a/src/com/android/messaging/util/NotificationsUtil.java b/src/com/android/messaging/util/NotificationsUtil.java new file mode 100644 index 0000000..591f15a --- /dev/null +++ b/src/com/android/messaging/util/NotificationsUtil.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2019 The LineageOS Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.messaging.util; + +import android.app.NotificationChannel; +import android.app.NotificationChannelGroup; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; + +public final class NotificationsUtil { + public static final String DEFAULT_CHANNEL_ID = "messaging_channel"; + public static final String CONVERSATION_GROUP_NAME = "conversation_group"; + + private NotificationsUtil() { + } + + public static void createNotificationChannel(Context context, String id, + int titleResId, int priority, String groupId) { + String title = context.getString(titleResId); + createNotificationChannel(context, id, title, priority, groupId); + } + + public static void createNotificationChannel(Context context, String id, + String title, int priority, String groupId) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + + NotificationManager manager = context.getSystemService(NotificationManager.class); + NotificationChannel existing = manager.getNotificationChannel(id); + if (existing != null) { + return; + } + + NotificationChannel newChannel = new NotificationChannel(id, title, priority); + newChannel.enableLights(true); + if (groupId != null) { + newChannel.setGroup(groupId); + } + manager.createNotificationChannel(newChannel); + } + + public static void deleteNotificationChannel(Context context, String id) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + + NotificationManager manager = context.getSystemService(NotificationManager.class); + manager.deleteNotificationChannel(id); + } + + public static void createNotificationChannelGroup(Context context, String id, + int titleResId) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + + NotificationManager manager = context.getSystemService(NotificationManager.class); + NotificationChannelGroup existing = manager.getNotificationChannelGroup(id); + if (existing != null) { + return; + } + + String title = context.getString(titleResId); + NotificationChannelGroup newChannelGroup = new NotificationChannelGroup(id, title); + manager.createNotificationChannelGroup(newChannelGroup); + } + + public static NotificationChannel getNotificationChannel(Context context, String id) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return null; + } + + NotificationManager manager = context.getSystemService(NotificationManager.class); + return manager.getNotificationChannel(id); + } + + public static NotificationChannelGroup getNotificationChannelGroup(Context context, String id) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return null; + } + + NotificationManager manager = context.getSystemService(NotificationManager.class); + return manager.getNotificationChannelGroup(id); + } +} diff --git a/src/com/android/messaging/util/RingtoneUtil.java b/src/com/android/messaging/util/RingtoneUtil.java deleted file mode 100644 index a7facfb..0000000 --- a/src/com/android/messaging/util/RingtoneUtil.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.messaging.util; - -import android.content.Context; -import android.net.Uri; -import android.provider.Settings; -import android.text.TextUtils; - -import com.android.messaging.Factory; -import com.android.messaging.R; - -public class RingtoneUtil { - /** - * Return a ringtone Uri for the string representation passed in. Use the app - * and system defaults as fallbacks - * @param ringtoneString is the ringtone to resolve - * @return the Uri of the ringtone or the fallback ringtone - */ - public static Uri getNotificationRingtoneUri(String ringtoneString) { - if (ringtoneString == null) { - // No override specified, fall back to system-wide setting. - final BuglePrefs prefs = BuglePrefs.getApplicationPrefs(); - final Context context = Factory.get().getApplicationContext(); - final String prefKey = context.getString(R.string.notification_sound_pref_key); - ringtoneString = prefs.getString(prefKey, null); - } - - if (!TextUtils.isEmpty(ringtoneString)) { - // We have set a value, even if it is the default Uri at some point - return Uri.parse(ringtoneString); - } else if (ringtoneString == null) { - // We have no setting specified (== null), so we default to the system default - return Settings.System.DEFAULT_NOTIFICATION_URI; - } else { - // An empty string (== "") here is the result of selecting "None" as the ringtone - return null; - } - } -} diff --git a/src/com/android/messaging/widget/WidgetConversationListService.java b/src/com/android/messaging/widget/WidgetConversationListService.java index 264b98c..415ac1d 100644 --- a/src/com/android/messaging/widget/WidgetConversationListService.java +++ b/src/com/android/messaging/widget/WidgetConversationListService.java @@ -120,10 +120,6 @@ public class WidgetConversationListService extends RemoteViewsService { remoteViews.setTextViewText(R.id.from, boldifyIfUnread(conv.getName(), hasUnreadMessages)); - // Notifications turned off mini-bell icon - remoteViews.setViewVisibility(R.id.conversation_notification_bell, - conv.getNotificationEnabled() ? View.GONE : View.VISIBLE); - // On click intent. final Intent intent = UIIntents.get().getIntentForConversationActivity(mContext, conv.getConversationId(), null /* draft */); diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 07f0d17..3ad7d8e 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -17,7 +17,7 @@ - + diff --git a/tests/src/com/android/messaging/datamodel/action/ReadWriteDraftMessageActionTest.java b/tests/src/com/android/messaging/datamodel/action/ReadWriteDraftMessageActionTest.java index 0405c90..6744d87 100644 --- a/tests/src/com/android/messaging/datamodel/action/ReadWriteDraftMessageActionTest.java +++ b/tests/src/com/android/messaging/datamodel/action/ReadWriteDraftMessageActionTest.java @@ -113,7 +113,7 @@ public class ReadWriteDraftMessageActionTest extends BugleTestCase { participants.add(ParticipantData.getFromRawPhoneBySystemLocale(participantNumber)); final String conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - senderBlocked, participants, false, false, null); + senderBlocked, participants); assertNotNull("No conversation", conversationId); return conversationId; } @@ -189,7 +189,7 @@ public class ReadWriteDraftMessageActionTest extends BugleTestCase { participants.add(ParticipantData.getFromRawPhoneBySystemLocale(Long.toString(phoneNumber))); conversationId = BugleDatabaseOperations.getOrCreateConversation(db, threadId, - senderBlocked, participants, false, false, null); + senderBlocked, participants); assertNotNull("No conversation", conversationId); final MessageData actual = BugleDatabaseOperations.readDraftMessageData(db, conversationId, -- cgit v1.2.3