From b360b995c91c2abdac7426ba37b154d15b235113 Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Tue, 21 Nov 2017 14:25:34 -0800 Subject: [PATCH] Add new SystemApi InputMethod attr isVrOnly. In order to support VR-only InputMethod, new attribute 'isVrOnly' is added. Bug: 63037786 Test: atest InputMethodInfoTest Change-Id: Iab936df9972212f56277ef9c18d9e1f67f92a913 --- api/system-current.txt | 1 + .../view/inputmethod/InputMethodInfo.java | 28 +++++++++++++++++-- core/res/res/values/attrs.xml | 3 ++ core/res/res/values/public.xml | 2 ++ .../coretests/res/xml/ime_meta_vr_only.xml | 23 +++++++++++++++ .../view/inputmethod/InputMethodInfoTest.java | 11 ++++++++ ...tMethodSubtypeSwitchingControllerTest.java | 6 ++-- .../users/AppRestrictionsHelperTest.java | 4 +-- 8 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 core/tests/coretests/res/xml/ime_meta_vr_only.xml diff --git a/api/system-current.txt b/api/system-current.txt index 1ce043cf10e54..b964d8a02b454 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -184,6 +184,7 @@ package android { } public static final class R.attr { + field public static final int isVrOnly = 16844152; // 0x1010578 field public static final int requiredSystemPropertyName = 16844133; // 0x1010565 field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566 field public static final int searchKeyphrase = 16843871; // 0x101045f diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index f0645b895afac..c69543f6d2d8e 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -66,6 +66,11 @@ public final class InputMethodInfo implements Parcelable { */ final ResolveInfo mService; + /** + * IME only supports VR mode. + */ + final boolean mIsVrOnly; + /** * The unique string Id to identify the input method. This is generated * from the input method component. @@ -149,6 +154,7 @@ public final class InputMethodInfo implements Parcelable { PackageManager pm = context.getPackageManager(); String settingsActivityComponent = null; + boolean isVrOnly; int isDefaultResId = 0; XmlResourceParser parser = null; @@ -179,6 +185,7 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod); settingsActivityComponent = sa.getString( com.android.internal.R.styleable.InputMethod_settingsActivity); + isVrOnly = sa.getBoolean(com.android.internal.R.styleable.InputMethod_isVrOnly, false); isDefaultResId = sa.getResourceId( com.android.internal.R.styleable.InputMethod_isDefault, 0); supportsSwitchingToNextInputMethod = sa.getBoolean( @@ -254,6 +261,8 @@ public final class InputMethodInfo implements Parcelable { mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; + // TODO(b/68948291): remove this meta-data before release. + mIsVrOnly = isVrOnly || service.serviceInfo.metaData.getBoolean("isVrOnly", false); } InputMethodInfo(Parcel source) { @@ -262,6 +271,7 @@ public final class InputMethodInfo implements Parcelable { mIsDefaultResId = source.readInt(); mIsAuxIme = source.readInt() == 1; mSupportsSwitchingToNextInputMethod = source.readInt() == 1; + mIsVrOnly = source.readBoolean(); mService = ResolveInfo.CREATOR.createFromParcel(source); mSubtypes = new InputMethodSubtypeArray(source); mForceDefault = false; @@ -274,7 +284,8 @@ public final class InputMethodInfo implements Parcelable { CharSequence label, String settingsActivity) { this(buildDummyResolveInfo(packageName, className, label), false /* isAuxIme */, settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, - false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */); + false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + false /* isVrOnly */); } /** @@ -285,7 +296,7 @@ public final class InputMethodInfo implements Parcelable { String settingsActivity, List subtypes, int isDefaultResId, boolean forceDefault) { this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, - true /* supportsSwitchingToNextInputMethod */); + true /* supportsSwitchingToNextInputMethod */, false /* isVrOnly */); } /** @@ -294,7 +305,7 @@ public final class InputMethodInfo implements Parcelable { */ public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, List subtypes, int isDefaultResId, boolean forceDefault, - boolean supportsSwitchingToNextInputMethod) { + boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) { final ServiceInfo si = ri.serviceInfo; mService = ri; mId = new ComponentName(si.packageName, si.name).flattenToShortString(); @@ -304,6 +315,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = new InputMethodSubtypeArray(subtypes); mForceDefault = forceDefault; mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; + mIsVrOnly = isVrOnly; } private static ResolveInfo buildDummyResolveInfo(String packageName, String className, @@ -397,6 +409,14 @@ public final class InputMethodInfo implements Parcelable { return mSettingsActivityName; } + /** + * Returns true if IME supports VR mode only. + * @hide + */ + public boolean isVrOnly() { + return mIsVrOnly; + } + /** * Return the count of the subtypes of Input Method. */ @@ -444,6 +464,7 @@ public final class InputMethodInfo implements Parcelable { public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName + + " mIsVrOnly=" + mIsVrOnly + " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod); pw.println(prefix + "mIsDefaultResId=0x" + Integer.toHexString(mIsDefaultResId)); @@ -509,6 +530,7 @@ public final class InputMethodInfo implements Parcelable { dest.writeInt(mIsDefaultResId); dest.writeInt(mIsAuxIme ? 1 : 0); dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0); + dest.writeBoolean(mIsVrOnly); mService.writeToParcel(dest, flags); mSubtypes.writeToParcel(dest); } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 3b49d9dbc22bd..faf3c2f1ec22f 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3294,6 +3294,9 @@ and subtype in order to provide the consistent user experience in switching between IMEs and subtypes. --> + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 43e1f738bba7f..d79df353f7c7b 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2856,6 +2856,8 @@ + + diff --git a/core/tests/coretests/res/xml/ime_meta_vr_only.xml b/core/tests/coretests/res/xml/ime_meta_vr_only.xml new file mode 100644 index 0000000000000..653a8ffcb9447 --- /dev/null +++ b/core/tests/coretests/res/xml/ime_meta_vr_only.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java index 13cef5290a4ef..e3c91e64f69c7 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java @@ -68,6 +68,17 @@ public class InputMethodInfoTest { assertThat(clone.supportsSwitchingToNextInputMethod(), is(true)); } + @Test + public void testIsVrOnly() throws Exception { + final InputMethodInfo imi = buildInputMethodForTest(R.xml.ime_meta_vr_only); + + assertThat(imi.isVrOnly(), is(true)); + + final InputMethodInfo clone = cloneViaParcel(imi); + + assertThat(clone.isVrOnly(), is(true)); + } + private InputMethodInfo buildInputMethodForTest(final @XmlRes int metaDataRes) throws Exception { final Context context = InstrumentationRegistry.getContext(); diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java index 515e5580a73cc..9061c44076855 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java @@ -38,6 +38,7 @@ public class InputMethodSubtypeSwitchingControllerTest extends InstrumentationTe private static final String DUMMY_SETTING_ACTIVITY_NAME = ""; private static final boolean DUMMY_IS_AUX_IME = false; private static final boolean DUMMY_FORCE_DEFAULT = false; + private static final boolean DUMMY_IS_VR_IME = false; private static final int DUMMY_IS_DEFAULT_RES_ID = 0; private static final String SYSTEM_LOCALE = "en_US"; private static final int NOT_A_SUBTYPE_ID = InputMethodUtils.NOT_A_SUBTYPE_ID; @@ -75,7 +76,7 @@ public class InputMethodSubtypeSwitchingControllerTest extends InstrumentationTe } final InputMethodInfo imi = new InputMethodInfo(ri, DUMMY_IS_AUX_IME, DUMMY_SETTING_ACTIVITY_NAME, subtypes, DUMMY_IS_DEFAULT_RES_ID, - DUMMY_FORCE_DEFAULT, supportsSwitchingToNextInputMethod); + DUMMY_FORCE_DEFAULT, supportsSwitchingToNextInputMethod, DUMMY_IS_VR_IME); if (subtypes == null) { items.add(new ImeSubtypeListItem(imeName, null /* variableName */, imi, NOT_A_SUBTYPE_ID, null, SYSTEM_LOCALE)); @@ -111,7 +112,8 @@ public class InputMethodSubtypeSwitchingControllerTest extends InstrumentationTe .build()); final InputMethodInfo imi = new InputMethodInfo(ri, DUMMY_IS_AUX_IME, DUMMY_SETTING_ACTIVITY_NAME, subtypes, DUMMY_IS_DEFAULT_RES_ID, - DUMMY_FORCE_DEFAULT, true /* supportsSwitchingToNextInputMethod */); + DUMMY_FORCE_DEFAULT, true /* supportsSwitchingToNextInputMethod */, + DUMMY_IS_VR_IME); return new ImeSubtypeListItem(imeName, subtypeName, imi, subtypeIndex, subtypeLocale, systemLocale); } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java index 820231ef76c45..85b04c8fdf154 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java @@ -159,14 +159,14 @@ public class AppRestrictionsHelperTest extends BaseTest { for (String pkg : defaultImes) { final ResolveInfo ri = createResolveInfoForSystemApp(pkg); final InputMethodInfo inputMethodInfo = new InputMethodInfo( - ri, false, null, null, 0, true, true); + ri, false, null, null, 0, true, true, false); inputMethods.add(inputMethodInfo); addInstalledApp(ri); } for (String pkg : otherImes) { final ResolveInfo ri = createResolveInfoForSystemApp(pkg); final InputMethodInfo inputMethodInfo = new InputMethodInfo( - ri, false, null, null, 0, false, true); + ri, false, null, null, 0, false, true, false); inputMethods.add(inputMethodInfo); addInstalledApp(ri); }