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