diff options
| -rw-r--r-- | services/core/java/com/android/server/hdmi/HdmiCecController.java | 25 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java | 17 |
2 files changed, 39 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java index 535284083d11..0fdb8798af6f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecController.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java @@ -26,6 +26,8 @@ import android.hardware.tv.cec.V1_0.IHdmiCec.getPhysicalAddressCallback; import android.hardware.tv.cec.V1_0.IHdmiCecCallback; import android.hardware.tv.cec.V1_0.Result; import android.hardware.tv.cec.V1_0.SendMessageResult; +import android.icu.util.IllformedLocaleException; +import android.icu.util.ULocale; import android.os.Handler; import android.os.IHwBinder; import android.os.Looper; @@ -33,6 +35,7 @@ import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.server.hdmi.HdmiAnnotations.IoThreadOnly; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; @@ -48,8 +51,6 @@ import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.function.Predicate; -import sun.util.locale.LanguageTag; - /** * Manages HDMI-CEC command and behaviors. It converts user's command into CEC command * and pass it to CEC HAL so that it sends message to other device. For incoming @@ -369,13 +370,31 @@ final class HdmiCecController { @ServiceThreadOnly void setLanguage(String language) { assertRunOnServiceThread(); - if (!LanguageTag.isLanguage(language)) { + if (!isLanguage(language)) { return; } mNativeWrapperImpl.nativeSetLanguage(language); } /** + * Returns true if the language code is well-formed. + */ + @VisibleForTesting static boolean isLanguage(String language) { + // Handle null and empty string because because ULocale.Builder#setLanguage accepts them. + if (language == null || language.isEmpty()) { + return false; + } + + ULocale.Builder builder = new ULocale.Builder(); + try { + builder.setLanguage(language); + return true; + } catch (IllformedLocaleException e) { + return false; + } + } + + /** * Configure ARC circuit in the hardware logic to start or stop the feature. * * @param port ID of HDMI port to which AVR is connected diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java index 5d8131f35eb7..d905b69ce37f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java @@ -28,6 +28,8 @@ import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; import android.content.Context; import android.hardware.tv.cec.V1_0.SendMessageResult; @@ -189,4 +191,19 @@ public class HdmiCecControllerTest { mTestLooper.dispatchAll(); assertEquals(ADDR_UNREGISTERED, mLogicalAddress); } + + @Test + public void testIsLanguage() { + assertTrue(HdmiCecController.isLanguage("en")); + assertTrue(HdmiCecController.isLanguage("eng")); + assertTrue(HdmiCecController.isLanguage("ger")); + assertTrue(HdmiCecController.isLanguage("zh")); + assertTrue(HdmiCecController.isLanguage("zhi")); + assertTrue(HdmiCecController.isLanguage("zho")); + + assertFalse(HdmiCecController.isLanguage(null)); + assertFalse(HdmiCecController.isLanguage("")); + assertFalse(HdmiCecController.isLanguage("e")); + assertFalse(HdmiCecController.isLanguage("δΈ€")); // language code must be ASCII + } } |