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