diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index f48f45f21f165..92041d8e36263 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -148,4 +148,18 @@ interface INetworkManagementService */ void detachPppd(String tty); + /** + * Turn on USB RNDIS support - this will turn off thinks like adb/mass-storage + */ + void startUsbRNDIS(); + + /** + * Turn off USB RNDIS support + */ + void stopUsbRNDIS(); + + /** + * Check the status of USB RNDIS support + */ + boolean isUsbRNDISStarted(); } diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 1015028fc5668..958d0899d4fdf 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -425,4 +425,35 @@ class NetworkManagementService extends INetworkManagementService.Stub { android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService"); mConnector.doCommand(String.format("pppd detach %s", tty)); } + + public void startUsbRNDIS() throws IllegalStateException { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService"); + mConnector.doCommand("usb startrndis"); + } + + public void stopUsbRNDIS() throws IllegalStateException { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService"); + mConnector.doCommand("usb stoprndis"); + } + + public boolean isUsbRNDISStarted() throws IllegalStateException { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService"); + ArrayList rsp = mConnector.doCommand("usb rndisstatus"); + + for (String line : rsp) { + String []tok = line.split(" "); + int code = Integer.parseInt(tok[0]); + if (code == NetdResponseCode.UsbRNDISStatusResult) { + if (tok[2].equals("started")) + return true; + return false; + } else { + throw new IllegalStateException(String.format("Unexpected response code %d", code)); + } + } + throw new IllegalStateException("Got an empty response"); + } }