Merge changes from topics "a11y_qs_attr_integration", "a11y_qs_tooltip_1p"

* changes:
  Integrate new accessibility tileService attr into settings
  Support accessibility settings load title from quick settings panel
  Show quick setting tooltips after shortcut edit dialog dismiss
  Show quick setting tooltips after shortcut tutorial dialog dismiss
This commit is contained in:
Menghan Li
2022-02-09 07:07:08 +00:00
committed by Android (Google) Code Review
9 changed files with 513 additions and 30 deletions

View File

@@ -22,26 +22,41 @@ import static com.android.settings.accessibility.AccessibilityUtil.UserShortcutT
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.DialogInterface;
import androidx.appcompat.app.AlertDialog;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
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;
import org.robolectric.RuntimeEnvironment;
/** Tests for {@link AccessibilityGestureNavigationTutorial}. */
@RunWith(RobolectricTestRunner.class)
public final class AccessibilityGestureNavigationTutorialTest {
private Context mContext;
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
private DialogInterface.OnClickListener mMockOnClickListener;
private final Context mContext = ApplicationProvider.getApplicationContext();
private int mShortcutTypes;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mContext.setTheme(R.style.Theme_AppCompat);
mShortcutTypes = /* initial */ 0;
}
@@ -86,4 +101,28 @@ public final class AccessibilityGestureNavigationTutorialTest {
mShortcutTypes)).hasSize(/* expectedSize= */ 2);
assertThat(alertDialog).isNotNull();
}
@Test
public void performClickOnNegativeButton_turnOnSoftwareShortcut_dismiss() {
mShortcutTypes |= UserShortcutType.SOFTWARE;
final AlertDialog alertDialog =
createAccessibilityTutorialDialog(mContext, mShortcutTypes);
alertDialog.show();
alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
assertThat(alertDialog.isShowing()).isFalse();
}
@Test
public void performClickOnNegativeButton_turnOnSoftwareShortcut_callOnClickListener() {
mShortcutTypes |= UserShortcutType.SOFTWARE;
final AlertDialog alertDialog =
createAccessibilityTutorialDialog(mContext, mShortcutTypes, mMockOnClickListener);
alertDialog.show();
alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
verify(mMockOnClickListener).onClick(alertDialog, DialogInterface.BUTTON_NEGATIVE);
}
}

View File

@@ -0,0 +1,145 @@
/*
* 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.settings.accessibility;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.service.quicksettings.TileService;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowPackageManager;
import java.util.Arrays;
/** Tests for {@link LaunchAccessibilityActivityPreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
public class LaunchAccessibilityActivityPreferenceFragmentTest {
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
private static final String PLACEHOLDER_TILE_CLASS_NAME =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
private static final String PLACEHOLDER_TILE_CLASS_NAME2 =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName(
PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
private static final String PLACEHOLDER_TILE_NAME =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
private static final String PLACEHOLDER_TILE_NAME2 =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
private TestLaunchAccessibilityActivityPreferenceFragment mFragment;
private PreferenceScreen mScreen;
private Context mContext = ApplicationProvider.getApplicationContext();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager;
@Before
public void setUpTestFragment() {
MockitoAnnotations.initMocks(this);
mFragment = spy(new TestLaunchAccessibilityActivityPreferenceFragment());
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mFragment.getContext()).thenReturn(mContext);
mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
doReturn(mScreen).when(mFragment).getPreferenceScreen();
}
@Test
public void getTileName_noTileServiceAssigned_noMatchString() {
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo("");
}
@Test
public void getTileName_hasOneTileService_haveMatchString() {
final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
final ResolveInfo info = new ResolveInfo();
info.serviceInfo = new FakeServiceInfo();
info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(mContext.getPackageManager());
shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info));
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
}
@Test
public void getTileName_hasTwoTileServices_haveMatchString() {
final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
final ResolveInfo info = new ResolveInfo();
info.serviceInfo = new FakeServiceInfo();
info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
final ResolveInfo info2 = new ResolveInfo();
info2.serviceInfo = new FakeServiceInfo2();
info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2;
final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(mContext.getPackageManager());
shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2));
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
}
private static class FakeServiceInfo extends ServiceInfo {
public String loadLabel(PackageManager mgr) {
return PLACEHOLDER_TILE_NAME;
}
}
private static class FakeServiceInfo2 extends ServiceInfo {
public String loadLabel(PackageManager mgr) {
return PLACEHOLDER_TILE_NAME2;
}
}
private static class TestLaunchAccessibilityActivityPreferenceFragment
extends LaunchAccessibilityActivityPreferenceFragment {
@Override
protected ComponentName getTileComponentName() {
return PLACEHOLDER_TILE_COMPONENT_NAME;
}
}
}

View File

@@ -0,0 +1,145 @@
/*
* 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.settings.accessibility;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.service.quicksettings.TileService;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowPackageManager;
import java.util.Arrays;
/** Tests for {@link ToggleAccessibilityServicePreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
public class ToggleAccessibilityServicePreferenceFragmentTest {
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
private static final String PLACEHOLDER_TILE_CLASS_NAME =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
private static final String PLACEHOLDER_TILE_CLASS_NAME2 =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName(
PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
private static final String PLACEHOLDER_TILE_NAME =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
private static final String PLACEHOLDER_TILE_NAME2 =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
private TestToggleAccessibilityServicePreferenceFragment mFragment;
private PreferenceScreen mScreen;
private Context mContext = ApplicationProvider.getApplicationContext();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager;
@Before
public void setUpTestFragment() {
MockitoAnnotations.initMocks(this);
mFragment = spy(new TestToggleAccessibilityServicePreferenceFragment());
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mFragment.getContext()).thenReturn(mContext);
mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
doReturn(mScreen).when(mFragment).getPreferenceScreen();
}
@Test
public void getTileName_noTileServiceAssigned_noMatchString() {
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo("");
}
@Test
public void getTileName_hasOneTileService_haveMatchString() {
final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
final ResolveInfo info = new ResolveInfo();
info.serviceInfo = new FakeServiceInfo();
info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(mContext.getPackageManager());
shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info));
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
}
@Test
public void getTileName_hasTwoTileServices_haveMatchString() {
final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
final ResolveInfo info = new ResolveInfo();
info.serviceInfo = new FakeServiceInfo();
info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME;
final ResolveInfo info2 = new ResolveInfo();
info2.serviceInfo = new FakeServiceInfo2();
info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME;
info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2;
final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(mContext.getPackageManager());
shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2));
final CharSequence tileName = mFragment.getTileName();
assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME);
}
private static class FakeServiceInfo extends ServiceInfo {
public String loadLabel(PackageManager mgr) {
return PLACEHOLDER_TILE_NAME;
}
}
private static class FakeServiceInfo2 extends ServiceInfo {
public String loadLabel(PackageManager mgr) {
return PLACEHOLDER_TILE_NAME2;
}
}
private static class TestToggleAccessibilityServicePreferenceFragment
extends ToggleAccessibilityServicePreferenceFragment {
@Override
protected ComponentName getTileComponentName() {
return PLACEHOLDER_TILE_COMPONENT_NAME;
}
}
}