Commit 6da1f51d authored by Parastoo Geranmayeh's avatar Parastoo Geranmayeh Committed by Commit Bot

Avoid Crash for State Dropdown on Address Editor

Problem: if the state is not saved as the key (like NY), and is saved
as a complete form (New York), or is invalid (Caoldo), the assert
would fail on debug mode. On release build, the state would not show
up on the editor.

Solution: Look for both the key and the complete form. If can't find
them (invalid value), show the default or the first item.

Tests added.

Bug: 861821
Change-Id: I8eeb3679c0dd503c264014e22d8e2a6cd8ef5405
Reviewed-on: https://chromium-review.googlesource.com/1140366
Commit-Queue: Parastoo Geranmayeh <parastoog@google.com>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarGanggui Tang <gogerald@chromium.org>
Cr-Commit-Position: refs/heads/master@{#576226}
parent 304237d6
...@@ -89,14 +89,19 @@ class EditorDropdownField implements EditorFieldView { ...@@ -89,14 +89,19 @@ class EditorDropdownField implements EditorFieldView {
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
} }
// If no value is selected, we'll select the hint, which is the first item on the dropdown // If no value is selected or the value previously entered is not valid, we'll select the
// adapter. // hint, which is the first item on the dropdown adapter. We also need to check for both key
// and value, because the saved value could take both forms (as in NY or New York).
mSelectedIndex = TextUtils.isEmpty(mFieldModel.getValue()) mSelectedIndex = TextUtils.isEmpty(mFieldModel.getValue())
? 0 ? 0
: mAdapter.getPosition( : mAdapter.getPosition(mFieldModel.getValue().toString());
mFieldModel.getDropdownValueByKey((mFieldModel.getValue().toString()))); if (mSelectedIndex < 0) {
// Assuming that mFieldModel.getValue() is the value (New York).
assert mSelectedIndex >= 0; mSelectedIndex = mAdapter.getPosition(
mFieldModel.getDropdownValueByKey(mFieldModel.getValue().toString()));
}
// Invalid value in the mFieldModel
if (mSelectedIndex < 0) mSelectedIndex = 0;
mDropdown = (Spinner) mLayout.findViewById(R.id.spinner); mDropdown = (Spinner) mLayout.findViewById(R.id.spinner);
mDropdown.setTag(this); mDropdown.setTag(this);
......
...@@ -49,6 +49,14 @@ public class AutofillProfilesFragmentTest { ...@@ -49,6 +49,14 @@ public class AutofillProfilesFragmentTest {
helper.setProfile(new AutofillProfile("", "https://example.com", true, "John Doe", "Google", helper.setProfile(new AutofillProfile("", "https://example.com", true, "John Doe", "Google",
"111 Second St", "CA", "Los Angeles", "", "90291", "", "US", "650-253-0000", "111 Second St", "CA", "Los Angeles", "", "90291", "", "US", "650-253-0000",
"second@gmail.com", "en-US")); "second@gmail.com", "en-US"));
// Invalid state should not cause a crash on the state dropdown list.
helper.setProfile(new AutofillProfile("", "https://example.com", true, "Bill Doe", "Google",
"111 Third St", "XXXYYY", "Los Angeles", "", "90291", "", "US", "650-253-0000",
"third@gmail.com", "en-US"));
// Full value for state should show up correctly on the dropdown list.
helper.setProfile(new AutofillProfile("", "https://example.com", true, "Bob Doe", "Google",
"111 Fourth St", "California", "Los Angeles", "", "90291", "", "US", "650-253-0000",
"fourth@gmail.com", "en-US"));
} }
@Test @Test
...@@ -62,7 +70,7 @@ public class AutofillProfilesFragmentTest { ...@@ -62,7 +70,7 @@ public class AutofillProfilesFragmentTest {
(AutofillProfilesFragment) activity.getFragmentForTest(); (AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen. // Check the preferences on the initial screen.
Assert.assertEquals(3 /* One add button + two profiles. */, Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference addProfile = AutofillProfileEditorPreference addProfile =
...@@ -88,7 +96,7 @@ public class AutofillProfilesFragmentTest { ...@@ -88,7 +96,7 @@ public class AutofillProfilesFragmentTest {
}); });
// Check if the preferences are updated correctly. // Check if the preferences are updated correctly.
rule.waitForThePreferenceUpdate(); rule.waitForThePreferenceUpdate();
Assert.assertEquals(4 /* One add button + three profiles. */, Assert.assertEquals(6 /* One add button + five profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
AutofillProfileEditorPreference addedProfile = AutofillProfileEditorPreference addedProfile =
(AutofillProfileEditorPreference) fragment.findPreference("Alice Doe"); (AutofillProfileEditorPreference) fragment.findPreference("Alice Doe");
...@@ -108,7 +116,7 @@ public class AutofillProfilesFragmentTest { ...@@ -108,7 +116,7 @@ public class AutofillProfilesFragmentTest {
(AutofillProfilesFragment) activity.getFragmentForTest(); (AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen. // Check the preferences on the initial screen.
Assert.assertEquals(3 /* One add button + two profiles. */, Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference addProfile = AutofillProfileEditorPreference addProfile =
...@@ -129,8 +137,8 @@ public class AutofillProfilesFragmentTest { ...@@ -129,8 +137,8 @@ public class AutofillProfilesFragmentTest {
} catch (TimeoutException ex) { } catch (TimeoutException ex) {
// There should be no timeout, which means that there should be a validation // There should be no timeout, which means that there should be a validation
// error. // error.
Assert.assertTrue(false);
ex.printStackTrace(); ex.printStackTrace();
Assert.assertTrue(false);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
...@@ -150,7 +158,7 @@ public class AutofillProfilesFragmentTest { ...@@ -150,7 +158,7 @@ public class AutofillProfilesFragmentTest {
(AutofillProfilesFragment) activity.getFragmentForTest(); (AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen. // Check the preferences on the initial screen.
Assert.assertEquals(3 /* One add button + two profiles. */, Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference sebProfile = AutofillProfileEditorPreference sebProfile =
...@@ -174,7 +182,7 @@ public class AutofillProfilesFragmentTest { ...@@ -174,7 +182,7 @@ public class AutofillProfilesFragmentTest {
}); });
// Check if the preferences are updated correctly. // Check if the preferences are updated correctly.
rule.waitForThePreferenceUpdate(); rule.waitForThePreferenceUpdate();
Assert.assertEquals(2 /* One add button + one profile. */, Assert.assertEquals(4 /* One add button + three profile. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
AutofillProfileEditorPreference remainedProfile = AutofillProfileEditorPreference remainedProfile =
(AutofillProfileEditorPreference) fragment.findPreference("John Doe"); (AutofillProfileEditorPreference) fragment.findPreference("John Doe");
...@@ -196,7 +204,7 @@ public class AutofillProfilesFragmentTest { ...@@ -196,7 +204,7 @@ public class AutofillProfilesFragmentTest {
(AutofillProfilesFragment) activity.getFragmentForTest(); (AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen. // Check the preferences on the initial screen.
Assert.assertEquals(3 /* One add button + two profiles. */, Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest(); PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference johnProfile = AutofillProfileEditorPreference johnProfile =
...@@ -223,7 +231,7 @@ public class AutofillProfilesFragmentTest { ...@@ -223,7 +231,7 @@ public class AutofillProfilesFragmentTest {
}); });
// Check if the preferences are updated correctly. // Check if the preferences are updated correctly.
rule.waitForThePreferenceUpdate(); rule.waitForThePreferenceUpdate();
Assert.assertEquals(3 /* One add button + two profiles. */, Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount()); autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
AutofillProfileEditorPreference editedProfile = AutofillProfileEditorPreference editedProfile =
(AutofillProfileEditorPreference) fragment.findPreference("Emily Doe"); (AutofillProfileEditorPreference) fragment.findPreference("Emily Doe");
...@@ -235,6 +243,78 @@ public class AutofillProfilesFragmentTest { ...@@ -235,6 +243,78 @@ public class AutofillProfilesFragmentTest {
activity.finish(); activity.finish();
} }
@Test
@MediumTest
@Feature({"Preferences"})
public void testOpenProfileWithCompleteState() throws Exception {
Preferences activity =
PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
AutofillProfilesFragment.class.getName());
AutofillProfilesFragment autofillProfileFragment =
(AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen.
Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference bobProfile =
(AutofillProfileEditorPreference) fragment.findPreference("Bob Doe");
Assert.assertTrue(bobProfile != null);
Assert.assertEquals("Bob Doe", bobProfile.getTitle());
// Open the profile.
ThreadUtils.runOnUiThreadBlocking(() -> {
PreferencesTest.clickPreference(autofillProfileFragment, bobProfile);
rule.setEditorDialog(((AutofillProfileEditorPreference) bobProfile).getEditorDialog());
try {
rule.clickInEditorAndWait(R.id.editor_dialog_done_button);
} catch (Exception ex) {
ex.printStackTrace();
Assert.assertTrue(false);
}
});
rule.waitForThePreferenceUpdate();
Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
activity.finish();
}
@Test
@MediumTest
@Feature({"Preferences"})
public void testOpenProfileWithInvalidState() throws Exception {
Preferences activity =
PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
AutofillProfilesFragment.class.getName());
AutofillProfilesFragment autofillProfileFragment =
(AutofillProfilesFragment) activity.getFragmentForTest();
// Check the preferences on the initial screen.
Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
PreferenceFragment fragment = (PreferenceFragment) activity.getFragmentForTest();
AutofillProfileEditorPreference billProfile =
(AutofillProfileEditorPreference) fragment.findPreference("Bill Doe");
Assert.assertTrue(billProfile != null);
Assert.assertEquals("Bill Doe", billProfile.getTitle());
// Open the profile.
ThreadUtils.runOnUiThreadBlocking(() -> {
PreferencesTest.clickPreference(autofillProfileFragment, billProfile);
rule.setEditorDialog(((AutofillProfileEditorPreference) billProfile).getEditorDialog());
try {
rule.clickInEditorAndWait(R.id.editor_dialog_done_button);
} catch (Exception ex) {
ex.printStackTrace();
Assert.assertTrue(false);
}
});
// Check if the preferences are updated correctly.
rule.waitForThePreferenceUpdate();
Assert.assertEquals(5 /* One add button + four profiles. */,
autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
}
@Test @Test
@MediumTest @MediumTest
@Feature({"Preferences"}) @Feature({"Preferences"})
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment