• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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.pm.pkg;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.content.pm.ComponentInfo;
22 import android.content.pm.PackageManager;
23 import com.android.server.pm.pkg.component.ParsedMainComponent;
24 
25 import android.util.SparseArray;
26 
27 import com.android.server.pm.parsing.pkg.AndroidPackage;
28 
29 public class PackageStateUtils {
30 
isMatch(PackageState packageState, long flags)31     public static boolean isMatch(PackageState packageState, long flags) {
32         if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) {
33             return packageState.isSystem();
34         }
35         return true;
36     }
37 
queryInstalledUsers(PackageStateInternal pkgState, int[] users, boolean installed)38     public static int[] queryInstalledUsers(PackageStateInternal pkgState, int[] users,
39             boolean installed) {
40         int num = 0;
41         for (int user : users) {
42             if (pkgState.getUserStateOrDefault(user).isInstalled() == installed) {
43                 num++;
44             }
45         }
46         int[] res = new int[num];
47         num = 0;
48         for (int user : users) {
49             if (pkgState.getUserStateOrDefault(user).isInstalled() == installed) {
50                 res[num] = user;
51                 num++;
52             }
53         }
54         return res;
55     }
56 
isEnabledAndMatches(@ullable PackageStateInternal packageState, ComponentInfo componentInfo, long flags, int userId)57     public static boolean isEnabledAndMatches(@Nullable PackageStateInternal packageState,
58             ComponentInfo componentInfo, long flags, int userId) {
59         if (packageState == null) return false;
60 
61         final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId);
62         return PackageUserStateUtils.isMatch(userState, componentInfo, flags);
63     }
64 
isEnabledAndMatches(@ullable PackageStateInternal packageState, @NonNull ParsedMainComponent component, long flags, int userId)65     public static boolean isEnabledAndMatches(@Nullable PackageStateInternal packageState,
66             @NonNull ParsedMainComponent component, long flags, int userId) {
67         if (packageState == null) {
68             return false;
69         }
70 
71         final AndroidPackage pkg = packageState.getPkg();
72         if (pkg == null) {
73             return false;
74         }
75         final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId);
76         return PackageUserStateUtils.isMatch(userState, packageState.isSystem(),
77                 pkg.isEnabled(), component, flags);
78     }
79 
80     /**
81      * Return the earliest non-zero first-install timestamp of an installed app among all the users,
82      * unless none of the users have a non-zero first-install timestamp. In that case, return 0.
83      */
getEarliestFirstInstallTime( @ullable SparseArray<? extends PackageUserStateInternal> userStatesInternal)84     public static long getEarliestFirstInstallTime(
85             @Nullable SparseArray<? extends PackageUserStateInternal> userStatesInternal) {
86         if (userStatesInternal == null || userStatesInternal.size() == 0) {
87             return 0;
88         }
89         long earliestFirstInstallTime = Long.MAX_VALUE;
90         for (int i = 0; i < userStatesInternal.size(); i++) {
91             final long firstInstallTime = userStatesInternal.valueAt(i).getFirstInstallTime();
92             if (firstInstallTime != 0 && firstInstallTime < earliestFirstInstallTime) {
93                 earliestFirstInstallTime = firstInstallTime;
94             }
95         }
96         return earliestFirstInstallTime == Long.MAX_VALUE ? 0 : earliestFirstInstallTime;
97     }
98 }
99