diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2015-02-21 12:54:36 +0100 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2015-02-21 12:54:36 +0100 |
| commit | 083593725b909bb011f291c30e46e605e6908d2a (patch) | |
| tree | 43120e31e965ad26b5dd1c59d8c218aef168d855 /main/src | |
| parent | 0f28169faf68b19b1218bf3c6e32c52b42017909 (diff) | |
| download | cgeo-083593725b909bb011f291c30e46e605e6908d2a.zip cgeo-083593725b909bb011f291c30e46e605e6908d2a.tar.gz cgeo-083593725b909bb011f291c30e46e605e6908d2a.tar.bz2 | |
disable Android Beam when there is nothing to beam
Diffstat (limited to 'main/src')
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) { |
