Reimplement EmergencyInfo with the support library.

This allows compatibility with SettingsLib.

Bug: 30046624
Test: runtest --path packages/apps/EmergencyInfo/tests
Change-Id: I3e4a49b6aebfd3297014bfd3bc9cc80a37e3a006
diff --git a/Android.mk b/Android.mk
index adb0ec1..2587d6f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -39,6 +39,8 @@
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
+include frameworks/base/packages/SettingsLib/common.mk
+
 include $(BUILD_PACKAGE)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/proguard.flags b/proguard.flags
index 2d44933..29911b8 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -1,3 +1,8 @@
+# Retain all Preference classes, which the tests rely on.
+-keep class android.support.v7.preference.Preference* {
+    *;
+}
+
 # Keep annotated classes or class members.
 -keep @android.support.annotation.Keep class *
 -keepclassmembers class * {
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f4c48ce..80a7906 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -19,6 +19,7 @@
         <item name="android:windowLightStatusBar">true</item>
         <item name="tabIndicatorColor">@color/accent_color_dark</item>
         <item name="textColorActionBar">?android:attr/textColorPrimary</item>
+        <item name="preferenceTheme">@style/PreferenceTheme</item>
     </style>
 
     <!-- Base emergency theme. -->
@@ -26,9 +27,9 @@
         <item name="android:preferenceCategoryStyle">@style/AppTheme.PreferenceCategoryStyle</item>
         <item name="colorPrimaryDark">@color/emergency_primary_dark</item>
         <item name="colorPrimary">@color/emergency_primary</item>
-        <item name="colorAccent">@color/emergency_accent</item>
         <item name="textColorActionBar">@color/tab_text_color</item>
         <item name="tabIndicatorColor">@color/emergency_accent</item>
+        <item name="preferenceTheme">@style/PreferenceTheme</item>
     </style>
 
     <!-- ActionBar -->
@@ -57,4 +58,7 @@
     <style name="AppTheme.PreferenceCategoryStyle" parent="Preference.Category">
         <item name="android:layout">@layout/custom_preference_category_layout</item>
     </style>
+
+    <style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
+    </style>
 </resources>
diff --git a/src/com/android/emergency/edit/EditInfoActivity.java b/src/com/android/emergency/edit/EditInfoActivity.java
index 2ac34de..43110d3 100644
--- a/src/com/android/emergency/edit/EditInfoActivity.java
+++ b/src/com/android/emergency/edit/EditInfoActivity.java
@@ -27,8 +27,8 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceManager;
 import android.util.Pair;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -64,10 +64,16 @@
 
         getActionBar().setDisplayHomeAsUpEnabled(true);
 
-        mEditInfoFragment = new EditInfoFragment();
-        getFragmentManager().beginTransaction()
-            .replace(android.R.id.content, mEditInfoFragment)
-            .commit();
+        // We only add a new EditInfoFragment if no fragment is restored.
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        if (fragment == null) {
+            mEditInfoFragment = new EditInfoFragment();
+            getFragmentManager().beginTransaction()
+                .add(android.R.id.content, mEditInfoFragment)
+                .commit();
+        } else {
+            mEditInfoFragment = (EditInfoFragment) fragment;
+        }
 
         getWindow().addFlags(FLAG_DISMISS_KEYGUARD);
         MetricsLogger.visible(this, MetricsEvent.ACTION_EDIT_EMERGENCY_INFO);
diff --git a/src/com/android/emergency/edit/EditInfoFragment.java b/src/com/android/emergency/edit/EditInfoFragment.java
index 1fce209..eb642e2 100644
--- a/src/com/android/emergency/edit/EditInfoFragment.java
+++ b/src/com/android/emergency/edit/EditInfoFragment.java
@@ -21,11 +21,11 @@
 import android.content.SharedPreferences;
 import android.net.Uri;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -52,9 +52,8 @@
     private EmergencyContactsPreference mEmergencyContactsPreferenceCategory;
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        addPreferencesFromResource(R.xml.edit_emergency_info);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.edit_emergency_info, rootKey);
 
         for (String preferenceKey : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) {
             Preference preference = findPreference(preferenceKey);
diff --git a/src/com/android/emergency/edit/EditMedicalInfoActivity.java b/src/com/android/emergency/edit/EditMedicalInfoActivity.java
index fc2686d..cd938b1 100644
--- a/src/com/android/emergency/edit/EditMedicalInfoActivity.java
+++ b/src/com/android/emergency/edit/EditMedicalInfoActivity.java
@@ -16,6 +16,7 @@
 package com.android.emergency.edit;
 
 import android.app.Activity;
+import android.app.Fragment;
 import android.os.Bundle;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -27,10 +28,16 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mEditInfoFragment = new EditMedicalInfoFragment();
-        getFragmentManager().beginTransaction()
-            .replace(android.R.id.content, mEditInfoFragment)
-            .commit();
+        // We only add a new EditInfoFragment if no fragment is restored.
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        if (fragment == null) {
+            mEditInfoFragment = new EditMedicalInfoFragment();
+            getFragmentManager().beginTransaction()
+                .add(android.R.id.content, mEditInfoFragment)
+                .commit();
+        } else {
+            mEditInfoFragment = (EditMedicalInfoFragment) fragment;
+        }
     }
 
     @VisibleForTesting
