Home | History | Annotate | Download | only in timezone
      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