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