diff options
author | Karishma Vakil <kvakil@google.com> | 2023-01-24 17:32:20 +0000 |
---|---|---|
committer | Karishma Vakil <kvakil@google.com> | 2023-01-31 21:06:39 +0000 |
commit | 85125e4d6c3b9a1c1b4da5dd52d1c1e0c58a45b0 (patch) | |
tree | 69da2cc816b30937237a90c750a7ec35706a3a0a /PermissionController/src/com/android/permissioncontroller/permission/service | |
parent | 906b3b7b37a03c3db8754200483be76e6395a816 (diff) | |
download | Permission-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.kt | 64 |
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") |