summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormike wakerly <mikey@google.com>2012-08-09 17:39:04 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-08-09 17:39:04 -0700
commit38a306e1c5e5cbe7dfc896843bc9681c12e4d7f2 (patch)
tree5580dc9a7fea008858fb101c996a6c6985f59bfe
parente2b295643d102a2a7f768137293515d9f9c22363 (diff)
parentc6cdbf21958178025010c6bed797ff193c89884f (diff)
downloadpackages_apps_nfc-38a306e1c5e5cbe7dfc896843bc9681c12e4d7f2.zip
packages_apps_nfc-38a306e1c5e5cbe7dfc896843bc9681c12e4d7f2.tar.gz
packages_apps_nfc-38a306e1c5e5cbe7dfc896843bc9681c12e4d7f2.tar.bz2
am c6cdbf21: NfcService: hold a wake lock around transceive().
* commit 'c6cdbf21958178025010c6bed797ff193c89884f': NfcService: hold a wake lock around transceive().
-rwxr-xr-xsrc/com/android/nfc/NfcService.java94
1 files changed, 72 insertions, 22 deletions
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 13f224b..5f9fc21 100755
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -186,7 +186,10 @@ public class NfcService extends Application implements DeviceHostListener {
private DeviceHost mDeviceHost;
private SharedPreferences mPrefs;
private SharedPreferences.Editor mPrefsEditor;
- private PowerManager.WakeLock mWakeLock;
+ private PowerManager.WakeLock mRoutingWakeLock;
+ private PowerManager.WakeLock mOpenWakeLock;
+ private PowerManager.WakeLock mDisconnectWakeLock;
+ private PowerManager.WakeLock mTransceiveWakeLock;
int mStartSound;
int mEndSound;
int mErrorSound;
@@ -320,7 +323,17 @@ public class NfcService extends Application implements DeviceHostListener {
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
- mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NfcService");
+ // TODO(mikey|maco): consolidate as a single wakelock when individual
+ // stats are no longer useful.
+ mRoutingWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, "NfcService:mRoutingWakeLock");
+ mOpenWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, "NfcService:mOpenWakeLock");
+ mDisconnectWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, "NfcService:mDisconnectWakeLock");
+ mTransceiveWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, "NfcService:mTransceiveWakeLock");
+
mKeyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
mScreenState = checkScreenState();
@@ -403,6 +416,37 @@ public class NfcService extends Application implements DeviceHostListener {
}
}
+ int doOpenSecureElementConnection() {
+ mOpenWakeLock.acquire();
+ try {
+ return mSecureElement.doOpenSecureElementConnection();
+ } finally {
+ mOpenWakeLock.release();
+ }
+ }
+
+ byte[] doTransceive(int handle, byte[] cmd) {
+ mTransceiveWakeLock.acquire();
+ try {
+ return doTransceiveNoLock(handle, cmd);
+ } finally {
+ mTransceiveWakeLock.release();
+ }
+ }
+
+ byte[] doTransceiveNoLock(int handle, byte[] cmd) {
+ return mSecureElement.doTransceive(handle, cmd);
+ }
+
+ void doDisconnect(int handle) {
+ mDisconnectWakeLock.acquire();
+ try {
+ mSecureElement.doDisconnect(handle);
+ } finally {
+ mDisconnectWakeLock.release();
+ }
+ }
+
/**
* Manages tasks that involve turning on/off the NFC controller.
*
@@ -587,7 +631,7 @@ public class NfcService extends Application implements DeviceHostListener {
}
}
Log.i(TAG, "Executing SE wipe");
- int handle = mSecureElement.doOpenSecureElementConnection();
+ int handle = doOpenSecureElementConnection();
if (handle == 0) {
Log.w(TAG, "Could not open the secure element");
if (tempEnable) {
@@ -596,19 +640,27 @@ public class NfcService extends Application implements DeviceHostListener {
return;
}
- mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 10000);
+ try {
+ mTransceiveWakeLock.acquire();
+ try {
+ mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 10000);
- for (byte[] cmd : apdus) {
- byte[] resp = mSecureElement.doTransceive(handle, cmd);
- if (resp == null) {
- Log.w(TAG, "Transceive failed, could not wipe NFC-EE");
- break;
+ for (byte[] cmd : apdus) {
+ byte[] resp = doTransceiveNoLock(handle, cmd);
+ if (resp == null) {
+ Log.w(TAG, "Transceive failed, could not wipe NFC-EE");
+ break;
+ }
+ }
+
+ mDeviceHost.resetTimeouts();
+ } finally {
+ mTransceiveWakeLock.release();
}
+ } finally {
+ doDisconnect(handle);
}
- mDeviceHost.resetTimeouts();
- mSecureElement.doDisconnect(handle);
-
if (tempEnable) {
disableInternal();
}
@@ -1189,7 +1241,7 @@ public class NfcService extends Application implements DeviceHostListener {
binder.unlinkToDeath(mOpenEe, 0);
mDeviceHost.resetTimeouts();
- mSecureElement.doDisconnect(mOpenEe.handle);
+ doDisconnect(mOpenEe.handle);
mOpenEe = null;
applyRouting(true);
@@ -1232,7 +1284,7 @@ public class NfcService extends Application implements DeviceHostListener {
throw new IOException("NFC EE already open");
}
- int handle = mSecureElement.doOpenSecureElementConnection();
+ int handle = doOpenSecureElementConnection();
if (handle == 0) {
throw new IOException("NFC EE failed to open");
}
@@ -1296,7 +1348,7 @@ public class NfcService extends Application implements DeviceHostListener {
}
}
- return mSecureElement.doTransceive(mOpenEe.handle, data);
+ return doTransceive(mOpenEe.handle, data);
}
@Override
@@ -1796,13 +1848,11 @@ public class NfcService extends Application implements DeviceHostListener {
}
mScreenState = params[0].intValue();
- boolean needWakelock = mScreenState == SCREEN_STATE_OFF;
- if (needWakelock) {
- mWakeLock.acquire();
- }
- applyRouting(false);
- if (needWakelock) {
- mWakeLock.release();
+ mRoutingWakeLock.acquire();
+ try {
+ applyRouting(false);
+ } finally {
+ mRoutingWakeLock.release();
}
return null;
}