PackageTrackerHelperImpl.java revision 3accca05ddcad9d0b1b313eae49f273e39121d3c
1/*
2 * Copyright (C) 2017 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
17package com.android.server.timezone;
18
19import com.android.internal.R;
20
21import android.content.Context;
22import android.content.Intent;
23import android.content.pm.PackageInfo;
24import android.content.pm.PackageManager;
25import android.content.pm.ProviderInfo;
26import android.content.pm.ResolveInfo;
27import android.content.res.Resources;
28import android.os.SystemClock;
29import android.os.UserHandle;
30import android.util.Slog;
31
32import java.util.List;
33
34/**
35 * A single class that implements multiple helper interfaces for use by {@link PackageTracker}.
36 */
37final class PackageTrackerHelperImpl implements ClockHelper, ConfigHelper, PackageManagerHelper {
38
39    private static final String TAG = "PackageTrackerHelperImpl";
40
41    private final Context mContext;
42    private final PackageManager mPackageManager;
43
44    PackageTrackerHelperImpl(Context context) {
45        mContext = context;
46        mPackageManager = context.getPackageManager();
47    }
48
49    @Override
50    public boolean isTrackingEnabled() {
51        return mContext.getResources().getBoolean(R.bool.config_timeZoneRulesUpdateTrackingEnabled);
52    }
53
54    @Override
55    public String getUpdateAppPackageName() {
56        return mContext.getResources().getString(R.string.config_timeZoneRulesUpdaterPackage);
57    }
58
59    @Override
60    public String getDataAppPackageName() {
61        Resources resources = mContext.getResources();
62        return resources.getString(R.string.config_timeZoneRulesDataPackage);
63    }
64
65    @Override
66    public int getCheckTimeAllowedMillis() {
67        return mContext.getResources().getInteger(
68                R.integer.config_timeZoneRulesCheckTimeMillisAllowed);
69    }
70
71    @Override
72    public int getFailedCheckRetryCount() {
73        return mContext.getResources().getInteger(R.integer.config_timeZoneRulesCheckRetryCount);
74    }
75
76    @Override
77    public long currentTimestamp() {
78        // Use of elapsedRealtime() because this is in-memory state and elapsedRealtime() shouldn't
79        // change if the system clock changes.
80        return SystemClock.elapsedRealtime();
81    }
82
83    @Override
84    public long getInstalledPackageVersion(String packageName)
85            throws PackageManager.NameNotFoundException {
86        int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
87        PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, flags);
88        return packageInfo.getLongVersionCode();
89    }
90
91    @Override
92    public boolean isPrivilegedApp(String packageName) throws PackageManager.NameNotFoundException {
93        int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
94        PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, flags);
95        return packageInfo.applicationInfo.isPrivilegedApp();
96    }
97
98    @Override
99    public boolean usesPermission(String packageName, String requiredPermissionName)
100            throws PackageManager.NameNotFoundException {
101        int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
102                | PackageManager.GET_PERMISSIONS;
103        PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, flags);
104        if (packageInfo.requestedPermissions == null) {
105            return false;
106        }
107        for (String requestedPermission : packageInfo.requestedPermissions) {
108            if (requiredPermissionName.equals(requestedPermission)) {
109                return true;
110            }
111        }
112        return false;
113    }
114
115    @Override
116    public boolean contentProviderRegistered(String authority, String requiredPackageName) {
117        int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
118        ProviderInfo providerInfo = mPackageManager.resolveContentProviderAsUser(
119                authority, flags, UserHandle.SYSTEM.getIdentifier());
120        if (providerInfo == null) {
121            Slog.i(TAG, "contentProviderRegistered: No content provider registered with authority="
122                    + authority);
123            return false;
124        }
125        boolean packageMatches =
126                requiredPackageName.equals(providerInfo.applicationInfo.packageName);
127        if (!packageMatches) {
128            Slog.i(TAG, "contentProviderRegistered: App with packageName=" + requiredPackageName
129                    + " does not expose the a content provider with authority=" + authority);
130            return false;
131        }
132        return true;
133    }
134
135    @Override
136    public boolean receiverRegistered(Intent intent, String requiredPermissionName)
137            throws PackageManager.NameNotFoundException {
138
139        int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
140        List<ResolveInfo> resolveInfo = mPackageManager.queryBroadcastReceiversAsUser(
141                intent, flags, UserHandle.SYSTEM);
142        if (resolveInfo.size() != 1) {
143            Slog.i(TAG, "receiverRegistered: Zero or multiple broadcast receiver registered for"
144                    + " intent=" + intent + ", found=" + resolveInfo);
145            return false;
146        }
147
148        ResolveInfo matched = resolveInfo.get(0);
149        boolean requiresPermission = requiredPermissionName.equals(matched.activityInfo.permission);
150        if (!requiresPermission) {
151            Slog.i(TAG, "receiverRegistered: Broadcast receiver registered for intent="
152                    + intent + " must require permission " + requiredPermissionName);
153        }
154        return requiresPermission;
155    }
156}
157