• 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 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