diff --git a/src/com/android/emergency/edit/EditMedicalInfoFragment.java b/src/com/android/emergency/edit/EditMedicalInfoFragment.java
index 78d2cc6..b79163b 100644
--- a/src/com/android/emergency/edit/EditMedicalInfoFragment.java
+++ b/src/com/android/emergency/edit/EditMedicalInfoFragment.java
@@ -15,15 +15,17 @@
  */
 package com.android.emergency.edit;
 
+import android.app.DialogFragment;
 import android.app.Fragment;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 
 import com.android.emergency.PreferenceKeys;
 import com.android.emergency.R;
 import com.android.emergency.ReloadablePreferenceInterface;
+import com.android.emergency.preferences.AutoCompleteEditTextPreference;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
@@ -32,10 +34,8 @@
  */
 public class EditMedicalInfoFragment extends PreferenceFragment {
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        addPreferencesFromResource(R.xml.edit_medical_info);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.edit_medical_info, rootKey);
 
         for (int i = 0; i < PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO.length; i++) {
             final int index = i;
@@ -63,6 +63,19 @@
         reloadFromPreference();
     }
 
+    @Override
+    public void onDisplayPreferenceDialog(Preference preference) {
+        if (!(preference instanceof AutoCompleteEditTextPreference)) {
+            super.onDisplayPreferenceDialog(preference);
+            return;
+        }
+        DialogFragment fragment =
+                AutoCompleteEditTextPreference.AutoCompleteEditTextPreferenceDialogFragment
+                        .newInstance(preference.getKey());
+        fragment.setTargetFragment(this, 0);
+        fragment.show(getFragmentManager(), "dialog_preference");
+    }
+
     /** Reloads all the preferences by reading the value from the shared preferences. */
     public void reloadFromPreference() {
         for (String preferenceKey : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) {
diff --git a/src/com/android/emergency/preferences/AutoCompleteEditTextPreference.java b/src/com/android/emergency/preferences/AutoCompleteEditTextPreference.java
index 6e9491d..3796c94 100644
--- a/src/com/android/emergency/preferences/AutoCompleteEditTextPreference.java
+++ b/src/com/android/emergency/preferences/AutoCompleteEditTextPreference.java
@@ -23,7 +23,7 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.preference.DialogPreference;
+import android.support.v14.preference.PreferenceDialogFragment;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
@@ -38,12 +38,15 @@
 
 import com.android.emergency.R;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.CustomDialogPreference;
 
 /**
  * Almost a copy of EditTextPreference that shows a {@link AutoCompleteTextView} instead of the
  * basic EditText. It always show the suggested options.
+ * TODO: an EditTextPreference always shows the soft input keyboard, whereas this class does not,
+ * and it should, to mimic EditTextPreference better.
  */
-public class AutoCompleteEditTextPreference extends DialogPreference {
+public class AutoCompleteEditTextPreference extends CustomDialogPreference {
     /**
      * The edit text shown in the dialog.
      */
@@ -118,13 +121,6 @@
         }
     }
 
-    @Override
-    public void showDialog(Bundle state) {
-        super.showDialog(state);
-        Window window = getDialog().getWindow();
-        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-    }
-
     @VisibleForTesting
     @Override
     public void onClick() {
@@ -285,4 +281,11 @@
         }
     }
 
+    public static class AutoCompleteEditTextPreferenceDialogFragment
+            extends CustomDialogPreference.CustomPreferenceDialogFragment {
+        public static CustomDialogPreference.CustomPreferenceDialogFragment
+                newInstance(String key) {
+            return CustomDialogPreference.CustomPreferenceDialogFragment.newInstance(key);
+        }
+    }
 }
