[Gekidou] push notifications (#5779)

* Push notifications entry point

* Process android notification natively only if RN is not initialized

* Database changes to store local channel viewed_at

* EphemeralStore wait until screen removed

* Move schedule session notification to utility

* Fix channel remote & local actions + added actions for markChannelAsViewed & fetchMyChannel

* Add fetchMyTeam remote action

* Add dismissAllModalsAndPopToScreen to navigation

* Improve post list component & add app state to re-trigger queries

* Improve WS implementation

* Handle push notification events

* Fix postsInChannel since handler

* Handle in-app notifications

* Post list to listen to column changes

* Track selected bottom tab in ephemeral store

* add useIsTablet hook

* in-app notifications on tablets
This commit is contained in:
Elias Nahum
2021-10-27 17:53:11 -03:00
committed by GitHub
parent c01bcb7559
commit 790b1beb22
87 changed files with 2923 additions and 1550 deletions

View File

@@ -9,6 +9,7 @@ import android.content.pm.PackageManager;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -149,6 +150,7 @@ public class CustomPushNotification extends PushNotification {
}
String serverUrl = addServerUrlToBundle(initialData);
boolean isReactInit = mAppLifecycleFacade.isReactInitialized();
if (ackId != null && serverUrl != null) {
notificationReceiptDelivery(ackId, serverUrl, postId, type, isIdLoaded, new ResolvePromise() {
@@ -157,7 +159,8 @@ public class CustomPushNotification extends PushNotification {
if (isIdLoaded) {
Bundle response = (Bundle) value;
if (value != null) {
addServerUrlToBundle(response);
response.putString("server_url", serverUrl);
mNotificationProps = createProps(response);
}
}
}
@@ -176,7 +179,12 @@ public class CustomPushNotification extends PushNotification {
if (!mAppLifecycleFacade.isAppVisible()) {
if (type.equals(PUSH_TYPE_MESSAGE)) {
if (channelId != null) {
if (serverUrl != null) {
if (serverUrl != null && !isReactInit) {
// We will only fetch the data related to the notification on the native side
// as updating the data directly to the db removes the wal & shm files needed
// by watermelonDB, if the DB is updated while WDB is running it causes WDB to
// detect the database as malformed, thus the app stop working and a restart is required.
// Data will be fetch from within the JS context instead.
dataHelper.fetchAndStoreDataForPushNotification(mNotificationProps.asBundle());
}
@@ -202,8 +210,6 @@ public class CustomPushNotification extends PushNotification {
}
buildNotification(notificationId, createSummary);
} else {
notifyReceivedToJS();
}
break;
case PUSH_TYPE_CLEAR:
@@ -211,7 +217,7 @@ public class CustomPushNotification extends PushNotification {
break;
}
if (mAppLifecycleFacade.isReactInitialized()) {
if (isReactInit) {
notifyReceivedToJS();
}
}
@@ -268,9 +274,15 @@ public class CustomPushNotification extends PushNotification {
}
private String addServerUrlToBundle(Bundle bundle) {
String serverUrl = bundle.getString("server_url");
if (serverUrl == null) {
String serverId = bundle.getString("server_id");
String serverUrl;
if (serverId == null) {
serverUrl = Objects.requireNonNull(DatabaseHelper.Companion.getInstance()).getOnlyServerUrl();
} else {
serverUrl = Objects.requireNonNull(DatabaseHelper.Companion.getInstance()).getServerUrlForIdentifier(serverId);
}
if (!TextUtils.isEmpty(serverUrl)) {
bundle.putString("server_url", serverUrl);
mNotificationProps = createProps(bundle);
}