From 28f3fa32d7526a75a76c47db47b7334eaddaf6c2 Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:27:31 -0400 Subject: [PATCH] Continue implementing reminders. --- .../infinityforreddit/AppModule.java | 9 ++- .../infinityforreddit/Infinity.java | 5 ++ .../ReminderAlarmReceiver.kt | 7 +- .../reminder/ReminderManager.kt | 67 ++++++++++++++++++- 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java index 75c32459..86818774 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java @@ -269,8 +269,13 @@ abstract class AppModule { @Provides @Singleton static ReminderManager provideReminderManager( - Application application, RedditDataRoomDatabase redditDataRoomDatabase + Application application, RedditDataRoomDatabase redditDataRoomDatabase, CustomThemeWrapper customThemeWrapper ) { - return new ReminderManager(application, redditDataRoomDatabase, (AlarmManager) application.getSystemService(Context.ALARM_SERVICE)); + return new ReminderManager( + application, + redditDataRoomDatabase, + (AlarmManager) application.getSystemService(Context.ALARM_SERVICE), + customThemeWrapper + ); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java index def07fef..a8b54412 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java @@ -45,6 +45,7 @@ import ml.docilealligator.infinityforreddit.events.ToggleSecureModeEvent; import ml.docilealligator.infinityforreddit.font.ContentFontFamily; import ml.docilealligator.infinityforreddit.font.FontFamily; import ml.docilealligator.infinityforreddit.font.TitleFontFamily; +import ml.docilealligator.infinityforreddit.reminder.ReminderManager; import ml.docilealligator.infinityforreddit.utils.MaterialYouUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -85,6 +86,8 @@ public class Infinity extends Application implements LifecycleObserver { CustomThemeWrapper customThemeWrapper; @Inject Executor executor; + @Inject + ReminderManager reminderManager; @Override public void onCreate() { @@ -220,6 +223,8 @@ public class Infinity extends Application implements LifecycleObserver { amoledThemeSharedPreferences, mInternalSharedPreferences, null); } } + + reminderManager.checkAndSetAllAlarms(); } @OnLifecycleEvent(Lifecycle.Event.ON_START) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt index d81315c5..c36a50e5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt @@ -15,6 +15,7 @@ import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase import ml.docilealligator.infinityforreddit.activities.ViewPostDetailActivity import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper import ml.docilealligator.infinityforreddit.reminder.Reminder +import ml.docilealligator.infinityforreddit.reminder.ReminderManager import ml.docilealligator.infinityforreddit.utils.NotificationUtils import java.util.Random import javax.inject.Inject @@ -32,7 +33,7 @@ class ReminderAlarmReceiver: BroadcastReceiver() { val reminder: Reminder? = intent.getParcelableExtra(EXTRA_REMINDER) reminder?.let { (context.applicationContext as Infinity).appComponent.inject(this) - val notificationManager = NotificationUtils.getNotificationManager(context) + /*val notificationManager = NotificationUtils.getNotificationManager(context) val builder = NotificationUtils.buildNotification( notificationManager, context, context.getString(R.string.reminder), it.content, context.getString(if (it.commentId.isNotEmpty()) R.string.comment else R.string.post), @@ -54,7 +55,9 @@ class ReminderAlarmReceiver: BroadcastReceiver() { ) } catch (e: SecurityException) { e.printStackTrace() - } + }*/ + + ReminderManager.sendNotification(context, mCustomThemeWrapper, it) doAsync(GlobalScope) { try { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt index d2804a9b..d48e833c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt @@ -3,19 +3,31 @@ package ml.docilealligator.infinityforreddit.reminder import android.app.AlarmManager import android.app.Application import android.app.PendingIntent +import android.content.Context import android.content.Intent +import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch +import ml.docilealligator.infinityforreddit.R import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase +import ml.docilealligator.infinityforreddit.activities.ViewPostDetailActivity import ml.docilealligator.infinityforreddit.broadcastreceivers.ReminderAlarmReceiver +import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper +import ml.docilealligator.infinityforreddit.utils.NotificationUtils +import java.util.Random class ReminderManager( private val applicationContext: Application, private val redditRoomDatabase: RedditDataRoomDatabase, - private val alarmManager: AlarmManager + private val alarmManager: AlarmManager, + private val customThemeWrapper: CustomThemeWrapper ) { suspend fun setReminder(reminder: Reminder) { redditRoomDatabase.reminderDao().insert(reminder) + setAlarm(reminder) + } + fun setAlarm(reminder: Reminder) { val alarmIntent = Intent( applicationContext, ReminderAlarmReceiver::class.java @@ -34,7 +46,60 @@ class ReminderManager( ) } + fun checkAndSetAllAlarms() { + MainScope().launch { + for (reminder in redditRoomDatabase.reminderDao().getAllReminders()) { + if (PendingIntent.getBroadcast(applicationContext, reminder.createdAt.toInt(), Intent( + applicationContext, + ReminderAlarmReceiver::class.java + ), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_NO_CREATE) == null) { + if (System.currentTimeMillis() >= reminder.reminderTime) { + sendNotification(applicationContext, customThemeWrapper, reminder) + redditRoomDatabase.reminderDao().deleteReminder(reminder) + } else { + setAlarm(reminder) + } + } + } + } + } + fun getAllRemindersFlow(): Flow> { return redditRoomDatabase.reminderDao().getAllRemindersFlow() } + + companion object { + fun sendNotification( + context: Context, + customThemeWrapper: CustomThemeWrapper, + reminder: Reminder + ) { + val notificationManager = NotificationUtils.getNotificationManager(context) + val builder = NotificationUtils.buildNotification( + notificationManager, + context, + context.getString(R.string.reminder), + reminder.content, + context.getString(if (reminder.commentId.isNotEmpty()) R.string.comment else R.string.post), + NotificationUtils.CHANNEL_ID_NEW_MESSAGES, + NotificationUtils.CHANNEL_NEW_MESSAGES, + NotificationUtils.GROUP_REMINDER, customThemeWrapper.colorPrimaryLightTheme + ) + + val intent = Intent(context, ViewPostDetailActivity::class.java) + intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, reminder.postId) + intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, reminder.commentId) + val pendingIntent = + PendingIntent.getActivity(context, reminder.createdAt.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + builder.setContentIntent(pendingIntent) + + try { + notificationManager.notify( + NotificationUtils.REMINDER_NOTIFICATION_ID + Random().nextInt(10000), builder.build() + ) + } catch (e: SecurityException) { + e.printStackTrace() + } + } + } } \ No newline at end of file