diff options
| author | 2022-04-27 10:26:34 +0000 | |
|---|---|---|
| committer | 2022-04-27 10:26:34 +0000 | |
| commit | 51ef29cc0617ffe80e656d41e8c23388a7ab8c6d (patch) | |
| tree | 3c3b4a3029348b7dce72683f984147be25717d98 | |
| parent | 36d41f502bc763ffa1e3d949ff9518015a8664de (diff) | |
| parent | 5a9fee924dce75e13b8c1a4650c7fa4a3f0a4c02 (diff) | |
Merge "Create WifiPermissionChecker in SettingsLib" into tm-dev am: 5a9fee924d
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17947042
Change-Id: I6f2da9931461909fcf6482e62df125067087fb25
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
2 files changed, 209 insertions, 0 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiPermissionChecker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiPermissionChecker.java new file mode 100644 index 000000000000..2fe6e4695b3c --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiPermissionChecker.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.wifi; + +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.ACCESS_WIFI_STATE; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.IActivityManager; +import android.content.pm.PackageManager; +import android.os.RemoteException; +import android.text.TextUtils; +import android.util.Log; + +/** + * Helper class to check Wi-Fi permissions. + */ +public class WifiPermissionChecker { + + private static final String TAG = "WifiPermChecker"; + + private IActivityManager mActivityManager; + private PackageManager mPackageManager; + private String mLaunchedPackage; + + public WifiPermissionChecker(Activity activity) { + this(activity, ActivityManager.getService()); + } + + public WifiPermissionChecker(Activity activity, IActivityManager activityManager) { + mActivityManager = activityManager; + mPackageManager = activity.getPackageManager(); + mLaunchedPackage = getLaunchedFromPackage(activity); + } + + /** + * Returns the launched package name + */ + public String getLaunchedPackage() { + return mLaunchedPackage; + } + + /** + * Returns whether the launched package can access Wi-Fi information + */ + public boolean canAccessWifiState() { + return checkPermission(ACCESS_WIFI_STATE); + } + + /** + * Returns whether the launched package can access precise location + */ + public boolean canAccessFineLocation() { + return checkPermission(ACCESS_FINE_LOCATION); + } + + private boolean checkPermission(String permission) { + if (mPackageManager == null || TextUtils.isEmpty(mLaunchedPackage)) { + Log.e(TAG, "Failed to check package permission!" + + " {PackageManager:" + mPackageManager + + ", LaunchedPackage:" + mLaunchedPackage + "}"); + return false; + } + + if (mPackageManager.checkPermission(permission, mLaunchedPackage) == PERMISSION_GRANTED) { + return true; + } + + Log.w(TAG, "The launched package does not have the required permission!" + + " {LaunchedPackage:" + mLaunchedPackage + ", Permission:" + permission + "}"); + return false; + } + + private String getLaunchedFromPackage(Activity activity) { + try { + return mActivityManager.getLaunchedFromPackage(activity.getActivityToken()); + } catch (RemoteException e) { + Log.e(TAG, "Can not get the launched package from activity manager!"); + return null; + } + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiPermissionCheckerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiPermissionCheckerTest.java new file mode 100644 index 000000000000..ec84141360e4 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiPermissionCheckerTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.wifi; + +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.ACCESS_WIFI_STATE; +import static android.content.pm.PackageManager.PERMISSION_DENIED; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.app.IActivityManager; +import android.content.pm.PackageManager; +import android.os.RemoteException; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class WifiPermissionCheckerTest { + + static final String LAUNCHED_PACKAGE = "TestPackage"; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock + PackageManager mPackageManager; + @Mock + IActivityManager mActivityManager; + @Mock + Activity mActivity; + + WifiPermissionChecker mWifiPermissionChecker; + + @Before + public void setUp() { + when(mActivity.getPackageManager()).thenReturn(mPackageManager); + fakeGetLaunchedFromPackage(LAUNCHED_PACKAGE); + + mWifiPermissionChecker = new WifiPermissionChecker(mActivity, mActivityManager); + } + + @Test + public void getLaunchedPackage_returnLaunchedFromPackage() { + assertThat(mWifiPermissionChecker.getLaunchedPackage()).isEqualTo(LAUNCHED_PACKAGE); + } + + @Test + public void canAccessWifiState_noPermission_returnFalse() { + when(mPackageManager.checkPermission(ACCESS_WIFI_STATE, LAUNCHED_PACKAGE)) + .thenReturn(PERMISSION_DENIED); + + assertThat(mWifiPermissionChecker.canAccessWifiState()).isFalse(); + } + + @Test + public void canAccessWifiState_hasPermission_returnTrue() { + when(mPackageManager.checkPermission(ACCESS_WIFI_STATE, LAUNCHED_PACKAGE)) + .thenReturn(PERMISSION_GRANTED); + + assertThat(mWifiPermissionChecker.canAccessWifiState()).isTrue(); + } + + @Test + public void canAccessFineLocation_noPermission_returnFalse() { + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, LAUNCHED_PACKAGE)) + .thenReturn(PERMISSION_DENIED); + + assertThat(mWifiPermissionChecker.canAccessFineLocation()).isFalse(); + } + + @Test + public void canAccessFineLocation_hasPermission_returnTrue() { + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, LAUNCHED_PACKAGE)) + .thenReturn(PERMISSION_GRANTED); + + assertThat(mWifiPermissionChecker.canAccessFineLocation()).isTrue(); + } + + void fakeGetLaunchedFromPackage(String packageName) { + try { + when(mActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName); + } catch (RemoteException e) { + // Do nothing + } + } +} |