Skip to content

Commit

Permalink
refactor: fix issues with Play Store Policies
Browse files Browse the repository at this point in the history
  • Loading branch information
timschneeb committed Jul 21, 2023
1 parent 790a8fc commit 3e36002
Show file tree
Hide file tree
Showing 13 changed files with 106 additions and 15 deletions.
6 changes: 6 additions & 0 deletions app/src/fdroid/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />

</manifest>
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.DUMP" tools:ignore="ProtectedPermissions" />

<uses-feature android:name="android.hardware.audio.output" />

<queries>
<package android:name="moe.shizuku.privileged.api" />
</queries>

<application
android:name=".MainApplication"
android:allowBackup="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ class MainApplication : Application(), SharedPreferences.OnSharedPreferenceChang
.build())
Timber.i("====> Application starting up")

// TODO: use cache
val dumpFile = File(filesDir, "dump.txt")
if(dumpFile.exists()) {
dumpFile.delete()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import me.timschneeberger.rootlessjamesdsp.BuildConfig
import me.timschneeberger.rootlessjamesdsp.MainApplication
import me.timschneeberger.rootlessjamesdsp.utils.notifications.Notifications
import me.timschneeberger.rootlessjamesdsp.R
import me.timschneeberger.rootlessjamesdsp.activity.MainActivity
import me.timschneeberger.rootlessjamesdsp.databinding.FragmentAppCompatibilityBinding
Expand All @@ -26,6 +25,7 @@ import me.timschneeberger.rootlessjamesdsp.utils.extensions.CompatExtensions.get
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getAppIcon
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getAppNameFromUidSafe
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getPackageNameFromUid
import me.timschneeberger.rootlessjamesdsp.utils.notifications.Notifications
import timber.log.Timber
import java.util.Timer
import kotlin.concurrent.schedule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.ge
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getAppNameFromUidSafe
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.showAlert
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.showYesNoAlert
import me.timschneeberger.rootlessjamesdsp.utils.preferences.Preferences
import me.timschneeberger.rootlessjamesdsp.utils.extensions.asHtml
import me.timschneeberger.rootlessjamesdsp.utils.preferences.Preferences
import org.koin.android.ext.android.inject

class BlocklistFragment : Fragment() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import android.graphics.drawable.Drawable
data class AppInfo (
val appName: String,
val packageName: String,
val icon: Drawable,
val icon: Drawable?,
val isSystem: Boolean,
val uid: Int,
)
) {
override fun toString(): String {
return "name=$appName; pkg=$packageName; isSystem=$isSystem; uid=$uid"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package me.timschneeberger.rootlessjamesdsp.session.dump.data

import me.timschneeberger.rootlessjamesdsp.model.AppInfo

data class PackageServiceDump(val apps: List<AppInfo>) : IDump {
override fun toString(): String {
val sb = StringBuilder("\n--> Apps\n")
apps.forEach(sb::append)
return sb.toString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package me.timschneeberger.rootlessjamesdsp.session.dump.provider

import android.content.Context
import me.timschneeberger.rootlessjamesdsp.BuildConfig
import me.timschneeberger.rootlessjamesdsp.model.AudioSessionDumpEntry
import me.timschneeberger.rootlessjamesdsp.session.dump.data.AudioPolicyServiceDump
import me.timschneeberger.rootlessjamesdsp.session.dump.data.ISessionInfoDump
import me.timschneeberger.rootlessjamesdsp.session.dump.utils.DumpUtils
import me.timschneeberger.rootlessjamesdsp.model.AudioSessionDumpEntry
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getPackageNameFromUid
import timber.log.Timber
import java.util.*
import java.util.Locale

class AudioPolicyServiceDumpProvider : ISessionDumpProvider {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package me.timschneeberger.rootlessjamesdsp.session.dump.provider

import android.content.Context
import me.timschneeberger.rootlessjamesdsp.model.AudioSessionDumpEntry
import me.timschneeberger.rootlessjamesdsp.session.dump.data.AudioServiceDump
import me.timschneeberger.rootlessjamesdsp.session.dump.data.ISessionInfoDump
import me.timschneeberger.rootlessjamesdsp.session.dump.utils.AudioFlingerServiceDumpUtils
import me.timschneeberger.rootlessjamesdsp.session.dump.utils.DumpUtils
import me.timschneeberger.rootlessjamesdsp.model.AudioSessionDumpEntry
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.getPackageNameFromUid
import timber.log.Timber
import java.lang.Exception

class AudioServiceDumpProvider : ISessionDumpProvider {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package me.timschneeberger.rootlessjamesdsp.session.dump.provider

import android.content.Context
import me.timschneeberger.rootlessjamesdsp.model.AppInfo
import me.timschneeberger.rootlessjamesdsp.session.dump.data.PackageServiceDump
import me.timschneeberger.rootlessjamesdsp.session.dump.utils.DumpUtils
import me.timschneeberger.rootlessjamesdsp.utils.extensions.PermissionExtensions.hasPackageUsagePermission
import timber.log.Timber

class PackageServiceDumpProvider : IDumpProvider {

fun dump(context: Context): PackageServiceDump? {
if(!context.hasPackageUsagePermission()) {
Timber.e("Package usage permission not granted")
return null
}

val dump = DumpUtils.dumpAll(context, TARGET_SERVICE, arrayOf("packages"))
dump ?: return null

return process("$dump\nPackages End")
}

private fun process(dump: String): PackageServiceDump {
val packageHeaderRegex = """Package \[(\S+)]""".toRegex()
var currentPackage: String? = null
var currentUid = -1
var currentIsSystem = false

val apps = mutableListOf<AppInfo>()
dump.lines().forEach {
if(it.contains("Package")) {
currentPackage?.let { pkg ->
apps.add(AppInfo(pkg, pkg, null, currentIsSystem, currentUid))
}
currentPackage = packageHeaderRegex.find(dump)?.groups?.get(1)?.value ?: currentPackage
}

if(currentPackage == null)
return@forEach

if(it.contains("userId"))
currentUid = it.split("=").getOrNull(1)?.trim()?.toIntOrNull() ?: -1
if(it.contains("flags"))
currentIsSystem = it.contains("SYSTEM")
}
return PackageServiceDump(apps)
}
override fun dumpString(context: Context): String {
val dump = DumpUtils.dumpAll(context, TARGET_SERVICE, arrayOf("packages"))
val sb = StringBuilder("=====> $TARGET_SERVICE raw dump\n")
sb.append(dump)
sb.append("\n\n")
sb.append("=====> $TARGET_SERVICE processed dump\n")
sb.append(process(dump ?: ""))

return sb.toString()
}

companion object
{
const val TARGET_SERVICE = "package"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import java.io.IOException
import java.io.InputStreamReader

object DumpUtils {
fun dumpLines(context: Context, service: String): List<String>? {
return dumpAll(context, service)?.lines()
fun dumpLines(context: Context, service: String, args: Array<String> = arrayOf<String>()): List<String>? {
return dumpAll(context, service, args)?.lines()
}

fun dumpAll(context: Context, service: String): String? {
fun dumpAll(context: Context, service: String, args: Array<String> = arrayOf<String>()): String? {
if(!context.hasDumpPermission())
return null

Expand All @@ -28,7 +28,7 @@ object DumpUtils {
Timber.wtf("Service '$service' does not exist")
return null
}
serviceBinder.dumpAsync(writePipe.fileDescriptor, arrayOf<String>())
serviceBinder.dumpAsync(writePipe.fileDescriptor, args)
writePipe.close()

val fd = FileInputStream(readPipe.fileDescriptor)
Expand All @@ -50,6 +50,5 @@ object DumpUtils {
Timber.wtf(ex)
return null
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ import timber.log.Timber

object PermissionExtensions {
private const val APP_OP_PROJECT_MEDIA = "android:project_media"
private const val APP_OP_PACKAGE_USAGE = "android:get_usage_stats"

fun Context.hasProjectMediaAppOp() = hasAppOp(APP_OP_PROJECT_MEDIA)
fun Context.hasPackageUsageAppOp() = hasAppOp(APP_OP_PACKAGE_USAGE)

private fun Context.hasAppOp(appOp: String): Boolean {
return try {
val applicationInfo = packageManager.getApplicationInfoCompat(packageName, 0)
Expand All @@ -32,6 +35,8 @@ object PermissionExtensions {

fun Context.hasRecordPermission() = hasPermission(Manifest.permission.RECORD_AUDIO)
fun Context.hasDumpPermission() = hasPermission(Manifest.permission.DUMP)
fun Context.hasPackageUsagePermission() = hasPermission(Manifest.permission.PACKAGE_USAGE_STATS) && hasPackageUsageAppOp()

fun Context.hasNotificationPermission(): Boolean {
sdkAbove(Build.VERSION_CODES.TIRAMISU) {
return hasPermission(Manifest.permission.POST_NOTIFICATIONS)
Expand Down
1 change: 1 addition & 0 deletions app/src/root/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />

<application
tools:node="merge">
Expand Down

0 comments on commit 3e36002

Please sign in to comment.