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