package com.android.onboarding.process import android.annotation.TargetApi import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service import android.content.Intent import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE import android.os.Build import android.os.IBinder import android.util.Log /** * Service utilized to ensure that the calling process remains active and is protected from being * terminated by the system on displaying a foreground notification. */ class NotificationKeepAliveService : Service() { override fun onBind(intent: Intent?): IBinder? = null override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Log.d("KeepAliveService", "NotificationKeepAliveService Started") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { createNotificationChannel() val notification = Notification.Builder(this, "keep_alive_id") .setSmallIcon(R.drawable.notification_action_background) .setOngoing(true) .build() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { startForeground(NOTIFICATION_ID, notification, FOREGROUND_SERVICE_TYPE_SPECIAL_USE) } else { startForeground(NOTIFICATION_ID, notification) } } return START_STICKY } override fun onDestroy() { super.onDestroy() Log.d("KeepAliveService", "NotificationKeepAliveService Stopped") } @TargetApi(Build.VERSION_CODES.O) private fun createNotificationChannel() { val notificationChannel = NotificationChannel("keep_alive_id", "Keep Alive", NotificationManager.IMPORTANCE_MIN) val notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.createNotificationChannel(notificationChannel) } private companion object { const val NOTIFICATION_ID = 12345 } }