Skip to content

Commit

Permalink
Fix nullability issues that AOSP is complaining about now
Browse files Browse the repository at this point in the history
  • Loading branch information
grote committed Mar 6, 2024
1 parent eb8a6eb commit d962d53
Show file tree
Hide file tree
Showing 22 changed files with 114 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ internal class RestoreFilesFragment : SnapshotFragment() {
): View {
val v = super.onCreateView(inflater, container, savedInstanceState)

val topStub: ViewStub = v.findViewById(R.id.topStub)
val topStub: ViewStub = v.requireViewById(R.id.topStub)
topStub.layoutResource = R.layout.header_snapshots
topStub.inflate()

val bottomStub: ViewStub = v.findViewById(R.id.bottomStub)
val bottomStub: ViewStub = v.requireViewById(R.id.bottomStub)
bottomStub.layoutResource = R.layout.footer_snapshots
val footer = bottomStub.inflate()
val skipView: TextView = footer.findViewById(R.id.skipView)
val skipView: TextView = footer.requireViewById(R.id.skipView)
skipView.setOnClickListener {
requireActivity().apply {
setResult(RESULT_OK)
Expand All @@ -54,7 +54,7 @@ internal class RestoreFilesStartedFragment : Fragment() {
): View {
val v: View = inflater.inflate(R.layout.fragment_restore_files_started, container, false)

val button: Button = v.findViewById(R.id.button)
val button: Button = v.requireViewById(R.id.button)
button.setOnClickListener {
requireActivity().apply {
setResult(RESULT_OK)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ class RestoreProgressFragment : Fragment() {
): View {
val v: View = inflater.inflate(R.layout.fragment_restore_progress, container, false)

progressBar = v.findViewById(R.id.progressBar)
titleView = v.findViewById(R.id.titleView)
backupNameView = v.findViewById(R.id.backupNameView)
appList = v.findViewById(R.id.appList)
button = v.findViewById(R.id.button)
progressBar = v.requireViewById(R.id.progressBar)
titleView = v.requireViewById(R.id.titleView)
backupNameView = v.requireViewById(R.id.backupNameView)
appList = v.requireViewById(R.id.appList)
button = v.requireViewById(R.id.button)

return v
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ internal class RestoreSetAdapter(

inner class RestoreSetViewHolder(private val v: View) : ViewHolder(v) {

private val titleView = v.findViewById<TextView>(R.id.titleView)
private val subtitleView = v.findViewById<TextView>(R.id.subtitleView)
private val titleView = v.requireViewById<TextView>(R.id.titleView)
private val subtitleView = v.requireViewById<TextView>(R.id.subtitleView)

internal fun bind(item: RestorableBackup) {
v.setOnClickListener { listener.onRestorableBackupClicked(item) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ class RestoreSetFragment : Fragment() {
): View {
val v: View = inflater.inflate(R.layout.fragment_restore_set, container, false)

listView = v.findViewById(R.id.listView)
progressBar = v.findViewById(R.id.progressBar)
errorView = v.findViewById(R.id.errorView)
skipView = v.findViewById(R.id.skipView)
listView = v.requireViewById(R.id.listView)
progressBar = v.requireViewById(R.id.progressBar)
errorView = v.requireViewById(R.id.errorView)
skipView = v.requireViewById(R.id.skipView)

return v
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,13 @@ internal class ApkRestore(
}

// get app icon and label (name)
val appInfo = packageInfo.applicationInfo.apply {
val appInfo = packageInfo.applicationInfo?.apply {
// set APK paths before, so package manager can find it for icon extraction
sourceDir = cachedApk.absolutePath
publicSourceDir = cachedApk.absolutePath
}
val icon = appInfo.loadIcon(pm)
val name = pm.getApplicationLabel(appInfo)
val icon = appInfo?.loadIcon(pm)
val name = appInfo?.let { pm.getApplicationLabel(it) }

installResult.update(packageName) { result ->
result.copy(state = IN_PROGRESS, name = name, icon = icon)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ class InstallProgressFragment : Fragment(), InstallItemListener {
): View {
val v: View = inflater.inflate(R.layout.fragment_restore_progress, container, false)

progressBar = v.findViewById(R.id.progressBar)
titleView = v.findViewById(R.id.titleView)
backupNameView = v.findViewById(R.id.backupNameView)
appList = v.findViewById(R.id.appList)
button = v.findViewById(R.id.button)
progressBar = v.requireViewById(R.id.progressBar)
titleView = v.requireViewById(R.id.titleView)
backupNameView = v.requireViewById(R.id.backupNameView)
appList = v.requireViewById(R.id.appList)
button = v.requireViewById(R.id.button)

return v
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ class AboutDialogFragment : Fragment() {
val v: View = inflater.inflate(R.layout.fragment_about, container, false)

val versionName = packageService.getVersionName(requireContext().packageName) ?: "???"
val versionView: TextView = v.findViewById(R.id.versionView)
val versionView: TextView = v.requireViewById(R.id.versionView)
versionView.text = getString(R.string.about_version, versionName)

val linkMovementMethod = LinkMovementMethod.getInstance()
val contributorsView = v.findViewById<TextView>(R.id.contributorView)
val orgsView = v.findViewById<TextView>(R.id.about_contributing_organizations_content)
val contributorsView = v.requireViewById<TextView>(R.id.contributorView)
val orgsView = v.requireViewById<TextView>(R.id.about_contributing_organizations_content)
contributorsView.movementMethod = linkMovementMethod
orgsView.movementMethod = linkMovementMethod

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ class AppStatusFragment : Fragment(), AppStatusToggleListener {
setHasOptionsMenu(true)
val v: View = inflater.inflate(R.layout.fragment_app_status, container, false)

progressBar = v.findViewById(R.id.progressBar)
list = v.findViewById(R.id.list)
progressBar = v.requireViewById(R.id.progressBar)
list = v.requireViewById(R.id.list)

return v
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class SettingsActivity : RequireProvisioningActivity(), OnPreferenceStartFragmen
pref: Preference,
): Boolean {
val fragment =
supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment)
supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment!!)
if (pref.key == PREF_BACKUP_RECOVERY_CODE) fragment.arguments = Bundle().apply {
putBoolean(ARG_FOR_NEW_CODE, false)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,10 +259,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
// warn if battery optimization is active
// we don't bother with yet another dialog, because the ROM should handle it
val context = requireContext()
val powerManager = context.getSystemService(PowerManager::class.java)
if (!powerManager.isIgnoringBatteryOptimizations(context.packageName)) {
Toast.makeText(context, R.string.settings_backup_storage_battery_optimization,
LENGTH_LONG).show()
val powerManager: PowerManager? = context.getSystemService(PowerManager::class.java)
if (powerManager != null &&
!powerManager.isIgnoringBatteryOptimizations(context.packageName)
) {
Toast.makeText(
context, R.string.settings_backup_storage_battery_optimization,
LENGTH_LONG
).show()
}
viewModel.enableStorageBackup()
backupStorage.isChecked = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ data class Storage(
}

private fun hasUnmeteredInternet(context: Context): Boolean {
val cm = context.getSystemService(ConnectivityManager::class.java)
val cm = context.getSystemService(ConnectivityManager::class.java) ?: return false
val isMetered = cm.isActiveNetworkMetered
val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && !isMetered
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ internal class SettingsViewModel(
) : RequireProvisioningViewModel(app, settingsManager, keyManager) {

private val contentResolver = app.contentResolver
private val connectivityManager = app.getSystemService(ConnectivityManager::class.java)
private val connectivityManager: ConnectivityManager? =
app.getSystemService(ConnectivityManager::class.java)

override val isRestoreOperation = false

Expand Down Expand Up @@ -129,13 +130,13 @@ internal class SettingsViewModel(

// register network observer if needed
if (networkCallback.registered && !storage.requiresNetwork) {
connectivityManager.unregisterNetworkCallback(networkCallback)
connectivityManager?.unregisterNetworkCallback(networkCallback)
networkCallback.registered = false
} else if (!networkCallback.registered && storage.requiresNetwork) {
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(request, networkCallback)
connectivityManager?.registerNetworkCallback(request, networkCallback)
networkCallback.registered = true
}

Expand All @@ -156,7 +157,7 @@ internal class SettingsViewModel(
override fun onCleared() {
contentResolver.unregisterContentObserver(storageObserver)
if (networkCallback.registered) {
connectivityManager.unregisterNetworkCallback(networkCallback)
connectivityManager?.unregisterNetworkCallback(networkCallback)
networkCallback.registered = false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,14 @@ internal class ApkBackup(
}

// TODO remove when adding support for packages with multiple signers
if (packageInfo.signingInfo.hasMultipleSigners()) {
val signingInfo = packageInfo.signingInfo ?: return null
if (signingInfo.hasMultipleSigners()) {
Log.e(TAG, "Package $packageName has multiple signers. Not backing it up.")
return null
}

// get signatures
val signatures = packageInfo.signingInfo.getSignatures()
val signatures = signingInfo.getSignatures()
if (signatures.isEmpty()) {
Log.e(TAG, "Package $packageName has no signatures. Not backing it up.")
return null
Expand All @@ -107,7 +108,8 @@ internal class ApkBackup(
}

// get an InputStream for the APK
val inputStream = getApkInputStream(packageInfo.applicationInfo.sourceDir)
val sourceDir = packageInfo.applicationInfo?.sourceDir ?: return null
val inputStream = getApkInputStream(sourceDir)
// copy the APK to the storage's output and calculate SHA-256 hash while at it
val name = crypto.getNameForApk(metadataManager.salt, packageName)
val sha256 = copyStreamsAndGetHash(inputStream, streamGetter(name))
Expand Down Expand Up @@ -158,7 +160,7 @@ internal class ApkBackup(
): List<ApkSplit> {
check(packageInfo.splitNames != null)
// attention: though not documented, splitSourceDirs can be null
val splitSourceDirs = packageInfo.applicationInfo.splitSourceDirs ?: emptyArray()
val splitSourceDirs = packageInfo.applicationInfo?.splitSourceDirs ?: emptyArray()
check(packageInfo.splitNames.size == splitSourceDirs.size) {
"Size Mismatch! ${packageInfo.splitNames.size} != ${splitSourceDirs.size} " +
"splitNames is ${packageInfo.splitNames.toList()}, " +
Expand Down Expand Up @@ -238,8 +240,10 @@ fun copyStreamsAndGetHash(inputStream: InputStream, outputStream: OutputStream):
/**
* Returns a list of Base64 encoded SHA-256 signature hashes.
*/
fun SigningInfo.getSignatures(): List<String> {
return if (hasMultipleSigners()) {
fun SigningInfo?.getSignatures(): List<String> {
return if (this == null) {
emptyList()
} else if (hasMultipleSigners()) {
apkContentsSigners.map { signature ->
hashSignature(signature).encodeBase64()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ internal class PackageService(
}

private fun PackageInfo.allowsBackup(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
val appInfo = applicationInfo
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false

return if (settingsManager.d2dBackupsEnabled()) {
/**
Expand All @@ -191,7 +192,7 @@ internal class PackageService(
*/
true
} else {
applicationInfo.flags and FLAG_ALLOW_BACKUP != 0
appInfo.flags and FLAG_ALLOW_BACKUP != 0
}
}

Expand Down Expand Up @@ -226,27 +227,31 @@ internal fun PackageInfo.isUserVisible(context: Context): Boolean {
}

internal fun PackageInfo.isSystemApp(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return true
return applicationInfo.flags and FLAG_SYSTEM != 0
val appInfo = applicationInfo
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return true
return appInfo.flags and FLAG_SYSTEM != 0
}

/**
* Returns true if this is a system app that hasn't been updated.
* We don't back up those APKs.
*/
internal fun PackageInfo.isNotUpdatedSystemApp(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return true
val isSystemApp = applicationInfo.flags and FLAG_SYSTEM != 0
val isUpdatedSystemApp = applicationInfo.flags and FLAG_UPDATED_SYSTEM_APP != 0
val appInfo = applicationInfo
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return true
val isSystemApp = appInfo.flags and FLAG_SYSTEM != 0
val isUpdatedSystemApp = appInfo.flags and FLAG_UPDATED_SYSTEM_APP != 0
return isSystemApp && !isUpdatedSystemApp
}

internal fun PackageInfo.isStopped(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
return applicationInfo.flags and FLAG_STOPPED != 0
val appInfo = applicationInfo
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
return appInfo.flags and FLAG_STOPPED != 0
}

internal fun PackageInfo.isTestOnly(): Boolean {
if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
return applicationInfo.flags and FLAG_TEST_ONLY != 0
val appInfo = applicationInfo
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
return appInfo.flags and FLAG_TEST_ONLY != 0
}
14 changes: 7 additions & 7 deletions app/src/main/java/com/stevesoltys/seedvault/ui/AppViewHolder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.Switch
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.switchmaterial.SwitchMaterial
import com.stevesoltys.seedvault.R
import com.stevesoltys.seedvault.ui.AppBackupState.FAILED
import com.stevesoltys.seedvault.ui.AppBackupState.IN_PROGRESS
Expand All @@ -22,12 +22,12 @@ internal abstract class AppViewHolder(protected val v: View) : RecyclerView.View
protected val pm: PackageManager = context.packageManager

protected val clickableBackground = v.background!!
protected val appIcon: ImageView = v.findViewById(R.id.appIcon)
protected val appName: TextView = v.findViewById(R.id.appName)
protected val appInfo: TextView = v.findViewById(R.id.appInfo)
protected val appStatus: ImageView = v.findViewById(R.id.appStatus)
protected val progressBar: ProgressBar = v.findViewById(R.id.progressBar)
protected val switchView: Switch = v.findViewById(R.id.switchView)
protected val appIcon: ImageView = v.requireViewById(R.id.appIcon)
protected val appName: TextView = v.requireViewById(R.id.appName)
protected val appInfo: TextView = v.requireViewById(R.id.appInfo)
protected val appStatus: ImageView = v.requireViewById(R.id.appStatus)
protected val progressBar: ProgressBar = v.requireViewById(R.id.progressBar)
protected val switchView: SwitchMaterial = v.requireViewById(R.id.switchView)

init {
// don't use clickable background by default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ class RecoveryCodeAdapter(private val items: List<CharArray>) :

class RecoveryCodeViewHolder(v: View) : RecyclerView.ViewHolder(v) {

private val num = v.findViewById<TextView>(R.id.num)
private val word = v.findViewById<TextView>(R.id.word)
private val num = v.requireViewById<TextView>(R.id.num)
private val word = v.requireViewById<TextView>(R.id.word)

internal fun bind(number: Int, item: CharArray) {
num.text = number.toString()
Expand Down
Loading

0 comments on commit d962d53

Please sign in to comment.