aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/network/AndroidBeam.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/network/AndroidBeam.java')
-rw-r--r--main/src/cgeo/geocaching/network/AndroidBeam.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/network/AndroidBeam.java b/main/src/cgeo/geocaching/network/AndroidBeam.java
new file mode 100644
index 0000000..68b8f94
--- /dev/null
+++ b/main/src/cgeo/geocaching/network/AndroidBeam.java
@@ -0,0 +1,93 @@
+package cgeo.geocaching.network;
+
+import cgeo.geocaching.CgeoApplication;
+
+import org.apache.commons.io.Charsets;
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jdt.annotation.Nullable;
+
+import android.annotation.TargetApi;
+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.os.Build;
+
+/**
+ * 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
+ public String getAndroidBeamUri();
+ }
+
+ public static void enable(final Activity activity, final ActivitySharingInterface sharingInterface) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ initializeICSAndroidBeam(activity, createMessageCallback(sharingInterface));
+ }
+ }
+
+ public static void disable(final Activity activity) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ initializeICSAndroidBeam(activity, null);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+ private static void initializeICSAndroidBeam(final Activity activity, final CreateNdefMessageCallback messageCallback) {
+ final NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
+ if (nfcAdapter == null) {
+ return;
+ }
+ nfcAdapter.setNdefPushMessageCallback(messageCallback, activity);
+
+ }
+
+ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+ 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);
+ }
+ };
+ }
+
+}