summaryrefslogtreecommitdiffstats
path: root/core/java/android/nfc
diff options
context:
space:
mode:
authorJeff Hamilton <jham@android.com>2011-01-08 15:31:26 -0600
committerJeff Hamilton <jham@android.com>2011-01-13 14:24:07 -0600
commit52d3203ef69d4babbc4dd030a15c08c0b8d1d226 (patch)
treebb69787ab4b413482825c83dbd2fef2ff713ad88 /core/java/android/nfc
parent61d9ffbfd86dfe6bacce431b8ed9eebe1cfd8178 (diff)
downloadframeworks_base-52d3203ef69d4babbc4dd030a15c08c0b8d1d226.zip
frameworks_base-52d3203ef69d4babbc4dd030a15c08c0b8d1d226.tar.gz
frameworks_base-52d3203ef69d4babbc4dd030a15c08c0b8d1d226.tar.bz2
Add dispatching overrides for foreground apps.
Apps can register to override the default dispatching but only when they're in the foreground. Change-Id: I8e9a9254d3f79f097fb3c8c677d806043574ba4d
Diffstat (limited to 'core/java/android/nfc')
-rw-r--r--core/java/android/nfc/INfcAdapter.aidl6
-rw-r--r--core/java/android/nfc/NfcAdapter.java67
2 files changed, 70 insertions, 3 deletions
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index a663fb8..cb9fc9d 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -16,6 +16,9 @@
package android.nfc;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.IntentFilter;
import android.nfc.NdefMessage;
import android.nfc.Tag;
import android.nfc.ILlcpSocket;
@@ -44,6 +47,9 @@ interface INfcAdapter
NdefMessage localGet();
void localSet(in NdefMessage message);
void openTagConnection(in Tag tag);
+ void enableForegroundDispatch(in ComponentName activity, in PendingIntent intent,
+ in IntentFilter[] filters);
+ void disableForegroundDispatch(in ComponentName activity);
// Non-public methods
// TODO: check and complete
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index 769e2d0..c9d6af8 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -18,8 +18,12 @@ package android.nfc;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.app.Activity;
import android.app.ActivityThread;
+import android.app.OnActivityPausedListener;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.nfc.technology.TagTechnology;
@@ -211,8 +215,6 @@ public final class NfcAdapter {
private static INfcAdapter sService;
private static INfcTag sTagService;
- private final Context mContext;
-
/**
* Helper to check if this device has FEATURE_NFC, but without using
* a context.
@@ -308,7 +310,6 @@ public final class NfcAdapter {
if (setupService() == null) {
throw new UnsupportedOperationException();
}
- mContext = context;
}
/**
@@ -410,6 +411,66 @@ public final class NfcAdapter {
}
}
+ class ForegroundDispatchPausedListener implements OnActivityPausedListener {
+ @Override
+ public void onPaused(Activity activity) {
+ disableForegroundDispatchInternal(activity, true);
+ }
+ }
+
+ /**
+ * Enables foreground dispatching to the given Activity. This will force all NFC Intents that
+ * match the given filters to be delivered to the activity bypassing the standard dispatch
+ * mechanism.
+ *
+ * This method must be called from the main thread.
+ *
+ * @param activity the Activity to dispatch to
+ * @param intent the PendingIntent to start for the dispatch
+ * @param filters the IntentFilters to override dispatching for
+ * @throws IllegalStateException
+ */
+ public void enableForegroundDispatch(Activity activity, PendingIntent intent,
+ IntentFilter... filters) {
+ if (activity == null || intent == null || filters == null) {
+ throw new NullPointerException();
+ }
+ if (!activity.isResumed()) {
+ throw new IllegalStateException("Foregorund dispatching can onlly be enabled " +
+ "when your activity is resumed");
+ }
+ try {
+ ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity,
+ new ForegroundDispatchPausedListener());
+ sService.enableForegroundDispatch(activity.getComponentName(), intent, filters);
+ } catch (RemoteException e) {
+ attemptDeadServiceRecovery(e);
+ }
+ }
+
+ /**
+ * Disables foreground activity dispatching setup with
+ * {@link #enableForegroundDispatch}. This must be called before the Activity returns from
+ * it's <code>onPause()</code> or this method will throw an IllegalStateException.
+ *
+ * This method must be called from the main thread.
+ */
+ public void disableForegroundDispatch(Activity activity) {
+ disableForegroundDispatchInternal(activity, false);
+ }
+
+ void disableForegroundDispatchInternal(Activity activity, boolean force) {
+ try {
+ sService.disableForegroundDispatch(activity.getComponentName());
+ if (!force && !activity.isResumed()) {
+ throw new IllegalStateException("You must disable forgeground dispatching " +
+ "while your activity is still resumed");
+ }
+ } catch (RemoteException e) {
+ attemptDeadServiceRecovery(e);
+ }
+ }
+
/**
* Retrieve a TagTechnology object used to interact with a Tag that is
* in field.