diff --git a/services/core/java/com/android/server/INativeDaemonConnectorCallbacks.java b/services/core/java/com/android/server/INativeDaemonConnectorCallbacks.java index 6fbf713d3f..0cf9dcde01 100644 --- a/services/core/java/com/android/server/INativeDaemonConnectorCallbacks.java +++ b/services/core/java/com/android/server/INativeDaemonConnectorCallbacks.java @@ -20,5 +20,6 @@ package com.android.server; interface INativeDaemonConnectorCallbacks { void onDaemonConnected(); + boolean onCheckHoldWakeLock(int code); boolean onEvent(int code, String raw, String[] cooked); } diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java index 417d6d81cd..265b95704b 100644 --- a/services/core/java/com/android/server/NativeDaemonConnector.java +++ b/services/core/java/com/android/server/NativeDaemonConnector.java @@ -21,6 +21,7 @@ import android.net.LocalSocketAddress; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.os.PowerManager; import android.os.SystemClock; import android.util.LocalLog; import android.util.Slog; @@ -56,6 +57,8 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo private final ResponseQueue mResponseQueue; + private final PowerManager.WakeLock mWakeLock; + private INativeDaemonConnectorCallbacks mCallbacks; private Handler mCallbackHandler; @@ -70,10 +73,14 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo private final int BUFFER_SIZE = 4096; NativeDaemonConnector(INativeDaemonConnectorCallbacks callbacks, String socket, - int responseQueueSize, String logTag, int maxLogSize) { + int responseQueueSize, String logTag, int maxLogSize, PowerManager.WakeLock wl) { mCallbacks = callbacks; mSocket = socket; mResponseQueue = new ResponseQueue(responseQueueSize); + mWakeLock = wl; + if (mWakeLock != null) { + mWakeLock.setReferenceCounted(true); + } mSequenceNumber = new AtomicInteger(0); TAG = logTag != null ? logTag : "NativeDaemonConnector"; mLocalLog = new LocalLog(maxLogSize); @@ -102,6 +109,10 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo } } catch (Exception e) { loge("Error handling '" + event + "': " + e); + } finally { + if (mCallbacks.onCheckHoldWakeLock(msg.what)) { + mWakeLock.release(); + } } return true; } @@ -154,18 +165,29 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo buffer, start, i - start, StandardCharsets.UTF_8); log("RCV <- {" + rawEvent + "}"); + boolean releaseWl = false; try { final NativeDaemonEvent event = NativeDaemonEvent.parseRawEvent( rawEvent); if (event.isClassUnsolicited()) { // TODO: migrate to sending NativeDaemonEvent instances - mCallbackHandler.sendMessage(mCallbackHandler.obtainMessage( - event.getCode(), event.getRawEvent())); + if (mCallbacks.onCheckHoldWakeLock(event.getCode())) { + mWakeLock.acquire(); + releaseWl = true; + } + if (mCallbackHandler.sendMessage(mCallbackHandler.obtainMessage( + event.getCode(), event.getRawEvent()))) { + releaseWl = false; + } } else { mResponseQueue.add(event.getCmdNumber(), event); } } catch (IllegalArgumentException e) { log("Problem parsing message: " + rawEvent + " - " + e); + } finally { + if (releaseWl) { + mWakeLock.acquire(); + } } start = i + 1; diff --git a/services/core/java/com/android/server/NsdService.java b/services/core/java/com/android/server/NsdService.java index 74633ae87d..c9f9a25666 100644 --- a/services/core/java/com/android/server/NsdService.java +++ b/services/core/java/com/android/server/NsdService.java @@ -534,7 +534,7 @@ public class NsdService extends INsdManager.Stub { mContentResolver = context.getContentResolver(); mNativeConnector = new NativeDaemonConnector(new NativeCallbackReceiver(), "mdns", 10, - MDNS_TAG, 25); + MDNS_TAG, 25, null); mNsdStateMachine = new NsdStateMachine(TAG); mNsdStateMachine.start(); @@ -622,6 +622,10 @@ public class NsdService extends INsdManager.Stub { mNativeDaemonConnected.countDown(); } + public boolean onCheckHoldWakeLock(int code) { + return false; + } + public boolean onEvent(int code, String raw, String[] cooked) { // TODO: NDC translates a message to a callback, we could enhance NDC to // directly interact with a state machine through messages