package cgeo.geocaching.network;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.utils.Charsets;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.support.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
/**
* utility class managing all NFC related tasks
*/
public class AndroidBeam {
private AndroidBeam() {
// utility class
}
/**
* returns the URI transmitted via Android Beam, or the URI contained in the data of the intent
*/
@Nullable
public static Uri getUri(final Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
final NdefMessage msg = (NdefMessage) intent.getExtras().getParcelableArray(NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
return Uri.parse("http://" + new String(msg.getRecords()[0].getPayload(), Charsets.UTF_8));
}
return intent.getData();
}
// Do not support older devices than Android 4.0
// Although there even are 2.3 devices (Nexus S)
// these are so few that we don't want to deal with the older (non Android Beam) API
public interface ActivitySharingInterface {
/** Return an URL that represent the current activity for sharing or null for no sharing. */
@Nullable
String getAndroidBeamUri();
}
public static void enable(final Activity activity, final ActivitySharingInterface sharingInterface) {
initializeICSAndroidBeam(activity, createMessageCallback(sharingInterface));
}
public static void disable(final Activity activity) {
initializeICSAndroidBeam(activity, null);
}
private static void initializeICSAndroidBeam(final Activity activity, final CreateNdefMessageCallback messageCallback) {
final NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
if (nfcAdapter == null) {
return;
}
nfcAdapter.setNdefPushMessageCallback(messageCallback, activity);
}
private static CreateNdefMessageCallback createMessageCallback(final ActivitySharingInterface sharingInterface) {
return new NfcAdapter.CreateNdefMessageCallback() {
@Override
public NdefMessage createNdefMessage(final NfcEvent event) {
String uri = sharingInterface.getAndroidBeamUri();
if (uri == null) {
return null;
}
// normalize our modified URLs for beaming
uri = StringUtils.replace(uri, "geocaching.com//", "geocaching.com/");
final NdefRecord[] records = {
NdefRecord.createUri(uri),
NdefRecord.createApplicationRecord(CgeoApplication.getInstance().getPackageName())
};
return new NdefMessage(records);
}
};
}
}