TimedText.java revision 7a9734d769d97470ce6fac0594dd007804d33432
1eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang/*
2eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * Copyright (C) 2011 The Android Open Source Project
3eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang *
4eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * Licensed under the Apache License, Version 2.0 (the "License");
5eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * you may not use this file except in compliance with the License.
6eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * You may obtain a copy of the License at
7eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang *
8eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang *      http://www.apache.org/licenses/LICENSE-2.0
9eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang *
10eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * Unless required by applicable law or agreed to in writing, software
11eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * distributed under the License is distributed on an "AS IS" BASIS,
12eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * See the License for the specific language governing permissions and
14eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang * limitations under the License.
15eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang */
16eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
17eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangpackage android.media;
18eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
197a9734d769d97470ce6fac0594dd007804d33432James Dongimport android.graphics.Rect;
20eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport android.os.Parcel;
21eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport android.util.Log;
22eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport java.util.HashMap;
23eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport java.util.Set;
24eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport java.util.List;
25eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wangimport java.util.ArrayList;
26eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
27eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang/**
287a9734d769d97470ce6fac0594dd007804d33432James Dong * Class to hold the timed text's metadata, including:
297a9734d769d97470ce6fac0594dd007804d33432James Dong * <ul>
307a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> The characters for rendering</li>
317a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> The rendering postion for the timed text</li>
327a9734d769d97470ce6fac0594dd007804d33432James Dong * </ul>
33eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang *
347a9734d769d97470ce6fac0594dd007804d33432James Dong * <p> To render the timed text, applications need to do the following:
357a9734d769d97470ce6fac0594dd007804d33432James Dong *
367a9734d769d97470ce6fac0594dd007804d33432James Dong * <ul>
377a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> Implement the {@link MediaPlayer.OnTimedTextListener} interface</li>
387a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> Register the {@link MediaPlayer.OnTimedTextListener} callback on a MediaPlayer object that is used for playback</li>
397a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> When a onTimedText callback is received, do the following:
407a9734d769d97470ce6fac0594dd007804d33432James Dong * <ul>
417a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> call {@link #getText} to get the characters for rendering</li>
427a9734d769d97470ce6fac0594dd007804d33432James Dong * <li> call {@link #getBounds} to get the text rendering area/region</li>
437a9734d769d97470ce6fac0594dd007804d33432James Dong * </ul>
447a9734d769d97470ce6fac0594dd007804d33432James Dong * </li>
457a9734d769d97470ce6fac0594dd007804d33432James Dong * </ul>
467a9734d769d97470ce6fac0594dd007804d33432James Dong *
477a9734d769d97470ce6fac0594dd007804d33432James Dong * @see android.media.MediaPlayer
48eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang */
497a9734d769d97470ce6fac0594dd007804d33432James Dongpublic final class TimedText
50eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang{
51eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int FIRST_PUBLIC_KEY                 = 1;
52eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
53eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    // These keys must be in sync with the keys in TextDescription.h
547a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_DISPLAY_FLAGS                 = 1; // int
557a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STYLE_FLAGS                   = 2; // int
567a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_BACKGROUND_COLOR_RGBA         = 3; // int
577a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_HIGHLIGHT_COLOR_RGBA          = 4; // int
587a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_SCROLL_DELAY                  = 5; // int
597a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_WRAP_TEXT                     = 6; // int
607a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_START_TIME                    = 7; // int
617a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_BLINKING_TEXT_LIST     = 8; // List<CharPos>
627a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_FONT_LIST              = 9; // List<Font>
637a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_HIGHLIGHT_LIST         = 10; // List<CharPos>
647a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_HYPER_TEXT_LIST        = 11; // List<HyperText>
657a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_KARAOKE_LIST           = 12; // List<Karaoke>
667a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_STYLE_LIST             = 13; // List<Style>
677a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_TEXT_POS               = 14; // TextPos
687a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_JUSTIFICATION          = 15; // Justification
697a9734d769d97470ce6fac0594dd007804d33432James Dong    private static final int KEY_STRUCT_TEXT                   = 16; // Text
70eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
71eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int LAST_PUBLIC_KEY                  = 16;
72eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
73eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int FIRST_PRIVATE_KEY                = 101;
74eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
75eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    // The following keys are used between TimedText.java and
76eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    // TextDescription.cpp in order to parce the Parcel.
77eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_GLOBAL_SETTING               = 101;
78eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_LOCAL_SETTING                = 102;
79eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_START_CHAR                   = 103;
80eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_END_CHAR                     = 104;
81eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_FONT_ID                      = 105;
82eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_FONT_SIZE                    = 106;
83eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int KEY_TEXT_COLOR_RGBA              = 107;
84eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
85eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final int LAST_PRIVATE_KEY                 = 107;
86eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
87eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private static final String TAG = "TimedText";
88eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
89eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private Parcel mParcel = Parcel.obtain();
90eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private final HashMap<Integer, Object> mKeyObjectMap =
91eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            new HashMap<Integer, Object>();
92eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
93eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mDisplayFlags = -1;
94eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mBackgroundColorRGBA = -1;
95eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mHighlightColorRGBA = -1;
96eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mScrollDelay = -1;
97eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mWrapText = -1;
98eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
99eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<CharPos> mBlinkingPosList = null;
100eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<CharPos> mHighlightPosList = null;
101eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Karaoke> mKaraokeList = null;
102eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Font> mFontList = null;
103eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Style> mStyleList = null;
104eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<HyperText> mHyperTextList = null;
105eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1067a9734d769d97470ce6fac0594dd007804d33432James Dong    private Rect mTextBounds = null;
1077a9734d769d97470ce6fac0594dd007804d33432James Dong    private String mTextChars = null;
108eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1097a9734d769d97470ce6fac0594dd007804d33432James Dong    private Justification mJustification;
110eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
111eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
112eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the start char offset and end char offset
113eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * for Blinking Text or Highlight Text. endChar is the end offset
114eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * of the text (startChar + number of characters to be highlighted
115eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * or blinked). The member variables in this class are read-only.
1167a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
117eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1187a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class CharPos {
119eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
120eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character
121eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1227a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
123eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
124eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
125eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character
126eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1277a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
128eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
129eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1307a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constuctor
1317a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character.
1327a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character.
133eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1347a9734d769d97470ce6fac0594dd007804d33432James Dong        public CharPos(int startChar, int endChar) {
1357a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
1367a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
1377a9734d769d97470ce6fac0594dd007804d33432James Dong        }
138eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
139eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
140eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
141eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the justification for text display in the text box.
142eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
1437a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
144eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1457a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Justification {
146eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1477a9734d769d97470ce6fac0594dd007804d33432James Dong         * horizontal justification  0: left, 1: centered, -1: right
148eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1497a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int horizontalJustification;
150eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
151eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1527a9734d769d97470ce6fac0594dd007804d33432James Dong         * vertical justification  0: top, 1: centered, -1: bottom
153eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1547a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int verticalJustification;
155eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1567a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
1577a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
1587a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param horizontal the horizontal justification of the text.
1597a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param vertical the vertical justification of the text.
1607a9734d769d97470ce6fac0594dd007804d33432James Dong         */
1617a9734d769d97470ce6fac0594dd007804d33432James Dong        public Justification(int horizontal, int vertical) {
1627a9734d769d97470ce6fac0594dd007804d33432James Dong            this.horizontalJustification = horizontal;
1637a9734d769d97470ce6fac0594dd007804d33432James Dong            this.verticalJustification = vertical;
1647a9734d769d97470ce6fac0594dd007804d33432James Dong        }
165eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
166eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
167eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
168eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the style information to display the text.
169eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
1707a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
171eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1727a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Style {
173eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
174eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character which applys this style
175eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1767a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
177eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
178eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
179eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character which applys this style
180eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1817a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
182eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
183eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
184eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * ID of the font. This ID will be used to choose the font
185eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * to be used from the font list.
186eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1877a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int fontID;
188eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
189eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
190eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be bold
191eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1927a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isBold;
193eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
194eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
195eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be italic
196eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1977a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isItalic;
198eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
199eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
200eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be underlined
201eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2027a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isUnderlined;
203eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
204eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
205eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The size of the font
206eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2077a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int fontSize;
208eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
209eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
210eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * To specify the RGBA color: 8 bits each of red, green, blue,
211eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * and an alpha(transparency) value
212eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2137a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int colorRGBA;
214eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2157a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2167a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2177a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character which applys this style
2187a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character which applys this style
2197a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param fontId the ID of the font.
2207a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isBold whether the characters should be bold.
2217a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isItalic whether the characters should be italic.
2227a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isUnderlined whether the characters should be underlined.
2237a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param fontSize the size of the font.
2247a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param colorRGBA red, green, blue, and alpha value for color.
2257a9734d769d97470ce6fac0594dd007804d33432James Dong         */
2267a9734d769d97470ce6fac0594dd007804d33432James Dong        public Style(int startChar, int endChar, int fontId,
2277a9734d769d97470ce6fac0594dd007804d33432James Dong                     boolean isBold, boolean isItalic, boolean isUnderlined,
2287a9734d769d97470ce6fac0594dd007804d33432James Dong                     int fontSize, int colorRGBA) {
2297a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
2307a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
2317a9734d769d97470ce6fac0594dd007804d33432James Dong            this.fontID = fontId;
2327a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isBold = isBold;
2337a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isItalic = isItalic;
2347a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isUnderlined = isUnderlined;
2357a9734d769d97470ce6fac0594dd007804d33432James Dong            this.fontSize = fontSize;
2367a9734d769d97470ce6fac0594dd007804d33432James Dong            this.colorRGBA = colorRGBA;
2377a9734d769d97470ce6fac0594dd007804d33432James Dong        }
238eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
239eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
240eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
241eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the font ID and name.
242eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
2437a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
244eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
2457a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Font {
246eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
247eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The font ID
248eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2497a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int ID;
250eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
251eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
252eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The font name
253eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2547a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String name;
255eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2567a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2577a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2587a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param id the font ID.
2597a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param name the font name.
2607a9734d769d97470ce6fac0594dd007804d33432James Dong         */
2617a9734d769d97470ce6fac0594dd007804d33432James Dong        public Font(int id, String name) {
2627a9734d769d97470ce6fac0594dd007804d33432James Dong            this.ID = id;
2637a9734d769d97470ce6fac0594dd007804d33432James Dong            this.name = name;
2647a9734d769d97470ce6fac0594dd007804d33432James Dong        }
265eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
266eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
267eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
268eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the karaoke information.
269eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
2707a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
271eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
2727a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Karaoke {
273eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
274eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The start time (in milliseconds) to highlight the characters
275eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * specified by startChar and endChar.
276eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2777a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startTimeMs;
278eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
279eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
280eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The end time (in milliseconds) to highlight the characters
281eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * specified by startChar and endChar.
282eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2837a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endTimeMs;
284eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
285eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
286eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character to be highlighted
287eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2887a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
289eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
290eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
291eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character to be highlighted
292eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2937a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
294eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2957a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2967a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2977a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startTimeMs the start time (in milliseconds) to highlight
2987a9734d769d97470ce6fac0594dd007804d33432James Dong         * the characters between startChar and endChar.
2997a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endTimeMs the end time (in milliseconds) to highlight
3007a9734d769d97470ce6fac0594dd007804d33432James Dong         * the characters between startChar and endChar.
3017a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character to be highlighted.
3027a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character to be highlighted.
3037a9734d769d97470ce6fac0594dd007804d33432James Dong         */
3047a9734d769d97470ce6fac0594dd007804d33432James Dong        public Karaoke(int startTimeMs, int endTimeMs, int startChar, int endChar) {
3057a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startTimeMs = startTimeMs;
3067a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endTimeMs = endTimeMs;
3077a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
3087a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
3097a9734d769d97470ce6fac0594dd007804d33432James Dong        }
310eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
311eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
312eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
313eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the hyper text information.
314eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
3157a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
316eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
3177a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class HyperText {
318eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
319eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character
320eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3217a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
322eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
323eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
324eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character
325eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3267a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
327eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
328eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
329eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The linked-to URL
330eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3317a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String URL;
332eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
333eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
334eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The "alt" string for user display
335eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3367a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String altString;
3377a9734d769d97470ce6fac0594dd007804d33432James Dong
338eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
3397a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
3407a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
3417a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character.
3427a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character.
3437a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param url the linked-to URL.
3447a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param alt the "alt" string for display.
3457a9734d769d97470ce6fac0594dd007804d33432James Dong         */
3467a9734d769d97470ce6fac0594dd007804d33432James Dong        public HyperText(int startChar, int endChar, String url, String alt) {
3477a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
3487a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
3497a9734d769d97470ce6fac0594dd007804d33432James Dong            this.URL = url;
3507a9734d769d97470ce6fac0594dd007804d33432James Dong            this.altString = alt;
3517a9734d769d97470ce6fac0594dd007804d33432James Dong        }
352eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
353eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
354eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
355eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param obj the byte array which contains the timed text.
356eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @throws IllegalArgumentExcept if parseParcel() fails.
357eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * {@hide}
358eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
359eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    public TimedText(byte[] obj) {
360eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mParcel.unmarshall(obj, 0, obj.length);
361eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
362eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (!parseParcel()) {
363eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKeyObjectMap.clear();
364eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            throw new IllegalArgumentException("parseParcel() fails");
365eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
366eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
367eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
368eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
3697a9734d769d97470ce6fac0594dd007804d33432James Dong     * Get the characters in the timed text.
3707a9734d769d97470ce6fac0594dd007804d33432James Dong     *
3717a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return the characters as a String object in the TimedText. Applications
3727a9734d769d97470ce6fac0594dd007804d33432James Dong     * should stop rendering previous timed text at the current rendering region if
3737a9734d769d97470ce6fac0594dd007804d33432James Dong     * a null is returned, until the next non-null timed text is received.
3747a9734d769d97470ce6fac0594dd007804d33432James Dong     */
3757a9734d769d97470ce6fac0594dd007804d33432James Dong    public String getText() {
3767a9734d769d97470ce6fac0594dd007804d33432James Dong        return mTextChars;
3777a9734d769d97470ce6fac0594dd007804d33432James Dong    }
3787a9734d769d97470ce6fac0594dd007804d33432James Dong
3797a9734d769d97470ce6fac0594dd007804d33432James Dong    /**
3807a9734d769d97470ce6fac0594dd007804d33432James Dong     * Get the rectangle area or region for rendering the timed text as specified
3817a9734d769d97470ce6fac0594dd007804d33432James Dong     * by a Rect object.
3827a9734d769d97470ce6fac0594dd007804d33432James Dong     *
3837a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return the rectangle region to render the characters in the timed text.
3847a9734d769d97470ce6fac0594dd007804d33432James Dong     * If no bounds information is available (a null is returned), render the
3857a9734d769d97470ce6fac0594dd007804d33432James Dong     * timed text at the center bottom of the display.
3867a9734d769d97470ce6fac0594dd007804d33432James Dong     */
3877a9734d769d97470ce6fac0594dd007804d33432James Dong    public Rect getBounds() {
3887a9734d769d97470ce6fac0594dd007804d33432James Dong        return mTextBounds;
3897a9734d769d97470ce6fac0594dd007804d33432James Dong    }
3907a9734d769d97470ce6fac0594dd007804d33432James Dong
3917a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
392eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Go over all the records, collecting metadata keys and fields in the
393eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Parcel. These are stored in mKeyObjectMap for application to retrieve.
394eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return false if an error occurred during parsing. Otherwise, true.
395eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
396eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private boolean parseParcel() {
397eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mParcel.setDataPosition(0);
398eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mParcel.dataAvail() == 0) {
399eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
400eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
401eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
402eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        int type = mParcel.readInt();
403eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (type == KEY_LOCAL_SETTING) {
404eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            type = mParcel.readInt();
405eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (type != KEY_START_TIME) {
406eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
407eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
408eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            int mStartTimeMs = mParcel.readInt();
409eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKeyObjectMap.put(type, mStartTimeMs);
410eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
411eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            type = mParcel.readInt();
412eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (type != KEY_STRUCT_TEXT) {
413eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
414eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
415eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4167a9734d769d97470ce6fac0594dd007804d33432James Dong            int textLen = mParcel.readInt();
4177a9734d769d97470ce6fac0594dd007804d33432James Dong            byte[] text = mParcel.createByteArray();
4187a9734d769d97470ce6fac0594dd007804d33432James Dong            if (text == null || text.length == 0) {
4197a9734d769d97470ce6fac0594dd007804d33432James Dong                mTextChars = null;
4207a9734d769d97470ce6fac0594dd007804d33432James Dong            } else {
4217a9734d769d97470ce6fac0594dd007804d33432James Dong                mTextChars = new String(text);
4227a9734d769d97470ce6fac0594dd007804d33432James Dong            }
423eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
424eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        } else if (type != KEY_GLOBAL_SETTING) {
425eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            Log.w(TAG, "Invalid timed text key found: " + type);
426eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
427eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
428eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
429eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        while (mParcel.dataAvail() > 0) {
430eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            int key = mParcel.readInt();
431eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (!isValidKey(key)) {
432eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                Log.w(TAG, "Invalid timed text key found: " + key);
433eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
434eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
435eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
436eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            Object object = null;
437eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
438eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            switch (key) {
439eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_STYLE_LIST: {
440eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readStyle();
441eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mStyleList;
442eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
443eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
444eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_FONT_LIST: {
445eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readFont();
446eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mFontList;
447eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
448eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
449eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_HIGHLIGHT_LIST: {
450eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readHighlight();
451eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHighlightPosList;
452eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
453eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
454eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_KARAOKE_LIST: {
455eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readKaraoke();
456eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mKaraokeList;
457eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
458eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
459eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_HYPER_TEXT_LIST: {
460eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readHyperText();
461eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHyperTextList;
462eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
463eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
464eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
465eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_BLINKING_TEXT_LIST: {
466eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    readBlinkingText();
467eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mBlinkingPosList;
468eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
469eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
470eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
471eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_WRAP_TEXT: {
472eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mWrapText = mParcel.readInt();
473eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mWrapText;
474eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
475eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
476eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_HIGHLIGHT_COLOR_RGBA: {
477eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mHighlightColorRGBA = mParcel.readInt();
478eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHighlightColorRGBA;
479eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
480eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
481eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_DISPLAY_FLAGS: {
482eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mDisplayFlags = mParcel.readInt();
483eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mDisplayFlags;
484eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
485eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
486eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_JUSTIFICATION: {
487eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4887a9734d769d97470ce6fac0594dd007804d33432James Dong                    int horizontal = mParcel.readInt();
4897a9734d769d97470ce6fac0594dd007804d33432James Dong                    int vertical = mParcel.readInt();
4907a9734d769d97470ce6fac0594dd007804d33432James Dong                    mJustification = new Justification(horizontal, vertical);
491eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
492eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mJustification;
493eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
494eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
495eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_BACKGROUND_COLOR_RGBA: {
496eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mBackgroundColorRGBA = mParcel.readInt();
497eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mBackgroundColorRGBA;
498eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
499eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
500eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_TEXT_POS: {
5017a9734d769d97470ce6fac0594dd007804d33432James Dong                    int top = mParcel.readInt();
5027a9734d769d97470ce6fac0594dd007804d33432James Dong                    int left = mParcel.readInt();
5037a9734d769d97470ce6fac0594dd007804d33432James Dong                    int bottom = mParcel.readInt();
5047a9734d769d97470ce6fac0594dd007804d33432James Dong                    int right = mParcel.readInt();
5057a9734d769d97470ce6fac0594dd007804d33432James Dong                    mTextBounds = new Rect(left, top, right, bottom);
506eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
507eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
508eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
509eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_SCROLL_DELAY: {
510eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mScrollDelay = mParcel.readInt();
511eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mScrollDelay;
512eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
513eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
514eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                default: {
515eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
516eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
517eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
518eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
519eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (object != null) {
520eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                if (mKeyObjectMap.containsKey(key)) {
521eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mKeyObjectMap.remove(key);
522eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
523eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mKeyObjectMap.put(key, object);
524eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
525eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
526eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
527eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mParcel.recycle();
528eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return true;
529eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
530eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5317a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
532eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Style list.
533eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
534eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readStyle() {
535eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        boolean endOfStyle = false;
5367a9734d769d97470ce6fac0594dd007804d33432James Dong        int startChar = -1;
5377a9734d769d97470ce6fac0594dd007804d33432James Dong        int endChar = -1;
5387a9734d769d97470ce6fac0594dd007804d33432James Dong        int fontId = -1;
5397a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isBold = false;
5407a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isItalic = false;
5417a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isUnderlined = false;
5427a9734d769d97470ce6fac0594dd007804d33432James Dong        int fontSize = -1;
5437a9734d769d97470ce6fac0594dd007804d33432James Dong        int colorRGBA = -1;
544eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        while (!endOfStyle && (mParcel.dataAvail() > 0)) {
545eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            int key = mParcel.readInt();
546eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            switch (key) {
547eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_START_CHAR: {
5487a9734d769d97470ce6fac0594dd007804d33432James Dong                    startChar = mParcel.readInt();
549eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
550eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
551eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_END_CHAR: {
5527a9734d769d97470ce6fac0594dd007804d33432James Dong                    endChar = mParcel.readInt();
553eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
554eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
555eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_FONT_ID: {
5567a9734d769d97470ce6fac0594dd007804d33432James Dong                    fontId = mParcel.readInt();
557eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
558eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
559eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STYLE_FLAGS: {
560eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    int flags = mParcel.readInt();
561eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // In the absence of any bits set in flags, the text
562eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // is plain. Otherwise, 1: bold, 2: italic, 4: underline
5637a9734d769d97470ce6fac0594dd007804d33432James Dong                    isBold = ((flags % 2) == 1);
5647a9734d769d97470ce6fac0594dd007804d33432James Dong                    isItalic = ((flags % 4) >= 2);
5657a9734d769d97470ce6fac0594dd007804d33432James Dong                    isUnderlined = ((flags / 4) == 1);
566eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
567eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
568eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_FONT_SIZE: {
5697a9734d769d97470ce6fac0594dd007804d33432James Dong                    fontSize = mParcel.readInt();
570eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
571eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
572eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_TEXT_COLOR_RGBA: {
5737a9734d769d97470ce6fac0594dd007804d33432James Dong                    colorRGBA = mParcel.readInt();
574eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
575eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
576eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                default: {
577eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // End of the Style parsing. Reset the data position back
578eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // to the position before the last mParcel.readInt() call.
579eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mParcel.setDataPosition(mParcel.dataPosition() - 4);
580eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    endOfStyle = true;
581eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
582eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
583eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
584eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
585eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5867a9734d769d97470ce6fac0594dd007804d33432James Dong        Style style = new Style(startChar, endChar, fontId, isBold,
5877a9734d769d97470ce6fac0594dd007804d33432James Dong                                isItalic, isUnderlined, fontSize, colorRGBA);
588eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mStyleList == null) {
589eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mStyleList = new ArrayList<Style>();
590eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
591eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mStyleList.add(style);
592eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
593eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5947a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
595eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Font list
596eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
597eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readFont() {
598eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        int entryCount = mParcel.readInt();
599eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
600eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        for (int i = 0; i < entryCount; i++) {
6017a9734d769d97470ce6fac0594dd007804d33432James Dong            int id = mParcel.readInt();
602eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            int nameLen = mParcel.readInt();
603eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
604eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            byte[] text = mParcel.createByteArray();
6057a9734d769d97470ce6fac0594dd007804d33432James Dong            final String name = new String(text, 0, nameLen);
6067a9734d769d97470ce6fac0594dd007804d33432James Dong
6077a9734d769d97470ce6fac0594dd007804d33432James Dong            Font font = new Font(id, name);
608eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
609eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (mFontList == null) {
610eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mFontList = new ArrayList<Font>();
611eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
612eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mFontList.add(font);
613eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
614eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
615eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6167a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
617eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Highlight list
618eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
619eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readHighlight() {
6207a9734d769d97470ce6fac0594dd007804d33432James Dong        int startChar = mParcel.readInt();
6217a9734d769d97470ce6fac0594dd007804d33432James Dong        int endChar = mParcel.readInt();
6227a9734d769d97470ce6fac0594dd007804d33432James Dong        CharPos pos = new CharPos(startChar, endChar);
623eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
624eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mHighlightPosList == null) {
625eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mHighlightPosList = new ArrayList<CharPos>();
626eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
627eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mHighlightPosList.add(pos);
628eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
629eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6307a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
631eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Karaoke list
632eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
633eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readKaraoke() {
634eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        int entryCount = mParcel.readInt();
635eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
636eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        for (int i = 0; i < entryCount; i++) {
6377a9734d769d97470ce6fac0594dd007804d33432James Dong            int startTimeMs = mParcel.readInt();
6387a9734d769d97470ce6fac0594dd007804d33432James Dong            int endTimeMs = mParcel.readInt();
6397a9734d769d97470ce6fac0594dd007804d33432James Dong            int startChar = mParcel.readInt();
6407a9734d769d97470ce6fac0594dd007804d33432James Dong            int endChar = mParcel.readInt();
6417a9734d769d97470ce6fac0594dd007804d33432James Dong            Karaoke kara = new Karaoke(startTimeMs, endTimeMs,
6427a9734d769d97470ce6fac0594dd007804d33432James Dong                                       startChar, endChar);
643eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
644eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (mKaraokeList == null) {
645eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mKaraokeList = new ArrayList<Karaoke>();
646eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
647eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKaraokeList.add(kara);
648eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
649eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
650eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6517a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
652eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store HyperText list
653eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
654eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readHyperText() {
6557a9734d769d97470ce6fac0594dd007804d33432James Dong        int startChar = mParcel.readInt();
6567a9734d769d97470ce6fac0594dd007804d33432James Dong        int endChar = mParcel.readInt();
657eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
658eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        int len = mParcel.readInt();
659eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        byte[] url = mParcel.createByteArray();
6607a9734d769d97470ce6fac0594dd007804d33432James Dong        final String urlString = new String(url, 0, len);
661eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
662eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        len = mParcel.readInt();
663eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        byte[] alt = mParcel.createByteArray();
6647a9734d769d97470ce6fac0594dd007804d33432James Dong        final String altString = new String(alt, 0, len);
6657a9734d769d97470ce6fac0594dd007804d33432James Dong        HyperText hyperText = new HyperText(startChar, endChar, urlString, altString);
6667a9734d769d97470ce6fac0594dd007804d33432James Dong
667eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
668eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mHyperTextList == null) {
669eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mHyperTextList = new ArrayList<HyperText>();
670eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
671eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mHyperTextList.add(hyperText);
672eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
673eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6747a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
675eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store blinking text list
676eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
677eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private void readBlinkingText() {
6787a9734d769d97470ce6fac0594dd007804d33432James Dong        int startChar = mParcel.readInt();
6797a9734d769d97470ce6fac0594dd007804d33432James Dong        int endChar = mParcel.readInt();
6807a9734d769d97470ce6fac0594dd007804d33432James Dong        CharPos blinkingPos = new CharPos(startChar, endChar);
681eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
682eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mBlinkingPosList == null) {
683eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mBlinkingPosList = new ArrayList<CharPos>();
684eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
685eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mBlinkingPosList.add(blinkingPos);
686eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
687eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6887a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
689eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To check whether the given key is valid.
690eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key to be checked.
691eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return true if the key is a valid one. Otherwise, false.
692eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6937a9734d769d97470ce6fac0594dd007804d33432James Dong    private boolean isValidKey(final int key) {
694eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (!((key >= FIRST_PUBLIC_KEY) && (key <= LAST_PUBLIC_KEY))
695eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                && !((key >= FIRST_PRIVATE_KEY) && (key <= LAST_PRIVATE_KEY))) {
696eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
697eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
698eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return true;
699eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
700eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
7017a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
702eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To check whether the given key is contained in this TimedText object.
703eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key to be checked.
704eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return true if the key is contained in this TimedText object.
705eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     *         Otherwise, false.
706eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7077a9734d769d97470ce6fac0594dd007804d33432James Dong    private boolean containsKey(final int key) {
708eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (isValidKey(key) && mKeyObjectMap.containsKey(key)) {
709eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return true;
710eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
711eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return false;
712eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
7137a9734d769d97470ce6fac0594dd007804d33432James Dong
7147a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
715eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return a set of the keys contained in this TimedText object.
716eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7177a9734d769d97470ce6fac0594dd007804d33432James Dong    private Set keySet() {
718eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return mKeyObjectMap.keySet();
719eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
720eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
7217a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
722eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To retrieve the object associated with the key. Caller must make sure
723eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * the key is present using the containsKey method otherwise a
724eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * RuntimeException will occur.
725eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key used to retrieve the object.
7267a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return an object. The object could be 1) an instance of Integer; 2) a
7277a9734d769d97470ce6fac0594dd007804d33432James Dong     * List of CharPos, Karaoke, Font, Style, and HyperText, or 3) an instance of
7287a9734d769d97470ce6fac0594dd007804d33432James Dong     * Justification.
729eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7307a9734d769d97470ce6fac0594dd007804d33432James Dong    private Object getObject(final int key) {
731eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (containsKey(key)) {
732eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return mKeyObjectMap.get(key);
733eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        } else {
734eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            throw new IllegalArgumentException("Invalid key: " + key);
735eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
736eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
737eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang}
738