diff --git a/src/com/android/emergency/preferences/ContactPreference.java b/src/com/android/emergency/preferences/ContactPreference.java
index 7194b5e..a543ae0 100644
--- a/src/com/android/emergency/preferences/ContactPreference.java
+++ b/src/com/android/emergency/preferences/ContactPreference.java
@@ -28,11 +28,13 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.preference.Preference;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
+import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
 import android.widget.Toast;
@@ -90,6 +92,11 @@
         EmergencyContactManager.Contact getContact(Context context, Uri phoneUri);
     }
 
+    public ContactPreference(Context context, AttributeSet attributes) {
+        super(context, attributes);
+        mContactFactory = DEFAULT_CONTACT_FACTORY;
+    }
+
     /**
      * Instantiates a ContactPreference that displays an emergency contact, taking in a Context and
      * the Uri.
@@ -178,9 +185,9 @@
     }
 
     @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
-        View deleteContactIcon = view.findViewById(R.id.delete_contact);
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        View deleteContactIcon = holder.findViewById(R.id.delete_contact);
         if (mRemoveContactPreferenceListener == null) {
             deleteContactIcon.setVisibility(View.GONE);
         } else {
diff --git a/src/com/android/emergency/preferences/EmergencyContactsPreference.java b/src/com/android/emergency/preferences/EmergencyContactsPreference.java
index ff9d0ca..570ba08 100644
--- a/src/com/android/emergency/preferences/EmergencyContactsPreference.java
+++ b/src/com/android/emergency/preferences/EmergencyContactsPreference.java
@@ -19,10 +19,10 @@
 import android.content.SharedPreferences;
 import android.content.res.TypedArray;
 import android.net.Uri;
-import android.preference.Preference;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceManager;
 import android.support.annotation.NonNull;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceManager;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.Toast;
@@ -242,9 +242,10 @@
             return super.getPersistedString(defaultReturnValue);
         } catch (ClassCastException e) {
             // Protect against b/28194605: We used to store the contacts using a string set.
-            // If it is a string set, ignore its value. If it is not a string set it will throw
-            // a ClassCastException
-            getPersistedStringSet(Collections.<String>emptySet());
+            // If it was a string set, a ClassCastException would have been thrown, and we can
+            // ignore its value. If it is stored as a value of another type, we are potentially
+            // squelching an exception here, but returning the default return value seems reasonable
+            // in either case.
             return defaultReturnValue;
         }
     }
diff --git a/src/com/android/emergency/preferences/EmergencyEditTextPreference.java b/src/com/android/emergency/preferences/EmergencyEditTextPreference.java
index 54b4c02..fb09eea 100644
--- a/src/com/android/emergency/preferences/EmergencyEditTextPreference.java
+++ b/src/com/android/emergency/preferences/EmergencyEditTextPreference.java
@@ -16,18 +16,19 @@
 package com.android.emergency.preferences;
 
 import android.content.Context;
-import android.preference.EditTextPreference;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.TextView;
 
 import com.android.emergency.ReloadablePreferenceInterface;
+import com.android.settingslib.CustomEditTextPreference;
 
 /**
  * Custom {@link EditTextPreference} that allows us to refresh and update the summary.
  */
