Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.contacts;
import com.codename1.ui.Display;
import com.codename1.ui.Image;
import com.codename1.ui.events.DataChangedListener;
import com.codename1.ui.events.SelectionListener;
import com.codename1.ui.list.DefaultListModel;
import com.codename1.ui.list.ListModel;
import java.util.Hashtable;
import java.util.Vector;
/**
* This Contacts model is responsible for querying Contacts from the device
* and to cache the data for faster usage
*
* @author Chen
*/
public class ContactsModel extends DefaultListModel {
private Hashtable contactsCache = new Hashtable();
private Image placeHolder;
/**
* Constructor with contacts ids
* @param ids the contact ids we would like this model to handle
*/
public ContactsModel(String... ids) {
super((Object[])ids);
}
/**
* Sets the Contacts place holder image.
*
* @param placeHolder image place holder for the contacts
*/
public void setPlaceHolderImage(Image placeHolder){
this.placeHolder = placeHolder;
}
/**
* {@inheritDoc}
*/
public Object getItemAt(final int index) {
final String id = (String) super.getItemAt(index);
Hashtable contact = (Hashtable) contactsCache.get(id);
if (contact == null) {
Hashtable cnt = getContactAsHashtable(null);
contactsCache.put(id, cnt);
Display.getInstance().scheduleBackgroundTask(new Runnable() {
public void run() {
Contact c = ContactsManager.getContactById(id);
Hashtable contact = getContactAsHashtable(c);
contactsCache.put(id, contact);
Display.getInstance().callSerially(new Runnable() {
public void run() {
setItem(index, id);
}
});
}
});
return cnt;
}
return contact;
}
/**
* {@inheritDoc}
*/
public void addItem(Object item) {
if (item instanceof String) {
super.addItem(item);
} else if (item instanceof Contact) {
super.addItem(((Contact) item).getId());
contactsCache.put(((Contact) item).getId(), getContactAsHashtable((Contact) item));
} else if (item instanceof Hashtable) {
super.addItem(((Hashtable) item).get("id"));
contactsCache.put(((Hashtable) item).get("id"), item);
}
}
/**
* {@inheritDoc}
*/
public void removeItem(int index) {
String id = (String) super.getItemAt(index);
super.removeItem(index);
contactsCache.remove(id);
}
private Hashtable getContactAsHashtable(Contact c) {
Hashtable table = new Hashtable();
String id = null;
String fname;
String lname;
String displayName;
Image image;
String phone;
String email;
if(c == null){
fname = "Loading...";
lname = "Loading...";
displayName = "Loading...";
image = placeHolder;
phone = "Loading...";
email = "Loading...";
}else{
id = c.getId();
fname = c.getFirstName();
lname = c.getFamilyName();
displayName = c.getDisplayName();
image = c.getPhoto();
if(image == null){
image = placeHolder;
}
phone = getContactPhoneNumber(c);
email = getContactEmail(c);
}
addAttribute(table, "id", id);
addAttribute(table, "fname", fname);
addAttribute(table, "lname", lname);
addAttribute(table, "displayName", displayName);
addAttribute(table, "icon", image);
addAttribute(table, "phone", phone);
addAttribute(table, "email", email);
//the keys in the Hashtable should be enough for most use-cases, in case
//something is missing there is the ability to get the Contact.
if(c != null){
table.put("contact", c);
}
return table;
}
private void addAttribute(Hashtable table, String key, Object value) {
if(value == null || key == null){
return;
}
table.put(key, value);
}
private String getContactPhoneNumber(Contact contact) {
if (contact.getPrimaryPhoneNumber() != null) {
return contact.getPrimaryPhoneNumber();
}
Hashtable phones = contact.getPhoneNumbers();
if (phones != null && phones.size() > 0) {
String first = (String) phones.keys().nextElement();
return (String) phones.get(first);
}
return null;
}
private String getContactEmail(Contact contact) {
if (contact.getPrimaryEmail() != null) {
return contact.getPrimaryEmail();
}
Hashtable emails = contact.getEmails();
if (emails != null && emails.size() > 0) {
String first = (String) emails.keys().nextElement();
return (String) emails.get(first);
}
return null;
}
}