blob: 775ec83d1af649d1841db43ffc3f99999db36ca0 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email.activity;
import android.app.Activity;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import android.text.TextUtils;
import com.android.emailcommon.provider.Account;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* This class implements sharing the e-mail address of the
* active account to another device using NFC. NFC sharing is only
* enabled when the activity is in the foreground and resumed.
* When an NFC link is established, {@link #createMessage}
* will be called to create the data to be sent over the link,
* which is a vCard in this case.
*/
public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
final UIControllerBase mUiController;
final Activity mActivity;
String mCurrentEmail;
public static NfcHandler register(UIControllerBase controller, Activity activity) {
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
if (adapter == null) {
return null; // NFC not available on this device
}
NfcHandler nfcHandler = new NfcHandler(controller, activity);
adapter.setNdefPushMessageCallback(nfcHandler, activity);
return nfcHandler;
}
public NfcHandler(UIControllerBase controller, Activity activity) {
mUiController = controller;
mActivity = activity;
}
public void onAccountChanged() {
if (mUiController.isActualAccountSelected()) {
final long accountId = mUiController.getActualAccountId();
final Account account = Account.restoreAccountWithId(mActivity, accountId);
if (account == null) return;
mCurrentEmail = account.mEmailAddress;
} else {
mCurrentEmail = null;
}
}
private static NdefMessage buildMailtoNdef(String address) {
if (TextUtils.isEmpty(address)) {
return null;
}
byte[] accountBytes;
try {
accountBytes = URLEncoder.encode(address, "UTF-8")
.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
return null;
}
byte[] recordBytes = new byte[accountBytes.length + 1];
recordBytes[0] = 0x06; // NDEF mailto: prefix
System.arraycopy(accountBytes, 0, recordBytes, 1, accountBytes.length);
NdefRecord mailto = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
new byte[0], recordBytes);
return new NdefMessage(new NdefRecord[] { mailto });
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
if (mCurrentEmail != null) {
return buildMailtoNdef(mCurrentEmail);
} else {
return null;
}
}
}