-public class EmergencyEditTextPreference extends EditTextPreference
+public class EmergencyEditTextPreference extends CustomEditTextPreference
         implements ReloadablePreferenceInterface {
 
     private static final int MAX_LINES = 50;
@@ -53,9 +54,9 @@
     }
 
     @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
-        final TextView summaryView = (TextView) view.findViewById(
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        final TextView summaryView = (TextView) holder.findViewById(
                 com.android.internal.R.id.summary);
         summaryView.setMaxLines(MAX_LINES);
     }
@@ -63,6 +64,6 @@
     @Override
     protected void onBindDialogView(View view) {
         super.onBindDialogView(view);
-	getEditText().setSelection(getEditText().getText().length());
+        getEditText().setSelection(getEditText().getText().length());
     }
 }
diff --git a/src/com/android/emergency/preferences/EmergencyListPreference.java b/src/com/android/emergency/preferences/EmergencyListPreference.java
index 6fbab1f..9b3b94a 100644
--- a/src/com/android/emergency/preferences/EmergencyListPreference.java
+++ b/src/com/android/emergency/preferences/EmergencyListPreference.java
@@ -17,8 +17,8 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
-import android.preference.ListPreference;
 import android.support.annotation.Nullable;
+import android.support.v7.preference.ListPreference;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.TextUtils;
diff --git a/src/com/android/emergency/preferences/ViewEmergencyContactsPreference.java b/src/com/android/emergency/preferences/ViewEmergencyContactsPreference.java
index e7ed86f..e0d0a6a 100644
--- a/src/com/android/emergency/preferences/ViewEmergencyContactsPreference.java
+++ b/src/com/android/emergency/preferences/ViewEmergencyContactsPreference.java
@@ -16,7 +16,7 @@
 package com.android.emergency.preferences;
 
 import android.content.Context;
