Continue implementing reminders.

This commit is contained in:
Docile-Alligator
2026-06-28 22:27:31 -04:00
parent 1b1f087495
commit 28f3fa32d7
4 changed files with 83 additions and 5 deletions

View File

@ -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
);
}
}

View File

@ -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)

View File

@ -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 {

View File

@ -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<List<Reminder>> {
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()
}
}
}
}