1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.permission.access.appop
18 
19 import android.app.AppOpsManager
20 import com.android.server.permission.access.MutateStateScope
21 import com.android.server.pm.pkg.PackageState
22 
23 class AppIdAppOpUpgrade(private val policy: AppIdAppOpPolicy) {
MutateStateScopenull24     fun MutateStateScope.upgradePackageState(
25         packageState: PackageState,
26         userId: Int,
27         version: Int,
28     ) {
29         if (version <= 2) {
30             with(policy) {
31                 val appOpMode =
32                     getAppOpMode(packageState.appId, userId, AppOpsManager.OPSTR_RUN_IN_BACKGROUND)
33                 setAppOpMode(
34                     packageState.appId,
35                     userId,
36                     AppOpsManager.OPSTR_RUN_ANY_IN_BACKGROUND,
37                     appOpMode
38                 )
39             }
40         }
41         if (version <= 13) {
42             val permissionName = AppOpsManager.opToPermission(AppOpsManager.OP_SCHEDULE_EXACT_ALARM)
43             if (permissionName in packageState.androidPackage!!.requestedPermissions) {
44                 with(policy) {
45                     val appOpMode =
46                         getAppOpMode(
47                             packageState.appId,
48                             userId,
49                             AppOpsManager.OPSTR_SCHEDULE_EXACT_ALARM
50                         )
51                     val defaultAppOpMode =
52                         AppOpsManager.opToDefaultMode(AppOpsManager.OP_SCHEDULE_EXACT_ALARM)
53                     if (appOpMode == defaultAppOpMode) {
54                         setAppOpMode(
55                             packageState.appId,
56                             userId,
57                             AppOpsManager.OPSTR_SCHEDULE_EXACT_ALARM,
58                             AppOpsManager.MODE_ALLOWED
59                         )
60                     }
61                 }
62             }
63         }
64     }
65 }
66