Extract notification creation process to external class

This commit is contained in:
2020-05-10 16:38:44 +02:00
parent 222fc3b882
commit 76ed48eaf3
2 changed files with 73 additions and 46 deletions

View File

@@ -0,0 +1,69 @@
package io.bartek.service
import android.annotation.SuppressLint
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import io.bartek.MainActivity
import io.bartek.R
class ForegroundNotificationFactory(private val context: Context) {
private val oreo: Boolean
get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
fun createForegroundNotification(port: Int): Notification {
createNotificationChannel()
val pendingIntent = createPendingIntent()
return buildNotification(port, pendingIntent)
}
@Suppress("DEPRECATION")
private fun buildNotification(port: Int, pendingIntent: PendingIntent?) =
provideNotificationBuilder()
.setContentTitle(context.resources.getString(R.string.service_notification_title))
.setContentText(context.resources.getString(R.string.service_notification_text, port))
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_foreground_service)
.setTicker(context.getString(R.string.service_notification_text))
.setPriority(Notification.PRIORITY_HIGH) // for under android 26 compatibility
.build()
@SuppressLint("NewApi")
private fun createNotificationChannel() {
if (oreo) {
val manager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel(
NOTIFICATION_CHANNEL_ID,
context.resources.getString(R.string.service_notification_category_name),
NotificationManager.IMPORTANCE_HIGH
).let {
it.description =
context.resources.getString(R.string.service_notification_category_description)
it
}
manager.createNotificationChannel(channel)
}
}
private fun createPendingIntent() =
Intent(context, MainActivity::class.java).let { notificationIntent ->
PendingIntent.getActivity(context, 0, notificationIntent, 0)
}
@Suppress("DEPRECATION")
@SuppressLint("NewApi")
private fun provideNotificationBuilder() =
if (oreo) Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
else Notification.Builder(context)
companion object {
private const val NOTIFICATION_CHANNEL_ID = "TTSService.NOTIFICATION_CHANNEL"
}
}

View File

@@ -1,15 +1,11 @@
package io.bartek.service package io.bartek.service
import android.app.* import android.app.Service
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.Color
import android.os.Build
import android.os.PowerManager import android.os.PowerManager
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import io.bartek.MainActivity
import io.bartek.R
import io.bartek.preference.PreferenceKey import io.bartek.preference.PreferenceKey
import io.bartek.web.TTSServer import io.bartek.web.TTSServer
@@ -21,50 +17,12 @@ class ForegroundService : Service() {
private var ttsServer: TTSServer? = null private var ttsServer: TTSServer? = null
private val port: Int private val port: Int
get() = preferences.getInt(PreferenceKey.PORT, 8080) get() = preferences.getInt(PreferenceKey.PORT, 8080)
private val notificationFactory = ForegroundNotificationFactory(this)
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
preferences = PreferenceManager.getDefaultSharedPreferences(this) preferences = PreferenceManager.getDefaultSharedPreferences(this)
startForeground(1, createNotification()) startForeground(1, notificationFactory.createForegroundNotification(port))
}
private fun createNotification(): Notification {
// depending on the Android API that we're dealing with we will have
// to use a specific method to create the notification
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager;
val channel = NotificationChannel(
NOTIFICATION_CHANNEL_ID,
resources.getString(R.string.service_notification_category_name),
NotificationManager.IMPORTANCE_HIGH
).let {
it.description = resources.getString(R.string.service_notification_category_description)
it.enableLights(true)
it.lightColor = Color.RED
it.enableVibration(true)
it.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
it
}
notificationManager.createNotificationChannel(channel)
}
val pendingIntent: PendingIntent = Intent(this, MainActivity::class.java).let { notificationIntent ->
PendingIntent.getActivity(this, 0, notificationIntent, 0)
}
val builder: Notification.Builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) Notification.Builder(
this,
NOTIFICATION_CHANNEL_ID
) else Notification.Builder(this)
return builder
.setContentTitle(resources.getString(R.string.service_notification_title))
.setContentText(resources.getString(R.string.service_notification_text, port))
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_foreground_service)
.setTicker("Ticker text")
.setPriority(Notification.PRIORITY_HIGH) // for under android 26 compatibility
.build()
} }
override fun onBind(intent: Intent) = null override fun onBind(intent: Intent) = null
@@ -116,7 +74,7 @@ class ForegroundService : Service() {
// to check whether the service is already running // to check whether the service is already running
// than to place it as a static field // than to place it as a static field
var state = ServiceState.STOPPED var state = ServiceState.STOPPED
private const val NOTIFICATION_CHANNEL_ID = "TTSService.NOTIFICATION_CHANNEL"
private const val WAKELOCK_TAG = "ForegroundService::lock" private const val WAKELOCK_TAG = "ForegroundService::lock"
const val CHANGE_STATE = "io.bartek.service.CHANGE_STATE" const val CHANGE_STATE = "io.bartek.service.CHANGE_STATE"
const val STATE = "STATE" const val STATE = "STATE"