/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); var RIL = {}; Cu.import("resource://gre/modules/ril_consts.js", RIL); XPCOMUtils.defineLazyServiceGetter(this, "gStkCmdFactory", "@mozilla.org/icc/stkcmdfactory;1", "nsIStkCmdFactory"); /** * Name space for RILSystemMessenger.jsm. Only initialized after first call to * newRILSystemMessenger. */ var RSM; var gReceivedMsgType = null; var gReceivedMessage = null; /** * Create a new RILSystemMessenger instance. * * @return a RILSystemMessenger instance. */ function newRILSystemMessenger() { if (!RSM) { RSM = Cu.import("resource://gre/modules/RILSystemMessenger.jsm", {}); equal(typeof RSM.RILSystemMessenger, "function", "RSM.RILSystemMessenger"); } let rsm = new RSM.RILSystemMessenger(); rsm.broadcastMessage = (aType, aMessage) => { gReceivedMsgType = aType; gReceivedMessage = aMessage; }; rsm.createCommandMessage = (aStkProactiveCmd) => { return gStkCmdFactory.createCommandMessage(aStkProactiveCmd); }; return rsm; } function equal_received_system_message(aType, aMessage) { equal(aType, gReceivedMsgType); deepEqual(aMessage, gReceivedMessage); gReceivedMsgType = null; gReceivedMessage = null; } /** * Verify that each nsIXxxMessenger could be retrieved. */ function run_test() { let telephonyMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"] .getService(Ci.nsITelephonyMessenger); let smsMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"] .getService(Ci.nsISmsMessenger); let cellbroadcastMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"] .getService(Ci.nsICellbroadcastMessenger); let mobileConnectionMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"] .getService(Ci.nsIMobileConnectionMessenger); let iccMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"] .getService(Ci.nsIIccMessenger); ok(telephonyMessenger !== null, "Get TelephonyMessenger."); ok(smsMessenger != null, "Get SmsMessenger."); ok(cellbroadcastMessenger != null, "Get CellbroadcastMessenger."); ok(mobileConnectionMessenger != null, "Get MobileConnectionMessenger."); ok(iccMessenger != null, "Get IccMessenger."); run_next_test(); } /** * Verify RILSystemMessenger.notifyNewCall() */ add_test(function test_telephony_messenger_notify_new_call() { let messenger = newRILSystemMessenger(); messenger.notifyNewCall(); equal_received_system_message("telephony-new-call", {}); run_next_test(); }); /** * Verify RILSystemMessenger.notifyCallEnded() */ add_test(function test_telephony_messenger_notify_call_ended() { let messenger = newRILSystemMessenger(); messenger.notifyCallEnded(1, "+0987654321", null, true, 500, false, true); equal_received_system_message("telephony-call-ended", { serviceId: 1, number: "+0987654321", emergency: true, duration: 500, direction: "incoming", hangUpLocal: true }); // Verify 'optional' parameter of secondNumber. messenger.notifyCallEnded(1, "+0987654321", "+1234567890", true, 500, true, false); equal_received_system_message("telephony-call-ended", { serviceId: 1, number: "+0987654321", emergency: true, duration: 500, direction: "outgoing", hangUpLocal: false, secondNumber: "+1234567890" }); run_next_test(); }); /** * Verify RILSystemMessenger.notifySms() */ add_test(function test_sms_messenger_notify_sms() { let messenger = newRILSystemMessenger(); let timestamp = Date.now(); let sentTimestamp = timestamp + 100; let deliveryTimestamp = sentTimestamp + 100; // Verify 'sms-received' system message. messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_RECEIVED, 1, 2, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_RECEIVED, Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS, "+0987654321", null, "Incoming message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_CLASS_2, timestamp, sentTimestamp, 0, false); equal_received_system_message("sms-received", { iccId: "99887766554433221100", type: "sms", id: 1, threadId: 2, delivery: "received", deliveryStatus: "success", sender: "+0987654321", receiver: null, body: "Incoming message", messageClass: "class-2", timestamp: timestamp, sentTimestamp: sentTimestamp, deliveryTimestamp: 0, read: false }); // Verify 'sms-sent' system message. messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_SENT, 3, 4, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_SENT, Ci.nsISmsService.DELIVERY_STATUS_TYPE_PENDING, null, "+0987654321", "Outgoing message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL, timestamp, 0, 0, true); equal_received_system_message("sms-sent", { iccId: "99887766554433221100", type: "sms", id: 3, threadId: 4, delivery: "sent", deliveryStatus: "pending", sender: null, receiver: "+0987654321", body: "Outgoing message", messageClass: "normal", timestamp: timestamp, sentTimestamp: 0, deliveryTimestamp: 0, read: true }); // Verify 'sms-delivery-success' system message. messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_DELIVERY_SUCCESS, 5, 6, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_SENT, Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS, null, "+0987654321", "Outgoing message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL, timestamp, 0, deliveryTimestamp, true); equal_received_system_message("sms-delivery-success", { iccId: "99887766554433221100", type: "sms", id: 5, threadId: 6, delivery: "sent", deliveryStatus: "success", sender: null, receiver: "+0987654321", body: "Outgoing message", messageClass: "normal", timestamp: timestamp, sentTimestamp: 0, deliveryTimestamp: deliveryTimestamp, read: true }); // Verify 'sms-failed' system message. messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_SENT_FAILED, 7, 8, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_ERROR, Ci.nsISmsService.DELIVERY_STATUS_TYPE_ERROR, null, "+0987654321", "Outgoing message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL, timestamp, 0, 0, true); equal_received_system_message("sms-failed", { iccId: "99887766554433221100", type: "sms", id: 7, threadId: 8, delivery: "error", deliveryStatus: "error", sender: null, receiver: "+0987654321", body: "Outgoing message", messageClass: "normal", timestamp: timestamp, sentTimestamp: 0, deliveryTimestamp: 0, read: true }); // Verify 'sms-delivery-error' system message. messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_DELIVERY_ERROR, 9, 10, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_SENT, Ci.nsISmsService.DELIVERY_STATUS_TYPE_ERROR, null, "+0987654321", "Outgoing message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL, timestamp, 0, 0, true); equal_received_system_message("sms-delivery-error", { iccId: "99887766554433221100", type: "sms", id: 9, threadId: 10, delivery: "sent", deliveryStatus: "error", sender: null, receiver: "+0987654321", body: "Outgoing message", messageClass: "normal", timestamp: timestamp, sentTimestamp: 0, deliveryTimestamp: 0, read: true }); // Verify the protection of invalid nsISmsMessenger.NOTIFICATION_TYPEs. try { messenger.notifySms(5, 1, 2, "99887766554433221100", Ci.nsISmsService.DELIVERY_TYPE_RECEIVED, Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS, "+0987654321", null, "Incoming message", Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL, timestamp, sentTimestamp, 0, false); ok(false, "Failed to verify the protection of invalid nsISmsMessenger.NOTIFICATION_TYPE!"); } catch (e) {} run_next_test(); }); /** * Verify RILSystemMessenger.notifyCbMessageReceived() */ add_test(function test_cellbroadcast_messenger_notify_cb_message_received() { let messenger = newRILSystemMessenger(); let timestamp = Date.now(); // Verify ETWS messenger.notifyCbMessageReceived(0, Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_CELL_IMMEDIATE, 256, 4352, null, null, Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL, timestamp, Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID, true, Ci.nsICellBroadcastService.GSM_ETWS_WARNING_EARTHQUAKE, false, true); equal_received_system_message("cellbroadcast-received", { serviceId: 0, gsmGeographicalScope: "cell-immediate", messageCode: 256, messageId: 4352, language: null, body: null, messageClass: "normal", timestamp: timestamp, cdmaServiceCategory: null, etws: { warningType: "earthquake", emergencyUserAlert: false, popup: true } }); // Verify Normal CB Message messenger.notifyCbMessageReceived(1, Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_PLMN, 0, 50, "en", "The quick brown fox jumps over the lazy dog", Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL, timestamp, Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID, false, Ci.nsICellBroadcastService.GSM_ETWS_WARNING_INVALID, false, false); equal_received_system_message("cellbroadcast-received", { serviceId: 1, gsmGeographicalScope: "plmn", messageCode: 0, messageId: 50, language: "en", body: "The quick brown fox jumps over the lazy dog", messageClass: "normal", timestamp: timestamp, cdmaServiceCategory: null, etws: null }); // Verify CB Message with ETWS Info messenger.notifyCbMessageReceived(0, Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_LOCATION_AREA, 0, 4354, "en", "Earthquake & Tsunami Warning!", Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_0, timestamp, Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID, true, Ci.nsICellBroadcastService.GSM_ETWS_WARNING_EARTHQUAKE_TSUNAMI, true, false); equal_received_system_message("cellbroadcast-received", { serviceId: 0, gsmGeographicalScope: "location-area", messageCode: 0, messageId: 4354, language: "en", body: "Earthquake & Tsunami Warning!", messageClass: "class-0", timestamp: timestamp, cdmaServiceCategory: null, etws: { warningType: "earthquake-tsunami", emergencyUserAlert: true, popup: false } }); // Verify CDMA CB Message messenger.notifyCbMessageReceived(0, Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_INVALID, 0, 0, null, "CDMA CB Message", Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL, timestamp, 512, false, Ci.nsICellBroadcastService.GSM_ETWS_WARNING_INVALID, false, false); equal_received_system_message("cellbroadcast-received", { serviceId: 0, gsmGeographicalScope: null, messageCode: 0, messageId: 0, language: null, body: "CDMA CB Message", messageClass: "normal", timestamp: timestamp, cdmaServiceCategory: 512, etws: null }); run_next_test(); }); /** * Verify RILSystemMessenger.notifyUssdReceived() */ add_test(function test_mobileconnection_notify_ussd_received() { let messenger = newRILSystemMessenger(); messenger.notifyUssdReceived(0, "USSD Message", false); equal_received_system_message("ussd-received", { serviceId: 0, message: "USSD Message", sessionEnded: false }); messenger.notifyUssdReceived(1, "USSD Message", true); equal_received_system_message("ussd-received", { serviceId: 1, message: "USSD Message", sessionEnded: true }); run_next_test(); }); /** * Verify RILSystemMessenger.notifyCdmaInfoRecXXX() */ add_test(function test_mobileconnection_notify_cdma_info() { let messenger = newRILSystemMessenger(); messenger.notifyCdmaInfoRecDisplay(0, "CDMA Display Info"); equal_received_system_message("cdma-info-rec-received", { clientId: 0, display: "CDMA Display Info" }); messenger.notifyCdmaInfoRecCalledPartyNumber(1, 1, 2, "+0987654321", 3, 4); equal_received_system_message("cdma-info-rec-received", { clientId: 1, calledNumber: { type: 1, plan: 2, number: "+0987654321", pi: 3, si: 4 } }); messenger.notifyCdmaInfoRecCallingPartyNumber(0, 5, 6, "+1234567890", 7, 8); equal_received_system_message("cdma-info-rec-received", { clientId: 0, callingNumber: { type: 5, plan: 6, number: "+1234567890", pi: 7, si: 8 } }); messenger.notifyCdmaInfoRecConnectedPartyNumber(1, 4, 3, "+56473839201", 2, 1); equal_received_system_message("cdma-info-rec-received", { clientId: 1, connectedNumber: { type: 4, plan: 3, number: "+56473839201", pi: 2, si: 1 } }); messenger.notifyCdmaInfoRecSignal(0, 1, 2, 3); equal_received_system_message("cdma-info-rec-received", { clientId: 0, signal: { type: 1, alertPitch: 2, signal: 3 } }); messenger.notifyCdmaInfoRecRedirectingNumber(1, 8, 7, "+1029384756", 6, 5, 4); equal_received_system_message("cdma-info-rec-received", { clientId: 1, redirect: { type: 8, plan: 7, number: "+1029384756", pi: 6, si: 5, reason: 4 } }); messenger.notifyCdmaInfoRecLineControl(0, 1, 0, 1, 255); equal_received_system_message("cdma-info-rec-received", { clientId: 0, lineControl: { polarityIncluded: 1, toggle: 0, reverse: 1, powerDenial: 255 } }); messenger.notifyCdmaInfoRecClir(1, 256); equal_received_system_message("cdma-info-rec-received", { clientId: 1, clirCause: 256 }); messenger.notifyCdmaInfoRecAudioControl(0, 255, -1); equal_received_system_message("cdma-info-rec-received", { clientId: 0, audioControl: { upLink: 255, downLink: -1 } }); run_next_test(); }); /** * Verify Error Handling of StkProactiveCmdFactory.createCommand() */ add_test(function test_icc_stk_cmd_factory_create_command_error() { let messenger = newRILSystemMessenger(); // Verify the protection of invalid typeOfCommand. try { gStkCmdFactory.createCommand({ commandNumber: 0, typeOfCommand: RIL.STK_CMD_MORE_TIME, // Invalid TypeOfCommand commandQualifier: 0x00 }); ok(false, "Failed to verify the protection of createCommand()!"); } catch (e) { ok(e.message.indexOf("Unknown Command Type") !== -1, "Invalid typeOfCommand!"); } run_next_test(); }); /** * Verify Error Handling of StkProactiveCmdFactory.createCommandMessage() */ add_test(function test_icc_stk_cmd_factory_create_system_msg_invalid_cmd_type() { let messenger = newRILSystemMessenger(); let iccId = "99887766554433221100"; // Verify the protection of invalid typeOfCommand. try { gStkCmdFactory.createCommandMessage({ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd]), // nsIStkProactiveCmd commandNumber: 0, typeOfCommand: RIL.STK_CMD_MORE_TIME, // Invalid TypeOfCommand commandQualifier: 0 }); ok(false, "Failed to identify invalid typeOfCommand!"); } catch (e) { ok(e.message.indexOf("Unknown Command Type") !== -1, "Invalid typeOfCommand!"); } run_next_test(); }); /** * Verify Error Handling of StkProactiveCmdFactory.createCommandMessage() */ add_test(function test_icc_stk_cmd_factory_create_system_msg_incorrect_cmd_type() { let messenger = newRILSystemMessenger(); let iccId = "99887766554433221100"; // Verify the protection of invalid typeOfCommand. try { gStkCmdFactory.createCommandMessage({ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd, Ci.nsIStkProvideLocalInfoCmd]), // nsIStkProactiveCmd commandNumber: 0, typeOfCommand: RIL.STK_CMD_POLL_INTERVAL, // Incorrect typeOfCommand commandQualifier: 0, // nsIStkProvideLocalInfoCmd localInfoType: 0x00, }); ok(false, "Failed to identify incorrect typeOfCommand!"); } catch (e) { ok(e.message.indexOf("Failed to convert command into concrete class: ") !== -1); } run_next_test(); }); /** * Verify RILSystemMessenger.notifyStkProactiveCommand() */ add_test(function test_icc_notify_stk_proactive_command() { let messenger = newRILSystemMessenger(); let iccId = "99887766554433221100"; let WHT = 0xFFFFFFFF; let BLK = 0x000000FF; let RED = 0xFF0000FF; let GRN = 0x00FF00FF; let BLU = 0x0000FFFF; let TSP = 0; // Basic Image, see Anex B.1 in TS 31.102. let basicIcon = { width: 8, height: 8, codingScheme: "basic", pixels: [WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT, BLK, BLK, BLK, BLK, BLK, BLK, WHT, WHT, WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, WHT, WHT, BLK, BLK, BLK, BLK, WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT] }; // Color Image, see Anex B.2 in TS 31.102. let colorIcon = { width: 8, height: 8, codingScheme: "color", pixels: [BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, RED, RED, RED, RED, RED, RED, BLU, BLU, RED, GRN, GRN, GRN, RED, RED, BLU, BLU, RED, RED, GRN, GRN, RED, RED, BLU, BLU, RED, RED, GRN, GRN, RED, RED, BLU, BLU, RED, RED, GRN, GRN, GRN, RED, BLU, BLU, RED, RED, RED, RED, RED, RED, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU] }; // Color Image with Transparency, see Anex B.2 in TS 31.102. let colorTransparencyIcon = { width: 8, height: 8, codingScheme: "color-transparency", pixels: [TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP, RED, RED, RED, RED, RED, RED, TSP, TSP, RED, GRN, GRN, GRN, RED, RED, TSP, TSP, RED, RED, GRN, GRN, RED, RED, TSP, TSP, RED, RED, GRN, GRN, RED, RED, TSP, TSP, RED, RED, GRN, GRN, GRN, RED, TSP, TSP, RED, RED, RED, RED, RED, RED, TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP] }; let cmdCount = 0; // Test Messages: let messages = [ // STK_CMD_REFRESH { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_REFRESH, commandQualifier: 0x04 // UICC Reset }, // STK_CMD_POLL_INTERVAL { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_POLL_INTERVAL, commandQualifier: 0x00, // RFU options: { timeUnit: RIL.STK_TIME_UNIT_TENTH_SECOND, timeInterval: 0x05 } }, // STK_CMD_POLL_OFF { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_POLL_OFF, commandQualifier: 0x00, // RFU }, // STK_CMD_PROVIDE_LOCAL_INFO { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_PROVIDE_LOCAL_INFO, commandQualifier: 0x01, // IMEI of the terminal options: { localInfoType: 0x01 // IMEI of the terminal } }, // STK_CMD_SET_UP_EVENT_LIST with eventList { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_EVENT_LIST, commandQualifier: 0x00, // RFU options: { eventList: [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C ] } }, // STK_CMD_SET_UP_EVENT_LIST without eventList { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_EVENT_LIST, commandQualifier: 0x00, // RFU options: { eventList: null } }, // STK_CMD_SET_UP_MENU with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_MENU, commandQualifier: 0x80, // bit 8: 1 = help information available options: { title: "Toolkit Menu 1", items: [ { identifier: 0x01, text: "Menu Item 1" }, { identifier: 0x02, text: "Menu Item 2" }, { identifier: 0x03, text: "Menu Item 3" } ], isHelpAvailable: true } }, // STK_CMD_SET_UP_MENU with optional properties including: // iconInfo for this menu, iconInfo for each item and nextActionList. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_MENU, commandQualifier: 0x00, // bit 8: 0 = help information is not available options: { title: "Toolkit Menu 2", items: [ { identifier: 0x01, text: "Menu Item 1", iconSelfExplanatory: true, icons: [basicIcon] }, { identifier: 0x02, text: "Menu Item 2", iconSelfExplanatory: false, icons: [basicIcon, colorIcon] }, { identifier: 0x03, text: "Menu Item 3", iconSelfExplanatory: true, icons: [basicIcon, colorIcon, colorTransparencyIcon] }, ], nextActionList: [ RIL.STK_NEXT_ACTION_END_PROACTIVE_SESSION, RIL.STK_NEXT_ACTION_NULL, RIL.STK_NEXT_ACTION_NULL, RIL.STK_NEXT_ACTION_NULL ], iconSelfExplanatory: false, icons: [basicIcon, colorIcon, colorTransparencyIcon], isHelpAvailable: false } }, // STK_CMD_SELECT_ITEM with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SELECT_ITEM, commandQualifier: RIL.STK_PRESENTATION_TYPE_NOT_SPECIFIED, options: { title: null, items: [ { identifier: 0x01, text: "Menu Item 1" }, { identifier: 0x02, text: "Menu Item 2" }, { identifier: 0x03, text: "Menu Item 3" } ], presentationType: RIL.STK_PRESENTATION_TYPE_NOT_SPECIFIED, isHelpAvailable: false } }, // STK_CMD_SELECT_ITEM with optional properties including: // title, iconInfo for this menu, iconInfo for each item and nextActionList. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SELECT_ITEM, commandQualifier: RIL.STK_PRESENTATION_TYPE_NAVIGATION_OPTIONS, options: { title: "Selected Toolkit Menu", items: [ { identifier: 0x01, text: "Menu Item 1", iconSelfExplanatory: true, icons: [basicIcon] }, { identifier: 0x02, text: "Menu Item 2", iconSelfExplanatory: false, icons: [basicIcon, colorIcon] }, { identifier: 0x03, text: "Menu Item 3", iconSelfExplanatory: true, icons: [basicIcon, colorIcon, colorTransparencyIcon] }, ], nextActionList: [ RIL.STK_NEXT_ACTION_END_PROACTIVE_SESSION, RIL.STK_NEXT_ACTION_NULL, RIL.STK_NEXT_ACTION_NULL, RIL.STK_NEXT_ACTION_NULL ], defaultItem: 0x02, iconSelfExplanatory: false, icons: [basicIcon, colorIcon, colorTransparencyIcon], presentationType: RIL.STK_PRESENTATION_TYPE_NAVIGATION_OPTIONS, isHelpAvailable: false } }, // STK_CMD_DISPLAY_TEXT with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_DISPLAY_TEXT, commandQualifier: 0x01, // bit 1: High Priority options: { text: "Display Text 1", isHighPriority: true, userClear: false, responseNeeded: false } }, // STK_CMD_DISPLAY_TEXT with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_DISPLAY_TEXT, commandQualifier: 0x80, // bit 8: User Clear options: { text: "Display Text 2", isHighPriority: false, userClear: true, responseNeeded: true, duration: { timeUnit: RIL.STK_TIME_UNIT_TENTH_SECOND, timeInterval: 0x05 }, iconSelfExplanatory: true, icons: [basicIcon] } }, // STK_CMD_SET_UP_IDLE_MODE_TEXT { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_IDLE_MODE_TEXT, commandQualifier: 0x00, // RFU options: { text: "Setup Idle Mode Text" } }, // STK_CMD_SEND_SS { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SEND_SS, commandQualifier: 0x00, // RFU options: { text: "Send SS", iconSelfExplanatory: true, icons: [colorIcon] } }, // STK_CMD_SEND_USSD { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SEND_USSD, commandQualifier: 0x00, // RFU options: { text: "Send USSD" } }, // STK_CMD_SEND_SMS { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SEND_SMS, commandQualifier: 0x00, // RFU options: { text: "Send SMS", iconSelfExplanatory: false, icons: [colorTransparencyIcon] } }, // STK_CMD_SEND_DTMF { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SEND_DTMF, commandQualifier: 0x00, // RFU options: { text: "Send DTMF", iconSelfExplanatory: true, icons: [basicIcon] } }, // STK_CMD_GET_INKEY { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_GET_INKEY, commandQualifier: 0x84, // bit 3: isYesNoRequested, bit 8: isHelpAvailable options: { text: "Get Input Key", minLength: 1, maxLength: 1, duration: { timeUnit: RIL.STK_TIME_UNIT_SECOND, timeInterval: 0x0A }, isAlphabet: false, isUCS2: false, isYesNoRequested: true, isHelpAvailable: true, defaultText: null, iconSelfExplanatory: false, icons: [colorIcon] } }, // STK_CMD_GET_INPUT { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_GET_INPUT, commandQualifier: 0x0F, // bit 1-4: isAlphabet, isUCS2, hideInput, isPacked options: { text: "Get Input Text", minLength: 1, maxLength: 255, defaultText: "Default Input Text", isAlphabet: true, isUCS2: true, hideInput: true, isPacked: true, isHelpAvailable: false, defaultText: null, iconSelfExplanatory: true, icons: [basicIcon] } }, // STK_CMD_SET_UP_CALL with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_CALL, commandQualifier: 0x00, // RFU options: { address: "+0987654321" } }, // STK_CMD_SET_UP_CALL with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SET_UP_CALL, commandQualifier: 0x00, // RFU options: { address: "+0987654321", confirmMessage: { text: "Confirm Message", iconSelfExplanatory: false, icons: [colorIcon] }, callMessage: { text: "Call Message", iconSelfExplanatory: true, icons: [basicIcon] }, duration: { timeUnit: RIL.STK_TIME_UNIT_SECOND, timeInterval: 0x0A } } }, // STK_CMD_LAUNCH_BROWSER with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_LAUNCH_BROWSER, commandQualifier: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER, options: { url: "http://www.mozilla.org", mode: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER } }, // STK_CMD_LAUNCH_BROWSER with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_LAUNCH_BROWSER, commandQualifier: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER, options: { url: "http://www.mozilla.org", mode: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER, confirmMessage: { text: "Confirm Message for Launch Browser", iconSelfExplanatory: false, icons: [colorTransparencyIcon] } } }, // STK_CMD_PLAY_TONE with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_PLAY_TONE, commandQualifier: 0x01, // isVibrate options: { text: null, isVibrate: true } }, // STK_CMD_PLAY_TONE with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_PLAY_TONE, commandQualifier: 0x00, // isVibrate = false options: { text: "Play Tone", tone: RIL.STK_TONE_TYPE_CONGESTION, isVibrate: false, duration: { timeUnit: RIL.STK_TIME_UNIT_SECOND, timeInterval: 0x0A }, iconSelfExplanatory: true, icons: [basicIcon] } }, // STK_CMD_TIMER_MANAGEMENT with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_TIMER_MANAGEMENT, commandQualifier: RIL.STK_TIMER_DEACTIVATE, options: { timerId: 0x08, timerAction: RIL.STK_TIMER_DEACTIVATE } }, // STK_CMD_TIMER_MANAGEMENT with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_TIMER_MANAGEMENT, commandQualifier: RIL.STK_TIMER_START, options: { timerId: 0x01, timerValue: (12 * 60 * 60) + (30 * 60) + (30), // 12:30:30 timerAction: RIL.STK_TIMER_START } }, // STK_CMD_OPEN_CHANNEL with mandatory properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_OPEN_CHANNEL, commandQualifier: 0x00, //RFU options: { text: null, } }, // STK_CMD_OPEN_CHANNEL with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_OPEN_CHANNEL, commandQualifier: 0x00, //RFU options: { text: "Open Channel", iconSelfExplanatory: false, icons: [colorIcon] } }, // STK_CMD_CLOSE_CHANNEL with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_CLOSE_CHANNEL, commandQualifier: 0x00, //RFU options: { text: "Close Channel", iconSelfExplanatory: true, icons: [colorTransparencyIcon] } }, // STK_CMD_SEND_DATA with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_SEND_DATA, commandQualifier: 0x00, //RFU options: { text: null, iconSelfExplanatory: false, icons: [basicIcon] } }, // STK_CMD_RECEIVE_DATA with optional properties. { commandNumber: ++cmdCount, typeOfCommand: RIL.STK_CMD_RECEIVE_DATA, commandQualifier: 0x00, //RFU options: { text: "Receive Data" } }, null // Termination condition to run_next_test() ]; messages.forEach(function(aMessage) { if (!aMessage) { run_next_test(); return; } messenger.notifyStkProactiveCommand(iccId, gStkCmdFactory.createCommand(aMessage)); equal_received_system_message("icc-stkcommand", { iccId: iccId, command: aMessage }); }); });