Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
59d5c0e
Adds a worker task to sync notifications
shubham1g5 Oct 24, 2025
5bb8d72
Schedule notifications fetch on sign in, cancel on forget
shubham1g5 Oct 24, 2025
f57e12d
schedle notifications retrieval after fcm fetch
shubham1g5 Oct 24, 2025
91a6598
basic tests on notifications worker
shubham1g5 Oct 24, 2025
ed40a8c
Move code to schedule notifications retrieval inside the sync worker …
shubham1g5 Oct 24, 2025
d6acdc8
Merge branch 'master' into syncNotifications
jaypanchal-13 Oct 24, 2025
762f00b
Schedule notifications fetch on app start up
shubham1g5 Oct 27, 2025
c42d922
Merge branch 'syncNotifications' of https://github.com/dimagi/commcar…
shubham1g5 Oct 27, 2025
b51d3e1
specify backoff in minutes
shubham1g5 Oct 27, 2025
4dc27e4
rename methods
shubham1g5 Oct 28, 2025
a6dbd3b
call notifications api instead of deprecated messaging one
shubham1g5 Oct 28, 2025
3e414cc
comments
shubham1g5 Oct 28, 2025
b28d421
Schedule post-fcm notification sync from worker manager to avoid doin…
shubham1g5 Oct 28, 2025
05680b3
no need to use Gson for simple strings
shubham1g5 Oct 28, 2025
0805605
separate state init from start worker
shubham1g5 Oct 28, 2025
26ac991
More renaming to get rid of pn
shubham1g5 Oct 28, 2025
6ef7a12
Consolidate 2 notifications worker and reuse existing worker
shubham1g5 Oct 28, 2025
2dfd31b
Minor lint
shubham1g5 Oct 29, 2025
402370e
Corrects sync type for notification sync
shubham1g5 Oct 29, 2025
af9c8c1
Merge pull request #3384 from dimagi/mergeNotificationsAndMessagingWo…
shubham1g5 Oct 29, 2025
af68dd5
Replace sync type with show notification boolean
shubham1g5 Oct 29, 2025
86ee025
Schedule post-sync notification sync based on a variable
shubham1g5 Oct 29, 2025
f8bef55
lint
shubham1g5 Oct 29, 2025
28497e2
more lint
shubham1g5 Oct 29, 2025
fa80f8c
even more lint
shubham1g5 Oct 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 20 additions & 17 deletions app/src/org/commcare/CommCareApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,34 @@
import android.os.StrictMode;
import android.text.format.DateUtils;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.preference.PreferenceManager;
import androidx.work.BackoffPolicy;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.ExistingWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;

import com.google.common.collect.Multimap;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.perf.FirebasePerformance;

import org.commcare.activities.LoginActivity;
import org.commcare.android.database.app.models.UserKeyRecord;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.android.database.connect.models.ConnectUserRecord;
import org.commcare.android.database.global.models.ApplicationRecord;
import org.commcare.android.javarosa.AndroidLogEntry;
import org.commcare.android.logging.ForceCloseLogEntry;
import org.commcare.android.logging.ForceCloseLogger;
import org.commcare.android.logging.ReportingUtils;
import org.commcare.connect.database.ConnectUserDatabaseUtil;
import org.commcare.core.graph.util.GraphUtil;
import org.commcare.core.interfaces.HttpResponseProcessor;
import org.commcare.core.network.AuthInfo;
Expand Down Expand Up @@ -60,10 +74,10 @@
import org.commcare.models.AndroidSessionWrapper;
import org.commcare.models.database.AndroidDbHelper;
import org.commcare.models.database.AndroidPrototypeFactorySetup;
import org.commcare.models.database.IDatabase;
import org.commcare.models.database.EncryptedDatabaseAdapter;
import org.commcare.models.database.HybridFileBackedSqlHelpers;
import org.commcare.models.database.HybridFileBackedSqlStorage;
import org.commcare.models.database.IDatabase;
import org.commcare.models.database.MigrationException;
import org.commcare.models.database.SqlStorage;
import org.commcare.models.database.app.DatabaseAppOpenHelper;
Expand All @@ -78,6 +92,7 @@
import org.commcare.network.DataPullResponseFactory;
import org.commcare.network.HttpUtils;
import org.commcare.network.OkHttpBuilderCustomConfig;
import org.commcare.pn.workermanager.NotificationsSyncWorkerManager;
import org.commcare.preferences.DevSessionRestorer;
import org.commcare.preferences.DeveloperPreferences;
import org.commcare.preferences.HiddenPreferences;
Expand Down Expand Up @@ -132,20 +147,6 @@
import javax.annotation.Nullable;
import javax.crypto.SecretKey;

