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);