/* * Copyright 2011 Daniel Kurka * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.googlecode.gwtphonegap.client.contacts.browser; import java.util.Set; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONValue; import com.google.gwt.storage.client.Storage; import com.googlecode.gwtphonegap.client.contacts.Contact; import com.googlecode.gwtphonegap.client.contacts.ContactFactory; import com.googlecode.gwtphonegap.client.contacts.ContactFindCallback; import com.googlecode.gwtphonegap.client.contacts.ContactFindOptions; import com.googlecode.gwtphonegap.client.contacts.ContactPickCallback; import com.googlecode.gwtphonegap.client.contacts.Contacts; import com.googlecode.gwtphonegap.client.device.DeviceBrowserImpl; import com.googlecode.gwtphonegap.collection.shared.CollectionFactory; import com.googlecode.gwtphonegap.collection.shared.LightArray; import com.googlecode.gwtphonegap.collection.shared.LightMap; public class ContactsBrowserImpl implements Contacts { private Storage storage; private ContactFactoryBrowserImpl contactFactory; public ContactsBrowserImpl() { storage = Storage.getLocalStorageIfSupported(); if (storage == null) { throw new IllegalStateException("browser does not have local storage, but we need it for contacts emulation"); } } @Override public Contact create() { return new ContactBrowserImpl(this); } @Override public void find(LightArray<String> fields, ContactFindCallback callback, ContactFindOptions contactFindOptions) { LightMap<Contact> fromStorage = loadContactsFromStorage(); if (fields.length() == 0) { callback.onSuccess(toArray(fromStorage)); } LightMap<Contact> result = CollectionFactory.constructMap(); LightArray<String> keys = fromStorage.getKeys(); String filter = contactFindOptions.getFilter(); for (int i = 0; i < keys.length(); i++) { Contact contact = fromStorage.get(keys.get(i)); for (int j = 0; j < fields.length(); j++) { String string = fields.get(j); if ("name".equals(string)) { if (contact.getName().getFamilyName() != null && contact.getName().getFamilyName().contains(filter)) { result.put(contact.getId(), contact); break; } if (contact.getName().getFamilyName() != null && contact.getName().getGivenName().contains(filter)) { result.put(contact.getId(), contact); break; } } else { // TODO implement the rest } } } callback.onSuccess(toArray(result)); } private LightArray<Contact> toArray(LightMap<Contact> map) { LightArray<Contact> array = CollectionFactory.constructArray(); LightArray<String> keys = map.getKeys(); for (int i = 0; i < keys.length(); i++) { Contact contact = map.get(keys.get(i)); array.set(i, contact); } return array; } @Override public ContactFactory getFactory() { if (contactFactory == null) { contactFactory = new ContactFactoryBrowserImpl(); } return contactFactory; } public void remove(ContactBrowserImpl contactBrowserImpl) { } public void save(ContactBrowserImpl contactBrowserImpl) { LightMap<Contact> fromStorage = loadContactsFromStorage(); // ensure id if (contactBrowserImpl.getId() == null || "".equals(contactBrowserImpl.getId())) { contactBrowserImpl.setId(DeviceBrowserImpl.getPseudoGUUID()); } fromStorage.put(contactBrowserImpl.getId(), contactBrowserImpl); store(fromStorage); } private void store(LightMap<Contact> fromStorage) { JSONObject map = new JSONObject(); LightArray<String> keys = fromStorage.getKeys(); for (int i = 0; i < keys.length(); i++) { Contact contact = fromStorage.get(keys.get(i)); JSONObject jsonContact = ((ContactBrowserImpl) contact).serializeContact(); map.put(contact.getId(), jsonContact); } storage.setItem("gwtphonegap-contact-emulation", map.toString()); } public Contact cloneContact(ContactBrowserImpl toClone) { ContactBrowserImpl contact = new ContactBrowserImpl(this); contact.setBirthDay(toClone.getBirthDay()); contact.setCategories(toClone.getCategories()); contact.setContactAddresses(toClone.getContactAddresses()); contact.setDisplayName(toClone.getDisplayName()); contact.setEmails(toClone.getEmails()); contact.setIms(toClone.getIms()); contact.setName(toClone.getName()); contact.setNickName(toClone.getNickName()); contact.setNote(toClone.getNote()); contact.setOrganisations(toClone.getOrganisations()); contact.setPhoneNumbers(toClone.getPhoneNumbers()); contact.setPhotos(toClone.getPhotos()); contact.setUrls(toClone.getUrls()); return contact; } protected LightMap<Contact> loadContactsFromStorage() { LightMap<Contact> map = CollectionFactory.constructMap(); String item = storage.getItem("gwtphonegap-contact-emulation"); if (item == null) { return map; } JSONValue parsed = JSONParser.parseStrict(item); JSONObject root = parsed.isObject(); if (root == null) { return map; } else { Set<String> set = root.keySet(); for (String key : set) { JSONObject jsonContact = root.get(key).isObject(); Contact contact = parseContact(jsonContact); map.put(contact.getId(), contact); } } return map; } private Contact parseContact(JSONObject jsonContact) { if (jsonContact == null) { throw new IllegalStateException(); } Contact contact = ContactBrowserImpl.fromJSON(this, jsonContact); return contact; } @Override public void pickContact(ContactPickCallback callback) { //TODO: Display all the contacts from the storage and allow user to select one contact from the list of contacts displayed. } }