X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyCell.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacycell%2Fworkers%2FRegisterRealtimeListener.kt;fp=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacycell%2Fworkers%2FRegisterRealtimeListener.kt;h=eaa8a5512d45f37d9ce80d233c3fa606acfeb146;hp=0000000000000000000000000000000000000000;hb=cb92ea552a5ffa8ca3142053660e3a73afc9240a;hpb=08d7a49066e6a6c62d9a2035686e50597b231336 diff --git a/app/src/main/java/com/stoutner/privacycell/workers/RegisterRealtimeListener.kt b/app/src/main/java/com/stoutner/privacycell/workers/RegisterRealtimeListener.kt new file mode 100644 index 0000000..eaa8a55 --- /dev/null +++ b/app/src/main/java/com/stoutner/privacycell/workers/RegisterRealtimeListener.kt @@ -0,0 +1,94 @@ +/* + * Copyright © 2021 Soren Stoutner . + * + * This file is part of Privacy Cell . + * + * Privacy Cell is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Privacy Cell is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Privacy Cell. If not, see . + */ + +package com.stoutner.privacycell.workers + +import android.app.ActivityManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.os.IBinder + +import androidx.preference.PreferenceManager +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters + +import com.stoutner.privacycell.R +import com.stoutner.privacycell.services.RealtimeMonitoringService + +class RegisterRealtimeListener (appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) { + // Store the application context. + private val context = appContext + + override fun doWork(): Result { + // Get a handle for the shared preferences. + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + // Get the realtime monitoring preference. Sometimes the shared preferences can't return a value in time, because Android sucks. + // So, the default value is set to true, which is the safest value if the shared preferences can't be queried. + val realtimeMonitoring = sharedPreferences.getBoolean(context.getString(R.string.realtime_monitoring_key), true) + + // Perform the functions according to the realtime monitoring status. + if (realtimeMonitoring) { // Realtime monitoring is enabled. + // Get a handle for the activity manager. + val activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + + // Get a list of the running service info. The deprecated `getRunningServices()` now only returns services stared by Privacy Cell, but that is all we want to know anyway. + val runningServiceInfoList: List = activityManager.getRunningServices(1) + + // Check to see if the service is currently running. + if (runningServiceInfoList.isEmpty()) { // The service is currently stopped. + // Start the service. + context.startService(Intent(context, RealtimeMonitoringService::class.java)) + } else { // The service is currently running. + // Create a service connection. + val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(componentName: ComponentName, serviceIBinder: IBinder) { + // Get a handle for the realtime monitoring service binder. + val realtimeMonitoringServiceBinder = serviceIBinder as RealtimeMonitoringService.ServiceBinder + + // Get a handle for the realtime monitoring service. + val realtimeMonitoringService = realtimeMonitoringServiceBinder.getService() + + // Register the telephony manager listener. + realtimeMonitoringService.registerTelephonyManagerListener() + + // Unbind the service. + context.unbindService(this) + } + + override fun onServiceDisconnected(componentName: ComponentName) { + // Do nothing. + } + } + + // Bind to the realtime monitoring service. + context.bindService(Intent(context, RealtimeMonitoringService::class.java), serviceConnection, 0) + } + } else { // Realtime monitoring is disabled. + // Cancel the realtime listener work request. + WorkManager.getInstance(context).cancelUniqueWork(context.getString(R.string.register_listener_work_request)) + } + + // Return a success. + return Result.success() + } +} \ No newline at end of file