Change LAYOUT_SELECTION_CRITERIA IntDef

Added an LAYOUT_SELECTION_CRITERIA_UNSPECIFIED to the
LayoutSelectionCriteria interfacen a changed the other values as well.
ULocale can return "und" for undefined language tags,
so we convert those language tags to null, since we want to log them as "None" in
the KeyboardConfigured atom.

Bug: 280603577
Test: atest FrameworksServicesTests:KeyboardMetricsCollectorTests
Change-Id: I3d69cb924f661245502cf2bdecd9900988f4d890
This commit is contained in:
Asmita Poddar
2023-07-21 14:58:06 +00:00
parent 5143e36be6
commit a1cd593f46
3 changed files with 50 additions and 28 deletions

View File

@@ -37,6 +37,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.Vibrator;
import android.os.VibratorManager;
import android.text.TextUtils;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -483,10 +484,12 @@ public final class InputDevice implements Parcelable {
mSources = sources;
mKeyboardType = keyboardType;
mKeyCharacterMap = keyCharacterMap;
if (keyboardLanguageTag != null) {
mKeyboardLanguageTag = ULocale
if (!TextUtils.isEmpty(keyboardLanguageTag)) {
String langTag;
langTag = ULocale
.createCanonical(ULocale.forLanguageTag(keyboardLanguageTag))
.toLanguageTag();
mKeyboardLanguageTag = TextUtils.equals(langTag, "und") ? null : langTag;
} else {
mKeyboardLanguageTag = null;
}

View File

@@ -21,10 +21,10 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Intent;
import android.hardware.input.KeyboardLayout;
import android.icu.util.ULocale;
import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
@@ -41,9 +41,7 @@ import com.android.internal.util.FrameworkStatsLog;
import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -59,6 +57,7 @@ public final class KeyboardMetricsCollector {
@Retention(SOURCE)
@IntDef(prefix = {"LAYOUT_SELECTION_CRITERIA_"}, value = {
LAYOUT_SELECTION_CRITERIA_UNSPECIFIED,
LAYOUT_SELECTION_CRITERIA_USER,
LAYOUT_SELECTION_CRITERIA_DEVICE,
LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD,
@@ -67,23 +66,26 @@ public final class KeyboardMetricsCollector {
public @interface LayoutSelectionCriteria {
}
/** Unspecified layout selection criteria */
public static final int LAYOUT_SELECTION_CRITERIA_UNSPECIFIED = 0;
/** Manual selection by user */
public static final int LAYOUT_SELECTION_CRITERIA_USER = 0;
public static final int LAYOUT_SELECTION_CRITERIA_USER = 1;
/** Auto-detection based on device provided language tag and layout type */
public static final int LAYOUT_SELECTION_CRITERIA_DEVICE = 1;
public static final int LAYOUT_SELECTION_CRITERIA_DEVICE = 2;
/** Auto-detection based on IME provided language tag and layout type */
public static final int LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD = 2;
public static final int LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD = 3;
/** Default selection */
public static final int LAYOUT_SELECTION_CRITERIA_DEFAULT = 3;
public static final int LAYOUT_SELECTION_CRITERIA_DEFAULT = 4;
@VisibleForTesting
static final String DEFAULT_LAYOUT = "Default";
static final String DEFAULT_LAYOUT_NAME = "Default";
@VisibleForTesting
static final String DEFAULT_LANGUAGE_TAG = "None";
public static final String DEFAULT_LANGUAGE_TAG = "None";
public enum KeyboardLogEvent {
UNSPECIFIED(
@@ -536,23 +538,23 @@ public final class KeyboardMetricsCollector {
mLayoutSelectionCriteriaList.get(i);
InputMethodSubtype imeSubtype = mImeSubtypeList.get(i);
String keyboardLanguageTag = mInputDevice.getKeyboardLanguageTag();
keyboardLanguageTag = keyboardLanguageTag == null ? DEFAULT_LANGUAGE_TAG
: keyboardLanguageTag;
keyboardLanguageTag = TextUtils.isEmpty(keyboardLanguageTag)
? DEFAULT_LANGUAGE_TAG : keyboardLanguageTag;
int keyboardLayoutType = KeyboardLayout.LayoutType.getLayoutTypeEnumValue(
mInputDevice.getKeyboardLayoutType());
ULocale pkLocale = imeSubtype.getPhysicalKeyboardHintLanguageTag();
String canonicalizedLanguageTag =
imeSubtype.getCanonicalizedLanguageTag().equals("")
? DEFAULT_LANGUAGE_TAG : imeSubtype.getCanonicalizedLanguageTag();
String imeLanguageTag = pkLocale != null ? pkLocale.toLanguageTag()
: canonicalizedLanguageTag;
: imeSubtype.getCanonicalizedLanguageTag();
imeLanguageTag = TextUtils.isEmpty(imeLanguageTag) ? DEFAULT_LANGUAGE_TAG
: imeLanguageTag;
int imeLayoutType = KeyboardLayout.LayoutType.getLayoutTypeEnumValue(
imeSubtype.getPhysicalKeyboardHintLayoutType());
// Sanitize null values
String keyboardLayoutName =
selectedLayout == null ? DEFAULT_LAYOUT : selectedLayout.getLabel();
selectedLayout == null ? DEFAULT_LAYOUT_NAME
: selectedLayout.getLabel();
configurationList.add(
new LayoutConfiguration(keyboardLayoutType, keyboardLanguageTag,
@@ -601,6 +603,8 @@ public final class KeyboardMetricsCollector {
private static String getStringForSelectionCriteria(
@LayoutSelectionCriteria int layoutSelectionCriteria) {
switch (layoutSelectionCriteria) {
case LAYOUT_SELECTION_CRITERIA_UNSPECIFIED:
return "LAYOUT_SELECTION_CRITERIA_UNSPECIFIED";
case LAYOUT_SELECTION_CRITERIA_USER:
return "LAYOUT_SELECTION_CRITERIA_USER";
case LAYOUT_SELECTION_CRITERIA_DEVICE:

View File

@@ -123,10 +123,6 @@ class KeyboardMetricsCollectorTests {
createImeSubtype(3, ULocale.forLanguageTag("en-US"), "qwerty"),
KeyboardLayout(null, "German", null, 0, null, 0, 0, 0),
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE
).addLayoutSelection(
createImeSubtype(4, null, "qwerty"), // Default language tag
KeyboardLayout(null, "German", null, 0, null, 0, 0, 0),
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE
).setIsFirstTimeConfiguration(true).build()
assertEquals(
@@ -142,8 +138,8 @@ class KeyboardMetricsCollectorTests {
assertTrue(event.isFirstConfiguration)
assertEquals(
"KeyboardConfigurationEvent should contain 4 configurations provided",
4,
"KeyboardConfigurationEvent should contain 3 configurations provided",
3,
event.layoutConfigurations.size
)
assertExpectedLayoutConfiguration(
@@ -159,7 +155,7 @@ class KeyboardMetricsCollectorTests {
event.layoutConfigurations[1],
"de-CH",
KeyboardLayout.LayoutType.getLayoutTypeEnumValue("qwertz"),
KeyboardMetricsCollector.DEFAULT_LAYOUT,
KeyboardMetricsCollector.DEFAULT_LAYOUT_NAME,
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_USER,
"en-US",
KeyboardLayout.LayoutType.getLayoutTypeEnumValue("azerty"),
@@ -173,10 +169,29 @@ class KeyboardMetricsCollectorTests {
"en-US",
KeyboardLayout.LayoutType.getLayoutTypeEnumValue("qwerty"),
)
}
@Test
fun testCreateKeyboardConfigurationEvent_withDefaultLanguageTag() {
val builder = KeyboardMetricsCollector.KeyboardConfigurationEvent.Builder(
createKeyboard(
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
"und", // Undefined language tag
"azerty"
)
)
val event = builder.addLayoutSelection(
createImeSubtype(4, null, "qwerty"), // Default language tag
KeyboardLayout(null, "German", null, 0, null, 0, 0, 0),
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE
).build()
assertExpectedLayoutConfiguration(
event.layoutConfigurations[3],
"de-CH",
KeyboardLayout.LayoutType.getLayoutTypeEnumValue("qwertz"),
event.layoutConfigurations[0],
KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
KeyboardLayout.LayoutType.getLayoutTypeEnumValue("azerty"),
"German",
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE,
KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,