blob: 3efe49236de913dca9dca136a86e22163891e36a [file] [log] [blame]
Nick Pelly367f41f2011-03-08 11:43:30 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.nfc_extras;
18
19import java.io.IOException;
20
21import android.annotation.SdkConstant;
22import android.annotation.SdkConstant.SdkConstantType;
23import android.content.Context;
24import android.nfc.INfcAdapterExtras;
25import android.nfc.NfcAdapter;
26import android.os.Binder;
27import android.os.Bundle;
28import android.os.IBinder;
29import android.os.RemoteException;
30
31public class NfcExecutionEnvironment {
32 private final INfcAdapterExtras mService;
33
34 /**
35 * Broadcast Action: An ISO-DEP AID was selected.
36 *
37 * <p>This happens as the result of a 'SELECT AID' command from an
38 * external NFC reader/writer.
39 *
40 * <p>Always contains the extra field {@link #EXTRA_AID}
41 *
42 * <p class="note">
43 * Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission
44 * to receive.
45 */
46 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
47 public static final String ACTION_AID_SELECTED =
48 "com.android.nfc_extras.action.AID_SELECTED";
49
50 /**
51 * Mandatory byte array extra field in {@link #ACTION_AID_SELECTED}.
52 *
53 * <p>Contains the AID selected.
54 * @hide
55 */
56 public static final String EXTRA_AID = "com.android.nfc_extras.extra.AID";
57
58 NfcExecutionEnvironment(INfcAdapterExtras service) {
59 mService = service;
60 }
61
62 /**
63 * Open the NFC Execution Environment on its contact interface.
64 *
65 * <p>Only one process may open the secure element at a time. If it is
66 * already open, an {@link IOException} is thrown.
67 *
68 * <p>All other NFC functionality is disabled while the NFC-EE is open
69 * on its contact interface, so make sure to call {@link #close} once complete.
70 *
71 * <p class="note">
72 * Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
73 *
74 * @throws IOException if the NFC-EE is already open, or some other error occurs
75 */
76 public void open() throws IOException {
77 try {
78 Bundle b = mService.open(new Binder());
79 throwBundle(b);
80 } catch (RemoteException e) {
81 return;
82 }
83 }
84
85 /**
86 * Close the NFC Execution Environment on its contact interface.
87 *
88 * <p class="note">
89 * Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
90 *
91 * @throws IOException if the NFC-EE is already open, or some other error occurs
92 */
93 public void close() throws IOException {
94 try {
95 throwBundle(mService.close());
96 } catch (RemoteException e) {
97 return;
98 }
99 }
100
101 /**
102 * Send raw commands to the NFC-EE and receive the response.
103 *
104 * <p class="note">
105 * Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
106 *
107 * @throws IOException if the NFC-EE is not open, or some other error occurs
108 */
109 public byte[] transceive(byte[] in) throws IOException {
110 Bundle b;
111 try {
112 b = mService.transceive(in);
113 } catch (RemoteException e) {
114 throw new IOException(e.getMessage());
115 }
116 throwBundle(b);
117 return b.getByteArray("out");
118 }
119
120 private static void throwBundle(Bundle b) throws IOException {
121 if (b.getInt("e") == -1) {
122 throw new IOException(b.getString("m"));
123 }
124 }
125}