Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
android:allowBackup="true"
android:fullBackupContent="true"
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/kotlin/com/evilinsult/activities/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package com.evilinsult.activities

import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import android.widget.ProgressBar
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.evilinsult.R
import com.evilinsult.extensions.isNetworkAvailable
import com.evilinsult.extensions.openLink
import com.evilinsult.extensions.scheduleDailyInsultNotification
import com.evilinsult.extensions.tintMenu
import com.evilinsult.viewmodels.InsultViewModel
import com.evilinsult.viewmodels.Language
Expand All @@ -26,6 +31,21 @@ import java.nio.charset.StandardCharsets
@Suppress("RemoveExplicitTypeArguments")
class MainActivity : AppCompatActivity() {

private val requestNotificationPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()){}
private fun checkNotificationPermission(){
if(Build.VERSION.SDK_INT >= 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(
Expand Down Expand Up @@ -68,6 +88,7 @@ class MainActivity : AppCompatActivity() {
setSupportActionBar(toolbar)
initListeners()
generateInsult(true)
checkNotificationPermission() //notification channel call
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
Expand Down
34 changes: 34 additions & 0 deletions app/src/main/kotlin/com/evilinsult/extensions/Notification.kt
Original file line number Diff line number Diff line change
@@ -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)
}



Original file line number Diff line number Diff line change
@@ -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<NotificationWorker>(1, TimeUnit.DAYS)
.build()

WorkManager.getInstance(context)
.enqueueUniquePeriodicWork(
"dailyInsultNotification",
ExistingPeriodicWorkPolicy.REPLACE,
dailyWorkRequest
)
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome_v1" />
</adaptive-icon>
1 change: 1 addition & 0 deletions app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome_v1" />
</adaptive-icon>