/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/org/waxworlds/importcontacts/Doit.java

  • Committer: edam
  • Date: 2009-01-13 06:35:26 UTC
  • Revision ID: edam@waxworlds.org-20090113063526-l9t1s9git4bav60a
- new contact's phone numebrs and email addresses are added to the caches after those contacts are updated to account for the situation where the same contact is imported again from another file (or the contact exists twice in the same file!?)

Show diffs side-by-side

added added

removed removed

21
21
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
22
 */
23
23
 
24
 
package org.waxworlds.edam.importcontacts;
 
24
package org.waxworlds.importcontacts;
25
25
 
26
26
import android.app.AlertDialog;
27
27
import android.app.Dialog;
36
36
import android.widget.Button;
37
37
import android.widget.CheckBox;
38
38
import android.widget.CompoundButton;
 
39
import android.widget.LinearLayout;
39
40
import android.widget.ProgressBar;
40
41
import android.widget.TextView;
41
42
import android.widget.Toast;
46
47
        private final static int DIALOG_CONTINUEORABORT = 1;
47
48
        private final static int DIALOG_MERGEPROMPT = 2;
48
49
 
49
 
        public final static int MESSAGE_ALLDONE = 0;
50
 
        public final static int MESSAGE_ABORT = 1;
 
50
        public final static int MESSAGE_FINISHED_ALLDONE = 0;
 
51
        public final static int MESSAGE_FINISHED = 1;
 
52
        public final static int MESSAGE_FINISHED_GOBACK = 2;
51
53
        public final static int MESSAGE_ERROR = 3;
52
54
        public final static int MESSAGE_CONTINUEORABORT = 4;
53
55
        public final static int MESSAGE_SETPROGRESSMESSAGE = 5;
60
62
        public final static int MESSAGE_CONTACTMERGED = 12;
61
63
        public final static int MESSAGE_CONTACTSKIPPED = 13;
62
64
 
63
 
        public final static int ACTION_PROMPT = 0;
64
 
        public final static int ACTION_KEEP = 1;
65
 
        public final static int ACTION_MERGE_MERGE = 2;
66
 
        public final static int ACTION_OVERWRITE = 3;
67
 
 
68
 
        public final static int NEXT_BEGIN = 0;
69
 
        public final static int NEXT_CLOSE = 1;
70
 
 
71
65
        private boolean _startedProgress;
72
66
        private int _maxProgress;
73
67
        private int _tmpProgress;
75
69
        protected String _dialogMessage;
76
70
        private Dialog _mergePromptDialog;
77
71
        private boolean _mergePromptAlwaysSelected;
78
 
        private int _nextAction;
79
 
        private int _currentDialogId;
80
72
 
81
73
        private int _countOverwrites;
82
74
        private int _countCreates;
