4
* Copyright (C) 2011 to 2013 Tim Marston <tim@ed.am>
4
* Copyright (C) 2011 to 2012 Tim Marston <tim@ed.am>
6
6
* This file is part of the Import Contacts program (hereafter referred
7
* to as "this program"). For more information, see
7
* to as "this program"). For more information, see
8
8
* http://ed.am/dev/android/import-contacts
10
10
* This program is free software: you can redistribute it and/or modify
26
26
import java.util.HashMap;
27
27
import java.util.HashSet;
28
import java.util.Locale;
30
29
public class ContactsCache
33
* A thing that can be used to identify (or lookup) a contact within the
34
* contacts cache. It is not a reference to a cache entry and may not
35
* identify an existing contact in the cache.
32
* Information that can be used to identify a contact within the cache
37
public static class CacheIdentifier
34
static public class CacheIdentifier
39
public enum Type { NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
37
NONE, NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
41
39
private Type _type;
42
40
private String _detail;
45
* Obtain a cache identifier. This routine is designed to be as robust
46
* as possible (in terms of bad or null detail values), and to return
47
* null when a cache identifier can not be created.
49
* @param type the detail type
50
* @param detail the detail
51
* @return the cache identifier, or null
53
public static CacheIdentifier factory( Type type, String detail )
57
case NAME: detail = normaliseName( detail ); break;
58
case ORGANISATION: detail = normaliseOrganisation( detail ); break;
59
case PRIMARY_NUMBER: detail = normalisePhoneNumber( detail ); break;
60
case PRIMARY_EMAIL: detail = normaliseEmailAddress( detail ); break;
63
if( detail == null ) return null;
64
return new CacheIdentifier( type, detail );
68
* Obtain a cache identifier from contact data. This routine is
69
* designed to be as robust as possible and may return null when a cache
70
* identifier can not be created.
72
* @param contact the contact data
73
* @return the cache identifier, or null
75
public static CacheIdentifier factory( Importer.ContactData contact )
77
CacheIdentifier identifier = null;
79
if( contact.hasName() )
80
identifier = factory( CacheIdentifier.Type.NAME,
82
if( identifier != null ) return identifier;
84
if( contact.hasPrimaryOrganisation() )
85
identifier = factory( CacheIdentifier.Type.ORGANISATION,
86
contact.getPrimaryOrganisation() );
87
if( identifier != null ) return identifier;
89
if( contact.hasPrimaryNumber() )
90
identifier = factory( CacheIdentifier.Type.PRIMARY_NUMBER,
91
contact.getPrimaryNumber() );
92
if( identifier != null ) return identifier;
94
if( contact.hasPrimaryEmail() )
95
identifier = factory( CacheIdentifier.Type.PRIMARY_EMAIL,
96
contact.getPrimaryEmail() );
97
if( identifier != null ) return identifier;
42
protected CacheIdentifier()
102
47
protected CacheIdentifier( Type type, String detail )
135
80
= new HashMap< Long, HashSet< String > >();
136
81
private HashMap< Long, HashSet< String > > _contactOrganisations
137
82
= new HashMap< Long, HashSet< String > >();
138
private HashMap< Long, HashSet< String > > _contactNotes
139
= new HashMap< Long, HashSet< String > >();
140
private HashMap< Long, String > _contactBirthdays
141
= new HashMap< Long, String >();
84
public static CacheIdentifier createIdentifier(
85
Importer.ContactData contact )
87
if( contact.hasName() ) {
88
String name = normaliseName( contact.getName() );
90
return new CacheIdentifier(
91
CacheIdentifier.Type.NAME, name );
94
if( contact.hasPrimaryOrganisation() ) {
95
String organisation = normaliseOrganisation(
96
contact.getPrimaryOrganisation() );
97
if( organisation != null )
98
return new CacheIdentifier(
99
CacheIdentifier.Type.ORGANISATION, organisation );
102
if( contact.hasPrimaryNumber() ) {
103
String number = normalisePhoneNumber( contact.getPrimaryNumber() );
105
return new CacheIdentifier(
106
CacheIdentifier.Type.PRIMARY_NUMBER, number );
109
if( contact.hasPrimaryEmail() ) {
110
String email = normaliseEmailAddress( contact.getPrimaryEmail() );
112
return new CacheIdentifier(
113
CacheIdentifier.Type.PRIMARY_EMAIL, email );
143
119
public boolean canLookup( CacheIdentifier identifier )
145
121
return lookup( identifier ) != null;
149
* Retrieve the contact id of a contact identified by the specified cache
150
* identifier, if it exists.
152
* @param identifier the cache identifier
153
* @return a contact id, or null
155
124
public Long lookup( CacheIdentifier identifier )
157
126
switch( identifier.getType() )
219
* Remove any data that is associated with an contact id.
223
175
public void removeAssociatedData( Long id )
225
177
_contactNumbers.remove( id );
226
178
_contactEmails.remove( id );
227
179
_contactAddresses.remove( id );
228
180
_contactOrganisations.remove( id );
229
_contactNotes.remove( id );
232
183
public boolean hasAssociatedNumber( Long id, String number )
314
266
set = new HashSet< String >();
315
267
_contactOrganisations.put( id, set );
317
set.add( organisation );
320
public boolean hasAssociatedNote( Long id, String note )
322
note = normaliseNote( note );
323
if( note == null ) return false;
325
HashSet< String > set = _contactNotes.get( id );
326
return set != null && set.contains( note );
329
public void addAssociatedNote( Long id, String note )
331
note = normaliseNote( note );
332
if( note == null ) return;
334
HashSet< String > set = _contactNotes.get( id );
336
set = new HashSet< String >();
337
_contactNotes.put( id, set );
342
public boolean hasAssociatedBirthday( Long id, String birthday )
344
birthday = normaliseBirthday( birthday );
345
if( birthday == null ) return false;
347
String found = _contactBirthdays.get( id );
348
return found != null && found.equalsIgnoreCase( birthday );
351
public void addAssociatedBirthday( Long id, String birthday )
353
birthday = normaliseBirthday( birthday );
354
if( birthday == null ) return;
356
_contactBirthdays.put( id, birthday );
269
set.add( normaliseOrganisation( organisation ) );
359
272
static public String normaliseName( String name )
390
303
address = address.trim();
391
304
return address.length() > 0? address : null;
394
static public String normaliseNote( String note )
396
if( note == null ) return null;
398
return note.length() > 0? note : null;
401
static public String normaliseBirthday( String birthday )
403
if( birthday == null ) return null;
404
birthday = birthday.trim();
405
return birthday.length() > 0? birthday : null;