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