1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package android.view.textservice;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 import android.text.ParcelableSpan;
22 import android.text.SpannableStringBuilder;
23 import android.text.TextUtils;
24 import android.text.style.SpellCheckSpan;
25 
26 /**
27  * This class contains a metadata of the input of TextService
28  */
29 public final class TextInfo implements Parcelable {
30     private final CharSequence mCharSequence;
31     private final int mCookie;
32     private final int mSequenceNumber;
33 
34     private static final int DEFAULT_COOKIE = 0;
35     private static final int DEFAULT_SEQUENCE_NUMBER = 0;
36 
37     /**
38      * Constructor.
39      * @param text the text which will be input to TextService
40      */
TextInfo(String text)41     public TextInfo(String text) {
42         this(text, 0, getStringLengthOrZero(text), DEFAULT_COOKIE, DEFAULT_SEQUENCE_NUMBER);
43     }
44 
45     /**
46      * Constructor.
47      * @param text the text which will be input to TextService
48      * @param cookie the cookie for this TextInfo
49      * @param sequenceNumber the sequence number for this TextInfo
50      */
TextInfo(String text, int cookie, int sequenceNumber)51     public TextInfo(String text, int cookie, int sequenceNumber) {
52         this(text, 0, getStringLengthOrZero(text), cookie, sequenceNumber);
53     }
54 
getStringLengthOrZero(final String text)55     private static int getStringLengthOrZero(final String text) {
56         return TextUtils.isEmpty(text) ? 0 : text.length();
57     }
58 
59     /**
60      * Constructor.
61      * @param charSequence the text which will be input to TextService. Attached spans that
62      * implement {@link ParcelableSpan} will also be marshaled alongside with the text.
63      * @param start the beginning of the range of text (inclusive).
64      * @param end the end of the range of text (exclusive).
65      * @param cookie the cookie for this TextInfo
66      * @param sequenceNumber the sequence number for this TextInfo
67      */
TextInfo(CharSequence charSequence, int start, int end, int cookie, int sequenceNumber)68     public TextInfo(CharSequence charSequence, int start, int end, int cookie, int sequenceNumber) {
69         if (TextUtils.isEmpty(charSequence)) {
70             throw new IllegalArgumentException("charSequence is empty");
71         }
72         // Create a snapshot of the text including spans in case they are updated outside later.
73         final SpannableStringBuilder spannableString =
74                 new SpannableStringBuilder(charSequence, start, end);
75         // SpellCheckSpan is for internal use. We do not want to marshal this for TextService.
76         final SpellCheckSpan[] spans = spannableString.getSpans(0, spannableString.length(),
77                 SpellCheckSpan.class);
78         for (int i = 0; i < spans.length; ++i) {
79             spannableString.removeSpan(spans[i]);
80         }
81 
82         mCharSequence = spannableString;
83         mCookie = cookie;
84         mSequenceNumber = sequenceNumber;
85     }
86 
TextInfo(Parcel source)87     public TextInfo(Parcel source) {
88         mCharSequence = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
89         mCookie = source.readInt();
90         mSequenceNumber = source.readInt();
91     }
92 
93     /**
94      * Used to package this object into a {@link Parcel}.
95      *
96      * @param dest The {@link Parcel} to be written.
97      * @param flags The flags used for parceling.
98      */
99     @Override
writeToParcel(Parcel dest, int flags)100     public void writeToParcel(Parcel dest, int flags) {
101         TextUtils.writeToParcel(mCharSequence, dest, flags);
102         dest.writeInt(mCookie);
103         dest.writeInt(mSequenceNumber);
104     }
105 
106     /**
107      * @return the text which is an input of a text service
108      */
getText()109     public String getText() {
110         if (mCharSequence == null) {
111             return null;
112         }
113         return mCharSequence.toString();
114     }
115 
116     /**
117      * @return the charSequence which is an input of a text service. This may have some parcelable
118      * spans.
119      */
getCharSequence()120     public CharSequence getCharSequence() {
121         return mCharSequence;
122     }
123 
124     /**
125      * @return the cookie of TextInfo
126      */
getCookie()127     public int getCookie() {
128         return mCookie;
129     }
130 
131     /**
132      * @return the sequence of TextInfo
133      */
getSequence()134     public int getSequence() {
135         return mSequenceNumber;
136     }
137 
138     /**
139      * Used to make this class parcelable.
140      */
141     public static final @android.annotation.NonNull Parcelable.Creator<TextInfo> CREATOR
142             = new Parcelable.Creator<TextInfo>() {
143         @Override
144         public TextInfo createFromParcel(Parcel source) {
145             return new TextInfo(source);
146         }
147 
148         @Override
149         public TextInfo[] newArray(int size) {
150             return new TextInfo[size];
151         }
152     };
153 
154     /**
155      * Used to make this class parcelable.
156      */
157     @Override
describeContents()158     public int describeContents() {
159         return 0;
160     }
161 }
162