• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 package com.android.emergency.edit;
17 
18 import android.app.AlertDialog;
19 import android.app.Fragment;
20 import android.content.Context;
21 import android.content.DialogInterface;
22 import android.net.Uri;
23 import android.os.PowerManager;
24 import android.preference.PreferenceManager;
25 import android.test.ActivityInstrumentationTestCase2;
26 import android.test.suitebuilder.annotation.LargeTest;
27 import android.util.Pair;
28 
29 import com.android.emergency.ContactTestUtils;
30 import com.android.emergency.PreferenceKeys;
31 import com.android.emergency.R;
32 import com.android.emergency.preferences.EmergencyContactsPreference;
33 import com.android.emergency.preferences.EmergencyEditTextPreference;
34 import com.android.emergency.preferences.EmergencyListPreference;
35 import com.android.emergency.preferences.NameAutoCompletePreference;
36 
37 import java.util.ArrayList;
38 import java.util.List;
39 
40 /**
41  * Tests for {@link EditInfoActivity}.
42  */
43 @LargeTest
44 public class EditInfoActivityTest extends ActivityInstrumentationTestCase2<EditInfoActivity> {
45     private ArrayList<Pair<String, Fragment>> mFragments;
46     private EditEmergencyInfoFragment mEditEmergencyInfoFragment;
47     private EditEmergencyContactsFragment mEditEmergencyContactsFragment;
48     private PowerManager.WakeLock mKeepScreenOnWakeLock;
49 
EditInfoActivityTest()50     public EditInfoActivityTest() {
51         super(EditInfoActivity.class);
52     }
53 
54     @Override
setUp()55     protected void setUp() throws Exception {
56         super.setUp();
57         PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit();
58         forceScreenOn();
59 
60         mFragments = getActivity().getFragments();
61         mEditEmergencyInfoFragment = (EditEmergencyInfoFragment) mFragments.get(0).second;
62         mEditEmergencyContactsFragment = (EditEmergencyContactsFragment) mFragments.get(1).second;
63     }
64 
65     @Override
tearDown()66     protected void tearDown() throws Exception {
67         PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit();
68         releaseScreenOn();
69         super.tearDown();
70     }
71 
testTwoFragments()72     public void testTwoFragments() {
73         assertEquals(2, mFragments.size());
74     }
75 
testInitialState()76     public void testInitialState() {
77         for (String key : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) {
78             assertNotNull(mEditEmergencyInfoFragment.findPreference(key));
79         }
80         EmergencyContactsPreference emergencyContactsPreference =
81                 (EmergencyContactsPreference) mEditEmergencyContactsFragment
82                         .findPreference(PreferenceKeys.KEY_EMERGENCY_CONTACTS);
83         assertNotNull(emergencyContactsPreference);
84         assertEquals(0, emergencyContactsPreference.getPreferenceCount());
85     }
86 
testClearAllPreferences()87     public void testClearAllPreferences () throws Throwable {
88         EditInfoActivity editInfoActivity = getActivity();
89         final NameAutoCompletePreference namePreference =
90                 (NameAutoCompletePreference) mEditEmergencyInfoFragment
91                         .findPreference(PreferenceKeys.KEY_NAME);
92         final EmergencyEditTextPreference addressPreference =
93                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
94                         .findPreference(PreferenceKeys.KEY_ADDRESS);
95         final EmergencyListPreference bloodTypePreference =
96                 (EmergencyListPreference) mEditEmergencyInfoFragment
97                         .findPreference(PreferenceKeys.KEY_BLOOD_TYPE);
98         final EmergencyEditTextPreference allergiesPreference =
99                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
100                         .findPreference(PreferenceKeys.KEY_ALLERGIES);
101         final EmergencyEditTextPreference medicationsPreference =
102                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
103                         .findPreference(PreferenceKeys.KEY_MEDICATIONS);
104         final EmergencyEditTextPreference medicalConditionsPreference =
105                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
106                         .findPreference(PreferenceKeys.KEY_MEDICAL_CONDITIONS);
107         final EmergencyListPreference organDonorPreference =
108                 (EmergencyListPreference) mEditEmergencyInfoFragment
109                         .findPreference(PreferenceKeys.KEY_ORGAN_DONOR);
110 
111         final EmergencyContactsPreference emergencyContactsPreference =
112                 (EmergencyContactsPreference) mEditEmergencyContactsFragment
113                         .findPreference(PreferenceKeys.KEY_EMERGENCY_CONTACTS);
114         final Uri contactUri = ContactTestUtils
115                 .createContact(editInfoActivity.getContentResolver(), "Michael", "789");
116         final List<Uri> emergencyContacts = new ArrayList<>();
117         emergencyContacts.add(contactUri);
118 
119         runTestOnUiThread(new Runnable() {
120             @Override
121             public void run() {
122                 namePreference.setText("John");
123                 addressPreference.setText("Home");
124                 bloodTypePreference.setValue("A+");
125                 allergiesPreference.setText("Peanuts");
126                 medicationsPreference.setText("Aspirin");
127                 medicalConditionsPreference.setText("Asthma");
128                 organDonorPreference.setValue("Yes");
129                 emergencyContactsPreference.setEmergencyContacts(emergencyContacts);
130             }
131         });
132 
133         String unknownName = editInfoActivity.getResources().getString(R.string.unknown_name);
134         String unknownAddress = editInfoActivity.getResources().getString(R.string.unknown_address);
135         String unknownBloodType =
136                 editInfoActivity.getResources().getString(R.string.unknown_blood_type);
137         String unknownAllergies =
138                 editInfoActivity.getResources().getString(R.string.unknown_allergies);
139         String unknownMedications =
140                 editInfoActivity.getResources().getString(R.string.unknown_medications);
141         String unknownMedicalConditions =
142                 editInfoActivity.getResources().getString(R.string.unknown_medical_conditions);
143         String unknownOrganDonor =
144                 editInfoActivity.getResources().getString(R.string.unknown_organ_donor);
145 
146         assertNotSame(unknownName, namePreference.getSummary());
147         assertNotSame(unknownAddress, addressPreference.getSummary());
148         assertNotSame(unknownBloodType, bloodTypePreference.getSummary());
149         assertNotSame(unknownAllergies, allergiesPreference.getSummary());
150         assertNotSame(unknownMedications, medicationsPreference.getSummary());
151         assertNotSame(unknownMedicalConditions, medicalConditionsPreference.getSummary());
152         assertNotSame(unknownOrganDonor, organDonorPreference.getSummary());
153         assertEquals(1, emergencyContactsPreference.getEmergencyContacts().size());
154         assertEquals(1, emergencyContactsPreference.getPreferenceCount());
155 
156         EditInfoActivity.ClearAllDialogFragment clearAllDialogFragment =
157                 (EditInfoActivity.ClearAllDialogFragment) editInfoActivity.getFragmentManager()
158                         .findFragmentByTag(EditInfoActivity.TAG_CLEAR_ALL_DIALOG);
159         assertNull(clearAllDialogFragment);
160         editInfoActivity.getMenu().performIdentifierAction(R.id.action_clear_all, 0 /* flags */);
161         getInstrumentation().waitForIdleSync();
162         final EditInfoActivity.ClearAllDialogFragment clearAllDialogFragmentAfterwards =
163                 (EditInfoActivity.ClearAllDialogFragment) editInfoActivity.getFragmentManager()
164                         .findFragmentByTag(EditInfoActivity.TAG_CLEAR_ALL_DIALOG);
165 
166         assertTrue(clearAllDialogFragmentAfterwards.getDialog().isShowing());
167 
168         runTestOnUiThread(new Runnable() {
169             @Override
170             public void run() {
171                 ((AlertDialog) clearAllDialogFragmentAfterwards.getDialog())
172                         .getButton(DialogInterface.BUTTON_POSITIVE)
173                         .performClick();
174             }
175         });
176         getInstrumentation().waitForIdleSync();
177 
178 	assertEquals(mFragments, editInfoActivity.getFragments());
179 
180         // After clearing all the preferences, onCreate is called for both fragments.
181         // This makes the preferences point to old ones. Here we load what the user
182         // is seeing
183         final NameAutoCompletePreference namePreferenceAfterClear =
184                 (NameAutoCompletePreference) mEditEmergencyInfoFragment
185                         .findPreference(PreferenceKeys.KEY_NAME);
186         final EmergencyEditTextPreference addressPreferenceAfterClear =
187                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
188                         .findPreference(PreferenceKeys.KEY_ADDRESS);
189         final EmergencyListPreference bloodTypePreferenceAfterClear =
190                 (EmergencyListPreference) mEditEmergencyInfoFragment
191                         .findPreference(PreferenceKeys.KEY_BLOOD_TYPE);
192         final EmergencyEditTextPreference allergiesPreferenceAfterClear =
193                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
194                         .findPreference(PreferenceKeys.KEY_ALLERGIES);
195         final EmergencyEditTextPreference medicationsPreferenceAfterClear =
196                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
197                         .findPreference(PreferenceKeys.KEY_MEDICATIONS);
198         final EmergencyEditTextPreference medicalConditionsPreferenceAfterClear =
199                 (EmergencyEditTextPreference) mEditEmergencyInfoFragment
200                         .findPreference(PreferenceKeys.KEY_MEDICAL_CONDITIONS);
201         final EmergencyListPreference organDonorPreferenceAfterClear =
202                 (EmergencyListPreference) mEditEmergencyInfoFragment
203                         .findPreference(PreferenceKeys.KEY_ORGAN_DONOR);
204 
205         final EmergencyContactsPreference emergencyContactsPreferenceAfterClear =
206                 (EmergencyContactsPreference) mEditEmergencyContactsFragment
207                         .findPreference(PreferenceKeys.KEY_EMERGENCY_CONTACTS);
208 
209         assertEquals(unknownName, namePreferenceAfterClear.getSummary());
210         assertEquals(unknownAddress, addressPreferenceAfterClear.getSummary());
211         assertEquals(unknownBloodType, bloodTypePreferenceAfterClear.getSummary().toString());
212         assertEquals(unknownAllergies, allergiesPreferenceAfterClear.getSummary());
213         assertEquals(unknownMedications, medicationsPreferenceAfterClear.getSummary());
214         assertEquals(unknownMedicalConditions, medicalConditionsPreferenceAfterClear.getSummary());
215         assertEquals(unknownOrganDonor, organDonorPreferenceAfterClear.getSummary());
216         assertEquals(0, emergencyContactsPreferenceAfterClear.getEmergencyContacts().size());
217         assertEquals(0, emergencyContactsPreferenceAfterClear.getPreferenceCount());
218 
219         assertTrue(ContactTestUtils
220                 .deleteContact(getActivity().getContentResolver(), "Michael", "789"));
221     }
222 
testWarningDialog_onPauseAndResume()223     public void testWarningDialog_onPauseAndResume() throws Throwable {
224         final EditInfoActivity.WarningDialogFragment dialog =
225                 (EditInfoActivity.WarningDialogFragment) getActivity().getFragmentManager()
226                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
227         assertTrue(dialog.getDialog().isShowing());
228 
229         onPause();
230         onResume();
231 
232         final EditInfoActivity.WarningDialogFragment dialogAfterOnResume =
233                 (EditInfoActivity.WarningDialogFragment) getActivity().getFragmentManager()
234                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
235         assertTrue(dialogAfterOnResume.getDialog().isShowing());
236     }
237 
testWarningDialog_negativeButton()238     public void testWarningDialog_negativeButton() throws Throwable {
239         EditInfoActivity activity = getActivity();
240         final EditInfoActivity.WarningDialogFragment dialogFragment =
241                 (EditInfoActivity.WarningDialogFragment) activity.getFragmentManager()
242                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
243         assertNotNull(dialogFragment.getActivity());
244         assertTrue(dialogFragment.getDialog().isShowing());
245         runTestOnUiThread(new Runnable() {
246             @Override
247             public void run() {
248                 ((AlertDialog) dialogFragment.getDialog())
249                         .getButton(DialogInterface.BUTTON_NEGATIVE)
250                         .performClick();
251             }
252         });
253         getInstrumentation().waitForIdleSync();
254 
255         assertNull(dialogFragment.getDialog());
256     }
257 
testWarningDialog_positiveButton()258     public void testWarningDialog_positiveButton() throws Throwable {
259         EditInfoActivity activity = getActivity();
260         final EditInfoActivity.WarningDialogFragment dialogFragment =
261                 (EditInfoActivity.WarningDialogFragment) activity.getFragmentManager()
262                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
263         assertTrue(dialogFragment.getDialog().isShowing());
264 
265         runTestOnUiThread(new Runnable() {
266             @Override
267             public void run() {
268                 ((AlertDialog) dialogFragment.getDialog())
269                         .getButton(DialogInterface.BUTTON_POSITIVE)
270                         .performClick();
271             }
272         });
273         getInstrumentation().waitForIdleSync();
274         assertNull(dialogFragment.getDialog());
275 
276         onPause();
277         onResume();
278 
279         EditInfoActivity.WarningDialogFragment dialogAfterOnResume =
280                 (EditInfoActivity.WarningDialogFragment) getActivity().getFragmentManager()
281                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
282         assertNull(dialogAfterOnResume);
283     }
284 
testWarningDialogTimer_overOneDayAgo()285     public void testWarningDialogTimer_overOneDayAgo() throws Throwable {
286         EditInfoActivity activity = getActivity();
287         final EditInfoActivity.WarningDialogFragment dialogFragment =
288                 (EditInfoActivity.WarningDialogFragment) activity.getFragmentManager()
289                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
290         runTestOnUiThread(new Runnable() {
291             @Override
292             public void run() {
293                 ((AlertDialog) dialogFragment.getDialog())
294                         .getButton(DialogInterface.BUTTON_POSITIVE)
295                         .performClick();
296             }
297         });
298         getInstrumentation().waitForIdleSync();
299 
300         onPause();
301         // Manually make the last consent be a bit over a day ago
302         long overOneDayAgoMs = System.currentTimeMillis() - EditInfoActivity.ONE_DAY_MS - 60_000;
303         PreferenceManager.getDefaultSharedPreferences(activity).edit()
304                 .putLong(EditInfoActivity.KEY_LAST_CONSENT_TIME_MS,
305                         overOneDayAgoMs).commit();
306         onResume();
307 
308         EditInfoActivity.WarningDialogFragment dialogAfterOnResume =
309                 (EditInfoActivity.WarningDialogFragment) getActivity().getFragmentManager()
310                         .findFragmentByTag(EditInfoActivity.TAG_WARNING_DIALOG);
311         assertTrue(dialogAfterOnResume.getDialog().isShowing());
312     }
313 
onPause()314     private void onPause() throws Throwable {
315         runTestOnUiThread(new Runnable() {
316             @Override
317             public void run() {
318                 getInstrumentation().callActivityOnPause(getActivity());
319             }
320         });
321     }
322 
onResume()323     private void onResume() throws Throwable {
324         runTestOnUiThread(new Runnable() {
325             @Override
326             public void run() {
327                 getInstrumentation().callActivityOnResume(getActivity());
328             }
329         });
330         getInstrumentation().waitForIdleSync();
331     }
332 
forceScreenOn()333     private void forceScreenOn() {
334         int levelAndFlags = PowerManager.FULL_WAKE_LOCK
335                 | PowerManager.ON_AFTER_RELEASE
336                 | PowerManager.ACQUIRE_CAUSES_WAKEUP;
337         PowerManager powerManager =
338                 (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
339         mKeepScreenOnWakeLock = powerManager.newWakeLock(levelAndFlags, "EditEmergencyInfo");
340         mKeepScreenOnWakeLock.setReferenceCounted(false);
341         mKeepScreenOnWakeLock.acquire();
342     }
343 
releaseScreenOn()344     private void releaseScreenOn() {
345         mKeepScreenOnWakeLock.release();
346     }
347 }
348