Loading api/current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -15950,7 +15950,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface); } api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -17440,7 +17440,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean resetDevice(); method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface); api/test-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -16005,7 +16005,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface); } core/java/android/hardware/usb/UsbDeviceConnection.java +32 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.os.Build; import android.os.ParcelFileDescriptor; import com.android.internal.util.Preconditions; Loading @@ -27,7 +28,9 @@ import com.android.internal.util.Preconditions; import dalvik.system.CloseGuard; import java.io.FileDescriptor; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.util.concurrent.TimeoutException; /** * This class is used for sending and receiving data and control messages to a USB device. Loading Loading @@ -268,16 +271,29 @@ public class UsbDeviceConnection { * * @return a completed USB request, or null if an error occurred * * @throws IllegalArgumentException if the number of bytes read or written is more than the * limit of the request's buffer. The number of bytes is * determined by the {@code length} parameter of * @throws IllegalArgumentException Before API {@value Build.VERSION_CODES#O}: if the number of * bytes read or written is more than the limit of the * request's buffer. The number of bytes is determined by the * {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} * @throws BufferOverflowException In API {@value Build.VERSION_CODES#O} and after: if the * number of bytes read or written is more than the limit of the * request's buffer. The number of bytes is determined by the * {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} */ public UsbRequest requestWait() { UsbRequest request = null; try { // -1 is special value indicating infinite wait UsbRequest request = native_request_wait(-1); request = native_request_wait(-1); } catch (TimeoutException e) { // Does not happen, infinite timeout } if (request != null) { request.dequeue(); request.dequeue( mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O); } return request; } Loading @@ -290,24 +306,25 @@ public class UsbDeviceConnection { * android.hardware.usb.UsbRequest#getClientData} can be useful in determining how to process * the result of this function.</p> * <p>Android processes {@link UsbRequest UsbRequests} asynchronously. Hence it is not * guaranteed that {@link #requestWait(int) requestWait(0)} returns a request that has been * guaranteed that {@link #requestWait(long) requestWait(0)} returns a request that has been * queued right before even if the request could have been processed immediately.</p> * * @param timeout timeout in milliseconds. If 0 this method does not wait. * * @return a completed USB request, or {@code null} if an error or time out occurred * @return a completed USB request, or {@code null} if an error occurred * * @throws IllegalArgumentException if the number of bytes read or written is more than the * @throws BufferOverflowException if the number of bytes read or written is more than the * limit of the request's buffer. The number of bytes is * determined by the {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} * @throws TimeoutException if no request was received in {@code timeout} milliseconds. */ public UsbRequest requestWait(int timeout) { public UsbRequest requestWait(long timeout) throws TimeoutException { timeout = Preconditions.checkArgumentNonnegative(timeout, "timeout"); UsbRequest request = native_request_wait(timeout); if (request != null) { request.dequeue(); request.dequeue(true); } return request; } Loading Loading @@ -350,7 +367,7 @@ public class UsbDeviceConnection { int index, byte[] buffer, int offset, int length, int timeout); private native int native_bulk_request(int endpoint, byte[] buffer, int offset, int length, int timeout); private native UsbRequest native_request_wait(int timeout); private native UsbRequest native_request_wait(long timeout) throws TimeoutException; private native String native_get_serial(); private native boolean native_reset_device(); } core/java/android/hardware/usb/UsbRequest.java +15 −2 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package android.hardware.usb; import android.annotation.Nullable; import android.util.Log; import com.android.internal.util.Preconditions; import dalvik.system.CloseGuard; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; /** Loading Loading @@ -276,7 +278,7 @@ public class UsbRequest { return wasQueued; } /* package */ void dequeue() { /* package */ void dequeue(boolean useBufferOverflowInsteadOfIllegalArg) { boolean isSend = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); int bytesTransferred; Loading Loading @@ -313,7 +315,18 @@ public class UsbRequest { bytesTransferred = native_dequeue_array(mBuffer.array(), mLength, isSend); } if (bytesTransferred >= 0) { mBuffer.position(Math.min(bytesTransferred, mLength)); int bytesToStore = Math.min(bytesTransferred, mLength); try { mBuffer.position(bytesToStore); } catch (IllegalArgumentException e) { if (useBufferOverflowInsteadOfIllegalArg) { Log.e(TAG, "Buffer " + mBuffer + " does not have enough space to read " + bytesToStore + " bytes", e); throw new BufferOverflowException(); } else { throw e; } } } } Loading Loading
api/current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -15950,7 +15950,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface); }
api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -17440,7 +17440,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean resetDevice(); method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface);
api/test-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -16005,7 +16005,7 @@ package android.hardware.usb { method public java.lang.String getSerial(); method public boolean releaseInterface(android.hardware.usb.UsbInterface); method public android.hardware.usb.UsbRequest requestWait(); method public android.hardware.usb.UsbRequest requestWait(int); method public android.hardware.usb.UsbRequest requestWait(long) throws java.util.concurrent.TimeoutException; method public boolean setConfiguration(android.hardware.usb.UsbConfiguration); method public boolean setInterface(android.hardware.usb.UsbInterface); }
core/java/android/hardware/usb/UsbDeviceConnection.java +32 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.os.Build; import android.os.ParcelFileDescriptor; import com.android.internal.util.Preconditions; Loading @@ -27,7 +28,9 @@ import com.android.internal.util.Preconditions; import dalvik.system.CloseGuard; import java.io.FileDescriptor; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.util.concurrent.TimeoutException; /** * This class is used for sending and receiving data and control messages to a USB device. Loading Loading @@ -268,16 +271,29 @@ public class UsbDeviceConnection { * * @return a completed USB request, or null if an error occurred * * @throws IllegalArgumentException if the number of bytes read or written is more than the * limit of the request's buffer. The number of bytes is * determined by the {@code length} parameter of * @throws IllegalArgumentException Before API {@value Build.VERSION_CODES#O}: if the number of * bytes read or written is more than the limit of the * request's buffer. The number of bytes is determined by the * {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} * @throws BufferOverflowException In API {@value Build.VERSION_CODES#O} and after: if the * number of bytes read or written is more than the limit of the * request's buffer. The number of bytes is determined by the * {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} */ public UsbRequest requestWait() { UsbRequest request = null; try { // -1 is special value indicating infinite wait UsbRequest request = native_request_wait(-1); request = native_request_wait(-1); } catch (TimeoutException e) { // Does not happen, infinite timeout } if (request != null) { request.dequeue(); request.dequeue( mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O); } return request; } Loading @@ -290,24 +306,25 @@ public class UsbDeviceConnection { * android.hardware.usb.UsbRequest#getClientData} can be useful in determining how to process * the result of this function.</p> * <p>Android processes {@link UsbRequest UsbRequests} asynchronously. Hence it is not * guaranteed that {@link #requestWait(int) requestWait(0)} returns a request that has been * guaranteed that {@link #requestWait(long) requestWait(0)} returns a request that has been * queued right before even if the request could have been processed immediately.</p> * * @param timeout timeout in milliseconds. If 0 this method does not wait. * * @return a completed USB request, or {@code null} if an error or time out occurred * @return a completed USB request, or {@code null} if an error occurred * * @throws IllegalArgumentException if the number of bytes read or written is more than the * @throws BufferOverflowException if the number of bytes read or written is more than the * limit of the request's buffer. The number of bytes is * determined by the {@code length} parameter of * {@link UsbRequest#queue(ByteBuffer, int)} * @throws TimeoutException if no request was received in {@code timeout} milliseconds. */ public UsbRequest requestWait(int timeout) { public UsbRequest requestWait(long timeout) throws TimeoutException { timeout = Preconditions.checkArgumentNonnegative(timeout, "timeout"); UsbRequest request = native_request_wait(timeout); if (request != null) { request.dequeue(); request.dequeue(true); } return request; } Loading Loading @@ -350,7 +367,7 @@ public class UsbDeviceConnection { int index, byte[] buffer, int offset, int length, int timeout); private native int native_bulk_request(int endpoint, byte[] buffer, int offset, int length, int timeout); private native UsbRequest native_request_wait(int timeout); private native UsbRequest native_request_wait(long timeout) throws TimeoutException; private native String native_get_serial(); private native boolean native_reset_device(); }
core/java/android/hardware/usb/UsbRequest.java +15 −2 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package android.hardware.usb; import android.annotation.Nullable; import android.util.Log; import com.android.internal.util.Preconditions; import dalvik.system.CloseGuard; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; /** Loading Loading @@ -276,7 +278,7 @@ public class UsbRequest { return wasQueued; } /* package */ void dequeue() { /* package */ void dequeue(boolean useBufferOverflowInsteadOfIllegalArg) { boolean isSend = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT); int bytesTransferred; Loading Loading @@ -313,7 +315,18 @@ public class UsbRequest { bytesTransferred = native_dequeue_array(mBuffer.array(), mLength, isSend); } if (bytesTransferred >= 0) { mBuffer.position(Math.min(bytesTransferred, mLength)); int bytesToStore = Math.min(bytesTransferred, mLength); try { mBuffer.position(bytesToStore); } catch (IllegalArgumentException e) { if (useBufferOverflowInsteadOfIllegalArg) { Log.e(TAG, "Buffer " + mBuffer + " does not have enough space to read " + bytesToStore + " bytes", e); throw new BufferOverflowException(); } else { throw e; } } } } Loading