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