Merge "Provide a way to Magnification settings via intent"
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.settings.accessibility;
|
package com.android.settings.accessibility;
|
||||||
|
|
||||||
|
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
@@ -30,6 +32,9 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
@@ -37,6 +42,7 @@ import com.android.settings.core.SubSettingLauncher;
|
|||||||
import com.android.settingslib.accessibility.AccessibilityUtils;
|
import com.android.settingslib.accessibility.AccessibilityUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment {
|
public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment {
|
||||||
@@ -61,44 +67,77 @@ public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// In case the A11yServiceInfo doesn't exist, go to ally services list.
|
|
||||||
final ComponentName componentName = ComponentName.unflattenFromString(extraComponentName);
|
final ComponentName componentName = ComponentName.unflattenFromString(extraComponentName);
|
||||||
|
if (openSystemAccessibilitySettingsAndFinish(componentName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (openAccessibilityDetailsSettingsAndFinish(componentName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Fall back to open accessibility services list.
|
||||||
|
openAccessibilitySettingsAndFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean openSystemAccessibilitySettingsAndFinish(
|
||||||
|
@Nullable ComponentName componentName) {
|
||||||
|
final LaunchFragmentArguments launchArguments =
|
||||||
|
getSystemAccessibilitySettingsLaunchArguments(componentName);
|
||||||
|
if (launchArguments == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
openSubSettings(launchArguments.mDestination, launchArguments.mArguments);
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private LaunchFragmentArguments getSystemAccessibilitySettingsLaunchArguments(
|
||||||
|
@Nullable ComponentName componentName) {
|
||||||
|
if (MAGNIFICATION_COMPONENT_NAME.equals(componentName)) {
|
||||||
|
final String destination = ToggleScreenMagnificationPreferenceFragment.class.getName();
|
||||||
|
final Bundle arguments = new Bundle();
|
||||||
|
MagnificationGesturesPreferenceController.populateMagnificationGesturesPreferenceExtras(
|
||||||
|
arguments, getContext());
|
||||||
|
return new LaunchFragmentArguments(destination, arguments);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void openAccessibilitySettingsAndFinish() {
|
||||||
|
openSubSettings(AccessibilitySettings.class.getName(), /* arguments= */ null);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean openAccessibilityDetailsSettingsAndFinish(
|
||||||
|
@Nullable ComponentName componentName) {
|
||||||
|
// In case the A11yServiceInfo doesn't exist, go to ally services list.
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo(componentName);
|
final AccessibilityServiceInfo info = getAccessibilityServiceInfo(componentName);
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
Log.w(TAG, "Open accessibility services list due to invalid component name.");
|
Log.w(TAG, "openAccessibilityDetailsSettingsAndFinish : invalid component name.");
|
||||||
openAccessibilitySettingsAndFinish();
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// In case this accessibility service isn't permitted, go to a11y services list.
|
// In case this accessibility service isn't permitted, go to a11y services list.
|
||||||
if (!isServiceAllowed(componentName.getPackageName())) {
|
if (!isServiceAllowed(componentName.getPackageName())) {
|
||||||
Log.w(TAG,
|
Log.w(TAG,
|
||||||
"Open accessibility services list due to target accessibility service is "
|
"openAccessibilityDetailsSettingsAndFinish: target accessibility service is"
|
||||||
+ "prohibited by Device Admin.");
|
+ "prohibited by Device Admin.");
|
||||||
openAccessibilitySettingsAndFinish();
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
openSubSettings(ToggleAccessibilityServicePreferenceFragment.class.getName(),
|
||||||
openAccessibilityDetailsSettingsAndFinish(buildArguments(info));
|
buildArguments(info));
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
void openAccessibilitySettingsAndFinish() {
|
|
||||||
new SubSettingLauncher(getActivity())
|
|
||||||
.setDestination(AccessibilitySettings.class.getName())
|
|
||||||
.setSourceMetricsCategory(getMetricsCategory())
|
|
||||||
.launch();
|
|
||||||
finish();
|
finish();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
private void openSubSettings(@NonNull String destination, @Nullable Bundle arguments) {
|
||||||
void openAccessibilityDetailsSettingsAndFinish(Bundle arguments) {
|
|
||||||
new SubSettingLauncher(getActivity())
|
new SubSettingLauncher(getActivity())
|
||||||
.setDestination(ToggleAccessibilityServicePreferenceFragment.class.getName())
|
.setDestination(destination)
|
||||||
.setSourceMetricsCategory(getMetricsCategory())
|
.setSourceMetricsCategory(getMetricsCategory())
|
||||||
.setArguments(arguments)
|
.setArguments(arguments)
|
||||||
.launch();
|
.launch();
|
||||||
finish();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -175,4 +214,13 @@ public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment {
|
|||||||
}
|
}
|
||||||
activity.finish();
|
activity.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class LaunchFragmentArguments {
|
||||||
|
final String mDestination;
|
||||||
|
final Bundle mArguments;
|
||||||
|
LaunchFragmentArguments(@NonNull String destination, @Nullable Bundle arguments) {
|
||||||
|
mDestination = Objects.requireNonNull(destination);
|
||||||
|
mArguments = arguments;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
package com.android.settings.accessibility;
|
package com.android.settings.accessibility;
|
||||||
|
|
||||||
|
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
@@ -33,11 +37,14 @@ import android.view.accessibility.AccessibilityManager;
|
|||||||
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.testutils.shadow.ShadowFragment;
|
import com.android.settings.testutils.shadow.ShadowFragment;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
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.Captor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
@@ -61,6 +68,8 @@ public class AccessibilityDetailsSettingsFragmentTest {
|
|||||||
private Context mContext;
|
private Context mContext;
|
||||||
private AccessibilityDetailsSettingsFragment mFragment;
|
private AccessibilityDetailsSettingsFragment mFragment;
|
||||||
private ShadowAccessibilityManager mShadowAccessibilityManager;
|
private ShadowAccessibilityManager mShadowAccessibilityManager;
|
||||||
|
@Captor
|
||||||
|
private ArgumentCaptor<Intent> mIntentArgumentCaptor;
|
||||||
@Mock private FragmentActivity mActivity;
|
@Mock private FragmentActivity mActivity;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -76,39 +85,43 @@ public class AccessibilityDetailsSettingsFragmentTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onCreate_hasValidExtraComponentName_shouldOpenAccessibilityDetailsSettings() {
|
public void onCreate_hasValidExtraComponentName_launchExpectedFragmentAndFinish() {
|
||||||
final Intent intent = new Intent();
|
final Intent intent = new Intent();
|
||||||
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, COMPONENT_NAME);
|
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, COMPONENT_NAME);
|
||||||
doReturn(intent).when(mActivity).getIntent();
|
doReturn(intent).when(mActivity).getIntent();
|
||||||
|
|
||||||
mFragment.onCreate(Bundle.EMPTY);
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
verify(mFragment).openAccessibilityDetailsSettingsAndFinish(any());
|
assertStartActivityWithExpectedFragment(mActivity,
|
||||||
|
ToggleAccessibilityServicePreferenceFragment.class.getName());
|
||||||
|
verify(mActivity).finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onCreate_hasInvalidExtraComponentName_shouldOpenAccessibilityServicesList() {
|
public void onCreate_hasInvalidExtraComponentName_launchAccessibilitySettingsAndFinish() {
|
||||||
final Intent intent = new Intent();
|
final Intent intent = new Intent();
|
||||||
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, PACKAGE_NAME + "/.service");
|
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, PACKAGE_NAME + "/.service");
|
||||||
doReturn(intent).when(mActivity).getIntent();
|
doReturn(intent).when(mActivity).getIntent();
|
||||||
|
|
||||||
mFragment.onCreate(Bundle.EMPTY);
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
verify(mFragment).openAccessibilitySettingsAndFinish();
|
assertStartActivityWithExpectedFragment(mActivity, AccessibilitySettings.class.getName());
|
||||||
|
verify(mActivity).finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onCreate_hasNoExtraComponentName_shouldOpenAccessibilityServicesList() {
|
public void onCreate_hasNoExtraComponentName_launchAccessibilitySettingsAndFinish() {
|
||||||
final Intent intent = new Intent();
|
final Intent intent = new Intent();
|
||||||
doReturn(intent).when(mActivity).getIntent();
|
doReturn(intent).when(mActivity).getIntent();
|
||||||
|
|
||||||
mFragment.onCreate(Bundle.EMPTY);
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
verify(mFragment).openAccessibilitySettingsAndFinish();
|
assertStartActivityWithExpectedFragment(mActivity, AccessibilitySettings.class.getName());
|
||||||
|
verify(mActivity).finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onCreate_extraComponentNameIsDisallowed_shouldOpenAccessibilityServicesList() {
|
public void onCreate_extraComponentNameIsDisallowed_launchAccessibilitySettingsAndFinish() {
|
||||||
final Intent intent = new Intent();
|
final Intent intent = new Intent();
|
||||||
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, COMPONENT_NAME);
|
intent.putExtra(Intent.EXTRA_COMPONENT_NAME, COMPONENT_NAME);
|
||||||
doReturn(intent).when(mActivity).getIntent();
|
doReturn(intent).when(mActivity).getIntent();
|
||||||
@@ -116,7 +129,23 @@ public class AccessibilityDetailsSettingsFragmentTest {
|
|||||||
|
|
||||||
mFragment.onCreate(Bundle.EMPTY);
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
verify(mFragment).openAccessibilitySettingsAndFinish();
|
assertStartActivityWithExpectedFragment(mActivity, AccessibilitySettings.class.getName());
|
||||||
|
verify(mActivity).finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onCreate_magnificationComponentName_launchMagnificationFragmentAndFinish() {
|
||||||
|
final Intent intent = new Intent();
|
||||||
|
intent.putExtra(Intent.EXTRA_COMPONENT_NAME,
|
||||||
|
MAGNIFICATION_COMPONENT_NAME.flattenToString());
|
||||||
|
doReturn(intent).when(mActivity).getIntent();
|
||||||
|
|
||||||
|
mFragment.onCreate(Bundle.EMPTY);
|
||||||
|
|
||||||
|
|
||||||
|
assertStartActivityWithExpectedFragment(mActivity,
|
||||||
|
ToggleScreenMagnificationPreferenceFragment.class.getName());
|
||||||
|
verify(mActivity).finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
|
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
|
||||||
@@ -148,4 +177,11 @@ public class AccessibilityDetailsSettingsFragmentTest {
|
|||||||
infoList.add(getMockAccessibilityServiceInfo());
|
infoList.add(getMockAccessibilityServiceInfo());
|
||||||
return infoList;
|
return infoList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertStartActivityWithExpectedFragment(Context mockContext, String fragmentName) {
|
||||||
|
verify(mockContext).startActivity(mIntentArgumentCaptor.capture());
|
||||||
|
assertThat(mIntentArgumentCaptor.getValue()
|
||||||
|
.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
|
||||||
|
.isEqualTo(fragmentName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user