From 79854b588e93a69a378a83512707281ab4ee6b0e Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Thu, 9 Mar 2023 10:12:59 +0000 Subject: [PATCH 01/13] persist temporary debugging changes --- android/app/build.gradle | 1 + .../customairshipextender/CustomNotificationProvider.java | 1 + android/app/src/release/assets/airshipconfig.properties | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index fc33dbe46373..e702d7956af4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -248,6 +248,7 @@ android { signingConfig signingConfigs.debug } release { + debuggable true signingConfig signingConfigs.release minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index ef110747a6a4..7834eb8b4064 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -163,6 +163,7 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil } NotificationCache notificationCache = findOrCreateNotificationCache(reportID); + JsonValue reportAcc = payload.get("onyxData").getList().get(1).getMap().get("value"); JsonMap reportAction = payload.get("reportAction").getMap(); String name = reportAction.get("person").getList().get(0).getMap().get("text").getString(); String avatar = reportAction.get("avatar").getString(); diff --git a/android/app/src/release/assets/airshipconfig.properties b/android/app/src/release/assets/airshipconfig.properties index 194c4577de8b..490f74552f11 100644 --- a/android/app/src/release/assets/airshipconfig.properties +++ b/android/app/src/release/assets/airshipconfig.properties @@ -1,6 +1,7 @@ -appKey = 55vypj0ARc6cN09MX7ogtQ -appSecret = EsSaqbdLSvmyC6kSBFJCtQ -inProduction = true +appKey = uulSSfTDQJ2r0PMpjRrhmQ +appSecret = D4Bhf0HrQEehrPua74Tyiw +inProduction = false +developmentLogLevel = VERBOSE # Notification Customization notificationIcon = ic_notification From 7b3d5913a6004a0fb205d190e50ac8fb244e2946 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:07:22 +0000 Subject: [PATCH 02/13] slight formatting improvements --- .../customairshipextender/CustomNotificationProvider.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 7834eb8b4064..7425c1ab92ae 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -92,12 +92,13 @@ protected NotificationCompat.Builder onExtendBuilder(@NonNull Context context, @ builder.setPriority(PRIORITY_MAX); } + // Attempt to parse data and style notification if (message.containsKey(PAYLOAD_KEY)) { try { JsonMap payload = JsonValue.parseString(message.getExtra(PAYLOAD_KEY)).optMap(); - // Apply message style only for report comments - if (REPORT_COMMENT_TYPE.equals(payload.get(TYPE_KEY).getString())) { + // Apply message style only for chat report actions + if (payload.get(TYPE_KEY).getString().equals(REPORT_COMMENT_TYPE)) { applyMessageStyle(context, builder, payload, arguments.getNotificationId()); } } catch (Exception e) { @@ -150,7 +151,7 @@ public Bitmap getCroppedBitmap(Bitmap bitmap) { /** * Applies the message style to the notification builder. It also takes advantage of the - * notification cache to build conversations. + * notification cache to build conversations style notifications. * * @param builder Notification builder that will receive the message style * @param payload Notification payload, which contains all the data we need to build the notifications. From 0aa4db6ae9f52707820b3c337279d9d21e8e7242 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:08:41 +0000 Subject: [PATCH 03/13] style notifications using onyxData to reduce payload size --- .../CustomNotificationProvider.java | 100 ++++++++++-------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 7425c1ab92ae..be73ce06d53e 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -164,54 +165,63 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil } NotificationCache notificationCache = findOrCreateNotificationCache(reportID); - JsonValue reportAcc = payload.get("onyxData").getList().get(1).getMap().get("value"); - JsonMap reportAction = payload.get("reportAction").getMap(); - String name = reportAction.get("person").getList().get(0).getMap().get("text").getString(); - String avatar = reportAction.get("avatar").getString(); - String accountID = Integer.toString(reportAction.get("actorAccountID").getInt(-1)); - String message = reportAction.get("message").getList().get(0).getMap().get("text").getString(); - long time = Timestamp.valueOf(reportAction.get("created").getString(Instant.now().toString())).getTime(); - String roomName = payload.get("roomName") == null ? "" : payload.get("roomName").getString(""); - String conversationTitle = roomName.isEmpty() ? "Chat with " + name : roomName; - - // Retrieve or create the Person object who sent the latest report comment - Person person = notificationCache.people.get(accountID); - if (person == null) { - IconCompat iconCompat = fetchIcon(context, avatar); - person = new Person.Builder() - .setIcon(iconCompat) - .setKey(accountID) - .setName(name) - .build(); - - notificationCache.people.put(accountID, person); - } - // Store the latest report comment in the local conversation history - notificationCache.messages.add(new NotificationCache.Message(person, message, time)); - - // Create the messaging style notification builder for this notification. - // Associate the notification with the person who sent the report comment. - // If this conversation has 2 participants or more and there's no room name, we should mark - // it as a group conversation. - // Also set the conversation title. - NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle(person) - .setGroupConversation(notificationCache.people.size() > 2 || !roomName.isEmpty()) - .setConversationTitle(conversationTitle); - - // Add all conversation messages to the notification, including the last one we just received. - for (NotificationCache.Message cachedMessage : notificationCache.messages) { - messagingStyle.addMessage(cachedMessage.text, cachedMessage.time, cachedMessage.person); - } + try { + JsonMap reportMap = payload.get("onyxData").getList().get(1).getMap().get("value").getMap(); + String reportId = reportMap.keySet().iterator().next(); + JsonMap report = reportMap.get(reportId).getMap(); + + String name = report.get("person").getList().get(0).getMap().get("text").getString(); + String avatar = report.get("avatar").getString(); + String accountID = Integer.toString(report.get("actorAccountID").getInt(-1)); + String message = report.get("message").getList().get(0).getMap().get("text").getString(); + long time = Timestamp.valueOf(report.get("created").getString(Instant.now().toString())).getTime(); + + String roomName = payload.get("roomName") == null ? "" : payload.get("roomName").getString(""); + String conversationTitle = roomName.isEmpty() ? "Chat with " + name : roomName; + + // Retrieve or create the Person object who sent the latest report comment + Person person = notificationCache.people.get(accountID); + if (person == null) { + IconCompat iconCompat = fetchIcon(context, avatar); + person = new Person.Builder() + .setIcon(iconCompat) + .setKey(accountID) + .setName(name) + .build(); + + notificationCache.people.put(accountID, person); + } - // Clear the previous notification associated to this conversation so it looks like we are - // replacing them with this new one we just built. - if (notificationCache.prevNotificationID != -1) { - NotificationManagerCompat.from(context).cancel(notificationCache.prevNotificationID); - } + // Store the latest report comment in the local conversation history + notificationCache.messages.add(new NotificationCache.Message(person, message, time)); + + // Create the messaging style notification builder for this notification. + // Associate the notification with the person who sent the report comment. + // If this conversation has 2 participants or more and there's no room name, we should mark + // it as a group conversation. + // Also set the conversation title. + NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle(person) + .setGroupConversation(notificationCache.people.size() > 2 || !roomName.isEmpty()) + .setConversationTitle(conversationTitle); + + // Add all conversation messages to the notification, including the last one we just received. + for (NotificationCache.Message cachedMessage : notificationCache.messages) { + messagingStyle.addMessage(cachedMessage.text, cachedMessage.time, cachedMessage.person); + } - // Apply the messaging style to the notification builder - builder.setStyle(messagingStyle); + // Clear the previous notification associated to this conversation so it looks like we are + // replacing them with this new one we just built. + if (notificationCache.prevNotificationID != -1) { + NotificationManagerCompat.from(context).cancel(notificationCache.prevNotificationID); + } + + // Apply the messaging style to the notification builder + builder.setStyle(messagingStyle); + + } catch (Exception e) { + e.printStackTrace(); + } // Store the new notification ID so we can replace the notification if this conversation // receives more messages From f2dd1f29c7feaf4beb12cfd93ce20daee770ff50 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:09:49 +0000 Subject: [PATCH 04/13] improve naming of onyxData json map --- .../CustomNotificationProvider.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index be73ce06d53e..a971422baf47 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -169,13 +169,12 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil try { JsonMap reportMap = payload.get("onyxData").getList().get(1).getMap().get("value").getMap(); String reportId = reportMap.keySet().iterator().next(); - JsonMap report = reportMap.get(reportId).getMap(); + JsonMap messageData = reportMap.get(reportId).getMap(); - String name = report.get("person").getList().get(0).getMap().get("text").getString(); - String avatar = report.get("avatar").getString(); - String accountID = Integer.toString(report.get("actorAccountID").getInt(-1)); - String message = report.get("message").getList().get(0).getMap().get("text").getString(); - long time = Timestamp.valueOf(report.get("created").getString(Instant.now().toString())).getTime(); + String name = messageData.get("person").getList().get(0).getMap().get("text").getString(); + String avatar = messageData.get("avatar").getString(); + String accountID = Integer.toString(messageData.get("actorAccountID").getInt(-1)); + String message = messageData.get("message").getList().get(0).getMap().get("text").getString(); String roomName = payload.get("roomName") == null ? "" : payload.get("roomName").getString(""); String conversationTitle = roomName.isEmpty() ? "Chat with " + name : roomName; From 2c50d3af45c55d4f89cabce6f8b72396d14efd10 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:37:48 +0000 Subject: [PATCH 05/13] improve message timestamp retrieval logic --- .../CustomNotificationProvider.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index a971422baf47..f972478b057c 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -37,6 +37,7 @@ import java.sql.Timestamp; import java.time.Instant; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -193,7 +194,8 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil } // Store the latest report comment in the local conversation history - notificationCache.messages.add(new NotificationCache.Message(person, message, time)); + long createdTimeInMillis = getMessageTimeInMillis(messageData.get("created").getString("")); + notificationCache.messages.add(new NotificationCache.Message(person, message, createdTimeInMillis)); // Create the messaging style notification builder for this notification. // Associate the notification with the person who sent the report comment. @@ -227,6 +229,17 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil notificationCache.prevNotificationID = notificationID; } + /** + * Safely retrieve the message time in milliseconds + */ + private long getMessageTimeInMillis(String createdTime) { + Calendar calendar = Calendar.getInstance(); + if (!createdTime.isEmpty()) { + calendar.setTimeInMillis(Long.getLong(createdTime, 0)); + } + return calendar.getTimeInMillis(); + } + /** * Check if we are showing a notification related to a reportID. * If not, create a new NotificationCache so we can build a conversation notification From d0053d6531edcc6ac50b5e80a3b44e7f63311c49 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:38:05 +0000 Subject: [PATCH 06/13] reformat imports correctly --- .../CustomNotificationProvider.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index f972478b057c..11c43512e8cc 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -8,23 +8,25 @@ import android.app.NotificationManager; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.Bitmap.Config; -import android.graphics.PorterDuffXfermode; import android.graphics.PorterDuff.Mode; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; import android.os.Build; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.WindowManager; + import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.app.Person; import androidx.core.graphics.drawable.IconCompat; + import com.urbanairship.AirshipConfigOptions; import com.urbanairship.json.JsonMap; import com.urbanairship.json.JsonValue; @@ -32,15 +34,13 @@ import com.urbanairship.push.notifications.NotificationArguments; import com.urbanairship.reactnative.ReactNotificationProvider; import com.urbanairship.util.ImageUtils; + import java.net.MalformedURLException; import java.net.URL; -import java.sql.Timestamp; -import java.time.Instant; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; From 01a53f0fcb8f5808a0a2b70a30142c9c17a33b2b Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 11:42:49 +0000 Subject: [PATCH 07/13] protect from malformed notification created data --- .../customairshipextender/CustomNotificationProvider.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 11c43512e8cc..7cc56bffaa17 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -235,7 +235,12 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil private long getMessageTimeInMillis(String createdTime) { Calendar calendar = Calendar.getInstance(); if (!createdTime.isEmpty()) { - calendar.setTimeInMillis(Long.getLong(createdTime, 0)); + try { + long timeInMillis = Long.getLong(createdTime, 0); + calendar.setTimeInMillis(timeInMillis); + } catch (NullPointerException e) { + e.printStackTrace(); + } } return calendar.getTimeInMillis(); } From b3fa2dad59bffbb11a2af33381526367d78adcf6 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 12:33:44 +0000 Subject: [PATCH 08/13] simplify explanation --- .../customairshipextender/CustomNotificationProvider.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 7cc56bffaa17..c28f78cf1791 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -197,11 +197,8 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil long createdTimeInMillis = getMessageTimeInMillis(messageData.get("created").getString("")); notificationCache.messages.add(new NotificationCache.Message(person, message, createdTimeInMillis)); - // Create the messaging style notification builder for this notification. - // Associate the notification with the person who sent the report comment. - // If this conversation has 2 participants or more and there's no room name, we should mark - // it as a group conversation. - // Also set the conversation title. + // Create the messaging style notification builder for this notification, associating the + // notification with the person who sent the report comment. NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle(person) .setGroupConversation(notificationCache.people.size() > 2 || !roomName.isEmpty()) .setConversationTitle(conversationTitle); From fb7f42a5b7840fb6e827d27c54d9a213343c6591 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 17:14:43 +0000 Subject: [PATCH 09/13] minor improvements to the native android notification handler --- .../customairshipextender/CustomNotificationProvider.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index c28f78cf1791..23a235a6ef4a 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -65,8 +65,6 @@ public class CustomNotificationProvider extends ReactNotificationProvider { // Conversation JSON keys private static final String PAYLOAD_KEY = "payload"; - private static final String TYPE_KEY = "type"; - private static final String REPORT_COMMENT_TYPE = "reportComment"; private final ExecutorService executorService = Executors.newCachedThreadPool(); public final HashMap cache = new HashMap<>(); @@ -99,8 +97,8 @@ protected NotificationCompat.Builder onExtendBuilder(@NonNull Context context, @ try { JsonMap payload = JsonValue.parseString(message.getExtra(PAYLOAD_KEY)).optMap(); - // Apply message style only for chat report actions - if (payload.get(TYPE_KEY).getString().equals(REPORT_COMMENT_TYPE)) { + // Apply message style when onyxData is present + if (payload.get("onyxData").getList().size() > 0) { applyMessageStyle(context, builder, payload, arguments.getNotificationId()); } } catch (Exception e) { @@ -177,7 +175,7 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil String accountID = Integer.toString(messageData.get("actorAccountID").getInt(-1)); String message = messageData.get("message").getList().get(0).getMap().get("text").getString(); - String roomName = payload.get("roomName") == null ? "" : payload.get("roomName").getString(""); + String roomName = payload.get("roomName").isString() ? "" : payload.get("roomName").getString(""); String conversationTitle = roomName.isEmpty() ? "Chat with " + name : roomName; // Retrieve or create the Person object who sent the latest report comment From 509c85b1750b62ee782a7eb44cb7192680921f2b Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 10 Mar 2023 18:14:04 +0000 Subject: [PATCH 10/13] fix notification breaking condition --- .../chat/customairshipextender/CustomNotificationProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 23a235a6ef4a..6e47fd746797 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -175,7 +175,7 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil String accountID = Integer.toString(messageData.get("actorAccountID").getInt(-1)); String message = messageData.get("message").getList().get(0).getMap().get("text").getString(); - String roomName = payload.get("roomName").isString() ? "" : payload.get("roomName").getString(""); + String roomName = payload.get("roomName") == null ? "" : payload.get("roomName").getString(""); String conversationTitle = roomName.isEmpty() ? "Chat with " + name : roomName; // Retrieve or create the Person object who sent the latest report comment From dfdf08643198526f39e8d54cb87dbb67afbdd47f Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Thu, 16 Mar 2023 17:01:47 +0000 Subject: [PATCH 11/13] fix invalid notification date parsing logic --- .../CustomNotificationProvider.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 6e47fd746797..57f2be0e729c 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -37,9 +37,11 @@ import java.net.MalformedURLException; import java.net.URL; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -228,16 +230,16 @@ private void applyMessageStyle(@NonNull Context context, NotificationCompat.Buil * Safely retrieve the message time in milliseconds */ private long getMessageTimeInMillis(String createdTime) { - Calendar calendar = Calendar.getInstance(); if (!createdTime.isEmpty()) { try { - long timeInMillis = Long.getLong(createdTime, 0); - calendar.setTimeInMillis(timeInMillis); - } catch (NullPointerException e) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + return sdf.parse(createdTime).getTime(); + } catch (Exception e) { + Log.e(TAG, "error parsing createdTime: " + createdTime); e.printStackTrace(); } } - return calendar.getTimeInMillis(); + return Calendar.getInstance().getTimeInMillis(); } /** From 3d816d30c494d95596491ba8c4213c537df193b5 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Thu, 16 Mar 2023 17:52:40 +0000 Subject: [PATCH 12/13] remove debuggable release build changes --- android/app/build.gradle | 1 - android/app/src/release/assets/airshipconfig.properties | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index b46abf232b3f..a0f5c4c7f557 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -248,7 +248,6 @@ android { signingConfig signingConfigs.debug } release { - debuggable true signingConfig signingConfigs.release minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" diff --git a/android/app/src/release/assets/airshipconfig.properties b/android/app/src/release/assets/airshipconfig.properties index 490f74552f11..194c4577de8b 100644 --- a/android/app/src/release/assets/airshipconfig.properties +++ b/android/app/src/release/assets/airshipconfig.properties @@ -1,7 +1,6 @@ -appKey = uulSSfTDQJ2r0PMpjRrhmQ -appSecret = D4Bhf0HrQEehrPua74Tyiw -inProduction = false -developmentLogLevel = VERBOSE +appKey = 55vypj0ARc6cN09MX7ogtQ +appSecret = EsSaqbdLSvmyC6kSBFJCtQ +inProduction = true # Notification Customization notificationIcon = ic_notification From 418eec20a53b80c98cc7a775eaf84cee669edf06 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 20 Mar 2023 12:34:48 +0000 Subject: [PATCH 13/13] improve comments for ANdroid notification styling --- .../customairshipextender/CustomNotificationProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java index 57f2be0e729c..eff3420ee96d 100644 --- a/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java +++ b/android/app/src/main/java/com/expensify/chat/customairshipextender/CustomNotificationProvider.java @@ -94,17 +94,17 @@ protected NotificationCompat.Builder onExtendBuilder(@NonNull Context context, @ builder.setPriority(PRIORITY_MAX); } - // Attempt to parse data and style notification + // Attempt to parse data and apply custom notification styling if (message.containsKey(PAYLOAD_KEY)) { try { JsonMap payload = JsonValue.parseString(message.getExtra(PAYLOAD_KEY)).optMap(); - // Apply message style when onyxData is present + // Apply message style using onyxData from the notification payload if (payload.get("onyxData").getList().size() > 0) { applyMessageStyle(context, builder, payload, arguments.getNotificationId()); } } catch (Exception e) { - Log.e(TAG, "Failed to parse conversation. SendID=" + message.getSendId(), e); + Log.e(TAG, "Failed to parse conversation, falling back to default notification style. SendID=" + message.getSendId(), e); } }