diff options
author | 2024-11-20 22:35:02 +0000 | |
---|---|---|
committer | 2024-11-20 22:35:02 +0000 | |
commit | f3e2a345ef33f57b7beabaf78d9754ba60d79cbc (patch) | |
tree | 02c22493c90585bf451c5214545cff5906adf3ff | |
parent | 715f07ffaf5cb2b99ab7ccf6981834f5ec6a983e (diff) | |
parent | babbde81b7366366cc612a7a8d72cd0129cc05a8 (diff) |
Merge "Add T4T Ndef Nfceee feature support" into main
-rw-r--r-- | nfc/api/system-current.txt | 42 | ||||
-rw-r--r-- | nfc/java/android/nfc/INfcAdapter.aidl | 2 | ||||
-rw-r--r-- | nfc/java/android/nfc/IT4tNdefNfcee.aidl | 33 | ||||
-rw-r--r-- | nfc/java/android/nfc/NfcAdapter.java | 9 | ||||
-rw-r--r-- | nfc/java/android/nfc/NfcOemExtension.java | 22 | ||||
-rw-r--r-- | nfc/java/android/nfc/T4tNdefNfcee.java | 258 | ||||
-rw-r--r-- | nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.aidl | 20 | ||||
-rw-r--r-- | nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java | 293 |
8 files changed, 678 insertions, 1 deletions
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt index d81ebc55ffc5..1019a10547e0 100644 --- a/nfc/api/system-current.txt +++ b/nfc/api/system-current.txt @@ -60,6 +60,7 @@ package android.nfc { method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public java.util.List<java.lang.String> getActiveNfceeList(); method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.nfc.RoutingStatus getRoutingStatus(); method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public java.util.List<android.nfc.NfcRoutingTableEntry> getRoutingTable(); + method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public android.nfc.T4tNdefNfcee getT4tNdefNfcee(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean hasUserEnabledNfc(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isAutoChangeEnabled(); method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isTagPresent(); @@ -186,6 +187,47 @@ package android.nfc { field @FlaggedApi("android.nfc.nfc_oem_extension") public static final int TECHNOLOGY_V = 3; // 0x3 } + @FlaggedApi("android.nfc.nfc_oem_extension") public final class T4tNdefNfcee { + method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public int clearData(); + method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isOperationOngoing(); + method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isSupported(); + method @Nullable @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public android.nfc.T4tNdefNfceeCcFileInfo readCcfile(); + method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public byte[] readData(@IntRange(from=0, to=65535) int); + method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @WorkerThread public int writeData(@IntRange(from=0, to=65535) int, @NonNull byte[]); + field public static final int CLEAR_DATA_FAILED_INTERNAL = 0; // 0x0 + field public static final int CLEAR_DATA_SUCCESS = 1; // 0x1 + field public static final int WRITE_DATA_ERROR_CONNECTION_FAILED = -6; // 0xfffffffa + field public static final int WRITE_DATA_ERROR_EMPTY_PAYLOAD = -7; // 0xfffffff9 + field public static final int WRITE_DATA_ERROR_INTERNAL = -1; // 0xffffffff + field public static final int WRITE_DATA_ERROR_INVALID_FILE_ID = -4; // 0xfffffffc + field public static final int WRITE_DATA_ERROR_INVALID_LENGTH = -5; // 0xfffffffb + field public static final int WRITE_DATA_ERROR_NDEF_VALIDATION_FAILED = -8; // 0xfffffff8 + field public static final int WRITE_DATA_ERROR_NFC_NOT_ON = -3; // 0xfffffffd + field public static final int WRITE_DATA_ERROR_RF_ACTIVATED = -2; // 0xfffffffe + field public static final int WRITE_DATA_SUCCESS = 0; // 0x0 + } + + @FlaggedApi("android.nfc.nfc_oem_extension") public final class T4tNdefNfceeCcFileInfo implements android.os.Parcelable { + method public int describeContents(); + method @IntRange(from=15, to=32767) public int getCcFileLength(); + method @IntRange(from=0xffffffff, to=65535) public int getFileId(); + method @IntRange(from=15, to=65535) public int getMaxReadLength(); + method @IntRange(from=5, to=32767) public int getMaxSize(); + method @IntRange(from=13, to=65535) public int getMaxWriteLength(); + method public int getReadAccess(); + method public int getVersion(); + method public int getWriteAccess(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.nfc.T4tNdefNfceeCcFileInfo> CREATOR; + field public static final int READ_ACCESS_GRANTED_RESTRICTED = 128; // 0x80 + field public static final int READ_ACCESS_GRANTED_UNRESTRICTED = 0; // 0x0 + field public static final int VERSION_2_0 = 32; // 0x20 + field public static final int VERSION_3_0 = 48; // 0x30 + field public static final int WRITE_ACCESS_GRANTED_RESTRICTED = 128; // 0x80 + field public static final int WRITE_ACCESS_GRANTED_UNRESTRICTED = 0; // 0x0 + field public static final int WRITE_ACCESS_NOT_GRANTED = 255; // 0xff + } + } package android.nfc.cardemulation { diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl index 7ed6019c31b7..13e6734d6e48 100644 --- a/nfc/java/android/nfc/INfcAdapter.aidl +++ b/nfc/java/android/nfc/INfcAdapter.aidl @@ -31,6 +31,7 @@ import android.nfc.INfcCardEmulation; import android.nfc.INfcFCardEmulation; import android.nfc.INfcOemExtensionCallback; import android.nfc.INfcUnlockHandler; +import android.nfc.IT4tNdefNfcee; import android.nfc.ITagRemovedCallback; import android.nfc.INfcDta; import android.nfc.INfcWlcStateListener; @@ -122,4 +123,5 @@ interface INfcAdapter void indicateDataMigration(boolean inProgress, String pkg); int commitRouting(); boolean isTagIntentAllowed(in String pkg, in int Userid); + IT4tNdefNfcee getT4tNdefNfceeInterface(); } diff --git a/nfc/java/android/nfc/IT4tNdefNfcee.aidl b/nfc/java/android/nfc/IT4tNdefNfcee.aidl new file mode 100644 index 000000000000..b4cda5b022fb --- /dev/null +++ b/nfc/java/android/nfc/IT4tNdefNfcee.aidl @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright (C) 2024 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.nfc.T4tNdefNfceeCcFileInfo; + +/** + * @hide + */ +interface IT4tNdefNfcee { + int writeData(in int fileId, in byte[] data); + byte[] readData(in int fileId); + int clearNdefData(); + boolean isNdefOperationOngoing(); + boolean isNdefNfceeEmulationSupported(); + T4tNdefNfceeCcFileInfo readCcfile(); +} diff --git a/nfc/java/android/nfc/NfcAdapter.java b/nfc/java/android/nfc/NfcAdapter.java index 056844f38f3c..89ce4239cd4d 100644 --- a/nfc/java/android/nfc/NfcAdapter.java +++ b/nfc/java/android/nfc/NfcAdapter.java @@ -589,6 +589,7 @@ public final class NfcAdapter { static INfcTag sTagService; static INfcCardEmulation sCardEmulationService; static INfcFCardEmulation sNfcFCardEmulationService; + static IT4tNdefNfcee sNdefNfceeService; /** * The NfcAdapter object for each application context. @@ -827,7 +828,13 @@ public final class NfcAdapter { throw new UnsupportedOperationException(); } } - + try { + sNdefNfceeService = sService.getT4tNdefNfceeInterface(); + } catch (RemoteException e) { + sNdefNfceeService = null; + Log.e(TAG, "could not retrieve NDEF NFCEE service"); + throw new UnsupportedOperationException(); + } sIsInitialized = true; } NfcAdapter adapter = sNfcAdapters.get(context); diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java index b2e672e7997c..ac7b8bb6af7e 100644 --- a/nfc/java/android/nfc/NfcOemExtension.java +++ b/nfc/java/android/nfc/NfcOemExtension.java @@ -492,6 +492,28 @@ public final class NfcOemExtension { } /** + * Get an instance of {@link T4tNdefNfcee} object for performing T4T (Type-4 Tag) + * NDEF (NFC Data Exchange Format) NFCEE (NFC Execution Environment) operations. + * This can be used to write NDEF data to emulate a T4T tag in an NFCEE + * (NFC Execution Environment - eSE, SIM, etc). Refer to the NFC forum specification + * "NFCForum-TS-NCI-2.3 section 10.4" and "NFCForum-TS-T4T-1.1 section 4.2" for more details. + * + * This is a singleton object which shall be used by OEM extension module to do NDEF-NFCEE + * read/write operations. + * + * <p>Returns {@link T4tNdefNfcee} + * <p>Does not cause any RF activity and does not block. + * @return NFC Data Exchange Format (NDEF) NFC Execution Environment (NFCEE) object + * @hide + */ + @SystemApi + @NonNull + @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) + public T4tNdefNfcee getT4tNdefNfcee() { + return T4tNdefNfcee.getInstance(); + } + + /** * Register an {@link Callback} to listen for NFC oem extension callbacks * Multiple clients can register and callbacks will be invoked asynchronously. * diff --git a/nfc/java/android/nfc/T4tNdefNfcee.java b/nfc/java/android/nfc/T4tNdefNfcee.java new file mode 100644 index 000000000000..06d02c54eb2e --- /dev/null +++ b/nfc/java/android/nfc/T4tNdefNfcee.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2024 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.annotation.FlaggedApi; +import android.annotation.IntDef; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; +import android.annotation.WorkerThread; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * This class is used for performing T4T (Type-4 Tag) NDEF (NFC Data Exchange Format) + * NFCEE (NFC Execution Environment) operations. + * This can be used to write NDEF data to emulate a T4T tag in an NFCEE + * (NFC Execution Environment - eSE, SIM, etc). Refer to the NFC forum specification + * "NFCForum-TS-NCI-2.3 section 10.4" and "NFCForum-TS-T4T-1.1 section 4.2" for more details. + * @hide + */ +@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) +@SystemApi +public final class T4tNdefNfcee { + private static final String TAG = "NdefNfcee"; + static T4tNdefNfcee sNdefNfcee; + + private T4tNdefNfcee() { + } + + /** + * Helper to get an instance of this class. + * + * @return + * @hide + */ + @NonNull + public static T4tNdefNfcee getInstance() { + if (sNdefNfcee == null) { + sNdefNfcee = new T4tNdefNfcee(); + } + return sNdefNfcee; + } + + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data is successful. + */ + public static final int WRITE_DATA_SUCCESS = 0; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to unknown reasons. + */ + public static final int WRITE_DATA_ERROR_INTERNAL = -1; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to ongoing rf activity. + */ + public static final int WRITE_DATA_ERROR_RF_ACTIVATED = -2; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to Nfc off. + */ + public static final int WRITE_DATA_ERROR_NFC_NOT_ON = -3; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to invalid file id. + */ + public static final int WRITE_DATA_ERROR_INVALID_FILE_ID = -4; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to invalid length. + */ + public static final int WRITE_DATA_ERROR_INVALID_LENGTH = -5; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to core connection create failure. + */ + public static final int WRITE_DATA_ERROR_CONNECTION_FAILED = -6; + /** + * Return flag for {@link #writeData(int, byte[])}. + * It indicates write data fail due to empty payload. + */ + public static final int WRITE_DATA_ERROR_EMPTY_PAYLOAD = -7; + /** + * Returns flag for {@link #writeData(int, byte[])}. + * It idicates write data fail due to invalid ndef format. + */ + public static final int WRITE_DATA_ERROR_NDEF_VALIDATION_FAILED = -8; + + /** + * Possible return values for {@link #writeData(int, byte[])}. + * + * @hide + */ + @IntDef(prefix = { "WRITE_DATA_" }, value = { + WRITE_DATA_SUCCESS, + WRITE_DATA_ERROR_INTERNAL, + WRITE_DATA_ERROR_RF_ACTIVATED, + WRITE_DATA_ERROR_NFC_NOT_ON, + WRITE_DATA_ERROR_INVALID_FILE_ID, + WRITE_DATA_ERROR_INVALID_LENGTH, + WRITE_DATA_ERROR_CONNECTION_FAILED, + WRITE_DATA_ERROR_EMPTY_PAYLOAD, + WRITE_DATA_ERROR_NDEF_VALIDATION_FAILED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface WriteDataStatus{} + + /** + * This API performs writes of T4T data to NFCEE. + * + * <p>This is an I/O operation and will block until complete. It must + * not be called from the main application thread.</p> + * + * @param fileId File id (Refer NFC Forum Type 4 Tag Specification + * Section 4.2 File Identifiers and Access Conditions + * for more information) to which to write. + * @param data This should be valid Ndef Message format. + * Refer to Nfc forum NDEF specification NDEF Message section + * @return status of the operation. + * @hide + */ + @SystemApi + @WorkerThread + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public @WriteDataStatus int writeData(@IntRange(from = 0, to = 65535) int fileId, + @NonNull byte[] data) { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.writeData(fileId, data), WRITE_DATA_ERROR_INTERNAL); + } + + /** + * This API performs reading of T4T content of Nfcee. + * + * <p>This is an I/O operation and will block until complete. It must + * not be called from the main application thread.</p> + * + * @param fileId File Id (Refer + * Section 4.2 File Identifiers and Access Conditions + * for more information) from which to read. + * @return - Returns Ndef message if success + * Refer to Nfc forum NDEF specification NDEF Message section + * @throws IllegalStateException if read fails because the fileId is invalid. + * @hide + */ + @SystemApi + @WorkerThread + @NonNull + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public byte[] readData(@IntRange(from = 0, to = 65535) int fileId) { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.readData(fileId), null); + } + + /** + * Return flag for {@link #clearNdefData()}. + * It indicates clear data is successful. + */ + public static final int CLEAR_DATA_SUCCESS = 1; + /** + * Return flag for {@link #clearNdefData()}. + * It indicates clear data failed due to internal error while processing the clear. + */ + public static final int CLEAR_DATA_FAILED_INTERNAL = 0; + + /** + * Possible return values for {@link #clearNdefData()}. + * + * @hide + */ + @IntDef(prefix = { "CLEAR_DATA_" }, value = { + CLEAR_DATA_SUCCESS, + CLEAR_DATA_FAILED_INTERNAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ClearDataStatus{} + + /** + * This API will set all the T4T NDEF NFCEE data to zero. + * + * <p>This is an I/O operation and will block until complete. It must + * not be called from the main application thread. + * + * <p>This API can be called regardless of NDEF file lock state. + * </p> + * @return status of the operation + * + * @hide + */ + @SystemApi + @WorkerThread + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public @ClearDataStatus int clearData() { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.clearNdefData(), CLEAR_DATA_FAILED_INTERNAL); + } + + /** + * Returns whether NDEF NFCEE operation is ongoing or not. + * + * @return true if NDEF NFCEE operation is ongoing, else false. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public boolean isOperationOngoing() { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.isNdefOperationOngoing(), false); + } + + /** + * This Api is to check the status of NDEF NFCEE emulation feature is + * supported or not. + * + * @return true if NDEF NFCEE emulation feature is supported, else false. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + public boolean isSupported() { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.isNdefNfceeEmulationSupported(), false); + } + + /** + * This API performs reading of T4T NDEF NFCEE CC file content. + * + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" for more details. + * + * @return Returns CC file content if success or null if failed to read. + * @hide + */ + @SystemApi + @WorkerThread + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + @Nullable + public T4tNdefNfceeCcFileInfo readCcfile() { + return NfcAdapter.callServiceReturn(() -> + NfcAdapter.sNdefNfceeService.readCcfile(), null); + } +} diff --git a/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.aidl b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.aidl new file mode 100644 index 000000000000..f72f74e8b3b9 --- /dev/null +++ b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.aidl @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2024 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 T4tNdefNfceeCcFileInfo; + diff --git a/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java new file mode 100644 index 000000000000..5fca0529124e --- /dev/null +++ b/nfc/java/android/nfc/T4tNdefNfceeCcFileInfo.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2024 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.annotation.FlaggedApi; +import android.annotation.IntDef; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.SystemApi; +import android.os.Parcel; +import android.os.Parcelable; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * This class is used to represence T4T (Type-4 Tag) NDEF (NFC Data Exchange Format) + * NFCEE (NFC Execution Environment) CC (Capability Container) File data. + * The CC file stores metadata about the T4T tag being emulated. + * + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" for more details. + * @hide + */ +@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION) +@SystemApi +public final class T4tNdefNfceeCcFileInfo implements Parcelable { + /** + * Indicates the size of this capability container (called “CC File”)<p> + */ + private int mCcLength; + /** + * Indicates the mapping specification version<p> + */ + private int mVersion; + /** + * Indicates the max data size by a single ReadBinary<p> + */ + private int mMaxReadLength; + /** + * Indicates the max data size by a single UpdateBinary<p> + */ + private int mMaxWriteLength; + /** + * Indicates the NDEF File Identifier<p> + */ + private int mFileId; + /** + * Indicates the maximum Max NDEF file size<p> + */ + private int mMaxSize; + /** + * Indicates the read access condition<p> + */ + private int mReadAccess; + /** + * Indicates the write access condition<p> + */ + private int mWriteAccess; + + /** + * Constructor to be used by NFC service and internal classes. + * @hide + */ + public T4tNdefNfceeCcFileInfo(int cclen, int version, int maxLe, int maxLc, + int ndefFileId, int ndefMaxSize, + int ndefReadAccess, int ndefWriteAccess) { + mCcLength = cclen; + mVersion = version; + mMaxWriteLength = maxLc; + mMaxReadLength = maxLe; + mFileId = ndefFileId; + mMaxSize = ndefMaxSize; + mReadAccess = ndefReadAccess; + mWriteAccess = ndefWriteAccess; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + + dest.writeInt(mCcLength); + dest.writeInt(mVersion); + dest.writeInt(mMaxWriteLength); + dest.writeInt(mMaxReadLength); + dest.writeInt(mFileId); + dest.writeInt(mMaxSize); + dest.writeInt(mReadAccess); + dest.writeInt(mWriteAccess); + } + + /** + * Indicates the size of this capability container (called “CC File”). + * + * @return length of the CC file. + */ + @IntRange(from = 0xf, to = 0x7fff) + public int getCcFileLength() { + return mCcLength; + } + + /** + * T4T tag mapping version 2.0. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" for more details. + */ + public static final int VERSION_2_0 = 0x20; + /** + * T4T tag mapping version 2.0. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" for more details. + */ + public static final int VERSION_3_0 = 0x30; + + /** + * Possible return values for {@link #getVersion()}. + * @hide + */ + @IntDef(prefix = { "VERSION_" }, value = { + VERSION_2_0, + VERSION_3_0, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Version{} + + /** + * Indicates the mapping version of the T4T tag supported. + * + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.5" for more details. + * + * @return version of the specification + */ + @Version + public int getVersion() { + return mVersion; + } + + /** + * Indicates the max data size that can be read by a single invocation of + * {@link T4tNdefNfcee#readData(int)}. + * + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" MLe. + * @return max size of read (in bytes). + */ + @IntRange(from = 0xf, to = 0xffff) + public int getMaxReadLength() { + return mMaxReadLength; + } + + /** + * Indicates the max data size that can be written by a single invocation of + * {@link T4tNdefNfcee#writeData(int, byte[])} + * + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.4" MLc. + * @return max size of write (in bytes). + */ + @IntRange(from = 0xd, to = 0xffff) + public int getMaxWriteLength() { + return mMaxWriteLength; + } + + /** + * Indicates the NDEF File Identifier. This is the identifier used in the last invocation of + * {@link T4tNdefNfcee#writeData(int, byte[])} + * + * @return FileId of the data stored or -1 if no data is present. + */ + @IntRange(from = -1, to = 65535) + public int getFileId() { + return mFileId; + } + + /** + * Indicates the maximum size of T4T NDEF data that can be written to the NFCEE. + * + * @return max size of the contents. + */ + @IntRange(from = 0x5, to = 0x7fff) + public int getMaxSize() { + return mMaxSize; + } + + /** + * T4T tag read access granted without any security. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + */ + public static final int READ_ACCESS_GRANTED_UNRESTRICTED = 0x0; + /** + * T4T tag read access granted with limited proprietary access only. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + */ + public static final int READ_ACCESS_GRANTED_RESTRICTED = 0x80; + + /** + * Possible return values for {@link #getVersion()}. + * @hide + */ + @IntDef(prefix = { "READ_ACCESS_GRANTED_" }, value = { + READ_ACCESS_GRANTED_RESTRICTED, + READ_ACCESS_GRANTED_UNRESTRICTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ReadAccess {} + + /** + * Indicates the read access condition. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + * @return read access restriction + */ + @ReadAccess + public int getReadAccess() { + return mReadAccess; + } + + /** + * T4T tag write access granted without any security. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + */ + public static final int WRITE_ACCESS_GRANTED_UNRESTRICTED = 0x0; + /** + * T4T tag write access granted with limited proprietary access only. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + */ + public static final int WRITE_ACCESS_GRANTED_RESTRICTED = 0x80; + /** + * T4T tag write access not granted. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + */ + public static final int WRITE_ACCESS_NOT_GRANTED = 0xFF; + + /** + * Possible return values for {@link #getVersion()}. + * @hide + */ + @IntDef(prefix = { "READ_ACCESS_GRANTED_" }, value = { + WRITE_ACCESS_GRANTED_RESTRICTED, + WRITE_ACCESS_GRANTED_UNRESTRICTED, + WRITE_ACCESS_NOT_GRANTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface WriteAccess {} + + /** + * Indicates the write access condition. + * Refer to the NFC forum specification "NFCForum-TS-T4T-1.1 section 4.2" for more details. + * @return write access restriction + */ + @WriteAccess + public int getWriteAccess() { + return mWriteAccess; + } + + @Override + public int describeContents() { + return 0; + } + + public static final @NonNull Parcelable.Creator<T4tNdefNfceeCcFileInfo> CREATOR = + new Parcelable.Creator<>() { + @Override + public T4tNdefNfceeCcFileInfo createFromParcel(Parcel in) { + + // NdefNfceeCcFileInfo fields + int cclen = in.readInt(); + int version = in.readInt(); + int maxLe = in.readInt(); + int maxLc = in.readInt(); + int ndefFileId = in.readInt(); + int ndefMaxSize = in.readInt(); + int ndefReadAccess = in.readInt(); + int ndefWriteAccess = in.readInt(); + + return new T4tNdefNfceeCcFileInfo(cclen, version, maxLe, maxLc, + ndefFileId, ndefMaxSize, + ndefReadAccess, ndefWriteAccess); + } + + @Override + public T4tNdefNfceeCcFileInfo[] newArray(int size) { + return new T4tNdefNfceeCcFileInfo[size]; + } + }; +} |