-import android.preference.Preference;
+import android.support.v7.preference.Preference;
 import android.util.AttributeSet;
 
 /**
diff --git a/src/com/android/emergency/view/ViewEmergencyContactsFragment.java b/src/com/android/emergency/view/ViewEmergencyContactsFragment.java
index 58eebef..7547100 100644
--- a/src/com/android/emergency/view/ViewEmergencyContactsFragment.java
+++ b/src/com/android/emergency/view/ViewEmergencyContactsFragment.java
@@ -19,8 +19,8 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceManager;
 import android.widget.ListView;
 
 import com.android.emergency.PreferenceKeys;
@@ -37,23 +37,13 @@
     private EmergencyContactsPreference mEmergencyContactsPreference;
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         addPreferencesFromResource(R.xml.view_emergency_contacts);
         mEmergencyContactsPreference = (EmergencyContactsPreference)
                 findPreference(PreferenceKeys.KEY_EMERGENCY_CONTACTS);
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        // Set custom dividers
-        ListView list = (ListView) getView().findViewById(android.R.id.list);
-        list.setDivider(getResources().getDrawable(R.drawable.view_contact_divider));
-    }
-
-
-    @Override
     public void onResume() {
         super.onResume();
         mEmergencyContactsPreference.reloadFromPreference();
diff --git a/src/com/android/emergency/view/ViewEmergencyInfoFragment.java b/src/com/android/emergency/view/ViewEmergencyInfoFragment.java
index b46ccb5..d3eef03 100644
--- a/src/com/android/emergency/view/ViewEmergencyInfoFragment.java
+++ b/src/com/android/emergency/view/ViewEmergencyInfoFragment.java
@@ -19,9 +19,9 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceManager;
 import android.text.TextUtils;
 
 import com.android.emergency.PreferenceKeys;
@@ -39,9 +39,8 @@
     private final List<Preference> mPreferences = new ArrayList<Preference>();
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        addPreferencesFromResource(R.xml.view_emergency_info);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.view_emergency_info, rootKey);
 
         for (String preferenceKey : PreferenceKeys.KEYS_VIEW_EMERGENCY_INFO) {
             Preference preference = findPreference(preferenceKey);
diff --git a/src/com/android/emergency/view/ViewInfoActivity.java b/src/com/android/emergency/view/ViewInfoActivity.java
index f3dceda..74ca006 100644
--- a/src/com/android/emergency/view/ViewInfoActivity.java
+++ b/src/com/android/emergency/view/ViewInfoActivity.java
@@ -21,13 +21,13 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.support.annotation.LayoutRes;
 import android.support.design.widget.TabLayout;
 import android.support.design.widget.TabLayout.TabLayoutOnPageChangeListener;
 import android.support.design.widget.TabLayout.ViewPagerOnTabSelectedListener;
 import android.support.v13.app.FragmentStatePagerAdapter;
 import android.support.v4.view.ViewPager;
+import android.support.v7.preference.PreferenceManager;
 import android.text.TextUtils;
 import android.util.Pair;
 import android.view.Menu;
diff --git a/tests/robolectric/Android.mk b/tests/robolectric/Android.mk
index 88a864c..95dc47d 100644
--- a/tests/robolectric/Android.mk
+++ b/tests/robolectric/Android.mk
@@ -23,6 +23,7 @@
     sdk_vcurrent
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
+    android-support-v7-preference \
     platform-system-robolectric \
     truth-prebuilt \
     emergencyinfo-test-common
diff --git a/tests/robolectric/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java b/tests/robolectric/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
index b13e4c3..6cc07c0 100644
--- a/tests/robolectric/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
+++ b/tests/robolectric/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
@@ -29,9 +29,9 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.net.Uri;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceScreen;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.emergency.ContactTestUtils;
diff --git a/tests/robolectric/src/com/android/emergency/preferences/EmergencyEditTextPreferenceTest.java b/tests/robolectric/src/com/android/emergency/preferences/EmergencyEditTextPreferenceTest.java
index 57d4642..ca3f0c3 100644
--- a/tests/robolectric/src/com/android/emergency/preferences/EmergencyEditTextPreferenceTest.java
+++ b/tests/robolectric/src/com/android/emergency/preferences/EmergencyEditTextPreferenceTest.java
@@ -23,9 +23,9 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceScreen;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.emergency.PreferenceKeys;
diff --git a/tests/robolectric/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java b/tests/robolectric/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
index 94b631d..124d569 100644
--- a/tests/robolectric/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
+++ b/tests/robolectric/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
@@ -25,9 +25,9 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceScreen;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.TextUtils;
 
diff --git a/tests/robolectric/src/com/android/emergency/preferences/NameAutoCompletePreferenceTest.java b/tests/robolectric/src/com/android/emergency/preferences/NameAutoCompletePreferenceTest.java
index aec3ced..e5b85c5 100644
--- a/tests/robolectric/src/com/android/emergency/preferences/NameAutoCompletePreferenceTest.java
+++ b/tests/robolectric/src/com/android/emergency/preferences/NameAutoCompletePreferenceTest.java
@@ -23,9 +23,9 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceScreen;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.widget.AutoCompleteTextView;
 
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index 4bf6b55..77edbc0 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -24,7 +24,8 @@
     emergencyinfo-test-common \
     espresso-core \
     legacy-android-test \
-    truth-prebuilt
+    truth-prebuilt \
+    ub-uiautomator
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/unit/src/com/android/emergency/edit/EditInfoActivityTest.java b/tests/unit/src/com/android/emergency/edit/EditInfoActivityTest.java
index f4287af..195a0bc 100644
--- a/tests/unit/src/com/android/emergency/edit/EditInfoActivityTest.java
+++ b/tests/unit/src/com/android/emergency/edit/EditInfoActivityTest.java
@@ -28,12 +28,12 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.Uri;
-import android.preference.Preference;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
-import android.support.test.runner.AndroidJUnit4;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
 
 import com.android.emergency.ContactTestUtils;
 import com.android.emergency.PreferenceKeys;
diff --git a/tests/unit/src/com/android/emergency/edit/EditMedicalInfoActivityTest.java b/tests/unit/src/com/android/emergency/edit/EditMedicalInfoActivityTest.java
new file mode 100644
index 0000000..c6ce238
--- /dev/null
+++ b/tests/unit/src/com/android/emergency/edit/EditMedicalInfoActivityTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.emergency.edit;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+import android.view.Surface;
+
+import com.android.emergency.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit tests for {@link EditMedicalInfoActivity}. */
+@RunWith(AndroidJUnit4.class)
+public final class EditMedicalInfoActivityTest {
+    private Instrumentation mInstrumentation;
+    private Context mTargetContext;
+    private UiDevice mDevice;
+    private int mInitialRotation;
+
+    @Before
+    public void setUp() {
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mTargetContext = mInstrumentation.getTargetContext();
+        mDevice = UiDevice.getInstance(mInstrumentation);
+        mInitialRotation = mDevice.getDisplayRotation();
+    }
+
+    @After
+    public void tearDown() {
+        // Restore orientation prior to starting test.
+        try {
+            switch (mInitialRotation) {
+                case Surface.ROTATION_90:
+                    mDevice.setOrientationRight();
+                    break;
+                case Surface.ROTATION_270:
+                    mDevice.setOrientationLeft();
+                    break;
+                default:
+                    mDevice.setOrientationNatural();
+                    break;
+            }
+        } catch (Exception e) {
+            // Squelch and move along.
+        }
+    }
+
+    @Test
+    public void testRotate_editNameDialogOpen_shouldNotCrash() throws Exception {
+        final Intent editActivityIntent = new Intent(mTargetContext, EditMedicalInfoActivity.class);
+        EditMedicalInfoActivity activity =
+                (EditMedicalInfoActivity) mInstrumentation.startActivitySync(editActivityIntent);
+        EditMedicalInfoFragment fragment = activity.getFragment();
+
+        // Click on the Name field to pop up the name edit dialog.
+        onView(withText(R.string.name)).perform(click());
+
+        // Rotate the device.
+        mDevice.setOrientationLeft();
+        mDevice.setOrientationNatural();
+        mDevice.setOrientationRight();
+    }
+}
diff --git a/tests/unit/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java b/tests/unit/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
index f79964f..5b451de 100644
--- a/tests/unit/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
+++ b/tests/unit/src/com/android/emergency/preferences/EmergencyContactsPreferenceTest.java
@@ -17,6 +17,7 @@
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
 import static android.support.test.espresso.matcher.ViewMatchers.withText;
 import static com.google.common.truth.Truth.assertThat;
