/** * Copyright (c) 2013 Nokia Corporation. All rights reserved. * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. * Oracle and Java are trademarks or registered trademarks of Oracle and/or its * affiliates. Other product and company names mentioned herein may be trademarks * or trade names of their respective owners. * See LICENSE.TXT for license information. */ package com.nokia.example.voip; import java.io.IOException; import javax.microedition.midlet.MIDlet; import com.nokia.mid.voip.VoipMTCallListener; import com.nokia.mid.voip.VoipManager; import com.nokia.example.voip.controller.CallLogManager; import com.nokia.example.voip.controller.ContactsManager; import com.nokia.example.voip.controller.SettingsManager; import com.nokia.example.voip.engine.Call; import com.nokia.example.voip.engine.RingtonePlayer; import com.nokia.example.voip.engine.SettingsHelper; import com.nokia.example.voip.model.CallLogItem; import com.nokia.example.voip.model.Contact; import com.nokia.example.voip.view.CallView; import com.nokia.example.voip.view.ContactsView; import com.nokia.example.voip.view.IncomingCallView; /** * The main class of the application. */ public class VoIPExample extends MIDlet implements VoipMTCallListener { private static VoIPExample instance; private ViewManager viewManager; private ContactsManager contactsManager; private CallLogManager callLogManager; private SettingsManager settingsManager; private SettingsHelper settingsHelper; private RingtonePlayer ringtonePlayer; private Call call = null; /** * Constructor. */ public VoIPExample() { if (!VoipManager.setVoipMTCallListener(this)) { System.out.println("VoIP API not supported!"); } } /** * @return The instance of this class. */ public static VoIPExample getInstance() { return instance; } /** * @see javax.microedition.midlet.MIDlet#startApp() */ public void startApp() { if (instance == null) { instance = this; contactsManager = new ContactsManager(); settingsManager = new SettingsManager(); settingsHelper = new SettingsHelper(settingsManager); callLogManager = new CallLogManager(); try { contactsManager.loadState(); settingsManager.loadState(); callLogManager.loadState(); } catch (IOException ex) { ex.printStackTrace(); } ringtonePlayer = new RingtonePlayer(); viewManager = new ViewManager(this); ContactsView contactsView = new ContactsView( viewManager, contactsManager); viewManager.pushView(contactsView); } // Check the argument values if the MIDlet was launched by the platform // VoIP service due to an incoming call. String invokeReason = this.getAppProperty("arg-0"); if (invokeReason.equals(VoipManager.VOIP_MT_CALL_ALERTING) || invokeReason.equals(VoipManager.VOIP_MT_CALL_WAITING)) { System.out.println("MIDlet launched due to an incoming call"); try { int callId = Integer.parseInt(this.getAppProperty("arg-1")); handleIncomingCall(callId); } catch (NumberFormatException e) { System.out.println("Invalid call ID!"); } } } /** * @see javax.microedition.midlet.MIDlet#pauseApp() */ public void pauseApp() { } /** * @see javax.microedition.midlet.MIDlet#destroyApp(boolean) */ public void destroyApp(boolean unconditional) { if (call != null && call.isActive()) { call.end(); } VoipManager.setVoipMTCallListener(null); } /** * Tries to make a VoIP class to the given address. Adds the event also to * the call log. * @param voipAddress The recipient for the the call. */ public void call(String voipAddress) { System.out.println("Outgoing call to: " + voipAddress); // Add a call log entry. Contact contact = contactsManager.findContact(voipAddress); if (contact == null) { contact = new Contact("", voipAddress); } callLogManager.addLogItem(voipAddress, CallLogItem.TYPE_DIALED); call = new Call(); call.makeCall(voipAddress); viewManager.pushView(new CallView(viewManager, contact, call)); } public ContactsManager getContactsManager() { return contactsManager; } public CallLogManager getCallLogManager() { return callLogManager; } public SettingsManager getSettingsManager() { return settingsManager; } public SettingsHelper getSettingsHelper() { return settingsHelper; } public RingtonePlayer getRingtonePlayer() { return ringtonePlayer; } public ViewManager getViewManager() { return viewManager; } /** * @see com.nokia.mid.voip.VoipMTCallListener#onIncomingCall(int) */ public void onIncomingCall(int callId) { // Handling of multiple simultaneous calls (one active & others on hold) // is not implemented in this example. However, the platform VoIP // service supports it, so the functionality can be extended to handle // multiple calls accordingly. if (call == null || !call.isActive()) { handleIncomingCall(callId); } else { System.out.println("Incoming call ignored due to an active call"); } } /** * Handles an incoming call. * @param callId The call ID of the caller. */ private void handleIncomingCall(int callId) { call = new Call(); call.receiveCall(callId); ringtonePlayer.startRinging(); // Find the caller from the saved contacts to show the name. String voipAddress = call.getAddress(); Contact contact = contactsManager.findContact(voipAddress); if (contact == null) { contact = new Contact("", voipAddress); } System.out.println("Incoming call from: " + voipAddress); viewManager.pushView(new IncomingCallView(viewManager, contact, call)); } }