1bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/*
2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Copyright (C) 2011 The Android Open Source Project
3bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
4bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License");
5bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * you may not use this file except in compliance with the License.
6bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * You may obtain a copy of the License at
7bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
8bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *      http://www.apache.org/licenses/LICENSE-2.0
9bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
10bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Unless required by applicable law or agreed to in writing, software
11bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS,
12bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * See the License for the specific language governing permissions and
14bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * limitations under the License.
15bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */
16bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
17bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpackage com.android.email.activity;
18bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
19bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.Activity;
20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.nfc.NdefMessage;
21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.nfc.NdefRecord;
22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.nfc.NfcAdapter;
23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.nfc.NfcEvent;
24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.text.TextUtils;
25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.Account;
27bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.UnsupportedEncodingException;
29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.net.URLEncoder;
30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/**
32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * This class implements sharing the e-mail address of the
33bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * active account to another device using NFC. NFC sharing is only
34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * enabled when the activity is in the foreground and resumed.
35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * When an NFC link is established, {@link #createMessage}
36bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * will be called to create the data to be sent over the link,
37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  * which is a vCard in this case.
38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook  */
39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    final UIControllerBase mUiController;
41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    final Activity mActivity;
42bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    String mCurrentEmail;
44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static NfcHandler register(UIControllerBase controller, Activity activity) {
46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (adapter == null) {
48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;  // NFC not available on this device
49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        NfcHandler nfcHandler = new NfcHandler(controller, activity);
51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        adapter.setNdefPushMessageCallback(nfcHandler, activity);
52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return nfcHandler;
53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public NfcHandler(UIControllerBase controller, Activity activity) {
56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        mUiController = controller;
57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        mActivity = activity;
58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public void onAccountChanged() {
61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (mUiController.isActualAccountSelected()) {
62bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final long accountId = mUiController.getActualAccountId();
63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final Account account = Account.restoreAccountWithId(mActivity, accountId);
64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (account == null) return;
65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mCurrentEmail = account.mEmailAddress;
66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mCurrentEmail = null;
68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
71bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static NdefMessage buildMailtoNdef(String address) {
72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (TextUtils.isEmpty(address)) {
73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;
74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        byte[] accountBytes;
76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            accountBytes = URLEncoder.encode(address, "UTF-8")
78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    .getBytes("UTF-8");
79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } catch (UnsupportedEncodingException e) {
80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;
81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        byte[] recordBytes = new byte[accountBytes.length + 1];
83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        recordBytes[0] = 0x06; // NDEF mailto: prefix
84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        System.arraycopy(accountBytes, 0, recordBytes, 1, accountBytes.length);
85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        NdefRecord mailto = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                new byte[0], recordBytes);
87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new NdefMessage(new NdefRecord[] { mailto });
88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public NdefMessage createNdefMessage(NfcEvent event) {
92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (mCurrentEmail != null) {
93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return buildMailtoNdef(mCurrentEmail);
94bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
95bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;
96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook}
99