blackberryphone-callconference

Blackberry - manage conference call from application?


How to create conference call from application?


Solution

  • We will have to:

    To start call see api from Blackberry - make a call from native address book
    There is no api to hold and join but we can use Blackberry - run menu item from dialer Phone App technique
    To bring app screen back foreground we can use code from Blackberry - Create an application which will lock another application event

    Full code:

    class Scr extends MainScreen implements PhoneListener {
        private static final String STR_MODULE_NAME = "SOConferenceCall";
        EditField mPhoneNumber = new EditField("phone number: ", "12345");
        boolean mConnected = false;
        Vector mPhoneCalls = new Vector();
    
        public Scr() {
            Phone.addPhoneListener(this);
            add(mPhoneNumber);
        }
    
        protected void makeMenu(Menu menu, int instance) {
            super.makeMenu(menu, instance);
    
            if (isCalling()) {
                menu.add(new MenuItem("add to conference", 0, 0) {
                    public void run() {
                        holdActiveCall();
                        makeCall(mPhoneNumber.getText());
                    }
                });
            } else {
                menu.add(new MenuItem("call", 0, 0) {
                    public void run() {
                        makeCall(mPhoneNumber.getText());
                    }
                });
            }
        }
    
        private void holdActiveCall() {
            runMenuItem("Hold");
        }
    
        private void joinCalls() {
            runMenuItem("Join Conference");
        }
    
        private void makeCall(String number) {
            PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL,
                    number);
            Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call);
        }
    
        private void runMenuItem(String menuItemText) {
            Screen screen = Ui.getUiEngine().getActiveScreen();
            Menu menu = screen.getMenu(0);
            for (int i = 0, cnt = menu.getSize(); i < cnt; i++)
                if (menu.getItem(i).toString().equalsIgnoreCase(menuItemText))
                    menu.getItem(i).run();
        }
    
        protected int switchToForeground() {
            int id = -1;
            ApplicationManager appMan 
                = ApplicationManager.getApplicationManager();
            ApplicationDescriptor appDes[] 
                = appMan.getVisibleApplications();
            for (int i = 0; i < appDes.length; i++) {
                Sreing name = appDes[i].getModuleName();
                if (name.equalsIgnoreCase(STR_MODULE_NAME)) {
                    id = appMan.getProcessId(appDes[i]);
                    appMan.requestForeground(id);
                    // give a time to foreground application
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
            return id;
        }
    
        private boolean isCalling() {
            return mConnected;
        }
    
        public void callAdded(int callId) {
            switchToForeground();
        }
    
        public void callAnswered(int callId) {
            switchToForeground();
        }
    
        public void callConferenceCallEstablished(int callId) {
            switchToForeground();
        }
    
        public void callConnected(int callId) {
            if (mPhoneCalls.size() == 0)
                mConnected = true;
            else
                joinCalls();
            mPhoneCalls.addElement(Phone.getCall(callId));
            switchToForeground();
    
        }
    
        public void callDirectConnectConnected(int callId) {
            switchToForeground();
        }
    
        public void callDirectConnectDisconnected(int callId) {
            switchToForeground();
        }
    
        public void callDisconnected(int callId) {
            mPhoneCalls.removeElement(Phone.getCall(callId));
            if (mPhoneCalls.size() == 0)
                mConnected = false;
            switchToForeground();
        }
    
        public void callEndedByUser(int callId) {
            switchToForeground();
        }
    
        public void callFailed(int callId, int reason) {
            switchToForeground();
        }
    
        public void callHeld(int callId) {
            switchToForeground();
        }
    
        public void callIncoming(int callId) {
            switchToForeground();
        }
    
        public void callInitiated(int callid) {
            switchToForeground();
        }
    
        public void callRemoved(int callId) {
            switchToForeground();
        }
    
        public void callResumed(int callId) {
            switchToForeground();
        }
    
        public void callWaiting(int callid) {
            switchToForeground();
        }
    
        public void conferenceCallDisconnected(int callId) {
            switchToForeground();
        }
    }