From bbea1bed994fa3a32155ea41a84ecb80245d9b63 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 28 Jul 2022 12:39:56 +0200 Subject: [PATCH] intial structure --- app/build.gradle | 1 + .../main/java/com/github/libretube/MyApp.kt | 22 ++++- .../libretube/util/NotificationHelper.kt | 88 +++++++++++++++++++ .../libretube/util/NotificationWorker.kt | 17 ++++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/github/libretube/util/NotificationHelper.kt create mode 100644 app/src/main/java/com/github/libretube/util/NotificationWorker.kt diff --git a/app/build.gradle b/app/build.gradle index 3dbb1a7a7..b70c96036 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation libs.androidx.navigation.fragment implementation libs.androidx.navigation.ui implementation libs.androidx.preference + implementation "androidx.work:work-runtime-ktx:2.7.1" androidTestImplementation libs.androidx.test.junit androidTestImplementation libs.androidx.test.espressoCore diff --git a/app/src/main/java/com/github/libretube/MyApp.kt b/app/src/main/java/com/github/libretube/MyApp.kt index 1baa1f2dc..684dd9ed8 100644 --- a/app/src/main/java/com/github/libretube/MyApp.kt +++ b/app/src/main/java/com/github/libretube/MyApp.kt @@ -6,7 +6,16 @@ import android.app.NotificationManager import android.os.Build import android.os.StrictMode import android.os.StrictMode.VmPolicy +import androidx.work.Constraints +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.NotificationHelper +import com.github.libretube.util.NotificationWorker +import java.util.concurrent.TimeUnit + class MyApp : Application() { override fun onCreate() { @@ -27,6 +36,11 @@ class MyApp : Application() { */ val builder = VmPolicy.Builder() StrictMode.setVmPolicy(builder.build()) + + /** + * initialize the notification + */ + NotificationHelper.enqueueWork(this) } /** @@ -36,7 +50,7 @@ class MyApp : Application() { createNotificationChannel( "download_service", "Download Service", - "DownloadService", + "Shows a notification when downloading media.", NotificationManager.IMPORTANCE_NONE ) createNotificationChannel( @@ -45,6 +59,12 @@ class MyApp : Application() { "Shows a notification with buttons to control the audio player", NotificationManager.IMPORTANCE_LOW ) + createNotificationChannel( + "notification_worker", + "Notification Worker", + "Shows a notification when new streams are available.", + NotificationManager.IMPORTANCE_DEFAULT + ) } private fun createNotificationChannel( diff --git a/app/src/main/java/com/github/libretube/util/NotificationHelper.kt b/app/src/main/java/com/github/libretube/util/NotificationHelper.kt new file mode 100644 index 000000000..f33cc4e6e --- /dev/null +++ b/app/src/main/java/com/github/libretube/util/NotificationHelper.kt @@ -0,0 +1,88 @@ +package com.github.libretube.util + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.work.Constraints +import androidx.work.CoroutineWorker +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import com.github.libretube.R +import com.github.libretube.activities.MainActivity +import com.github.libretube.obj.StreamItem +import com.github.libretube.preferences.PreferenceHelper +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.util.concurrent.TimeUnit +import java.util.stream.Stream + +object NotificationHelper { + fun enqueueWork( + context: Context + ) { + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + + val myWorkBuilder = PeriodicWorkRequest.Builder( + NotificationWorker::class.java, + 1, + TimeUnit.SECONDS + ) + .setConstraints(constraints) + + val myWork = myWorkBuilder.build() + WorkManager.getInstance(context) + .enqueueUniquePeriodicWork( + "NotificationService", + ExistingPeriodicWorkPolicy.REPLACE, + myWork + ) + } + + fun checkForNewStreams(context: Context) { + val token = PreferenceHelper.getToken() + var response: List + runBlocking { + val task = async { + RetrofitInstance.authApi.getFeed(token) + } + response = task.await() + } + createNotification( + context, + response[0].title.toString(), + response[0].uploaderName.toString() + ) + } + + fun createNotification(context: Context, title: String, description: String) { + val intent = Intent(context, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) + + val builder = NotificationCompat.Builder(context, "notification_worker") + .setContentTitle(title) + .setSmallIcon(R.drawable.ic_bell) + .setContentText(description) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + // Set the intent that will fire when the user taps the notification + .setContentIntent(pendingIntent) + .setAutoCancel(true) + with(NotificationManagerCompat.from(context)) { + // notificationId is a unique int for each notification that you must define + notify(2, builder.build()) + } + + } + +} diff --git a/app/src/main/java/com/github/libretube/util/NotificationWorker.kt b/app/src/main/java/com/github/libretube/util/NotificationWorker.kt new file mode 100644 index 000000000..0e8b58171 --- /dev/null +++ b/app/src/main/java/com/github/libretube/util/NotificationWorker.kt @@ -0,0 +1,17 @@ +package com.github.libretube.util + +import android.content.Context +import android.util.Log +import androidx.work.Worker +import androidx.work.WorkerParameters + +class NotificationWorker(appContext: Context, parameters: WorkerParameters) : Worker(appContext, parameters) { + private val TAG = "NotificationWorker" + + override fun doWork(): Result { + Log.e(TAG, "working") + NotificationHelper.checkForNewStreams(applicationContext) + NotificationHelper.enqueueWork(applicationContext) + return Result.success() + } +}