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