summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorSylvain Fonteneau <sylvain.fonteneau@trusted-logic.com>2010-10-15 14:41:22 -0700
committerNick Pelly <npelly@google.com>2010-10-17 15:06:45 -0700
commita926540d5455a973dd8ca19c00c108620d9c68c2 (patch)
tree0fad9ba630a9164848cc23c75f699dde95da33b7 /core/java
parent424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0 (diff)
downloadframeworks_base-a926540d5455a973dd8ca19c00c108620d9c68c2.zip
frameworks_base-a926540d5455a973dd8ca19c00c108620d9c68c2.tar.gz
frameworks_base-a926540d5455a973dd8ca19c00c108620d9c68c2.tar.bz2
Implement methods introduced in draft #5 NFC API.
The API is implemented but still do not support muli-protocol tags. Change-Id: I5cea3eec7b5b92e8e1106d4660e2400e4433e943 Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/nfc/NdefTag.java48
-rw-r--r--core/java/android/nfc/NdefTagConnection.java23
-rw-r--r--core/java/android/nfc/NfcAdapter.java16
-rw-r--r--core/java/android/nfc/RawTagConnection.java25
-rw-r--r--core/java/android/nfc/Tag.java73
5 files changed, 163 insertions, 22 deletions
diff --git a/core/java/android/nfc/NdefTag.java b/core/java/android/nfc/NdefTag.java
index 6d44e6e..45cdc31 100644
--- a/core/java/android/nfc/NdefTag.java
+++ b/core/java/android/nfc/NdefTag.java
@@ -16,6 +16,8 @@
package android.nfc;
+import java.util.HashMap;
+
import android.os.Parcel;
import android.os.Parcelable;
@@ -41,8 +43,8 @@ public class NdefTag extends Tag implements Parcelable {
* tag is discovered and by Parcelable methods.
* @hide
*/
- public NdefTag(int type, byte[] uid, int nativeHandle, NdefMessage[] messages) {
- super(type, true, uid, nativeHandle);
+ public NdefTag(String typeName, byte[] uid, int nativeHandle, NdefMessage[] messages) {
+ super(typeName, true, uid, nativeHandle);
mMessages = messages.clone();
}
@@ -62,10 +64,22 @@ public class NdefTag extends Tag implements Parcelable {
/**
* Get only the NDEF Messages from a single NDEF target on a tag.
+ * <p>
+ * This retrieves the NDEF Messages that were found on the Tag at discovery
+ * time. It does not cause any further RF activity, and does not block.
+ * <p>
+ * Most tags only contain a single NDEF message.
+ *
+ * @param target One of targets strings provided by getNdefTargets()
+ * @return NDEF Messages found at Tag discovery
*/
public NdefMessage[] getNdefMessages(String target) {
- //TODO(nxp): new api method
- throw new UnsupportedOperationException();
+ // TODO: handle multiprotocol
+ String[] localTypes = convertToNdefType(mTypeName);
+ if (!target.equals(localTypes[0])) {
+ throw new IllegalArgumentException();
+ }
+ return getNdefMessages();
}
/** TODO(npelly):
@@ -79,13 +93,35 @@ public class NdefTag extends Tag implements Parcelable {
public static final String TARGET_MIFARE_CLASSIC = "type_mifare_classic";
public static final String TARGET_OTHER = "other";
+ private static final HashMap<String, String[]> NDEF_TYPES_CONVERTION_TABLE = new HashMap<String, String[]>() {
+ {
+ // TODO: handle multiprotocol
+ // TODO: move INTERNAL_TARGET_Type to TARGET_TYPE mapping to NFC service
+ put(Tag.INTERNAL_TARGET_TYPE_JEWEL, new String[] { NdefTag.TARGET_TYPE_1 });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_UL, new String[] { NdefTag.TARGET_TYPE_2 });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_1K, new String[] { NdefTag.TARGET_MIFARE_CLASSIC });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_4K, new String[] { NdefTag.TARGET_MIFARE_CLASSIC });
+ put(Tag.INTERNAL_TARGET_TYPE_FELICA, new String[] { NdefTag.TARGET_TYPE_3 });
+ put(Tag.INTERNAL_TARGET_TYPE_ISO14443_4, new String[] { NdefTag.TARGET_TYPE_4 });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_DESFIRE, new String[] { NdefTag.TARGET_TYPE_4 });
+ }
+ };
+
+ private String[] convertToNdefType(String internalTypeName) {
+ String[] result = NDEF_TYPES_CONVERTION_TABLE.get(internalTypeName);
+ if (result == null) {
+ return new String[] { NdefTag.TARGET_OTHER };
+ }
+ return result;
+ }
+
/**
* Return the
*
* @return
*/
public String[] getNdefTargets() {
- throw new UnsupportedOperationException();
+ return convertToNdefType(mTypeName);
}
@Override
@@ -107,7 +143,7 @@ public class NdefTag extends Tag implements Parcelable {
int messagesLength = in.readInt();
NdefMessage[] messages = new NdefMessage[messagesLength];
in.readTypedArray(messages, NdefMessage.CREATOR);
- return new NdefTag(tag.mType, tag.mUid, tag.mNativeHandle, messages);
+ return new NdefTag(tag.mTypeName, tag.mUid, tag.mNativeHandle, messages);
}
public NdefTag[] newArray(int size) {
return new NdefTag[size];
diff --git a/core/java/android/nfc/NdefTagConnection.java b/core/java/android/nfc/NdefTagConnection.java
index 8038d1a..4e9865c 100644
--- a/core/java/android/nfc/NdefTagConnection.java
+++ b/core/java/android/nfc/NdefTagConnection.java
@@ -39,8 +39,29 @@ public class NdefTagConnection extends RawTagConnection {
* Internal constructor, to be used by NfcAdapter
* @hide
*/
- NdefTagConnection(INfcAdapter service, NdefTag tag) throws RemoteException {
+ /* package private */ NdefTagConnection(INfcAdapter service, NdefTag tag, String target) throws RemoteException {
super(service, tag);
+ String[] targets = tag.getNdefTargets();
+ int i;
+
+ // Check target validity
+ for (i=0; i<targets.length; i++) {
+ if (target.equals(targets[i])) {
+ break;
+ }
+ }
+ if (i >= targets.length) {
+ // Target not found
+ throw new IllegalArgumentException();
+ }
+ }
+
+ /**
+ * Internal constructor, to be used by NfcAdapter
+ * @hide
+ */
+ /* package private */ NdefTagConnection(INfcAdapter service, NdefTag tag) throws RemoteException {
+ this(service, tag, tag.getNdefTargets()[0]);
}
/**
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index 37243f7..fb079f4 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -276,8 +276,12 @@ public final class NfcAdapter {
* Create a raw tag connection to the specified Target
*/
public RawTagConnection createRawTagConnection(Tag tag, String target) {
- //TODO
- throw new UnsupportedOperationException();
+ try {
+ return new RawTagConnection(mService, tag, target);
+ } catch (RemoteException e) {
+ Log.e(TAG, "NFC service died", e);
+ return null;
+ }
}
/**
@@ -296,7 +300,11 @@ public final class NfcAdapter {
* Create an NDEF tag connection to the specified Target
*/
public NdefTagConnection createNdefTagConnection(NdefTag tag, String target) {
- //TODO
- throw new UnsupportedOperationException();
+ try {
+ return new NdefTagConnection(mService, tag, target);
+ } catch (RemoteException e) {
+ Log.e(TAG, "NFC service died", e);
+ return null;
+ }
}
}
diff --git a/core/java/android/nfc/RawTagConnection.java b/core/java/android/nfc/RawTagConnection.java
index 50e2a5d..37d700c 100644
--- a/core/java/android/nfc/RawTagConnection.java
+++ b/core/java/android/nfc/RawTagConnection.java
@@ -39,14 +39,34 @@ public class RawTagConnection {
/*package*/ final INfcTag mTagService;
/*package*/ final Tag mTag;
/*package*/ boolean mIsConnected;
+ /*package*/ String mSelectedTarget;
private static final String TAG = "NFC";
- /* package private */ RawTagConnection(INfcAdapter service, Tag tag) throws RemoteException {
+ /* package private */ RawTagConnection(INfcAdapter service, Tag tag, String target) throws RemoteException {
+ String[] targets = tag.getRawTargets();
+ int i;
+
+ // Check target validity
+ for (i=0;i<targets.length;i++) {
+ if (target.equals(targets[i])) {
+ break;
+ }
+ }
+ if (i >= targets.length) {
+ // Target not found
+ throw new IllegalArgumentException();
+ }
+
mService = service;
mTagService = service.getNfcTagInterface();
mService.openTagConnection(tag); // TODO(nxp): don't connect until connect()
mTag = tag;
+ mSelectedTarget = target;
+ }
+
+ /* package private */ RawTagConnection(INfcAdapter service, Tag tag) throws RemoteException {
+ this(service, tag, tag.getRawTargets()[0]);
}
/**
@@ -57,8 +77,7 @@ public class RawTagConnection {
}
public String getTagTarget() {
- //TODO
- throw new UnsupportedOperationException();
+ return mSelectedTarget;
}
/**
diff --git a/core/java/android/nfc/Tag.java b/core/java/android/nfc/Tag.java
index ea21790..abf02b5 100644
--- a/core/java/android/nfc/Tag.java
+++ b/core/java/android/nfc/Tag.java
@@ -16,6 +16,8 @@
package android.nfc;
+import java.util.HashMap;
+
import android.os.Parcel;
import android.os.Parcelable;
@@ -113,17 +115,73 @@ public class Tag implements Parcelable {
public static final String TARGET_OTHER = "other";
- /*package*/ final int mType;
+ /*package*/ final String mTypeName;
/*package*/ final boolean mIsNdef;
/*package*/ final byte[] mUid;
/*package*/ final int mNativeHandle;
+ /*package*/ static final String INTERNAL_TARGET_TYPE_ISO14443_3A = "Iso14443-3A";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_ISO14443_3B = "Iso14443-3B";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_ISO14443_4 = "Iso14443-4";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_MIFARE_UL = "MifareUL";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_MIFARE_1K = "Mifare1K";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_MIFARE_4K = "Mifare4K";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_MIFARE_DESFIRE = "MifareDESFIRE";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_MIFARE_UNKNOWN = "Unknown Mifare";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_FELICA = "Felica";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_JEWEL = "Jewel";
+ /*package*/ static final String INTERNAL_TARGET_TYPE_UNKNOWN = "Unknown Type";
+
+ private static final HashMap<String, Integer> INT_TYPES_CONVERTION_TABLE = new HashMap<String, Integer>() {
+ {
+ put(Tag.INTERNAL_TARGET_TYPE_ISO14443_3A, Tag.NFC_TAG_ISO14443_A );
+ put(Tag.INTERNAL_TARGET_TYPE_ISO14443_3B, Tag.NFC_TAG_ISO14443_B );
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_UL, Tag.NFC_TAG_MIFARE );
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_1K, Tag.NFC_TAG_MIFARE );
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_4K, Tag.NFC_TAG_MIFARE );
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_DESFIRE, Tag.NFC_TAG_MIFARE );
+ put(Tag.INTERNAL_TARGET_TYPE_FELICA, Tag.NFC_TAG_FELICA );
+ put(Tag.INTERNAL_TARGET_TYPE_JEWEL, Tag.NFC_TAG_JEWEL );
+ }
+ };
+
+ private int convertToInt(String internalTypeName) {
+ Integer result = INT_TYPES_CONVERTION_TABLE.get(internalTypeName);
+ if (result == null) {
+ return Tag.NFC_TAG_OTHER;
+ }
+ return result;
+ }
+
+ private static final HashMap<String, String[]> RAW_TYPES_CONVERTION_TABLE = new HashMap<String, String[]>() {
+ {
+ /* TODO: handle multiprotocol */
+ put(Tag.INTERNAL_TARGET_TYPE_ISO14443_3A, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_ISO14443_3B, new String[] { Tag.TARGET_ISO_14443_3B });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_UL, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_1K, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_4K, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_DESFIRE, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_MIFARE_UNKNOWN, new String[] { Tag.TARGET_ISO_14443_3A });
+ put(Tag.INTERNAL_TARGET_TYPE_FELICA, new String[] { Tag.TARGET_JIS_X_6319_4 });
+ put(Tag.INTERNAL_TARGET_TYPE_JEWEL, new String[] { Tag.TARGET_TOPAZ });
+ }
+ };
+
+ private String[] convertToRaw(String internalTypeName) {
+ String[] result = RAW_TYPES_CONVERTION_TABLE.get(internalTypeName);
+ if (result == null) {
+ return new String[] { Tag.TARGET_OTHER };
+ }
+ return result;
+ }
+
/**
* Hidden constructor to be used by NFC service only.
* @hide
*/
- public Tag(int type, boolean isNdef, byte[] uid, int nativeHandle) {
- mType = type;
+ public Tag(String typeName, boolean isNdef, byte[] uid, int nativeHandle) {
+ mTypeName = typeName;
mIsNdef = isNdef;
mUid = uid.clone();
mNativeHandle = nativeHandle;
@@ -144,8 +202,7 @@ public class Tag implements Parcelable {
* @return
*/
public String[] getRawTargets() {
- //TODO
- throw new UnsupportedOperationException();
+ return convertToRaw(mTypeName);
}
/**
@@ -159,7 +216,7 @@ public class Tag implements Parcelable {
* @hide
*/
public int getType() {
- return mType;
+ return convertToInt(mTypeName);
}
/**
@@ -188,7 +245,7 @@ public class Tag implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
boolean[] booleans = new boolean[] {mIsNdef};
- dest.writeInt(mType);
+ dest.writeString(mTypeName);
dest.writeBooleanArray(booleans);
dest.writeInt(mUid.length);
dest.writeByteArray(mUid);
@@ -199,7 +256,7 @@ public class Tag implements Parcelable {
new Parcelable.Creator<Tag>() {
public Tag createFromParcel(Parcel in) {
boolean[] booleans = new boolean[1];
- int type = in.readInt();
+ String type = in.readString();
in.readBooleanArray(booleans);
boolean isNdef = booleans[0];
int uidLength = in.readInt();