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