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>
318902097bb686752ff207e3bda12713be1a8c74ebInsun Kang * <li> The rendering position 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 final HashMap<Integer, Object> mKeyObjectMap =
90eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            new HashMap<Integer, Object>();
91eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
92eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mDisplayFlags = -1;
93eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mBackgroundColorRGBA = -1;
94eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mHighlightColorRGBA = -1;
95eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mScrollDelay = -1;
96eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private int mWrapText = -1;
97eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
98eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<CharPos> mBlinkingPosList = null;
99eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<CharPos> mHighlightPosList = null;
100eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Karaoke> mKaraokeList = null;
101eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Font> mFontList = null;
102eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<Style> mStyleList = null;
103eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    private List<HyperText> mHyperTextList = null;
104eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1057a9734d769d97470ce6fac0594dd007804d33432James Dong    private Rect mTextBounds = null;
1067a9734d769d97470ce6fac0594dd007804d33432James Dong    private String mTextChars = null;
107eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1087a9734d769d97470ce6fac0594dd007804d33432James Dong    private Justification mJustification;
109eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
110eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
111eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the start char offset and end char offset
112eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * for Blinking Text or Highlight Text. endChar is the end offset
113eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * of the text (startChar + number of characters to be highlighted
114eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * or blinked). The member variables in this class are read-only.
1157a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
116eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1177a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class CharPos {
118eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
119eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character
120eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1217a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
122eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
123eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
124eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character
125eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1267a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
127eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
128eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1297a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constuctor
1307a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character.
1317a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character.
132eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1337a9734d769d97470ce6fac0594dd007804d33432James Dong        public CharPos(int startChar, int endChar) {
1347a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
1357a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
1367a9734d769d97470ce6fac0594dd007804d33432James Dong        }
137eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
138eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
139eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
140eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the justification for text display in the text box.
141eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
1427a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
143eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1447a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Justification {
145eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1467a9734d769d97470ce6fac0594dd007804d33432James Dong         * horizontal justification  0: left, 1: centered, -1: right
147eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1487a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int horizontalJustification;
149eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
150eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
1517a9734d769d97470ce6fac0594dd007804d33432James Dong         * vertical justification  0: top, 1: centered, -1: bottom
152eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1537a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int verticalJustification;
154eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
1557a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
1567a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
1577a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param horizontal the horizontal justification of the text.
1587a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param vertical the vertical justification of the text.
1597a9734d769d97470ce6fac0594dd007804d33432James Dong         */
1607a9734d769d97470ce6fac0594dd007804d33432James Dong        public Justification(int horizontal, int vertical) {
1617a9734d769d97470ce6fac0594dd007804d33432James Dong            this.horizontalJustification = horizontal;
1627a9734d769d97470ce6fac0594dd007804d33432James Dong            this.verticalJustification = vertical;
1637a9734d769d97470ce6fac0594dd007804d33432James Dong        }
164eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
165eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
166eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
167eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the style information to display the text.
168eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
1697a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
170eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
1717a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Style {
172eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
173eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character which applys this style
174eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1757a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
176eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
177eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
178eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character which applys this style
179eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1807a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
181eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
182eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
183eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * ID of the font. This ID will be used to choose the font
184eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * to be used from the font list.
185eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1867a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int fontID;
187eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
188eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
189eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be bold
190eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1917a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isBold;
192eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
193eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
194eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be italic
195eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
1967a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isItalic;
197eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
198eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
199eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * True if the characters should be underlined
200eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2017a9734d769d97470ce6fac0594dd007804d33432James Dong        public final boolean isUnderlined;
202eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
203eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
204eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The size of the font
205eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2067a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int fontSize;
207eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
208eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
209eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * To specify the RGBA color: 8 bits each of red, green, blue,
210eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * and an alpha(transparency) value
211eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2127a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int colorRGBA;
213eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2147a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2157a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2167a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character which applys this style
2177a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character which applys this style
2187a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param fontId the ID of the font.
2197a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isBold whether the characters should be bold.
2207a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isItalic whether the characters should be italic.
2217a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param isUnderlined whether the characters should be underlined.
2227a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param fontSize the size of the font.
2237a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param colorRGBA red, green, blue, and alpha value for color.
2247a9734d769d97470ce6fac0594dd007804d33432James Dong         */
2257a9734d769d97470ce6fac0594dd007804d33432James Dong        public Style(int startChar, int endChar, int fontId,
2267a9734d769d97470ce6fac0594dd007804d33432James Dong                     boolean isBold, boolean isItalic, boolean isUnderlined,
2277a9734d769d97470ce6fac0594dd007804d33432James Dong                     int fontSize, int colorRGBA) {
2287a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
2297a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
2307a9734d769d97470ce6fac0594dd007804d33432James Dong            this.fontID = fontId;
2317a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isBold = isBold;
2327a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isItalic = isItalic;
2337a9734d769d97470ce6fac0594dd007804d33432James Dong            this.isUnderlined = isUnderlined;
2347a9734d769d97470ce6fac0594dd007804d33432James Dong            this.fontSize = fontSize;
2357a9734d769d97470ce6fac0594dd007804d33432James Dong            this.colorRGBA = colorRGBA;
2367a9734d769d97470ce6fac0594dd007804d33432James Dong        }
237eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
238eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
239eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
240eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the font ID and name.
241eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
2427a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
243eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
2447a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Font {
245eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
246eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The font ID
247eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2487a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int ID;
249eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
250eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
251eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The font name
252eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2537a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String name;
254eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2557a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2567a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2577a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param id the font ID.
2587a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param name the font name.
2597a9734d769d97470ce6fac0594dd007804d33432James Dong         */
2607a9734d769d97470ce6fac0594dd007804d33432James Dong        public Font(int id, String name) {
2617a9734d769d97470ce6fac0594dd007804d33432James Dong            this.ID = id;
2627a9734d769d97470ce6fac0594dd007804d33432James Dong            this.name = name;
2637a9734d769d97470ce6fac0594dd007804d33432James Dong        }
264eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
265eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
266eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
267eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the karaoke information.
268eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
2697a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
270eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
2717a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class Karaoke {
272eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
273eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The start time (in milliseconds) to highlight the characters
274eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * specified by startChar and endChar.
275eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2767a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startTimeMs;
277eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
278eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
279eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The end time (in milliseconds) to highlight the characters
280eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * specified by startChar and endChar.
281eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2827a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endTimeMs;
283eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
284eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
285eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character to be highlighted
286eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2877a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
288eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
289eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
290eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character to be highlighted
291eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
2927a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
293eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
2947a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
2957a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
2967a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startTimeMs the start time (in milliseconds) to highlight
2977a9734d769d97470ce6fac0594dd007804d33432James Dong         * the characters between startChar and endChar.
2987a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endTimeMs the end time (in milliseconds) to highlight
2997a9734d769d97470ce6fac0594dd007804d33432James Dong         * the characters between startChar and endChar.
3007a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character to be highlighted.
3017a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character to be highlighted.
3027a9734d769d97470ce6fac0594dd007804d33432James Dong         */
3037a9734d769d97470ce6fac0594dd007804d33432James Dong        public Karaoke(int startTimeMs, int endTimeMs, int startChar, int endChar) {
3047a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startTimeMs = startTimeMs;
3057a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endTimeMs = endTimeMs;
3067a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
3077a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
3087a9734d769d97470ce6fac0594dd007804d33432James Dong        }
309eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
310eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
311eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
312eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Helper class to hold the hyper text information.
313eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * The member variables in this class are read-only.
3147a9734d769d97470ce6fac0594dd007804d33432James Dong     * {@hide}
315eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
3167a9734d769d97470ce6fac0594dd007804d33432James Dong    public static final class HyperText {
317eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
318eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the start character
319eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3207a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int startChar;
321eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
322eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
323eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The offset of the end character
324eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3257a9734d769d97470ce6fac0594dd007804d33432James Dong        public final int endChar;
326eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
327eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
328eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The linked-to URL
329eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3307a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String URL;
331eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
332eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        /**
333eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         * The "alt" string for user display
334eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang         */
3357a9734d769d97470ce6fac0594dd007804d33432James Dong        public final String altString;
3367a9734d769d97470ce6fac0594dd007804d33432James Dong
337eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
3387a9734d769d97470ce6fac0594dd007804d33432James Dong        /**
3397a9734d769d97470ce6fac0594dd007804d33432James Dong         * Constructor
3407a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param startChar the offset of the start character.
3417a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param endChar the offset of the end character.
3427a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param url the linked-to URL.
3437a9734d769d97470ce6fac0594dd007804d33432James Dong         * @param alt the "alt" string for display.
3447a9734d769d97470ce6fac0594dd007804d33432James Dong         */
3457a9734d769d97470ce6fac0594dd007804d33432James Dong        public HyperText(int startChar, int endChar, String url, String alt) {
3467a9734d769d97470ce6fac0594dd007804d33432James Dong            this.startChar = startChar;
3477a9734d769d97470ce6fac0594dd007804d33432James Dong            this.endChar = endChar;
3487a9734d769d97470ce6fac0594dd007804d33432James Dong            this.URL = url;
3497a9734d769d97470ce6fac0594dd007804d33432James Dong            this.altString = alt;
3507a9734d769d97470ce6fac0594dd007804d33432James Dong        }
351eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
352eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
353eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
354eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param obj the byte array which contains the timed text.
355eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @throws IllegalArgumentExcept if parseParcel() fails.
356eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * {@hide}
357eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
3588902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    public TimedText(Parcel parcel) {
3598902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        if (!parseParcel(parcel)) {
360eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKeyObjectMap.clear();
361eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            throw new IllegalArgumentException("parseParcel() fails");
362eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
363eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
364eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
365eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    /**
3667a9734d769d97470ce6fac0594dd007804d33432James Dong     * Get the characters in the timed text.
3677a9734d769d97470ce6fac0594dd007804d33432James Dong     *
3687a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return the characters as a String object in the TimedText. Applications
3697a9734d769d97470ce6fac0594dd007804d33432James Dong     * should stop rendering previous timed text at the current rendering region if
3707a9734d769d97470ce6fac0594dd007804d33432James Dong     * a null is returned, until the next non-null timed text is received.
3717a9734d769d97470ce6fac0594dd007804d33432James Dong     */
3727a9734d769d97470ce6fac0594dd007804d33432James Dong    public String getText() {
3737a9734d769d97470ce6fac0594dd007804d33432James Dong        return mTextChars;
3747a9734d769d97470ce6fac0594dd007804d33432James Dong    }
3757a9734d769d97470ce6fac0594dd007804d33432James Dong
3767a9734d769d97470ce6fac0594dd007804d33432James Dong    /**
3777a9734d769d97470ce6fac0594dd007804d33432James Dong     * Get the rectangle area or region for rendering the timed text as specified
3787a9734d769d97470ce6fac0594dd007804d33432James Dong     * by a Rect object.
3797a9734d769d97470ce6fac0594dd007804d33432James Dong     *
3807a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return the rectangle region to render the characters in the timed text.
3817a9734d769d97470ce6fac0594dd007804d33432James Dong     * If no bounds information is available (a null is returned), render the
3827a9734d769d97470ce6fac0594dd007804d33432James Dong     * timed text at the center bottom of the display.
3837a9734d769d97470ce6fac0594dd007804d33432James Dong     */
3847a9734d769d97470ce6fac0594dd007804d33432James Dong    public Rect getBounds() {
3857a9734d769d97470ce6fac0594dd007804d33432James Dong        return mTextBounds;
3867a9734d769d97470ce6fac0594dd007804d33432James Dong    }
3877a9734d769d97470ce6fac0594dd007804d33432James Dong
3887a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
389eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Go over all the records, collecting metadata keys and fields in the
390eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * Parcel. These are stored in mKeyObjectMap for application to retrieve.
391eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return false if an error occurred during parsing. Otherwise, true.
392eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
3938902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private boolean parseParcel(Parcel parcel) {
3948902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        parcel.setDataPosition(0);
3958902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        if (parcel.dataAvail() == 0) {
396eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
397eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
398eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
3998902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int type = parcel.readInt();
400eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (type == KEY_LOCAL_SETTING) {
4018902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            type = parcel.readInt();
402eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (type != KEY_START_TIME) {
403eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
404eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
4058902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int mStartTimeMs = parcel.readInt();
406eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKeyObjectMap.put(type, mStartTimeMs);
407eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4088902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            type = parcel.readInt();
409eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (type != KEY_STRUCT_TEXT) {
410eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
411eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
412eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4138902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int textLen = parcel.readInt();
4148902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            byte[] text = parcel.createByteArray();
4157a9734d769d97470ce6fac0594dd007804d33432James Dong            if (text == null || text.length == 0) {
4167a9734d769d97470ce6fac0594dd007804d33432James Dong                mTextChars = null;
4177a9734d769d97470ce6fac0594dd007804d33432James Dong            } else {
4187a9734d769d97470ce6fac0594dd007804d33432James Dong                mTextChars = new String(text);
4197a9734d769d97470ce6fac0594dd007804d33432James Dong            }
420eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
421eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        } else if (type != KEY_GLOBAL_SETTING) {
422eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            Log.w(TAG, "Invalid timed text key found: " + type);
423eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
424eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
425eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4268902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        while (parcel.dataAvail() > 0) {
4278902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int key = parcel.readInt();
428eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (!isValidKey(key)) {
429eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                Log.w(TAG, "Invalid timed text key found: " + key);
430eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                return false;
431eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
432eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
433eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            Object object = null;
434eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
435eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            switch (key) {
436eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_STYLE_LIST: {
4378902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readStyle(parcel);
438eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mStyleList;
439eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
440eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
441eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_FONT_LIST: {
4428902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readFont(parcel);
443eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mFontList;
444eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
445eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
446eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_HIGHLIGHT_LIST: {
4478902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readHighlight(parcel);
448eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHighlightPosList;
449eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
450eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
451eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_KARAOKE_LIST: {
4528902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readKaraoke(parcel);
453eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mKaraokeList;
454eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
455eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
456eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_HYPER_TEXT_LIST: {
4578902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readHyperText(parcel);
458eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHyperTextList;
459eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
460eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
461eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
462eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_BLINKING_TEXT_LIST: {
4638902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    readBlinkingText(parcel);
464eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mBlinkingPosList;
465eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
466eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
467eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
468eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_WRAP_TEXT: {
4698902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    mWrapText = parcel.readInt();
470eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mWrapText;
471eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
472eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
473eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_HIGHLIGHT_COLOR_RGBA: {
4748902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    mHighlightColorRGBA = parcel.readInt();
475eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mHighlightColorRGBA;
476eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
477eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
478eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_DISPLAY_FLAGS: {
4798902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    mDisplayFlags = parcel.readInt();
480eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mDisplayFlags;
481eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
482eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
483eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_JUSTIFICATION: {
484eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
4858902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int horizontal = parcel.readInt();
4868902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int vertical = parcel.readInt();
4877a9734d769d97470ce6fac0594dd007804d33432James Dong                    mJustification = new Justification(horizontal, vertical);
488eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
489eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mJustification;
490eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
491eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
492eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_BACKGROUND_COLOR_RGBA: {
4938902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    mBackgroundColorRGBA = parcel.readInt();
494eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mBackgroundColorRGBA;
495eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
496eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
497eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STRUCT_TEXT_POS: {
4988902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int top = parcel.readInt();
4998902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int left = parcel.readInt();
5008902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int bottom = parcel.readInt();
5018902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int right = parcel.readInt();
5027a9734d769d97470ce6fac0594dd007804d33432James Dong                    mTextBounds = new Rect(left, top, right, bottom);
503eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
504eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
505eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
506eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_SCROLL_DELAY: {
5078902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    mScrollDelay = parcel.readInt();
508eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    object = mScrollDelay;
509eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
510eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
511eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                default: {
512eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
513eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
514eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
515eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
516eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (object != null) {
517eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                if (mKeyObjectMap.containsKey(key)) {
518eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    mKeyObjectMap.remove(key);
519eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
5208902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                // Previous mapping will be replaced with the new object, if there was one.
521eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mKeyObjectMap.put(key, object);
522eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
523eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
524eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
525eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return true;
526eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
527eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5287a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
529eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Style list.
530eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
5318902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readStyle(Parcel parcel) {
532eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        boolean endOfStyle = false;
5337a9734d769d97470ce6fac0594dd007804d33432James Dong        int startChar = -1;
5347a9734d769d97470ce6fac0594dd007804d33432James Dong        int endChar = -1;
5357a9734d769d97470ce6fac0594dd007804d33432James Dong        int fontId = -1;
5367a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isBold = false;
5377a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isItalic = false;
5387a9734d769d97470ce6fac0594dd007804d33432James Dong        boolean isUnderlined = false;
5397a9734d769d97470ce6fac0594dd007804d33432James Dong        int fontSize = -1;
5407a9734d769d97470ce6fac0594dd007804d33432James Dong        int colorRGBA = -1;
5418902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        while (!endOfStyle && (parcel.dataAvail() > 0)) {
5428902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int key = parcel.readInt();
543eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            switch (key) {
544eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_START_CHAR: {
5458902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    startChar = parcel.readInt();
546eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
547eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
548eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_END_CHAR: {
5498902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    endChar = parcel.readInt();
550eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
551eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
552eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_FONT_ID: {
5538902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    fontId = parcel.readInt();
554eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
555eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
556eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_STYLE_FLAGS: {
5578902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    int flags = parcel.readInt();
558eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // In the absence of any bits set in flags, the text
559eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // is plain. Otherwise, 1: bold, 2: italic, 4: underline
5607a9734d769d97470ce6fac0594dd007804d33432James Dong                    isBold = ((flags % 2) == 1);
5617a9734d769d97470ce6fac0594dd007804d33432James Dong                    isItalic = ((flags % 4) >= 2);
5627a9734d769d97470ce6fac0594dd007804d33432James Dong                    isUnderlined = ((flags / 4) == 1);
563eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
564eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
565eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_FONT_SIZE: {
5668902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    fontSize = parcel.readInt();
567eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
568eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
569eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                case KEY_TEXT_COLOR_RGBA: {
5708902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    colorRGBA = parcel.readInt();
571eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
572eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
573eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                default: {
574eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    // End of the Style parsing. Reset the data position back
5758902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    // to the position before the last parcel.readInt() call.
5768902097bb686752ff207e3bda12713be1a8c74ebInsun Kang                    parcel.setDataPosition(parcel.dataPosition() - 4);
577eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    endOfStyle = true;
578eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                    break;
579eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                }
580eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
581eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
582eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5837a9734d769d97470ce6fac0594dd007804d33432James Dong        Style style = new Style(startChar, endChar, fontId, isBold,
5847a9734d769d97470ce6fac0594dd007804d33432James Dong                                isItalic, isUnderlined, fontSize, colorRGBA);
585eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mStyleList == null) {
586eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mStyleList = new ArrayList<Style>();
587eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
588eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mStyleList.add(style);
589eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
590eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
5917a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
592eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Font list
593eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
5948902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readFont(Parcel parcel) {
5958902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int entryCount = parcel.readInt();
596eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
597eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        for (int i = 0; i < entryCount; i++) {
5988902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int id = parcel.readInt();
5998902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int nameLen = parcel.readInt();
600eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6018902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            byte[] text = parcel.createByteArray();
6027a9734d769d97470ce6fac0594dd007804d33432James Dong            final String name = new String(text, 0, nameLen);
6037a9734d769d97470ce6fac0594dd007804d33432James Dong
6047a9734d769d97470ce6fac0594dd007804d33432James Dong            Font font = new Font(id, name);
605eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
606eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (mFontList == null) {
607eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mFontList = new ArrayList<Font>();
608eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
609eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mFontList.add(font);
610eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
611eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
612eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6137a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
614eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Highlight list
615eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6168902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readHighlight(Parcel parcel) {
6178902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int startChar = parcel.readInt();
6188902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int endChar = parcel.readInt();
6197a9734d769d97470ce6fac0594dd007804d33432James Dong        CharPos pos = new CharPos(startChar, endChar);
620eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
621eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mHighlightPosList == null) {
622eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mHighlightPosList = new ArrayList<CharPos>();
623eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
624eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mHighlightPosList.add(pos);
625eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
626eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6277a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
628eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store the Karaoke list
629eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6308902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readKaraoke(Parcel parcel) {
6318902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int entryCount = parcel.readInt();
632eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
633eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        for (int i = 0; i < entryCount; i++) {
6348902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int startTimeMs = parcel.readInt();
6358902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int endTimeMs = parcel.readInt();
6368902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int startChar = parcel.readInt();
6378902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            int endChar = parcel.readInt();
6387a9734d769d97470ce6fac0594dd007804d33432James Dong            Karaoke kara = new Karaoke(startTimeMs, endTimeMs,
6397a9734d769d97470ce6fac0594dd007804d33432James Dong                                       startChar, endChar);
640eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
641eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            if (mKaraokeList == null) {
642eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                mKaraokeList = new ArrayList<Karaoke>();
643eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            }
644eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mKaraokeList.add(kara);
645eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
646eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
647eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6487a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
649eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store HyperText list
650eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6518902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readHyperText(Parcel parcel) {
6528902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int startChar = parcel.readInt();
6538902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int endChar = parcel.readInt();
654eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6558902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int len = parcel.readInt();
6568902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        byte[] url = parcel.createByteArray();
6577a9734d769d97470ce6fac0594dd007804d33432James Dong        final String urlString = new String(url, 0, len);
658eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6598902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        len = parcel.readInt();
6608902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        byte[] alt = parcel.createByteArray();
6617a9734d769d97470ce6fac0594dd007804d33432James Dong        final String altString = new String(alt, 0, len);
6627a9734d769d97470ce6fac0594dd007804d33432James Dong        HyperText hyperText = new HyperText(startChar, endChar, urlString, altString);
6637a9734d769d97470ce6fac0594dd007804d33432James Dong
664eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
665eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mHyperTextList == null) {
666eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mHyperTextList = new ArrayList<HyperText>();
667eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
668eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mHyperTextList.add(hyperText);
669eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
670eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6717a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
672eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To parse and store blinking text list
673eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6748902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    private void readBlinkingText(Parcel parcel) {
6758902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int startChar = parcel.readInt();
6768902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        int endChar = parcel.readInt();
6777a9734d769d97470ce6fac0594dd007804d33432James Dong        CharPos blinkingPos = new CharPos(startChar, endChar);
678eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
679eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (mBlinkingPosList == null) {
680eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            mBlinkingPosList = new ArrayList<CharPos>();
681eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
682eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        mBlinkingPosList.add(blinkingPos);
683eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
684eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6857a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
686eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To check whether the given key is valid.
687eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key to be checked.
688eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return true if the key is a valid one. Otherwise, false.
689eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
6907a9734d769d97470ce6fac0594dd007804d33432James Dong    private boolean isValidKey(final int key) {
691eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (!((key >= FIRST_PUBLIC_KEY) && (key <= LAST_PUBLIC_KEY))
692eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang                && !((key >= FIRST_PRIVATE_KEY) && (key <= LAST_PRIVATE_KEY))) {
693eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return false;
694eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
695eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return true;
696eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
697eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
6987a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
699eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To check whether the given key is contained in this TimedText object.
700eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key to be checked.
701eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return true if the key is contained in this TimedText object.
702eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     *         Otherwise, false.
703eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7047a9734d769d97470ce6fac0594dd007804d33432James Dong    private boolean containsKey(final int key) {
705eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (isValidKey(key) && mKeyObjectMap.containsKey(key)) {
706eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return true;
707eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
708eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return false;
709eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
7107a9734d769d97470ce6fac0594dd007804d33432James Dong
7117a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
712eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @return a set of the keys contained in this TimedText object.
713eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7147a9734d769d97470ce6fac0594dd007804d33432James Dong    private Set keySet() {
715eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        return mKeyObjectMap.keySet();
716eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
717eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang
7187a9734d769d97470ce6fac0594dd007804d33432James Dong    /*
719eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * To retrieve the object associated with the key. Caller must make sure
720eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * the key is present using the containsKey method otherwise a
721eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * RuntimeException will occur.
722eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     * @param key the key used to retrieve the object.
7237a9734d769d97470ce6fac0594dd007804d33432James Dong     * @return an object. The object could be 1) an instance of Integer; 2) a
7247a9734d769d97470ce6fac0594dd007804d33432James Dong     * List of CharPos, Karaoke, Font, Style, and HyperText, or 3) an instance of
7257a9734d769d97470ce6fac0594dd007804d33432James Dong     * Justification.
726eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang     */
7277a9734d769d97470ce6fac0594dd007804d33432James Dong    private Object getObject(final int key) {
728eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        if (containsKey(key)) {
729eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            return mKeyObjectMap.get(key);
730eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        } else {
731eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang            throw new IllegalArgumentException("Invalid key: " + key);
732eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang        }
733eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang    }
734eaa5d8f9c0117bdaa20fd0a57921156bb0c06345Gloria Wang}
735