• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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