Bidi wrap keyboard names before displaying them.

This is needed because keyboard names can contain characters from mixed
locale. Without Bidi wrapping the labels will be garbled and not
readable.

Change-Id: I47668a65d7bef8828ad0424097834929ec12700d
Fix: 37353900
Test: make RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-04-20 11:01:32 -07:00
parent 552fc2922a
commit b1bdf90c35
2 changed files with 41 additions and 2 deletions

View File

@@ -20,6 +20,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.text.BidiFormatter;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
@@ -76,12 +77,15 @@ public class VirtualKeyboardPreferenceController extends PreferenceController {
return; return;
} }
final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
String summary = null; String summary = null;
for (String label : labels) { for (String label : labels) {
if (summary == null) { if (summary == null) {
summary = label; summary = bidiFormatter.unicodeWrap(label);
} else { } else {
summary = mContext.getString(R.string.join_many_items_middle, summary, label); summary = mContext.getString(R.string.join_many_items_middle, summary,
bidiFormatter.unicodeWrap(label));
} }
} }
preference.setSummary(summary); preference.setSummary(summary);

View File

@@ -18,6 +18,8 @@ package com.android.settings.inputmethod;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -26,6 +28,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.support.v4.text.BidiFormatter;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
@@ -39,6 +42,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.ArrayList; import java.util.ArrayList;
@@ -96,4 +100,35 @@ public class VirtualKeyboardPreferenceControllerTest {
verify(mPreference).setSummary("label"); verify(mPreference).setSummary("label");
} }
@Test
public void updateState_multiImeWithMixedLocale_setImeLabelToSummary() {
final BidiFormatter formatter = BidiFormatter.getInstance();
final ComponentName componentName = new ComponentName("pkg", "cls");
final List<InputMethodInfo> imis = new ArrayList<>();
final String label1 = "label";
final String label2 = "Keyboard מִקְלֶדֶת";
imis.add(mock(InputMethodInfo.class));
imis.add(mock(InputMethodInfo.class));
when(mDpm.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
when(mImm.getEnabledInputMethodList()).thenReturn(imis);
when(imis.get(0).getPackageName()).thenReturn(componentName.getPackageName());
when(imis.get(0).loadLabel(mPm)).thenReturn(label1);
when(imis.get(1).getPackageName()).thenReturn(componentName.getPackageName());
when(imis.get(1).loadLabel(mPm)).thenReturn(label2);
when(mContext.getString(eq(R.string.join_many_items_middle), anyString(), anyString()))
.thenAnswer(invocation -> {
final Object[] args = invocation.getArguments();
final String str1 = (String) args[1];
final String str2 = (String) args[2];
return RuntimeEnvironment.application.getString(R.string.join_many_items_middle,
str1, str2);
});
mController.updateState(mPreference);
verify(mPreference).setSummary(
formatter.unicodeWrap(label1) + ", " + formatter.unicodeWrap(label2));
}
} }