summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/system-current.txt5
-rw-r--r--core/java/android/companion/virtual/flags.aconfig7
-rw-r--r--core/java/android/view/inputmethod/InputMethodInfo.java44
-rw-r--r--core/res/res/values/attrs.xml4
-rw-r--r--core/res/res/values/public-staging.xml3
-rw-r--r--core/tests/coretests/res/xml/ime_meta_virtual_device_only.xml23
-rw-r--r--core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java19
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java10
8 files changed, 106 insertions, 9 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index f5b9b171b9a0..777bca21925a 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -418,6 +418,7 @@ package android {
field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600
field public static final int gameSessionService = 16844373; // 0x1010655
field public static final int hotwordDetectionService = 16844326; // 0x1010626
+ field @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") public static final int isVirtualDeviceOnly;
field public static final int isVrOnly = 16844152; // 0x1010578
field public static final int minExtensionVersion = 16844305; // 0x1010611
field public static final int playHomeTransitionSound = 16844358; // 0x1010646
@@ -17290,6 +17291,10 @@ package android.view.displayhash {
package android.view.inputmethod {
+ public final class InputMethodInfo implements android.os.Parcelable {
+ method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") public boolean isVirtualDeviceOnly();
+ }
+
public final class InputMethodManager {
method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public android.view.inputmethod.InputMethodInfo getCurrentInputMethodInfoAsUser(@NonNull android.os.UserHandle);
}
diff --git a/core/java/android/companion/virtual/flags.aconfig b/core/java/android/companion/virtual/flags.aconfig
index f0477d47f723..ce2490b8efb8 100644
--- a/core/java/android/companion/virtual/flags.aconfig
+++ b/core/java/android/companion/virtual/flags.aconfig
@@ -39,6 +39,13 @@ flag {
}
flag {
+ name: "vdm_custom_ime"
+ namespace: "virtual_devices"
+ description: "Enable custom IME API"
+ bug: "287269288"
+}
+
+flag {
name: "vdm_custom_home"
namespace: "virtual_devices"
description: "Enable custom home API"
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 8b55494c75d4..d38a95e713b3 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -16,9 +16,11 @@
package android.view.inputmethod;
+import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
@@ -113,6 +115,11 @@ public final class InputMethodInfo implements Parcelable {
final boolean mIsVrOnly;
/**
+ * IME only supports virtual devices.
+ */
+ final boolean mIsVirtualDeviceOnly;
+
+ /**
* The unique string Id to identify the input method. This is generated
* from the input method component.
*/
@@ -239,6 +246,7 @@ public final class InputMethodInfo implements Parcelable {
String settingsActivityComponent = null;
String stylusHandwritingSettingsActivity = null;
boolean isVrOnly;
+ boolean isVirtualDeviceOnly;
int isDefaultResId = 0;
XmlResourceParser parser = null;
@@ -277,6 +285,8 @@ public final class InputMethodInfo implements Parcelable {
}
isVrOnly = sa.getBoolean(com.android.internal.R.styleable.InputMethod_isVrOnly, false);
+ isVirtualDeviceOnly = sa.getBoolean(
+ com.android.internal.R.styleable.InputMethod_isVirtualDeviceOnly, false);
isDefaultResId = sa.getResourceId(
com.android.internal.R.styleable.InputMethod_isDefault, 0);
supportsSwitchingToNextInputMethod = sa.getBoolean(
@@ -382,6 +392,7 @@ public final class InputMethodInfo implements Parcelable {
mSuppressesSpellChecker = suppressesSpellChecker;
mShowInInputMethodPicker = showInInputMethodPicker;
mIsVrOnly = isVrOnly;
+ mIsVirtualDeviceOnly = isVirtualDeviceOnly;
}
/**
@@ -399,6 +410,7 @@ public final class InputMethodInfo implements Parcelable {
mSuppressesSpellChecker = source.mSuppressesSpellChecker;
mShowInInputMethodPicker = source.mShowInInputMethodPicker;
mIsVrOnly = source.mIsVrOnly;
+ mIsVirtualDeviceOnly = source.mIsVirtualDeviceOnly;
mService = source.mService;
mSubtypes = source.mSubtypes;
mHandledConfigChanges = source.mHandledConfigChanges;
@@ -418,6 +430,7 @@ public final class InputMethodInfo implements Parcelable {
mSuppressesSpellChecker = source.readBoolean();
mShowInInputMethodPicker = source.readBoolean();
mIsVrOnly = source.readBoolean();
+ mIsVirtualDeviceOnly = source.readBoolean();
mService = ResolveInfo.CREATOR.createFromParcel(source);
mSubtypes = new InputMethodSubtypeArray(source);
mHandledConfigChanges = source.readInt();
@@ -435,7 +448,8 @@ public final class InputMethodInfo implements Parcelable {
settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
- 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
+ false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */,
+ false /* supportsStylusHandwriting */,
null /* stylusHandwritingSettingsActivityAttr */,
false /* inlineSuggestionsEnabled */);
}
@@ -453,8 +467,9 @@ public final class InputMethodInfo implements Parcelable {
settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
- 0 /* handledConfigChanges */, supportStylusHandwriting,
- stylusHandwritingSettingsActivityAttr, false /* inlineSuggestionsEnabled */);
+ false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */,
+ supportStylusHandwriting, stylusHandwritingSettingsActivityAttr,
+ false /* inlineSuggestionsEnabled */);
}
/**
@@ -468,7 +483,8 @@ public final class InputMethodInfo implements Parcelable {
this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */,
settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
- false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges,
+ false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
+ false /* isVirtualDeviceOnly */, handledConfigChanges,
false /* supportsStylusHandwriting */,
null /* stylusHandwritingSettingsActivityAttr */,
false /* inlineSuggestionsEnabled */);
@@ -483,7 +499,7 @@ public final class InputMethodInfo implements Parcelable {
boolean forceDefault) {
this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault,
true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */,
- false /* isVrOnly */, 0 /* handledconfigChanges */,
+ false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */,
false /* supportsStylusHandwriting */,
null /* stylusHandwritingSettingsActivityAttr */,
false /* inlineSuggestionsEnabled */);
@@ -498,6 +514,7 @@ public final class InputMethodInfo implements Parcelable {
boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) {
this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault,
supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly,
+ false /* isVirtualDeviceOnly */,
0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
null /* stylusHandwritingSettingsActivityAttr */,
false /* inlineSuggestionsEnabled */);
@@ -510,8 +527,8 @@ public final class InputMethodInfo implements Parcelable {
public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity,
List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault,
boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled,
- boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting,
- String stylusHandwritingSettingsActivityAttr,
+ boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges,
+ boolean supportsStylusHandwriting, String stylusHandwritingSettingsActivityAttr,
boolean supportsInlineSuggestionsWithTouchExploration) {
final ServiceInfo si = ri.serviceInfo;
mService = ri;
@@ -528,6 +545,7 @@ public final class InputMethodInfo implements Parcelable {
mSuppressesSpellChecker = false;
mShowInInputMethodPicker = true;
mIsVrOnly = isVrOnly;
+ mIsVirtualDeviceOnly = isVirtualDeviceOnly;
mHandledConfigChanges = handledConfigChanges;
mSupportsStylusHandwriting = supportsStylusHandwriting;
mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr;
@@ -635,6 +653,16 @@ public final class InputMethodInfo implements Parcelable {
}
/**
+ * Returns true if IME supports only virtual devices.
+ * @hide
+ */
+ @FlaggedApi(android.companion.virtual.flags.Flags.FLAG_VDM_CUSTOM_IME)
+ @SystemApi
+ public boolean isVirtualDeviceOnly() {
+ return mIsVirtualDeviceOnly;
+ }
+
+ /**
* Return the count of the subtypes of Input Method.
*/
public int getSubtypeCount() {
@@ -732,6 +760,7 @@ public final class InputMethodInfo implements Parcelable {
pw.println(prefix + "mId=" + mId
+ " mSettingsActivityName=" + mSettingsActivityName
+ " mIsVrOnly=" + mIsVrOnly
+ + " mIsVirtualDeviceOnly=" + mIsVirtualDeviceOnly
+ " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod
+ " mInlineSuggestionsEnabled=" + mInlineSuggestionsEnabled
+ " mSupportsInlineSuggestionsWithTouchExploration="
@@ -851,6 +880,7 @@ public final class InputMethodInfo implements Parcelable {
dest.writeBoolean(mSuppressesSpellChecker);
dest.writeBoolean(mShowInInputMethodPicker);
dest.writeBoolean(mIsVrOnly);
+ dest.writeBoolean(mIsVirtualDeviceOnly);
mService.writeToParcel(dest, flags);
mSubtypes.writeToParcel(dest);
dest.writeInt(mHandledConfigChanges);
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 698c5bad3801..034a55a4a65d 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3854,6 +3854,10 @@
<!-- Specifies if an IME can only be used while a device is in VR mode or on a dedicated
device -->
<attr name="isVrOnly" format="boolean"/>
+ <!-- Specifies if an IME can only be used on a display created by a virtual device.
+ @hide @SystemApi
+ @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") -->
+ <attr name="isVirtualDeviceOnly" format="boolean"/>
<attr name="__removed2" format="boolean" />
<!-- Specifies whether the IME supports showing inline suggestions. -->
<attr name="supportsInlineSuggestions" format="boolean" />
diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml
index 4cd4f638e191..b12f30242e80 100644
--- a/core/res/res/values/public-staging.xml
+++ b/core/res/res/values/public-staging.xml
@@ -112,6 +112,9 @@
<staging-public-group type="attr" first-id="0x01bd0000">
<!-- @FlaggedApi("android.content.res.default_locale") -->
<public name="defaultLocale"/>
+ <!-- @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime")
+ @hide @SystemApi -->
+ <public name="isVirtualDeviceOnly"/>
</staging-public-group>
<staging-public-group type="id" first-id="0x01bc0000">
diff --git a/core/tests/coretests/res/xml/ime_meta_virtual_device_only.xml b/core/tests/coretests/res/xml/ime_meta_virtual_device_only.xml
new file mode 100644
index 000000000000..1905365808bc
--- /dev/null
+++ b/core/tests/coretests/res/xml/ime_meta_virtual_device_only.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<input-method
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:settingsActivity="com.android.inputmethod.latin.settings.SettingsActivity"
+ android:isVirtualDeviceOnly="true">
+</input-method>
diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
index 7bef55e23919..909af7b4c5fb 100644
--- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
+++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java
@@ -26,6 +26,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.Parcel;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -33,6 +34,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.coretests.R;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,6 +42,10 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class InputMethodInfoTest {
+ @Rule
+ public SetFlagsRule mSetFlagsRule =
+ new SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);
+
@Test
public void testEqualsAndHashCode() throws Exception {
final InputMethodInfo imi = buildInputMethodForTest(R.xml.ime_meta);
@@ -111,6 +117,19 @@ public class InputMethodInfoTest {
assertThat(clone.isVrOnly(), is(true));
}
+ @Test
+ public void testIsVirtualDeviceOnly() throws Exception {
+ mSetFlagsRule.enableFlags(android.companion.virtual.flags.Flags.FLAG_VDM_CUSTOM_IME);
+
+ final InputMethodInfo imi = buildInputMethodForTest(R.xml.ime_meta_virtual_device_only);
+
+ assertThat(imi.isVirtualDeviceOnly(), is(true));
+
+ final InputMethodInfo clone = cloneViaParcel(imi);
+
+ assertThat(clone.isVirtualDeviceOnly(), is(true));
+ }
+
private InputMethodInfo buildInputMethodForTest(final @XmlRes int metaDataRes)
throws Exception {
final Context context = InstrumentationRegistry.getContext();
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
index 5860bdabe764..4384400eaa88 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
@@ -89,8 +89,14 @@ public class InputMethodSettingValuesWrapper {
public void refreshAllInputMethodAndSubtypes() {
mMethodList.clear();
- mMethodList.addAll(mImm.getInputMethodListAsUser(
- mContentResolver.getUserId(), DirectBootAwareness.ANY));
+ List<InputMethodInfo> imis = mImm.getInputMethodListAsUser(
+ mContentResolver.getUserId(), DirectBootAwareness.ANY);
+ for (int i = 0; i < imis.size(); ++i) {
+ InputMethodInfo imi = imis.get(i);
+ if (!imi.isVirtualDeviceOnly()) {
+ mMethodList.add(imi);
+ }
+ }
}
public List<InputMethodInfo> getInputMethodList() {