1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.accessibility; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.doReturn; 22 import static org.mockito.Mockito.spy; 23 import static org.mockito.Mockito.when; 24 25 import android.content.ComponentName; 26 import android.content.Context; 27 import android.content.Intent; 28 import android.content.pm.PackageManager; 29 import android.content.pm.ResolveInfo; 30 import android.content.pm.ServiceInfo; 31 import android.service.quicksettings.TileService; 32 33 import androidx.preference.PreferenceManager; 34 import androidx.preference.PreferenceScreen; 35 import androidx.test.core.app.ApplicationProvider; 36 37 import com.android.settings.R; 38 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; 39 40 import org.junit.Before; 41 import org.junit.Test; 42 import org.junit.runner.RunWith; 43 import org.mockito.Answers; 44 import org.mockito.Mock; 45 import org.mockito.MockitoAnnotations; 46 import org.robolectric.RobolectricTestRunner; 47 import org.robolectric.Shadows; 48 import org.robolectric.shadows.ShadowPackageManager; 49 50 /** Tests for {@link ToggleAccessibilityServicePreferenceFragment} */ 51 @RunWith(RobolectricTestRunner.class) 52 public class ToggleAccessibilityServicePreferenceFragmentTest { 53 54 private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; 55 private static final String PLACEHOLDER_TILE_CLASS_NAME = 56 PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; 57 private static final String PLACEHOLDER_TILE_CLASS_NAME2 = 58 PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; 59 private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName( 60 PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME); 61 private static final String PLACEHOLDER_TILE_NAME = 62 PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; 63 private static final String PLACEHOLDER_TILE_NAME2 = 64 PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; 65 66 private TestToggleAccessibilityServicePreferenceFragment mFragment; 67 private PreferenceScreen mScreen; 68 private Context mContext = ApplicationProvider.getApplicationContext(); 69 70 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 71 private PreferenceManager mPreferenceManager; 72 73 @Before setUpTestFragment()74 public void setUpTestFragment() { 75 MockitoAnnotations.initMocks(this); 76 77 mFragment = spy(new TestToggleAccessibilityServicePreferenceFragment()); 78 when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); 79 when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); 80 when(mFragment.getContext()).thenReturn(mContext); 81 mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null)); 82 when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager); 83 doReturn(mScreen).when(mFragment).getPreferenceScreen(); 84 } 85 86 @Test getTileTooltipContent_noTileServiceAssigned_returnNull()87 public void getTileTooltipContent_noTileServiceAssigned_returnNull() { 88 final CharSequence tileTooltipContent = 89 mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); 90 91 assertThat(tileTooltipContent).isNull(); 92 } 93 94 @Test getTileTooltipContent_hasOneTileService_guideToEdit_haveMatchString()95 public void getTileTooltipContent_hasOneTileService_guideToEdit_haveMatchString() { 96 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, 97 PLACEHOLDER_TILE_NAME); 98 99 final CharSequence tileTooltipContent = 100 mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); 101 final CharSequence tileName = 102 mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); 103 assertThat(tileTooltipContent.toString()).isEqualTo( 104 mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); 105 } 106 107 @Test getTileTooltipContent_hasOneTileService_guideToDirectUse_haveMatchString()108 public void getTileTooltipContent_hasOneTileService_guideToDirectUse_haveMatchString() { 109 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, 110 PLACEHOLDER_TILE_NAME); 111 112 final CharSequence tileTooltipContent = 113 mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); 114 final CharSequence tileName = 115 mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); 116 assertThat(tileTooltipContent.toString()).isEqualTo( 117 mContext.getString( 118 R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); 119 } 120 121 @Test getTileTooltipContent_hasTwoTileServices_guideToEdit_haveMatchString()122 public void getTileTooltipContent_hasTwoTileServices_guideToEdit_haveMatchString() { 123 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, 124 PLACEHOLDER_TILE_NAME); 125 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, 126 PLACEHOLDER_TILE_NAME2); 127 128 final CharSequence tileTooltipContent = 129 mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT); 130 final CharSequence tileName = 131 mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); 132 assertThat(tileTooltipContent.toString()).isEqualTo( 133 mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName)); 134 } 135 136 @Test getTileTooltipContent_hasTwoTileServices_guideToDirectUse_haveMatchString()137 public void getTileTooltipContent_hasTwoTileServices_guideToDirectUse_haveMatchString() { 138 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME, 139 PLACEHOLDER_TILE_NAME); 140 setupTileService(PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME2, 141 PLACEHOLDER_TILE_NAME2); 142 143 final CharSequence tileTooltipContent = 144 mFragment.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); 145 final CharSequence tileName = 146 mFragment.loadTileLabel(mContext, mFragment.getTileComponentName()); 147 assertThat(tileTooltipContent.toString()).isEqualTo( 148 mContext.getString( 149 R.string.accessibility_service_auto_added_qs_tooltip_content, tileName)); 150 } 151 setupTileService(String packageName, String name, String tileName)152 private void setupTileService(String packageName, String name, String tileName) { 153 final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); 154 final ResolveInfo info = new ResolveInfo(); 155 info.serviceInfo = new FakeServiceInfo(packageName, name, tileName); 156 final ShadowPackageManager shadowPackageManager = 157 Shadows.shadowOf(mContext.getPackageManager()); 158 shadowPackageManager.addResolveInfoForIntent(tileProbe, info); 159 } 160 161 private static class FakeServiceInfo extends ServiceInfo { 162 private String mTileName; 163 FakeServiceInfo(String packageName, String name, String tileName)164 FakeServiceInfo(String packageName, String name, String tileName) { 165 this.packageName = packageName; 166 this.name = name; 167 mTileName = tileName; 168 } 169 loadLabel(PackageManager mgr)170 public String loadLabel(PackageManager mgr) { 171 return mTileName; 172 } 173 } 174 175 private static class TestToggleAccessibilityServicePreferenceFragment 176 extends ToggleAccessibilityServicePreferenceFragment { 177 178 @Override getTileComponentName()179 protected ComponentName getTileComponentName() { 180 return PLACEHOLDER_TILE_COMPONENT_NAME; 181 } 182 } 183 } 184