diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 645080f0..b78b9287 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -93,4 +93,5 @@ dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6") implementation("org.jsoup:jsoup:1.18.1") implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.work:work-runtime-ktx:2.9.1") } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7fcbaf83..38074414 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ + = Build.VERSION_CODES.TIRAMISU){ + if(ContextCompat.checkSelfPermission(this,android.Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED){ + scheduleDailyInsultNotification(this) + }else{ + requestNotificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + } + }else{ + scheduleDailyInsultNotification(this) + } + } + private val proposalUrl: String by lazy { "mailto:marvin@evilinsult.com?subject=" + URLEncoder.encode( @@ -68,6 +88,7 @@ class MainActivity : AppCompatActivity() { setSupportActionBar(toolbar) initListeners() generateInsult(true) + checkNotificationPermission() //notification channel call } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/kotlin/com/evilinsult/extensions/Notification.kt b/app/src/main/kotlin/com/evilinsult/extensions/Notification.kt new file mode 100644 index 00000000..730eede0 --- /dev/null +++ b/app/src/main/kotlin/com/evilinsult/extensions/Notification.kt @@ -0,0 +1,34 @@ +package com.evilinsult.extensions + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build +import androidx.core.app.NotificationCompat +import com.evilinsult.R + +fun showInsultNotification(context: Context, insult: String) { + val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val channelId = "insult_channel" + val channelName = "Insult Notifications" + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT) + notificationManager.createNotificationChannel(channel) + } + val bigTextStyle = NotificationCompat.BigTextStyle() + .bigText(insult) + + val notification = NotificationCompat.Builder(context, channelId) + .setContentTitle("Insult of the Day") + .setContentText(insult) + .setStyle(bigTextStyle) + .setSmallIcon(R.mipmap.ic_launcher_round) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setAutoCancel(true) + .build() + notificationManager.notify(1, notification) +} + + + diff --git a/app/src/main/kotlin/com/evilinsult/extensions/NotificationWorker.kt b/app/src/main/kotlin/com/evilinsult/extensions/NotificationWorker.kt new file mode 100644 index 00000000..cc94d676 --- /dev/null +++ b/app/src/main/kotlin/com/evilinsult/extensions/NotificationWorker.kt @@ -0,0 +1,44 @@ +package com.evilinsult.extensions + +import android.content.Context +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import java.util.concurrent.TimeUnit + +class NotificationWorker( + private val context: Context, + workerParams: WorkerParameters +):Worker(context,workerParams){ + override fun doWork(): Result { + val insult = fetchInsultFromApi() ?: "Your random insult" + showInsultNotification(context,insult) + return Result.success() + } + + private fun fetchInsultFromApi(): String? { + return try { + val insultUrl = "https://www.evilinsult.com/generate_insult.php?lang=en" + val doc: Document? = Jsoup.connect(insultUrl).get() + doc?.text()?.trim() + }catch (e:Exception){ + e.printStackTrace() + null + } + } +} +fun scheduleDailyInsultNotification(context: Context){ + val dailyWorkRequest = PeriodicWorkRequestBuilder(1, TimeUnit.DAYS) + .build() + + WorkManager.getInstance(context) + .enqueueUniquePeriodicWork( + "dailyInsultNotification", + ExistingPeriodicWorkPolicy.REPLACE, + dailyWorkRequest + ) +} diff --git a/app/src/main/res/drawable/ic_launcher_monochrome_v1.png b/app/src/main/res/drawable/ic_launcher_monochrome_v1.png new file mode 100644 index 00000000..4d6d4ba8 Binary files /dev/null and b/app/src/main/res/drawable/ic_launcher_monochrome_v1.png differ diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 8fde4563..6c4ba1f3 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,5 +2,5 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cfe..d6e6583e 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file