diff options
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() { |