1d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng/* 2d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * Copyright (C) 2011 The Android Open Source Project 3d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * 4d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * you may not use this file except in compliance with the License. 6d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * You may obtain a copy of the License at 7d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * 8d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 9d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * 10d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * Unless required by applicable law or agreed to in writing, software 11d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * See the License for the specific language governing permissions and 14d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng * limitations under the License 15d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng */ 16d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 1769c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.vcard; 18d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 19c2e912c41b4f0fc4ca4b948b6d0aaa84eeb8d1d9Brian Attwellimport android.app.Activity; 20f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jangimport android.app.Notification; 21f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jangimport android.app.NotificationManager; 22d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.content.ComponentName; 23d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.content.Context; 24d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.content.Intent; 25d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.content.ServiceConnection; 26d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.net.Uri; 27d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.nfc.NdefMessage; 28d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.nfc.NdefRecord; 29d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.nfc.NfcAdapter; 30d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.os.AsyncTask; 31d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.os.Bundle; 32f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jangimport android.os.Handler; 33d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.os.IBinder; 34d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.provider.ContactsContract.RawContacts; 35d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport android.util.Log; 36f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jangimport android.widget.Toast; 37d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 383f6a2444e0134b7380cdb2e13abf4bf1163336d0Arthur Wangimport com.android.contacts.R; 390a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.activities.RequestPermissionsActivity; 4069c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.AccountTypeManager; 4169c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet; 4269c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.util.ImplicitIntentsUtil; 433a0b483ff715959b88d7ef20877a7c89d211fde2Walter Jangimport com.android.contactsbind.FeedbackHelper; 44d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardEntry; 45d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardEntryCounter; 46d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardParser; 47d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardParser_V21; 48d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardParser_V30; 49d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.VCardSourceDetector; 50d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.exception.VCardException; 51d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.exception.VCardNestedException; 52d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport com.android.vcard.exception.VCardVersionException; 53d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 54d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport java.io.ByteArrayInputStream; 55d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport java.io.IOException; 56d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport java.util.ArrayList; 57d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Chengimport java.util.List; 58d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 59c2e912c41b4f0fc4ca4b948b6d0aaa84eeb8d1d9Brian Attwellpublic class NfcImportVCardActivity extends Activity implements ServiceConnection, 60d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng VCardImportExportListener { 61d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng private static final String TAG = "NfcImportVCardActivity"; 62d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 63d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng private static final int SELECT_ACCOUNT = 1; 64d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 65d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng private NdefRecord mRecord; 66d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng private AccountWithDataSet mAccount; 67f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang private Handler mHandler = new Handler(); 68f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang 69f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang /** 70f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang * Notification id used when error happened before sending an import request to VCardServer. 71f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang */ 72f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang private static final int FAILURE_NOTIFICATION_ID = 1; 73d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 74d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng /* package */ class ImportTask extends AsyncTask<VCardService, Void, ImportRequest> { 75d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 76d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public ImportRequest doInBackground(VCardService... services) { 77d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng ImportRequest request = createImportRequest(); 78d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (request == null) { 79d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return null; 80d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 81d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 82d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng ArrayList<ImportRequest> requests = new ArrayList<ImportRequest>(); 83d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng requests.add(request); 84d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng services[0].handleImportRequest(requests, NfcImportVCardActivity.this); 85d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return request; 86d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 87d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 88d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 89d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onCancelled() { 90d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng unbindService(NfcImportVCardActivity.this); 91d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 92d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 93d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 94d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onPostExecute(ImportRequest request) { 95f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang if (request == null) { 96f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang // Finish the activity in case of error so it doesn't stay in view. 97f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang finish(); 98f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang } 99d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng unbindService(NfcImportVCardActivity.this); 100d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 101d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 102d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 103d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng /* package */ ImportRequest createImportRequest() { 104d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng VCardParser parser; 105d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng VCardEntryCounter counter = null; 106d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng VCardSourceDetector detector = null; 107d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng int vcardVersion = ImportVCardActivity.VCARD_VERSION_V21; 108d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng try { 109d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng ByteArrayInputStream is = new ByteArrayInputStream(mRecord.getPayload()); 110d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng is.mark(0); 111d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser = new VCardParser_V21(); 112d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng try { 113d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng counter = new VCardEntryCounter(); 114d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng detector = new VCardSourceDetector(); 115d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.addInterpreter(counter); 116d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.addInterpreter(detector); 117d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.parse(is); 118d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (VCardVersionException e1) { 119d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng is.reset(); 120d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng vcardVersion = ImportVCardActivity.VCARD_VERSION_V30; 121d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser = new VCardParser_V30(); 122d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng try { 123d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng counter = new VCardEntryCounter(); 124d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng detector = new VCardSourceDetector(); 125d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.addInterpreter(counter); 126d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.addInterpreter(detector); 127d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng parser.parse(is); 128d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (VCardVersionException e2) { 1293a0b483ff715959b88d7ef20877a7c89d211fde2Walter Jang FeedbackHelper.sendFeedback(this, TAG, "vcard with unsupported version", e2); 130f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang showFailureNotification(R.string.fail_reason_not_supported); 131d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return null; 132d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 133d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } finally { 134d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng try { 135d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (is != null) is.close(); 136d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (IOException e) { 137d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 138d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 139d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (IOException e) { 1403a0b483ff715959b88d7ef20877a7c89d211fde2Walter Jang FeedbackHelper.sendFeedback(this, TAG, "Failed to read vcard data", e); 141f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang showFailureNotification(R.string.fail_reason_io_error); 142d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return null; 143d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (VCardNestedException e) { 144d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Log.w(TAG, "Nested Exception is found (it may be false-positive)."); 145d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // Go through without throwing the Exception, as we may be able to detect the 146d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // version before it 147d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } catch (VCardException e) { 1483a0b483ff715959b88d7ef20877a7c89d211fde2Walter Jang FeedbackHelper.sendFeedback(this, TAG, "Failed to parse vcard", e); 149f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang showFailureNotification(R.string.fail_reason_not_supported); 150d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return null; 151d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 152d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 153d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return new ImportRequest(mAccount, mRecord.getPayload(), null, 154d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng getString(R.string.nfc_vcard_file_name), detector.getEstimatedType(), 155d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng detector.getEstimatedCharset(), vcardVersion, counter.getCount()); 156d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 157d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 158d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 159d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onServiceConnected(ComponentName name, IBinder binder) { 160d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng VCardService service = ((VCardService.MyBinder) binder).getService(); 161d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng new ImportTask().execute(service); 162d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 163d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 164d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 165d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onServiceDisconnected(ComponentName name) { 166d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // Do nothing 167d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 168d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 169d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 170d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng protected void onCreate(Bundle bundle) { 171d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng super.onCreate(bundle); 172d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 1731e899dc127a212bfd2198fe7adba5c33eb4cd751Gary Mai if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) { 1743c7754668630f0b47962200a90326a7886b23c99Brian Attwell return; 1753c7754668630f0b47962200a90326a7886b23c99Brian Attwell } 1763c7754668630f0b47962200a90326a7886b23c99Brian Attwell 177d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Intent intent = getIntent(); 178d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (!NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { 179d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Log.w(TAG, "Unknowon intent " + intent); 180d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng finish(); 181d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return; 182d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 183d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 184d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng String type = intent.getType(); 185d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (type == null || 186d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng (!"text/x-vcard".equals(type) && !"text/vcard".equals(type))) { 187d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Log.w(TAG, "Not a vcard"); 188d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng //setStatus(getString(R.string.fail_reason_not_supported)); 189d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng finish(); 190d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return; 191d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 192d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng NdefMessage msg = (NdefMessage) intent.getParcelableArrayExtra( 193d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng NfcAdapter.EXTRA_NDEF_MESSAGES)[0]; 194d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng mRecord = msg.getRecords()[0]; 195d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 196d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this); 197107cd7a225eccad56dfe12ca6d32908e651b27acMarcus Hagerott final List<AccountWithDataSet> accountList = accountTypes.blockForWritableAccounts(); 198d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (accountList.size() == 0) { 199d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng mAccount = null; 200d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } else if (accountList.size() == 1) { 201d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng mAccount = accountList.get(0); 202d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } else { 203d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng startActivityForResult(new Intent(this, SelectAccountActivity.class), SELECT_ACCOUNT); 204d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return; 205d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 206d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 207d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng startImport(); 208d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 209d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 210d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 211d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onActivityResult(int requestCode, int resultCode, Intent intent) { 212d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (requestCode == SELECT_ACCOUNT) { 213d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (resultCode == RESULT_OK) { 214d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng mAccount = new AccountWithDataSet( 215d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng intent.getStringExtra(SelectAccountActivity.ACCOUNT_NAME), 216d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng intent.getStringExtra(SelectAccountActivity.ACCOUNT_TYPE), 217d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng intent.getStringExtra(SelectAccountActivity.DATA_SET)); 218d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng startImport(); 219d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } else { 220d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng finish(); 221d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 222d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 223d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 224d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 225d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng private void startImport() { 226d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // We don't want the service finishes itself just after this connection. 227d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Intent intent = new Intent(this, VCardService.class); 228d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng startService(intent); 229d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng bindService(intent, this, Context.BIND_AUTO_CREATE); 230d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 231d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 232d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 2336e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang public Notification onImportProcessed(ImportRequest request, int jobId, int sequence) { 2346e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang return null; 235d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 236d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 237d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 2386e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang public Notification onImportParsed(ImportRequest request, int jobId, VCardEntry entry, 2396e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang int currentCount, int totalCount) { 2406e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang return null; 241d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 242d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 243d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 244d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onImportFinished(ImportRequest request, int jobId, Uri uri) { 245d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (isFinishing()) { 246d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Log.i(TAG, "Late import -- ignoring"); 247d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return; 248d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 249d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 250d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (uri != null) { 251d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Uri contactUri = RawContacts.getContactLookupUri(getContentResolver(), uri); 252d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); 25303b6424f5ded0d7c26e728977f7b5327460cec62Brian Attwell ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent); 254d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng finish(); 255d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 256d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 257d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 258d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 259d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onImportFailed(ImportRequest request) { 260d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng if (isFinishing()) { 261d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng Log.i(TAG, "Late import failure -- ignoring"); 262d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng return; 263d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 264f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang showFailureNotification(R.string.vcard_import_request_rejected_message); 265f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang finish(); 266d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 267d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 268d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 269d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onImportCanceled(ImportRequest request, int jobId) { 270d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // do nothing 271d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 272d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 273d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 2746e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang public Notification onExportProcessed(ExportRequest request, int jobId) { 2756e58fdfb08d3e612a49b8cbdc15c834726fec845Wenyi Wang return null; 276d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 277d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 278d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 279d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onExportFailed(ExportRequest request) { 280d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // do nothing 281d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 282d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 283d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng @Override 284d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng public void onCancelRequest(CancelRequest request, int type) { 285d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng // do nothing 286d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng } 287d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng 288f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang /* package */ void showFailureNotification(int reasonId) { 289f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang final NotificationManager notificationManager = 290f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 291f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang final Notification notification = 292f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang NotificationImportExportListener.constructImportFailureNotification( 293f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang this, 294f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang getString(reasonId)); 295f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang notificationManager.notify(NotificationImportExportListener.FAILURE_NOTIFICATION_TAG, 296f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang FAILURE_NOTIFICATION_ID, notification); 297f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang mHandler.post(new Runnable() { 298f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang @Override 299f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang public void run() { 300f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang Toast.makeText(NfcImportVCardActivity.this, 301f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang getString(R.string.vcard_import_failed), Toast.LENGTH_LONG).show(); 302f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang } 303f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang }); 304f7d733a0319956d05735d13a2b7ee46fb0f0d994Walter Jang } 305d80c4348dd6db1046fdade375a8d8c616d93e7acChiao Cheng} 306