1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License.
6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at
7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and
14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License.
15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpackage com.android.nfc.dhimpl;
18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.content.Context;
20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.ErrorCodes;
21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.tech.Ndef;
22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.tech.TagTechnology;
23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.util.Log;
24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
259f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenimport com.android.nfc.DeviceHost;
269f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenimport com.android.nfc.LlcpException;
270799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesimport com.android.nfc.NfcDiscoveryParameters;
289f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/**
30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Native interface to the NFC Manager functions
31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpublic class NativeNfcManager implements DeviceHost {
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private static final String TAG = "NativeNfcManager";
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static final String PREF = "NciDeviceHost";
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static final int DEFAULT_LLCP_MIU = 1980;
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static final int DEFAULT_LLCP_RWSIZE = 2;
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static final String DRIVER_NAME = "android-nci";
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static {
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        System.loadLibrary("nfc_nci_jni");
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
45d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Native structure */
47fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales    private long mNative;
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private final DeviceHostListener mListener;
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private final Context mContext;
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
52d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public NativeNfcManager(Context context, DeviceHostListener listener) {
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mListener = listener;
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        initializeNativeStructure();
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mContext = context;
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public native boolean initializeNativeStructure();
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native boolean doDownload();
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public native int doGetLastError();
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public void checkFirmware() {
67a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        doDownload();
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
70304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen    private native boolean doInitialize();
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
73304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen    public boolean initialize() {
74304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen        return doInitialize();
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native boolean doDeinitialize();
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public boolean deinitialize() {
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return doDeinitialize();
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public String getName() {
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return DRIVER_NAME;
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    public native boolean sendRawFrame(byte[] data);
919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    @Override
939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    public native boolean routeAid(byte[] aid, int route);
949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    @Override
969f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    public native boolean unrouteAid(byte[] aid);
979f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
98f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    @Override
99f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    public native boolean commitRouting();
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1010799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    private native void doEnableDiscovery(int techMask,
1020799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                                          boolean enableLowPowerPolling,
1030799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                                          boolean enableReaderMode,
1040799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                                          boolean enableHostRouting,
1050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                                          boolean restart);
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
1070799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    public void enableDiscovery(NfcDiscoveryParameters params, boolean restart) {
1080799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        doEnableDiscovery(params.getTechMask(), params.shouldEnableLowPowerDiscovery(),
1090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                params.shouldEnableReaderMode(), params.shouldEnableHostRouting(), restart);
1100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
1119f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
1129f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    @Override
1130799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    public native void disableDiscovery();
1149f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native NativeLlcpConnectionlessSocket doCreateLlcpConnectionlessSocket(int nSap,
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            String sn);
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public LlcpConnectionlessSocket createLlcpConnectionlessSocket(int nSap, String sn)
120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            throws LlcpException {
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        LlcpConnectionlessSocket socket = doCreateLlcpConnectionlessSocket(nSap, sn);
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (socket != null) {
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            return socket;
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        } else {
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            /* Get Error Status */
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int error = doGetLastError();
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            switch (error) {
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_BUFFER_TO_SMALL:
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(error);
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                default:
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native NativeLlcpServiceSocket doCreateLlcpServiceSocket(int nSap, String sn, int miu,
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int rw, int linearBufferLength);
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public LlcpServerSocket createLlcpServerSocket(int nSap, String sn, int miu,
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int rw, int linearBufferLength) throws LlcpException {
145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        LlcpServerSocket socket = doCreateLlcpServiceSocket(nSap, sn, miu, rw, linearBufferLength);
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (socket != null) {
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            return socket;
148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        } else {
149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            /* Get Error Status */
150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int error = doGetLastError();
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            switch (error) {
155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_BUFFER_TO_SMALL:
156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(error);
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                default:
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native NativeLlcpSocket doCreateLlcpSocket(int sap, int miu, int rw,
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int linearBufferLength);
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public LlcpSocket createLlcpSocket(int sap, int miu, int rw,
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int linearBufferLength) throws LlcpException {
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        LlcpSocket socket = doCreateLlcpSocket(sap, miu, rw, linearBufferLength);
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (socket != null) {
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            return socket;
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        } else {
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            /* Get Error Status */
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            int error = doGetLastError();
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            switch (error) {
179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_BUFFER_TO_SMALL:
180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(error);
182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                default:
183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public native boolean doCheckLlcp();
190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public native boolean doActivateLlcp();
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native void doResetTimeouts();
195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public void resetTimeouts() {
198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        doResetTimeouts();
199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public native void doAbort();
203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native boolean doSetTimeout(int tech, int timeout);
205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public boolean setTimeout(int tech, int timeout) {
207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return doSetTimeout(tech, timeout);
208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native int doGetTimeout(int tech);
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public int getTimeout(int tech) {
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return doGetTimeout(tech);
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public boolean canMakeReadOnly(int ndefType) {
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return (ndefType == Ndef.TYPE_1 || ndefType == Ndef.TYPE_2);
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public int getMaxTransceiveLength(int technology) {
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        switch (technology) {
225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.NFC_A):
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.MIFARE_CLASSIC):
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.MIFARE_ULTRALIGHT):
228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.NFC_B):
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /////////////////////////////////////////////////////////////////
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Broadcom: Since BCM2079x supports this, set NfcB max size.
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //return 0; // PN544 does not support transceive of raw NfcB
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 253; // PN544 does not support transceive of raw NfcB
234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.NFC_V):
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.ISO_DEP):
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /* The maximum length of a normal IsoDep frame consists of:
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                 * CLA, INS, P1, P2, LC, LE + 255 payload bytes = 261 bytes
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                 * such a frame is supported. Extended length frames however
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                 * are not supported.
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                 */
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 261; // Will be automatically split in two frames on the RF layer
243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            case (TagTechnology.NFC_F):
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 252; // PN544 RF buffer = 255 bytes, subtract one for SoD, two for CRC
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            default:
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                return 0;
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native void doSetP2pInitiatorModes(int modes);
252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public void setP2pInitiatorModes(int modes) {
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        doSetP2pInitiatorModes(modes);
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native void doSetP2pTargetModes(int modes);
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public void setP2pTargetModes(int modes) {
260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        doSetP2pTargetModes(modes);
261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
262c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public boolean getExtendedLengthApdusSupported() {
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // TODO check BCM support
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public int getDefaultLlcpMiu() {
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return DEFAULT_LLCP_MIU;
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public int getDefaultLlcpRwSize() {
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return DEFAULT_LLCP_RWSIZE;
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private native String doDump();
280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    @Override
281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    public String dump() {
282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return doDump();
283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
285d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    private native void doEnableScreenOffSuspend();
286d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    @Override
287d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    public boolean enableScreenOffSuspend() {
288d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        doEnableScreenOffSuspend();
289d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        return true;
290d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    }
291d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
292d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    private native void doDisableScreenOffSuspend();
293d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    @Override
294d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    public boolean disableScreenOffSuspend() {
295d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        doDisableScreenOffSuspend();
296d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        return true;
297d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    }
298d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /**
300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     * Notifies Ndef Message (TODO: rename into notifyTargetDiscovered)
301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     */
302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private void notifyNdefMessageListeners(NativeNfcTag tag) {
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mListener.onRemoteEndpointDiscovered(tag);
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /**
307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     * Notifies P2P Device detected, to activate LLCP link
308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     */
309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private void notifyLlcpLinkActivation(NativeP2pDevice device) {
310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mListener.onLlcpLinkActivated(device);
311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /**
314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     * Notifies P2P Device detected, to activate LLCP link
315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project     */
316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    private void notifyLlcpLinkDeactivated(NativeP2pDevice device) {
317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mListener.onLlcpLinkDeactivated(device);
318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
32057a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    /**
32157a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen     * Notifies first packet received from remote LLCP
32257a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen     */
32357a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    private void notifyLlcpLinkFirstPacketReceived(NativeP2pDevice device) {
32457a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        mListener.onLlcpFirstPacketReceived(device);
32557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    }
32657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen
3279f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    private void notifyHostEmuActivated() {
3289f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen        mListener.onHostCardEmulationActivated();
3299f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    }
3309f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
3319f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    private void notifyHostEmuData(byte[] data) {
3329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen        mListener.onHostCardEmulationData(data);
3339f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    }
3349f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
3359f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    private void notifyHostEmuDeactivated() {
3369f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen        mListener.onHostCardEmulationDeactivated();
3379f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    }
338c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen
339c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    private void notifyRfFieldActivated() {
340c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        mListener.onRemoteFieldActivated();
341c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    }
342c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen
343c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    private void notifyRfFieldDeactivated() {
344c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        mListener.onRemoteFieldDeactivated();
345c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    }
346c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen
347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
348