Merge "Fix accessibility settings page did not update the preference state" into sc-dev
This commit is contained in:
@@ -111,7 +111,7 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
updateServicePreferences();
|
onContentChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -142,7 +142,8 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final SettingsContentObserver mSettingsContentObserver;
|
@VisibleForTesting
|
||||||
|
final SettingsContentObserver mSettingsContentObserver;
|
||||||
|
|
||||||
private final Map<String, PreferenceCategory> mCategoryToPrefCategoryMap =
|
private final Map<String, PreferenceCategory> mCategoryToPrefCategoryMap =
|
||||||
new ArrayMap<>();
|
new ArrayMap<>();
|
||||||
@@ -151,6 +152,9 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
private final Map<ComponentName, PreferenceCategory> mPreBundledServiceComponentToCategoryMap =
|
private final Map<ComponentName, PreferenceCategory> mPreBundledServiceComponentToCategoryMap =
|
||||||
new ArrayMap<>();
|
new ArrayMap<>();
|
||||||
|
|
||||||
|
private boolean mNeedPreferencesUpdate = false;
|
||||||
|
private boolean mIsForeground = true;
|
||||||
|
|
||||||
public AccessibilitySettings() {
|
public AccessibilitySettings() {
|
||||||
// Observe changes to anything that the shortcut can toggle, so we can reflect updates
|
// Observe changes to anything that the shortcut can toggle, so we can reflect updates
|
||||||
final Collection<AccessibilityShortcutController.ToggleableFrameworkFeatureInfo> features =
|
final Collection<AccessibilityShortcutController.ToggleableFrameworkFeatureInfo> features =
|
||||||
@@ -166,7 +170,7 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
mSettingsContentObserver = new SettingsContentObserver(mHandler, shortcutFeatureKeys) {
|
mSettingsContentObserver = new SettingsContentObserver(mHandler, shortcutFeatureKeys) {
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange, Uri uri) {
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
updateAllPreferences();
|
onContentChanged();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -181,13 +185,6 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
return R.string.help_uri_accessibility;
|
return R.string.help_uri_accessibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle icicle) {
|
|
||||||
super.onCreate(icicle);
|
|
||||||
initializeAllPreferences();
|
|
||||||
updateAllPreferences();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(Context context) {
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
@@ -196,20 +193,35 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onStart();
|
super.onCreate(icicle);
|
||||||
|
initializeAllPreferences();
|
||||||
|
updateAllPreferences();
|
||||||
|
registerContentMonitors();
|
||||||
|
}
|
||||||
|
|
||||||
mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
|
@Override
|
||||||
mSettingsContentObserver.register(getContentResolver());
|
public void onStart() {
|
||||||
|
if (mNeedPreferencesUpdate) {
|
||||||
|
updateAllPreferences();
|
||||||
|
mNeedPreferencesUpdate = false;
|
||||||
|
}
|
||||||
|
mIsForeground = true;
|
||||||
|
super.onStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
mSettingsPackageMonitor.unregister();
|
mIsForeground = false;
|
||||||
mSettingsContentObserver.unregister(getContentResolver());
|
|
||||||
super.onStop();
|
super.onStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
unregisterContentMonitors();
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getPreferenceScreenResId() {
|
protected int getPreferenceScreenResId() {
|
||||||
return R.xml.accessibility_settings;
|
return R.xml.accessibility_settings;
|
||||||
@@ -283,6 +295,17 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
context.getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, 0) == 1;
|
context.getContentResolver(), Settings.Global.APPLY_RAMPING_RINGER, 0) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void onContentChanged() {
|
||||||
|
// If the fragment is visible then update preferences immediately, else set the flag then
|
||||||
|
// wait for the fragment to show up to update preferences.
|
||||||
|
if (mIsForeground) {
|
||||||
|
updateAllPreferences();
|
||||||
|
} else {
|
||||||
|
mNeedPreferencesUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void initializeAllPreferences() {
|
private void initializeAllPreferences() {
|
||||||
for (int i = 0; i < CATEGORIES.length; i++) {
|
for (int i = 0; i < CATEGORIES.length; i++) {
|
||||||
PreferenceCategory prefCategory = findPreference(CATEGORIES[i]);
|
PreferenceCategory prefCategory = findPreference(CATEGORIES[i]);
|
||||||
@@ -290,11 +313,25 @@ public class AccessibilitySettings extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateAllPreferences() {
|
@VisibleForTesting
|
||||||
|
void updateAllPreferences() {
|
||||||
updateSystemPreferences();
|
updateSystemPreferences();
|
||||||
updateServicePreferences();
|
updateServicePreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerContentMonitors() {
|
||||||
|
final Context context = getActivity();
|
||||||
|
|
||||||
|
mSettingsPackageMonitor.register(context, context.getMainLooper(), /* externalStorage= */
|
||||||
|
false);
|
||||||
|
mSettingsContentObserver.register(getContentResolver());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unregisterContentMonitors() {
|
||||||
|
mSettingsPackageMonitor.unregister();
|
||||||
|
mSettingsContentObserver.unregister(getContentResolver());
|
||||||
|
}
|
||||||
|
|
||||||
protected void updateServicePreferences() {
|
protected void updateServicePreferences() {
|
||||||
// Since services category is auto generated we have to do a pass
|
// Since services category is auto generated we have to do a pass
|
||||||
// to generate it since services can come and go and then based on
|
// to generate it since services can come and go and then based on
|
||||||
|
@@ -19,35 +19,55 @@ package com.android.settings.accessibility;
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.ArgumentMatchers.isNull;
|
||||||
|
import static org.mockito.Mockito.atLeast;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.accessibilityservice.AccessibilityShortcutInfo;
|
import android.accessibilityservice.AccessibilityShortcutInfo;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.content.pm.ServiceInfo;
|
import android.content.pm.ServiceInfo;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.internal.content.PackageMonitor;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.testutils.XmlTestUtils;
|
import com.android.settings.testutils.XmlTestUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
|
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowFragment;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowUserManager;
|
||||||
import com.android.settingslib.RestrictedPreference;
|
import com.android.settingslib.RestrictedPreference;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.Spy;
|
||||||
|
import org.mockito.junit.MockitoJUnit;
|
||||||
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.shadow.api.Shadow;
|
import org.robolectric.shadow.api.Shadow;
|
||||||
import org.robolectric.shadows.ShadowAccessibilityManager;
|
import org.robolectric.shadows.ShadowAccessibilityManager;
|
||||||
@@ -55,15 +75,14 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class AccessibilitySettingsTest {
|
public class AccessibilitySettingsTest {
|
||||||
private static final String DUMMY_PACKAGE_NAME = "com.mock.example";
|
private static final String PACKAGE_NAME = "com.android.test";
|
||||||
private static final String DUMMY_CLASS_NAME = DUMMY_PACKAGE_NAME + ".mock_a11y_service";
|
private static final String CLASS_NAME = PACKAGE_NAME + ".test_a11y_service";
|
||||||
private static final ComponentName DUMMY_COMPONENT_NAME = new ComponentName(DUMMY_PACKAGE_NAME,
|
private static final ComponentName COMPONENT_NAME = new ComponentName(PACKAGE_NAME,
|
||||||
DUMMY_CLASS_NAME);
|
CLASS_NAME);
|
||||||
private static final int ON = 1;
|
private static final int ON = 1;
|
||||||
private static final int OFF = 0;
|
private static final int OFF = 0;
|
||||||
private static final String EMPTY_STRING = "";
|
private static final String EMPTY_STRING = "";
|
||||||
@@ -72,24 +91,35 @@ public class AccessibilitySettingsTest {
|
|||||||
private static final String DEFAULT_LABEL = "default label";
|
private static final String DEFAULT_LABEL = "default label";
|
||||||
private static final Boolean SERVICE_ENABLED = true;
|
private static final Boolean SERVICE_ENABLED = true;
|
||||||
private static final Boolean SERVICE_DISABLED = false;
|
private static final Boolean SERVICE_DISABLED = false;
|
||||||
|
@Rule
|
||||||
private Context mContext;
|
public final MockitoRule mocks = MockitoJUnit.rule();
|
||||||
private AccessibilitySettings mSettings;
|
@Spy
|
||||||
private ShadowAccessibilityManager mShadowAccessibilityManager;
|
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||||
private AccessibilityServiceInfo mServiceInfo;
|
@Spy
|
||||||
|
private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo(
|
||||||
|
PACKAGE_NAME, CLASS_NAME);
|
||||||
|
@Spy
|
||||||
|
private final AccessibilitySettings mFragment = new AccessibilitySettings();
|
||||||
@Mock
|
@Mock
|
||||||
private AccessibilityShortcutInfo mShortcutInfo;
|
private AccessibilityShortcutInfo mShortcutInfo;
|
||||||
|
@Mock
|
||||||
|
private FragmentActivity mActivity;
|
||||||
|
@Mock
|
||||||
|
private ContentResolver mContentResolver;
|
||||||
|
@Mock
|
||||||
|
private PreferenceManager mPreferenceManager;
|
||||||
|
private ShadowAccessibilityManager mShadowAccessibilityManager;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
|
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
|
||||||
mSettings = spy(new AccessibilitySettings());
|
|
||||||
mServiceInfo = spy(getMockAccessibilityServiceInfo());
|
|
||||||
mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
|
mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
|
||||||
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
|
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
|
||||||
doReturn(mContext).when(mSettings).getContext();
|
when(mFragment.getContext()).thenReturn(mContext);
|
||||||
|
when(mFragment.getActivity()).thenReturn(mActivity);
|
||||||
|
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
|
||||||
|
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
|
||||||
|
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
|
||||||
|
mContext.setTheme(R.style.Theme_AppCompat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -216,11 +246,11 @@ public class AccessibilitySettingsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createAccessibilityServicePreferenceList_hasOneInfo_containsSameKey() {
|
public void createAccessibilityServicePreferenceList_hasOneInfo_containsSameKey() {
|
||||||
final String key = DUMMY_COMPONENT_NAME.flattenToString();
|
final String key = COMPONENT_NAME.flattenToString();
|
||||||
final AccessibilitySettings.RestrictedPreferenceHelper helper =
|
final AccessibilitySettings.RestrictedPreferenceHelper helper =
|
||||||
new AccessibilitySettings.RestrictedPreferenceHelper(mContext);
|
new AccessibilitySettings.RestrictedPreferenceHelper(mContext);
|
||||||
final List<AccessibilityServiceInfo> infoList = new ArrayList<>(
|
final List<AccessibilityServiceInfo> infoList = new ArrayList<>(
|
||||||
Collections.singletonList(mServiceInfo));
|
singletonList(mServiceInfo));
|
||||||
|
|
||||||
final List<RestrictedPreference> preferenceList =
|
final List<RestrictedPreference> preferenceList =
|
||||||
helper.createAccessibilityServicePreferenceList(infoList);
|
helper.createAccessibilityServicePreferenceList(infoList);
|
||||||
@@ -231,12 +261,12 @@ public class AccessibilitySettingsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createAccessibilityActivityPreferenceList_hasOneInfo_containsSameKey() {
|
public void createAccessibilityActivityPreferenceList_hasOneInfo_containsSameKey() {
|
||||||
final String key = DUMMY_COMPONENT_NAME.flattenToString();
|
final String key = COMPONENT_NAME.flattenToString();
|
||||||
final AccessibilitySettings.RestrictedPreferenceHelper helper =
|
final AccessibilitySettings.RestrictedPreferenceHelper helper =
|
||||||
new AccessibilitySettings.RestrictedPreferenceHelper(mContext);
|
new AccessibilitySettings.RestrictedPreferenceHelper(mContext);
|
||||||
setMockAccessibilityShortcutInfo(mShortcutInfo);
|
setMockAccessibilityShortcutInfo(mShortcutInfo);
|
||||||
final List<AccessibilityShortcutInfo> infoList = new ArrayList<>(
|
final List<AccessibilityShortcutInfo> infoList = new ArrayList<>(
|
||||||
Collections.singletonList(mShortcutInfo));
|
singletonList(mShortcutInfo));
|
||||||
|
|
||||||
final List<RestrictedPreference> preferenceList =
|
final List<RestrictedPreference> preferenceList =
|
||||||
helper.createAccessibilityActivityPreferenceList(infoList);
|
helper.createAccessibilityActivityPreferenceList(infoList);
|
||||||
@@ -245,21 +275,94 @@ public class AccessibilitySettingsTest {
|
|||||||
assertThat(preference.getKey()).isEqualTo(key);
|
assertThat(preference.getKey()).isEqualTo(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
|
@Test
|
||||||
|
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
|
||||||
|
public void onCreate_haveRegisterToSpecificUrisAndActions() {
|
||||||
|
final ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class);
|
||||||
|
final IntentFilter intentFilter;
|
||||||
|
mFragment.onAttach(mContext);
|
||||||
|
|
||||||
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
|
verify(mContentResolver).registerContentObserver(
|
||||||
|
eq(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)),
|
||||||
|
anyBoolean(),
|
||||||
|
any(SettingsContentObserver.class));
|
||||||
|
verify(mContentResolver).registerContentObserver(eq(Settings.Secure.getUriFor(
|
||||||
|
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)), anyBoolean(),
|
||||||
|
any(SettingsContentObserver.class));
|
||||||
|
verify(mActivity, atLeast(1)).registerReceiver(any(PackageMonitor.class), captor.capture(),
|
||||||
|
isNull(), any());
|
||||||
|
intentFilter = captor.getAllValues().get(/* first time */ 0);
|
||||||
|
assertThat(intentFilter.hasAction(Intent.ACTION_PACKAGE_ADDED)).isTrue();
|
||||||
|
assertThat(intentFilter.hasAction(Intent.ACTION_PACKAGE_REMOVED)).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
|
||||||
|
public void onDestroy_unregisterObserverAndReceiver() {
|
||||||
|
setupFragment();
|
||||||
|
mFragment.onPause();
|
||||||
|
mFragment.onStop();
|
||||||
|
|
||||||
|
mFragment.onDestroy();
|
||||||
|
|
||||||
|
verify(mContentResolver).unregisterContentObserver(any(SettingsContentObserver.class));
|
||||||
|
verify(mActivity).unregisterReceiver(any(PackageMonitor.class));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
|
||||||
|
public void onContentChanged_updatePreferenceInForeground_preferenceUpdated() {
|
||||||
|
setupFragment();
|
||||||
|
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
|
||||||
|
singletonList(mServiceInfo));
|
||||||
|
|
||||||
|
mFragment.onContentChanged();
|
||||||
|
|
||||||
|
RestrictedPreference preference = mFragment.getPreferenceScreen().findPreference(
|
||||||
|
COMPONENT_NAME.flattenToString());
|
||||||
|
|
||||||
|
assertThat(preference).isNotNull();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
|
||||||
|
public void onContentChanged_updatePreferenceInBackground_preferenceUpdated() {
|
||||||
|
setupFragment();
|
||||||
|
mFragment.onPause();
|
||||||
|
mFragment.onStop();
|
||||||
|
|
||||||
|
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
|
||||||
|
singletonList(mServiceInfo));
|
||||||
|
|
||||||
|
mFragment.onContentChanged();
|
||||||
|
mFragment.onStart();
|
||||||
|
|
||||||
|
RestrictedPreference preference = mFragment.getPreferenceScreen().findPreference(
|
||||||
|
COMPONENT_NAME.flattenToString());
|
||||||
|
|
||||||
|
assertThat(preference).isNotNull();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private AccessibilityServiceInfo getMockAccessibilityServiceInfo(String packageName,
|
||||||
|
String className) {
|
||||||
final ApplicationInfo applicationInfo = new ApplicationInfo();
|
final ApplicationInfo applicationInfo = new ApplicationInfo();
|
||||||
final ServiceInfo serviceInfo = new ServiceInfo();
|
final ServiceInfo serviceInfo = new ServiceInfo();
|
||||||
applicationInfo.packageName = DUMMY_PACKAGE_NAME;
|
applicationInfo.packageName = packageName;
|
||||||
serviceInfo.packageName = DUMMY_PACKAGE_NAME;
|
serviceInfo.packageName = packageName;
|
||||||
serviceInfo.name = DUMMY_CLASS_NAME;
|
serviceInfo.name = className;
|
||||||
serviceInfo.applicationInfo = applicationInfo;
|
serviceInfo.applicationInfo = applicationInfo;
|
||||||
|
|
||||||
final ResolveInfo resolveInfo = new ResolveInfo();
|
final ResolveInfo resolveInfo = new ResolveInfo();
|
||||||
resolveInfo.serviceInfo = serviceInfo;
|
resolveInfo.serviceInfo = serviceInfo;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
|
final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
|
||||||
mContext);
|
mContext);
|
||||||
info.setComponentName(DUMMY_COMPONENT_NAME);
|
info.setComponentName(new ComponentName(PACKAGE_NAME, CLASS_NAME));
|
||||||
return info;
|
return info;
|
||||||
} catch (XmlPullParserException | IOException e) {
|
} catch (XmlPullParserException | IOException e) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
@@ -274,11 +377,18 @@ public class AccessibilitySettingsTest {
|
|||||||
when(activityInfo.loadLabel(any())).thenReturn(DEFAULT_LABEL);
|
when(activityInfo.loadLabel(any())).thenReturn(DEFAULT_LABEL);
|
||||||
when(mockInfo.loadSummary(any())).thenReturn(DEFAULT_SUMMARY);
|
when(mockInfo.loadSummary(any())).thenReturn(DEFAULT_SUMMARY);
|
||||||
when(mockInfo.loadDescription(any())).thenReturn(DEFAULT_DESCRIPTION);
|
when(mockInfo.loadDescription(any())).thenReturn(DEFAULT_DESCRIPTION);
|
||||||
when(mockInfo.getComponentName()).thenReturn(DUMMY_COMPONENT_NAME);
|
when(mockInfo.getComponentName()).thenReturn(COMPONENT_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setInvisibleToggleFragmentType(AccessibilityServiceInfo info) {
|
private void setInvisibleToggleFragmentType(AccessibilityServiceInfo info) {
|
||||||
info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
|
info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
|
||||||
info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
|
info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupFragment() {
|
||||||
|
mFragment.onAttach(mContext);
|
||||||
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
mFragment.onStart();
|
||||||
|
mFragment.onResume();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user