summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Philip P. Moltmann <moltmann@google.com> 2016-07-27 15:17:03 -0700
committer Philip P. Moltmann <moltmann@google.com> 2016-07-29 08:39:10 -0700
commit9ebf2a5683db3dfd956f68b80f3f0a10b9705891 (patch)
tree32911493f425e1c04c0ea92f2e6ebc9070f289ff
parent7f37f2693f292f66537757ceeb6d43da4d0c4c3f (diff)
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
-rw-r--r--services/usb/java/com/android/server/usb/UsbDeviceManager.java27
1 files 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());