summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Victor Chang <vichang@google.com> 2020-12-17 02:27:12 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-12-17 02:27:12 +0000
commit6fe207d72b128b924034d2da513ac0536c68e02d (patch)
treef8d8487fb1de5a8db74facdf69f6f4495a45c37c
parent63c5fe5d33889aa3251d6bcdfe5c735a5b5d9261 (diff)
parent7d9e11576fdf40fd94a6f63b035742f8d37bab72 (diff)
Merge "Replace LanguageTag.isLanguage with public API"
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecController.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java17
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 bbd5ac3b5ccc..ddb0141d42a5 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.stats.hdmi.HdmiStatsEnums;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.HdmiAnnotations.IoThreadOnly;
@@ -49,8 +52,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
@@ -352,13 +353,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 42f88dcae635..2f2e97c5c7a2 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -30,6 +30,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.hdmi.HdmiControlManager;
@@ -257,4 +259,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
+ }
}