From f6a6f34a810d143b490d868829a0f582d6418f59 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 12 Sep 2024 12:05:27 +0530 Subject: [PATCH] Switch to getSystemService's extension method everywhere Null-safe and avoids type-casting Signed-off-by: Aayush Gupta --- app/src/main/java/com/aurora/extensions/Context.kt | 13 ++++++------- app/src/main/java/com/aurora/extensions/View.kt | 10 +++++----- .../com/aurora/store/data/installer/AppInstaller.kt | 6 +++--- .../data/providers/NativeDeviceInfoProvider.kt | 7 +++---- .../store/data/providers/PermissionProvider.kt | 6 +++--- .../store/data/receiver/InstallerStatusReceiver.kt | 6 +++--- .../com/aurora/store/data/work/DownloadWorker.kt | 11 ++++------- .../java/com/aurora/store/data/work/ExportWorker.kt | 5 ++--- .../java/com/aurora/store/data/work/UpdateWorker.kt | 10 +++++----- .../java/com/aurora/store/util/NotificationUtil.kt | 7 +++---- .../view/ui/preferences/InstallationPreference.kt | 9 ++++----- .../store/viewmodel/network/NetworkViewModel.kt | 10 +++++----- 12 files changed, 46 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/aurora/extensions/Context.kt b/app/src/main/java/com/aurora/extensions/Context.kt index 053086ec2..c6247c34a 100644 --- a/app/src/main/java/com/aurora/extensions/Context.kt +++ b/app/src/main/java/com/aurora/extensions/Context.kt @@ -38,6 +38,7 @@ import android.view.LayoutInflater import androidx.browser.customtabs.CustomTabsIntent import androidx.core.app.ActivityCompat import androidx.core.app.ActivityOptionsCompat +import androidx.core.content.getSystemService import com.aurora.Constants import com.aurora.gplayapi.data.models.App import com.aurora.store.R @@ -101,9 +102,9 @@ fun Context.getEmptyActivityBundle(): Bundle? { } fun Context.copyToClipBoard(data: String?) { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = getSystemService() val clip = ClipData.newPlainText("Download Url", data) - clipboard.setPrimaryClip(clip) + clipboard?.setPrimaryClip(clip) } fun Context.getStyledAttributeColor(id: Int): Int { @@ -115,9 +116,7 @@ fun Context.getStyledAttributeColor(id: Int): Int { fun Context.isIgnoringBatteryOptimizations(): Boolean { return if (isMAndAbove()) { - (getSystemService(Context.POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations( - packageName - ) + (getSystemService())?.isIgnoringBatteryOptimizations(packageName) ?: true } else { true } @@ -137,8 +136,8 @@ fun Context.isExternalStorageAccessible(): Boolean { fun Context.isDomainVerified(domain: String): Boolean { return if (isSAndAbove()) { - val domainVerificationManager = getSystemService(DomainVerificationManager::class.java) - val userState = domainVerificationManager.getDomainVerificationUserState(packageName) + val domainVerificationManager = getSystemService() + val userState = domainVerificationManager!!.getDomainVerificationUserState(packageName) val domainMap = userState?.hostToStateMap?.filterKeys { it == domain } domainMap?.values?.first() == DomainVerificationUserState.DOMAIN_STATE_SELECTED } else { diff --git a/app/src/main/java/com/aurora/extensions/View.kt b/app/src/main/java/com/aurora/extensions/View.kt index bf306d159..c7ca5629c 100644 --- a/app/src/main/java/com/aurora/extensions/View.kt +++ b/app/src/main/java/com/aurora/extensions/View.kt @@ -19,9 +19,9 @@ package com.aurora.extensions -import android.content.Context import android.view.View import android.view.inputmethod.InputMethodManager +import androidx.core.content.getSystemService fun View.isVisible() = visibility == View.VISIBLE @@ -38,15 +38,15 @@ fun View.invisible() { } fun View.showKeyboard() { - val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + val imm = context.getSystemService() this.requestFocus() - imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) + imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) } fun View.hideKeyboard(): Boolean { try { - val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - return imm.hideSoftInputFromWindow(windowToken, 0) + val imm = context.getSystemService() + return imm?.hideSoftInputFromWindow(windowToken, 0) ?: false } catch (ignored: RuntimeException) { } return false diff --git a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt index bddf51a62..b888a8daa 100644 --- a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt @@ -28,6 +28,7 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi +import androidx.core.content.getSystemService import androidx.core.content.pm.PackageInfoCompat import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isPAndAbove @@ -101,10 +102,9 @@ class AppInstaller @Inject constructor( } fun notifyInstallation(context: Context, displayName: String, packageName: String) { - val notificationManager = - context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val notificationManager = context.getSystemService() val notification = NotificationUtil.getInstallNotification(context, displayName, packageName) - notificationManager.notify(packageName.hashCode(), notification) + notificationManager!!.notify(packageName.hashCode(), notification) } fun getErrorString(context: Context, status: Int): String { diff --git a/app/src/main/java/com/aurora/store/data/providers/NativeDeviceInfoProvider.kt b/app/src/main/java/com/aurora/store/data/providers/NativeDeviceInfoProvider.kt index b7e331faf..f61c1123f 100644 --- a/app/src/main/java/com/aurora/store/data/providers/NativeDeviceInfoProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/NativeDeviceInfoProvider.kt @@ -20,9 +20,9 @@ package com.aurora.store.data.providers import android.app.ActivityManager import android.content.Context -import android.content.Context.ACTIVITY_SERVICE import android.content.res.Configuration import android.os.Build +import androidx.core.content.getSystemService import com.aurora.extensions.isHuawei import java.util.Properties @@ -77,11 +77,10 @@ class NativeDeviceInfoProvider(val context: Context) { //Shared Libraries setProperty("SharedLibraries", getSharedLibraries().joinToString(separator = ",")) //GL Extensions - val activityManager = - context.getSystemService(ACTIVITY_SERVICE) as ActivityManager + val activityManager = context.getSystemService() setProperty( "GL.Version", - activityManager.deviceConfigurationInfo.reqGlEsVersion.toString() + activityManager!!.deviceConfigurationInfo.reqGlEsVersion.toString() ) setProperty( "GL.Extensions", diff --git a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt index 3a04df9eb..ccb99e27c 100644 --- a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt @@ -16,6 +16,7 @@ import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.getSystemService import androidx.fragment.app.Fragment import com.aurora.extensions.checkManifestPermission import com.aurora.extensions.isDomainVerified @@ -128,9 +129,8 @@ class PermissionProvider : ActivityResultCallback { PermissionType.INSTALL_UNKNOWN_APPS -> PackageUtil.canRequestPackageInstalls(context) PermissionType.DOZE_WHITELIST -> { if (isMAndAbove()) { - val powerManager = - context.getSystemService(Context.POWER_SERVICE) as PowerManager - powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) + val powerManager = context.getSystemService() + powerManager?.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) ?: false } else { true } diff --git a/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt b/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt index e097b9097..07dcd614d 100644 --- a/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt +++ b/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt @@ -25,6 +25,7 @@ import android.content.Intent import android.content.pm.PackageInstaller import android.util.Log import androidx.core.content.IntentCompat +import androidx.core.content.getSystemService import com.aurora.extensions.runOnUiThread import com.aurora.store.AuroraApp import com.aurora.store.R @@ -86,15 +87,14 @@ class InstallerStatusReceiver : BroadcastReceiver() { displayName: String, status: Int ) { - val notificationManager = - context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val notificationManager = context.getSystemService() val notification = NotificationUtil.getInstallerStatusNotification( context, packageName, displayName, AppInstaller.getErrorString(context, status) ) - notificationManager.notify(packageName.hashCode(), notification) + notificationManager!!.notify(packageName.hashCode(), notification) } private fun promptUser(intent: Intent, context: Context) { diff --git a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt index be1911fe5..fa0057d4f 100644 --- a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt @@ -1,12 +1,12 @@ package com.aurora.store.data.work import android.app.NotificationManager -import android.app.Service import android.content.Context import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC import android.graphics.Bitmap import android.graphics.BitmapFactory import android.util.Log +import androidx.core.content.getSystemService import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo @@ -79,6 +79,8 @@ class DownloadWorker @AssistedInject constructor( private val TAG = DownloadWorker::class.java.simpleName override suspend fun doWork(): Result { + notificationManager = appContext.getSystemService()!! + // Bail out immediately if authData is not valid if (!authProvider.isSavedAuthDataValid()) { Log.e(TAG, "AuthData is not valid, exiting!") @@ -106,9 +108,6 @@ class DownloadWorker @AssistedInject constructor( purchaseHelper = PurchaseHelper(authProvider.authData!!) .using(httpClient) - notificationManager = - appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager - // Bail out if file list is empty download.fileList = download.fileList.ifEmpty { purchase(download.packageName, download.versionCode, download.offerType) @@ -204,9 +203,7 @@ class DownloadWorker @AssistedInject constructor( notifyStatus(DownloadStatus.FAILED) } - with(appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager) { - cancel(NOTIFICATION_ID) - } + notificationManager.cancel(NOTIFICATION_ID) } } diff --git a/app/src/main/java/com/aurora/store/data/work/ExportWorker.kt b/app/src/main/java/com/aurora/store/data/work/ExportWorker.kt index 3760dfd3b..2432c2b74 100644 --- a/app/src/main/java/com/aurora/store/data/work/ExportWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/ExportWorker.kt @@ -1,11 +1,11 @@ package com.aurora.store.data.work import android.app.NotificationManager -import android.app.Service import android.content.Context import android.content.pm.PackageManager import android.net.Uri import android.util.Log +import androidx.core.content.getSystemService import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.Data @@ -99,8 +99,7 @@ class ExportWorker @AssistedInject constructor( val displayName = inputData.getString(DISPLAY_NAME) val versionCode = inputData.getInt(VERSION_CODE, -1) - notificationManager = - appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager + notificationManager = appContext.getSystemService()!! if (packageName.isNullOrEmpty() || isDownload && versionCode == -1) { Log.e(TAG, "Input data is corrupt, bailing out!") diff --git a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt index 4f7a359e3..a19c9e86c 100644 --- a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt @@ -3,6 +3,7 @@ package com.aurora.store.data.work import android.app.NotificationManager import android.content.Context import android.util.Log +import androidx.core.content.getSystemService import androidx.hilt.work.HiltWorker import androidx.work.Constraints import androidx.work.CoroutineWorker @@ -111,8 +112,7 @@ class UpdateWorker @AssistedInject constructor( Log.i(TAG, "Checking for app updates") val autoUpdatesMode = Preferences.getInteger(appContext, PREFERENCE_UPDATES_AUTO, 3) - val notifyManager = - appContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val notificationManager = appContext.getSystemService() // Exit if auto-updates is turned off in settings if (autoUpdatesMode == 0) { @@ -140,7 +140,7 @@ class UpdateWorker @AssistedInject constructor( if (updatesList.isNotEmpty()) { if (autoUpdatesMode == 1) { Log.i(TAG, "Found updates, notifying!") - notifyManager.notify( + notificationManager!!.notify( notificationID, NotificationUtil.getUpdateNotification(appContext, updatesList) ) @@ -159,7 +159,7 @@ class UpdateWorker @AssistedInject constructor( if (list.isEmpty()) return@let Log.i(TAG, "Found apps that cannot be auto-updated, notifying!") - notifyManager.notify( + notificationManager!!.notify( notificationID, NotificationUtil.getUpdateNotification(appContext, list) ) @@ -167,7 +167,7 @@ class UpdateWorker @AssistedInject constructor( } else { // Fallback to notification if battery optimizations are enabled Log.i(TAG, "Found updates, but battery optimizations are enabled!") - notifyManager.notify( + notificationManager!!.notify( notificationID, NotificationUtil.getUpdateNotification(appContext, updatesList) ) diff --git a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt index 0db77c6a8..47ca29638 100644 --- a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt +++ b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt @@ -1,6 +1,5 @@ package com.aurora.store.util -import android.app.Application import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager @@ -13,6 +12,7 @@ import android.net.Uri import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.PendingIntentCompat +import androidx.core.content.getSystemService import androidx.core.os.bundleOf import androidx.navigation.NavDeepLinkBuilder import androidx.work.WorkManager @@ -30,8 +30,7 @@ object NotificationUtil { fun createNotificationChannel(context: Context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val notificationManager = - context.getSystemService(Application.NOTIFICATION_SERVICE) as NotificationManager + val notificationManager = context.getSystemService() val channels = ArrayList() channels.add( NotificationChannel( @@ -65,7 +64,7 @@ object NotificationUtil { setSound(null, null) } ) - notificationManager.createNotificationChannels(channels) + notificationManager!!.createNotificationChannels(channels) } } diff --git a/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt b/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt index 940cbe6b1..a833aa70f 100644 --- a/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt +++ b/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt @@ -20,11 +20,11 @@ package com.aurora.store.view.ui.preferences import android.app.admin.DevicePolicyManager -import android.content.Context import android.content.DialogInterface import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar +import androidx.core.content.getSystemService import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -63,17 +63,16 @@ class InstallationPreference : PreferenceFragmentCompat() { findPreference(PREFERENCE_INSTALLATION_DEVICE_OWNER)?.apply { val packageName = context.packageName - val devicePolicyManager = - context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager + val devicePolicyManager = context.getSystemService() - isVisible = devicePolicyManager.isDeviceOwnerApp(packageName) + isVisible = devicePolicyManager?.isDeviceOwnerApp(packageName) ?: false setOnPreferenceClickListener { context.showDialog( context.getString(R.string.pref_clear_device_owner_title), context.getString(R.string.pref_clear_device_owner_desc), { _: DialogInterface, _: Int -> @Suppress("DEPRECATION") - devicePolicyManager.clearDeviceOwnerApp(packageName) + devicePolicyManager!!.clearDeviceOwnerApp(packageName) activity?.recreate() }, { dialog: DialogInterface, _: Int -> dialog.dismiss() } diff --git a/app/src/main/java/com/aurora/store/viewmodel/network/NetworkViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/network/NetworkViewModel.kt index e04bf268a..c333872d5 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/network/NetworkViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/network/NetworkViewModel.kt @@ -24,6 +24,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest +import androidx.core.content.getSystemService import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.aurora.extensions.isMAndAbove @@ -38,8 +39,7 @@ class NetworkViewModel @Inject constructor( ) : ViewModel() { val status: MutableLiveData = MutableLiveData(NetworkStatus.UNAVAILABLE) - private val connectivityManager = - context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + private val connectivityManager = context.getSystemService() private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) @@ -53,11 +53,11 @@ class NetworkViewModel @Inject constructor( } fun register() { - connectivityManager.registerNetworkCallback(getNetworkRequest(), networkCallback) + connectivityManager?.registerNetworkCallback(getNetworkRequest(), networkCallback) } fun unregister() { - connectivityManager.unregisterNetworkCallback(networkCallback) + connectivityManager?.unregisterNetworkCallback(networkCallback) } private fun getNetworkRequest(): NetworkRequest { @@ -70,4 +70,4 @@ class NetworkViewModel @Inject constructor( return networkRequest.build() } -} \ No newline at end of file +}