Skip to content

Commit 8991ead

Browse files
committed
feat: enhanced app permission management (#229)
1 parent a38bffd commit 8991ead

11 files changed

Lines changed: 245 additions & 86 deletions

File tree

app/build.gradle.kts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,11 @@ android {
6262
dependenciesInfo {
6363
includeInApk = false
6464
}
65-
composeCompiler {
66-
includeSourceInformation = false
67-
includeTraceMarkers = false
68-
}
65+
}
66+
67+
composeCompiler {
68+
includeSourceInformation = false
69+
includeTraceMarkers = false
6970
}
7071

7172
kotlin {

app/src/main/java/com/bintianqi/owndroid/LockTaskService.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@ import android.content.BroadcastReceiver
77
import android.content.Context
88
import android.content.Intent
99
import android.content.IntentFilter
10-
import android.content.pm.ServiceInfo
11-
import android.os.Build
1210
import android.os.IBinder
1311
import androidx.annotation.RequiresApi
1412
import androidx.core.app.NotificationCompat
15-
import androidx.core.app.ServiceCompat
1613
import androidx.core.content.ContextCompat
1714
import kotlinx.coroutines.CoroutineScope
1815
import kotlinx.coroutines.Dispatchers
@@ -50,10 +47,7 @@ class LockTaskService: Service() {
5047
.setOngoing(true)
5148
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
5249
.build()
53-
ServiceCompat.startForeground(
54-
this, NotificationType.LockTaskMode.id, notification,
55-
if (Build.VERSION.SDK_INT < 34) 0 else ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST
56-
)
50+
startForeground(NotificationType.LockTaskMode.id, notification)
5751
coroutineScope.launch {
5852
val am = getSystemService(ActivityManager::class.java)
5953
delay(3000)

app/src/main/java/com/bintianqi/owndroid/MainActivity.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,12 @@ import com.bintianqi.owndroid.dpm.PasswordInfoScreen
165165
import com.bintianqi.owndroid.dpm.PasswordScreen
166166
import com.bintianqi.owndroid.dpm.PermissionPolicy
167167
import com.bintianqi.owndroid.dpm.PermissionPolicyScreen
168-
import com.bintianqi.owndroid.dpm.PermissionsManager
169-
import com.bintianqi.owndroid.dpm.PermissionsManagerScreen
168+
import com.bintianqi.owndroid.dpm.AppPermissionsManager
169+
import com.bintianqi.owndroid.dpm.AppPermissionsManagerScreen
170+
import com.bintianqi.owndroid.dpm.PermissionDetail
171+
import com.bintianqi.owndroid.dpm.PermissionDetailScreen
172+
import com.bintianqi.owndroid.dpm.PermissionManager
173+
import com.bintianqi.owndroid.dpm.PermissionManagerScreen
170174
import com.bintianqi.owndroid.dpm.PermittedAccessibilityServices
171175
import com.bintianqi.owndroid.dpm.PermittedAsAndImPackages
172176
import com.bintianqi.owndroid.dpm.PermittedInputMethods
@@ -566,10 +570,17 @@ fun Home(vm: MyViewModel, onLock: () -> Unit) {
566570
::navigateToAppGroups, vm.appGroups, R.string.info_disable_user_control
567571
)
568572
}
569-
composable<PermissionsManager> {
570-
PermissionsManagerScreen(
571-
vm.packagePermissions, vm::getPackagePermissions, vm::setPackagePermission,
572-
::navigateUp, it.toRoute(), vm.chosenPackage, ::chooseSinglePackage
573+
composable<AppPermissionsManager> {
574+
AppPermissionsManagerScreen(
575+
vm::getPackagePermissions, vm::setPackagePermission, ::navigateUp, it.toRoute()
576+
)
577+
}
578+
composable<PermissionManager> {
579+
PermissionManagerScreen(::navigate, ::navigateUp)
580+
}
581+
composable<PermissionDetail> {
582+
PermissionDetailScreen(
583+
it.toRoute(), vm::getPermissionPackages, vm::setPackagePermission, ::navigateUp
573584
)
574585
}
575586
composable<DisableMeteredData> {

app/src/main/java/com/bintianqi/owndroid/MyRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,6 @@ class MyRepository(val dbHelper: MyDbHelper) {
272272
return list
273273
}
274274
fun deleteAllCrossProfileIntentFilters() {
275-
dbHelper.writableDatabase.delete("cross_profile_intent_filters", null, null);
275+
dbHelper.writableDatabase.delete("cross_profile_intent_filters", null, null)
276276
}
277277
}

app/src/main/java/com/bintianqi/owndroid/MyViewModel.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ import com.bintianqi.owndroid.dpm.doUserOperationWithContext
107107
import com.bintianqi.owndroid.dpm.getPackageInstaller
108108
import com.bintianqi.owndroid.dpm.globalSettings
109109
import com.bintianqi.owndroid.dpm.handlePrivilegeChange
110-
import com.bintianqi.owndroid.dpm.isValidPackageName
111110
import com.bintianqi.owndroid.dpm.parsePackageInstallerMessage
112111
import com.bintianqi.owndroid.dpm.runtimePermissions
113112
import com.bintianqi.owndroid.dpm.secureSettings
@@ -280,20 +279,23 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
280279
getUcdPackages()
281280
}
282281

283-
val packagePermissions = MutableStateFlow(emptyMap<String, Int>())
284-
fun getPackagePermissions(name: String) {
285-
if (name.isValidPackageName) {
286-
packagePermissions.value = runtimePermissions.associate {
287-
it.id to DPM.getPermissionGrantState(DAR, name, it.id)
288-
}
289-
} else {
290-
packagePermissions.value = emptyMap()
282+
fun getPackagePermissions(name: String): Map<String, Int> {
283+
return runtimePermissions.associate {
284+
it.id to DPM.getPermissionGrantState(DAR, name, it.id)
291285
}
292286
}
293287
fun setPackagePermission(name: String, permission: String, status: Int): Boolean {
294-
val result = DPM.setPermissionGrantState(DAR, name, permission, status)
295-
getPackagePermissions(name)
296-
return result
288+
return DPM.setPermissionGrantState(DAR, name, permission, status)
289+
}
290+
fun getPermissionPackages(permission: String): List<Pair<AppInfo, Int>> {
291+
return PM.getInstalledPackages(
292+
getInstalledAppsFlags or PackageManager.GET_PERMISSIONS
293+
).filter {
294+
it.requestedPermissions?.contains(permission) ?: false
295+
}.map {
296+
getAppInfo(it.packageName) to
297+
DPM.getPermissionGrantState(DAR, it.packageName, permission)
298+
}
297299
}
298300

299301
// Metered data disabled packages

app/src/main/java/com/bintianqi/owndroid/PackageChooser.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.bintianqi.owndroid
22

33
import android.content.pm.ApplicationInfo
4-
import android.content.pm.PackageManager
54
import android.graphics.drawable.Drawable
65
import android.os.Build
76
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -276,6 +275,3 @@ fun AppChooserScreen(
276275
}
277276
}
278277
}
279-
280-
val getInstalledAppsFlags =
281-
if(Build.VERSION.SDK_INT >= 24) PackageManager.MATCH_DISABLED_COMPONENTS or PackageManager.MATCH_UNINSTALLED_PACKAGES else 0

app/src/main/java/com/bintianqi/owndroid/Utils.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.content.Context
88
import android.content.Intent
99
import android.content.IntentFilter
1010
import android.content.pm.PackageInfo
11+
import android.content.pm.PackageManager
1112
import android.net.Uri
1213
import android.os.Build
1314
import android.widget.Toast
@@ -179,3 +180,6 @@ fun registerPackageRemovedReceiver(
179180
}
180181

181182
fun parsePackageNames(input: String) = input.split('\n').filter { it.isNotEmpty() }
183+
184+
val getInstalledAppsFlags =
185+
if(Build.VERSION.SDK_INT >= 24) PackageManager.MATCH_DISABLED_COMPONENTS or PackageManager.MATCH_UNINSTALLED_PACKAGES else 0

0 commit comments

Comments
 (0)