From 9ebf2a5683db3dfd956f68b80f3f0a10b9705891 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Wed, 27 Jul 2016 15:17:03 -0700 Subject: Add (corrected) usb power sink handling This is a resubmit of change 01355161536787a55190ff3d2595fbf6c8056fe3 . The previous change did not handle the case where the device was plugged into a wall charger correctly. Fixes: 30418683 Change-Id: Ia155f2230bdd3576c8fb8eb8cff11f544047c35a --- .../com/android/server/usb/UsbDeviceManager.java | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index df9242dc0aa1..8560651fa7ec 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -49,6 +49,7 @@ import android.util.Pair; import android.util.Slog; import com.android.internal.annotations.GuardedBy; +import com.android.internal.os.SomeArgs; import com.android.internal.util.IndentingPrintWriter; import com.android.server.FgThread; @@ -320,6 +321,7 @@ public class UsbDeviceManager { private boolean mConnected; private boolean mHostConnected; private boolean mSourcePower; + private boolean mSinkPower; private boolean mConfigured; private boolean mUsbDataUnlocked; private String mCurrentFunctions; @@ -401,7 +403,18 @@ public class UsbDeviceManager { public void updateHostState(UsbPort port, UsbPortStatus status) { boolean hostConnected = status.getCurrentDataRole() == UsbPort.DATA_ROLE_HOST; boolean sourcePower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SOURCE; - obtainMessage(MSG_UPDATE_HOST_STATE, hostConnected ? 1 :0, sourcePower ? 1 :0).sendToTarget(); + boolean sinkPower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SINK; + + if (DEBUG) { + Slog.i(TAG, "updateHostState " + port + " status=" + status); + } + + SomeArgs args = SomeArgs.obtain(); + args.argi1 = hostConnected ? 1 :0; + args.argi2 = sourcePower ? 1 :0; + args.argi3 = sinkPower ? 1 :0; + + obtainMessage(MSG_UPDATE_HOST_STATE, args).sendToTarget(); } private boolean waitForState(String state) { @@ -718,8 +731,11 @@ public class UsbDeviceManager { } break; case MSG_UPDATE_HOST_STATE: - mHostConnected = (msg.arg1 == 1); - mSourcePower = (msg.arg2 == 1); + SomeArgs args = (SomeArgs) msg.obj; + mHostConnected = (args.argi1 == 1); + mSourcePower = (args.argi2 == 1); + mSinkPower = (args.argi3 == 1); + args.recycle(); updateUsbNotification(); if (mBootCompleted) { updateUsbStateBroadcastIfNeeded(); @@ -809,6 +825,8 @@ public class UsbDeviceManager { } } else if (mSourcePower) { id = com.android.internal.R.string.usb_supplying_notification_title; + } else if (mHostConnected && mSinkPower) { + id = com.android.internal.R.string.usb_charging_notification_title; } if (id != mUsbNotificationId) { // clear notification if title needs changing @@ -908,6 +926,9 @@ public class UsbDeviceManager { pw.println(" mConfigured: " + mConfigured); pw.println(" mUsbDataUnlocked: " + mUsbDataUnlocked); pw.println(" mCurrentAccessory: " + mCurrentAccessory); + pw.println(" mHostConnected: " + mHostConnected); + pw.println(" mSourcePower: " + mSourcePower); + pw.println(" mSinkPower: " + mSinkPower); try { pw.println(" Kernel state: " + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); -- cgit v1.2.3-59-g8ed1b