blob: d00929505d4388e5bbc5547caac8acf76fd1f265 [file] [log] [blame]
Nick Pellyc84c89a2011-08-22 22:27:11 -07001/*
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 android.nfc;
18
19import android.app.Activity;
Nick Pelly8ce7a272012-03-21 15:14:09 -070020import android.app.Application;
Andres Morales56f299b2014-10-31 08:26:33 -070021import android.content.ContentProvider;
Martijn Coenen7fe9fa12014-01-29 17:28:04 -080022import android.content.Intent;
Nick Pelly1d7e9062012-04-03 17:46:00 -070023import android.net.Uri;
Martijn Coenen5b1e0322013-09-02 20:38:47 -070024import android.nfc.NfcAdapter.ReaderCallback;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -070025import android.os.Binder;
Nick Pelly8ce7a272012-03-21 15:14:09 -070026import android.os.Bundle;
Nick Pellyc84c89a2011-08-22 22:27:11 -070027import android.os.RemoteException;
Andres Morales56f299b2014-10-31 08:26:33 -070028import android.os.UserHandle;
Nick Pellyc84c89a2011-08-22 22:27:11 -070029import android.util.Log;
30
Nick Pelly8ce7a272012-03-21 15:14:09 -070031import java.util.ArrayList;
32import java.util.LinkedList;
33import java.util.List;
Nick Pellyc84c89a2011-08-22 22:27:11 -070034
35/**
36 * Manages NFC API's that are coupled to the life-cycle of an Activity.
37 *
Nick Pelly8ce7a272012-03-21 15:14:09 -070038 * <p>Uses {@link Application#registerActivityLifecycleCallbacks} to hook
39 * into activity life-cycle events such as onPause() and onResume().
Nick Pellyc84c89a2011-08-22 22:27:11 -070040 *
41 * @hide
42 */
Martijn Coenen5b1e0322013-09-02 20:38:47 -070043public final class NfcActivityManager extends IAppCallback.Stub
Nick Pelly8ce7a272012-03-21 15:14:09 -070044 implements Application.ActivityLifecycleCallbacks {
Nick Pellyc84c89a2011-08-22 22:27:11 -070045 static final String TAG = NfcAdapter.TAG;
46 static final Boolean DBG = false;
47
48 final NfcAdapter mAdapter;
Nick Pelly8ce7a272012-03-21 15:14:09 -070049 final NfcEvent mDefaultEvent; // cached NfcEvent (its currently always the same)
50
51 // All objects in the lists are protected by this
52 final List<NfcApplicationState> mApps; // Application(s) that have NFC state. Usually one
53 final List<NfcActivityState> mActivities; // Activities that have NFC state
54
55 /**
56 * NFC State associated with an {@link Application}.
57 */
58 class NfcApplicationState {
59 int refCount = 0;
60 final Application app;
61 public NfcApplicationState(Application app) {
62 this.app = app;
63 }
64 public void register() {
65 refCount++;
66 if (refCount == 1) {
67 this.app.registerActivityLifecycleCallbacks(NfcActivityManager.this);
68 }
69 }
70 public void unregister() {
71 refCount--;
72 if (refCount == 0) {
73 this.app.unregisterActivityLifecycleCallbacks(NfcActivityManager.this);
74 } else if (refCount < 0) {
75 Log.e(TAG, "-ve refcount for " + app);
76 }
77 }
78 }
79
80 NfcApplicationState findAppState(Application app) {
81 for (NfcApplicationState appState : mApps) {
82 if (appState.app == app) {
83 return appState;
84 }
85 }
86 return null;
87 }
88
89 void registerApplication(Application app) {
90 NfcApplicationState appState = findAppState(app);
91 if (appState == null) {
92 appState = new NfcApplicationState(app);
93 mApps.add(appState);
94 }
95 appState.register();
96 }
97
98 void unregisterApplication(Application app) {
99 NfcApplicationState appState = findAppState(app);
100 if (appState == null) {
101 Log.e(TAG, "app was not registered " + app);
102 return;
103 }
104 appState.unregister();
105 }
Nick Pellyc84c89a2011-08-22 22:27:11 -0700106
107 /**
108 * NFC state associated with an {@link Activity}
109 */
110 class NfcActivityState {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700111 boolean resumed = false;
112 Activity activity;
113 NdefMessage ndefMessage = null; // static NDEF message
114 NfcAdapter.CreateNdefMessageCallback ndefMessageCallback = null;
115 NfcAdapter.OnNdefPushCompleteCallback onNdefPushCompleteCallback = null;
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700116 NfcAdapter.CreateBeamUrisCallback uriCallback = null;
117 Uri[] uris = null;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800118 int flags = 0;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700119 int readerModeFlags = 0;
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700120 NfcAdapter.ReaderCallback readerCallback = null;
121 Bundle readerModeExtras = null;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700122 Binder token;
123
Nick Pelly8ce7a272012-03-21 15:14:09 -0700124 public NfcActivityState(Activity activity) {
125 if (activity.getWindow().isDestroyed()) {
126 throw new IllegalStateException("activity is already destroyed");
127 }
Martijn Coenen20fe5372012-04-05 10:50:05 -0700128 // Check if activity is resumed right now, as we will not
129 // immediately get a callback for that.
130 resumed = activity.isResumed();
131
Nick Pelly8ce7a272012-03-21 15:14:09 -0700132 this.activity = activity;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700133 this.token = new Binder();
Nick Pelly8ce7a272012-03-21 15:14:09 -0700134 registerApplication(activity.getApplication());
135 }
136 public void destroy() {
137 unregisterApplication(activity.getApplication());
138 resumed = false;
139 activity = null;
140 ndefMessage = null;
141 ndefMessageCallback = null;
142 onNdefPushCompleteCallback = null;
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700143 uriCallback = null;
144 uris = null;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700145 readerModeFlags = 0;
146 token = null;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700147 }
Nick Pellyc84c89a2011-08-22 22:27:11 -0700148 @Override
149 public String toString() {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700150 StringBuilder s = new StringBuilder("[").append(" ");
Nick Pellyc84c89a2011-08-22 22:27:11 -0700151 s.append(ndefMessage).append(" ").append(ndefMessageCallback).append(" ");
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700152 s.append(uriCallback).append(" ");
153 if (uris != null) {
154 for (Uri uri : uris) {
155 s.append(onNdefPushCompleteCallback).append(" ").append(uri).append("]");
156 }
157 }
Nick Pellyc84c89a2011-08-22 22:27:11 -0700158 return s.toString();
159 }
160 }
161
Nick Pelly8ce7a272012-03-21 15:14:09 -0700162 /** find activity state from mActivities */
163 synchronized NfcActivityState findActivityState(Activity activity) {
164 for (NfcActivityState state : mActivities) {
165 if (state.activity == activity) {
166 return state;
167 }
168 }
169 return null;
Nick Pellyc84c89a2011-08-22 22:27:11 -0700170 }
171
Nick Pelly8ce7a272012-03-21 15:14:09 -0700172 /** find or create activity state from mActivities */
173 synchronized NfcActivityState getActivityState(Activity activity) {
174 NfcActivityState state = findActivityState(activity);
175 if (state == null) {
176 state = new NfcActivityState(activity);
177 mActivities.add(state);
Nick Pellyc84c89a2011-08-22 22:27:11 -0700178 }
179 return state;
180 }
181
Nick Pelly8ce7a272012-03-21 15:14:09 -0700182 synchronized NfcActivityState findResumedActivityState() {
183 for (NfcActivityState state : mActivities) {
184 if (state.resumed) {
185 return state;
186 }
187 }
188 return null;
189 }
190
191 synchronized void destroyActivityState(Activity activity) {
192 NfcActivityState activityState = findActivityState(activity);
193 if (activityState != null) {
194 activityState.destroy();
195 mActivities.remove(activityState);
196 }
197 }
198
199 public NfcActivityManager(NfcAdapter adapter) {
200 mAdapter = adapter;
201 mActivities = new LinkedList<NfcActivityState>();
202 mApps = new ArrayList<NfcApplicationState>(1); // Android VM usually has 1 app
203 mDefaultEvent = new NfcEvent(mAdapter);
204 }
205
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700206 public void enableReaderMode(Activity activity, ReaderCallback callback, int flags,
207 Bundle extras) {
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700208 boolean isResumed;
209 Binder token;
210 synchronized (NfcActivityManager.this) {
211 NfcActivityState state = getActivityState(activity);
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700212 state.readerCallback = callback;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700213 state.readerModeFlags = flags;
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700214 state.readerModeExtras = extras;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700215 token = state.token;
216 isResumed = state.resumed;
217 }
218 if (isResumed) {
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700219 setReaderMode(token, flags, extras);
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700220 }
221 }
222
223 public void disableReaderMode(Activity activity) {
224 boolean isResumed;
225 Binder token;
226 synchronized (NfcActivityManager.this) {
227 NfcActivityState state = getActivityState(activity);
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700228 state.readerCallback = null;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700229 state.readerModeFlags = 0;
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700230 state.readerModeExtras = null;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700231 token = state.token;
232 isResumed = state.resumed;
233 }
234 if (isResumed) {
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700235 setReaderMode(token, 0, null);
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700236 }
237
238 }
239
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700240 public void setReaderMode(Binder token, int flags, Bundle extras) {
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700241 if (DBG) Log.d(TAG, "Setting reader mode");
242 try {
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700243 NfcAdapter.sService.setReaderMode(token, this, flags, extras);
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700244 } catch (RemoteException e) {
245 mAdapter.attemptDeadServiceRecovery(e);
246 }
247 }
248
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700249 public void setNdefPushContentUri(Activity activity, Uri[] uris) {
Nick Pelly1d7e9062012-04-03 17:46:00 -0700250 boolean isResumed;
251 synchronized (NfcActivityManager.this) {
252 NfcActivityState state = getActivityState(activity);
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700253 state.uris = uris;
254 isResumed = state.resumed;
255 }
256 if (isResumed) {
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800257 // requestNfcServiceCallback() verifies permission also
Martijn Coenen1360c552013-01-07 16:34:20 -0800258 requestNfcServiceCallback();
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800259 } else {
260 // Crash API calls early in case NFC permission is missing
261 verifyNfcPermission();
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700262 }
263 }
264
265
266 public void setNdefPushContentUriCallback(Activity activity,
267 NfcAdapter.CreateBeamUrisCallback callback) {
268 boolean isResumed;
269 synchronized (NfcActivityManager.this) {
270 NfcActivityState state = getActivityState(activity);
271 state.uriCallback = callback;
Nick Pelly1d7e9062012-04-03 17:46:00 -0700272 isResumed = state.resumed;
273 }
274 if (isResumed) {
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800275 // requestNfcServiceCallback() verifies permission also
Martijn Coenen1360c552013-01-07 16:34:20 -0800276 requestNfcServiceCallback();
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800277 } else {
278 // Crash API calls early in case NFC permission is missing
279 verifyNfcPermission();
Nick Pelly1d7e9062012-04-03 17:46:00 -0700280 }
281 }
282
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800283 public void setNdefPushMessage(Activity activity, NdefMessage message, int flags) {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700284 boolean isResumed;
285 synchronized (NfcActivityManager.this) {
286 NfcActivityState state = getActivityState(activity);
287 state.ndefMessage = message;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800288 state.flags = flags;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700289 isResumed = state.resumed;
290 }
291 if (isResumed) {
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800292 // requestNfcServiceCallback() verifies permission also
Martijn Coenen1360c552013-01-07 16:34:20 -0800293 requestNfcServiceCallback();
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800294 } else {
295 // Crash API calls early in case NFC permission is missing
296 verifyNfcPermission();
Nick Pelly8ce7a272012-03-21 15:14:09 -0700297 }
298 }
299
300 public void setNdefPushMessageCallback(Activity activity,
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800301 NfcAdapter.CreateNdefMessageCallback callback, int flags) {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700302 boolean isResumed;
303 synchronized (NfcActivityManager.this) {
304 NfcActivityState state = getActivityState(activity);
305 state.ndefMessageCallback = callback;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800306 state.flags = flags;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700307 isResumed = state.resumed;
308 }
309 if (isResumed) {
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800310 // requestNfcServiceCallback() verifies permission also
Martijn Coenen1360c552013-01-07 16:34:20 -0800311 requestNfcServiceCallback();
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800312 } else {
313 // Crash API calls early in case NFC permission is missing
314 verifyNfcPermission();
Nick Pelly8ce7a272012-03-21 15:14:09 -0700315 }
316 }
317
318 public void setOnNdefPushCompleteCallback(Activity activity,
319 NfcAdapter.OnNdefPushCompleteCallback callback) {
320 boolean isResumed;
321 synchronized (NfcActivityManager.this) {
322 NfcActivityState state = getActivityState(activity);
323 state.onNdefPushCompleteCallback = callback;
324 isResumed = state.resumed;
325 }
326 if (isResumed) {
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800327 // requestNfcServiceCallback() verifies permission also
Martijn Coenen1360c552013-01-07 16:34:20 -0800328 requestNfcServiceCallback();
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800329 } else {
330 // Crash API calls early in case NFC permission is missing
331 verifyNfcPermission();
Nick Pellyc84c89a2011-08-22 22:27:11 -0700332 }
333 }
334
335 /**
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700336 * Request or unrequest NFC service callbacks.
Nick Pelly8ce7a272012-03-21 15:14:09 -0700337 * Makes IPC call - do not hold lock.
Nick Pellyc84c89a2011-08-22 22:27:11 -0700338 */
Martijn Coenen1360c552013-01-07 16:34:20 -0800339 void requestNfcServiceCallback() {
Nick Pellyc84c89a2011-08-22 22:27:11 -0700340 try {
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700341 NfcAdapter.sService.setAppCallback(this);
Nick Pellyc84c89a2011-08-22 22:27:11 -0700342 } catch (RemoteException e) {
343 mAdapter.attemptDeadServiceRecovery(e);
344 }
345 }
346
Martijn Coenend8bcfba2014-11-13 15:00:56 -0800347 void verifyNfcPermission() {
348 try {
349 NfcAdapter.sService.verifyNfcPermission();
350 } catch (RemoteException e) {
351 mAdapter.attemptDeadServiceRecovery(e);
352 }
353 }
354
Nick Pelly8ce7a272012-03-21 15:14:09 -0700355 /** Callback from NFC service, usually on binder thread */
Nick Pellyc84c89a2011-08-22 22:27:11 -0700356 @Override
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800357 public BeamShareData createBeamShareData() {
358 NfcAdapter.CreateNdefMessageCallback ndefCallback;
359 NfcAdapter.CreateBeamUrisCallback urisCallback;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700360 NdefMessage message;
Martijn Coenen7fe9fa12014-01-29 17:28:04 -0800361 Activity activity;
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700362 Uri[] uris;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800363 int flags;
Nick Pelly1d7e9062012-04-03 17:46:00 -0700364 synchronized (NfcActivityManager.this) {
365 NfcActivityState state = findResumedActivityState();
366 if (state == null) return null;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800367
368 ndefCallback = state.ndefMessageCallback;
369 urisCallback = state.uriCallback;
370 message = state.ndefMessage;
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700371 uris = state.uris;
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800372 flags = state.flags;
Martijn Coenen7fe9fa12014-01-29 17:28:04 -0800373 activity = state.activity;
Martijn Coenen20e8dd92012-04-12 16:37:18 -0700374 }
Martijn Coenen1fa2aff2013-02-27 09:21:22 -0800375
376 // Make callbacks without lock
377 if (ndefCallback != null) {
378 message = ndefCallback.createNdefMessage(mDefaultEvent);
379 }
380 if (urisCallback != null) {
381 uris = urisCallback.createBeamUris(mDefaultEvent);
Martijn Coenen2c103112012-05-15 10:32:15 -0700382 if (uris != null) {
Andres Morales56f299b2014-10-31 08:26:33 -0700383 ArrayList<Uri> validUris = new ArrayList<Uri>();
Martijn Coenen2c103112012-05-15 10:32:15 -0700384 for (Uri uri : uris) {
385 if (uri == null) {
386 Log.e(TAG, "Uri not allowed to be null.");
Andres Morales56f299b2014-10-31 08:26:33 -0700387 continue;
Martijn Coenen2c103112012-05-15 10:32:15 -0700388 }
389 String scheme = uri.getScheme();
390 if (scheme == null || (!scheme.equalsIgnoreCase("file") &&
391 !scheme.equalsIgnoreCase("content"))) {
392 Log.e(TAG, "Uri needs to have " +
393 "either scheme file or scheme content");
Andres Morales56f299b2014-10-31 08:26:33 -0700394 continue;
Martijn Coenen2c103112012-05-15 10:32:15 -0700395 }
Andres Morales56f299b2014-10-31 08:26:33 -0700396 uri = ContentProvider.maybeAddUserId(uri, UserHandle.myUserId());
397 validUris.add(uri);
Martijn Coenen2c103112012-05-15 10:32:15 -0700398 }
Andres Morales56f299b2014-10-31 08:26:33 -0700399
400 uris = validUris.toArray(new Uri[validUris.size()]);
Martijn Coenen2c103112012-05-15 10:32:15 -0700401 }
Nick Pelly1d7e9062012-04-03 17:46:00 -0700402 }
Martijn Coenen7fe9fa12014-01-29 17:28:04 -0800403 if (uris != null && uris.length > 0) {
404 for (Uri uri : uris) {
405 // Grant the NFC process permission to read these URIs
406 activity.grantUriPermission("com.android.nfc", uri,
407 Intent.FLAG_GRANT_READ_URI_PERMISSION);
408 }
409 }
Andres Morales56f299b2014-10-31 08:26:33 -0700410 return new BeamShareData(message, uris, UserHandle.CURRENT, flags);
Nick Pelly1d7e9062012-04-03 17:46:00 -0700411 }
Nick Pelly1d7e9062012-04-03 17:46:00 -0700412
Nick Pelly1d7e9062012-04-03 17:46:00 -0700413 /** Callback from NFC service, usually on binder thread */
414 @Override
Nick Pellyc84c89a2011-08-22 22:27:11 -0700415 public void onNdefPushComplete() {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700416 NfcAdapter.OnNdefPushCompleteCallback callback;
Nick Pellyc84c89a2011-08-22 22:27:11 -0700417 synchronized (NfcActivityManager.this) {
Nick Pelly8ce7a272012-03-21 15:14:09 -0700418 NfcActivityState state = findResumedActivityState();
419 if (state == null) return;
420
421 callback = state.onNdefPushCompleteCallback;
Nick Pellyc84c89a2011-08-22 22:27:11 -0700422 }
423
Nick Pelly8ce7a272012-03-21 15:14:09 -0700424 // Make callback without lock
Nick Pellyc84c89a2011-08-22 22:27:11 -0700425 if (callback != null) {
426 callback.onNdefPushComplete(mDefaultEvent);
427 }
428 }
Martijn Coenen3433a8a2011-09-01 19:18:02 -0700429
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700430 @Override
431 public void onTagDiscovered(Tag tag) throws RemoteException {
432 NfcAdapter.ReaderCallback callback;
433 synchronized (NfcActivityManager.this) {
434 NfcActivityState state = findResumedActivityState();
435 if (state == null) return;
436
437 callback = state.readerCallback;
438 }
439
440 // Make callback without lock
441 if (callback != null) {
442 callback.onTagDiscovered(tag);
443 }
444
445 }
Nick Pelly8ce7a272012-03-21 15:14:09 -0700446 /** Callback from Activity life-cycle, on main thread */
447 @Override
448 public void onActivityCreated(Activity activity, Bundle savedInstanceState) { /* NO-OP */ }
449
450 /** Callback from Activity life-cycle, on main thread */
451 @Override
452 public void onActivityStarted(Activity activity) { /* NO-OP */ }
453
454 /** Callback from Activity life-cycle, on main thread */
455 @Override
456 public void onActivityResumed(Activity activity) {
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700457 int readerModeFlags = 0;
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700458 Bundle readerModeExtras = null;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700459 Binder token;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700460 synchronized (NfcActivityManager.this) {
461 NfcActivityState state = findActivityState(activity);
462 if (DBG) Log.d(TAG, "onResume() for " + activity + " " + state);
463 if (state == null) return;
464 state.resumed = true;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700465 token = state.token;
466 readerModeFlags = state.readerModeFlags;
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700467 readerModeExtras = state.readerModeExtras;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700468 }
469 if (readerModeFlags != 0) {
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700470 setReaderMode(token, readerModeFlags, readerModeExtras);
Nick Pelly8ce7a272012-03-21 15:14:09 -0700471 }
Martijn Coenen1360c552013-01-07 16:34:20 -0800472 requestNfcServiceCallback();
Nick Pelly8ce7a272012-03-21 15:14:09 -0700473 }
474
475 /** Callback from Activity life-cycle, on main thread */
476 @Override
477 public void onActivityPaused(Activity activity) {
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700478 boolean readerModeFlagsSet;
479 Binder token;
Nick Pelly8ce7a272012-03-21 15:14:09 -0700480 synchronized (NfcActivityManager.this) {
481 NfcActivityState state = findActivityState(activity);
482 if (DBG) Log.d(TAG, "onPause() for " + activity + " " + state);
483 if (state == null) return;
484 state.resumed = false;
Martijn Coenenc20ed2f2013-08-27 14:32:53 -0700485 token = state.token;
486 readerModeFlagsSet = state.readerModeFlags != 0;
487 }
488 if (readerModeFlagsSet) {
489 // Restore default p2p modes
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700490 setReaderMode(token, 0, null);
Nick Pelly8ce7a272012-03-21 15:14:09 -0700491 }
Nick Pelly8ce7a272012-03-21 15:14:09 -0700492 }
493
494 /** Callback from Activity life-cycle, on main thread */
495 @Override
496 public void onActivityStopped(Activity activity) { /* NO-OP */ }
497
498 /** Callback from Activity life-cycle, on main thread */
499 @Override
500 public void onActivitySaveInstanceState(Activity activity, Bundle outState) { /* NO-OP */ }
501
502 /** Callback from Activity life-cycle, on main thread */
503 @Override
504 public void onActivityDestroyed(Activity activity) {
505 synchronized (NfcActivityManager.this) {
506 NfcActivityState state = findActivityState(activity);
507 if (DBG) Log.d(TAG, "onDestroy() for " + activity + " " + state);
508 if (state != null) {
509 // release all associated references
510 destroyActivityState(activity);
511 }
512 }
513 }
Martijn Coenen5b1e0322013-09-02 20:38:47 -0700514
Nick Pellyc84c89a2011-08-22 22:27:11 -0700515}