diff options
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | src/com/android/mail/compose/ComposeActivity.java | 22 | ||||
-rw-r--r-- | src/com/android/mail/utils/NotificationActionUtils.java | 9 | ||||
-rw-r--r-- | src/com/android/mail/utils/NotificationUtils.java | 60 |
4 files changed, 59 insertions, 34 deletions
diff --git a/Android.mk b/Android.mk index 0f39dadf5..bc81af2a9 100644 --- a/Android.mk +++ b/Android.mk @@ -44,7 +44,7 @@ LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13 LOCAL_STATIC_JAVA_LIBRARIES += android-opt-datetimepicker # STOPSHIP: Open source the wearable support jar -LOCAL_STATIC_JAVA_LIBRARIES += prebuilt-wearable-support-1133727 +LOCAL_STATIC_JAVA_LIBRARIES += prebuilt-wearable-support LOCAL_SDK_VERSION := current diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java index b31f37ce5..a120202a1 100644 --- a/src/com/android/mail/compose/ComposeActivity.java +++ b/src/com/android/mail/compose/ComposeActivity.java @@ -47,6 +47,7 @@ import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.provider.BaseColumns; +import android.support.wearable.notifications.RemoteInput; import android.text.Editable; import android.text.Html; import android.text.SpannableString; @@ -55,6 +56,7 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.util.Rfc822Token; import android.text.util.Rfc822Tokenizer; +import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -106,6 +108,7 @@ import com.android.mail.utils.ContentProviderTask; import com.android.mail.utils.LogTag; import com.android.mail.utils.LogUtils; import com.android.mail.utils.NotificationActionUtils; +import com.android.mail.utils.NotificationUtils; import com.android.mail.utils.Utils; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; @@ -185,8 +188,6 @@ public class ComposeActivity extends Activity implements OnClickListener, OnNavi static final String[] ALL_EXTRAS = { EXTRA_SUBJECT, EXTRA_BODY, EXTRA_TO, EXTRA_CC, EXTRA_BCC, EXTRA_QUOTED_TEXT }; - private static final String WEAR_EXTRA = "com.google.android.wearable.extras"; - private static SendOrSaveCallback sTestSendOrSaveCallback = null; // Map containing information about requests to create new messages, and the id of the // messages that were the result of those requests. @@ -534,19 +535,20 @@ public class ComposeActivity extends Activity implements OnClickListener, OnNavi mComposeMode = action; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - // TODO: Use the wrapper api to get the clip data. - ClipData clipData = intent.getClipData(); - if (clipData != null - && WEAR_EXTRA.equals(clipData.getDescription().getLabel())) { - Bundle extras = clipData.getItemAt(0).getIntent().getExtras(); - if (extras != null) { - String wearReply = - extras.getString(NotificationActionUtils.WEAR_REPLY_INPUT); + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + String wearReply = remoteInput.getString( + NotificationActionUtils.WEAR_REPLY_INPUT); + if (!TextUtils.isEmpty(wearReply)) { createWearReplyTask(this, mRefMessageUri, UIProvider.MESSAGE_PROJECTION, mComposeMode, wearReply).execute(); finish(); return; + } else { + LogUtils.w(LOG_TAG, "remote input string is null"); } + } else { + LogUtils.d(LOG_TAG, "No remote input"); } } diff --git a/src/com/android/mail/utils/NotificationActionUtils.java b/src/com/android/mail/utils/NotificationActionUtils.java index baf3b8a9f..089b9f57b 100644 --- a/src/com/android/mail/utils/NotificationActionUtils.java +++ b/src/com/android/mail/utils/NotificationActionUtils.java @@ -31,7 +31,8 @@ import android.os.SystemClock; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.support.wearable.notifications.RemoteInput; -import android.support.wearable.notifications.WearableNotifications; +import android.support.wearable.notifications.WearableAction; +import android.support.wearable.notifications.WearableNotificationOptions; import android.widget.RemoteViews; import com.android.mail.MailIntentService; @@ -198,7 +199,7 @@ public class NotificationActionUtils { */ public static void addNotificationActions(final Context context, final Intent notificationIntent, final NotificationCompat.Builder notification, - WearableNotifications.Builder wearableNotification, final Account account, + WearableNotificationOptions.Builder wearableNotification, final Account account, final Conversation conversation, final Message message, final Folder folder, final int notificationId, final long when, final Set<String> notificationActions) { @@ -217,8 +218,8 @@ public class NotificationActionUtils { // Always add all actions to both standard and wearable notifications. notification.addAction(actionIconResId, title, pendingIntent); - WearableNotifications.Action.Builder wearableActionBuilder = - new WearableNotifications.Action.Builder(actionIconResId, title, pendingIntent); + WearableAction.Builder wearableActionBuilder = new WearableAction.Builder( + actionIconResId, title, pendingIntent); if (notificationAction == NotificationActionType.REPLY || notificationAction == NotificationActionType.REPLY_ALL) { wearableActionBuilder.addRemoteInput( diff --git a/src/com/android/mail/utils/NotificationUtils.java b/src/com/android/mail/utils/NotificationUtils.java index 931f61cbf..04669f94e 100644 --- a/src/com/android/mail/utils/NotificationUtils.java +++ b/src/com/android/mail/utils/NotificationUtils.java @@ -28,14 +28,14 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; -import android.preview.support.v4.app.NotificationManagerCompat; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.Contacts.Photo; import android.support.v4.app.NotificationCompat; import android.support.v4.text.BidiFormatter; import android.support.v4.util.ArrayMap; -import android.support.wearable.notifications.WearableNotifications; +import android.support.wearable.app.NotificationManagerCompat; +import android.support.wearable.notifications.WearableNotificationOptions; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.TextUtils; @@ -574,10 +574,10 @@ public class NotificationUtils { PendingIntent clickIntent; NotificationCompat.Builder notification = new NotificationCompat.Builder(context); - WearableNotifications.Builder wearableNotification = - new WearableNotifications.Builder(notification); - Map<Integer, WearableNotifications.Builder> msgNotifications = - new ArrayMap<Integer, WearableNotifications.Builder>(); + WearableNotificationOptions.Builder wearableNotification = + new WearableNotificationOptions.Builder(); + Map<Integer, NotificationBuilders> msgNotifications = + new ArrayMap<Integer, NotificationBuilders>(); notification.setSmallIcon(R.drawable.stat_notify_email); notification.setTicker(account.getDisplayName()); @@ -733,7 +733,8 @@ public class NotificationUtils { notification.setTicker(null); } - nm.notify(notificationId, wearableNotification.build()); + wearableNotification.build().applyTo(notification); + nm.notify(notificationId, notification.build()); if (prevChildNotifications != null) { Set<Integer> currentNotificationIds = msgNotifications.keySet(); @@ -746,9 +747,10 @@ public class NotificationUtils { } } - for (Map.Entry<Integer, WearableNotifications.Builder> entry - : msgNotifications.entrySet()) { - nm.notify(entry.getKey(), entry.getValue().build()); + for (Map.Entry<Integer, NotificationBuilders> entry : msgNotifications.entrySet()) { + NotificationBuilders builders = entry.getValue(); + builders.wearableNotifBuilder.build().applyTo(builders.notifBuilder); + nm.notify(entry.getKey(), builders.notifBuilder.build()); LogUtils.d(LOG_TAG, "notifying child notification %s", entry.getKey()); } @@ -843,8 +845,8 @@ public class NotificationUtils { private static void configureLatestEventInfoFromConversation(final Context context, final Account account, final FolderPreferences folderPreferences, final NotificationCompat.Builder notification, - final WearableNotifications.Builder summaryWearNotif, - final Map<Integer, WearableNotifications.Builder> msgNotifications, + final WearableNotificationOptions.Builder summaryWearNotif, + final Map<Integer, NotificationBuilders> msgNotifications, final int summaryNotificationId, final Cursor conversationCursor, final PendingIntent clickIntent, final Intent notificationIntent, final int unreadCount, final int unseenCount, @@ -894,8 +896,7 @@ public class NotificationUtils { // Group by account. String notificationGroupKey = account.uri.toString() + "/" + folder.folderUri.fullUri; - summaryWearNotif.setGroup(notificationGroupKey, - WearableNotifications.GROUP_ORDER_SUMMARY); + summaryWearNotif.setGroup(notificationGroupKey).setGroupSummary(true); int numDigestItems = 0; do { @@ -962,9 +963,13 @@ public class NotificationUtils { childNotificationIntent); childNotif.setContentIntent(childClickIntent); - WearableNotifications.Builder childWearNotif = - new WearableNotifications.Builder(childNotif).setGroup( - notificationGroupKey, numDigestItems); + // TODO: Use a stable sort key if possible, e.g. message post time + // + msgid hash + String groupSortKey = String.format("%010d", numDigestItems); + WearableNotificationOptions.Builder childWearNotif = + new WearableNotificationOptions.Builder() + .setGroup(notificationGroupKey) + .setSortKey(groupSortKey); int childNotificationId = getNotificationId(summaryNotificationId, conversation.hashCode()); @@ -973,7 +978,8 @@ public class NotificationUtils { notificationIntent, folder, when, res, notificationAccountDisplayName, notificationAccountEmail, isInbox, notificationLabelName, childNotificationId); - msgNotifications.put(childNotificationId, childWearNotif); + msgNotifications.put(childNotificationId, + NotificationBuilders.of(childNotif, childWearNotif)); } finally { if (messageCursor != null) { messageCursor.close(); @@ -1029,7 +1035,7 @@ public class NotificationUtils { */ private static String configureNotifForOneConversation(Context context, Account account, FolderPreferences folderPreferences, NotificationCompat.Builder notification, - WearableNotifications.Builder summaryWearNotif, Cursor conversationCursor, + WearableNotificationOptions.Builder summaryWearNotif, Cursor conversationCursor, Intent notificationIntent, Folder folder, long when, Resources res, String notificationAccountDisplayName, String notificationAccountEmail, boolean isInbox, String notificationLabelName, int notificationId) { @@ -1756,4 +1762,20 @@ public class NotificationUtils { accountPreferences.clearDefaultInboxNotificationsEnabled(); } } + + private static class NotificationBuilders { + public final NotificationCompat.Builder notifBuilder; + public final WearableNotificationOptions.Builder wearableNotifBuilder; + + private NotificationBuilders(NotificationCompat.Builder notifBuilder, + WearableNotificationOptions.Builder wearableNotifBuilder) { + this.notifBuilder = notifBuilder; + this.wearableNotifBuilder = wearableNotifBuilder; + } + + public static NotificationBuilders of(NotificationCompat.Builder notifBuilder, + WearableNotificationOptions.Builder wearableNotifBuilder) { + return new NotificationBuilders(notifBuilder, wearableNotifBuilder); + } + } } |