blob: b89dd3838ae93b04e0125cef78528565981e24f7 [file] [log] [blame]
Neil Fuller328532a2017-03-16 18:32:21 +00001/*
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;
Neil Fuller1281f392017-09-22 15:32:06 +010029import android.os.UserHandle;
Neil Fuller328532a2017-03-16 18:32:21 +000030import 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 int 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.versionCode;
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;
Neil Fuller1281f392017-09-22 15:32:06 +0100118 ProviderInfo providerInfo = mPackageManager.resolveContentProviderAsUser(
119 authority, flags, UserHandle.SYSTEM.getIdentifier());
Neil Fuller328532a2017-03-16 18:32:21 +0000120 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;
Neil Fuller1281f392017-09-22 15:32:06 +0100140 List<ResolveInfo> resolveInfo = mPackageManager.queryBroadcastReceiversAsUser(
141 intent, flags, UserHandle.SYSTEM);
Neil Fuller328532a2017-03-16 18:32:21 +0000142 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}