Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit faca12ad authored by Martijn Coenen's avatar Martijn Coenen
Browse files

Add getMaxTransceiveLength() API.

Also moved canMakeReadOnly() down in the stack, and
cleaned up TransceiveResult.

Change-Id: I85576c52478ab79f0726606659b0c17d00b222e6
parent cfc0f2c2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -12441,6 +12441,7 @@ package android.nfc.tech {
    method public static android.nfc.tech.IsoDep get(android.nfc.Tag);
    method public byte[] getHiLayerResponse();
    method public byte[] getHistoricalBytes();
    method public int getMaxTransceiveLength();
    method public void setTimeout(int);
    method public byte[] transceive(byte[]) throws java.io.IOException;
  }
@@ -12453,6 +12454,7 @@ package android.nfc.tech {
    method public static android.nfc.tech.MifareClassic get(android.nfc.Tag);
    method public int getBlockCount();
    method public int getBlockCountInSector(int);
    method public int getMaxTransceiveLength();
    method public int getSectorCount();
    method public int getSize();
    method public int getType();
@@ -12479,6 +12481,7 @@ package android.nfc.tech {
  public final class MifareUltralight extends android.nfc.tech.BasicTagTechnology {
    method public static android.nfc.tech.MifareUltralight get(android.nfc.Tag);
    method public int getMaxTransceiveLength();
    method public int getType();
    method public byte[] readPages(int) throws java.io.IOException;
    method public byte[] transceive(byte[]) throws java.io.IOException;
@@ -12515,6 +12518,7 @@ package android.nfc.tech {
  public final class NfcA extends android.nfc.tech.BasicTagTechnology {
    method public static android.nfc.tech.NfcA get(android.nfc.Tag);
    method public byte[] getAtqa();
    method public int getMaxTransceiveLength();
    method public short getSak();
    method public byte[] transceive(byte[]) throws java.io.IOException;
  }
@@ -12522,6 +12526,7 @@ package android.nfc.tech {
  public final class NfcB extends android.nfc.tech.BasicTagTechnology {
    method public static android.nfc.tech.NfcB get(android.nfc.Tag);
    method public byte[] getApplicationData();
    method public int getMaxTransceiveLength();
    method public byte[] getProtocolInfo();
    method public byte[] transceive(byte[]) throws java.io.IOException;
  }
@@ -12529,6 +12534,7 @@ package android.nfc.tech {
  public final class NfcF extends android.nfc.tech.BasicTagTechnology {
    method public static android.nfc.tech.NfcF get(android.nfc.Tag);
    method public byte[] getManufacturer();
    method public int getMaxTransceiveLength();
    method public byte[] getSystemCode();
    method public byte[] transceive(byte[]) throws java.io.IOException;
  }
@@ -12536,6 +12542,7 @@ package android.nfc.tech {
  public final class NfcV extends android.nfc.tech.BasicTagTechnology {
    method public static android.nfc.tech.NfcV get(android.nfc.Tag);
    method public byte getDsfId();
    method public int getMaxTransceiveLength();
    method public byte getResponseFlags();
    method public byte[] transceive(byte[]) throws java.io.IOException;
  }
+2 −0
Original line number Diff line number Diff line
@@ -46,4 +46,6 @@ interface INfcTag
    int setTimeout(int technology, int timeout);
    int getTimeout(int technology);
    void resetTimeouts();
    boolean canMakeReadOnly(int ndefType);
    int getMaxTransceiveLength(int technology);
}
+27 −24
Original line number Diff line number Diff line
@@ -19,33 +19,38 @@ package android.nfc;
import android.os.Parcel;
import android.os.Parcelable;

import java.io.IOException;

/**
 * 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 static final int RESULT_SUCCESS = 0;
    public static final int RESULT_FAILURE = 1;
    public static final int RESULT_TAGLOST = 2;
    public static final int RESULT_EXCEEDED_LENGTH = 3;

    public TransceiveResult(final boolean success, final boolean tagIsLost,
            final byte[] data) {
        mSuccess = success;
        mTagLost = tagIsLost;
        mResponseData = data;
    }
    final int mResult;
    final byte[] mResponseData;

    public boolean isSuccessful() {
        return mSuccess;
    }

    public boolean isTagLost() {
        return mTagLost;
    public TransceiveResult(final int result, final byte[] data) {
        mResult = result;
        mResponseData = data;
    }

    public byte[] getResponseData() {
    public byte[] getResponseOrThrow() throws IOException {
        switch (mResult) {
            case RESULT_SUCCESS:
                return mResponseData;
            case RESULT_TAGLOST:
                throw new TagLostException("Tag was lost.");
            case RESULT_EXCEEDED_LENGTH:
                throw new IOException("Transceive length exceeds supported maximum");
            default:
                throw new IOException("Transceive failed");
        }
    }

    @Override
@@ -55,9 +60,8 @@ public final class TransceiveResult implements Parcelable {

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mSuccess ? 1 : 0);
        dest.writeInt(mTagLost ? 1 : 0);
        if (mSuccess) {
        dest.writeInt(mResult);
        if (mResult == RESULT_SUCCESS) {
            dest.writeInt(mResponseData.length);
            dest.writeByteArray(mResponseData);
        }
@@ -67,18 +71,17 @@ public final class TransceiveResult implements Parcelable {
            new Parcelable.Creator<TransceiveResult>() {
        @Override
        public TransceiveResult createFromParcel(Parcel in) {
            boolean success = (in.readInt() == 1) ? true : false;
            boolean tagLost = (in.readInt() == 1) ? true : false;
            int result = in.readInt();
            byte[] responseData;

            if (success) {
            if (result == RESULT_SUCCESS) {
                int responseLength = in.readInt();
                responseData = new byte[responseLength];
                in.readByteArray(responseData);
            } else {
                responseData = null;
            }
            return new TransceiveResult(success, tagLost, responseData);
            return new TransceiveResult(result, responseData);
        }

        @Override
+10 −10
Original line number Diff line number Diff line
@@ -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 */
    /*package*/ byte[] transceive(byte[] data, boolean raw) throws IOException {
        checkConnected();
@@ -139,16 +148,7 @@ import java.io.IOException;
            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 result.getResponseOrThrow();
            }
        } catch (RemoteException e) {
            Log.e(TAG, "NFC service dead", e);
+11 −0
Original line number Diff line number Diff line
@@ -156,6 +156,9 @@ public final class IsoDep extends BasicTagTechnology {
     * will be automatically fragmented and defragmented by {@link #transceive} if
     * 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
     * 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.
@@ -170,4 +173,12 @@ public final class IsoDep extends BasicTagTechnology {
    public byte[] transceive(byte[] data) throws IOException {
        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();
    }
}
Loading