Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fb5a7aa authored by Taran Singh's avatar Taran Singh
Browse files

API for stylus handwriting settings activity

This is second attempt at [1] after fixing compile error.
Introduce  new attribute for InputMethodInfo to define settings activity
action for stylus handwriting settings. This allows apps/system components
to launch scribe specific settings.

[1] I8ce2073a1bb525e43a6ccc2ef5ef11d09029327d

Bug: 256045215
Test: atest InputMethodInfoTest
Change-Id: I603bca29ece87e05da4c0a9c0762195e8e014057
parent 62c9ade8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1488,6 +1488,7 @@ package android {
    field public static final int strokeLineJoin = 16843788; // 0x101040c
    field public static final int strokeMiterLimit = 16843789; // 0x101040d
    field public static final int strokeWidth = 16843783; // 0x1010407
    field public static final int stylusHandwritingSettingsActivity;
    field public static final int subMenuArrow = 16844019; // 0x10104f3
    field public static final int submitBackground = 16843912; // 0x1010488
    field public static final int subtitle = 16843473; // 0x10102d1
@@ -54848,6 +54849,7 @@ package android.view.inputmethod {
  public final class InputMethodInfo implements android.os.Parcelable {
    ctor public InputMethodInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    ctor public InputMethodInfo(String, String, CharSequence, String);
    method @Nullable public android.content.Intent createStylusHandwritingSettingsActivityIntent();
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public android.content.ComponentName getComponent();
@@ -54866,6 +54868,7 @@ package android.view.inputmethod {
    method public boolean supportsStylusHandwriting();
    method public boolean suppressesSpellChecker();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final String ACTION_STYLUS_HANDWRITING_SETTINGS = "android.view.inputmethod.action.STYLUS_HANDWRITING_SETTINGS";
    field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodInfo> CREATOR;
  }
+1 −0
Original line number Diff line number Diff line
@@ -3358,6 +3358,7 @@ package android.view.inputmethod {
  }

  public final class InputMethodInfo implements android.os.Parcelable {
    ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, boolean, @NonNull String);
    ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int);
  }

+81 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -38,6 +39,7 @@ import android.icu.util.ULocale;
import android.inputmethodservice.InputMethodService;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Printer;
import android.util.Slog;
@@ -71,6 +73,16 @@ import java.util.List;
 * @attr ref android.R.styleable#InputMethod_configChanges
 */
public final class InputMethodInfo implements Parcelable {

    /**
     * {@link Intent#getAction() Intent action} for IME that
     * {@link #supportsStylusHandwriting() supports stylus handwriting}.
     *
     * @see #createStylusHandwritingSettingsActivityIntent().
     */
    public static final String ACTION_STYLUS_HANDWRITING_SETTINGS =
            "android.view.inputmethod.action.STYLUS_HANDWRITING_SETTINGS";

    static final String TAG = "InputMethodInfo";

    /**
@@ -152,6 +164,11 @@ public final class InputMethodInfo implements Parcelable {
     */
    private final boolean mSupportsStylusHandwriting;

    /**
     * The stylus handwriting setting activity's name, used by the system settings to
     * launch the stylus handwriting specific setting activity of this input method.
     */
    private final String mStylusHandwritingSettingsActivityAttr;

    /**
     * @param service the {@link ResolveInfo} corresponds in which the IME is implemented.
@@ -203,6 +220,7 @@ public final class InputMethodInfo implements Parcelable {

        PackageManager pm = context.getPackageManager();
        String settingsActivityComponent = null;
        String stylusHandwritingSettingsActivity = null;
        boolean isVrOnly;
        int isDefaultResId = 0;

@@ -253,6 +271,8 @@ public final class InputMethodInfo implements Parcelable {
                    com.android.internal.R.styleable.InputMethod_configChanges, 0);
            mSupportsStylusHandwriting = sa.getBoolean(
                    com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false);
            stylusHandwritingSettingsActivity = sa.getString(
                    com.android.internal.R.styleable.InputMethod_stylusHandwritingSettingsActivity);
            sa.recycle();

            final int depth = parser.getDepth();
@@ -328,6 +348,7 @@ public final class InputMethodInfo implements Parcelable {
        }
        mSubtypes = new InputMethodSubtypeArray(subtypes);
        mSettingsActivityName = settingsActivityComponent;
        mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivity;
        mIsDefaultResId = isDefaultResId;
        mIsAuxIme = isAuxIme;
        mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod;
@@ -359,6 +380,7 @@ public final class InputMethodInfo implements Parcelable {
        mHandledConfigChanges = source.mHandledConfigChanges;
        mSupportsStylusHandwriting = source.mSupportsStylusHandwriting;
        mForceDefault = source.mForceDefault;
        mStylusHandwritingSettingsActivityAttr = source.mStylusHandwritingSettingsActivityAttr;
    }

    InputMethodInfo(Parcel source) {
@@ -376,6 +398,7 @@ public final class InputMethodInfo implements Parcelable {
        mSubtypes = new InputMethodSubtypeArray(source);
        mHandledConfigChanges = source.readInt();
        mSupportsStylusHandwriting = source.readBoolean();
        mStylusHandwritingSettingsActivityAttr = source.readString8();
        mForceDefault = false;
    }

@@ -389,9 +412,27 @@ public final class InputMethodInfo implements Parcelable {
                false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
                false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
                0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
                null /* stylusHandwritingSettingsActivityAttr */,
                false /* inlineSuggestionsEnabled */);
    }

    /**
     * Test API for creating a built-in input method to verify stylus handwriting.
     * @hide
     */
    @TestApi
    public InputMethodInfo(@NonNull String packageName, @NonNull String className,
            @NonNull CharSequence label, @NonNull String settingsActivity,
            boolean supportStylusHandwriting,
            @NonNull String stylusHandwritingSettingsActivityAttr) {
        this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */,
                settingsActivity, null /* subtypes */, 0 /* isDefaultResId */,
                false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
                false /* inlineSuggestionsEnabled */, false /* isVrOnly */,
                0 /* handledConfigChanges */, supportStylusHandwriting,
                stylusHandwritingSettingsActivityAttr, false /* inlineSuggestionsEnabled */);
    }

    /**
     * Temporary API for creating a built-in input method for test.
     * @hide
@@ -405,6 +446,7 @@ public final class InputMethodInfo implements Parcelable {
                false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */,
                false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges,
                false /* supportsStylusHandwriting */,
                null /* stylusHandwritingSettingsActivityAttr */,
                false /* inlineSuggestionsEnabled */);
    }

