ContactListForm.java

/**
 * Copyright (c) 2012 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;

import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.pim.*;

// This Form shows a list of the contacts in the local databases
class ContactListForm extends List implements CommandListener {
    private final Command exitCommand, selectCommand, backCommand;
    private final EventSharingMIDlet parent;
    private boolean available;
    private Vector allTelNumbers = new Vector();

    public ContactListForm(EventSharingMIDlet parent) {
        super("Contacts", Choice.IMPLICIT);
        this.parent = parent;

        // init UI
        selectCommand = new Command("Select", Command.OK, 0);
        backCommand = new Command("Back", Command.BACK, 1);
        exitCommand = new Command("Exit", Command.EXIT, 1);

        addCommand(backCommand);
        addCommand(exitCommand);
        setCommandListener(this);
        setFitPolicy(Choice.TEXT_WRAP_ON);

        // load the list of names in a different thread
        parent.enqueueOperation(new LoadContacts());
    }

    public void commandAction(Command cmd, Displayable displayable) {
        // if no names are available return
        if (!available) {
            parent.showMain();
            return;
        } else if (cmd == selectCommand) {
            int selected = getSelectedIndex();
            if (selected >= 0) {
                // will get the number from the list
                parent.contactSelected((String)allTelNumbers.elementAt(selected));
            } else {
                parent.showMain();
            }
        } else if (cmd == backCommand) {
            parent.showMain();
        } else if (cmd == exitCommand) {
            parent.notifyDestroyed();
        }
    }

    // loads the names of a named contact list
    private void loadNames(String name) throws PIMException, SecurityException {
        ContactList contactList = null;
        try {
            contactList = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY, name);
            // First check that the fields we are interested in are supported
            // by the PIM List
            if (contactList.isSupportedField(Contact.NAME) && contactList.isSupportedField(Contact.TEL)) {
                // Put an informative title while reading the contacts
                setTitle("Contacts");
                Enumeration items = contactList.items();

                Vector telNumbers = new Vector();
                // For each Contact in the List
                while (items.hasMoreElements()) {
                    String firstname=null;
                    String lastname=null;

                    Contact contact = (Contact) items.nextElement();
                    //Get First Name if available
                    try {
                        firstname=contact.getStringArray(Contact.NAME,
                        Contact.ATTR_NONE)[Contact.NAME_GIVEN];
                    }
                    catch(Exception e){}
                    //Get Last Name if available
                    try {
                        lastname=contact.getStringArray(Contact.NAME,
                        Contact.ATTR_NONE)[Contact.NAME_FAMILY];
                    }
                    catch(Exception e){}

                    //Counts the number of telephone entries for this contact
                    int telCount=contact.countValues(Contact.TEL);

                    // we're only interested on contacts with a phone number
                    // and a name (either first or last).

                    if (telCount > 0 && (firstname!=null || lastname!=null)) {
                        String contactName=null;
                        if(firstname!=null && lastname!=null)
                            contactName = firstname+" "+lastname;
                        else if(lastname==null)
                            contactName=firstname;
                        else
                            contactName=lastname;

                        // go through all the phone numbers
                        for (int i = 0; i < telCount; i++) {
                            // check if it is a mobile phone and put it at the beginning
                            // this doesn't necessary work since in many cases is up
                            // to the user to indicate whether it is a mobile phone
                            int telAttributes = contact.getAttributes(Contact.TEL, i);
                            String telNumber = contact.getString(Contact.TEL, i);
                            // check if ATTR_MOBILE is supported
                            if (contactList.isSupportedAttribute(Contact.TEL, Contact.ATTR_MOBILE)) {
                                if ((telAttributes & Contact.ATTR_MOBILE) != 0) {
                                    telNumbers.insertElementAt(telNumber, 0);
                                } else {
                                    telNumbers.addElement(telNumber);
                                }
                            } else {
                                telNumbers.addElement(telNumber);
                            }
                            allTelNumbers.addElement(telNumber);
                        }
                        // Shorten names which are too long
                        if (contactName.length() > 20) {
                            contactName = contactName.substring(0, 17) + "...";
                        }
                        // insert elements in the list in order
                        for (int i = 0; i < telNumbers.size(); i++) {
                            append(contactName + ": " + telNumbers.elementAt(i), null);
                        }
                        telNumbers.removeAllElements();
                    }
                }
                available = true;
            } /*else {
                append("Contact list required items not supported", null);
                available = false;
            }*/
        } finally {
            // always close it
            if (contactList != null) {
                contactList.close();
            }
        }
    }

    // load the names in a separate thread
    private class LoadContacts implements Operation {
        public void execute() {
            try {
                // go through all the lists
                String[] allContactLists = PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);
                if (allContactLists.length != 0) {
                    for (int i = 0; i < allContactLists.length; i++) {
                        loadNames(allContactLists[i]);
                    }
                    addCommand(selectCommand);
                } else {
                    append("No Contact lists available", null);
                    available = false;
                }
            } catch (PIMException e) {
                parent.showMessage(e.getMessage(), ContactListForm.this);
                available = false;
                append("Press a key to return", null);
            } catch (SecurityException e) {
                parent.showMessage(e.getMessage(), ContactListForm.this);
                available = false;
                append("Press a key to return", null);
            }
        }
    }
}