From 1d3df216992c441fcb8fc7731d7eb9d079a4c37c Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Wed, 6 Feb 2019 15:14:35 -0800 Subject: [PATCH] Add accessibility usage preference to the Privacy screen. Bug: 123595964 Test: Open Privacy page with one and two accessibility services enabled and click the preference. Test: Open Privacy page with zero accessibility services enabled and do not see the preference. Test: atest AccessibilityUsagePreferenceControllerTest Change-Id: Ib1dab374cb53dfbc473b2d5ac49115e608a13ab8 --- res/values/strings.xml | 9 +++ res/xml/privacy_dashboard_settings.xml | 11 ++- ...ccessibilityUsagePreferenceController.java | 55 +++++++++++++ ...sibilityUsagePreferenceControllerTest.java | 77 +++++++++++++++++++ 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/privacy/AccessibilityUsagePreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index c891432025d..498732c76cb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10624,6 +10624,15 @@ See all usage + + Accessibility usage + + + + 1 service has full access to your device + %1$d services have full access to your device + + Manage %1$s Notifications diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 44ac10a3204..eaca1613684 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -20,13 +20,22 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="privacy_dashboard_page" android:title="@string/privacy_dashboard_title" - settings:initialExpandedChildrenCount="3"> + settings:initialExpandedChildrenCount="4"> + + + + + mEnabledServiceInfos; + + public AccessibilityUsagePreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + + final AccessibilityManager accessibilityManager = context.getSystemService( + AccessibilityManager.class); + mEnabledServiceInfos = accessibilityManager.getEnabledAccessibilityServiceList( + AccessibilityServiceInfo.FEEDBACK_ALL_MASK); + } + + @Override + public int getAvailabilityStatus() { + return mEnabledServiceInfos.isEmpty() ? UNSUPPORTED_ON_DEVICE : AVAILABLE; + } + + @Override + public CharSequence getSummary() { + return mContext.getResources().getQuantityString(R.plurals.accessibility_usage_summary, + mEnabledServiceInfos.size(), mEnabledServiceInfos.size()); + } +} diff --git a/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java new file mode 100644 index 00000000000..103344633c5 --- /dev/null +++ b/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2019 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.settings.privacy; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.Context; +import android.view.accessibility.AccessibilityManager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowAccessibilityManager; + +import java.util.ArrayList; +import java.util.Arrays; + +@RunWith(RobolectricTestRunner.class) +public class AccessibilityUsagePreferenceControllerTest { + + private Context mContext; + private ShadowAccessibilityManager mAccessibilityManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mAccessibilityManager = Shadow.extract( + RuntimeEnvironment.application.getSystemService(AccessibilityManager.class)); + } + + @After + public void tearDown() { + ShadowAccessibilityManager.reset(); + } + + @Test + public void getAvailabilityStatus_noEnabledServices_shouldReturnUnsupported() { + mAccessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>()); + AccessibilityUsagePreferenceController controller = + new AccessibilityUsagePreferenceController(mContext, "test_key"); + + assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_enabledServices_shouldReturnAvailableUnsearchable() { + mAccessibilityManager.setEnabledAccessibilityServiceList( + new ArrayList<>(Arrays.asList(new AccessibilityServiceInfo()))); + AccessibilityUsagePreferenceController controller = + new AccessibilityUsagePreferenceController(mContext, "test_key"); + + assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } +}