4
* Copyright (C) 2011 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
import android.app.Activity;
32
public class ContactsCache
35
* Information that can be used to identify a contact within the cache
37
static public class CacheIdentifier
40
NONE, NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
43
private String _detail;
45
protected CacheIdentifier()
50
protected CacheIdentifier( Type type, String detail )
61
public String getDetail()
67
// mappings of contact names, organisations and primary numbers to ids
68
private HashMap< String, Long > _contactsByName
69
= new HashMap< String, Long >();
70
private HashMap< String, Long > _contactsByOrg
71
= new HashMap< String, Long >();
72
private HashMap< String, Long > _contactsByNumber
73
= new HashMap< String, Long >();
74
private HashMap< String, Long > _contactsByEmail
75
= new HashMap< String, Long >();
77
// mapping of contact ids to sets of associated data
78
private HashMap< Long, HashSet< String > > _contactNumbers
79
= new HashMap< Long, HashSet< String > >();
80
private HashMap< Long, HashSet< String > > _contactEmails
81
= new HashMap< Long, HashSet< String > >();
82
private HashMap< Long, HashSet< String > > _contactAddresses
83
= new HashMap< Long, HashSet< String > >();
84
private HashMap< Long, HashSet< String > > _contactOrganisations
85
= new HashMap< Long, HashSet< String > >();
90
// _contactsByName = new HashMap< String, Long >();
91
// _contactsByOrg = new HashMap< String, Long >();
92
// _contactsByNumber = new HashMap< String, Long >();
93
// _contactsByEmail = new HashMap< String, Long >();
95
// init associated data cache
96
// _contactNumbers = new HashMap< Long, HashSet< String > >();
97
// _contactEmails = new HashMap< Long, HashSet< String > >();
98
// _contactAddresses = new HashMap< Long, HashSet< String > >();
99
// _contactOrganisations = new HashMap< Long, HashSet< String > >();
102
public static CacheIdentifier createIdentifier(
103
Importer.ContactData contact )
105
if( contact.hasName() ) {
106
String name = normaliseName( contact.getName() );
108
return new CacheIdentifier(
109
CacheIdentifier.Type.NAME, name );
112
if( contact.hasPrimaryOrganisation() ) {
113
String organisation = normaliseOrganisation(
114
contact.getPrimaryOrganisation() );
115
if( organisation != null )
116
return new CacheIdentifier(
117
CacheIdentifier.Type.ORGANISATION, organisation );
120
if( contact.hasPrimaryNumber() ) {
121
String number = normalisePhoneNumber( contact.getPrimaryNumber() );
123
return new CacheIdentifier(
124
CacheIdentifier.Type.PRIMARY_NUMBER, number );
127
if( contact.hasPrimaryEmail() ) {
128
String email = normaliseEmailAddress( contact.getPrimaryEmail() );
130
return new CacheIdentifier(
131
CacheIdentifier.Type.PRIMARY_EMAIL, email );
137
public boolean canLookup( CacheIdentifier identifier )
139
return lookup( identifier ) != null;
142
public Long lookup( CacheIdentifier identifier )
144
switch( identifier.getType() )
147
return _contactsByName.get( identifier.getDetail() );
149
return _contactsByOrg.get( identifier.getDetail() );
151
return _contactsByNumber.get( identifier.getDetail() );
153
return _contactsByEmail.get( identifier.getDetail() );
158
public Long removeLookup( CacheIdentifier identifier )
160
switch( identifier.getType() )
163
return _contactsByName.remove( identifier.getDetail() );
165
return _contactsByOrg.remove( identifier.getDetail() );
167
return _contactsByNumber.remove( identifier.getDetail() );
169
return _contactsByEmail.remove( identifier.getDetail() );
174
public void addLookup( CacheIdentifier identifier, Long id )
176
switch( identifier.getType() )
179
_contactsByName.put( identifier.getDetail(), id );
182
_contactsByOrg.put( identifier.getDetail(), id );
185
_contactsByNumber.put( identifier.getDetail(), id );
188
_contactsByEmail.put( identifier.getDetail(), id );
193
public void removeAssociatedData( Long id )
195
_contactNumbers.remove( id );
196
_contactEmails.remove( id );
197
_contactAddresses.remove( id );
198
_contactOrganisations.remove( id );
201
public boolean hasAssociatedNumber( Long id, String number )
203
number = normalisePhoneNumber( number );
204
if( number == null ) return false;
206
HashSet< String > set = _contactNumbers.get( id );
207
return set != null && set.contains( number );
210
public void addAssociatedNumber( Long id, String number )
212
number = normalisePhoneNumber( number );
213
if( number == null ) return;
215
HashSet< String > set = _contactNumbers.get( id );
217
set = new HashSet< String >();
218
_contactNumbers.put( id, set );
220
set.add( normalisePhoneNumber( number ) );
223
public boolean hasAssociatedEmail( Long id, String email )
225
email = normaliseEmailAddress( email );
226
if( email == null ) return false;
228
HashSet< String > set = _contactEmails.get( id );
229
return set != null && set.contains( normaliseEmailAddress( email ) );
232
public void addAssociatedEmail( Long id, String email )
234
email = normaliseEmailAddress( email );
235
if( email == null ) return;
237
HashSet< String > set = _contactEmails.get( id );
239
set = new HashSet< String >();
240
_contactEmails.put( id, set );
242
set.add( normaliseEmailAddress( email ) );
245
public boolean hasAssociatedAddress( Long id, String address )
247
address = normaliseAddress( address );
248
if( address == null ) return false;
250
HashSet< String > set = _contactAddresses.get( id );
251
return set != null && set.contains( normaliseAddress( address ) );
254
public void addAssociatedAddress( Long id, String address )
256
address = normaliseAddress( address );
257
if( address == null ) return;
259
HashSet< String > set = _contactAddresses.get( id );
261
set = new HashSet< String >();
262
_contactAddresses.put( id, set );
264
set.add( normaliseAddress( address ) );
267
public boolean hasAssociatedOrganisation( Long id, String organisation )
269
organisation = normaliseOrganisation( organisation );
270
if( organisation == null ) return false;
272
HashSet< String > set = _contactOrganisations.get( id );
273
return set != null && set.contains(
274
normaliseOrganisation( organisation ) );
277
public void addAssociatedOrganisation( Long id, String organisation )
279
organisation = normaliseOrganisation( organisation );
280
if( organisation == null ) return;
282
HashSet< String > set = _contactOrganisations.get( id );
284
set = new HashSet< String >();
285
_contactOrganisations.put( id, set );
287
set.add( normaliseOrganisation( organisation ) );
290
static public String normaliseName( String name )
292
if( name == null ) return null;
294
return name.length() > 0? name : null;
297
static public String normalisePhoneNumber( String number )
299
if( number == null ) return null;
300
number = number.trim().replaceAll( "[-\\(\\) ]", "" );
301
return number.length() > 0? number : null;
304
static public String normaliseEmailAddress( String email )
306
if( email == null ) return null;
307
email = email.trim().toLowerCase();
308
return email.length() > 0? email : null;
311
static public String normaliseOrganisation( String organisation )
313
if( organisation == null ) return null;
314
organisation = organisation.trim();
315
return organisation.length() > 0? organisation : null;
318
static public String normaliseAddress( String address )
320
if( address == null ) return null;
321
address = address.trim();
322
return address.length() > 0? address : null;