1 /* 2 * Copyright (C) 2022 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.settingslib.wifi; 18 19 import static android.Manifest.permission.ACCESS_FINE_LOCATION; 20 import static android.Manifest.permission.ACCESS_WIFI_STATE; 21 import static android.content.pm.PackageManager.PERMISSION_GRANTED; 22 23 import android.app.Activity; 24 import android.app.ActivityManager; 25 import android.app.IActivityManager; 26 import android.content.pm.PackageManager; 27 import android.os.RemoteException; 28 import android.text.TextUtils; 29 import android.util.Log; 30 31 /** 32 * Helper class to check Wi-Fi permissions. 33 */ 34 public class WifiPermissionChecker { 35 36 private static final String TAG = "WifiPermChecker"; 37 38 private IActivityManager mActivityManager; 39 private PackageManager mPackageManager; 40 private String mLaunchedPackage; 41 WifiPermissionChecker(Activity activity)42 public WifiPermissionChecker(Activity activity) { 43 this(activity, ActivityManager.getService()); 44 } 45 WifiPermissionChecker(Activity activity, IActivityManager activityManager)46 public WifiPermissionChecker(Activity activity, IActivityManager activityManager) { 47 mActivityManager = activityManager; 48 mPackageManager = activity.getPackageManager(); 49 mLaunchedPackage = getLaunchedFromPackage(activity); 50 } 51 52 /** 53 * Returns the launched package name 54 */ getLaunchedPackage()55 public String getLaunchedPackage() { 56 return mLaunchedPackage; 57 } 58 59 /** 60 * Returns whether the launched package can access Wi-Fi information 61 */ canAccessWifiState()62 public boolean canAccessWifiState() { 63 return checkPermission(ACCESS_WIFI_STATE); 64 } 65 66 /** 67 * Returns whether the launched package can access precise location 68 */ canAccessFineLocation()69 public boolean canAccessFineLocation() { 70 return checkPermission(ACCESS_FINE_LOCATION); 71 } 72 checkPermission(String permission)73 private boolean checkPermission(String permission) { 74 if (mPackageManager == null || TextUtils.isEmpty(mLaunchedPackage)) { 75 Log.e(TAG, "Failed to check package permission!" 76 + " {PackageManager:" + mPackageManager 77 + ", LaunchedPackage:" + mLaunchedPackage + "}"); 78 return false; 79 } 80 81 if (mPackageManager.checkPermission(permission, mLaunchedPackage) == PERMISSION_GRANTED) { 82 return true; 83 } 84 85 Log.w(TAG, "The launched package does not have the required permission!" 86 + " {LaunchedPackage:" + mLaunchedPackage + ", Permission:" + permission + "}"); 87 return false; 88 } 89 getLaunchedFromPackage(Activity activity)90 private String getLaunchedFromPackage(Activity activity) { 91 try { 92 return mActivityManager.getLaunchedFromPackage(activity.getActivityToken()); 93 } catch (RemoteException e) { 94 Log.e(TAG, "Can not get the launched package from activity manager!"); 95 return null; 96 } 97 } 98 } 99