/** * Processes SETUP_CALL proactive command from the SIM card. * * @param cmdDet Command Details object retrieved from the proactive command object * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. */ private boolean processSetupCall(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process SetupCall"); Iterator<ComprehensionTlv> iter = ctlvs.iterator(); ComprehensionTlv ctlv = null; // User confirmation phase message. TextMessage confirmMsg = new TextMessage(); // Call set up phase message. TextMessage callMsg = new TextMessage(); IconId confirmIconId = null; IconId callIconId = null; // get confirmation message string. ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { confirmIconId = ValueParser.retrieveIconId(ctlv); confirmMsg.iconSelfExplanatory = confirmIconId.selfExplanatory; } // get call set up message string. ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); if (ctlv != null) { callMsg.text = ValueParser.retrieveAlphaId(ctlv); } ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { callIconId = ValueParser.retrieveIconId(ctlv); callMsg.iconSelfExplanatory = callIconId.selfExplanatory; } mCmdParams = new CallSetupParams(cmdDet, confirmMsg, callMsg); if (confirmIconId != null || callIconId != null) { mIconLoadState = LOAD_MULTI_ICONS; int[] recordNumbers = new int[2]; recordNumbers[0] = confirmIconId != null ? confirmIconId.recordNumber : -1; recordNumbers[1] = callIconId != null ? callIconId.recordNumber : -1; mIconLoader.loadIcons(recordNumbers, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes EVENT_NOTIFY message from baseband. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. */ private boolean processEventNotify(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process EventNotify"); TextMessage textMsg = new TextMessage(); IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); textMsg.text = ValueParser.retrieveAlphaId(ctlv); ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); textMsg.iconSelfExplanatory = iconId.selfExplanatory; } textMsg.responseNeeded = false; mCmdParams = new DisplayTextParams(cmdDet, textMsg); if (iconId != null) { mloadIcon = true; mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes LAUNCH_BROWSER proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processLaunchBrowser(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process LaunchBrowser"); TextMessage confirmMsg = new TextMessage(); IconId iconId = null; String url = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.URL, ctlvs); if (ctlv != null) { try { byte[] rawValue = ctlv.getRawValue(); int valueIndex = ctlv.getValueIndex(); int valueLen = ctlv.getLength(); if (valueLen > 0) { url = GsmAlphabet.gsm8BitUnpackedToString(rawValue, valueIndex, valueLen); } else { url = null; } } catch (IndexOutOfBoundsException e) { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } } // parse alpha identifier. ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); confirmMsg.iconSelfExplanatory = iconId.selfExplanatory; } // parse command qualifier value. LaunchBrowserMode mode; switch (cmdDet.commandQualifier) { case 0x00: default: mode = LaunchBrowserMode.LAUNCH_IF_NOT_ALREADY_LAUNCHED; break; case 0x02: mode = LaunchBrowserMode.USE_EXISTING_BROWSER; break; case 0x03: mode = LaunchBrowserMode.LAUNCH_NEW_BROWSER; break; } mCmdParams = new LaunchBrowserParams(cmdDet, confirmMsg, url, mode); if (iconId != null) { mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes PLAY_TONE proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required.t * @throws ResultException */ private boolean processPlayTone(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process PlayTone"); Tone tone = null; TextMessage textMsg = new TextMessage(); Duration duration = null; IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TONE, ctlvs); if (ctlv != null) { // Nothing to do for null objects. if (ctlv.getLength() > 0) { try { byte[] rawValue = ctlv.getRawValue(); int valueIndex = ctlv.getValueIndex(); int toneVal = rawValue[valueIndex]; tone = Tone.fromInt(toneVal); } catch (IndexOutOfBoundsException e) { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } } } // parse alpha identifier ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); if (ctlv != null) { textMsg.text = ValueParser.retrieveAlphaId(ctlv); } // parse tone duration ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); if (ctlv != null) { duration = ValueParser.retrieveDuration(ctlv); } // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); textMsg.iconSelfExplanatory = iconId.selfExplanatory; } boolean vibrate = (cmdDet.commandQualifier & 0x01) != 0x00; textMsg.responseNeeded = false; mCmdParams = new PlayToneParams(cmdDet, textMsg, tone, duration, vibrate); if (iconId != null) { mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes DISPLAY_TEXT proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processDisplayText(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process DisplayText"); TextMessage textMsg = new TextMessage(); IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, ctlvs); if (ctlv != null) { textMsg.text = ValueParser.retrieveTextString(ctlv); } // If the tlv object doesn't exist or the it is a null object reply // with command not understood. if (textMsg.text == null) { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } ctlv = searchForTag(ComprehensionTlvTag.IMMEDIATE_RESPONSE, ctlvs); if (ctlv != null) { textMsg.responseNeeded = false; } // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); textMsg.iconSelfExplanatory = iconId.selfExplanatory; } // parse tone duration ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); if (ctlv != null) { textMsg.duration = ValueParser.retrieveDuration(ctlv); } // Parse command qualifier parameters. textMsg.isHighPriority = (cmdDet.commandQualifier & 0x01) != 0; textMsg.userClear = (cmdDet.commandQualifier & 0x80) != 0; mCmdParams = new DisplayTextParams(cmdDet, textMsg); if (iconId != null) { mloadIcon = true; mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes GET_INKEY proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processGetInkey(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process GetInkey"); Input input = new Input(); IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, ctlvs); if (ctlv != null) { input.text = ValueParser.retrieveTextString(ctlv); } else { throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); } // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); } // parse duration ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); if (ctlv != null) { input.duration = ValueParser.retrieveDuration(ctlv); } input.minLen = 1; input.maxLen = 1; input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; input.yesNo = (cmdDet.commandQualifier & 0x04) != 0; input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; input.echo = true; mCmdParams = new GetInputParams(cmdDet, input); if (iconId != null) { mloadIcon = true; mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processSetUpIdleModeText(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process SetUpIdleModeText"); TextMessage textMsg = new TextMessage(); IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, ctlvs); if (ctlv != null) { textMsg.text = ValueParser.retrieveTextString(ctlv); } ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); textMsg.iconSelfExplanatory = iconId.selfExplanatory; } /* * If the tlv object doesn't contain text and the icon is not self * explanatory then reply with command not understood. */ if (textMsg.text == null && iconId != null && !textMsg.iconSelfExplanatory) { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } mCmdParams = new DisplayTextParams(cmdDet, textMsg); if (iconId != null) { mloadIcon = true; mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
private boolean processBIPClient(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { AppInterface.CommandType commandType = AppInterface.CommandType.fromInt(cmdDet.typeOfCommand); if (commandType != null) { CatLog.d(this, "process " + commandType.name()); } TextMessage textMsg = new TextMessage(); IconId iconId = null; ComprehensionTlv ctlv = null; boolean has_alpha_id = false; // parse alpha identifier ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); if (ctlv != null) { textMsg.text = ValueParser.retrieveAlphaId(ctlv); CatLog.d(this, "alpha TLV text=" + textMsg.text); has_alpha_id = true; } // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); textMsg.iconSelfExplanatory = iconId.selfExplanatory; } textMsg.responseNeeded = false; mCmdParams = new BIPClientParams(cmdDet, textMsg, has_alpha_id); if (iconId != null) { mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }
/** * Processes SELECT_ITEM proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processSelectItem(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process SelectItem"); Menu menu = new Menu(); IconId titleIconId = null; ItemsIconId itemsIconId = null; Iterator<ComprehensionTlv> iter = ctlvs.iterator(); ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); if (ctlv != null) { menu.title = ValueParser.retrieveAlphaId(ctlv); } while (true) { ctlv = searchForNextTag(ComprehensionTlvTag.ITEM, iter); if (ctlv != null) { menu.items.add(ValueParser.retrieveItem(ctlv)); } else { break; } } // We must have at least one menu item. if (menu.items.size() == 0) { throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); } ctlv = searchForTag(ComprehensionTlvTag.ITEM_ID, ctlvs); if (ctlv != null) { // CAT items are listed 1...n while list start at 0, need to // subtract one. menu.defaultItem = ValueParser.retrieveItemId(ctlv) - 1; } ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { mIconLoadState = LOAD_SINGLE_ICON; titleIconId = ValueParser.retrieveIconId(ctlv); menu.titleIconSelfExplanatory = titleIconId.selfExplanatory; } ctlv = searchForTag(ComprehensionTlvTag.ITEM_ICON_ID_LIST, ctlvs); if (ctlv != null) { mIconLoadState = LOAD_MULTI_ICONS; itemsIconId = ValueParser.retrieveItemsIconId(ctlv); menu.itemsIconSelfExplanatory = itemsIconId.selfExplanatory; } boolean presentTypeSpecified = (cmdDet.commandQualifier & 0x01) != 0; if (presentTypeSpecified) { if ((cmdDet.commandQualifier & 0x02) == 0) { menu.presentationType = PresentationType.DATA_VALUES; } else { menu.presentationType = PresentationType.NAVIGATION_OPTIONS; } } menu.softKeyPreferred = (cmdDet.commandQualifier & 0x04) != 0; menu.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; mCmdParams = new SelectItemParams(cmdDet, menu, titleIconId != null); // Load icons data if needed. switch (mIconLoadState) { case LOAD_NO_ICON: return false; case LOAD_SINGLE_ICON: mloadIcon = true; mIconLoader.loadIcon(titleIconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); break; case LOAD_MULTI_ICONS: int[] recordNumbers = itemsIconId.recordNumbers; if (titleIconId != null) { // Create a new array for all the icons (title and items). recordNumbers = new int[itemsIconId.recordNumbers.length + 1]; recordNumbers[0] = titleIconId.recordNumber; System.arraycopy( itemsIconId.recordNumbers, 0, recordNumbers, 1, itemsIconId.recordNumbers.length); } mloadIcon = true; mIconLoader.loadIcons(recordNumbers, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); break; } return true; }
/** * Processes GET_INPUT proactive command from the SIM card. * * @param cmdDet Command Details container object. * @param ctlvs List of ComprehensionTlv objects following Command Details object and Device * Identities object within the proactive command * @return true if the command is processing is pending and additional asynchronous processing is * required. * @throws ResultException */ private boolean processGetInput(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) throws ResultException { CatLog.d(this, "process GetInput"); Input input = new Input(); IconId iconId = null; ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, ctlvs); if (ctlv != null) { input.text = ValueParser.retrieveTextString(ctlv); } else { throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); } ctlv = searchForTag(ComprehensionTlvTag.RESPONSE_LENGTH, ctlvs); if (ctlv != null) { try { byte[] rawValue = ctlv.getRawValue(); int valueIndex = ctlv.getValueIndex(); input.minLen = rawValue[valueIndex] & 0xff; input.maxLen = rawValue[valueIndex + 1] & 0xff; } catch (IndexOutOfBoundsException e) { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } } else { throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); } ctlv = searchForTag(ComprehensionTlvTag.DEFAULT_TEXT, ctlvs); if (ctlv != null) { input.defaultText = ValueParser.retrieveTextString(ctlv); } // parse icon identifier ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); if (ctlv != null) { iconId = ValueParser.retrieveIconId(ctlv); } input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; input.echo = (cmdDet.commandQualifier & 0x04) == 0; input.packed = (cmdDet.commandQualifier & 0x08) != 0; input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; // Truncate the maxLen if it exceeds the max number of chars that can // be encoded. Limit depends on DCS in Command Qualifier. if (input.ucs2 && input.maxLen > MAX_UCS2_CHARS) { CatLog.d( this, "UCS2: received maxLen = " + input.maxLen + ", truncating to " + MAX_UCS2_CHARS); input.maxLen = MAX_UCS2_CHARS; } else if (!input.packed && input.maxLen > MAX_GSM7_DEFAULT_CHARS) { CatLog.d( this, "GSM 7Bit Default: received maxLen = " + input.maxLen + ", truncating to " + MAX_GSM7_DEFAULT_CHARS); input.maxLen = MAX_GSM7_DEFAULT_CHARS; } mCmdParams = new GetInputParams(cmdDet, input); if (iconId != null) { mloadIcon = true; mIconLoadState = LOAD_SINGLE_ICON; mIconLoader.loadIcon(iconId.recordNumber, this.obtainMessage(MSG_ID_LOAD_ICON_DONE)); return true; } return false; }