summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Weng Su <wengsu@google.com> 2022-04-27 10:26:34 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-04-27 10:26:34 +0000
commit51ef29cc0617ffe80e656d41e8c23388a7ab8c6d (patch)
tree3c3b4a3029348b7dce72683f984147be25717d98
parent36d41f502bc763ffa1e3d949ff9518015a8664de (diff)
parent5a9fee924dce75e13b8c1a4650c7fa4a3f0a4c02 (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>
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiPermissionChecker.java98
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiPermissionCheckerTest.java111
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
+ }
+ }
+}