11167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton/*
21167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * Copyright (C) 2011 The Android Open Source Project
31167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton *
41167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
51167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * you may not use this file except in compliance with the License.
61167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * You may obtain a copy of the License at
71167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton *
81167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
91167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton *
101167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * Unless required by applicable law or agreed to in writing, software
111167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
121167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * See the License for the specific language governing permissions and
141167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton * limitations under the License
151167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton */
161167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
171167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonpackage com.android.contacts.vcard;
181167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
191167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.contacts.R;
201167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.contacts.model.AccountTypeManager;
211167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.contacts.model.AccountWithDataSet;
221167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardEntry;
231167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardEntryCounter;
241167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardParser;
251167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardParser_V21;
261167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardParser_V30;
271167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.VCardSourceDetector;
281167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.exception.VCardException;
291167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.exception.VCardNestedException;
301167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport com.android.vcard.exception.VCardVersionException;
311167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
321167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.app.Activity;
331167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.content.ComponentName;
341167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.content.Context;
351167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.content.Intent;
361167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.content.ServiceConnection;
371167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.net.Uri;
381167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.nfc.NdefMessage;
391167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.nfc.NdefRecord;
401167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.nfc.NfcAdapter;
411167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.os.AsyncTask;
421167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.os.Bundle;
431167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.os.IBinder;
441167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.provider.ContactsContract.RawContacts;
451167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport android.util.Log;
461167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
471167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport java.io.ByteArrayInputStream;
481167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport java.io.IOException;
491167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport java.nio.charset.Charset;
501167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport java.util.ArrayList;
511167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonimport java.util.List;
521167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
531167da421b68952a590b050c32def7e0eff7cca6Jeff Hamiltonpublic class NfcImportVCardActivity extends Activity implements ServiceConnection,
541167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        VCardImportExportListener {
551167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    private static final String TAG = "NfcImportVCardActivity";
561167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
571167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    private static final int SELECT_ACCOUNT = 1;
581167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
591167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    private NdefRecord mRecord;
601167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    private AccountWithDataSet mAccount;
611167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
621167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    /* package */ class ImportTask extends AsyncTask<VCardService, Void, ImportRequest> {
631167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        @Override
641167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        public ImportRequest doInBackground(VCardService... services) {
651167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            ImportRequest request = createImportRequest();
661167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            if (request == null) {
671167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                return null;
681167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            }
691167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
701167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            ArrayList<ImportRequest> requests = new ArrayList<ImportRequest>();
711167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            requests.add(request);
721167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            services[0].handleImportRequest(requests, NfcImportVCardActivity.this);
731167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return request;
741167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
751167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
761167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        @Override
771167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        public void onCancelled() {
781167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            unbindService(NfcImportVCardActivity.this);
791167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
801167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
811167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        @Override
821167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        public void onPostExecute(ImportRequest request) {
831167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            unbindService(NfcImportVCardActivity.this);
841167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
851167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
861167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
871167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    /* package */ ImportRequest createImportRequest() {
881167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        VCardParser parser;
891167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        VCardEntryCounter counter = null;
901167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        VCardSourceDetector detector = null;
911167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        int vcardVersion = ImportVCardActivity.VCARD_VERSION_V21;
921167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        try {
931167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            ByteArrayInputStream is = new ByteArrayInputStream(mRecord.getPayload());
941167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            is.mark(0);
951167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            parser = new VCardParser_V21();
961167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            try {
971167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                counter = new VCardEntryCounter();
981167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                detector = new VCardSourceDetector();
991167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                parser.addInterpreter(counter);
1001167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                parser.addInterpreter(detector);
1011167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                parser.parse(is);
1021167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            } catch (VCardVersionException e1) {
1031167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                is.reset();
1041167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                vcardVersion = ImportVCardActivity.VCARD_VERSION_V30;
1051167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                parser = new VCardParser_V30();
1061167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                try {
1071167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    counter = new VCardEntryCounter();
1081167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    detector = new VCardSourceDetector();
1091167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    parser.addInterpreter(counter);
1101167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    parser.addInterpreter(detector);
1111167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    parser.parse(is);
1121167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                } catch (VCardVersionException e2) {
1131167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    return null;
1141167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                }
1151167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            } finally {
1161167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                try {
1171167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                    if (is != null) is.close();
1181167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                } catch (IOException e) {
1191167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                }
1201167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            }
1211167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        } catch (IOException e) {
1221167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.e(TAG, "Failed reading vcard data", e);
1231167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return null;
1241167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        } catch (VCardNestedException e) {
1251167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.w(TAG, "Nested Exception is found (it may be false-positive).");
1261167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            // Go through without throwing the Exception, as we may be able to detect the
1271167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            // version before it
1281167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        } catch (VCardException e) {
1291167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.e(TAG, "Error parsing vcard", e);
1301167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return null;
1311167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
1321167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1331167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        return new ImportRequest(mAccount, mRecord.getPayload(), null,
1341167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                getString(R.string.nfc_vcard_file_name), detector.getEstimatedType(),
1351167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                detector.getEstimatedCharset(), vcardVersion, counter.getCount());
1361167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
1371167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1381167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
1391167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onServiceConnected(ComponentName name, IBinder binder) {
1401167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        VCardService service = ((VCardService.MyBinder) binder).getService();
1411167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        new ImportTask().execute(service);
1421167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
1431167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1441167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
1451167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onServiceDisconnected(ComponentName name) {
1461167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // Do nothing
1471167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
1481167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1491167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
1501167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    protected void onCreate(Bundle bundle) {
1511167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        super.onCreate(bundle);
1521167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1531167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        Intent intent = getIntent();
1541167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (!NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
1551167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.w(TAG, "Unknowon intent " + intent);
1561167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            finish();
1571167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
1581167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1591167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        NdefMessage msg = (NdefMessage) intent.getParcelableArrayExtra(
1601167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
1611167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        NdefRecord records[] = msg.getRecords();
1621167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (records == null || records.length == 0) {
1631167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.w(TAG, "No records " + intent);
1641167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            finish();
1651167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
1661167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1671167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        NdefRecord record = records[0];
1681167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        String type = new String(record.getType(), Charset.forName("UTF8"));
1691167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (record.getTnf() != NdefRecord.TNF_MIME_MEDIA ||
1701167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                (!"text/x-vcard".equalsIgnoreCase(type) && !"text/vcard".equals(type))) {
1711167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.w(TAG, "Not a vcard");
1721167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            //setStatus(getString(R.string.fail_reason_not_supported));
1731167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return;
1741167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
1751167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        mRecord = record;
1761167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1771167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
1781167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        final List<AccountWithDataSet> accountList = accountTypes.getAccounts(true);
1791167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (accountList.size() == 0) {
1801167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            mAccount = null;
1811167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        } else if (accountList.size() == 1) {
1821167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            mAccount = accountList.get(0);
1831167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        } else {
1841167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            startActivityForResult(new Intent(this, SelectAccountActivity.class), SELECT_ACCOUNT);
1851167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return;
1861167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
1871167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1881167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        startImport();
1891167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
1901167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
1911167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
1921167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
1931167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (requestCode == SELECT_ACCOUNT) {
1941167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            if (resultCode == RESULT_OK) {
1951167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                mAccount = new AccountWithDataSet(
1961167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                        intent.getStringExtra(SelectAccountActivity.ACCOUNT_NAME),
1971167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                        intent.getStringExtra(SelectAccountActivity.ACCOUNT_TYPE),
1981167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                        intent.getStringExtra(SelectAccountActivity.DATA_SET));
1991167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                startImport();
2001167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            } else {
2011167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton                finish();
2021167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            }
2031167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
2041167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2051167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2061167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    private void startImport() {
2071167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // We don't want the service finishes itself just after this connection.
2081167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        Intent intent = new Intent(this, VCardService.class);
2091167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        startService(intent);
2101167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        bindService(intent, this, Context.BIND_AUTO_CREATE);
2111167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2121167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2131167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2141167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onImportProcessed(ImportRequest request, int jobId, int sequence) {
2151167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2161167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2171167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2181167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2191167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onImportParsed(ImportRequest request, int jobId, VCardEntry entry, int currentCount,
2201167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            int totalCount) {
2211167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2221167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2231167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2241167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2251167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onImportFinished(ImportRequest request, int jobId, Uri uri) {
2261167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (isFinishing()) {
2271167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.i(TAG, "Late import -- ignoring");
2281167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return;
2291167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
2301167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2311167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (uri != null) {
2321167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Uri contactUri = RawContacts.getContactLookupUri(getContentResolver(), uri);
2331167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
2341167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            startActivity(intent);
2351167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            finish();
2361167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
2371167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2381167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2391167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2401167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onImportFailed(ImportRequest request) {
2411167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        if (isFinishing()) {
2421167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            Log.i(TAG, "Late import failure -- ignoring");
2431167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton            return;
2441167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        }
2451167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // TODO: report failure
2461167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2471167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2481167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2491167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onImportCanceled(ImportRequest request, int jobId) {
2501167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2511167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2521167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2531167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2541167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onExportProcessed(ExportRequest request, int jobId) {
2551167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2561167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2571167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2581167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2591167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onExportFailed(ExportRequest request) {
2601167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2611167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2621167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2631167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2641167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onCancelRequest(CancelRequest request, int type) {
2651167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2661167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2671167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton
2681167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    @Override
2691167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    public void onComplete() {
2701167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton        // do nothing
2711167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton    }
2721167da421b68952a590b050c32def7e0eff7cca6Jeff Hamilton}
273