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 package com.android.emergency.edit; 17 18 import static android.support.test.espresso.Espresso.onView; 19 import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; 20 import static android.support.test.espresso.action.ViewActions.click; 21 import static android.support.test.espresso.matcher.ViewMatchers.withText; 22 import static com.google.common.truth.Truth.assertThat; 23 import static com.google.common.truth.Truth.assertWithMessage; 24 25 import android.app.Dialog; 26 import android.app.Instrumentation; 27 import android.content.ComponentName; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 import android.content.pm.PackageManager; 32 import android.net.Uri; 33 import android.provider.ContactsContract; 34 import android.support.test.InstrumentationRegistry; 35 import android.support.test.runner.AndroidJUnit4; 36 import android.support.v7.preference.Preference; 37 import android.support.v7.preference.PreferenceGroup; 38 import android.support.v7.preference.PreferenceManager; 39 40 import com.android.emergency.ContactTestUtils; 41 import com.android.emergency.PreferenceKeys; 42 import com.android.emergency.R; 43 import com.android.emergency.preferences.EmergencyContactsPreference; 44 import com.android.emergency.preferences.EmergencyEditTextPreference; 45 import com.android.emergency.preferences.EmergencyListPreference; 46 import com.android.emergency.preferences.NameAutoCompletePreference; 47 import com.android.emergency.util.PreferenceUtils; 48 49 import java.util.ArrayList; 50 import java.util.List; 51 52 import org.junit.After; 53 import org.junit.Before; 54 import org.junit.Test; 55 import org.junit.runner.RunWith; 56 57 /** Unit tests for {@link EditInfoActivity}. */ 58 @RunWith(AndroidJUnit4.class) 59 public final class EditInfoActivityTest { 60 private Instrumentation mInstrumentation; 61 private Context mTargetContext; 62 63 @Before setUp()64 public void setUp() { 65 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 66 mTargetContext = mInstrumentation.getTargetContext(); 67 // In case a previous test crashed or failed, clear any previous shared preference value. 68 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().clear().commit(); 69 } 70 71 @After tearDown()72 public void tearDown() { 73 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().clear().commit(); 74 } 75 76 @Test testInitialState()77 public void testInitialState() { 78 EditInfoActivity activity = startEditInfoActivity(); 79 EditInfoFragment fragment = (EditInfoFragment) activity.getFragment(); 80 PreferenceGroup medicalInfoParent = fragment.getMedicalInfoParent(); 81 82 // Because the initial state of each preference is empty, the edit activity removes the 83 // preference. As a result, we expect them all to be null. 84 for (String key : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) { 85 assertWithMessage(key).that(medicalInfoParent.findPreference(key)).isNull(); 86 } 87 EmergencyContactsPreference emergencyContactsPreference = 88 (EmergencyContactsPreference) fragment.findPreference( 89 PreferenceKeys.KEY_EMERGENCY_CONTACTS); 90 assertThat(emergencyContactsPreference).isNotNull(); 91 assertThat(emergencyContactsPreference.getPreferenceCount()).isEqualTo(0); 92 93 final PackageManager packageManager = mTargetContext.getPackageManager(); 94 final String packageName = mTargetContext.getPackageName(); 95 final ComponentName componentName = new ComponentName( 96 packageName, 97 packageName + PreferenceUtils.SETTINGS_SUGGESTION_ACTIVITY_ALIAS); 98 assertThat(packageManager.getComponentEnabledSetting(componentName)) 99 .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 100 } 101 102 @Test testClearAllPreferences()103 public void testClearAllPreferences() { 104 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 105 PreferenceKeys.KEY_NAME, "John").commit(); 106 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 107 PreferenceKeys.KEY_ADDRESS, "Home").commit(); 108 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 109 PreferenceKeys.KEY_BLOOD_TYPE, "A+").commit(); 110 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 111 PreferenceKeys.KEY_ALLERGIES, "Peanuts").commit(); 112 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 113 PreferenceKeys.KEY_MEDICATIONS, "Aspirin").commit(); 114 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 115 PreferenceKeys.KEY_MEDICAL_CONDITIONS, "Asthma").commit(); 116 PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().putString( 117 PreferenceKeys.KEY_ORGAN_DONOR, "Yes").commit(); 118 119 final Uri contactUri = ContactTestUtils 120 .createContact(mTargetContext.getContentResolver(), "Michael", "789"); 121 PreferenceManager.getDefaultSharedPreferences(mTargetContext) 122 .edit().putString(PreferenceKeys.KEY_EMERGENCY_CONTACTS, contactUri.toString()) 123 .commit(); 124 125 final PackageManager packageManager = mTargetContext.getPackageManager(); 126 final String packageName = mTargetContext.getPackageName(); 127 final ComponentName componentName = new ComponentName( 128 packageName, 129 packageName + PreferenceUtils.SETTINGS_SUGGESTION_ACTIVITY_ALIAS); 130 // With emergency info settings present, the settings suggestion should be disabled. 131 assertThat(packageManager.getComponentEnabledSetting(componentName)) 132 .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 133 134 EditInfoActivity activity = startEditInfoActivity(); 135 EditInfoFragment fragment = (EditInfoFragment) activity.getFragment(); 136 137 final NameAutoCompletePreference namePreference = 138 (NameAutoCompletePreference) fragment.getMedicalInfoPreference( 139 PreferenceKeys.KEY_NAME); 140 final EmergencyEditTextPreference addressPreference = 141 (EmergencyEditTextPreference) fragment.getMedicalInfoPreference( 142 PreferenceKeys.KEY_ADDRESS); 143 final EmergencyListPreference bloodTypePreference = 144 (EmergencyListPreference) fragment.getMedicalInfoPreference( 145 PreferenceKeys.KEY_BLOOD_TYPE); 146 final EmergencyEditTextPreference allergiesPreference = 147 (EmergencyEditTextPreference) fragment.getMedicalInfoPreference( 148 PreferenceKeys.KEY_ALLERGIES); 149 final EmergencyEditTextPreference medicationsPreference = 150 (EmergencyEditTextPreference) fragment.getMedicalInfoPreference( 151 PreferenceKeys.KEY_MEDICATIONS); 152 final EmergencyEditTextPreference medicalConditionsPreference = 153 (EmergencyEditTextPreference) fragment.getMedicalInfoPreference( 154 PreferenceKeys.KEY_MEDICAL_CONDITIONS); 155 final EmergencyListPreference organDonorPreference = 156 (EmergencyListPreference) fragment.getMedicalInfoPreference( 157 PreferenceKeys.KEY_ORGAN_DONOR); 158 final EmergencyContactsPreference emergencyContactsPreference = 159 (EmergencyContactsPreference) fragment.findPreference( 160 PreferenceKeys.KEY_EMERGENCY_CONTACTS); 161 162 String unknownName = activity.getResources().getString(R.string.unknown_name); 163 String unknownAddress = activity.getResources().getString(R.string.unknown_address); 164 String unknownBloodType = activity.getResources().getString(R.string.unknown_blood_type); 165 String unknownAllergies = activity.getResources().getString(R.string.unknown_allergies); 166 String unknownMedications = activity.getResources().getString(R.string.unknown_medications); 167 String unknownMedicalConditions = 168 activity.getResources().getString(R.string.unknown_medical_conditions); 169 String unknownOrganDonor = activity.getResources().getString(R.string.unknown_organ_donor); 170 171 assertThat(namePreference.getSummary()).isNotEqualTo(unknownName); 172 assertThat(addressPreference.getSummary()).isNotEqualTo(unknownAddress); 173 assertThat(bloodTypePreference.getSummary()).isNotEqualTo(unknownBloodType); 174 assertThat(allergiesPreference.getSummary()).isNotEqualTo(unknownAllergies); 175 assertThat(medicationsPreference.getSummary()).isNotEqualTo(unknownMedications); 176 assertThat(medicalConditionsPreference.getSummary()).isNotEqualTo(unknownMedicalConditions); 177 assertThat(organDonorPreference.getSummary()).isNotEqualTo(unknownOrganDonor); 178 assertThat(emergencyContactsPreference.getEmergencyContacts()).hasSize(1); 179 assertThat(emergencyContactsPreference.getPreferenceCount()).isEqualTo(1); 180 181 EditInfoActivity.ClearAllDialogFragment clearAllDialogFragment = 182 (EditInfoActivity.ClearAllDialogFragment) activity.getFragmentManager() 183 .findFragmentByTag(EditInfoActivity.TAG_CLEAR_ALL_DIALOG); 184 assertThat(clearAllDialogFragment).isNull(); 185 186 openActionBarOverflowOrOptionsMenu(mTargetContext); 187 onView(withText(R.string.clear_all)).perform(click()); 188 189 final EditInfoActivity.ClearAllDialogFragment clearAllDialogFragmentAfterwards = 190 (EditInfoActivity.ClearAllDialogFragment) activity.getFragmentManager() 191 .findFragmentByTag(EditInfoActivity.TAG_CLEAR_ALL_DIALOG); 192 193 assertThat(clearAllDialogFragmentAfterwards).isNotNull(); 194 Dialog clearAllDialog = clearAllDialogFragmentAfterwards.getDialog(); 195 assertThat(clearAllDialog).isNotNull(); 196 assertThat(clearAllDialog.isShowing()).isTrue(); 197 198 onView(withText(R.string.clear)).perform(click()); 199 200 // After the clear all the preferences dialog is confirmed, the preferences values are 201 // reloaded, and the existing object references are updated in-place. 202 assertThat(namePreference.getSummary()).isNull(); 203 assertThat(addressPreference.getSummary()).isNull(); 204 assertThat(bloodTypePreference.getSummary().toString()).isEqualTo(unknownBloodType); 205 assertThat(allergiesPreference.getSummary()).isNull(); 206 assertThat(medicationsPreference.getSummary()).isNull(); 207 assertThat(medicalConditionsPreference.getSummary()).isNull(); 208 assertThat(organDonorPreference.getSummary()).isEqualTo(unknownOrganDonor); 209 assertThat(emergencyContactsPreference.getEmergencyContacts()).isEmpty(); 210 assertThat(emergencyContactsPreference.getPreferenceCount()).isEqualTo(0); 211 212 // The preference values are not displayed, being empty. 213 PreferenceGroup medicalInfoParent = fragment.getMedicalInfoParent(); 214 for (String key : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) { 215 assertWithMessage(key).that(medicalInfoParent.findPreference(key)).isNull(); 216 } 217 218 // Now that the settings have been cleared, the settings suggestion should reappear. 219 assertThat(packageManager.getComponentEnabledSetting(componentName)) 220 .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 221 222 assertThat(ContactTestUtils 223 .deleteContact(activity.getContentResolver(), "Michael", "789")).isTrue(); 224 } 225 226 @Test testAddContactPreference()227 public void testAddContactPreference() throws Throwable { 228 EditInfoActivity activity = startEditInfoActivity(); 229 EditInfoFragment fragment = (EditInfoFragment) activity.getFragment(); 230 231 Preference addContactPreference = 232 fragment.findPreference(PreferenceKeys.KEY_ADD_EMERGENCY_CONTACT); 233 assertThat(addContactPreference).isNotNull(); 234 235 IntentFilter intentFilter = new IntentFilter(Intent.ACTION_PICK); 236 intentFilter.addDataType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 237 Instrumentation.ActivityMonitor activityMonitor = 238 mInstrumentation.addMonitor(intentFilter, null, true /* block */); 239 240 addContactPreference 241 .getOnPreferenceClickListener().onPreferenceClick(addContactPreference); 242 assertThat(mInstrumentation.checkMonitorHit(activityMonitor, 1 /* minHits */)).isTrue(); 243 } 244 startEditInfoActivity()245 private EditInfoActivity startEditInfoActivity() { 246 final Intent editActivityIntent = new Intent(mTargetContext, EditInfoActivity.class); 247 return (EditInfoActivity) mInstrumentation.startActivitySync(editActivityIntent); 248 } 249 } 250