4
* Copyright (C) 2011 to 2012 Tim Marston <tim@ed.am>
6
* This file is part of the Import Contacts program (hereafter referred
7
* to as "this program"). For more information, see
8
* http://ed.am/dev/android/import-contacts
10
* This program is free software: you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation, either version 3 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program. If not, see <http://www.gnu.org/licenses/>.
24
package am.ed.importcontacts;
26
import java.util.HashMap;
27
import java.util.HashSet;
29
public class ContactsCache
32
* Information that can be used to identify a contact within the cache
34
static public class CacheIdentifier
37
NONE, NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
40
private String _detail;
42
protected CacheIdentifier()
47
protected CacheIdentifier( Type type, String detail )
58
public String getDetail()
64
// mappings of contact names, organisations and primary numbers to ids
65
private HashMap< String, Long > _contactsByName
66
= new HashMap< String, Long >();
67
private HashMap< String, Long > _contactsByOrg
68
= new HashMap< String, Long >();
69
private HashMap< String, Long > _contactsByNumber
70
= new HashMap< String, Long >();
71
private HashMap< String, Long > _contactsByEmail
72
= new HashMap< String, Long >();
74
// mapping of contact ids to sets of associated data
75
private HashMap< Long, HashSet< String > > _contactNumbers
76
= new HashMap< Long, HashSet< String > >();
77
private HashMap< Long, HashSet< String > > _contactEmails
78
= new HashMap< Long, HashSet< String > >();
79
private HashMap< Long, HashSet< String > > _contactAddresses
80
= new HashMap< Long, HashSet< String > >();
81
private HashMap< Long, HashSet< String > > _contactOrganisations
82
= new HashMap< Long, HashSet< 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 );
119
public boolean canLookup( CacheIdentifier identifier )
121
return lookup( identifier ) != null;
124
public Long lookup( CacheIdentifier identifier )
126
switch( identifier.getType() )
129
return _contactsByName.get( identifier.getDetail() );
131
return _contactsByOrg.get( identifier.getDetail() );
133
return _contactsByNumber.get( identifier.getDetail() );
135
return _contactsByEmail.get( identifier.getDetail() );
140
public Long removeLookup( CacheIdentifier identifier )
142
switch( identifier.getType() )
145
return _contactsByName.remove( identifier.getDetail() );
147
return _contactsByOrg.remove( identifier.getDetail() );
149
return _contactsByNumber.remove( identifier.getDetail() );
151
return _contactsByEmail.remove( identifier.getDetail() );
156
public void addLookup( CacheIdentifier identifier, Long id )
158
switch( identifier.getType() )
161
_contactsByName.put( identifier.getDetail(), id );
164
_contactsByOrg.put( identifier.getDetail(), id );
167
_contactsByNumber.put( identifier.getDetail(), id );
170
_contactsByEmail.put( identifier.getDetail(), id );
175
public void removeAssociatedData( Long id )
177
_contactNumbers.remove( id );
178
_contactEmails.remove( id );
179
_contactAddresses.remove( id );
180
_contactOrganisations.remove( id );
183
public boolean hasAssociatedNumber( Long id, String number )
185
number = normalisePhoneNumber( number );
186
if( number == null ) return false;
188
HashSet< String > set = _contactNumbers.get( id );
189
return set != null && set.contains( number );
192
public void addAssociatedNumber( Long id, String number )
194
number = normalisePhoneNumber( number );
195
if( number == null ) return;
197
HashSet< String > set = _contactNumbers.get( id );
199
set = new HashSet< String >();
200
_contactNumbers.put( id, set );
202
set.add( normalisePhoneNumber( number ) );
205
public boolean hasAssociatedEmail( Long id, String email )
207
email = normaliseEmailAddress( email );
208
if( email == null ) return false;
210
HashSet< String > set = _contactEmails.get( id );
211
return set != null && set.contains( normaliseEmailAddress( email ) );
214
public void addAssociatedEmail( Long id, String email )
216
email = normaliseEmailAddress( email );
217
if( email == null ) return;
219
HashSet< String > set = _contactEmails.get( id );
221
set = new HashSet< String >();
222
_contactEmails.put( id, set );
224
set.add( normaliseEmailAddress( email ) );
227
public boolean hasAssociatedAddress( Long id, String address )
229
address = normaliseAddress( address );
230
if( address == null ) return false;
232
HashSet< String > set = _contactAddresses.get( id );
233
return set != null && set.contains( normaliseAddress( address ) );
236
public void addAssociatedAddress( Long id, String address )
238
address = normaliseAddress( address );
239
if( address == null ) return;
241
HashSet< String > set = _contactAddresses.get( id );
243
set = new HashSet< String >();
244
_contactAddresses.put( id, set );
246
set.add( normaliseAddress( address ) );
249
public boolean hasAssociatedOrganisation( Long id, String organisation )
251
organisation = normaliseOrganisation( organisation );
252
if( organisation == null ) return false;
254
HashSet< String > set = _contactOrganisations.get( id );
255
return set != null && set.contains(
256
normaliseOrganisation( organisation ) );
259
public void addAssociatedOrganisation( Long id, String organisation )
261
organisation = normaliseOrganisation( organisation );
262
if( organisation == null ) return;
264
HashSet< String > set = _contactOrganisations.get( id );
266
set = new HashSet< String >();
267
_contactOrganisations.put( id, set );
269
set.add( normaliseOrganisation( organisation ) );
272
static public String normaliseName( String name )
274
if( name == null ) return null;
276
return name.length() > 0? name : null;
279
static public String normalisePhoneNumber( String number )
281
if( number == null ) return null;
282
number = number.trim().replaceAll( "[-\\(\\) ]", "" );
283
return number.length() > 0? number : null;
286
static public String normaliseEmailAddress( String email )
288
if( email == null ) return null;
289
email = email.trim().toLowerCase();
290
return email.length() > 0? email : null;
293
static public String normaliseOrganisation( String organisation )
295
if( organisation == null ) return null;
296
organisation = organisation.trim();
297
return organisation.length() > 0? organisation : null;
300
static public String normaliseAddress( String address )
302
if( address == null ) return null;
303
address = address.trim();
304
return address.length() > 0? address : null;