From a058ca57ca4bec8047cff4d66abc4d89c20bf95f Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 2 Jan 2023 12:53:08 +0200 Subject: [PATCH] Android Fixes (#6915) * Fix android back button handler * Fix Android crash caused by react native screens * Prevent Android crash and log stack trace when receiving a push notification --- .../helpers/CustomPushNotificationHelper.java | 67 +++++++++++-------- .../com/mattermost/rnbeta/MainActivity.java | 2 +- patches/react-native-navigation+7.30.6.patch | 25 +++++++ 3 files changed, 66 insertions(+), 28 deletions(-) diff --git a/android/app/src/main/java/com/mattermost/helpers/CustomPushNotificationHelper.java b/android/app/src/main/java/com/mattermost/helpers/CustomPushNotificationHelper.java index 8ab4b49c86..a9289cd90b 100644 --- a/android/app/src/main/java/com/mattermost/helpers/CustomPushNotificationHelper.java +++ b/android/app/src/main/java/com/mattermost/helpers/CustomPushNotificationHelper.java @@ -74,7 +74,10 @@ public class CustomPushNotificationHelper { if (serverUrl != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) { try { - sender.setIcon(IconCompat.createWithBitmap(Objects.requireNonNull(userAvatar(context, serverUrl, senderId, null)))); + Bitmap avatar = userAvatar(context, serverUrl, senderId, null); + if (avatar != null) { + sender.setIcon(IconCompat.createWithBitmap(avatar)); + } } catch (IOException e) { e.printStackTrace(); } @@ -270,7 +273,10 @@ public class CustomPushNotificationHelper { if (serverUrl != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) { try { - sender.setIcon(IconCompat.createWithBitmap(Objects.requireNonNull(userAvatar(context, serverUrl, "me", null)))); + Bitmap avatar = userAvatar(context, serverUrl, "me", null); + if (avatar != null) { + sender.setIcon(IconCompat.createWithBitmap(avatar)); + } } catch (IOException e) { e.printStackTrace(); } @@ -405,7 +411,10 @@ public class CustomPushNotificationHelper { if (serverUrl != null && channelName.equals(senderName)) { try { String senderId = bundle.getString("sender_id"); - notification.setLargeIcon(userAvatar(context, serverUrl, senderId, urlOverride)); + Bitmap avatar = userAvatar(context, serverUrl, senderId, urlOverride); + if (avatar != null) { + notification.setLargeIcon(avatar); + } } catch (IOException e) { e.printStackTrace(); } @@ -413,31 +422,35 @@ public class CustomPushNotificationHelper { } private static Bitmap userAvatar(Context context, final String serverUrl, final String userId, final String urlOverride) throws IOException { - final OkHttpClient client = new OkHttpClient(); - Request request; - String url; - if (urlOverride != null) { - request = new Request.Builder().url(urlOverride).build(); - url = urlOverride; - } else { - final ReactApplicationContext reactApplicationContext = new ReactApplicationContext(context); - final String token = Credentials.getCredentialsForServerSync(reactApplicationContext, serverUrl); - url = String.format("%s/api/v4/users/%s/image", serverUrl, userId); - request = new Request.Builder() - .header("Authorization", String.format("Bearer %s", token)) - .url(url) - .build(); - } - Response response = client.newCall(request).execute(); - if (response.code() == 200) { - assert response.body() != null; - byte[] bytes = Objects.requireNonNull(response.body()).bytes(); - Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + try { + final OkHttpClient client = new OkHttpClient(); + Request request; + String url; + if (urlOverride != null) { + request = new Request.Builder().url(urlOverride).build(); + Log.i("ReactNative", String.format("Fetch override profile image %s", urlOverride)); + } else { + final ReactApplicationContext reactApplicationContext = new ReactApplicationContext(context); + final String token = Credentials.getCredentialsForServerSync(reactApplicationContext, serverUrl); + url = String.format("%s/api/v4/users/%s/image", serverUrl, userId); + Log.i("ReactNative", String.format("Fetch profile image %s", url)); + request = new Request.Builder() + .header("Authorization", String.format("Bearer %s", token)) + .url(url) + .build(); + } + Response response = client.newCall(request).execute(); + if (response.code() == 200) { + assert response.body() != null; + byte[] bytes = Objects.requireNonNull(response.body()).bytes(); + Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + return getCircleBitmap(bitmap); + } - Log.i("ReactNative", String.format("Fetch profile %s", url)); - return getCircleBitmap(bitmap); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; } - - return null; } } diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java b/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java index e9222b4bdf..a8f89866f8 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java @@ -41,7 +41,7 @@ public class MainActivity extends NavigationActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + super.onCreate(null); setContentView(R.layout.launch_screen); setHWKeyboardConnected(); } diff --git a/patches/react-native-navigation+7.30.6.patch b/patches/react-native-navigation+7.30.6.patch index e303b90e25..eeb56c9abb 100644 --- a/patches/react-native-navigation+7.30.6.patch +++ b/patches/react-native-navigation+7.30.6.patch @@ -1,3 +1,28 @@ +diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java +index 226d3bf..6213a88 100644 +--- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java ++++ b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java +@@ -48,7 +48,7 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard + ); + navigator.bindViews(); + getReactGateway().onActivityCreated(this); +- setBackPressedCallback(); ++ // setBackPressedCallback(); + } + + @Override +@@ -141,6 +141,11 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard + navigator.destroyViews(); + } + ++ @Override ++ public void onBackPressed() { ++ getReactGateway().onBackPressed(); ++ } ++ + protected void addDefaultSplashLayout() { + View view = new View(this); + setContentView(view); diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java index a34598c..b035a76 100644 --- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java