From b1bdf90c355c4f138467ab63b7c7755fad72bb9c Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 20 Apr 2017 11:01:32 -0700 Subject: [PATCH] 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 --- .../VirtualKeyboardPreferenceController.java | 8 +++-- ...rtualKeyboardPreferenceControllerTest.java | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java index b7bf3dc34f9..54369011153 100644 --- a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java +++ b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java @@ -20,6 +20,7 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; import android.support.v7.preference.Preference; +import android.text.BidiFormatter; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -76,12 +77,15 @@ public class VirtualKeyboardPreferenceController extends PreferenceController { return; } + final BidiFormatter bidiFormatter = BidiFormatter.getInstance(); + String summary = null; for (String label : labels) { if (summary == null) { - summary = label; + summary = bidiFormatter.unicodeWrap(label); } 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); diff --git a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java index 3256950c923..13324458e14 100644 --- a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java @@ -18,6 +18,8 @@ package com.android.settings.inputmethod; 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.verify; import static org.mockito.Mockito.when; @@ -26,6 +28,7 @@ import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.support.v4.text.BidiFormatter; import android.support.v7.preference.Preference; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -39,6 +42,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; @@ -96,4 +100,35 @@ public class VirtualKeyboardPreferenceControllerTest { verify(mPreference).setSummary("label"); } + + @Test + public void updateState_multiImeWithMixedLocale_setImeLabelToSummary() { + final BidiFormatter formatter = BidiFormatter.getInstance(); + final ComponentName componentName = new ComponentName("pkg", "cls"); + final List 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)); + } }