@@ -419,6 +461,7 @@ public final class InputMethodInfo implements Parcelable {
                true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */,
                false /* isVrOnly */, 0 /* handledconfigChanges */,
                false /* supportsStylusHandwriting */,
                null /* stylusHandwritingSettingsActivityAttr */,
                false /* inlineSuggestionsEnabled */);
    }

@@ -432,6 +475,7 @@ public final class InputMethodInfo implements Parcelable {
        this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault,
                supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly,
                0 /* handledConfigChanges */, false /* supportsStylusHandwriting */,
                null /* stylusHandwritingSettingsActivityAttr */,
                false /* inlineSuggestionsEnabled */);
    }

@@ -443,6 +487,7 @@ public final class InputMethodInfo implements Parcelable {
            List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault,
            boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled,
            boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting,
            String stylusHandwritingSettingsActivityAttr,
            boolean supportsInlineSuggestionsWithTouchExploration) {
        final ServiceInfo si = ri.serviceInfo;
        mService = ri;
@@ -461,6 +506,7 @@ public final class InputMethodInfo implements Parcelable {
        mIsVrOnly = isVrOnly;
        mHandledConfigChanges = handledConfigChanges;
        mSupportsStylusHandwriting = supportsStylusHandwriting;
        mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr;
    }

    private static ResolveInfo buildFakeResolveInfo(String packageName, String className,
@@ -550,6 +596,7 @@ public final class InputMethodInfo implements Parcelable {
     *
     * <p>A null will be returned if there is no settings activity associated
     * with the input method.</p>
     * @see #createStylusHandwritingSettingsActivityIntent()
     */
    public String getSettingsActivity() {
        return mSettingsActivityName;
@@ -622,11 +669,41 @@ public final class InputMethodInfo implements Parcelable {
    /**
     * Returns if IME supports handwriting using stylus input.
     * @attr ref android.R.styleable#InputMethod_supportsStylusHandwriting
     * @see #createStylusHandwritingSettingsActivityIntent()
     */
    public boolean supportsStylusHandwriting() {
        return mSupportsStylusHandwriting;
    }

    /**
     * Returns {@link Intent} for stylus handwriting settings activity with
     * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS}
     * if IME {@link #supportsStylusHandwriting() supports stylus handwriting}, else
     * <code>null</code> if there are no associated settings for stylus handwriting / handwriting
     * is not supported or if
     * {@link android.R.styleable#InputMethod_stylusHandwritingSettingsActivity} is not defined.
     *
     * <p>To launch stylus settings, use this method to get the {@link android.content.Intent} to
     * launch the stylus handwriting settings activity.</p>
     * <p>e.g.<pre><code>startActivity(createStylusHandwritingSettingsActivityIntent());</code>
     * </pre></p>
     *
     * @attr ref R.styleable#InputMethod_stylusHandwritingSettingsActivity
     * @see #getSettingsActivity()
     * @see #supportsStylusHandwriting()
     */
    @Nullable
    public Intent createStylusHandwritingSettingsActivityIntent() {
        if (TextUtils.isEmpty(mStylusHandwritingSettingsActivityAttr)
                || !mSupportsStylusHandwriting) {
            return null;
        }
        // TODO(b/210039666): consider returning null if component is not enabled.
        return new Intent(ACTION_STYLUS_HANDWRITING_SETTINGS).setComponent(
                new ComponentName(getServiceInfo().packageName,
                        mStylusHandwritingSettingsActivityAttr));
    }

    public void dump(Printer pw, String prefix) {
        pw.println(prefix + "mId=" + mId
                + " mSettingsActivityName=" + mSettingsActivityName
@@ -637,7 +714,9 @@ public final class InputMethodInfo implements Parcelable {
                + mSupportsInlineSuggestionsWithTouchExploration
                + " mSuppressesSpellChecker=" + mSuppressesSpellChecker
                + " mShowInInputMethodPicker=" + mShowInInputMethodPicker
                + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting);
                + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting
                + " mStylusHandwritingSettingsActivityAttr="
                        + mStylusHandwritingSettingsActivityAttr);
        pw.println(prefix + "mIsDefaultResId=0x"
                + Integer.toHexString(mIsDefaultResId));
        pw.println(prefix + "Service:");
@@ -752,6 +831,7 @@ public final class InputMethodInfo implements Parcelable {
        mSubtypes.writeToParcel(dest);
        dest.writeInt(mHandledConfigChanges);
        dest.writeBoolean(mSupportsStylusHandwriting);
        dest.writeString8(mStylusHandwritingSettingsActivityAttr);
    }

    /**
+3 −0
Original line number Diff line number Diff line
@@ -3763,6 +3763,9 @@
            {@link android.inputmethodservice.InputMethodService#onFinishInput()}.
        -->
        <attr name="supportsStylusHandwriting" format="boolean" />
        <!-- Class name of an activity that allows the user to modify the stylus handwriting
            settings for this service -->
        <attr name="stylusHandwritingSettingsActivity" format="string" />
    </declare-styleable>
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@
    <public name="isCredential"/>
    <public name="searchResultHighlightColor" />
    <public name="focusedSearchResultHighlightColor" />
    <public name="stylusHandwritingSettingsActivity" />
  </staging-public-group>

  <staging-public-group type="id" first-id="0x01cd0000">
Loading