@@ -26,9 +27,11 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Looper;
-import android.preference.PreferenceManager;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.UiController;
+import android.support.test.espresso.ViewAction;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.preference.PreferenceManager;
 import android.view.View;
 
 import com.android.emergency.ContactTestUtils;
@@ -37,6 +40,7 @@
 import com.android.emergency.edit.EditInfoActivity;
 import com.android.emergency.edit.EditInfoFragment;
 
+import org.hamcrest.Matcher;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -92,7 +96,7 @@
         assertThat(mPreference.getEmergencyContacts()).hasSize(1);
         assertThat(mPreference.getPreferenceCount()).isEqualTo(1);
 
-        onView(withId(R.id.delete_contact)).perform(click());
+        onView(withId(R.id.delete_contact)).perform(new RelaxedClick());
         onView(withText(R.string.remove)).perform(click());
 
         assertThat(mPreference.getEmergencyContacts()).isEmpty();
@@ -104,7 +108,7 @@
         assertThat(mPreference.getEmergencyContacts()).hasSize(1);
         assertThat(mPreference.getPreferenceCount()).isEqualTo(1);
 
-        onView(withId(R.id.delete_contact)).perform(click());
+        onView(withId(R.id.delete_contact)).perform(new RelaxedClick());
         onView(withText(android.R.string.cancel)).perform(click());
 
         assertThat(mPreference.getEmergencyContacts()).hasSize(1);
