TimedText.java revision 8902097bb686752ff207e3bda12713be1a8c74eb
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