[Panlingual] Do not show dialog in recycle. Set LocaleEditor as the

parent fragment and control the dialog.

Keep the dialog and the locale list after rotation

Bug: 279527362
Change-Id: I349fd9d0fea5b43a8bbb2a23fa60fc4c5436c5cf
Test: make RunSettingsRoboTests -j128 ROBOTEST_FILTER=LocaleListEditorTest
Test: atest LocaleDialogFragmentTest
This commit is contained in:
Zoey Chen
2023-05-02 08:47:51 +00:00
parent d2e8495f4c
commit fb6b6b0bcc
6 changed files with 266 additions and 168 deletions

View File

@@ -18,19 +18,32 @@ package com.android.settings.localepicker;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import android.app.IActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.LocaleList;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.android.internal.app.LocaleStore;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowActivityManager;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import org.junit.After;
@@ -45,22 +58,42 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowAlertDialogCompat.class)
@Config(shadows = {ShadowAlertDialogCompat.class, ShadowActivityManager.class})
public class LocaleListEditorTest {
private static final String ARG_DIALOG_TYPE = "arg_dialog_type";
private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default";
private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale";
private static final int DIALOG_CONFIRM_SYSTEM_DEFAULT = 1;
private static final int REQUEST_CONFIRM_SYSTEM_DEFAULT = 1;
private LocaleListEditor mLocaleListEditor;
private Context mContext;
private FragmentActivity mActivity;
private List mLocaleList;
private Intent mIntent = new Intent();
@Mock
private LocaleDragAndDropAdapter mAdapter;
@Mock
private LocaleStore.LocaleInfo mLocaleInfo;
@Mock
private FragmentManager mFragmentManager;
@Mock
private FragmentTransaction mFragmentTransaction;
@Mock
private View mView;
@Mock
private IActivityManager mActivityService;
@Before
public void setUp() {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mLocaleListEditor = spy(new LocaleListEditor());
@@ -74,6 +107,8 @@ public class LocaleListEditorTest {
ReflectionHelpers.setField(mLocaleListEditor, "mUserManager",
RuntimeEnvironment.application.getSystemService(Context.USER_SERVICE));
ReflectionHelpers.setField(mLocaleListEditor, "mAdapter", mAdapter);
ReflectionHelpers.setField(mLocaleListEditor, "mFragmentManager", mFragmentManager);
when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
FakeFeatureFactory.setupForTest();
}
@@ -174,4 +209,65 @@ public class LocaleListEditorTest {
assertThat(result.getLocale().getUnicodeLocaleType("fw")).isEqualTo("wed");
assertThat(result.getLocale().getUnicodeLocaleType("mu")).isEqualTo("celsius");
}
@Test
public void onActivityResult_ResultCodeIsOk_showNotAvailableDialog() {
Bundle bundle = new Bundle();
bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
mIntent.putExtras(bundle);
setUpLocaleConditions();
mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_OK,
mIntent);
verify(mFragmentTransaction).add(any(LocaleDialogFragment.class),
eq(TAG_DIALOG_NOT_AVAILABLE));
}
@Test
public void onActivityResult_ResultCodeIsCancel_notifyAdapterListChanged() {
Bundle bundle = new Bundle();
bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
mIntent.putExtras(bundle);
setUpLocaleConditions();
mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_CANCELED,
mIntent);
verify(mAdapter).notifyListChanged(mLocaleInfo);
}
@Test
public void onTouch_dragDifferentLocaleToTop_showConfirmDialog() throws Exception {
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
setUpLocaleConditions();
final Configuration config = new Configuration();
config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US")));
when(mActivityService.getConfiguration()).thenReturn(config);
when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
mLocaleListEditor.onTouch(mView, event);
verify(mFragmentTransaction).add(any(LocaleDialogFragment.class),
eq(TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT));
}
@Test
public void onTouch_dragSameLocaleToTop_updateAdapter() throws Exception {
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
setUpLocaleConditions();
final Configuration config = new Configuration();
config.setLocales((LocaleList.forLanguageTags("en-US,zh-TW")));
when(mActivityService.getConfiguration()).thenReturn(config);
when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
mLocaleListEditor.onTouch(mView, event);
verify(mAdapter).doTheUpdate();
}
private void setUpLocaleConditions() {
ShadowActivityManager.setService(mActivityService);
mLocaleList = new ArrayList<>();
mLocaleList.add(mLocaleInfo);
when(mLocaleInfo.getFullNameNative()).thenReturn("English");
when(mLocaleInfo.getLocale()).thenReturn(LocaleList.forLanguageTags("en-US").get(0));
when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
}
}

