Loading api/current.txt +8 −9 Original line number Diff line number Diff line Loading @@ -23099,24 +23099,23 @@ package android.os { public final class MessageQueue { method public void addIdleHandler(android.os.MessageQueue.IdleHandler); method public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue.OnFileDescriptorEventListener); method public boolean isIdle(); method public void registerFileDescriptorCallback(java.io.FileDescriptor, int, android.os.MessageQueue.FileDescriptorCallback); method public void removeIdleHandler(android.os.MessageQueue.IdleHandler); method public void unregisterFileDescriptorCallback(java.io.FileDescriptor); method public void removeOnFileDescriptorEventListener(java.io.FileDescriptor); } public static abstract class MessageQueue.FileDescriptorCallback { ctor public MessageQueue.FileDescriptorCallback(); method public int onFileDescriptorEvents(java.io.FileDescriptor, int); public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public static abstract interface MessageQueue.OnFileDescriptorEventListener { method public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int); field public static final int EVENT_ERROR = 4; // 0x4 field public static final int EVENT_INPUT = 1; // 0x1 field public static final int EVENT_OUTPUT = 2; // 0x2 } public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public final class Messenger implements android.os.Parcelable { ctor public Messenger(android.os.Handler); ctor public Messenger(android.os.IBinder); api/system-current.txt +8 −9 Original line number Diff line number Diff line Loading @@ -25013,24 +25013,23 @@ package android.os { public final class MessageQueue { method public void addIdleHandler(android.os.MessageQueue.IdleHandler); method public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue.OnFileDescriptorEventListener); method public boolean isIdle(); method public void registerFileDescriptorCallback(java.io.FileDescriptor, int, android.os.MessageQueue.FileDescriptorCallback); method public void removeIdleHandler(android.os.MessageQueue.IdleHandler); method public void unregisterFileDescriptorCallback(java.io.FileDescriptor); method public void removeOnFileDescriptorEventListener(java.io.FileDescriptor); } public static abstract class MessageQueue.FileDescriptorCallback { ctor public MessageQueue.FileDescriptorCallback(); method public int onFileDescriptorEvents(java.io.FileDescriptor, int); public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public static abstract interface MessageQueue.OnFileDescriptorEventListener { method public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int); field public static final int EVENT_ERROR = 4; // 0x4 field public static final int EVENT_INPUT = 1; // 0x1 field public static final int EVENT_OUTPUT = 2; // 0x2 } public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public final class Messenger implements android.os.Parcelable { ctor public Messenger(android.os.Handler); ctor public Messenger(android.os.IBinder); core/java/android/os/MessageQueue.java +55 −60 Original line number Diff line number Diff line Loading @@ -160,67 +160,67 @@ public final class MessageQueue { } /** * Registers a file descriptor callback to receive notification when file descriptor * Adds a file descriptor listener to receive notification when file descriptor * related events occur. * <p> * If the file descriptor has already been registered, the specified events * and callback will replace any that were previously associated with it. * It is not possible to set more than one callback per file descriptor. * and listener will replace any that were previously associated with it. * It is not possible to set more than one listener per file descriptor. * </p><p> * It is important to always unregister the callback when the file descriptor * It is important to always unregister the listener when the file descriptor * is no longer of use. * </p> * * @param fd The file descriptor for which a callback will be registered. * @param fd The file descriptor for which a listener will be registered. * @param events The set of events to receive: a combination of the * {@link FileDescriptorCallback#EVENT_INPUT}, * {@link FileDescriptorCallback#EVENT_OUTPUT}, and * {@link FileDescriptorCallback#EVENT_ERROR} event masks. If the requested * set of events is zero, then the callback is unregistered. * @param callback The callback to invoke when file descriptor events occur. * {@link OnFileDescriptorEventListener#EVENT_INPUT}, * {@link OnFileDescriptorEventListener#EVENT_OUTPUT}, and * {@link OnFileDescriptorEventListener#EVENT_ERROR} event masks. If the requested * set of events is zero, then the listener is unregistered. * @param listener The listener to invoke when file descriptor events occur. * * @see FileDescriptorCallback * @see #unregisterFileDescriptorCallback * @see OnFileDescriptorEventListener * @see #removeOnFileDescriptorEventListener */ public void registerFileDescriptorCallback(@NonNull FileDescriptor fd, @FileDescriptorCallback.Events int events, @NonNull FileDescriptorCallback callback) { public void addOnFileDescriptorEventListener(@NonNull FileDescriptor fd, @OnFileDescriptorEventListener.Events int events, @NonNull OnFileDescriptorEventListener listener) { if (fd == null) { throw new IllegalArgumentException("fd must not be null"); } if (callback == null) { throw new IllegalArgumentException("callback must not be null"); if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } synchronized (this) { setFileDescriptorCallbackLocked(fd, events, callback); updateOnFileDescriptorEventListenerLocked(fd, events, listener); } } /** * Unregisters a file descriptor callback. * Removes a file descriptor listener. * <p> * This method does nothing if no callback has been registered for the * This method does nothing if no listener has been registered for the * specified file descriptor. * </p> * * @param fd The file descriptor whose callback will be unregistered. * @param fd The file descriptor whose listener will be unregistered. * * @see FileDescriptorCallback * @see #registerFileDescriptorCallback * @see OnFileDescriptorEventListener * @see #addOnFileDescriptorEventListener */ public void unregisterFileDescriptorCallback(@NonNull FileDescriptor fd) { public void removeOnFileDescriptorEventListener(@NonNull FileDescriptor fd) { if (fd == null) { throw new IllegalArgumentException("fd must not be null"); } synchronized (this) { setFileDescriptorCallbackLocked(fd, 0, null); updateOnFileDescriptorEventListenerLocked(fd, 0, null); } } private void setFileDescriptorCallbackLocked(FileDescriptor fd, int events, FileDescriptorCallback callback) { private void updateOnFileDescriptorEventListenerLocked(FileDescriptor fd, int events, OnFileDescriptorEventListener listener) { final int fdNum = fd.getInt$(); int index = -1; Loading @@ -236,15 +236,15 @@ public final class MessageQueue { } if (events != 0) { events |= FileDescriptorCallback.EVENT_ERROR; events |= OnFileDescriptorEventListener.EVENT_ERROR; if (record == null) { if (mFileDescriptorRecords == null) { mFileDescriptorRecords = new SparseArray<FileDescriptorRecord>(); } record = new FileDescriptorRecord(fd, events, callback); record = new FileDescriptorRecord(fd, events, listener); mFileDescriptorRecords.put(fdNum, record); } else { record.mCallback = callback; record.mListener = listener; record.mEvents = events; record.mSeq += 1; } Loading @@ -260,12 +260,12 @@ public final class MessageQueue { // Get the file descriptor record and any state that might change. final FileDescriptorRecord record; final int oldWatchedEvents; final FileDescriptorCallback callback; final OnFileDescriptorEventListener listener; final int seq; synchronized (this) { record = mFileDescriptorRecords.get(fd); if (record == null) { return 0; // spurious, no callback registered return 0; // spurious, no listener registered } oldWatchedEvents = record.mEvents; Loading @@ -274,19 +274,19 @@ public final class MessageQueue { return oldWatchedEvents; // spurious, watched events changed } callback = record.mCallback; listener = record.mListener; seq = record.mSeq; } // Invoke the callback outside of the lock. int newWatchedEvents = callback.onFileDescriptorEvents( // Invoke the listener outside of the lock. int newWatchedEvents = listener.onFileDescriptorEvents( record.mDescriptor, events); if (newWatchedEvents != 0) { newWatchedEvents |= FileDescriptorCallback.EVENT_ERROR; newWatchedEvents |= OnFileDescriptorEventListener.EVENT_ERROR; } // Update the file descriptor record if the callback changed the set of // events to watch and the callback itself hasn't been updated since. // Update the file descriptor record if the listener changed the set of // events to watch and the listener itself hasn't been updated since. if (newWatchedEvents != oldWatchedEvents) { synchronized (this) { int index = mFileDescriptorRecords.indexOfKey(fd); Loading Loading @@ -786,23 +786,23 @@ public final class MessageQueue { } /** * A callback which is invoked when file descriptor related events occur. * A listener which is invoked when file descriptor related events occur. */ public static abstract class FileDescriptorCallback { public interface OnFileDescriptorEventListener { /** * File descriptor event: Indicates that the file descriptor is ready for input * operations, such as reading. * <p> * The callback should read all available data from the file descriptor * then return <code>true</code> to keep the callback active or <code>false</code> * to remove the callback. * The listener should read all available data from the file descriptor * then return <code>true</code> to keep the listener active or <code>false</code> * to remove the listener. * </p><p> * In the case of a socket, this event may be generated to indicate * that there is at least one incoming connection that the callback * that there is at least one incoming connection that the listener * should accept. * </p><p> * This event will only be generated if the {@link #EVENT_INPUT} event mask was * specified when the callback was added. * specified when the listener was added. * </p> */ public static final int EVENT_INPUT = 1 << 0; Loading @@ -811,14 +811,14 @@ public final class MessageQueue { * File descriptor event: Indicates that the file descriptor is ready for output * operations, such as writing. * <p> * The callback should write as much data as it needs. If it could not * The listener should write as much data as it needs. If it could not * write everything at once, then it should return <code>true</code> to * keep the callback active. Otherwise, it should return <code>false</code> * to remove the callback then re-register it later when it needs to write * keep the listener active. Otherwise, it should return <code>false</code> * to remove the listener then re-register it later when it needs to write * something else. * </p><p> * This event will only be generated if the {@link #EVENT_OUTPUT} event mask was * specified when the callback was added. * specified when the listener was added. * </p> */ public static final int EVENT_OUTPUT = 1 << 1; Loading @@ -831,7 +831,7 @@ public final class MessageQueue { * is when the remote peer of a socket or pipe closes its end of the connection. * </p><p> * This event may be generated at any time regardless of whether the * {@link #EVENT_ERROR} event mask was specified when the callback was added. * {@link #EVENT_ERROR} event mask was specified when the listener was added. * </p> */ public static final int EVENT_ERROR = 1 << 2; Loading @@ -843,35 +843,30 @@ public final class MessageQueue { /** * Called when a file descriptor receives events. * <p> * The default implementation does nothing and returns 0 to unregister the callback. * </p> * * @param fd The file descriptor. * @param events The set of events that occurred: a combination of the * {@link #EVENT_INPUT}, {@link #EVENT_OUTPUT}, and {@link #EVENT_ERROR} event masks. * @return The new set of events to watch, or 0 to unregister the callback. * @return The new set of events to watch, or 0 to unregister the listener. * * @see #EVENT_INPUT * @see #EVENT_OUTPUT * @see #EVENT_ERROR */ public @Events int onFileDescriptorEvents(@NonNull FileDescriptor fd, @Events int events) { return 0; } @Events int onFileDescriptorEvents(@NonNull FileDescriptor fd, @Events int events); } private static final class FileDescriptorRecord { public final FileDescriptor mDescriptor; public int mEvents; public FileDescriptorCallback mCallback; public OnFileDescriptorEventListener mListener; public int mSeq; public FileDescriptorRecord(FileDescriptor descriptor, int events, FileDescriptorCallback callback) { int events, OnFileDescriptorEventListener listener) { mDescriptor = descriptor; mEvents = events; mCallback = callback; mListener = listener; } } } core/java/android/os/ParcelFileDescriptor.java +6 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import static android.system.OsConstants.S_ISREG; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.os.MessageQueue.FileDescriptorCallback; import android.os.MessageQueue.OnFileDescriptorEventListener; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; Loading Loading @@ -236,19 +236,19 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { final FileDescriptor[] comm = createCommSocketPair(); final ParcelFileDescriptor pfd = new ParcelFileDescriptor(fd, comm[0]); final MessageQueue queue = handler.getLooper().getQueue(); queue.registerFileDescriptorCallback(comm[1], FileDescriptorCallback.EVENT_INPUT, new FileDescriptorCallback() { queue.addOnFileDescriptorEventListener(comm[1], OnFileDescriptorEventListener.EVENT_INPUT, new OnFileDescriptorEventListener() { @Override public int onFileDescriptorEvents(FileDescriptor fd, int events) { Status status = null; if ((events & FileDescriptorCallback.EVENT_INPUT) != 0) { if ((events & OnFileDescriptorEventListener.EVENT_INPUT) != 0) { final byte[] buf = new byte[MAX_STATUS]; status = readCommStatus(fd, buf); } else if ((events & FileDescriptorCallback.EVENT_ERROR) != 0) { } else if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) { status = new Status(Status.DEAD); } if (status != null) { queue.unregisterFileDescriptorCallback(fd); queue.removeOnFileDescriptorEventListener(fd); IoUtils.closeQuietly(fd); listener.onClose(status.asIOException()); return 0; Loading Loading
api/current.txt +8 −9 Original line number Diff line number Diff line Loading @@ -23099,24 +23099,23 @@ package android.os { public final class MessageQueue { method public void addIdleHandler(android.os.MessageQueue.IdleHandler); method public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue.OnFileDescriptorEventListener); method public boolean isIdle(); method public void registerFileDescriptorCallback(java.io.FileDescriptor, int, android.os.MessageQueue.FileDescriptorCallback); method public void removeIdleHandler(android.os.MessageQueue.IdleHandler); method public void unregisterFileDescriptorCallback(java.io.FileDescriptor); method public void removeOnFileDescriptorEventListener(java.io.FileDescriptor); } public static abstract class MessageQueue.FileDescriptorCallback { ctor public MessageQueue.FileDescriptorCallback(); method public int onFileDescriptorEvents(java.io.FileDescriptor, int); public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public static abstract interface MessageQueue.OnFileDescriptorEventListener { method public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int); field public static final int EVENT_ERROR = 4; // 0x4 field public static final int EVENT_INPUT = 1; // 0x1 field public static final int EVENT_OUTPUT = 2; // 0x2 } public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public final class Messenger implements android.os.Parcelable { ctor public Messenger(android.os.Handler); ctor public Messenger(android.os.IBinder);
api/system-current.txt +8 −9 Original line number Diff line number Diff line Loading @@ -25013,24 +25013,23 @@ package android.os { public final class MessageQueue { method public void addIdleHandler(android.os.MessageQueue.IdleHandler); method public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue.OnFileDescriptorEventListener); method public boolean isIdle(); method public void registerFileDescriptorCallback(java.io.FileDescriptor, int, android.os.MessageQueue.FileDescriptorCallback); method public void removeIdleHandler(android.os.MessageQueue.IdleHandler); method public void unregisterFileDescriptorCallback(java.io.FileDescriptor); method public void removeOnFileDescriptorEventListener(java.io.FileDescriptor); } public static abstract class MessageQueue.FileDescriptorCallback { ctor public MessageQueue.FileDescriptorCallback(); method public int onFileDescriptorEvents(java.io.FileDescriptor, int); public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public static abstract interface MessageQueue.OnFileDescriptorEventListener { method public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int); field public static final int EVENT_ERROR = 4; // 0x4 field public static final int EVENT_INPUT = 1; // 0x1 field public static final int EVENT_OUTPUT = 2; // 0x2 } public static abstract interface MessageQueue.IdleHandler { method public abstract boolean queueIdle(); } public final class Messenger implements android.os.Parcelable { ctor public Messenger(android.os.Handler); ctor public Messenger(android.os.IBinder);
core/java/android/os/MessageQueue.java +55 −60 Original line number Diff line number Diff line Loading @@ -160,67 +160,67 @@ public final class MessageQueue { } /** * Registers a file descriptor callback to receive notification when file descriptor * Adds a file descriptor listener to receive notification when file descriptor * related events occur. * <p> * If the file descriptor has already been registered, the specified events * and callback will replace any that were previously associated with it. * It is not possible to set more than one callback per file descriptor. * and listener will replace any that were previously associated with it. * It is not possible to set more than one listener per file descriptor. * </p><p> * It is important to always unregister the callback when the file descriptor * It is important to always unregister the listener when the file descriptor * is no longer of use. * </p> * * @param fd The file descriptor for which a callback will be registered. * @param fd The file descriptor for which a listener will be registered. * @param events The set of events to receive: a combination of the * {@link FileDescriptorCallback#EVENT_INPUT}, * {@link FileDescriptorCallback#EVENT_OUTPUT}, and * {@link FileDescriptorCallback#EVENT_ERROR} event masks. If the requested * set of events is zero, then the callback is unregistered. * @param callback The callback to invoke when file descriptor events occur. * {@link OnFileDescriptorEventListener#EVENT_INPUT}, * {@link OnFileDescriptorEventListener#EVENT_OUTPUT}, and * {@link OnFileDescriptorEventListener#EVENT_ERROR} event masks. If the requested * set of events is zero, then the listener is unregistered. * @param listener The listener to invoke when file descriptor events occur. * * @see FileDescriptorCallback * @see #unregisterFileDescriptorCallback * @see OnFileDescriptorEventListener * @see #removeOnFileDescriptorEventListener */ public void registerFileDescriptorCallback(@NonNull FileDescriptor fd, @FileDescriptorCallback.Events int events, @NonNull FileDescriptorCallback callback) { public void addOnFileDescriptorEventListener(@NonNull FileDescriptor fd, @OnFileDescriptorEventListener.Events int events, @NonNull OnFileDescriptorEventListener listener) { if (fd == null) { throw new IllegalArgumentException("fd must not be null"); } if (callback == null) { throw new IllegalArgumentException("callback must not be null"); if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } synchronized (this) { setFileDescriptorCallbackLocked(fd, events, callback); updateOnFileDescriptorEventListenerLocked(fd, events, listener); } } /** * Unregisters a file descriptor callback. * Removes a file descriptor listener. * <p> * This method does nothing if no callback has been registered for the * This method does nothing if no listener has been registered for the * specified file descriptor. * </p> * * @param fd The file descriptor whose callback will be unregistered. * @param fd The file descriptor whose listener will be unregistered. * * @see FileDescriptorCallback * @see #registerFileDescriptorCallback * @see OnFileDescriptorEventListener * @see #addOnFileDescriptorEventListener */ public void unregisterFileDescriptorCallback(@NonNull FileDescriptor fd) { public void removeOnFileDescriptorEventListener(@NonNull FileDescriptor fd) { if (fd == null) { throw new IllegalArgumentException("fd must not be null"); } synchronized (this) { setFileDescriptorCallbackLocked(fd, 0, null); updateOnFileDescriptorEventListenerLocked(fd, 0, null); } } private void setFileDescriptorCallbackLocked(FileDescriptor fd, int events, FileDescriptorCallback callback) { private void updateOnFileDescriptorEventListenerLocked(FileDescriptor fd, int events, OnFileDescriptorEventListener listener) { final int fdNum = fd.getInt$(); int index = -1; Loading @@ -236,15 +236,15 @@ public final class MessageQueue { } if (events != 0) { events |= FileDescriptorCallback.EVENT_ERROR; events |= OnFileDescriptorEventListener.EVENT_ERROR; if (record == null) { if (mFileDescriptorRecords == null) { mFileDescriptorRecords = new SparseArray<FileDescriptorRecord>(); } record = new FileDescriptorRecord(fd, events, callback); record = new FileDescriptorRecord(fd, events, listener); mFileDescriptorRecords.put(fdNum, record); } else { record.mCallback = callback; record.mListener = listener; record.mEvents = events; record.mSeq += 1; } Loading @@ -260,12 +260,12 @@ public final class MessageQueue { // Get the file descriptor record and any state that might change. final FileDescriptorRecord record; final int oldWatchedEvents; final FileDescriptorCallback callback; final OnFileDescriptorEventListener listener; final int seq; synchronized (this) { record = mFileDescriptorRecords.get(fd); if (record == null) { return 0; // spurious, no callback registered return 0; // spurious, no listener registered } oldWatchedEvents = record.mEvents; Loading @@ -274,19 +274,19 @@ public final class MessageQueue { return oldWatchedEvents; // spurious, watched events changed } callback = record.mCallback; listener = record.mListener; seq = record.mSeq; } // Invoke the callback outside of the lock. int newWatchedEvents = callback.onFileDescriptorEvents( // Invoke the listener outside of the lock. int newWatchedEvents = listener.onFileDescriptorEvents( record.mDescriptor, events); if (newWatchedEvents != 0) { newWatchedEvents |= FileDescriptorCallback.EVENT_ERROR; newWatchedEvents |= OnFileDescriptorEventListener.EVENT_ERROR; } // Update the file descriptor record if the callback changed the set of // events to watch and the callback itself hasn't been updated since. // Update the file descriptor record if the listener changed the set of // events to watch and the listener itself hasn't been updated since. if (newWatchedEvents != oldWatchedEvents) { synchronized (this) { int index = mFileDescriptorRecords.indexOfKey(fd); Loading Loading @@ -786,23 +786,23 @@ public final class MessageQueue { } /** * A callback which is invoked when file descriptor related events occur. * A listener which is invoked when file descriptor related events occur. */ public static abstract class FileDescriptorCallback { public interface OnFileDescriptorEventListener { /** * File descriptor event: Indicates that the file descriptor is ready for input * operations, such as reading. * <p> * The callback should read all available data from the file descriptor * then return <code>true</code> to keep the callback active or <code>false</code> * to remove the callback. * The listener should read all available data from the file descriptor * then return <code>true</code> to keep the listener active or <code>false</code> * to remove the listener. * </p><p> * In the case of a socket, this event may be generated to indicate * that there is at least one incoming connection that the callback * that there is at least one incoming connection that the listener * should accept. * </p><p> * This event will only be generated if the {@link #EVENT_INPUT} event mask was * specified when the callback was added. * specified when the listener was added. * </p> */ public static final int EVENT_INPUT = 1 << 0; Loading @@ -811,14 +811,14 @@ public final class MessageQueue { * File descriptor event: Indicates that the file descriptor is ready for output * operations, such as writing. * <p> * The callback should write as much data as it needs. If it could not * The listener should write as much data as it needs. If it could not * write everything at once, then it should return <code>true</code> to * keep the callback active. Otherwise, it should return <code>false</code> * to remove the callback then re-register it later when it needs to write * keep the listener active. Otherwise, it should return <code>false</code> * to remove the listener then re-register it later when it needs to write * something else. * </p><p> * This event will only be generated if the {@link #EVENT_OUTPUT} event mask was * specified when the callback was added. * specified when the listener was added. * </p> */ public static final int EVENT_OUTPUT = 1 << 1; Loading @@ -831,7 +831,7 @@ public final class MessageQueue { * is when the remote peer of a socket or pipe closes its end of the connection. * </p><p> * This event may be generated at any time regardless of whether the * {@link #EVENT_ERROR} event mask was specified when the callback was added. * {@link #EVENT_ERROR} event mask was specified when the listener was added. * </p> */ public static final int EVENT_ERROR = 1 << 2; Loading @@ -843,35 +843,30 @@ public final class MessageQueue { /** * Called when a file descriptor receives events. * <p> * The default implementation does nothing and returns 0 to unregister the callback. * </p> * * @param fd The file descriptor. * @param events The set of events that occurred: a combination of the * {@link #EVENT_INPUT}, {@link #EVENT_OUTPUT}, and {@link #EVENT_ERROR} event masks. * @return The new set of events to watch, or 0 to unregister the callback. * @return The new set of events to watch, or 0 to unregister the listener. * * @see #EVENT_INPUT * @see #EVENT_OUTPUT * @see #EVENT_ERROR */ public @Events int onFileDescriptorEvents(@NonNull FileDescriptor fd, @Events int events) { return 0; } @Events int onFileDescriptorEvents(@NonNull FileDescriptor fd, @Events int events); } private static final class FileDescriptorRecord { public final FileDescriptor mDescriptor; public int mEvents; public FileDescriptorCallback mCallback; public OnFileDescriptorEventListener mListener; public int mSeq; public FileDescriptorRecord(FileDescriptor descriptor, int events, FileDescriptorCallback callback) { int events, OnFileDescriptorEventListener listener) { mDescriptor = descriptor; mEvents = events; mCallback = callback; mListener = listener; } } }
core/java/android/os/ParcelFileDescriptor.java +6 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import static android.system.OsConstants.S_ISREG; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.os.MessageQueue.FileDescriptorCallback; import android.os.MessageQueue.OnFileDescriptorEventListener; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; Loading Loading @@ -236,19 +236,19 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { final FileDescriptor[] comm = createCommSocketPair(); final ParcelFileDescriptor pfd = new ParcelFileDescriptor(fd, comm[0]); final MessageQueue queue = handler.getLooper().getQueue(); queue.registerFileDescriptorCallback(comm[1], FileDescriptorCallback.EVENT_INPUT, new FileDescriptorCallback() { queue.addOnFileDescriptorEventListener(comm[1], OnFileDescriptorEventListener.EVENT_INPUT, new OnFileDescriptorEventListener() { @Override public int onFileDescriptorEvents(FileDescriptor fd, int events) { Status status = null; if ((events & FileDescriptorCallback.EVENT_INPUT) != 0) { if ((events & OnFileDescriptorEventListener.EVENT_INPUT) != 0) { final byte[] buf = new byte[MAX_STATUS]; status = readCommStatus(fd, buf); } else if ((events & FileDescriptorCallback.EVENT_ERROR) != 0) { } else if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) { status = new Status(Status.DEAD); } if (status != null) { queue.unregisterFileDescriptorCallback(fd); queue.removeOnFileDescriptorEventListener(fd); IoUtils.closeQuietly(fd); listener.onClose(status.asIOException()); return 0; Loading