Add: Permission- & LinkTypes extractors

This commit is contained in:
machiav3lli 2022-05-29 02:57:01 +02:00
parent bc9840b429
commit 31d988ed2e

View File

@ -11,6 +11,7 @@ import android.content.Intent
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.PermissionInfo
import android.content.pm.Signature import android.content.pm.Signature
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
@ -25,7 +26,10 @@ import com.looker.droidify.R
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
import com.looker.droidify.database.entity.Product import com.looker.droidify.database.entity.Product
import com.looker.droidify.database.entity.Release
import com.looker.droidify.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.LinkType
import com.looker.droidify.entity.PermissionsType
import com.looker.droidify.service.Connection import com.looker.droidify.service.Connection
import com.looker.droidify.service.DownloadService import com.looker.droidify.service.DownloadService
import com.looker.droidify.ui.dialog.LaunchDialog import com.looker.droidify.ui.dialog.LaunchDialog
@ -34,6 +38,7 @@ import com.looker.droidify.utility.extension.android.singleSignature
import com.looker.droidify.utility.extension.android.versionCodeCompat import com.looker.droidify.utility.extension.android.versionCodeCompat
import com.looker.droidify.utility.extension.resources.getDrawableCompat import com.looker.droidify.utility.extension.resources.getDrawableCompat
import com.looker.droidify.utility.extension.text.hex import com.looker.droidify.utility.extension.text.hex
import com.looker.droidify.utility.extension.text.nullIfEmpty
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import java.security.MessageDigest import java.security.MessageDigest
@ -279,4 +284,121 @@ fun Context.startLauncherActivity(packageName: String, name: String) {
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
} }
fun Product.generateLinks(context: Context): List<LinkType> {
val links = mutableListOf<LinkType>()
if (author.name.isNotEmpty() || author.web.isNotEmpty()) {
links.add(
LinkType(
iconResId = R.drawable.ic_person,
title = author.name,
link = author.web.nullIfEmpty()?.let(Uri::parse)
)
)
}
author.email.nullIfEmpty()?.let {
links.add(
LinkType(
R.drawable.ic_email,
context.getString(R.string.author_email),
Uri.parse("mailto:$it")
)
)
}
links.addAll(licenses.map {
LinkType(
R.drawable.ic_copyright,
it,
Uri.parse("https://spdx.org/licenses/$it.html")
)
})
tracker.nullIfEmpty()
?.let {
links.add(
LinkType(
R.drawable.ic_bug_report,
context.getString(R.string.bug_tracker),
Uri.parse(it)
)
)
}
changelog.nullIfEmpty()?.let {
links.add(
LinkType(
R.drawable.ic_history,
context.getString(R.string.changelog),
Uri.parse(it)
)
)
}
web.nullIfEmpty()
?.let {
links.add(
LinkType(
R.drawable.ic_public,
context.getString(R.string.project_website),
Uri.parse(it)
)
)
}
return links
}
fun Release.generatePermissionGroups(context: Context): List<PermissionsType> {
val permissionGroups = mutableListOf<PermissionsType>()
val packageManager = context.packageManager
val permissions = permissions
.asSequence().mapNotNull {
try {
packageManager.getPermissionInfo(it, 0)
} catch (e: Exception) {
null
}
}
.groupBy(PackageItemResolver::getPermissionGroup)
.asSequence().map { (group, permissionInfo) ->
val permissionGroupInfo = try {
group?.let { packageManager.getPermissionGroupInfo(it, 0) }
} catch (e: Exception) {
null
}
Pair(permissionGroupInfo, permissionInfo)
}
.groupBy({ it.first }, { it.second })
if (permissions.isNotEmpty()) {
permissionGroups.addAll(permissions.asSequence().filter { it.key != null }
.map { PermissionsType(it.key, it.value.flatten()) })
permissions.asSequence().find { it.key == null }
?.let { permissionGroups.add(PermissionsType(null, it.value.flatten())) }
}
return permissionGroups
}
fun List<PermissionInfo>.getLabels(context: Context): List<String> {
val localCache = PackageItemResolver.LocalCache()
val labels = map { permission ->
val labelFromPackage =
PackageItemResolver.loadLabel(context, localCache, permission)
val label = labelFromPackage ?: run {
val prefixes =
listOf("android.permission.", "com.android.browser.permission.")
prefixes.find { permission.name.startsWith(it) }?.let { it ->
val transform = permission.name.substring(it.length)
if (transform.matches("[A-Z_]+".toRegex())) {
transform.split("_")
.joinToString(separator = " ") { it.lowercase(Locale.US) }
} else {
null
}
}
}
if (label == null) {
Pair(false, permission.name)
} else {
Pair(true, label.first().uppercaseChar() + label.substring(1, label.length))
}
}
return labels.sortedBy { it.first }.map { it.second }
}