aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2015-02-21 12:54:36 +0100
committerBananeweizen <bananeweizen@gmx.de>2015-02-21 12:54:36 +0100
commit083593725b909bb011f291c30e46e605e6908d2a (patch)
tree43120e31e965ad26b5dd1c59d8c218aef168d855 /main/src/cgeo
parent0f28169faf68b19b1218bf3c6e32c52b42017909 (diff)
downloadcgeo-083593725b909bb011f291c30e46e605e6908d2a.zip
cgeo-083593725b909bb011f291c30e46e605e6908d2a.tar.gz
cgeo-083593725b909bb011f291c30e46e605e6908d2a.tar.bz2
disable Android Beam when there is nothing to beam
Diffstat (limited to 'main/src/cgeo')
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java16
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java19
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActivity.java47
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractListActivity.java2
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java2
-rw-r--r--main/src/cgeo/geocaching/network/AndroidBeam.java90
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java2
7 files changed, 108 insertions, 70 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 14b6b81..d6ec50e 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -5,7 +5,6 @@ import butterknife.InjectView;
import cgeo.calendar.CalendarAddon;
import cgeo.geocaching.activity.AbstractActivity;
-import cgeo.geocaching.activity.AbstractActivity.ActivitySharingInterface;
import cgeo.geocaching.activity.AbstractViewPagerActivity;
import cgeo.geocaching.activity.INavigationSource;
import cgeo.geocaching.activity.Progress;
@@ -24,6 +23,7 @@ import cgeo.geocaching.gcvote.GCVote;
import cgeo.geocaching.gcvote.GCVoteDialog;
import cgeo.geocaching.list.StoredList;
import cgeo.geocaching.location.Units;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.sensors.GeoData;
@@ -57,7 +57,6 @@ import cgeo.geocaching.utils.TextUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.Charsets;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -87,8 +86,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NfcAdapter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
@@ -139,7 +136,7 @@ import java.util.regex.Pattern;
* e.g. details, description, logs, waypoints, inventory...
*/
public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page>
- implements CacheMenuHandler.ActivityInterface, INavigationSource, ActivitySharingInterface, EditNoteDialogListener {
+ implements CacheMenuHandler.ActivityInterface, INavigationSource, AndroidBeam.ActivitySharingInterface, EditNoteDialogListener {
private static final int MESSAGE_FAILED = -1;
private static final int MESSAGE_SUCCEEDED = 1;
@@ -188,17 +185,14 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// get parameters
final Bundle extras = getIntent().getExtras();
- Uri uri = getIntent().getData();
+ final Uri uri = AndroidBeam.getUri(getIntent());
// try to get data from extras
String name = null;
String geocode = null;
String guid = null;
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
- final NdefMessage msg = (NdefMessage) extras.getParcelableArray(NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
- uri = Uri.parse("http://" + new String(msg.getRecords()[0].getPayload(), Charsets.UTF_8));
- } else if (extras != null) {
+ if (extras != null) {
geocode = extras.getString(Intents.EXTRA_GEOCODE);
name = extras.getString(Intents.EXTRA_NAME);
guid = extras.getString(Intents.EXTRA_GUID);
@@ -309,7 +303,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
locationUpdater = new CacheDetailsGeoDirHandler(this);
// If we have a newer Android device setup Android Beam for easy cache sharing
- initializeAndroidBeam(this);
+ AndroidBeam.enable(this, this);
}
@Override
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index d921acb..b7e42ab 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -4,13 +4,13 @@ import butterknife.ButterKnife;
import butterknife.InjectView;
import cgeo.geocaching.activity.AbstractActivity;
-import cgeo.geocaching.activity.AbstractActivity.ActivitySharingInterface;
import cgeo.geocaching.activity.AbstractViewPagerActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.trackable.TrackableConnector;
import cgeo.geocaching.connector.trackable.TravelBugConnector;
import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.location.Units;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.ui.AbstractCachingPageViewCreator;
import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod;
@@ -26,7 +26,6 @@ import cgeo.geocaching.utils.RxUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.Charsets;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@@ -43,8 +42,6 @@ import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.view.ActionMode;
@@ -65,7 +62,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivity.Page> implements ActivitySharingInterface {
+public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivity.Page> implements AndroidBeam.ActivitySharingInterface {
private CompositeSubscription createSubscriptions;
@@ -107,19 +104,13 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
// get parameters
final Bundle extras = getIntent().getExtras();
- final Uri uri;
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
- final NdefMessage msg = (NdefMessage) extras.getParcelableArray(NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
- uri = Uri.parse("http://" + new String(msg.getRecords()[0].getPayload(), Charsets.UTF_8));
- } else if (extras != null) {
+ final Uri uri = AndroidBeam.getUri(getIntent());
+ if (extras != null) {
// try to get data from extras
geocode = extras.getString(Intents.EXTRA_GEOCODE);
name = extras.getString(Intents.EXTRA_NAME);
guid = extras.getString(Intents.EXTRA_GUID);
id = extras.getString(Intents.EXTRA_ID);
- uri = getIntent().getData();
- } else {
- uri = null;
}
// try to get data from URI
@@ -169,7 +160,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
// If we have a newer Android device setup Android Beam for easy cache sharing
- initializeAndroidBeam(this);
+ AndroidBeam.enable(this, this);
createViewPager(0, new OnPageSelectedListener() {
@Override
diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java
index 7626ba8..6ceead0 100644
--- a/main/src/cgeo/geocaching/activity/AbstractActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java
@@ -6,6 +6,7 @@ import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.Geocache;
import cgeo.geocaching.R;
import cgeo.geocaching.enumerations.CacheType;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.network.Cookies;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.ClipboardUtils;
@@ -20,14 +21,8 @@ import org.eclipse.jdt.annotation.Nullable;
import rx.Subscription;
import rx.subscriptions.Subscriptions;
-import android.annotation.TargetApi;
import android.content.Intent;
import android.content.res.Resources;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcEvent;
-import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.view.ActionMode;
@@ -78,6 +73,7 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs
supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
initializeCommonFields();
+ AndroidBeam.disable(this);
}
@Override
@@ -206,45 +202,6 @@ public abstract class AbstractActivity extends ActionBarActivity implements IAbs
}
}
- // 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();
- }
-
- protected void initializeAndroidBeam(final ActivitySharingInterface sharingInterface) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- initializeICSAndroidBeam(sharingInterface);
- }
- }
-
- @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
- protected void initializeICSAndroidBeam(final ActivitySharingInterface sharingInterface) {
- final NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
- if (nfcAdapter == null) {
- return;
- }
- nfcAdapter.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
- @Override
- public NdefMessage createNdefMessage(final NfcEvent event) {
- final String uri = sharingInterface.getAndroidBeamUri();
- if (uri == null) {
- return null;
- }
- final NdefRecord[] records = {
- NdefRecord.createUri(uri),
- NdefRecord.createApplicationRecord(CgeoApplication.getInstance().getPackageName())
- };
- return new NdefMessage(records);
- }
- }, this);
-
- }
-
protected void setCacheTitleBar(@Nullable final String geocode, @Nullable final String name, @Nullable final CacheType type) {
if (StringUtils.isNotBlank(name)) {
setTitle(StringUtils.isNotBlank(geocode) ? name + " (" + geocode + ")" : name);
diff --git a/main/src/cgeo/geocaching/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java
index d7482c3..86ca98f 100644
--- a/main/src/cgeo/geocaching/activity/AbstractListActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractListActivity.java
@@ -1,6 +1,7 @@
package cgeo.geocaching.activity;
import cgeo.geocaching.CgeoApplication;
+import cgeo.geocaching.network.AndroidBeam;
import android.content.res.Resources;
import android.os.Bundle;
@@ -48,6 +49,7 @@ public abstract class AbstractListActivity extends ActionBarListActivity impleme
initializeCommonFields();
initUpAction();
+ AndroidBeam.disable(this);
}
protected void initUpAction() {
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index b2bb8a6..fd08adb 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -32,6 +32,7 @@ import cgeo.geocaching.maps.interfaces.MapProvider;
import cgeo.geocaching.maps.interfaces.MapSource;
import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OnMapDragListener;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.sensors.GeoData;
import cgeo.geocaching.sensors.GeoDirHandler;
import cgeo.geocaching.sensors.Sensors;
@@ -496,6 +497,7 @@ public class CGeoMap extends AbstractMap implements ViewFactory {
if (!CgeoApplication.getInstance().isLiveMapHintShownInThisSession() && Settings.getLiveMapHintShowCount() <= 3) {
LiveMapInfoDialogBuilder.create(activity).show();
}
+ AndroidBeam.disable(activity);
}
private void initMyLocationSwitchButton(final CheckBox locSwitch) {
diff --git a/main/src/cgeo/geocaching/network/AndroidBeam.java b/main/src/cgeo/geocaching/network/AndroidBeam.java
new file mode 100644
index 0000000..58198b9
--- /dev/null
+++ b/main/src/cgeo/geocaching/network/AndroidBeam.java
@@ -0,0 +1,90 @@
+package cgeo.geocaching.network;
+
+import cgeo.geocaching.CgeoApplication;
+
+import org.apache.commons.io.Charsets;
+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) {
+ final String uri = sharingInterface.getAndroidBeamUri();
+ if (uri == null) {
+ return null;
+ }
+ final NdefRecord[] records = {
+ NdefRecord.createUri(uri),
+ NdefRecord.createApplicationRecord(CgeoApplication.getInstance().getPackageName())
+ };
+ return new NdefMessage(records);
+ }
+ };
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java
index 776b621..6e3ba0e 100644
--- a/main/src/cgeo/geocaching/settings/SettingsActivity.java
+++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java
@@ -12,6 +12,7 @@ import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.files.SimpleDirChooser;
import cgeo.geocaching.maps.MapProviderFactory;
import cgeo.geocaching.maps.interfaces.MapSource;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.sensors.Sensors;
import cgeo.geocaching.utils.DatabaseBackupUtils;
import cgeo.geocaching.utils.DebugUtils;
@@ -100,6 +101,7 @@ public class SettingsActivity extends PreferenceActivity {
final Intent intent = getIntent();
openInitialScreen(intent.getIntExtra(INTENT_OPEN_SCREEN, 0));
+ AndroidBeam.disable(this);
}
private void openInitialScreen(final int initialScreen) {