From d6084baa899d1e8057f3112d11739214b14d0b2b Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Mon, 24 Jul 2017 17:43:23 -0700 Subject: [PATCH] Add shadow and wrapper classes These classes are used for accessibility service. Also add a new Availablity type. Bug: 62022517 Test: Build Change-Id: Ia2ff72dd04fd99b17809822907746c2411cecb62 Merged-In: Ia2ff72dd04fd99b17809822907746c2411cecb62 --- .../AccessibilityServiceInfoWrapper.java | 37 ++++++++++++++++ .../AccessibilityServiceInfoWrapperImpl.java | 39 ++++++++++++++++ .../settings/search/ResultPayload.java | 17 ++++--- .../shadow/ShadowAccessibilityManager.java | 44 +++++++++++++++++++ ...owAccessibilityServiceInfoWrapperImpl.java | 37 ++++++++++++++++ .../shadow/ShadowSecureSettings.java | 7 +++ 6 files changed, 176 insertions(+), 5 deletions(-) create mode 100644 src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java create mode 100644 src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java create mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java create mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java diff --git a/src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java b/src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java new file mode 100644 index 00000000000..6ce0a4a9bcd --- /dev/null +++ b/src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 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.applications; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.ComponentName; + +/** + * This interface replicates a subset of the + * {@link android.accessibilityservice.AccessibilityServiceInfo}. The interface + * exists so that we can use a thin wrapper around it in production code and a mock in tests. + * We cannot directly mock or shadow it, because some of the methods we rely on are newer than + * the API version supported by Robolectric. + */ +public interface AccessibilityServiceInfoWrapper { + + /** + * Returns the real {@code AccessibilityServiceInfo} object. + */ + AccessibilityServiceInfo getAccessibilityServiceInfo(); + + ComponentName getComponentName(); +} diff --git a/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java b/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java new file mode 100644 index 00000000000..d0d99ea6533 --- /dev/null +++ b/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2017 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.applications; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.ComponentName; + +public class AccessibilityServiceInfoWrapperImpl implements AccessibilityServiceInfoWrapper { + + private final AccessibilityServiceInfo mServiceInfo; + + public AccessibilityServiceInfoWrapperImpl(AccessibilityServiceInfo serviceInfo) { + mServiceInfo = serviceInfo; + } + + @Override + public AccessibilityServiceInfo getAccessibilityServiceInfo() { + return mServiceInfo; + } + + @Override + public ComponentName getComponentName() { + return mServiceInfo.getComponentName(); + } +} diff --git a/src/com/android/settings/search/ResultPayload.java b/src/com/android/settings/search/ResultPayload.java index e6b072b063d..0d8c0ec0d67 100644 --- a/src/com/android/settings/search/ResultPayload.java +++ b/src/com/android/settings/search/ResultPayload.java @@ -66,10 +66,11 @@ public class ResultPayload implements Parcelable { * Enumerates the possible values for the Availability of a setting. */ @IntDef({Availability.AVAILABLE, - Availability.DISABLED_DEPENDENCY, + Availability.DISABLED_DEPENDENT_SETTING, + Availability.DISABLED_DEPENDENT_APP, Availability.DISABLED_UNSUPPORTED, Availability.RESOURCE_CONTENTION, - Availability.INTENT_ONLY,}) + Availability.INTENT_ONLY}) @Retention(RetentionPolicy.SOURCE) public @interface Availability { /** @@ -78,9 +79,10 @@ public class ResultPayload implements Parcelable { int AVAILABLE = 0; /** - * The setting has a dependency which is currently disabled, blocking access. + * The setting has a dependency in settings app which is currently disabled, blocking + * access. */ - int DISABLED_DEPENDENCY = 1; + int DISABLED_DEPENDENT_SETTING = 1; /** * The setting is not supported by the device. @@ -93,10 +95,15 @@ public class ResultPayload implements Parcelable { */ int RESOURCE_CONTENTION = 3; + /** + * The setting is disabled because corresponding app is disabled + */ + int DISABLED_DEPENDENT_APP = 4; + /** * This setting is supported on the device but cannot be changed inline. */ - int INTENT_ONLY = 4; + int INTENT_ONLY = 5; } @IntDef({SettingsSource.UNKNOWN, SettingsSource.SYSTEM, SettingsSource.SECURE, diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java new file mode 100644 index 00000000000..7e21f1238df --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2017 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.testutils.shadow; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.ComponentName; +import android.view.accessibility.AccessibilityManager; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +import java.util.ArrayList; +import java.util.List; + +@Implements(AccessibilityManager.class) +public class ShadowAccessibilityManager { + private static final List mInstalledAccessibilityList = + new ArrayList<>(); + + public static void addAccessibilityService(String serviceName) { + AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo(); + serviceInfo.setComponentName(ComponentName.unflattenFromString(serviceName)); + mInstalledAccessibilityList.add(serviceInfo); + } + + @Implementation + public List getInstalledAccessibilityServiceList() { + return mInstalledAccessibilityList; + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java new file mode 100644 index 00000000000..a6cb5d07bd6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 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.testutils.shadow; + +import android.content.ComponentName; + +import com.android.settings.applications.AccessibilityServiceInfoWrapperImpl; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +@Implements(AccessibilityServiceInfoWrapperImpl.class) +public class ShadowAccessibilityServiceInfoWrapperImpl { + private static ComponentName sComponentName; + + public static void setComponentName(String componentName) { + sComponentName = ComponentName.unflattenFromString(componentName);; + } + + @Implementation + public ComponentName getComponentName() { + return sComponentName; + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java index 64e188eccfd..f8155927242 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java @@ -42,6 +42,13 @@ public class ShadowSecureSettings { return true; } + @Implementation + public static boolean putStringForUser(ContentResolver resolver, String name, String value, + int userHandle) { + mValueMap.put(name, value); + return true; + } + @Implementation public static String getString(ContentResolver resolver, String name) { return (String) mValueMap.get(name);