93
85
                public void handleMessage( Message msg ) {
94
86
                        switch( msg.what )
95
87
                        {
96
 
                        case MESSAGE_ALLDONE:
 
88
                        case MESSAGE_FINISHED_ALLDONE:
97
89
                                ( (TextView)findViewById( R.id.doit_alldone ) ).
98
 
                                        setVisibility( View.VISIBLE );
99
 
                                ( (Button)findViewById( R.id.back ) ).setEnabled( false );
100
 
                                updateNext( NEXT_CLOSE );
101
 
                                findViewById( R.id.doit_abort_disp ).setVisibility(
102
 
                                                View.GONE );
 
90
                                                setVisibility( View.VISIBLE );
 
91
                                // fall through
 
92
                        case MESSAGE_FINISHED:
 
93
                                ( (LinearLayout)findViewById( R.id.doit_closedisplay ) ).
 
94
                                                setVisibility( View.VISIBLE );
103
95
                                break;
104
 
                        case MESSAGE_ABORT:
105
 
                                manualAbort();
 
96
                        case MESSAGE_FINISHED_GOBACK:
 
97
                                ( (Button)findViewById( R.id.back ) ).setEnabled( true );
106
98
                                break;
107
99
                        case MESSAGE_ERROR:
108
 
                                _dialogMessage = (String)msg.obj;
 
100
                                Doit.this._dialogMessage = (String)msg.obj;
109
101
                                showDialog( DIALOG_ERROR );
110
102
                                break;
111
103
                        case MESSAGE_CONTINUEORABORT:
112
 
                                _dialogMessage = (String)msg.obj;
 
104
                                Doit.this._dialogMessage = (String)msg.obj;
113
105
                                showDialog( DIALOG_CONTINUEORABORT );
114
106
                                break;
115
107
                        case MESSAGE_SETPROGRESSMESSAGE:
118
110
                                break;
119
111
                        case MESSAGE_SETMAXPROGRESS:
120
112
                                if( _maxProgress > 0 ) {
121
 
                                        if( _tmpProgress == _maxProgress - 1 )
 
113
                                        if( _tmpProgress == _maxProgress )
122
114
                                                _tmpProgress = (Integer)msg.obj;
123
 
                                        if( _progress == _maxProgress - 1 )
 
115
                                        if( _progress == _maxProgress )
124
116
                                                _progress = (Integer)msg.obj;
125
117
                                }
126
118
                                _maxProgress = (Integer)msg.obj;
170
162
                // hide page 2
171
163
                ( findViewById( R.id.doit_page_2 ) ).setVisibility( View.GONE );
172
164
 
173
 
                // set up abort button
174
 
                Button begin = (Button)findViewById( R.id.abort );
 
165
                // set up begin button
 
166
                Button begin = (Button)findViewById( R.id.doit_begin );
175
167
                begin.setOnClickListener( new View.OnClickListener() {
176
168
                        public void onClick( View view ) {
177
 
                                manualAbort();
 
169
                                importContacts();
 
170
                        }
 
171
                } );
 
172
 
 
173
                // set up close button
 
174
                Button close = (Button)findViewById( R.id.doit_close );
 
175
                close.setOnClickListener( new View.OnClickListener() {
 
176
                        public void onClick( View view ) {
 
177
                                setResult( RESULT_CANCELED );
 
178
                                finish();
178
179
                        }
179
180
                } );
180
181
 
189
190
                _countMerges = 0;
190
191
                _countSkips = 0;
191
192
 
192
 
                updateNext( NEXT_BEGIN );
193
 
 
194
193
                updateProgress();
195
194
                updateStats();
196
195
        }
200
199
        {
201
200
                super.onPause();
202
201
 
203
 
                // close any open dialogs
204
 
                try {
205
 
                        dismissDialog( _currentDialogId );
206
 
                }
207
 
                catch( Exception e ) {
208
 
                }
209
 
 
210
202
                // saving the state of an import sounds complicated! Lets just abort!
211
 
                manualAbort( true );
 
203
                abortImport();
 
204
 
 
205
                // destroy some stuff
 
206
                _importer = null;
 
207
                _handler = null;
212
208
        }
213
209
 
214
210
        @Override
215
 
        protected Dialog onCreateDialog( int id )
 
211
        protected Dialog onCreateDialog(int id)
216
212
        {
217
213
                switch( id )
218
214
                {
219
215
                case DIALOG_ERROR:
220
216
                        return new AlertDialog.Builder( this )
221
 
                                .setIcon( R.drawable.alert_dialog_icon )
222
 
                                .setTitle( R.string.error_title )
223
 
                                .setMessage( "" )
224
 
                                .setPositiveButton( R.string.error_ok,
225
 
                                        new DialogInterface.OnClickListener() {
 
217
                                        .setIcon( R.drawable.alert_dialog_icon )
 
218
                                        .setTitle( R.string.error_title )
 
219
                                        .setMessage( "" )
 
220
                                        .setPositiveButton( R.string.error_ok,
 
221
                                                        new DialogInterface.OnClickListener() {
226
222
                                                public void onClick(DialogInterface dialog,
227
 
                                                        int whichButton)
228
 
                                                {
 
223
                                                                int whichButton) {
229
224
                                                        Doit.this._importer.wake();
230
225
                                                }
231
226
                                        } )
232
 
                                .setOnCancelListener( _dialogOnCancelListener )
233
 
                                .create();
 
227
                                        .setOnCancelListener( _dialogOnCancelListener )
 
228
                                        .create();
234
229
                case DIALOG_CONTINUEORABORT:
235
230
                        return new AlertDialog.Builder( this )
236
 
                                .setIcon( R.drawable.alert_dialog_icon )
237
 
                                .setTitle( R.string.error_title )
238
 
                                .setMessage( "" )
239
 
                                .setPositiveButton( R.string.error_continue,
240
 
                                        new DialogInterface.OnClickListener() {
241
 
                                                public void onClick(DialogInterface dialog,
242
 
                                                        int whichButton)
243
 
                                                {
244
 
                                                        Doit.this._importer.wake(
245
 
                                                                Importer.RESPONSE_POSITIVE );
246
 
                                                }
247
 
                                        } )
248
 
                                .setNegativeButton( R.string.error_abort,
249
 
                                        new DialogInterface.OnClickListener() {
250
 
                                                public void onClick(DialogInterface dialog,
251
 
                                                        int whichButton)
252
 
                                                {
253
 
                                                        Doit.this._importer.wake(
254
 
                                                                Importer.RESPONSE_NEGATIVE );
255
 
                                                }
256
 
                                        } )
257
 
                                .setOnCancelListener( _dialogOnCancelListener )
258
 
                                .create();
 
231
                                        .setIcon( R.drawable.alert_dialog_icon )
 
232
                                        .setTitle( R.string.error_title )
 
233
                                        .setMessage( "" )
 
234
                                        .setPositiveButton( R.string.error_continue,
 
235
                                                        new DialogInterface.OnClickListener() {
 
236
                                                public void onClick(DialogInterface dialog,
 
237
                                                                int whichButton) {
 
238
                                                        Doit.this._importer.wake(
 
239
                                                                        Importer.RESPONSE_POSITIVE );
 
240
                                                }
 
241
                                        } )
 
242
                                        .setNegativeButton( R.string.error_abort,
 
243
                                                        new DialogInterface.OnClickListener() {
 
244
                                                public void onClick(DialogInterface dialog,
 
245
                                                                int whichButton) {
 
246
                                                        Doit.this._importer.wake(
 
247
                                                                        Importer.RESPONSE_NEGATIVE );
 
248
                                                }
 
249
                                        } )
 
250
                                        .setOnCancelListener( _dialogOnCancelListener )
 
251
                                        .create();
259
252
                case DIALOG_MERGEPROMPT:
260
253
                        // custom layout in an AlertDialog
261
254
                        LayoutInflater factory = LayoutInflater.from( this );
262
255
                        final View dialogView = factory.inflate(
263
 
                                R.layout.mergeprompt, null );
 
256
                                        R.layout.mergeprompt, null );
264
257
                        ( (CheckBox)dialogView.findViewById( R.id.mergeprompt_always ) ).
265
 
                                setOnCheckedChangeListener(
266
 
                                        new CompoundButton.OnCheckedChangeListener() {
267
 
                                                public void onCheckedChanged( CompoundButton buttonView,
268
 
                                                        boolean isChecked )
269
 
                                                {
270
 
                                                        Doit.this._mergePromptAlwaysSelected = isChecked;
271
 
                                                }
272
 
                                        } );
 
258
                                        setOnCheckedChangeListener(
 
259
                                                        new CompoundButton.OnCheckedChangeListener() {
 
260
                                public void onCheckedChanged( CompoundButton buttonView,
 
261
                                                boolean isChecked ) {
 
262
                                        Doit.this._mergePromptAlwaysSelected = isChecked;
 
263
                                }
 
264
                        } );
273
265
                        ( (Button)dialogView.findViewById( R.id.merge_keep ) ).
274
 
                                setOnClickListener( _mergePromptButtonListener );
 
266
                                        setOnClickListener( _mergePromptButtonListener );
275
267
                        ( (Button)dialogView.findViewById( R.id.merge_overwrite ) ).
276
 
                                setOnClickListener( _mergePromptButtonListener );
 
268
                                        setOnClickListener( _mergePromptButtonListener );
277
269
                        ( (Button)dialogView.findViewById( R.id.merge_merge ) ).
278
 
                                setOnClickListener( _mergePromptButtonListener );
279
 
                        ( (Button)dialogView.findViewById( R.id.abort ) ).
280
 
                                setOnClickListener( _mergePromptButtonListener );
 
270
                                        setOnClickListener( _mergePromptButtonListener );
281
271
                        _mergePromptAlwaysSelected = false;
282
272
                        return new AlertDialog.Builder( this )
283
 
                                .setIcon( R.drawable.alert_dialog_icon )
284
 
                                .setTitle( R.string.mergeprompt_title )
285
 
                                .setView( dialogView )
286
 
                                .setOnCancelListener( _dialogOnCancelListener )
287
 
                                .create();
 
273
                                        .setIcon( R.drawable.alert_dialog_icon )
 
274
                                        .setTitle( R.string.mergeprompt_title )
 
275
                                        .setView( dialogView )
 
276
                                        .setOnCancelListener( _dialogOnCancelListener )
 
277
                                        .create();
288
278
                }
289
279
                return null;
290
280
        }
291
281
 
292
 
        private OnClickListener _mergePromptButtonListener = new OnClickListener() {
293
 
                public void onClick( View view )
294
 
                {
295
 
                        // handle abort
296
 
                        if( view.getId() == R.id.abort )
297
 
                                manualAbort();
298
 
 
299
 
                        // else, response
300
 
                        else {
301
 
                                int responseExtra = _mergePromptAlwaysSelected?
302
 
                                                Importer.RESPONSEEXTRA_ALWAYS : Importer.RESPONSEEXTRA_NONE;
303
 
                                Doit.this._importer.wake( convertIdToAction( view.getId() ),
304
 
                                                responseExtra );
305
 
                        }
306
 
 
307
 
                        // close dialog and free (don't keep a reference)
 
282
    private OnClickListener _mergePromptButtonListener = new OnClickListener() {
 
283
                public void onClick( View view ) {
 
284
                        int responseExtra = _mergePromptAlwaysSelected?
 
285
                                        Importer.RESPONSEEXTRA_ALWAYS : Importer.RESPONSEEXTRA_NONE;
308
286
                        Doit.this._mergePromptDialog.dismiss();
309
 
                        Doit.this._mergePromptDialog = null;
 
287
                        Doit.this._mergePromptDialog = null;    // dont keep a reference!
 
288
                        Doit.this._importer.wake( view.getId(), responseExtra );
310
289
                }
311
290
        };
312
291
 
313
 
        @Override
314
 
        protected void onNext()
315
 
        {
316
 
                Button next = (Button)findViewById( R.id.next );
317
 
                next.setEnabled( false );
318
 
 
319
 
                switch( _nextAction )
320
 
                {
321
 
                case NEXT_BEGIN:
322
 
                        importContacts();
323
 
                        break;
324
 
                case NEXT_CLOSE:
325
 
                        setResult( RESULT_OK );
326
 
                        finish();
327
 
                        break;
328
 
                }
329
 
        }
330
 
 
331
 
        private void manualAbort()
332
 
        {
333
 
                manualAbort( false );
334
 
        }
335
 
 
336
 
        private void manualAbort( boolean showToasterPopup )
337
 
        {
338
 
                abortImport( showToasterPopup );
339
 
 
340
 
                updateNext( NEXT_CLOSE );
341
 
                ( (Button)findViewById( R.id.back ) ).setEnabled( true );
342
 
                findViewById( R.id.doit_abort_disp ).setVisibility( View.GONE );
343
 
                ( (TextView)findViewById( R.id.doit_aborted ) ).
344
 
                        setVisibility( View.VISIBLE );
345
 
                ( (TextView)findViewById( R.id.doit_alldone ) ).
346
 
                        setVisibility( View.GONE );
347
 
        }
348
 
 
349
 
        private void updateNext( int nextAction )
350
 
        {
351
 
                Button next = (Button)findViewById( R.id.next );
352
 
                switch( nextAction ) {
353
 
                case NEXT_BEGIN:        next.setText( R.string.doit_begin ); break;
354
 
                case NEXT_CLOSE:        next.setText( R.string.doit_close ); break;
355
 
                }
356
 
                next.setEnabled( true );
357
 
                _nextAction = nextAction;
358
 
        }
359
 
 
360
 
        public static int convertIdToAction( int id ) {
361
 
                switch( id ) {
362
 
                case R.id.merge_keep:           return ACTION_KEEP;
363
 
                case R.id.merge_merge:          return ACTION_MERGE_MERGE;
364
 
                case R.id.merge_overwrite:      return ACTION_OVERWRITE;
365
 
                default: return ACTION_PROMPT;
366
 
                }
367
 
        }
368
 
 
369
 
        public static int convertActionToId( int action ) {
370
 
                switch( action ) {
371
 
                case ACTION_KEEP:               return R.id.merge_keep;
372
 
                case ACTION_MERGE_MERGE:return R.id.merge_merge;
373
 
                case ACTION_OVERWRITE:  return R.id.merge_overwrite;
374
 
                default: return R.id.merge_prompt;
375
 
                }
376
 
        }
377
 
 
378
292
        private DialogInterface.OnCancelListener _dialogOnCancelListener =
379
293
                        new DialogInterface.OnCancelListener() {
380
294
                public void onCancel( DialogInterface dialog ) {
389
303
        {
390
304
                // if we're cancelling, abort any import
391
305
                if( resultCode == RESULT_CANCELED )
392
 
                        abortImport( true );
 
306
                        abortImport();
393
307
        }
394
308
 
395
309
        @Override
396
310
        protected void onPrepareDialog(int id, Dialog dialog)
397
311
        {
398
 
                _currentDialogId = id;
399
 
 
400
312
                switch( id )
401
313
                {
402
314
                case DIALOG_ERROR:      // fall through
464
376
                                "" + _countSkips );
465
377
        }
466
378
 
467
 
        private void abortImport( boolean showToasterPopup )
 
379
        private void abortImport()
468
380
        {
469
381
                if( _importer != null )
470
382
                {
481
393
                                }
482
394
 
483
395
                                // notify the user
484
 
                                if( showToasterPopup )
485
 
                                        Toast.makeText( this, R.string.doit_importaborted,
486
 
                                                        Toast.LENGTH_LONG ).show();
 
396
                        Toast.makeText( this, R.string.doit_importaborted,
 
397
                                        Toast.LENGTH_LONG ).show();
487
398
                        }
488
399
                }
489
 
 
490
 
                // destroy some stuff
491
 
                _importer = null;
492
 
                _handler = null;
493
400
        }
494
401
}