1 /* 2 * Copyright (C) 2017 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 android.appwidget.cts; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.junit.Assert.assertEquals; 22 import static org.junit.Assume.assumeTrue; 23 24 import android.app.Instrumentation; 25 import android.appwidget.AppWidgetManager; 26 import android.appwidget.AppWidgetProviderInfo; 27 import android.appwidget.cts.provider.FirstAppWidgetProvider; 28 import android.appwidget.cts.provider.SecondAppWidgetProvider; 29 import android.content.ComponentName; 30 import android.content.Context; 31 import android.content.pm.PackageManager; 32 import android.os.ParcelFileDescriptor; 33 import android.os.Process; 34 35 import androidx.test.InstrumentationRegistry; 36 import androidx.test.runner.AndroidJUnit4; 37 38 import org.junit.Before; 39 import org.junit.runner.RunWith; 40 41 import java.io.BufferedReader; 42 import java.io.InputStreamReader; 43 import java.util.ArrayList; 44 import java.util.List; 45 46 @RunWith(AndroidJUnit4.class) 47 public abstract class AppWidgetTestCase { 48 private static final String TAG = "AppWidgetTest"; 49 private static final String FIRST_APP_WIDGET_CONFIGURE_ACTIVITY = 50 "android.appwidget.cts.provider.FirstAppWidgetConfigureActivity"; 51 52 private static final String SECOND_APP_WIDGET_CONFIGURE_ACTIVITY = 53 "android.appwidget.cts.provider.SecondAppWidgetConfigureActivity"; 54 55 private static final String GRANT_BIND_APP_WIDGET_PERMISSION_COMMAND = 56 "appwidget grantbind --package android.appwidget.cts --user "; 57 58 private static final String REVOKE_BIND_APP_WIDGET_PERMISSION_COMMAND = 59 "appwidget revokebind --package android.appwidget.cts --user "; 60 61 @Before assumeHasWidgets()62 public void assumeHasWidgets() { 63 assumeTrue(hasAppWidgets()); 64 } 65 hasAppWidgets()66 public boolean hasAppWidgets() { 67 return getInstrumentation().getTargetContext().getPackageManager() 68 .hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS); 69 } 70 getInstrumentation()71 protected Instrumentation getInstrumentation() { 72 return InstrumentationRegistry.getInstrumentation(); 73 } 74 verifyInstalledProviders(List<AppWidgetProviderInfo> providers)75 public boolean[] verifyInstalledProviders(List<AppWidgetProviderInfo> providers) { 76 boolean firstProviderVerified = false; 77 boolean secondProviderVerified = false; 78 79 ComponentName firstComponentName = getFirstWidgetComponent(); 80 ComponentName secondComponentName = getSecondWidgetComponent(); 81 82 final int providerCount = providers.size(); 83 for (int i = 0; i < providerCount; i++) { 84 AppWidgetProviderInfo provider = providers.get(i); 85 86 if (firstComponentName.equals(provider.provider) 87 && android.os.Process.myUserHandle().equals(provider.getProfile())) { 88 assertEquals(getNormalizedDimensionResource(android.appwidget.cts.R.dimen.first_min_appwidget_size), 89 provider.minWidth); 90 assertEquals(getNormalizedDimensionResource(android.appwidget.cts.R.dimen.first_min_appwidget_size), 91 provider.minHeight); 92 assertEquals(getNormalizedDimensionResource( 93 android.appwidget.cts.R.dimen.first_min_resize_appwidget_size), provider.minResizeWidth); 94 assertEquals(getNormalizedDimensionResource( 95 android.appwidget.cts.R.dimen.first_min_resize_appwidget_size), provider.minResizeHeight); 96 assertThat( 97 getNormalizedDimensionResource( 98 android.appwidget.cts.R.dimen.first_max_resize_appwidget_size)) 99 .isEqualTo(provider.maxResizeWidth); 100 assertThat( 101 getNormalizedDimensionResource( 102 android.appwidget.cts.R.dimen.first_max_resize_appwidget_size)) 103 .isEqualTo(provider.maxResizeHeight); 104 assertThat( 105 getIntResource( 106 android.appwidget.cts.R.integer.first_target_cell_appwidget_size)) 107 .isEqualTo(provider.targetCellWidth); 108 assertThat( 109 getIntResource( 110 android.appwidget.cts.R.integer.first_target_cell_appwidget_size)) 111 .isEqualTo(provider.targetCellHeight); 112 assertEquals(getIntResource(android.appwidget.cts.R.integer.first_update_period_millis), 113 provider.updatePeriodMillis); 114 assertEquals(getInstrumentation().getTargetContext().getPackageName(), 115 provider.configure.getPackageName()); 116 assertEquals(FIRST_APP_WIDGET_CONFIGURE_ACTIVITY, 117 provider.configure.getClassName()); 118 assertEquals(getIntResource(android.appwidget.cts.R.integer.first_resize_mode), 119 provider.resizeMode); 120 assertEquals(getIntResource(android.appwidget.cts.R.integer.first_widget_category), 121 provider.widgetCategory); 122 assertEquals(android.appwidget.cts.R.layout.first_initial_layout, 123 provider.initialLayout); 124 assertEquals(android.appwidget.cts.R.layout.first_initial_keyguard_layout, 125 provider.initialKeyguardLayout); 126 assertEquals(android.appwidget.cts.R.drawable.first_android_icon, 127 provider.previewImage); 128 assertEquals(android.appwidget.cts.R.id.first_auto_advance_view_id, 129 provider.autoAdvanceViewId); 130 assertEquals(android.appwidget.cts.R.string.widget_description, 131 provider.descriptionRes); 132 assertEquals(android.appwidget.cts.R.layout.preview_layout, 133 provider.previewLayout); 134 firstProviderVerified = true; 135 } else if (secondComponentName.equals(provider.provider) 136 && android.os.Process.myUserHandle().equals(provider.getProfile())) { 137 assertEquals(getNormalizedDimensionResource(android.appwidget.cts.R.dimen.second_min_appwidget_size), 138 provider.minWidth); 139 assertEquals(getNormalizedDimensionResource(android.appwidget.cts.R.dimen.second_min_appwidget_size), 140 provider.minHeight); 141 assertEquals(getNormalizedDimensionResource( 142 android.appwidget.cts.R.dimen.second_min_resize_appwidget_size), provider.minResizeWidth); 143 assertEquals(getNormalizedDimensionResource( 144 android.appwidget.cts.R.dimen.second_min_resize_appwidget_size), provider.minResizeHeight); 145 assertThat( 146 getNormalizedDimensionResource( 147 android.appwidget.cts.R.dimen.second_max_resize_appwidget_size)) 148 .isEqualTo(provider.maxResizeWidth); 149 assertThat( 150 getNormalizedDimensionResource( 151 android.appwidget.cts.R.dimen.second_max_resize_appwidget_size)) 152 .isEqualTo(provider.maxResizeHeight); 153 assertThat( 154 getIntResource( 155 android.appwidget.cts.R.integer.second_target_cell_appwidget_size)) 156 .isEqualTo(provider.targetCellWidth); 157 assertThat( 158 getIntResource( 159 android.appwidget.cts.R.integer.second_target_cell_appwidget_size)) 160 .isEqualTo(provider.targetCellHeight); 161 assertEquals(getIntResource(android.appwidget.cts.R.integer.second_update_period_millis), 162 provider.updatePeriodMillis); 163 assertEquals(getInstrumentation().getTargetContext().getPackageName(), 164 provider.configure.getPackageName()); 165 assertEquals(SECOND_APP_WIDGET_CONFIGURE_ACTIVITY, 166 provider.configure.getClassName()); 167 assertEquals(getIntResource(android.appwidget.cts.R.integer.second_resize_mode), 168 provider.resizeMode); 169 assertEquals(getIntResource(android.appwidget.cts.R.integer.second_widget_category), 170 provider.widgetCategory); 171 assertEquals(android.appwidget.cts.R.layout.second_initial_layout, 172 provider.initialLayout); 173 assertEquals(android.appwidget.cts.R.layout.second_initial_keyguard_layout, 174 provider.initialKeyguardLayout); 175 assertEquals(android.appwidget.cts.R.drawable.second_android_icon, 176 provider.previewImage); 177 assertEquals(android.appwidget.cts.R.id.second_auto_advance_view_id, 178 provider.autoAdvanceViewId); 179 secondProviderVerified = true; 180 } 181 } 182 183 return new boolean[]{firstProviderVerified, secondProviderVerified}; 184 } 185 getNormalizedDimensionResource(int resId)186 private int getNormalizedDimensionResource(int resId) { 187 return getInstrumentation().getTargetContext().getResources() 188 .getDimensionPixelSize(resId); 189 } 190 getIntResource(int resId)191 private int getIntResource(int resId) { 192 return getInstrumentation().getTargetContext().getResources().getInteger(resId); 193 } 194 getFirstWidgetComponent()195 public ComponentName getFirstWidgetComponent() { 196 return new ComponentName( 197 getInstrumentation().getTargetContext().getPackageName(), 198 FirstAppWidgetProvider.class.getName()); 199 } 200 getSecondWidgetComponent()201 public ComponentName getSecondWidgetComponent() { 202 return new ComponentName( 203 getInstrumentation().getTargetContext().getPackageName(), 204 SecondAppWidgetProvider.class.getName()); 205 } 206 getProviderInfo(ComponentName componentName)207 public AppWidgetProviderInfo getProviderInfo(ComponentName componentName) { 208 List<AppWidgetProviderInfo> providers = getAppWidgetManager().getInstalledProviders(); 209 210 final int providerCount = providers.size(); 211 for (int i = 0; i < providerCount; i++) { 212 AppWidgetProviderInfo provider = providers.get(i); 213 if (componentName.equals(provider.provider) 214 && Process.myUserHandle().equals(provider.getProfile())) { 215 return provider; 216 217 } 218 } 219 220 return null; 221 } 222 getAppWidgetManager()223 public AppWidgetManager getAppWidgetManager() { 224 return (AppWidgetManager) getInstrumentation().getTargetContext() 225 .getSystemService(Context.APPWIDGET_SERVICE); 226 } 227 runShellCommand(String command)228 public ArrayList<String> runShellCommand(String command) throws Exception { 229 ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation() 230 .executeShellCommand(command); 231 232 ArrayList<String> ret = new ArrayList<>(); 233 // Read the input stream fully. 234 try (BufferedReader r = new BufferedReader( 235 new InputStreamReader(new ParcelFileDescriptor.AutoCloseInputStream(pfd)))) { 236 String line; 237 while ((line = r.readLine()) != null) { 238 ret.add(line); 239 } 240 } 241 return ret; 242 } 243 grantBindAppWidgetPermission()244 protected void grantBindAppWidgetPermission() throws Exception { 245 runShellCommand(GRANT_BIND_APP_WIDGET_PERMISSION_COMMAND + getCurrentUser()); 246 } 247 revokeBindAppWidgetPermission()248 protected void revokeBindAppWidgetPermission() throws Exception { 249 runShellCommand(REVOKE_BIND_APP_WIDGET_PERMISSION_COMMAND + getCurrentUser()); 250 } 251 getCurrentUser()252 private static int getCurrentUser() { 253 return android.os.Process.myUserHandle().getIdentifier(); 254 } 255 } 256