summaryrefslogtreecommitdiff
path: root/PermissionController/src/com/android/permissioncontroller/permission/service
diff options
context:
space:
mode:
authorKarishma Vakil <kvakil@google.com>2023-01-24 17:32:20 +0000
committerKarishma Vakil <kvakil@google.com>2023-01-31 21:06:39 +0000
commit85125e4d6c3b9a1c1b4da5dd52d1c1e0c58a45b0 (patch)
tree69da2cc816b30937237a90c750a7ec35706a3a0a /PermissionController/src/com/android/permissioncontroller/permission/service
parent906b3b7b37a03c3db8754200483be76e6395a816 (diff)
downloadPermission-85125e4d6c3b9a1c1b4da5dd52d1c1e0c58a45b0.tar.gz
[Safety Labels] Add methods to interact with persistence to facilitate
monthly hygiene. These methods will be called from SafetyLabelChangesJobService. Methods added to: * record many safety labels at a time * delete safety labels for a collection of apps * delete safety labels that are old enough that they won't be needed Bug: 265380622 Bug: 262062121 Bug: 261662354 Test: atest PermissionControllerMockingTests:AppsSafetyLabelHistoryPersistenceTest Change-Id: I600275944119cbcf17b2f6a24b462b72f6269370
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/permission/service')
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/v34/SafetyLabelChangesJobService.kt64
1 files changed, 39 insertions, 25 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/v34/SafetyLabelChangesJobService.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/v34/SafetyLabelChangesJobService.kt
index 51703eed9..24482bd51 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/v34/SafetyLabelChangesJobService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/v34/SafetyLabelChangesJobService.kt
@@ -34,7 +34,7 @@ import android.os.UserHandle
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
-import com.android.permission.safetylabel.SafetyLabel
+import com.android.permission.safetylabel.SafetyLabel as AppMetadataSafetyLabel
import com.android.permissioncontroller.Constants.PERIODIC_SAFETY_LABEL_CHANGES_JOB_ID
import com.android.permissioncontroller.Constants.PERMISSION_REMINDER_CHANNEL_ID
import com.android.permissioncontroller.Constants.SAFETY_LABEL_CHANGES_JOB_ID
@@ -46,8 +46,8 @@ import com.android.permissioncontroller.permission.data.SinglePermGroupPackagesU
import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.Utils.getSystemServiceSafe
import com.android.permissioncontroller.safetylabel.AppsSafetyLabelHistory
+import com.android.permissioncontroller.safetylabel.AppsSafetyLabelHistory.SafetyLabel as SafetyLabelForPersistence
import com.android.permissioncontroller.safetylabel.AppsSafetyLabelHistoryPersistence
-import com.android.permissioncontroller.safetylabel.AppsSafetyLabelHistoryPersistence.getPackagesWithSafetyLabels
import java.time.Instant
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@@ -131,28 +131,37 @@ class SafetyLabelChangesJobService : JobService() {
val context = PermissionControllerApplication.get() as Context
val historyFile = AppsSafetyLabelHistoryPersistence.getSafetyLabelHistoryFile(context)
- val packageNamesWithoutPersistedSafetyLabels: Set<String> =
- getAllNonPreinstalledPackageNamesRequestingLocation() -
- getPackagesWithSafetyLabels(historyFile)
+ val packageNamesWithPersistedSafetyLabels: Set<String> =
+ AppsSafetyLabelHistoryPersistence.getAppsWithSafetyLabels(historyFile)
+ .map { it.packageName }
+ .toSet()
+ val packageNamesWithRelevantSafetyLabels: Set<String> =
+ getAllNonPreinstalledPackageNamesRequestingLocation()
+ val packageNamesToInitialize: Set<String> =
+ packageNamesWithRelevantSafetyLabels - packageNamesWithPersistedSafetyLabels
- for (packageName in packageNamesWithoutPersistedSafetyLabels) {
+ val safetyLabelsToPersist = mutableSetOf<SafetyLabelForPersistence>()
+
+ for (packageName in packageNamesToInitialize) {
yield() // cancellation point
val appMetadataBundle = context.packageManager.getAppMetadata(packageName)
- val safetyLabel: SafetyLabel =
- SafetyLabel.getSafetyLabelFromMetadata(appMetadataBundle) ?: continue
+ val appMetadataSafetyLabel: AppMetadataSafetyLabel =
+ AppMetadataSafetyLabel.getSafetyLabelFromMetadata(appMetadataBundle) ?: continue
// TODO(b/264884404): Use install time or last update time for an app for the time a
// safety label is received instead of current time.
- val safetyLabelForPersistence =
+ val safetyLabelForPersistence: SafetyLabelForPersistence =
AppsSafetyLabelHistory.SafetyLabel.fromAppMetadataSafetyLabel(
- packageName, receivedAt = Instant.now(), safetyLabel)
- // TODO(b/265380622): Add a method to record safety labels in bulk rather than calling
- // recordSafetyLabel once per package
- AppsSafetyLabelHistoryPersistence.recordSafetyLabel(
- safetyLabelForPersistence, historyFile)
+ packageName, receivedAt = Instant.now(), appMetadataSafetyLabel)
+
+ safetyLabelsToPersist.add(safetyLabelForPersistence)
}
+
+ AppsSafetyLabelHistoryPersistence.recordSafetyLabels(safetyLabelsToPersist, historyFile)
}
+ // TODO(b/261607291): Modify this logic when we enable safety label change notifications for
+ // preinstalled apps.
private suspend fun getAllNonPreinstalledPackageNamesRequestingLocation(): Set<String> =
getAllPackagesRequestingLocation()
.filter { !isPreinstalledPackage(it) }
@@ -255,11 +264,13 @@ class SafetyLabelChangesJobService : JobService() {
return
}
- val job = JobInfo.Builder(PERIODIC_SAFETY_LABEL_CHANGES_JOB_ID,
- ComponentName(context, SafetyLabelChangesJobService::class.java)
- ).setPeriodic(KotlinUtils.getSafetyLabelChangesJobIntervalMillis())
- .setPersisted(true)
- .build()
+ val job =
+ JobInfo.Builder(
+ PERIODIC_SAFETY_LABEL_CHANGES_JOB_ID,
+ ComponentName(context, SafetyLabelChangesJobService::class.java))
+ .setPeriodic(KotlinUtils.getSafetyLabelChangesJobIntervalMillis())
+ .setPersisted(true)
+ .build()
val result = jobScheduler.schedule(job)
if (result != JobScheduler.RESULT_SUCCESS) {
Log.w(LOG_TAG, "Safety label job not scheduled, result code: $result")
@@ -282,12 +293,15 @@ class SafetyLabelChangesJobService : JobService() {
return
}
- val job = JobInfo.Builder(SAFETY_LABEL_CHANGES_JOB_ID,
- ComponentName(context, SafetyLabelChangesJobService::class.java)
- ).setPersisted(true)
- .setRequiresDeviceIdle(KotlinUtils.runSafetyLabelChangesJobOnlyWhenDeviceIdle())
- .setMinimumLatency(KotlinUtils.getSafetyLabelChangesJobDelayMillis())
- .build()
+ val job =
+ JobInfo.Builder(
+ SAFETY_LABEL_CHANGES_JOB_ID,
+ ComponentName(context, SafetyLabelChangesJobService::class.java))
+ .setPersisted(true)
+ .setRequiresDeviceIdle(
+ KotlinUtils.runSafetyLabelChangesJobOnlyWhenDeviceIdle())
+ .setMinimumLatency(KotlinUtils.getSafetyLabelChangesJobDelayMillis())
+ .build()
val result = jobScheduler.schedule(job)
if (result == JobScheduler.RESULT_SUCCESS) {
Log.i(LOG_TAG, "main job scheduled successfully")