From 27eb3313fccf3f578ee8f4b1b03b27bfe9bb661d Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:27:37 -0400 Subject: [PATCH] Continue implementing reminders. --- app/src/main/AndroidManifest.xml | 1 + .../infinityforreddit/AppComponent.java | 3 + .../ReminderAlarmReceiver.kt | 81 +++++++++++++++++++ .../reminder/ReminderAlarmReceiver.kt | 18 ----- .../infinityforreddit/reminder/ReminderDao.kt | 4 + .../reminder/ReminderManager.kt | 14 +++- .../utils/NotificationUtils.java | 2 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt delete mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderAlarmReceiver.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 15b53e96..bccca04e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -482,6 +482,7 @@ android:permission="android.permission.BIND_JOB_SERVICE" /> + \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java index 975173ef..c44fa846 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java @@ -90,6 +90,7 @@ import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment; import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragmentNew; import ml.docilealligator.infinityforreddit.fragments.ViewRedditGalleryImageOrGifFragment; import ml.docilealligator.infinityforreddit.fragments.ViewRedditGalleryVideoFragment; +import ml.docilealligator.infinityforreddit.broadcastreceivers.ReminderAlarmReceiver; import ml.docilealligator.infinityforreddit.services.DownloadMediaService; import ml.docilealligator.infinityforreddit.services.DownloadRedditVideoService; import ml.docilealligator.infinityforreddit.services.EditProfileService; @@ -339,6 +340,8 @@ public interface AppComponent { void inject(SetReminderActivity setReminderActivity); + void inject(ReminderAlarmReceiver reminderAlarmReceiver); + @Component.Factory interface Factory { AppComponent create(@BindsInstance Application application); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt new file mode 100644 index 00000000..a25421bc --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/ReminderAlarmReceiver.kt @@ -0,0 +1,81 @@ +package ml.docilealligator.infinityforreddit.broadcastreceivers + +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import ml.docilealligator.infinityforreddit.Infinity +import ml.docilealligator.infinityforreddit.R +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.utils.NotificationUtils +import java.util.Random +import javax.inject.Inject +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +class ReminderAlarmReceiver: BroadcastReceiver() { + @Inject + lateinit var mRedditRoomDatabase: RedditDataRoomDatabase + @Inject + lateinit var mCustomThemeWrapper: CustomThemeWrapper + + @OptIn(DelicateCoroutinesApi::class) + override fun onReceive(context: Context, intent: Intent) { + val reminder: Reminder? = intent.getParcelableExtra(EXTRA_REMINDER) + reminder?.let { + (context.applicationContext as Infinity).appComponent.inject(this) + 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), + NotificationUtils.CHANNEL_ID_NEW_MESSAGES, + NotificationUtils.CHANNEL_NEW_MESSAGES, + NotificationUtils.GROUP_REMINDER, mCustomThemeWrapper.colorPrimaryLightTheme + ) + + val intent = Intent(context, ViewPostDetailActivity::class.java) + intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, it.postId) + intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, it.commentId) + val pendingIntent = + PendingIntent.getActivity(context, 100, 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() + } + + doAsync(GlobalScope) { + try { + mRedditRoomDatabase.reminderDao().deleteReminder(it) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + } + + companion object { + const val EXTRA_REMINDER = "ER" + } +} + +fun BroadcastReceiver.doAsync( + appScope: CoroutineScope, + coroutineContext: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> Unit +) { + val pendingResult = goAsync() + appScope.launch(coroutineContext) { block() }.invokeOnCompletion { pendingResult.finish() } +} \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderAlarmReceiver.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderAlarmReceiver.kt deleted file mode 100644 index aa400d18..00000000 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderAlarmReceiver.kt +++ /dev/null @@ -1,18 +0,0 @@ -package ml.docilealligator.infinityforreddit.reminder - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent - -class ReminderAlarmReceiver: BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val reminder: Reminder? = intent.getParcelableExtra(EXTRA_REMINDER) - reminder?.let { - - } - } - - companion object { - val EXTRA_REMINDER = "ER" - } -} \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderDao.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderDao.kt index 6c3e18f8..c4a243e7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderDao.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderDao.kt @@ -1,6 +1,7 @@ package ml.docilealligator.infinityforreddit.reminder import androidx.room.Dao +import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query @@ -16,4 +17,7 @@ interface ReminderDao { @Query("SELECT * FROM reminders") fun getAllRemindersFlow(): Flow> + + @Delete + suspend fun deleteReminder(reminder: Reminder) } \ No newline at end of file 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 20639c07..fbe33fc5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/reminder/ReminderManager.kt @@ -6,6 +6,7 @@ import android.app.PendingIntent import android.content.Intent import kotlinx.coroutines.flow.Flow import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase +import ml.docilealligator.infinityforreddit.broadcastreceivers.ReminderAlarmReceiver class ReminderManager( private val applicationContext: Application, @@ -15,10 +16,15 @@ class ReminderManager( suspend fun setReminder(reminder: Reminder) { redditRoomDatabase.reminderDao().insert(reminder) - val alarmIntent = Intent(applicationContext, - ReminderAlarmReceiver::class.java).let { intent -> - PendingIntent.getBroadcast(applicationContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + val alarmIntent = Intent( + applicationContext, + ReminderAlarmReceiver::class.java + ).let { intent -> + intent.putExtra(ReminderAlarmReceiver.EXTRA_REMINDER, reminder) + PendingIntent.getBroadcast( + applicationContext, 0, intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) } alarmManager.set( diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/NotificationUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/NotificationUtils.java index f4875e3d..2e997499 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/NotificationUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/NotificationUtils.java @@ -29,11 +29,13 @@ public class NotificationUtils { public static final int DOWNLOAD_GIF_NOTIFICATION_ID = 50000; public static final int MATERIAL_YOU_NOTIFICATION_ID = 60000; public static final int EDIT_PROFILE_SERVICE_NOTIFICATION_ID = 70000; + public static final int REMINDER_NOTIFICATION_ID = 80000; private static final int SUMMARY_BASE_ID_UNREAD_MESSAGE = 0; private static final int NOTIFICATION_BASE_ID_UNREAD_MESSAGE = 1; private static final String GROUP_USER_BASE = "ml.docilealligator.infinityforreddit."; + public static final String GROUP_REMINDER = "ml.docilealligator.infinityforreddit.reminder@group"; public static NotificationCompat.Builder buildNotification(NotificationManagerCompat notificationManager, Context context, String title, String content, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f3cf3657..f15bd8d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1659,4 +1659,5 @@ The reminder time must be in the future. Invalid post id Reminder set + Reminder