Switch to getSystemService's extension method everywhere

Null-safe and avoids type-casting

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-09-12 12:05:27 +05:30
parent a0c9e398cb
commit f6a6f34a81
12 changed files with 46 additions and 54 deletions

View File

@@ -38,6 +38,7 @@ import android.view.LayoutInflater
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityOptionsCompat import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.getSystemService
import com.aurora.Constants import com.aurora.Constants
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
@@ -101,9 +102,9 @@ fun Context.getEmptyActivityBundle(): Bundle? {
} }
fun Context.copyToClipBoard(data: String?) { fun Context.copyToClipBoard(data: String?) {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipboard = getSystemService<ClipboardManager>()
val clip = ClipData.newPlainText("Download Url", data) val clip = ClipData.newPlainText("Download Url", data)
clipboard.setPrimaryClip(clip) clipboard?.setPrimaryClip(clip)
} }
fun Context.getStyledAttributeColor(id: Int): Int { fun Context.getStyledAttributeColor(id: Int): Int {
@@ -115,9 +116,7 @@ fun Context.getStyledAttributeColor(id: Int): Int {
fun Context.isIgnoringBatteryOptimizations(): Boolean { fun Context.isIgnoringBatteryOptimizations(): Boolean {
return if (isMAndAbove()) { return if (isMAndAbove()) {
(getSystemService(Context.POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations( (getSystemService<PowerManager>())?.isIgnoringBatteryOptimizations(packageName) ?: true
packageName
)
} else { } else {
true true
} }
@@ -137,8 +136,8 @@ fun Context.isExternalStorageAccessible(): Boolean {
fun Context.isDomainVerified(domain: String): Boolean { fun Context.isDomainVerified(domain: String): Boolean {
return if (isSAndAbove()) { return if (isSAndAbove()) {
val domainVerificationManager = getSystemService(DomainVerificationManager::class.java) val domainVerificationManager = getSystemService<DomainVerificationManager>()
val userState = domainVerificationManager.getDomainVerificationUserState(packageName) val userState = domainVerificationManager!!.getDomainVerificationUserState(packageName)
val domainMap = userState?.hostToStateMap?.filterKeys { it == domain } val domainMap = userState?.hostToStateMap?.filterKeys { it == domain }
domainMap?.values?.first() == DomainVerificationUserState.DOMAIN_STATE_SELECTED domainMap?.values?.first() == DomainVerificationUserState.DOMAIN_STATE_SELECTED
} else { } else {

View File

@@ -19,9 +19,9 @@
package com.aurora.extensions package com.aurora.extensions
import android.content.Context
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.core.content.getSystemService
fun View.isVisible() = visibility == View.VISIBLE fun View.isVisible() = visibility == View.VISIBLE
@@ -38,15 +38,15 @@ fun View.invisible() {
} }
fun View.showKeyboard() { fun View.showKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val imm = context.getSystemService<InputMethodManager>()
this.requestFocus() this.requestFocus()
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
} }
fun View.hideKeyboard(): Boolean { fun View.hideKeyboard(): Boolean {
try { try {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val imm = context.getSystemService<InputMethodManager>()
return imm.hideSoftInputFromWindow(windowToken, 0) return imm?.hideSoftInputFromWindow(windowToken, 0) ?: false
} catch (ignored: RuntimeException) { } catch (ignored: RuntimeException) {
} }
return false return false

View File

@@ -28,6 +28,7 @@ import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.content.getSystemService
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isOAndAbove
import com.aurora.extensions.isPAndAbove import com.aurora.extensions.isPAndAbove
@@ -101,10 +102,9 @@ class AppInstaller @Inject constructor(
} }
fun notifyInstallation(context: Context, displayName: String, packageName: String) { fun notifyInstallation(context: Context, displayName: String, packageName: String) {
val notificationManager = val notificationManager = context.getSystemService<NotificationManager>()
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val notification = NotificationUtil.getInstallNotification(context, displayName, packageName) val notification = NotificationUtil.getInstallNotification(context, displayName, packageName)
notificationManager.notify(packageName.hashCode(), notification) notificationManager!!.notify(packageName.hashCode(), notification)
} }
fun getErrorString(context: Context, status: Int): String { fun getErrorString(context: Context, status: Int): String {

View File

@@ -20,9 +20,9 @@ package com.aurora.store.data.providers
import android.app.ActivityManager import android.app.ActivityManager
import android.content.Context import android.content.Context
import android.content.Context.ACTIVITY_SERVICE
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Build import android.os.Build
import androidx.core.content.getSystemService
import com.aurora.extensions.isHuawei import com.aurora.extensions.isHuawei
import java.util.Properties import java.util.Properties
@@ -77,11 +77,10 @@ class NativeDeviceInfoProvider(val context: Context) {
//Shared Libraries //Shared Libraries
setProperty("SharedLibraries", getSharedLibraries().joinToString(separator = ",")) setProperty("SharedLibraries", getSharedLibraries().joinToString(separator = ","))
//GL Extensions //GL Extensions
val activityManager = val activityManager = context.getSystemService<ActivityManager>()
context.getSystemService(ACTIVITY_SERVICE) as ActivityManager
setProperty( setProperty(
"GL.Version", "GL.Version",
activityManager.deviceConfigurationInfo.reqGlEsVersion.toString() activityManager!!.deviceConfigurationInfo.reqGlEsVersion.toString()
) )
setProperty( setProperty(
"GL.Extensions", "GL.Extensions",

View File

@@ -16,6 +16,7 @@ import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.aurora.extensions.checkManifestPermission import com.aurora.extensions.checkManifestPermission
import com.aurora.extensions.isDomainVerified import com.aurora.extensions.isDomainVerified
@@ -128,9 +129,8 @@ class PermissionProvider : ActivityResultCallback<ActivityResult> {
PermissionType.INSTALL_UNKNOWN_APPS -> PackageUtil.canRequestPackageInstalls(context) PermissionType.INSTALL_UNKNOWN_APPS -> PackageUtil.canRequestPackageInstalls(context)
PermissionType.DOZE_WHITELIST -> { PermissionType.DOZE_WHITELIST -> {
if (isMAndAbove()) { if (isMAndAbove()) {
val powerManager = val powerManager = context.getSystemService<PowerManager>()
context.getSystemService(Context.POWER_SERVICE) as PowerManager powerManager?.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) ?: false
powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
} else { } else {
true true
} }

View File

@@ -25,6 +25,7 @@ import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.util.Log import android.util.Log
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import androidx.core.content.getSystemService
import com.aurora.extensions.runOnUiThread import com.aurora.extensions.runOnUiThread
import com.aurora.store.AuroraApp import com.aurora.store.AuroraApp
import com.aurora.store.R import com.aurora.store.R
@@ -86,15 +87,14 @@ class InstallerStatusReceiver : BroadcastReceiver() {
displayName: String, displayName: String,
status: Int status: Int
) { ) {
val notificationManager = val notificationManager = context.getSystemService<NotificationManager>()
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val notification = NotificationUtil.getInstallerStatusNotification( val notification = NotificationUtil.getInstallerStatusNotification(
context, context,
packageName, packageName,
displayName, displayName,
AppInstaller.getErrorString(context, status) AppInstaller.getErrorString(context, status)
) )
notificationManager.notify(packageName.hashCode(), notification) notificationManager!!.notify(packageName.hashCode(), notification)
} }
private fun promptUser(intent: Intent, context: Context) { private fun promptUser(intent: Intent, context: Context) {

View File

@@ -1,12 +1,12 @@
package com.aurora.store.data.work package com.aurora.store.data.work
import android.app.NotificationManager import android.app.NotificationManager
import android.app.Service
import android.content.Context import android.content.Context
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.util.Log import android.util.Log
import androidx.core.content.getSystemService
import androidx.hilt.work.HiltWorker import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import androidx.work.ForegroundInfo import androidx.work.ForegroundInfo
@@ -79,6 +79,8 @@ class DownloadWorker @AssistedInject constructor(
private val TAG = DownloadWorker::class.java.simpleName private val TAG = DownloadWorker::class.java.simpleName
override suspend fun doWork(): Result { override suspend fun doWork(): Result {
notificationManager = appContext.getSystemService<NotificationManager>()!!
// Bail out immediately if authData is not valid // Bail out immediately if authData is not valid
if (!authProvider.isSavedAuthDataValid()) { if (!authProvider.isSavedAuthDataValid()) {
Log.e(TAG, "AuthData is not valid, exiting!") Log.e(TAG, "AuthData is not valid, exiting!")
@@ -106,9 +108,6 @@ class DownloadWorker @AssistedInject constructor(
purchaseHelper = PurchaseHelper(authProvider.authData!!) purchaseHelper = PurchaseHelper(authProvider.authData!!)
.using(httpClient) .using(httpClient)
notificationManager =
appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager
// Bail out if file list is empty // Bail out if file list is empty
download.fileList = download.fileList.ifEmpty { download.fileList = download.fileList.ifEmpty {
purchase(download.packageName, download.versionCode, download.offerType) purchase(download.packageName, download.versionCode, download.offerType)
@@ -204,9 +203,7 @@ class DownloadWorker @AssistedInject constructor(
notifyStatus(DownloadStatus.FAILED) notifyStatus(DownloadStatus.FAILED)
} }
with(appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager) { notificationManager.cancel(NOTIFICATION_ID)
cancel(NOTIFICATION_ID)
}
} }
} }

View File

@@ -1,11 +1,11 @@
package com.aurora.store.data.work package com.aurora.store.data.work
import android.app.NotificationManager import android.app.NotificationManager
import android.app.Service
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.util.Log import android.util.Log
import androidx.core.content.getSystemService
import androidx.hilt.work.HiltWorker import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import androidx.work.Data import androidx.work.Data
@@ -99,8 +99,7 @@ class ExportWorker @AssistedInject constructor(
val displayName = inputData.getString(DISPLAY_NAME) val displayName = inputData.getString(DISPLAY_NAME)
val versionCode = inputData.getInt(VERSION_CODE, -1) val versionCode = inputData.getInt(VERSION_CODE, -1)
notificationManager = notificationManager = appContext.getSystemService<NotificationManager>()!!
appContext.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager
if (packageName.isNullOrEmpty() || isDownload && versionCode == -1) { if (packageName.isNullOrEmpty() || isDownload && versionCode == -1) {
Log.e(TAG, "Input data is corrupt, bailing out!") Log.e(TAG, "Input data is corrupt, bailing out!")

View File

@@ -3,6 +3,7 @@ package com.aurora.store.data.work
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import androidx.core.content.getSystemService
import androidx.hilt.work.HiltWorker import androidx.hilt.work.HiltWorker
import androidx.work.Constraints import androidx.work.Constraints
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
@@ -111,8 +112,7 @@ class UpdateWorker @AssistedInject constructor(
Log.i(TAG, "Checking for app updates") Log.i(TAG, "Checking for app updates")
val autoUpdatesMode = Preferences.getInteger(appContext, PREFERENCE_UPDATES_AUTO, 3) val autoUpdatesMode = Preferences.getInteger(appContext, PREFERENCE_UPDATES_AUTO, 3)
val notifyManager = val notificationManager = appContext.getSystemService<NotificationManager>()
appContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// Exit if auto-updates is turned off in settings // Exit if auto-updates is turned off in settings
if (autoUpdatesMode == 0) { if (autoUpdatesMode == 0) {
@@ -140,7 +140,7 @@ class UpdateWorker @AssistedInject constructor(
if (updatesList.isNotEmpty()) { if (updatesList.isNotEmpty()) {
if (autoUpdatesMode == 1) { if (autoUpdatesMode == 1) {
Log.i(TAG, "Found updates, notifying!") Log.i(TAG, "Found updates, notifying!")
notifyManager.notify( notificationManager!!.notify(
notificationID, notificationID,
NotificationUtil.getUpdateNotification(appContext, updatesList) NotificationUtil.getUpdateNotification(appContext, updatesList)
) )
@@ -159,7 +159,7 @@ class UpdateWorker @AssistedInject constructor(
if (list.isEmpty()) return@let if (list.isEmpty()) return@let
Log.i(TAG, "Found apps that cannot be auto-updated, notifying!") Log.i(TAG, "Found apps that cannot be auto-updated, notifying!")
notifyManager.notify( notificationManager!!.notify(
notificationID, notificationID,
NotificationUtil.getUpdateNotification(appContext, list) NotificationUtil.getUpdateNotification(appContext, list)
) )
@@ -167,7 +167,7 @@ class UpdateWorker @AssistedInject constructor(
} else { } else {
// Fallback to notification if battery optimizations are enabled // Fallback to notification if battery optimizations are enabled
Log.i(TAG, "Found updates, but battery optimizations are enabled!") Log.i(TAG, "Found updates, but battery optimizations are enabled!")
notifyManager.notify( notificationManager!!.notify(
notificationID, notificationID,
NotificationUtil.getUpdateNotification(appContext, updatesList) NotificationUtil.getUpdateNotification(appContext, updatesList)
) )

View File

@@ -1,6 +1,5 @@
package com.aurora.store.util package com.aurora.store.util
import android.app.Application
import android.app.Notification import android.app.Notification
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
@@ -13,6 +12,7 @@ import android.net.Uri
import android.os.Build import android.os.Build
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.PendingIntentCompat import androidx.core.app.PendingIntentCompat
import androidx.core.content.getSystemService
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.navigation.NavDeepLinkBuilder import androidx.navigation.NavDeepLinkBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
@@ -30,8 +30,7 @@ object NotificationUtil {
fun createNotificationChannel(context: Context) { fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = val notificationManager = context.getSystemService<NotificationManager>()
context.getSystemService(Application.NOTIFICATION_SERVICE) as NotificationManager
val channels = ArrayList<NotificationChannel>() val channels = ArrayList<NotificationChannel>()
channels.add( channels.add(
NotificationChannel( NotificationChannel(
@@ -65,7 +64,7 @@ object NotificationUtil {
setSound(null, null) setSound(null, null)
} }
) )
notificationManager.createNotificationChannels(channels) notificationManager!!.createNotificationChannels(channels)
} }
} }

View File

@@ -20,11 +20,11 @@
package com.aurora.store.view.ui.preferences package com.aurora.store.view.ui.preferences
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.content.getSystemService
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
@@ -63,17 +63,16 @@ class InstallationPreference : PreferenceFragmentCompat() {
findPreference<Preference>(PREFERENCE_INSTALLATION_DEVICE_OWNER)?.apply { findPreference<Preference>(PREFERENCE_INSTALLATION_DEVICE_OWNER)?.apply {
val packageName = context.packageName val packageName = context.packageName
val devicePolicyManager = val devicePolicyManager = context.getSystemService<DevicePolicyManager>()
context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
isVisible = devicePolicyManager.isDeviceOwnerApp(packageName) isVisible = devicePolicyManager?.isDeviceOwnerApp(packageName) ?: false
setOnPreferenceClickListener { setOnPreferenceClickListener {
context.showDialog( context.showDialog(
context.getString(R.string.pref_clear_device_owner_title), context.getString(R.string.pref_clear_device_owner_title),
context.getString(R.string.pref_clear_device_owner_desc), context.getString(R.string.pref_clear_device_owner_desc),
{ _: DialogInterface, _: Int -> { _: DialogInterface, _: Int ->
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
devicePolicyManager.clearDeviceOwnerApp(packageName) devicePolicyManager!!.clearDeviceOwnerApp(packageName)
activity?.recreate() activity?.recreate()
}, },
{ dialog: DialogInterface, _: Int -> dialog.dismiss() } { dialog: DialogInterface, _: Int -> dialog.dismiss() }

View File

@@ -24,6 +24,7 @@ import android.net.ConnectivityManager
import android.net.Network import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.net.NetworkRequest import android.net.NetworkRequest
import androidx.core.content.getSystemService
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.aurora.extensions.isMAndAbove import com.aurora.extensions.isMAndAbove
@@ -38,8 +39,7 @@ class NetworkViewModel @Inject constructor(
) : ViewModel() { ) : ViewModel() {
val status: MutableLiveData<NetworkStatus> = MutableLiveData(NetworkStatus.UNAVAILABLE) val status: MutableLiveData<NetworkStatus> = MutableLiveData(NetworkStatus.UNAVAILABLE)
private val connectivityManager = private val connectivityManager = context.getSystemService<ConnectivityManager>()
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val networkCallback = object : ConnectivityManager.NetworkCallback() { private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) { override fun onAvailable(network: Network) {
super.onAvailable(network) super.onAvailable(network)
@@ -53,11 +53,11 @@ class NetworkViewModel @Inject constructor(
} }
fun register() { fun register() {
connectivityManager.registerNetworkCallback(getNetworkRequest(), networkCallback) connectivityManager?.registerNetworkCallback(getNetworkRequest(), networkCallback)
} }
fun unregister() { fun unregister() {
connectivityManager.unregisterNetworkCallback(networkCallback) connectivityManager?.unregisterNetworkCallback(networkCallback)
} }
private fun getNetworkRequest(): NetworkRequest { private fun getNetworkRequest(): NetworkRequest {