Merge "Add getMaxTransceiveLength() API."

This commit is contained in:
Martijn Coenen
2011-08-26 16:36:29 -07:00
committed by Android (Google) Code Review
12 changed files with 129 additions and 37 deletions

View File

@@ -12465,6 +12465,7 @@ package android.nfc.tech {
method public static android.nfc.tech.IsoDep get(android.nfc.Tag); method public static android.nfc.tech.IsoDep get(android.nfc.Tag);
method public byte[] getHiLayerResponse(); method public byte[] getHiLayerResponse();
method public byte[] getHistoricalBytes(); method public byte[] getHistoricalBytes();
method public int getMaxTransceiveLength();
method public void setTimeout(int); method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
} }
@@ -12477,6 +12478,7 @@ package android.nfc.tech {
method public static android.nfc.tech.MifareClassic get(android.nfc.Tag); method public static android.nfc.tech.MifareClassic get(android.nfc.Tag);
method public int getBlockCount(); method public int getBlockCount();
method public int getBlockCountInSector(int); method public int getBlockCountInSector(int);
method public int getMaxTransceiveLength();
method public int getSectorCount(); method public int getSectorCount();
method public int getSize(); method public int getSize();
method public int getType(); method public int getType();
@@ -12503,6 +12505,7 @@ package android.nfc.tech {
public final class MifareUltralight extends android.nfc.tech.BasicTagTechnology { public final class MifareUltralight extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.MifareUltralight get(android.nfc.Tag); method public static android.nfc.tech.MifareUltralight get(android.nfc.Tag);
method public int getMaxTransceiveLength();
method public int getType(); method public int getType();
method public byte[] readPages(int) throws java.io.IOException; method public byte[] readPages(int) throws java.io.IOException;
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
@@ -12539,6 +12542,7 @@ package android.nfc.tech {
public final class NfcA extends android.nfc.tech.BasicTagTechnology { public final class NfcA extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcA get(android.nfc.Tag); method public static android.nfc.tech.NfcA get(android.nfc.Tag);
method public byte[] getAtqa(); method public byte[] getAtqa();
method public int getMaxTransceiveLength();
method public short getSak(); method public short getSak();
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
} }
@@ -12546,6 +12550,7 @@ package android.nfc.tech {
public final class NfcB extends android.nfc.tech.BasicTagTechnology { public final class NfcB extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcB get(android.nfc.Tag); method public static android.nfc.tech.NfcB get(android.nfc.Tag);
method public byte[] getApplicationData(); method public byte[] getApplicationData();
method public int getMaxTransceiveLength();
method public byte[] getProtocolInfo(); method public byte[] getProtocolInfo();
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
} }
@@ -12553,6 +12558,7 @@ package android.nfc.tech {
public final class NfcF extends android.nfc.tech.BasicTagTechnology { public final class NfcF extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcF get(android.nfc.Tag); method public static android.nfc.tech.NfcF get(android.nfc.Tag);
method public byte[] getManufacturer(); method public byte[] getManufacturer();
method public int getMaxTransceiveLength();
method public byte[] getSystemCode(); method public byte[] getSystemCode();
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
} }
@@ -12560,6 +12566,7 @@ package android.nfc.tech {
public final class NfcV extends android.nfc.tech.BasicTagTechnology { public final class NfcV extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcV get(android.nfc.Tag); method public static android.nfc.tech.NfcV get(android.nfc.Tag);
method public byte getDsfId(); method public byte getDsfId();
method public int getMaxTransceiveLength();
method public byte getResponseFlags(); method public byte getResponseFlags();
method public byte[] transceive(byte[]) throws java.io.IOException; method public byte[] transceive(byte[]) throws java.io.IOException;
} }

View File

@@ -46,4 +46,6 @@ interface INfcTag
int setTimeout(int technology, int timeout); int setTimeout(int technology, int timeout);
int getTimeout(int technology); int getTimeout(int technology);
void resetTimeouts(); void resetTimeouts();
boolean canMakeReadOnly(int ndefType);
int getMaxTransceiveLength(int technology);
} }

View File

@@ -19,33 +19,38 @@ package android.nfc;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.io.IOException;
/** /**
* Class used to pipe transceive result from the NFC service. * Class used to pipe transceive result from the NFC service.
* *
* @hide * @hide
*/ */
public final class TransceiveResult implements Parcelable { public final class TransceiveResult implements Parcelable {
private final boolean mTagLost; public static final int RESULT_SUCCESS = 0;
private final boolean mSuccess; public static final int RESULT_FAILURE = 1;
private final byte[] mResponseData; public static final int RESULT_TAGLOST = 2;
public static final int RESULT_EXCEEDED_LENGTH = 3;
public TransceiveResult(final boolean success, final boolean tagIsLost, final int mResult;
final byte[] data) { final byte[] mResponseData;
mSuccess = success;
mTagLost = tagIsLost; public TransceiveResult(final int result, final byte[] data) {
mResult = result;
mResponseData = data; mResponseData = data;
} }
public boolean isSuccessful() { public byte[] getResponseOrThrow() throws IOException {
return mSuccess; switch (mResult) {
} case RESULT_SUCCESS:
return mResponseData;
public boolean isTagLost() { case RESULT_TAGLOST:
return mTagLost; throw new TagLostException("Tag was lost.");
} case RESULT_EXCEEDED_LENGTH:
throw new IOException("Transceive length exceeds supported maximum");
public byte[] getResponseData() { default:
return mResponseData; throw new IOException("Transceive failed");
}
} }
@Override @Override
@@ -55,9 +60,8 @@ public final class TransceiveResult implements Parcelable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mSuccess ? 1 : 0); dest.writeInt(mResult);
dest.writeInt(mTagLost ? 1 : 0); if (mResult == RESULT_SUCCESS) {
if (mSuccess) {
dest.writeInt(mResponseData.length); dest.writeInt(mResponseData.length);
dest.writeByteArray(mResponseData); dest.writeByteArray(mResponseData);
} }
@@ -67,18 +71,17 @@ public final class TransceiveResult implements Parcelable {
new Parcelable.Creator<TransceiveResult>() { new Parcelable.Creator<TransceiveResult>() {
@Override @Override
public TransceiveResult createFromParcel(Parcel in) { public TransceiveResult createFromParcel(Parcel in) {
boolean success = (in.readInt() == 1) ? true : false; int result = in.readInt();
boolean tagLost = (in.readInt() == 1) ? true : false;
byte[] responseData; byte[] responseData;
if (success) { if (result == RESULT_SUCCESS) {
int responseLength = in.readInt(); int responseLength = in.readInt();
responseData = new byte[responseLength]; responseData = new byte[responseLength];
in.readByteArray(responseData); in.readByteArray(responseData);
} else { } else {
responseData = null; responseData = null;
} }
return new TransceiveResult(success, tagLost, responseData); return new TransceiveResult(result, responseData);
} }
@Override @Override

View File

@@ -129,6 +129,15 @@ import java.io.IOException;
} }
} }
/** Internal getMaxTransceiveLength() */
int getMaxTransceiveLengthInternal() {
try {
return mTag.getTagService().getMaxTransceiveLength(mSelectedTechnology);
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
return 0;
}
}
/** Internal transceive */ /** Internal transceive */
/*package*/ byte[] transceive(byte[] data, boolean raw) throws IOException { /*package*/ byte[] transceive(byte[] data, boolean raw) throws IOException {
checkConnected(); checkConnected();
@@ -139,16 +148,7 @@ import java.io.IOException;
if (result == null) { if (result == null) {
throw new IOException("transceive failed"); throw new IOException("transceive failed");
} else { } else {
if (result.isSuccessful()) { return result.getResponseOrThrow();
return result.getResponseData();
} else {
if (result.isTagLost()) {
throw new TagLostException("Tag was lost.");
}
else {
throw new IOException("transceive failed");
}
}
} }
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e); Log.e(TAG, "NFC service dead", e);

View File

@@ -156,6 +156,9 @@ public final class IsoDep extends BasicTagTechnology {
* will be automatically fragmented and defragmented by {@link #transceive} if * will be automatically fragmented and defragmented by {@link #transceive} if
* it exceeds FSD/FSC limits. * it exceeds FSD/FSC limits.
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -170,4 +173,12 @@ public final class IsoDep extends BasicTagTechnology {
public byte[] transceive(byte[] data) throws IOException { public byte[] transceive(byte[] data) throws IOException {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
} }

View File

@@ -560,6 +560,9 @@ public final class MifareClassic extends BasicTagTechnology {
* and calling {@link NfcA#transceive}. Note that all MIFARE Classic * and calling {@link NfcA#transceive}. Note that all MIFARE Classic
* tags are based on {@link NfcA} technology. * tags are based on {@link NfcA} technology.
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -572,6 +575,14 @@ public final class MifareClassic extends BasicTagTechnology {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
/** /**
* Set the timeout of {@link #transceive} in milliseconds. * Set the timeout of {@link #transceive} in milliseconds.
* <p>The timeout only applies to MifareUltralight {@link #transceive}, * <p>The timeout only applies to MifareUltralight {@link #transceive},

View File

@@ -200,6 +200,9 @@ public final class MifareUltralight extends BasicTagTechnology {
* and calling {@link NfcA#transceive}. Note that all MIFARE Classic * and calling {@link NfcA#transceive}. Note that all MIFARE Classic
* tags are based on {@link NfcA} technology. * tags are based on {@link NfcA} technology.
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -212,6 +215,14 @@ public final class MifareUltralight extends BasicTagTechnology {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
/** /**
* Set the timeout of {@link #transceive} in milliseconds. * Set the timeout of {@link #transceive} in milliseconds.
* <p>The timeout only applies to MifareUltralight {@link #transceive}, * <p>The timeout only applies to MifareUltralight {@link #transceive},

View File

@@ -334,9 +334,11 @@ public final class Ndef extends BasicTagTechnology {
* @return true if it is possible to make this tag read-only * @return true if it is possible to make this tag read-only
*/ */
public boolean canMakeReadOnly() { public boolean canMakeReadOnly() {
if (mNdefType == TYPE_1 || mNdefType == TYPE_2) { INfcTag tagService = mTag.getTagService();
return true; try {
} else { return tagService.canMakeReadOnly(mNdefType);
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
return false; return false;
} }
} }

View File

@@ -102,6 +102,9 @@ public final class NfcA extends BasicTagTechnology {
* for example a SENS_REQ is not possible (these are used to * for example a SENS_REQ is not possible (these are used to
* manage tag polling and initialization). * manage tag polling and initialization).
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -117,6 +120,14 @@ public final class NfcA extends BasicTagTechnology {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
/** /**
* Set the timeout of {@link #transceive} in milliseconds. * Set the timeout of {@link #transceive} in milliseconds.
* <p>The timeout only applies to NfcA {@link #transceive}, and is * <p>The timeout only applies to NfcA {@link #transceive}, and is

View File

@@ -97,6 +97,9 @@ public final class NfcB extends BasicTagTechnology {
* <p>Applications must not send commands that manage the polling * <p>Applications must not send commands that manage the polling
* loop and initialization (SENSB_REQ, SLOT_MARKER etc). * loop and initialization (SENSB_REQ, SLOT_MARKER etc).
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -111,4 +114,12 @@ public final class NfcB extends BasicTagTechnology {
public byte[] transceive(byte[] data) throws IOException { public byte[] transceive(byte[] data) throws IOException {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
} }

View File

@@ -101,6 +101,9 @@ public final class NfcF extends BasicTagTechnology {
* <p>Applications must not append the SoD (length) or EoD (CRC) to the payload, * <p>Applications must not append the SoD (length) or EoD (CRC) to the payload,
* it will be automatically calculated. * it will be automatically calculated.
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum amount of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -116,6 +119,14 @@ public final class NfcF extends BasicTagTechnology {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
/** /**
* Set the timeout of {@link #transceive} in milliseconds. * Set the timeout of {@link #transceive} in milliseconds.
* <p>The timeout only applies to NfcF {@link #transceive}, and is * <p>The timeout only applies to NfcF {@link #transceive}, and is

View File

@@ -97,6 +97,9 @@ public final class NfcV extends BasicTagTechnology {
* it will be automatically calculated. The application does * it will be automatically calculated. The application does
* provide FLAGS, CMD and PARAMETER bytes. * provide FLAGS, CMD and PARAMETER bytes.
* *
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum amount of bytes
* that can be sent with {@link #transceive}.
*
* <p>This is an I/O operation and will block until complete. It must * <p>This is an I/O operation and will block until complete. It must
* not be called from the main application thread. A blocked call will be canceled with * not be called from the main application thread. A blocked call will be canceled with
* {@link IOException} if {@link #close} is called from another thread. * {@link IOException} if {@link #close} is called from another thread.
@@ -111,4 +114,13 @@ public final class NfcV extends BasicTagTechnology {
public byte[] transceive(byte[] data) throws IOException { public byte[] transceive(byte[] data) throws IOException {
return transceive(data, true); return transceive(data, true);
} }
/**
* Return the maximum number of bytes that can be sent with {@link #transceive}.
* @return the maximum number of bytes that can be sent with {@link #transceive}.
*/
public int getMaxTransceiveLength() {
return getMaxTransceiveLengthInternal();
}
} }