X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacycell%2Fservices%2FRealtimeMonitoringService.kt;h=681a3da2b41ccb1c8f0d88f30d685533a19c790b;hb=fb7c0422487bfb7cbb65427468c2688c24b4b99b;hp=663c178016e701f2ea4650feb72745cc93b53dad;hpb=08d7a49066e6a6c62d9a2035686e50597b231336;p=PrivacyCell.git diff --git a/app/src/main/java/com/stoutner/privacycell/services/RealtimeMonitoringService.kt b/app/src/main/java/com/stoutner/privacycell/services/RealtimeMonitoringService.kt index 663c178..681a3da 100644 --- a/app/src/main/java/com/stoutner/privacycell/services/RealtimeMonitoringService.kt +++ b/app/src/main/java/com/stoutner/privacycell/services/RealtimeMonitoringService.kt @@ -27,32 +27,49 @@ import android.app.PendingIntent import android.app.Service import android.content.Context import android.content.Intent +import android.os.Binder import android.os.IBinder import android.telephony.PhoneStateListener import android.telephony.TelephonyDisplayInfo import android.telephony.TelephonyManager +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager + import com.stoutner.privacycell.R import com.stoutner.privacycell.activities.PrivacyCellActivity +import com.stoutner.privacycell.workers.RegisterRealtimeListener + +import java.util.concurrent.TimeUnit // Define the class constants. const val REALTIME_MONITORING = "realtime_monitoring" const val NOTIFICATION_ID = 1 +const val UNKNOWN_NETWORK = "unknown_network" class RealtimeMonitoringService : Service() { companion object { - // Define the public constants. + // Define the public constants. These are used in the settings fragment to launch intents to edit the sound that plays for each channel. const val SECURE_NETWORK = "secure_network" const val INSECURE_NETWORK = "insecure_network" - const val UNKNOWN_NETWORK = "unknown_network" } - override fun onBind(intent: Intent?): IBinder? { - // Do nothing. - return null + // Define the class variables. + private var currentStatus = "" + private lateinit var phoneStateListener: PhoneStateListener + + inner class ServiceBinder : Binder() { + // Get a copy of this service as a binder. + fun getService(): RealtimeMonitoringService = this@RealtimeMonitoringService + } + + override fun onBind(intent: Intent?): IBinder { + // Return a copy of the service binder. + return ServiceBinder() } - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // Get a handle for the notification manager. val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager @@ -60,8 +77,8 @@ class RealtimeMonitoringService : Service() { notificationManager.createNotificationChannelGroup(NotificationChannelGroup(REALTIME_MONITORING, getString(R.string.realtime_monitoring))) // Prepare the notification channels. - val secureNetworkChannel = NotificationChannel(SECURE_NETWORK, getString(R.string.secure_network_channel), NotificationManager.IMPORTANCE_DEFAULT) - val insecureNetworkChannel = NotificationChannel(INSECURE_NETWORK, getString(R.string.insecure_network_channel), NotificationManager.IMPORTANCE_DEFAULT) + val secureNetworkChannel = NotificationChannel(SECURE_NETWORK, getString(R.string.secure_network_channel), NotificationManager.IMPORTANCE_HIGH) + val insecureNetworkChannel = NotificationChannel(INSECURE_NETWORK, getString(R.string.insecure_network_channel), NotificationManager.IMPORTANCE_HIGH) val unknownNetworkChannel = NotificationChannel(UNKNOWN_NETWORK, getString(R.string.unknown_network_channel), NotificationManager.IMPORTANCE_LOW) // Set the notification channel group. @@ -107,14 +124,8 @@ class RealtimeMonitoringService : Service() { // Start the foreground notification. startForeground(NOTIFICATION_ID, notificationBuilder.build()) - // Get a handle for the telephony manager and the context. - val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager - - // Initialize the current status. - var currentStatus = "" - - // Listen for changes to the phone state. - telephonyManager.listen(object : PhoneStateListener() { + // Define the phone state listener. + phoneStateListener = object : PhoneStateListener() { override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) { // Populate the notification according to the network type. if (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_NR) { // This is a secure 5G NR SA network. @@ -143,7 +154,7 @@ class RealtimeMonitoringService : Service() { } } else { // This is not a secure 5G NR SA network. // Only update the notification if the network status has changed. - if (currentStatus !=INSECURE_NETWORK) { + if (currentStatus != INSECURE_NETWORK) { // Create an insecure network notification builder. val insecureNetworkNotificationBuilder = Notification.Builder(applicationContext, INSECURE_NETWORK) @@ -167,9 +178,27 @@ class RealtimeMonitoringService : Service() { } } } - }, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED) + } + + // Create a register realtime listener work request that fires every hour. For some reason, when the service launches it will initially register the listener and then unregister it. + // This periodic request will fire shortly thereafter (it fires about every hour near the beginning of the hour) and will reregister the listener, which will stick this time. + val registerRealtimeListenerWorkRequest = PeriodicWorkRequestBuilder(1, TimeUnit.HOURS).build() + + // Register the realtime listener work request. + WorkManager.getInstance(this).enqueueUniquePeriodicWork(getString(R.string.register_listener_work_request), ExistingPeriodicWorkPolicy.REPLACE, registerRealtimeListenerWorkRequest) // Return a sticky service. return START_STICKY } + + fun registerTelephonyManagerListener() { + // Get a handle for the telephony manager. + val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager + + // Cancel the current listener if it exists. + telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE) + + // Listen for changes to the phone state. + telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED) + } } \ No newline at end of file