From 44a45e77f475a854ed2f2e6a4b11aab765e5910f Mon Sep 17 00:00:00 2001 From: lucky <> Date: Wed, 12 Jan 2022 09:38:37 +0300 Subject: [PATCH] null safety --- .../me/lucky/wasted/AppNotificationManager.kt | 10 +++++++--- .../main/java/me/lucky/wasted/CodeReceiver.kt | 5 +++-- .../java/me/lucky/wasted/DeviceAdminManager.kt | 18 ++++++++++-------- .../main/java/me/lucky/wasted/MainActivity.kt | 4 ++-- .../main/java/me/lucky/wasted/Preferences.kt | 4 ++-- .../java/me/lucky/wasted/RestartReceiver.kt | 3 ++- .../main/java/me/lucky/wasted/UnlockService.kt | 14 +++++++++----- .../java/me/lucky/wasted/WipeJobManager.kt | 12 +++++++----- 8 files changed, 42 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/me/lucky/wasted/AppNotificationManager.kt b/app/src/main/java/me/lucky/wasted/AppNotificationManager.kt index f14c15c..f3330af 100644 --- a/app/src/main/java/me/lucky/wasted/AppNotificationManager.kt +++ b/app/src/main/java/me/lucky/wasted/AppNotificationManager.kt @@ -10,11 +10,15 @@ class AppNotificationManager(private val ctx: Context) { const val CHANNEL_DEFAULT_ID = "default" } + private var manager: NotificationManager? = null + + init { + manager = ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager? + } + fun createNotificationChannels() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return - val notificationManager = - ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - notificationManager.createNotificationChannel( + manager?.createNotificationChannel( NotificationChannel( CHANNEL_DEFAULT_ID, ctx.getString(R.string.notification_channel_default_name), diff --git a/app/src/main/java/me/lucky/wasted/CodeReceiver.kt b/app/src/main/java/me/lucky/wasted/CodeReceiver.kt index e52185d..df5d267 100644 --- a/app/src/main/java/me/lucky/wasted/CodeReceiver.kt +++ b/app/src/main/java/me/lucky/wasted/CodeReceiver.kt @@ -9,7 +9,8 @@ class CodeReceiver : BroadcastReceiver() { const val KEY = "code" const val ACTION = "me.lucky.wasted.action.TRIGGER" - fun panic(context: Context, intent: Intent) { + fun panic(context: Context?, intent: Intent?) { + if (context == null || intent == null) return val prefs = Preferences(context) val code = prefs.code if (!prefs.isServiceEnabled || @@ -24,7 +25,7 @@ class CodeReceiver : BroadcastReceiver() { } } - override fun onReceive(context: Context, intent: Intent) { + override fun onReceive(context: Context?, intent: Intent?) { panic(context, intent) } } diff --git a/app/src/main/java/me/lucky/wasted/DeviceAdminManager.kt b/app/src/main/java/me/lucky/wasted/DeviceAdminManager.kt index de5cd22..4ab6f7f 100644 --- a/app/src/main/java/me/lucky/wasted/DeviceAdminManager.kt +++ b/app/src/main/java/me/lucky/wasted/DeviceAdminManager.kt @@ -7,16 +7,18 @@ import android.content.Intent import android.os.Build class DeviceAdminManager(private val ctx: Context) { - private val dpm by lazy { - ctx.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager - } + private var dpm: DevicePolicyManager? = null private val deviceAdmin by lazy { ComponentName(ctx, DeviceAdminReceiver::class.java) } private val prefs by lazy { Preferences(ctx) } - fun remove() = dpm.removeActiveAdmin(deviceAdmin) - fun isActive(): Boolean = dpm.isAdminActive(deviceAdmin) - fun getCurrentFailedPasswordAttempts(): Int = dpm.currentFailedPasswordAttempts - fun lockNow() = dpm.lockNow() + init { + dpm = ctx.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager? + } + + fun remove() = dpm?.removeActiveAdmin(deviceAdmin) + fun isActive(): Boolean = dpm?.isAdminActive(deviceAdmin) ?: false + fun getCurrentFailedPasswordAttempts(): Int = dpm?.currentFailedPasswordAttempts ?: 0 + fun lockNow() = dpm?.lockNow() fun wipeData() { var flags = 0 @@ -24,7 +26,7 @@ class DeviceAdminManager(private val ctx: Context) { flags = flags.or(DevicePolicyManager.WIPE_SILENTLY) if (prefs.isWipeESIM && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) flags = flags.or(DevicePolicyManager.WIPE_EUICC) - dpm.wipeData(flags) + dpm?.wipeData(flags) } fun makeRequestIntent(): Intent { diff --git a/app/src/main/java/me/lucky/wasted/MainActivity.kt b/app/src/main/java/me/lucky/wasted/MainActivity.kt index 7278d5f..e0ff4d9 100644 --- a/app/src/main/java/me/lucky/wasted/MainActivity.kt +++ b/app/src/main/java/me/lucky/wasted/MainActivity.kt @@ -47,7 +47,7 @@ open class MainActivity : AppCompatActivity() { private fun update() { if (!admin.isActive() && prefs.isServiceEnabled) Snackbar.make( - findViewById(R.id.toggle), + binding.toggle, R.string.service_unavailable_popup, Snackbar.LENGTH_SHORT, ).show() @@ -149,7 +149,7 @@ open class MainActivity : AppCompatActivity() { private fun showWipeJobServiceStartFailedPopup() { Snackbar.make( - findViewById(R.id.toggle), + binding.toggle, R.string.wipe_job_service_start_failed_popup, Snackbar.LENGTH_LONG, ).show() diff --git a/app/src/main/java/me/lucky/wasted/Preferences.kt b/app/src/main/java/me/lucky/wasted/Preferences.kt index e8925e2..e9f0379 100644 --- a/app/src/main/java/me/lucky/wasted/Preferences.kt +++ b/app/src/main/java/me/lucky/wasted/Preferences.kt @@ -38,8 +38,8 @@ class Preferences(ctx: Context) { get() = prefs.getBoolean(SERVICE_ENABLED, false) set(value) = prefs.edit { putBoolean(SERVICE_ENABLED, value) } - var code: String? - get() = prefs.getString(CODE, "") + var code: String + get() = prefs.getString(CODE, "") ?: "" set(value) = prefs.edit { putString(CODE, value) } var isCodeEnabled: Boolean diff --git a/app/src/main/java/me/lucky/wasted/RestartReceiver.kt b/app/src/main/java/me/lucky/wasted/RestartReceiver.kt index 256a1ca..a60b672 100644 --- a/app/src/main/java/me/lucky/wasted/RestartReceiver.kt +++ b/app/src/main/java/me/lucky/wasted/RestartReceiver.kt @@ -6,7 +6,8 @@ import android.content.Intent import androidx.core.content.ContextCompat class RestartReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { + override fun onReceive(context: Context?, intent: Intent?) { + if (context == null || intent == null) return if (intent.action != Intent.ACTION_BOOT_COMPLETED && intent.action != Intent.ACTION_MY_PACKAGE_REPLACED) return val prefs = Preferences(context) diff --git a/app/src/main/java/me/lucky/wasted/UnlockService.kt b/app/src/main/java/me/lucky/wasted/UnlockService.kt index 429a58b..91673b1 100644 --- a/app/src/main/java/me/lucky/wasted/UnlockService.kt +++ b/app/src/main/java/me/lucky/wasted/UnlockService.kt @@ -19,13 +19,17 @@ class UnlockService : Service() { private lateinit var receiver: BroadcastReceiver private class UnlockReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { + override fun onReceive(context: Context?, intent: Intent?) { + if (context == null) return val keyguardManager = context - .getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - if (!keyguardManager.isDeviceSecure) return + .getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager? + if (keyguardManager?.isDeviceSecure != true) return val manager = WipeJobManager(context) - while (manager.schedule() != JobScheduler.RESULT_SUCCESS) - SystemClock.sleep(1000) + var delay = 1000L + while (manager.schedule() != JobScheduler.RESULT_SUCCESS) { + SystemClock.sleep(delay) + delay = delay.shl(1) + } } } diff --git a/app/src/main/java/me/lucky/wasted/WipeJobManager.kt b/app/src/main/java/me/lucky/wasted/WipeJobManager.kt index c4fa4bc..1f7732c 100644 --- a/app/src/main/java/me/lucky/wasted/WipeJobManager.kt +++ b/app/src/main/java/me/lucky/wasted/WipeJobManager.kt @@ -11,24 +11,26 @@ class WipeJobManager(private val ctx: Context) { private const val JOB_ID = 1000 } private val prefs by lazy { Preferences(ctx) } - private val jobScheduler by lazy { - ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler + private var scheduler: JobScheduler? = null + + init { + scheduler = ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler? } fun schedule(): Int { - return jobScheduler.schedule( + return scheduler?.schedule( JobInfo.Builder(JOB_ID, ComponentName(ctx, WipeJobService::class.java)) .setMinimumLatency(TimeUnit.DAYS.toMillis(prefs.wipeOnInactivityDays.toLong())) .setBackoffCriteria(0, JobInfo.BACKOFF_POLICY_LINEAR) .setPersisted(true) .build() - ) + ) ?: JobScheduler.RESULT_FAILURE } fun setState(value: Boolean): Boolean { if (value) { if (schedule() == JobScheduler.RESULT_FAILURE) return false - } else { jobScheduler.cancel(JOB_ID) } + } else { scheduler?.cancel(JOB_ID) } return true } }