OSDN Git Service

Support for TagLostException (API).
authorMartijn Coenen <martijn.coenen@nxp.com>
Tue, 18 Jan 2011 23:57:17 +0000 (00:57 +0100)
committerNick Pelly <npelly@google.com>
Wed, 19 Jan 2011 02:32:50 +0000 (18:32 -0800)
Change-Id: Idf2c3253f7bc5f371133c4f18bfc2afde69c3010

core/java/android/nfc/INfcTag.aidl
core/java/android/nfc/TagLostException.java [new file with mode: 0644]
core/java/android/nfc/TransceiveResult.aidl [new file with mode: 0644]
core/java/android/nfc/TransceiveResult.java [new file with mode: 0644]
core/java/android/nfc/technology/BasicTagTechnology.java
core/java/android/nfc/technology/MifareClassic.java

index 300eeaa..57dc38c 100644 (file)
@@ -17,6 +17,7 @@
 package android.nfc;
 
 import android.nfc.NdefMessage;
+import android.nfc.TransceiveResult;
 
 /**
  * @hide
@@ -30,7 +31,7 @@ interface INfcTag
     byte[] getUid(int nativeHandle);
     boolean isNdef(int nativeHandle);
     boolean isPresent(int nativeHandle);
-    byte[] transceive(int nativeHandle, in byte[] data, boolean raw);
+    TransceiveResult transceive(int nativeHandle, in byte[] data, boolean raw);
 
     int getLastError(int nativeHandle);
 
diff --git a/core/java/android/nfc/TagLostException.java b/core/java/android/nfc/TagLostException.java
new file mode 100644 (file)
index 0000000..1981d7c
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.nfc;
+
+import java.io.IOException;
+
+public class TagLostException extends IOException {
+    public TagLostException() {
+        super();
+    }
+
+    public TagLostException(String message) {
+        super(message);
+    }
+}
diff --git a/core/java/android/nfc/TransceiveResult.aidl b/core/java/android/nfc/TransceiveResult.aidl
new file mode 100644 (file)
index 0000000..98f92ee
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.nfc;
+
+parcelable TransceiveResult;
diff --git a/core/java/android/nfc/TransceiveResult.java b/core/java/android/nfc/TransceiveResult.java
new file mode 100644 (file)
index 0000000..16244b8
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.nfc;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Class used to pipe transceive result from the NFC service.
+ *
+ * @hide
+ */
+public final class TransceiveResult implements Parcelable {
+    private final boolean mTagLost;
+    private final boolean mSuccess;
+    private final byte[] mResponseData;
+
+    public TransceiveResult(final boolean success, final boolean tagIsLost,
+            final byte[] data) {
+        mSuccess = success;
+        mTagLost = tagIsLost;
+        mResponseData = data;
+    }
+
+    public boolean isSuccessful() {
+        return mSuccess;
+    }
+
+    public boolean isTagLost() {
+        return mTagLost;
+    }
+
+    public byte[] getResponseData() {
+        return mResponseData;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mSuccess ? 1 : 0);
+        dest.writeInt(mTagLost ? 1 : 0);
+        if (mSuccess) {
+            dest.writeInt(mResponseData.length);
+            dest.writeByteArray(mResponseData);
+        }
+    }
+
+    public static final Parcelable.Creator<TransceiveResult> CREATOR =
+            new Parcelable.Creator<TransceiveResult>() {
+        @Override
+        public TransceiveResult createFromParcel(Parcel in) {
+            boolean success = (in.readInt() == 1) ? true : false;
+            boolean tagLost = (in.readInt() == 1) ? true : false;
+            byte[] responseData;
+
+            if (success) {
+                int responseLength = in.readInt();
+                responseData = new byte[responseLength];
+                in.readByteArray(responseData);
+            } else {
+                responseData = null;
+            }
+            return new TransceiveResult(success, tagLost, responseData);
+        }
+
+        @Override
+        public TransceiveResult[] newArray(int size) {
+            return new TransceiveResult[size];
+        }
+    };
+
+}
index 6d3292b..b67c607 100644 (file)
@@ -21,8 +21,10 @@ import java.io.IOException;
 import android.nfc.INfcAdapter;
 import android.nfc.INfcTag;
 import android.nfc.NfcAdapter;
+import android.nfc.TransceiveResult;
 import android.nfc.Tag;
 import android.nfc.ErrorCodes;
+import android.nfc.TagLostException;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -165,11 +167,21 @@ import android.util.Log;
         checkConnected();
 
         try {
-            byte[] response = mTagService.transceive(mTag.getServiceHandle(), data, raw);
-            if (response == null) {
+            TransceiveResult result = mTagService.transceive(mTag.getServiceHandle(), data, raw);
+            if (result == null) {
                 throw new IOException("transceive failed");
+            } else {
+                if (result.isSuccessful()) {
+                    return result.getResponseData();
+                } else {
+                    if (result.isTagLost()) {
+                        throw new TagLostException("Tag was lost.");
+                    }
+                    else {
+                        throw new IOException("transceive failed");
+                    }
+                }
             }
-            return response;
         } catch (RemoteException e) {
             Log.e(TAG, "NFC service dead", e);
             throw new IOException("NFC service died");
index fc3e8b3..ac87919 100644 (file)
@@ -17,6 +17,7 @@
 package android.nfc.technology;
 
 import android.nfc.NfcAdapter;
+import android.nfc.TagLostException;
 import android.nfc.Tag;
 import android.os.Bundle;
 import android.os.RemoteException;
@@ -248,7 +249,7 @@ public final class MifareClassic extends BasicTagTechnology {
      * Authenticate the entire sector that the given block resides in.
      * <p>This requires a that the tag be connected.
      */
-    public boolean authenticateBlock(int block, byte[] key, boolean keyA) {
+    public boolean authenticateBlock(int block, byte[] key, boolean keyA) throws TagLostException {
         checkConnected();
 
         byte[] cmd = new byte[12];
@@ -274,6 +275,8 @@ public final class MifareClassic extends BasicTagTechnology {
             if ((transceive(cmd, false) != null)) {
                 return true;
             }
+        } catch (TagLostException e) {
+            throw e;
         } catch (IOException e) {
             // No need to deal with, will return false anyway
         }
@@ -284,7 +287,7 @@ public final class MifareClassic extends BasicTagTechnology {
      * Authenticate for a given sector.
      * <p>This requires a that the tag be connected.
      */
-    public boolean authenticateSector(int sector, byte[] key, boolean keyA) {
+    public boolean authenticateSector(int sector, byte[] key, boolean keyA) throws TagLostException {
         checkConnected();
 
         byte addr = (byte) ((firstBlockInSector(sector)) & 0xff);