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