feat: anilist notifications (real)
This commit is contained in:
parent
19697f4f39
commit
4d2a08c258
12 changed files with 390 additions and 95 deletions
|
@ -24,10 +24,9 @@ import kotlinx.coroutines.CoroutineScope
|
|||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import okhttp3.OkHttpClient
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
class NotificationWorker(appContext: Context, workerParams: WorkerParameters) :
|
||||
class CommentNotificationWorker(appContext: Context, workerParams: WorkerParameters) :
|
||||
Worker(appContext, workerParams) {
|
||||
override fun doWork(): Result {
|
||||
val scope = CoroutineScope(Dispatchers.IO)
|
||||
|
@ -62,7 +61,7 @@ class NotificationWorker(appContext: Context, workerParams: WorkerParameters) :
|
|||
""
|
||||
)
|
||||
} else {
|
||||
val title = "New Comment Reply"
|
||||
val title = "New CommentNotificationWorker Reply"
|
||||
val mediaName = names[it.mediaId]?.title ?: "Unknown"
|
||||
val message = "${it.username} replied to your comment in $mediaName"
|
||||
createNotification(
|
||||
|
@ -187,6 +186,7 @@ class NotificationWorker(appContext: Context, workerParams: WorkerParameters) :
|
|||
}
|
||||
|
||||
companion object {
|
||||
const val WORK_NAME = "ani.dantotsu.notifications.NotificationWorker"
|
||||
val checkIntervals = arrayOf(0L, 720, 1440)
|
||||
const val WORK_NAME = "ani.dantotsu.notifications.CommentNotificationWorker"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package ani.dantotsu.notifications.anilist
|
||||
|
||||
import android.Manifest
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.work.Worker
|
||||
import androidx.work.WorkerParameters
|
||||
import ani.dantotsu.R
|
||||
import ani.dantotsu.connections.anilist.Anilist
|
||||
import ani.dantotsu.profile.activity.ActivityItemBuilder
|
||||
import ani.dantotsu.profile.activity.FeedActivity
|
||||
import ani.dantotsu.settings.saving.PrefManager
|
||||
import ani.dantotsu.settings.saving.PrefName
|
||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class AnilistNotificationWorker(appContext: Context, workerParams: WorkerParameters) :
|
||||
Worker(appContext, workerParams) {
|
||||
|
||||
override fun doWork(): Result {
|
||||
val scope = CoroutineScope(Dispatchers.IO)
|
||||
scope.launch {
|
||||
PrefManager.init(applicationContext) //make sure prefs are initialized
|
||||
val userId = PrefManager.getVal<String>(PrefName.AnilistUserId)
|
||||
if (userId.isNotEmpty()) {
|
||||
Anilist.getSavedToken()
|
||||
val res = Anilist.query.getNotifications(userId.toInt(), resetNotification = false)
|
||||
val unreadNotificationCount = res?.data?.user?.unreadNotificationCount ?: 0
|
||||
if (unreadNotificationCount > 0) {
|
||||
val unreadNotifications = res?.data?.page?.notifications?.sortedBy { it.id }
|
||||
?.takeLast(unreadNotificationCount)
|
||||
val lastId = PrefManager.getVal<Int>(PrefName.LastAnilistNotificationId)
|
||||
val newNotifications = unreadNotifications?.filter { it.id > lastId }
|
||||
val filteredTypes =
|
||||
PrefManager.getVal<Set<String>>(PrefName.AnilistFilteredTypes)
|
||||
newNotifications?.forEach {
|
||||
if (!filteredTypes.contains(it.notificationType)) {
|
||||
val content = ActivityItemBuilder.getContent(it)
|
||||
val notification = createNotification(applicationContext, content)
|
||||
if (ActivityCompat.checkSelfPermission(
|
||||
applicationContext,
|
||||
Manifest.permission.POST_NOTIFICATIONS
|
||||
) == PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
NotificationManagerCompat.from(applicationContext)
|
||||
.notify(
|
||||
Notifications.CHANNEL_ANILIST,
|
||||
System.currentTimeMillis().toInt(),
|
||||
notification
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newNotifications?.isNotEmpty() == true) {
|
||||
PrefManager.setVal(PrefName.LastAnilistNotificationId, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
|
||||
private fun createNotification(
|
||||
context: Context,
|
||||
content: String
|
||||
): android.app.Notification {
|
||||
val title = "New Anilist Notification"
|
||||
val intent = Intent(applicationContext, FeedActivity::class.java)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
applicationContext,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
return NotificationCompat.Builder(context, Notifications.CHANNEL_ANILIST)
|
||||
.setSmallIcon(R.drawable.notification_icon)
|
||||
.setContentTitle(title)
|
||||
.setContentText(content)
|
||||
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setAutoCancel(true)
|
||||
.build()
|
||||
}
|
||||
|
||||
companion object {
|
||||
val checkIntervals = arrayOf(0L, 30, 60, 120, 240, 360, 720, 1440)
|
||||
const val WORK_NAME = "ani.dantotsu.notifications.anilist.AnilistNotificationWorker"
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue