Merge "Cleanup step to reverts the USE_FULL_SCREEN_INTENT app op mode to MODE_DEFAULT if the permission flags for the USE_FULL_SCREEN_INTENT permission does not have USER_SET." into udc-dev

This commit is contained in:
Faye Yan
2023-05-12 02:25:22 +00:00
committed by Android (Google) Code Review
3 changed files with 935 additions and 5 deletions

View File

@@ -19,6 +19,7 @@ package com.android.server.appop;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.OP_SCHEDULE_EXACT_ALARM;
import static android.app.AppOpsManager.OP_USE_FULL_SCREEN_INTENT;
import static android.app.AppOpsManager.WATCH_FOREGROUND_CHANGES;
import static android.app.AppOpsManager.opRestrictsRead;
import static android.app.AppOpsManager.opToDefaultMode;
@@ -41,6 +42,7 @@ import android.os.Binder;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.permission.PermissionManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
@@ -107,7 +109,7 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface
* {@link #upgradeLocked(int)} below. The first version was 1.
*/
@VisibleForTesting
static final int CURRENT_VERSION = 3;
static final int CURRENT_VERSION = 4;
/**
* This stores the version of appops.xml seen at boot. If this is smaller than
@@ -1074,7 +1076,12 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface
upgradeScheduleExactAlarmLocked();
// fall through
case 2:
// for future upgrades
// split the appops.xml into appops.xml to store appop state and apppops_access.xml
// to store app-op access.
// fall through
case 3:
resetUseFullScreenIntentLocked();
// fall through
}
scheduleFastWriteLocked();
}
@@ -1145,6 +1152,38 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface
}
}
/**
* A cleanup step for U Beta 2 that reverts the OP_USE_FULL_SCREEN_INTENT's mode to MODE_DEFAULT
* if the permission flags for the USE_FULL_SCREEN_INTENT permission does not have USER_SET.
*/
@VisibleForTesting
@GuardedBy("mLock")
void resetUseFullScreenIntentLocked() {
final PermissionManagerServiceInternal pmsi = LocalServices.getService(
PermissionManagerServiceInternal.class);
final UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class);
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final PermissionManager permissionManager =
mContext.getSystemService(PermissionManager.class);
final String permissionName = AppOpsManager.opToPermission(OP_USE_FULL_SCREEN_INTENT);
final String[] packagesDeclaringPermission =
pmsi.getAppOpPermissionPackages(permissionName);
final int[] userIds = umi.getUserIds();
for (final String pkg : packagesDeclaringPermission) {
for (int userId : userIds) {
final int uid = pmi.getPackageUid(pkg, 0, userId);
final int flags = permissionManager.getPermissionFlags(pkg, permissionName,
UserHandle.of(userId));
if ((flags & PackageManager.FLAG_PERMISSION_USER_SET) == 0) {
setUidMode(uid, OP_USE_FULL_SCREEN_INTENT,
AppOpsManager.opToDefaultMode(OP_USE_FULL_SCREEN_INTENT));
}
}
}
}
@VisibleForTesting
List<Integer> getUidsWithNonDefaultModes() {
List<Integer> result = new ArrayList<>();

View File

@@ -0,0 +1,801 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<!--
~ Copyright (C) 2023 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<app-ops v="3">
<uid n="1001">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="15" m="0" />
<op n="27" m="4" />
<op n="87" m="1" />
</uid>
<uid n="1002">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="15" m="0" />
<op n="87" m="1" />
</uid>
<uid n="10077">
<op n="87" m="1" />
</uid>
<uid n="10079">
<op n="116" m="1" />
</uid>
<uid n="10080">
<op n="87" m="1" />
</uid>
<uid n="10081">
<op n="87" m="1" />
</uid>
<uid n="10086">
<op n="87" m="1" />
</uid>
<uid n="10087">
<op n="59" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10090">
<op n="0" m="4" />
<op n="1" m="4" />
</uid>
<uid n="10096">
<op n="0" m="1" />
<op n="1" m="1" />
</uid>
<uid n="10112">
<op n="11" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="62" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10113">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="51" m="1" />
<op n="62" m="1" />
</uid>
<uid n="10114">
<op n="4" m="1" />
</uid>
<uid n="10115">
<op n="0" m="1" />
</uid>
<uid n="10116">
<op n="0" m="1" />
</uid>
<uid n="10117">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="13" m="1" />
<op n="14" m="1" />
<op n="16" m="1" />
<op n="26" m="4" />
<op n="27" m="4" />
</uid>
<uid n="10118">
<op n="51" m="1" />
</uid>
<uid n="10119">
<op n="11" m="1" />
<op n="77" m="1" />
<op n="111" m="1" />
</uid>
<uid n="10120">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="6" m="1" />
<op n="7" m="1" />
<op n="11" m="1" />
<op n="13" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="54" m="1" />
<op n="59" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10121">
<op n="59" m="1" />
<op n="60" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10122">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10123">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="87" m="1" />
</uid>
<uid n="10124">
<op n="11" m="1" />
<op n="26" m="1" />
</uid>
<uid n="10125">
<op n="11" m="1" />
</uid>
<uid n="10127">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="26" m="4" />
<op n="27" m="4" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="65" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
<op n="111" m="1" />
</uid>
<uid n="10129">
<op n="0" m="1" />
<op n="1" m="1" />
</uid>
<uid n="10130">
<op n="51" m="1" />
</uid>
<uid n="10131">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10132">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="69" m="1" />
<op n="79" m="1" />
</uid>
<uid n="10133">
<op n="11" m="1" />
</uid>
<uid n="10136">
<op n="0" m="1" />
<op n="4" m="1" />
<op n="77" m="1" />
<op n="87" m="1" />
<op n="111" m="1" />
<op n="114" m="1" />
</uid>
<uid n="10137">
<op n="62" m="1" />
</uid>
<uid n="10138">
<op n="26" m="4" />
</uid>
<uid n="10140">
<op n="26" m="4" />
<op n="27" m="4" />
<op n="87" m="1" />
</uid>
<uid n="10141">
<op n="11" m="1" />
<op n="27" m="1" />
<op n="111" m="1" />
</uid>
<uid n="10142">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="11" m="1" />
</uid>
<uid n="10144">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="11" m="1" />
<op n="27" m="4" />
<op n="111" m="1" />
</uid>
<uid n="10145">
<op n="11" m="1" />
</uid>
<uid n="10149">
<op n="11" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10150">
<op n="51" m="1" />
</uid>
<uid n="10151">
<op n="11" m="1" />
</uid>
<uid n="10152">
<op n="11" m="1" />
</uid>
<uid n="10154">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="27" m="4" />
</uid>
<uid n="10155">
<op n="0" m="1" />
<op n="1" m="1" />
</uid>
<uid n="10157">
<op n="13" m="1" />
</uid>
<uid n="10158">
<op n="11" m="1" />
</uid>
<uid n="10160">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="11" m="1" />
<op n="26" m="4" />
<op n="27" m="4" />
<op n="87" m="1" />
</uid>
<uid n="10161">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="11" m="1" />
<op n="51" m="1" />
<op n="77" m="1" />
<op n="87" m="1" />
<op n="111" m="1" />
<op n="114" m="1" />
</uid>
<uid n="10162">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="15" m="0" />
<op n="26" m="4" />
<op n="27" m="4" />
<op n="87" m="1" />
<op n="89" m="0" />
</uid>
<uid n="10163">
<op n="26" m="4" />
<op n="27" m="4" />
<op n="56" m="4" />
<op n="87" m="1" />
</uid>
<uid n="10164">
<op n="26" m="1" />
<op n="27" m="4" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="69" m="1" />
<op n="79" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10169">
<op n="11" m="1" />
</uid>
<uid n="10170">
<op n="87" m="1" />
</uid>
<uid n="10171">
<op n="26" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10172">
<op n="11" m="1" />
</uid>
<uid n="10173">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="23" m="0" />
<op n="26" m="1" />
<op n="51" m="1" />
<op n="62" m="1" />
<op n="65" m="1" />
</uid>
<uid n="10175">
<op n="0" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
</uid>
<uid n="10178">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="11" m="1" />
<op n="27" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10179">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="62" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10180">
<op n="11" m="1" />
</uid>
<uid n="10181">
<op n="4" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="59" m="1" />
<op n="62" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="1110181">
<op n="4" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
<op n="107" m="2" />
</uid>
<uid n="10182">
<op n="27" m="4" />
</uid>
<uid n="10183">
<op n="11" m="1" />
<op n="26" m="4" />
</uid>
<uid n="10184">
<op n="4" m="1" />
<op n="11" m="1" />
<op n="13" m="1" />
<op n="26" m="1" />
<op n="27" m="4" />
</uid>
<uid n="10185">
<op n="8" m="1" />
<op n="59" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10187">
<op n="11" m="1" />
</uid>
<uid n="10189">
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="51" m="1" />
</uid>
<uid n="10190">
<op n="0" m="1" />
<op n="13" m="1" />
</uid>
<uid n="10191">
<op n="11" m="1" />
</uid>
<uid n="10192">
<op n="11" m="1" />
<op n="13" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10193">
<op n="11" m="1" />
</uid>
<uid n="10197">
<op n="11" m="1" />
</uid>
<uid n="10198">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="77" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
<op n="90" m="1" />
<op n="107" m="0" />
<op n="111" m="1" />
<op n="133" m="0" />
</uid>
<uid n="10199">
<op n="4" m="1" />
<op n="11" m="1" />
<op n="26" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="62" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10200">
<op n="11" m="1" />
<op n="65" m="1" />
<op n="107" m="1" />
<op n="133" m="1" />
</uid>
<uid n="1110200">
<op n="11" m="1" />
<op n="65" m="1" />
<op n="107" m="2" />
<op n="133" m="2"/>
</uid>
<uid n="10201">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="11" m="1" />
<op n="51" m="1" />
<op n="62" m="1" />
<op n="84" m="0" />
<op n="86" m="0" />
<op n="87" m="1" />
</uid>
<uid n="10206">
<op n="0" m="4" />
<op n="1" m="4" />
<op n="26" m="4" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10209">
<op n="11" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10210">
<op n="51" m="1" />
</uid>
<uid n="10212">
<op n="11" m="1" />
<op n="62" m="1" />
</uid>
<uid n="10214">
<op n="26" m="4" />
</uid>
<uid n="10216">
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10225">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="51" m="1" />
<op n="59" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10229">
<op n="11" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="62" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10231">
<op n="51" m="1" />
</uid>
<uid n="10232">
<op n="51" m="1" />
</uid>
<uid n="10234">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="11" m="1" />
<op n="13" m="1" />
<op n="20" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10235">
<op n="59" m="1" />
<op n="60" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10237">
<op n="0" m="4" />
<op n="1" m="4" />
</uid>
<uid n="10238">
<op n="26" m="4" />
<op n="27" m="4" />
<op n="87" m="1" />
</uid>
<uid n="10240">
<op n="112" m="1" />
</uid>
<uid n="10241">
<op n="59" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10245">
<op n="13" m="1" />
<op n="51" m="1" />
</uid>
<uid n="10247">
<op n="0" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="0" />
<op n="90" m="1" />
</uid>
<uid n="10254">
<op n="11" m="1" />
</uid>
<uid n="10255">
<op n="11" m="1" />
</uid>
<uid n="10256">
<op n="87" m="1" />
</uid>
<uid n="10258">
<op n="11" m="1" />
</uid>
<uid n="10260">
<op n="51" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="87" m="1" />
</uid>
<uid n="10262">
<op n="15" m="0" />
</uid>
<uid n="10266">
<op n="0" m="4" />
</uid>
<uid n="10267">
<op n="0" m="1" />
<op n="1" m="1" />
<op n="4" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="62" m="1" />
<op n="77" m="1" />
<op n="81" m="1" />
<op n="83" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
<op n="107" m="2" />
<op n="111" m="1" />
<op n="133" m="2" />
</uid>
<uid n="10268">
<op n="4" m="1" />
<op n="11" m="1" />
<op n="62" m="1" />
</uid>
<uid n="10269">
<op n="11" m="1" />
<op n="26" m="1" />
<op n="27" m="1" />
<op n="59" m="1" />
<op n="60" m="1" />
<op n="85" m="1" />
<op n="87" m="1" />
</uid>
<pkg n="com.google.android.iwlan">
<uid n="0">
<op n="1" />
<op n="75" m="0" />
</uid>
</pkg>
<pkg n="com.android.phone">
<uid n="0">
<op n="1" />
<op n="75" m="0" />
</uid>
</pkg>
<pkg n="android">
<uid n="1000">
<op n="0">
<st n="214748364801" t="1670287941040" />
</op>
<op n="4">
<st n="214748364801" t="1670289665522" />
</op>
<op n="6">
<st n="214748364801" t="1670287946650" />
</op>
<op n="8">
<st n="214748364801" t="1670289624396" />
</op>
<op n="14">
<st n="214748364801" t="1670287951031" />
</op>
<op n="40">
<st n="214748364801" t="1670291786337" d="156" />
</op>
<op n="41">
<st id="SensorNotificationService" n="214748364801" t="1670287585567" d="4251183" />
<st id="CountryDetector" n="214748364801" t="1670287583306" d="6700" />
</op>
<op n="43">
<st n="214748364801" r="1670291755062" />
</op>
<op n="61">
<st n="214748364801" r="1670291754997" />
</op>
<op n="105">
<st n="214748364801" r="1670291473903" />
<st id="GnssService" n="214748364801" r="1670288044920" />
</op>
<op n="111">
<st n="214748364801" t="1670291441554" />
</op>
</uid>
</pkg>
<pkg n="com.android.server.telecom">
<uid n="1000">
<op n="6">
<st n="214748364801" t="1670287609092" />
</op>
<op n="111">
<st n="214748364801" t="1670287583728" />
</op>
</uid>
</pkg>
<pkg n="com.android.settings">
<uid n="1000">
<op n="43">
<st n="214748364801" r="1670291447349" />
</op>
<op n="105">
<st n="214748364801" r="1670291399231" />
</op>
<op n="111">
<st n="214748364801" t="1670291756910" />
</op>
</uid>
</pkg>
<pkg n="com.android.phone">
<uid n="1001">
<op n="15">
<st n="214748364801" t="1670287951022" />
</op>
<op n="40">
<st n="214748364801" t="1670291786177" />
</op>
<op n="105">
<st n="214748364801" r="1670291756403" />
</op>
</uid>
</pkg>
<pkg n="com.android.bluetooth">
<uid n="1002">
<op n="4">
<st n="214748364801" t="1670289671076" />
</op>
<op n="40">
<st n="214748364801" t="1670287585676" d="8" />
</op>
<op n="43">
<st n="214748364801" r="1670287585818" />
</op>
<op n="77">
<st n="214748364801" t="1670288037629" />
</op>
<op n="111">
<st n="214748364801" t="1670287592081" />
</op>
</uid>
</pkg>
<pkg n="com.android.vending">
<uid n="10136">
<op n="40">
<st n="429496729601" t="1670289621210" d="114" />
<st n="858993459201" t="1670289879730" d="349" />
<st n="1288490188801" t="1670287942622" d="937" />
</op>
<op n="43">
<st n="429496729601" r="1670289755305" />
<st n="858993459201" r="1670288019246" />
<st n="1073741824001" r="1670289571783" />
<st n="1288490188801" r="1670289373336" />
</op>
<op n="76">
<st n="429496729601" t="1670289748735" d="15991" />
<st n="858993459201" t="1670291395180" d="79201" />
<st n="1073741824001" t="1670291395168" d="12" />
<st n="1288490188801" t="1670291526029" d="3" />
<st n="1503238553601" t="1670291526032" d="310718" />
</op>
<op n="105">
<st n="429496729601" r="1670289538910" />
<st n="858993459201" r="1670288054519" />
<st n="1073741824001" r="1670287599379" />
<st n="1288490188801" r="1670289526854" />
<st n="1503238553601" r="1670289528242" />
</op>
</uid>
</pkg>
<pkg n="com.android.nfc">
<uid n="1027">
<op n="40">
<st n="214748364801" t="1670291786330" d="22" />
</op>
</uid>
</pkg>
</app-ops>

View File

@@ -17,6 +17,7 @@
package com.android.server.appop;
import static android.app.AppOpsManager.OP_SCHEDULE_EXACT_ALARM;
import static android.app.AppOpsManager.OP_USE_FULL_SCREEN_INTENT;
import static android.app.AppOpsManager._NUM_OP;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
@@ -31,6 +32,7 @@ import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
@@ -44,6 +46,7 @@ import android.content.pm.UserPackage;
import android.content.res.AssetManager;
import android.os.Handler;
import android.os.UserHandle;
import android.permission.PermissionManager;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
@@ -87,6 +90,10 @@ public class AppOpsUpgradeTest {
"AppOpsUpgradeTest/appops-unversioned.xml";
private static final String APP_OPS_VERSION_1_ASSET_PATH =
"AppOpsUpgradeTest/appops-version-1.xml";
private static final String APP_OPS_VERSION_3_ASSET_PATH =
"AppOpsUpgradeTest/appops-version-3.xml";
private static final String APP_OPS_FILENAME = "appops-test.xml";
private static final Context sContext = InstrumentationRegistry.getTargetContext();
@@ -105,6 +112,8 @@ public class AppOpsUpgradeTest {
private PermissionManagerServiceInternal mPermissionManagerInternal;
@Mock
private Handler mHandler;
@Mock
private PermissionManager mPermissionManager;
private Object mLock = new Object();
private SparseArray<int[]> mSwitchedOps;
@@ -211,7 +220,7 @@ public class AppOpsUpgradeTest {
}
}
private static int getModeInFile(int uid) {
private static int getModeInFile(int uid, int op) {
switch (uid) {
case 10198:
return 0;
@@ -222,7 +231,7 @@ public class AppOpsUpgradeTest {
case 1110181:
return 2;
default:
return AppOpsManager.opToDefaultMode(OP_SCHEDULE_EXACT_ALARM);
return AppOpsManager.opToDefaultMode(op);
}
}
@@ -258,7 +267,7 @@ public class AppOpsUpgradeTest {
for (int userId : userIds) {
for (int appId : appIds) {
final int uid = UserHandle.getUid(userId, appId);
final int previousMode = getModeInFile(uid);
final int previousMode = getModeInFile(uid, OP_SCHEDULE_EXACT_ALARM);
final int expectedMode;
if (previousMode == AppOpsManager.opToDefaultMode(OP_SCHEDULE_EXACT_ALARM)) {
@@ -280,6 +289,55 @@ public class AppOpsUpgradeTest {
}
}
@Test
public void resetUseFullScreenIntent() {
extractAppOpsFile(APP_OPS_VERSION_3_ASSET_PATH);
String[] packageNames = {"p1", "package2", "pkg3", "package.4", "pkg-5", "pkg.6"};
int[] appIds = {10267, 10181, 10198, 10199, 10200, 4213};
int[] userIds = {0, 10, 11};
int flag = 0;
doReturn(userIds).when(mUserManagerInternal).getUserIds();
doReturn(packageNames).when(mPermissionManagerInternal).getAppOpPermissionPackages(
AppOpsManager.opToPermission(OP_USE_FULL_SCREEN_INTENT));
doReturn(mPermissionManager).when(mTestContext).getSystemService(PermissionManager.class);
doReturn(flag).when(mPackageManager).getPermissionFlags(
anyString(), anyString(), isA(UserHandle.class));
doAnswer(invocation -> {
String pkg = invocation.getArgument(0);
int index = ArrayUtils.indexOf(packageNames, pkg);
if (index < 0) {
return index;
}
int userId = invocation.getArgument(2);
return UserHandle.getUid(userId, appIds[index]);
}).when(mPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt());
AppOpsCheckingServiceImpl testService = new AppOpsCheckingServiceImpl(sAppOpsFile, mLock,
mHandler, mTestContext, mSwitchedOps);
testService.readState();
synchronized (testService) {
testService.resetUseFullScreenIntentLocked();
}
for (int userId : userIds) {
for (int appId : appIds) {
final int uid = UserHandle.getUid(userId, appId);
final int expectedMode = AppOpsManager.opToDefaultMode(OP_USE_FULL_SCREEN_INTENT);
synchronized (testService) {
int mode = testService.getUidMode(uid, OP_USE_FULL_SCREEN_INTENT);
assertEquals(expectedMode, mode);
}
}
}
}
@Test
public void upgradeFromNoFile() {
assertFalse(sAppOpsFile.exists());
@@ -290,12 +348,14 @@ public class AppOpsUpgradeTest {
doNothing().when(testService).upgradeRunAnyInBackgroundLocked();
doNothing().when(testService).upgradeScheduleExactAlarmLocked();
doNothing().when(testService).resetUseFullScreenIntentLocked();
// trigger upgrade
testService.systemReady();
verify(testService, never()).upgradeRunAnyInBackgroundLocked();
verify(testService, never()).upgradeScheduleExactAlarmLocked();
verify(testService, never()).resetUseFullScreenIntentLocked();
testService.writeState();
@@ -319,12 +379,14 @@ public class AppOpsUpgradeTest {
doNothing().when(testService).upgradeRunAnyInBackgroundLocked();
doNothing().when(testService).upgradeScheduleExactAlarmLocked();
doNothing().when(testService).resetUseFullScreenIntentLocked();
// trigger upgrade
testService.systemReady();
verify(testService).upgradeRunAnyInBackgroundLocked();
verify(testService).upgradeScheduleExactAlarmLocked();
verify(testService).resetUseFullScreenIntentLocked();
testService.writeState();
assertTrue(parser.parse());
@@ -344,12 +406,40 @@ public class AppOpsUpgradeTest {
doNothing().when(testService).upgradeRunAnyInBackgroundLocked();
doNothing().when(testService).upgradeScheduleExactAlarmLocked();
doNothing().when(testService).resetUseFullScreenIntentLocked();
// trigger upgrade
testService.systemReady();
verify(testService, never()).upgradeRunAnyInBackgroundLocked();
verify(testService).upgradeScheduleExactAlarmLocked();
verify(testService).resetUseFullScreenIntentLocked();
testService.writeState();
assertTrue(parser.parse());
assertEquals(AppOpsCheckingServiceImpl.CURRENT_VERSION, parser.mVersion);
}
@Test
public void resetFromVersion3() {
extractAppOpsFile(APP_OPS_VERSION_3_ASSET_PATH);
AppOpsDataParser parser = new AppOpsDataParser(sAppOpsFile);
assertTrue(parser.parse());
assertEquals(3, parser.mVersion);
AppOpsCheckingServiceImpl testService = spy(new AppOpsCheckingServiceImpl(sAppOpsFile,
mLock, mHandler, mTestContext, mSwitchedOps));
testService.readState();
doNothing().when(testService).upgradeRunAnyInBackgroundLocked();
doNothing().when(testService).upgradeScheduleExactAlarmLocked();
doNothing().when(testService).resetUseFullScreenIntentLocked();
testService.systemReady();
verify(testService, never()).upgradeRunAnyInBackgroundLocked();
verify(testService, never()).upgradeScheduleExactAlarmLocked();
verify(testService).resetUseFullScreenIntentLocked();
testService.writeState();
assertTrue(parser.parse());