4
* Copyright (C) 2009 to 2012 Tim Marston <tim@ed.am>
4
* Copyright (C) 2009 to 2011 Tim Marston <tim@ed.am>
6
6
* This file is part of the Import Contacts program (hereafter referred
7
7
* to as "this program"). For more information, see
31
31
import java.util.regex.Matcher;
32
32
import java.util.regex.Pattern;
34
import android.content.ContentUris;
35
import android.content.ContentValues;
34
36
import android.content.SharedPreferences;
37
import android.net.Uri;
35
38
import android.os.Message;
39
import android.provider.Contacts;
36
40
import android.provider.Contacts.PhonesColumns;
38
43
public class Importer extends Thread
40
45
public final static int ACTION_ABORT = 1;
418
422
setProgressMessage( R.string.doit_caching );
420
// create the appropriate backend
421
// if( Integer.parseInt( android.os.Build.VERSION.SDK ) >= 5 )
422
// _backend = new ContactsContractBackend( _doit );
424
_backend = new ContactsBackend( _doit );
426
// create a cache of existing contacts and populate it
424
// build a cache of existing contacts
427
425
_contacts_cache = new ContactsCache();
428
_backend.populateCache( _contacts_cache );
426
_contacts_cache.buildCache( _doit );
685
683
// should we skip this import altogether?
686
684
if( _last_merge_decision == Doit.ACTION_KEEP ) return;
687
Uri contact_uri = ContentUris.withAppendedId(
688
Contacts.People.CONTENT_URI, id );
688
690
// should we destroy the existing contact before importing?
689
691
if( _last_merge_decision == Doit.ACTION_OVERWRITE )
691
693
// remove from device
692
_backend.deleteContact( id );
694
_doit.getContentResolver().delete( contact_uri, null, null );
695
_contacts_cache.removeLookup( cache_identifier );
697
_contacts_cache.removeLookup( contact.getCacheIdentifier() );
696
698
_contacts_cache.removeAssociatedData( id );
698
700
// show that we're overwriting a contact
708
// if we don't have a contact id yet (or we did, but we destroyed it
710
// if we don't have a contact id yet (or if we did, but we destroyed it
709
711
// when we deleted the contact), we'll have to create a new contact
712
714
// create a new contact
713
id = _backend.addContact( contact._name );
715
ContentValues values = new ContentValues();
716
values.put( Contacts.People.NAME, contact._name );
717
Uri contact_uri = _doit.getContentResolver().insert(
718
Contacts.People.CONTENT_URI, values );
719
id = ContentUris.parseId( contact_uri );
720
if( id == null || id <= 0 )
715
721
showError( R.string.error_unabletoaddcontact );
723
// try to add them to the "My Contacts" group
725
Contacts.People.addToMyContactsGroup(
726
_doit.getContentResolver(), id );
728
catch( IllegalStateException e ) {
729
// ignore any failure
718
_contacts_cache.addLookup( cache_identifier, id );
733
_contacts_cache.addLookup(
734
ContactsCache.createIdentifier( contact ), id );
720
736
// if we haven't already shown that we're overwriting a contact,
721
737
// show that we're creating a new contact
744
760
private void importContactPhones( Long id,
745
761
HashMap< String, ContactData.PreferredDetail > datas )
763
// get URI to contact's phones
764
Uri contact_phones_uri = Uri.withAppendedPath(
765
ContentUris.withAppendedId( Contacts.People.CONTENT_URI, id ),
766
Contacts.People.Phones.CONTENT_DIRECTORY );
767
Set< String > datas_keys = datas.keySet();
747
769
// add phone numbers
748
Set< String > datas_keys = datas.keySet();
749
770
Iterator< String > i = datas_keys.iterator();
750
771
while( i.hasNext() ) {
751
772
String number = i.next();
764
785
// add phone number
765
_backend.addContactPhone( id, number, data );
786
ContentValues values = new ContentValues();
787
values.put( Contacts.Phones.TYPE, data.getType() );
788
values.put( Contacts.Phones.NUMBER, number );
789
if( data.isPreferred() )
790
values.put( Contacts.Phones.ISPRIMARY, 1 );
791
_doit.getContentResolver().insert( contact_phones_uri, values );
767
793
// and add this address to the cache to prevent a addition of
768
794
// duplicate date from another file
773
799
private void importContactEmails( Long id,
774
800
HashMap< String, ContactData.PreferredDetail > datas )
802
// get URI to contact's contact methods
803
Uri contact_contact_methods_uri = Uri.withAppendedPath(
804
ContentUris.withAppendedId( Contacts.People.CONTENT_URI, id ),
805
Contacts.People.ContactMethods.CONTENT_DIRECTORY );
806
Set< String > datas_keys = datas.keySet();
776
808
// add email addresses
777
Set< String > datas_keys = datas.keySet();
778
809
Iterator< String > i = datas_keys.iterator();
779
810
while( i.hasNext() ) {
780
811
String email = i.next();
788
819
// add phone number
789
_backend.addContactEmail( id, email, data );
820
ContentValues values = new ContentValues();
821
values.put( Contacts.ContactMethods.KIND, Contacts.KIND_EMAIL );
822
values.put( Contacts.ContactMethods.DATA, email );
823
values.put( Contacts.ContactMethods.TYPE, data.getType() );
824
if( data.isPreferred() )
825
values.put( Contacts.ContactMethods.ISPRIMARY, 1 );
826
_doit.getContentResolver().insert( contact_contact_methods_uri,
791
829
// and add this address to the cache to prevent a addition of
792
830
// duplicate date from another file
797
835
private void importContactAddresses( Long id,
798
836
HashMap< String, ContactData.TypeDetail > datas )
838
// get URI to contact's contact methods
839
Uri contact_contact_methods_uri = Uri.withAppendedPath(
840
ContentUris.withAppendedId( Contacts.People.CONTENT_URI, id ),
841
Contacts.People.ContactMethods.CONTENT_DIRECTORY );
801
844
Set< String > datas_keys = datas.keySet();
802
845
Iterator< String > i = datas_keys.iterator();
812
855
// add postal address
813
_backend.addContactAddresses( id, address, data );
856
ContentValues values = new ContentValues();
857
values.put( Contacts.ContactMethods.KIND, Contacts.KIND_POSTAL );
858
values.put( Contacts.ContactMethods.DATA, address );
859
values.put( Contacts.ContactMethods.TYPE, data.getType() );
860
_doit.getContentResolver().insert( contact_contact_methods_uri,
815
863
// and add this address to the cache to prevent a addition of
816
864
// duplicate date from another file
836
884
// add organisation address
837
_backend.addContactOrganisation( id, organisation, data );
885
ContentValues values = new ContentValues();
886
values.put( Contacts.Organizations.PERSON_ID, id );
887
values.put( Contacts.Organizations.COMPANY, organisation );
888
values.put( Contacts.ContactMethods.TYPE,
889
Contacts.OrganizationColumns.TYPE_WORK );
890
if( data.getExtra() != null )
891
values.put( Contacts.Organizations.TITLE, data.getExtra() );
892
_doit.getContentResolver().insert(
893
Contacts.Organizations.CONTENT_URI, values );
839
895
// and add this address to the cache to prevent a addition of
840
896
// duplicate date from another file