import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.preference.PreferenceManager;
import androidx.work.BackoffPolicy;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.ExistingWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import io.noties.markwon.Markwon;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
Expand Down Expand Up @@ -274,6 +275,8 @@ public void onCreate() {
setRxJavaGlobalHandler();

ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
NotificationsSyncWorkerManager.schedulePeriodicPushNotificationRetrievalChecked(
CommCareApplication.instance());
}

protected void loadSqliteLibs() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.commcare.android.database.connect.models.PushNotificationRecord
import org.commcare.connect.database.NotificationRecordDatabaseHelper
import org.commcare.pn.workermanager.PNApiSyncWorkerManager
import org.commcare.pn.workermanager.NotificationsSyncWorkerManager
import org.commcare.utils.PushNotificationApiHelper.retrieveLatestPushNotifications

class PushNotificationViewModel(application: Application) : AndroidViewModel(application) {
Expand All @@ -29,8 +29,9 @@ class PushNotificationViewModel(application: Application) : AndroidViewModel(app
// Load from DB first
if (!isRefreshed) {
val cachedNotifications =
NotificationRecordDatabaseHelper.getAllNotifications(getApplication()).orEmpty().sortedByDescending { it.createdDate }
if (cachedNotifications.isNotEmpty()){
NotificationRecordDatabaseHelper.getAllNotifications(getApplication()).orEmpty()
.sortedByDescending { it.createdDate }
if (cachedNotifications.isNotEmpty()) {
_isLoading.postValue(false)
}
_allNotifications.postValue(cachedNotifications)
Expand All @@ -39,19 +40,19 @@ class PushNotificationViewModel(application: Application) : AndroidViewModel(app
val latestPushNotificationsFromApi = retrieveLatestPushNotifications(application)
latestPushNotificationsFromApi.onSuccess {
val currentNotifications = _allNotifications.value.orEmpty()
PNApiSyncWorkerManager(
NotificationsSyncWorkerManager(
application,
it,
PNApiSyncWorkerManager.SYNC_TYPE.NOTIFICATION_API
false
).startPNApiSync()
val updatedNotifications = (it + currentNotifications).distinctBy { it.notificationId }.sortedByDescending { it.createdDate }
val updatedNotifications = (it + currentNotifications).distinctBy { it.notificationId }
.sortedByDescending { it.createdDate }
_isLoading.postValue(false)
_allNotifications.postValue(updatedNotifications)
}.onFailure {
_isLoading.postValue(false)
_fetchApiError.postValue(it.message)
}

}
}
}
}
6 changes: 5 additions & 1 deletion app/src/org/commcare/connect/PersonalIdManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.commcare.core.network.AuthInfo;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.pn.workermanager.NotificationsSyncWorkerManager;
import org.commcare.util.LogTypes;
import org.commcare.utils.BiometricsHelper;
import org.commcare.utils.CrashUtil;
Expand Down Expand Up @@ -111,7 +112,6 @@ public void init(Context parent) {
if (user != null) {
boolean registering = user.getRegistrationPhase() != ConnectConstants.PERSONALID_NO_ACTIVITY;
personalIdSatus = registering ? PersonalIdStatus.Registering : PersonalIdStatus.LoggedIn;

CrashUtil.registerUserData();
} else if (ConnectDatabaseHelper.isDbBroken()) {
//Corrupt DB, inform user to recover
Expand Down Expand Up @@ -206,6 +206,7 @@ private void logBiometricInvalidations() {
public void completeSignin() {
personalIdSatus = PersonalIdStatus.LoggedIn;
scheduleHeartbeat();
NotificationsSyncWorkerManager.schedulePeriodicPushNotificationRetrieval(CommCareApplication.instance());
CrashUtil.registerUserData();
}

Expand All @@ -223,6 +224,9 @@ public void forgetUser(String reason) {
}
ConnectUserDatabaseUtil.forgetUser();
personalIdSatus = PersonalIdStatus.NotIntroduced;

// Cancel periodic push notification retrieval when user logs out
NotificationsSyncWorkerManager.cancelPeriodicPushNotificationRetrieval(CommCareApplication.instance());
}

public AuthInfo.TokenAuth getConnectToken() {
Expand Down
Loading
Loading