diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index 3d7976ab624..f703c83d8a7 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -395,10 +395,13 @@ class LocaleDragAndDropAdapter // drag locale's original position to the top. mDragLocale = (LocaleStore.LocaleInfo) savedInstanceState.getSerializable( CFGKEY_DRAG_LOCALE); - mFeedItemList.removeIf( - localeInfo -> TextUtils.equals(localeInfo.getId(), mDragLocale.getId())); - mFeedItemList.add(0, mDragLocale); - notifyItemRangeChanged(0, mFeedItemList.size()); + if (mDragLocale != null) { + mFeedItemList.removeIf( + localeInfo -> TextUtils.equals(localeInfo.getId(), + mDragLocale.getId())); + mFeedItemList.add(0, mDragLocale); + notifyItemRangeChanged(0, mFeedItemList.size()); + } } } } diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java index dfdb9428f9c..65563ada1bc 100644 --- a/src/com/android/settings/localepicker/LocaleListEditor.java +++ b/src/com/android/settings/localepicker/LocaleListEditor.java @@ -322,7 +322,13 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View // to remove. mRemoveMode = false; mShowingRemoveDialog = false; + LocaleStore.LocaleInfo firstLocale = + mAdapter.getFeedItemList().get(0); mAdapter.removeChecked(); + boolean isFirstRemoved = + firstLocale != mAdapter.getFeedItemList().get(0); + showConfirmDialog(isFirstRemoved, isFirstRemoved ? firstLocale + : mAdapter.getFeedItemList().get(0)); setRemoveMode(false); } }) @@ -388,22 +394,27 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - LocaleStore.LocaleInfo localeInfo = mAdapter.getFeedItemList().get(0); - if (!localeInfo.getLocale().equals(LocalePicker.getLocales().get(0))) { - final LocaleDialogFragment localeDialogFragment = - LocaleDialogFragment.newInstance(); - Bundle args = new Bundle(); - args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); - args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, localeInfo); - localeDialogFragment.setArguments(args); - localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT); - } else { - mAdapter.doTheUpdate(); - } + showConfirmDialog(false, mAdapter.getFeedItemList().get(0)); } return false; } + private void showConfirmDialog(boolean isFirstRemoved, LocaleStore.LocaleInfo localeInfo) { + Locale currentSystemLocale = LocalePicker.getLocales().get(0); + if (!localeInfo.getLocale().equals(currentSystemLocale)) { + final LocaleDialogFragment localeDialogFragment = + LocaleDialogFragment.newInstance(); + Bundle args = new Bundle(); + args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT); + args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, + isFirstRemoved ? LocaleStore.getLocaleInfo(currentSystemLocale) : localeInfo); + localeDialogFragment.setArguments(args); + localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT); + } else { + mAdapter.doTheUpdate(); + } + } + // Hide the "Remove" menu if there is only one locale in the list, show it otherwise // This is called when the menu is first created, and then one add / remove locale private void updateVisibilityOfRemoveMenu() { diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java index 16d51beca64..5a529f832e5 100644 --- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.app.IActivityManager; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; @@ -57,6 +58,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import java.util.ArrayList; import java.util.List; @@ -91,6 +93,8 @@ public class LocaleListEditorTest { private View mView; @Mock private IActivityManager mActivityService; + @Mock + private MetricsFeatureProvider mMetricsFeatureProvider; @Before public void setUp() throws Exception { @@ -108,6 +112,8 @@ public class LocaleListEditorTest { RuntimeEnvironment.application.getSystemService(Context.USER_SERVICE)); ReflectionHelpers.setField(mLocaleListEditor, "mAdapter", mAdapter); ReflectionHelpers.setField(mLocaleListEditor, "mFragmentManager", mFragmentManager); + ReflectionHelpers.setField(mLocaleListEditor, "mMetricsFeatureProvider", + mMetricsFeatureProvider); when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction); FakeFeatureFactory.setupForTest(); } @@ -199,6 +205,38 @@ public class LocaleListEditorTest { assertThat(shadowDialog.getMessage()).isNull(); } + @Test + public void showConfirmDialog_systemLocaleSelected_shouldShowLocaleChangeDialog() + throws Exception { + //pre-condition + setUpLocaleConditions(); + final Configuration config = new Configuration(); + config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US"))); + when(mActivityService.getConfiguration()).thenReturn(config); + when(mAdapter.getFeedItemList()).thenReturn(mLocaleList); + when(mAdapter.getCheckedCount()).thenReturn(1); + when(mAdapter.getItemCount()).thenReturn(2); + when(mAdapter.isFirstLocaleChecked()).thenReturn(true); + ReflectionHelpers.setField(mLocaleListEditor, "mRemoveMode", true); + ReflectionHelpers.setField(mLocaleListEditor, "mShowingRemoveDialog", true); + + //launch the first dialog + mLocaleListEditor.showRemoveLocaleWarningDialog(); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + + assertThat(dialog).isNotNull(); + + // click the remove button + dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick(); + + assertThat(dialog.isShowing()).isFalse(); + + // check the second dialog is showing + verify(mFragmentTransaction).add(any(LocaleDialogFragment.class), + eq(TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT)); + } + @Test public void mayAppendUnicodeTags_appendUnicodeTags_success() { LocaleStore.LocaleInfo localeInfo = LocaleStore.fromLocale(Locale.forLanguageTag("en-US"));