/* * Copyright (C) 2011 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. */ package android.view.textservice; import android.os.Parcel; import android.os.Parcelable; import android.text.ParcelableSpan; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.SpellCheckSpan; /** * This class contains a metadata of the input of TextService */ public final class TextInfo implements Parcelable { private final CharSequence mCharSequence; private final int mCookie; private final int mSequenceNumber; private static final int DEFAULT_COOKIE = 0; private static final int DEFAULT_SEQUENCE_NUMBER = 0; /** * Constructor. * @param text the text which will be input to TextService */ public TextInfo(String text) { this(text, 0, getStringLengthOrZero(text), DEFAULT_COOKIE, DEFAULT_SEQUENCE_NUMBER); } /** * Constructor. * @param text the text which will be input to TextService * @param cookie the cookie for this TextInfo * @param sequenceNumber the sequence number for this TextInfo */ public TextInfo(String text, int cookie, int sequenceNumber) { this(text, 0, getStringLengthOrZero(text), cookie, sequenceNumber); } private static int getStringLengthOrZero(final String text) { return TextUtils.isEmpty(text) ? 0 : text.length(); } /** * Constructor. * @param charSequence the text which will be input to TextService. Attached spans that * implement {@link ParcelableSpan} will also be marshaled alongside with the text. * @param start the beginning of the range of text (inclusive). * @param end the end of the range of text (exclusive). * @param cookie the cookie for this TextInfo * @param sequenceNumber the sequence number for this TextInfo */ public TextInfo(CharSequence charSequence, int start, int end, int cookie, int sequenceNumber) { if (TextUtils.isEmpty(charSequence)) { throw new IllegalArgumentException("charSequence is empty"); } // Create a snapshot of the text including spans in case they are updated outside later. final SpannableStringBuilder spannableString = new SpannableStringBuilder(charSequence, start, end); // SpellCheckSpan is for internal use. We do not want to marshal this for TextService. final SpellCheckSpan[] spans = spannableString.getSpans(0, spannableString.length(), SpellCheckSpan.class); for (int i = 0; i < spans.length; ++i) { spannableString.removeSpan(spans[i]); } mCharSequence = spannableString; mCookie = cookie; mSequenceNumber = sequenceNumber; } public TextInfo(Parcel source) { mCharSequence = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); mCookie = source.readInt(); mSequenceNumber = source.readInt(); } /** * Used to package this object into a {@link Parcel}. * * @param dest The {@link Parcel} to be written. * @param flags The flags used for parceling. */ @Override public void writeToParcel(Parcel dest, int flags) { TextUtils.writeToParcel(mCharSequence, dest, flags); dest.writeInt(mCookie); dest.writeInt(mSequenceNumber); } /** * @return the text which is an input of a text service */ public String getText() { if (mCharSequence == null) { return null; } return mCharSequence.toString(); } /** * @return the charSequence which is an input of a text service. This may have some parcelable * spans. */ public CharSequence getCharSequence() { return mCharSequence; } /** * @return the cookie of TextInfo */ public int getCookie() { return mCookie; } /** * @return the sequence of TextInfo */ public int getSequence() { return mSequenceNumber; } /** * Used to make this class parcelable. */ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public TextInfo createFromParcel(Parcel source) { return new TextInfo(source); } @Override public TextInfo[] newArray(int size) { return new TextInfo[size]; } }; /** * Used to make this class parcelable. */ @Override public int describeContents() { return 0; } }