View File

@@ -17,8 +17,8 @@
package com.android.settings.localepicker;
import static com.android.settings.localepicker.LocaleDialogFragment.ARG_DIALOG_TYPE;
import static com.android.settings.localepicker.LocaleDialogFragment.ARG_RESULT_RECEIVER;
import static com.android.settings.localepicker.LocaleDialogFragment.ARG_TARGET_LOCALE;
import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -27,12 +27,9 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.ResultReceiver;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
@@ -55,6 +52,7 @@ public class LocaleDialogFragmentTest {
public final MockitoRule mockito = MockitoJUnit.rule();
private Context mContext;
private LocaleListEditor mLocaleListEditor;
private LocaleDialogFragment mDialogFragment;
private FakeFeatureFactory mFeatureFactory;
@@ -62,30 +60,30 @@ public class LocaleDialogFragmentTest {
public void setUp() throws Exception {
mContext = ApplicationProvider.getApplicationContext();
mDialogFragment = new LocaleDialogFragment();
mLocaleListEditor = spy(new LocaleListEditor());
mFeatureFactory = FakeFeatureFactory.setupForTest();
}
private void setArgument(
int type, ResultReceiver receiver) {
private void setArgument(int type) {
LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(Locale.ENGLISH);
Bundle args = new Bundle();
args.putInt(ARG_DIALOG_TYPE, type);
args.putSerializable(ARG_TARGET_LOCALE, localeInfo);
args.putParcelable(ARG_RESULT_RECEIVER, receiver);
mDialogFragment.setArguments(args);
}
@Test
public void getDialogContent_confirmSystemDefault_has2ButtonText() {
setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, null);
setArgument(DIALOG_CONFIRM_SYSTEM_DEFAULT);
LocaleDialogFragment.LocaleDialogController controller =
new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment);
mDialogFragment.getLocaleDialogController(mContext, mDialogFragment,
mLocaleListEditor);
LocaleDialogFragment.LocaleDialogController.DialogContent dialogContent =
controller.getDialogContent();
assertEquals(ResourcesUtils.getResourcesString(
mContext, "button_label_confirmation_of_system_locale_change"),
mContext, "button_label_confirmation_of_system_locale_change"),
dialogContent.mPositiveButton);
assertEquals(ResourcesUtils.getResourcesString(mContext, "cancel"),
dialogContent.mNegativeButton);
@@ -93,9 +91,10 @@ public class LocaleDialogFragmentTest {
@Test
public void getDialogContent_unavailableLocale_has1ButtonText() {
setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE, null);
setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE);
LocaleDialogFragment.LocaleDialogController controller =
new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment);
mDialogFragment.getLocaleDialogController(mContext, mDialogFragment,
mLocaleListEditor);
LocaleDialogFragment.LocaleDialogController.DialogContent dialogContent =
controller.getDialogContent();
@@ -105,38 +104,9 @@ public class LocaleDialogFragmentTest {
assertTrue(dialogContent.mNegativeButton.isEmpty());
}
@Test
public void onClick_clickPositiveButton_sendOK() {
ResultReceiver resultReceiver = spy(new ResultReceiver(null));
setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, resultReceiver);
LocaleDialogFragment.LocaleDialogController controller =
new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment);
controller.onClick(null, DialogInterface.BUTTON_POSITIVE);
verify(resultReceiver).send(eq(Activity.RESULT_OK), any());
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE, true);
}
@Test
public void onClick_clickNegativeButton_sendCancel() {
ResultReceiver resultReceiver = spy(new ResultReceiver(null));
setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, resultReceiver);
LocaleDialogFragment.LocaleDialogController controller =
new LocaleDialogFragment.LocaleDialogController(mContext, mDialogFragment);
controller.onClick(null, DialogInterface.BUTTON_NEGATIVE);
verify(resultReceiver).send(eq(Activity.RESULT_CANCELED), any());
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE, false);
}
@Test
public void getMetricsCategory_systemLocaleChange() {
setArgument(LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT, null);
setArgument(DIALOG_CONFIRM_SYSTEM_DEFAULT);
int result = mDialogFragment.getMetricsCategory();
assertEquals(SettingsEnums.DIALOG_SYSTEM_LOCALE_CHANGE, result);
@@ -144,8 +114,7 @@ public class LocaleDialogFragmentTest {
@Test
public void getMetricsCategory_unavailableLocale() {
setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE, null);
setArgument(LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE);
int result = mDialogFragment.getMetricsCategory();
assertEquals(SettingsEnums.DIALOG_SYSTEM_LOCALE_UNAVAILABLE, result);