@@ -120,4 +124,23 @@
         return (EmergencyContactsPreference) fragment.findPreference(
                 PreferenceKeys.KEY_EMERGENCY_CONTACTS);
     }
+
+    /** ViewAction that allows a click even when the UI is partially obscured. */
+    private static class RelaxedClick implements ViewAction {
+        @Override
+        public Matcher<View> getConstraints() {
+            // No constraints, the caller ensures them.
+            return isEnabled();
+        }
+
+        @Override
+        public String getDescription() {
+            return "single click, no constraints!";
+        }
+
+        @Override
+        public void perform(UiController uiController, View view) {
+            view.performClick();
+        }
+    }
 }
diff --git a/tests/unit/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java b/tests/unit/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
index bd35342..7323568 100644
--- a/tests/unit/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
+++ b/tests/unit/src/com/android/emergency/preferences/EmergencyListPreferenceTest.java
@@ -20,9 +20,9 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.content.Intent;
-import android.preference.PreferenceManager;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.preference.PreferenceManager;
 import android.text.SpannableString;
 import android.text.style.TtsSpan;
 
diff --git a/tests/unit/src/com/android/emergency/view/ViewInfoActivityTest.java b/tests/unit/src/com/android/emergency/view/ViewInfoActivityTest.java
index e27e526..ab1c128 100644
--- a/tests/unit/src/com/android/emergency/view/ViewInfoActivityTest.java
+++ b/tests/unit/src/com/android/emergency/view/ViewInfoActivityTest.java
@@ -21,10 +21,12 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.content.Intent;
-import android.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceManager;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
 import android.util.Pair;
+import android.view.Surface;
 import android.view.View;
 import android.widget.TextView;
 import android.widget.ViewFlipper;
@@ -46,16 +48,36 @@
 public class ViewInfoActivityTest {
     private Instrumentation mInstrumentation;
     private Context mTargetContext;
+    private UiDevice mDevice;
+    private int mInitialRotation;
     private ViewInfoActivity mActivity;
 
     @Before
     public void setUp() {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mTargetContext = mInstrumentation.getTargetContext();
+        mDevice = UiDevice.getInstance(mInstrumentation);
+        mInitialRotation = mDevice.getDisplayRotation();
     }
 
     @After
     public void tearDown() {
+        // Restore orientation prior to starting test.
+        try {
+            switch (mInitialRotation) {
+                case Surface.ROTATION_90:
+                    mDevice.setOrientationRight();
+                    break;
+                case Surface.ROTATION_270:
+                    mDevice.setOrientationLeft();
+                    break;
+                default:
+                    mDevice.setOrientationNatural();
+                    break;
+            }
+        } catch (Exception e) {
+            // Squelch and move along.
+        }
         PreferenceManager.getDefaultSharedPreferences(mTargetContext).edit().clear().commit();
     }
 
@@ -188,6 +210,16 @@
         editInfoActivity.finish();
     }
 
+    @Test
+    public void testRotate_shouldNotCrash() throws Exception {
+        ViewInfoActivity activity = startViewInfoActivity();
+
+        // Rotate the device.
+        mDevice.setOrientationLeft();
+        mDevice.setOrientationNatural();
+        mDevice.setOrientationRight();
+    }
+
     private ViewInfoActivity startViewInfoActivity() {
         final Intent viewActivityIntent = new Intent(mTargetContext, ViewInfoActivity.class);
         return (ViewInfoActivity) mInstrumentation.startActivitySync(viewActivityIntent);