diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/nfc/INfcTag.aidl | 3 | ||||
-rw-r--r-- | core/java/android/nfc/TagLostException.java | 29 | ||||
-rw-r--r-- | core/java/android/nfc/TransceiveResult.aidl | 19 | ||||
-rw-r--r-- | core/java/android/nfc/TransceiveResult.java | 90 | ||||
-rw-r--r-- | core/java/android/nfc/technology/BasicTagTechnology.java | 18 | ||||
-rw-r--r-- | core/java/android/nfc/technology/MifareClassic.java | 7 |
6 files changed, 160 insertions, 6 deletions
diff --git a/core/java/android/nfc/INfcTag.aidl b/core/java/android/nfc/INfcTag.aidl index 300eeaa..57dc38c 100644 --- a/core/java/android/nfc/INfcTag.aidl +++ b/core/java/android/nfc/INfcTag.aidl @@ -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 index 0000000..1981d7c --- /dev/null +++ b/core/java/android/nfc/TagLostException.java @@ -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 index 0000000..98f92ee --- /dev/null +++ b/core/java/android/nfc/TransceiveResult.aidl @@ -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 index 0000000..16244b8 --- /dev/null +++ b/core/java/android/nfc/TransceiveResult.java @@ -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]; + } + }; + +} diff --git a/core/java/android/nfc/technology/BasicTagTechnology.java b/core/java/android/nfc/technology/BasicTagTechnology.java index 6d3292b..b67c607 100644 --- a/core/java/android/nfc/technology/BasicTagTechnology.java +++ b/core/java/android/nfc/technology/BasicTagTechnology.java @@ -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"); diff --git a/core/java/android/nfc/technology/MifareClassic.java b/core/java/android/nfc/technology/MifareClassic.java index fc3e8b3..ac87919 100644 --- a/core/java/android/nfc/technology/MifareClassic.java +++ b/core/java/android/nfc/technology/MifareClassic.java @@ -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); |