/android/import-contacts

To get this branch, use:
bzr branch http://bzr.ed.am/android/import-contacts

« back to all changes in this revision

Viewing changes to src/am/ed/importcontacts/Importer.java

  • Committer: Tim Marston
  • Date: 2013-09-16 20:15:38 UTC
  • Revision ID: tim@ed.am-20130916201538-w2s54x86ml6kvjft
prevent NPE

Show diffs side-by-side

added added

removed removed

1
1
/*
2
2
 * Importer.java
3
3
 *
4
 
 * Copyright (C) 2009 to 2012 Tim Marston <tim@ed.am>
 
4
 * Copyright (C) 2009 to 2013 Tim Marston <tim@ed.am>
5
5
 *
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
9
9
 *
10
10
 * This program is free software: you can redistribute it and/or modify
142
142
                protected HashMap< String, PreferredDetail > _emails = null;
143
143
                protected HashMap< String, TypeDetail > _addresses = null;
144
144
                protected HashSet< String > _notes = null;
 
145
                protected String _birthday = null;
145
146
 
146
147
                private ContactsCache.CacheIdentifier _cache_identifier = null;
147
148
 
185
186
 
186
187
                        // if this is the first organisation added, or it's a preferred
187
188
                        // organisation and the current primary organisation isn't, then
188
 
                        // record this as the primary organisation.
 
189
                        // record this as the primary organisation
189
190
                        if( _primary_organisation == null ||
190
191
                                ( is_preferred && !_primary_organisation_is_preferred ) )
191
192
                        {
239
240
                        // and the current primary number isn't, or this number is on equal
240
241
                        // standing with the primary number in terms of preference and it is
241
242
                        // a voice number and the primary number isn't, then record this as
242
 
                        // the primary number.
 
243
                        // the primary number
243
244
                        if( _primary_number == null ||
244
245
                                ( is_preferred && !_primary_number_is_preferred ) ||
245
246
                                ( is_preferred == _primary_number_is_preferred &&
291
292
 
292
293
                        // if this is the first email added, or it's a preferred email and
293
294
                        // the current primary organisation isn't, then record this as the
294
 
                        // primary email.
 
295
                        // primary email
295
296
                        if( _primary_email == null ||
296
297
                                ( is_preferred && !_primary_email_is_preferred ) )
297
298
                        {
362
363
                        return _notes;
363
364
                }
364
365
 
 
366
                public void setBirthday( String birthday )
 
367
                {
 
368
                        _birthday = birthday;
 
369
                }
 
370
 
 
371
                public boolean hasBirthday()
 
372
                {
 
373
                        return _birthday != null;
 
374
                }
 
375
 
 
376
                public String getBirthday()
 
377
                {
 
378
                        return _birthday;
 
379
                }
 
380
 
365
381
                protected void finalise()
366
382
                        throws ContactNotIdentifiableException
367
383
                {
368
 
                        // ensure that if there is a primary number, it is preferred so
369
 
                        // that there is always one preferred number. Android will assign
 
384
                        // Ensure that if there is a primary number, it is preferred so
 
385
                        // that there is always one preferred number.  Android will assign
370
386
                        // preference to one anyway so we might as well decide one sensibly.
371
387
                        if( _primary_number != null ) {
372
388
                                PreferredDetail data = _numbers.get( _primary_number );
627
643
        /**
628
644
         * Should we skip a contact, given whether it exists or not and the current
629
645
         * merge setting?  This routine handles throwing up a prompt, if required.
 
646
         *
630
647
         * @param contact_detail the display name of the contact
631
648
         * @param exists true if this contact matches one in the cache
632
649
         * @param merge_setting the merge setting to use
686
703
        {
687
704
                checkAbort();
688
705
 
689
 
                // It is expected that we use contact.getCacheIdentifier() here. The
 
706
                // It is expected that we use contact.getCacheIdentifier() here.  The
690
707
                // contact we are passed should have been successfully finalise()d,
691
708
                // which includes generating a valid cache identifier.
692
709
                ContactsCache.CacheIdentifier cache_identifier =
761
778
                                importContactOrganisations( id, contact.getOrganisations() );
762
779
                        if( contact.hasNotes() )
763
780
                                importContactNotes( id, contact.getNotes() );
 
781
                        if( contact.hasBirthday() )
 
782
                                importContactBirthday( id, contact.getBirthday() );
764
783
                }
765
784
                catch( Backend.ContactCreationException e )
766
785
                {
779
798
                        String number = i.next();
780
799
                        ContactData.PreferredDetail data = datas.get( number );
781
800
 
782
 
                        // we don't want to add this number if it's crap, or it already
783
 
                        // exists (which would cause a duplicate to be created). We don't
784
 
                        // take in to account the type when checking for duplicates. This is
785
 
                        // intentional: types aren't really very reliable. We assume that
786
 
                        // if the number exists at all, it doesn't need importing. Because
787
 
                        // of this, we also can't update the cache (which we don't need to
788
 
                        // anyway, so it's not a problem).
 
801
                        // We don't want to add this number if it's crap, or it already
 
802
                        // exists (which would cause a duplicate to be created).  We don't
 
803
                        // take in to account the type when checking for duplicates.  This
 
804
                        // is intentional: types aren't really very reliable.  We assume
 
805
                        // that if the number exists at all, it doesn't need importing.
 
806
                        // Because of this, we also can't update the cache (which we don't
 
807
                        // need to anyway, so it's not a problem).
789
808
                        if( _contacts_cache.hasAssociatedNumber( id, number ) )
790
809
                                continue;
791
810
 
810
829
                        ContactData.PreferredDetail data = datas.get( email );
811
830
 
812
831
                        // we don't want to add this email address if it exists already or
813
 
                        // we would introduce duplicates.
 
832
                        // we would introduce duplicates
814
833
                        if( _contacts_cache.hasAssociatedEmail( id, email ) )
815
834
                                continue;
816
835
 
873
892
                }
874
893
        }
875
894
 
876
 
        private void importContactNotes( Long id,
877
 
                HashSet< String > datas )
 
895
        private void importContactNotes( Long id, HashSet< String > datas )
878
896
                throws ContactCreationException
879
897
        {
880
898
                // add notes
894
912
                        // date from another file
895
913
                        _contacts_cache.addAssociatedNote( id, note );
896
914
                }
897
 
 
 
915
        }
 
916
 
 
917
        private void importContactBirthday( Long id, String birthday )
 
918
                throws ContactCreationException
 
919
        {
 
920
                // we don't want to import this birthday if it already exists
 
921
                if( _contacts_cache.hasAssociatedBirthday( id, birthday ) )
 
922
                        return;
 
923
 
 
924
                // add birthday
 
925
                _backend.addContactBirthday( id, birthday );
 
926
 
 
927
                // and update the cache
 
928
                _contacts_cache.addAssociatedBirthday( id, birthday );
898
929
        }
899
930
 
900
931
        synchronized protected void checkAbort() throws AbortImportException