From b54567810f00c4db62398c0af2d2bfcf7983e4c1 Mon Sep 17 00:00:00 2001 From: Love Khanna Date: Wed, 17 May 2017 15:52:16 +0530 Subject: [PATCH] NFC DTA Integration Test: compiles. Merged-In: I07cbb321ffbdbe9d93d632c8a56f3bc53218e592 Change-Id: I07cbb321ffbdbe9d93d632c8a56f3bc53218e592 --- Android.mk | 1 + core/java/android/nfc/INfcAdapter.aidl | 3 +- core/java/android/nfc/INfcDta.aidl | 34 +++++++ core/java/android/nfc/NfcAdapter.java | 20 +++- core/java/android/nfc/dta/NfcDta.java | 167 +++++++++++++++++++++++++++++++++ 5 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 core/java/android/nfc/INfcDta.aidl create mode 100644 core/java/android/nfc/dta/NfcDta.java diff --git a/Android.mk b/Android.mk index 981d0249c1b6..8b74585f6cb4 100644 --- a/Android.mk +++ b/Android.mk @@ -243,6 +243,7 @@ LOCAL_SRC_FILES += \ core/java/android/nfc/INfcCardEmulation.aidl \ core/java/android/nfc/INfcFCardEmulation.aidl \ core/java/android/nfc/INfcUnlockHandler.aidl \ + core/java/android/nfc/INfcDta.aidl \ core/java/android/nfc/ITagRemovedCallback.aidl \ core/java/android/os/IBatteryPropertiesListener.aidl \ core/java/android/os/IBatteryPropertiesRegistrar.aidl \ diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index f991efed07eb..6801618e6a68 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -29,6 +29,7 @@ import android.nfc.INfcCardEmulation; import android.nfc.INfcFCardEmulation; import android.nfc.INfcUnlockHandler; import android.nfc.ITagRemovedCallback; +import android.nfc.INfcDta; import android.os.Bundle; /** @@ -40,7 +41,7 @@ interface INfcAdapter INfcCardEmulation getNfcCardEmulationInterface(); INfcFCardEmulation getNfcFCardEmulationInterface(); INfcAdapterExtras getNfcAdapterExtrasInterface(in String pkg); - + INfcDta getNfcDtaInterface(in String pkg); int getState(); boolean disable(boolean saveState); boolean enable(); diff --git a/core/java/android/nfc/INfcDta.aidl b/core/java/android/nfc/INfcDta.aidl new file mode 100644 index 000000000000..4cc59271362b --- /dev/null +++ b/core/java/android/nfc/INfcDta.aidl @@ -0,0 +1,34 @@ + /* + * Copyright (C) 2017 NXP Semiconductors + * + * 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.Bundle; + +/** + * {@hide} + */ +interface INfcDta { + + void enableDta(); + void disableDta(); + boolean enableServer(String serviceName, int serviceSap, int miu, + int rwSize,int testCaseId); + void disableServer(); + boolean enableClient(String serviceName, int miu, int rwSize, + int testCaseId); + void disableClient(); + boolean registerMessageService(String msgServiceName); +} diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 48869c71b685..debef6310f14 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -16,8 +16,6 @@ package android.nfc; -import java.util.HashMap; - import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -43,6 +41,7 @@ import android.os.ServiceManager; import android.util.Log; import java.io.IOException; +import java.util.HashMap; /** * Represents the local NFC adapter. @@ -627,6 +626,23 @@ public final class NfcAdapter { } /** + * Returns the binder interface to the NFC-DTA test interface. + * @hide + */ + public INfcDta getNfcDtaInterface() { + if (mContext == null) { + throw new UnsupportedOperationException("You need a context on NfcAdapter to use the " + + " NFC extras APIs"); + } + try { + return sService.getNfcDtaInterface(mContext.getPackageName()); + } catch (RemoteException e) { + attemptDeadServiceRecovery(e); + return null; + } + } + + /** * NFC service dead - attempt best effort recovery * @hide */ diff --git a/core/java/android/nfc/dta/NfcDta.java b/core/java/android/nfc/dta/NfcDta.java new file mode 100644 index 000000000000..88016623434d --- /dev/null +++ b/core/java/android/nfc/dta/NfcDta.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2017 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.dta; + +import android.content.Context; +import android.nfc.INfcDta; +import android.nfc.NfcAdapter; +import android.os.RemoteException; +import android.util.Log; + +import java.util.HashMap; + +/** + * This class provides the primary API for DTA operations. + * @hide + */ +public final class NfcDta { + private static final String TAG = "NfcDta"; + + private static INfcDta sService; + private static HashMap sNfcDtas = new HashMap(); + + private final Context mContext; + + private NfcDta(Context context, INfcDta service) { + mContext = context.getApplicationContext(); + sService = service; + } + + /** + * Helper to get an instance of this class. + * + * @param adapter A reference to an NfcAdapter object. + * @return + */ + public static synchronized NfcDta getInstance(NfcAdapter adapter) { + if (adapter == null) throw new NullPointerException("NfcAdapter is null"); + Context context = adapter.getContext(); + if (context == null) { + Log.e(TAG, "NfcAdapter context is null."); + throw new UnsupportedOperationException(); + } + + NfcDta manager = sNfcDtas.get(context); + if (manager == null) { + INfcDta service = adapter.getNfcDtaInterface(); + if (service == null) { + Log.e(TAG, "This device does not implement the INfcDta interface."); + throw new UnsupportedOperationException(); + } + manager = new NfcDta(context, service); + sNfcDtas.put(context, manager); + } + return manager; + } + + /** + * Enables DTA mode + * + * @return true/false if enabling was successful + */ + public boolean enableDta() { + try { + sService.enableDta(); + } catch (RemoteException e) { + return false; + } + return true; + } + + /** + * Disables DTA mode + * + * @return true/false if disabling was successful + */ + public boolean disableDta() { + try { + sService.disableDta(); + } catch (RemoteException e) { + return false; + } + return true; + } + + /** + * Enables Server + * + * @return true/false if enabling was successful + */ + public boolean enableServer(String serviceName, int serviceSap, int miu, + int rwSize, int testCaseId) { + try { + return sService.enableServer(serviceName, serviceSap, miu, rwSize, testCaseId); + } catch (RemoteException e) { + return false; + } + } + + /** + * Disables Server + * + * @return true/false if disabling was successful + */ + public boolean disableServer() { + try { + sService.disableServer(); + } catch (RemoteException e) { + return false; + } + return true; + } + + /** + * Enables Client + * + * @return true/false if enabling was successful + */ + public boolean enableClient(String serviceName, int miu, int rwSize, + int testCaseId) { + try { + return sService.enableClient(serviceName, miu, rwSize, testCaseId); + } catch (RemoteException e) { + return false; + } + } + + /** + * Disables client + * + * @return true/false if disabling was successful + */ + public boolean disableClient() { + try { + sService.disableClient(); + } catch (RemoteException e) { + return false; + } + return true; + } + + /** + * Registers Message Service + * + * @return true/false if registration was successful + */ + public boolean registerMessageService(String msgServiceName) { + try { + return sService.registerMessageService(msgServiceName); + } catch (RemoteException e) { + return false; + } + } +} -- 2.11.0