summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas <tschneider.ac@gmail.com>2023-09-04 11:07:14 +0200
committerThomas <tschneider.ac@gmail.com>2023-09-04 11:07:14 +0200
commit0b6c1d6504f0d9f1bfcae6245a84d998329e7877 (patch)
tree82443595e975ad477e8dcd8e824718f02f27e574
parentc5e35b6b483ec9191d041e8903635977531baf09 (diff)
parente735947362ec490f1fad6da5a825b9c68242e4ac (diff)
Merge branch 'main' into develop
# Conflicts: # app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java
-rw-r--r--app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java86
1 files changed, 34 insertions, 52 deletions
diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java
index bfa431db9..6759a45a1 100644
--- a/app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java
+++ b/app/src/main/java/app/fedilab/android/mastodon/helper/NotificationsHelper.java
@@ -41,6 +41,8 @@ import java.net.IDN;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
@@ -61,9 +63,10 @@ import retrofit2.converter.gson.GsonConverterFactory;
public class NotificationsHelper {
- public static HashMap<String, String> since_ids = new HashMap<>();
public static HashMap<String, List<String>> pushed_notifications = new HashMap<>();
+ public static ReentrantLock lock = new ReentrantLock();
+
public static synchronized void task(Context context, String slug) throws DBException {
SharedPreferences prefs = PreferenceManager
@@ -73,16 +76,6 @@ public class NotificationsHelper {
if (accountDb == null) {
return;
}
- String last_notifid;
- last_notifid = prefs.getString(context.getString(R.string.LAST_NOTIFICATION_ID) + slug, null);
- if (since_ids.containsKey(slug)) {
- String last_notifid_reccorded = since_ids.get(slug);
- if (last_notifid_reccorded != null && last_notifid_reccorded.compareToIgnoreCase(last_notifid) == 0) {
- return;
- }
- } else {
- since_ids.put(slug, last_notifid);
- }
//Check which notifications the user wants to see
boolean notif_follow = prefs.getBoolean(context.getString(R.string.SET_NOTIF_FOLLOW), true);
@@ -100,37 +93,42 @@ public class NotificationsHelper {
return; //Nothing is done
}
- MastodonNotificationsService mastodonNotificationsService = init(context, slugArray[1]);
- String finalLast_notifid = last_notifid;
new Thread(() -> {
- Notifications notifications = new Notifications();
- Call<List<Notification>> notificationsCall;
- if (finalLast_notifid != null) {
- notificationsCall = mastodonNotificationsService.getNotifications(accountDb.token, null, null, null, finalLast_notifid, null, 30);
- } else {
- notificationsCall = mastodonNotificationsService.getNotifications(accountDb.token, null, null, null, null, null, 5);
- }
- if (notificationsCall != null) {
- try {
- Response<List<Notification>> notificationsResponse = notificationsCall.execute();
- if (notificationsResponse.isSuccessful()) {
- notifications.notifications = notificationsResponse.body();
- if (notifications.notifications != null) {
- if (notifications.notifications.size() > 0) {
- since_ids.put(slug, notifications.notifications.get(0).id);
+ try {
+ // fetch if we get the lock, or ignore, another thread is doing the job
+ if (lock.tryLock()) {
+ MastodonNotificationsService mastodonNotificationsService = init(context, slugArray[1]);
+ Notifications notifications = new Notifications();
+ Call<List<Notification>> notificationsCall;
+ String last_notif_id = prefs.getString(context.getString(R.string.LAST_NOTIFICATION_ID) + slug, null);
+ notificationsCall = mastodonNotificationsService.getNotifications(accountDb.token, null, null, null, last_notif_id, null, 30);
+ if (notificationsCall != null) {
+ try {
+ Response<List<Notification>> notificationsResponse = notificationsCall.execute();
+ if (notificationsResponse.isSuccessful()) {
+ notifications.notifications = notificationsResponse.body();
+ if (notifications.notifications != null) {
+ if (notifications.notifications.size() > 0) {
+ prefs.edit().putString(
+ context.getString(R.string.LAST_NOTIFICATION_ID) + slug,
+ notifications.notifications.get(0).id
+ ).apply();
+ }
+ }
+ notifications.pagination = MastodonHelper.getPagination(notificationsResponse.headers());
}
+ } catch (Exception e) {
+ e.printStackTrace();
}
- notifications.pagination = MastodonHelper.getPagination(notificationsResponse.headers());
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ Runnable myRunnable = () -> onRetrieveNotifications(context, notifications, accountDb, last_notif_id);
+ mainHandler.post(myRunnable);
}
- } catch (Exception e) {
- e.printStackTrace();
}
- Handler mainHandler = new Handler(Looper.getMainLooper());
- Runnable myRunnable = () -> onRetrieveNotifications(context, notifications, accountDb);
- mainHandler.post(myRunnable);
+ } finally {
+ lock.unlock();
}
}).start();
-
}
@@ -145,7 +143,7 @@ public class NotificationsHelper {
return retrofit.create(MastodonNotificationsService.class);
}
- public static void onRetrieveNotifications(Context context, Notifications newNotifications, final BaseAccount account) {
+ public static void onRetrieveNotifications(Context context, Notifications newNotifications, final BaseAccount account, String max_id) {
if (newNotifications == null || newNotifications.notifications == null || newNotifications.notifications.size() == 0 || account == null) {
return;
}
@@ -164,8 +162,6 @@ public class NotificationsHelper {
boolean notif_signup = prefs.getBoolean(context.getString(R.string.SET_NOTIF_ADMIN_SIGNUP), true);
boolean notif_report = prefs.getBoolean(context.getString(R.string.SET_NOTIF_ADMIN_REPORT), true);
- final String max_id = prefs.getString(context.getString(R.string.LAST_NOTIFICATION_ID) + key, null);
-
final List<Notification> notifications = new ArrayList<>();
int pos = 0;
for (Notification notif : notificationsReceived) {
@@ -396,28 +392,14 @@ public class NotificationsHelper {
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
- String lastNotif = prefs.getString(context.getString(R.string.LAST_NOTIFICATION_ID) + account.user_id + "@" + account.instance, null);
- // if (lastNotif == null || Helper.compareTo(notification.id, lastNotif) > 0) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.putString(context.getString(R.string.LAST_NOTIFICATION_ID) + account.user_id + "@" + account.instance, notifications.get(0).id);
- editor.commit();
- since_ids.put(account.user_id + "@" + account.instance, lastNotif);
Helper.notify_user(context, account, intent, resource, finalNotifType, finalTitle, finalMessage);
- // }
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
- String lastNotif = prefs.getString(context.getString(R.string.LAST_NOTIFICATION_ID) + account.user_id + "@" + account.instance, null);
- // if (lastNotif == null || Helper.compareTo(notification.id, lastNotif) > 0) {
- SharedPreferences.Editor editor = prefs.edit();
- since_ids.put(account.user_id + "@" + account.instance, lastNotif);
- editor.putString(context.getString(R.string.LAST_NOTIFICATION_ID) + account.user_id + "@" + account.instance, notifications.get(0).id);
- editor.commit();
Helper.notify_user(context, account, intent, BitmapFactory.decodeResource(context.getResources(),
getMainLogo(context)), finalNotifType, finalTitle, finalMessage);
- // }
}
@Override