Loading apex/media/framework/java/android/media/MediaParser.java +2 −1 Original line number Diff line number Diff line Loading @@ -219,7 +219,8 @@ public final class MediaParser { * duration is unknown. */ public long getDurationMicros() { return mExoPlayerSeekMap.getDurationUs(); long durationUs = mExoPlayerSeekMap.getDurationUs(); return durationUs != C.TIME_UNSET ? durationUs : UNKNOWN_DURATION; } /** Loading apex/statsd/framework/java/android/util/StatsEvent.java +42 −8 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.os.SystemClock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.util.Arrays; /** * StatsEvent builds and stores the buffer sent over the statsd socket. * This class defines and encapsulates the socket protocol. Loading Loading @@ -224,7 +226,9 @@ public final class StatsEvent { // Max payload size is 4 bytes less as 4 bytes are reserved for statsEventTag. // See android_util_StatsLog.cpp. private static final int MAX_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; private static final int MAX_PUSH_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; private static final int MAX_PULL_PAYLOAD_SIZE = 50 * 1024; // 50 KB private final int mAtomId; private final byte[] mPayload; Loading Loading @@ -619,6 +623,7 @@ public final class StatsEvent { @NonNull public Builder usePooledBuffer() { mUsePooledBuffer = true; mBuffer.setMaxSize(MAX_PUSH_PAYLOAD_SIZE, mPos); return this; } Loading Loading @@ -694,8 +699,9 @@ public final class StatsEvent { @GuardedBy("sLock") private static Buffer sPool; private final byte[] mBytes = new byte[MAX_PAYLOAD_SIZE]; private byte[] mBytes = new byte[MAX_PUSH_PAYLOAD_SIZE]; private boolean mOverflow = false; private int mMaxSize = MAX_PULL_PAYLOAD_SIZE; @NonNull private static Buffer obtain() { Loading @@ -717,15 +723,26 @@ public final class StatsEvent { } private void release() { // Recycle this Buffer if its size is MAX_PUSH_PAYLOAD_SIZE or under. if (mBytes.length <= MAX_PUSH_PAYLOAD_SIZE) { synchronized (sLock) { if (null == sPool) { sPool = this; } } } } private void reset() { mOverflow = false; mMaxSize = MAX_PULL_PAYLOAD_SIZE; } private void setMaxSize(final int maxSize, final int numBytesWritten) { mMaxSize = maxSize; if (numBytesWritten > maxSize) { mOverflow = true; } } private boolean hasOverflowed() { Loading @@ -740,11 +757,28 @@ public final class StatsEvent { * @return true if space is available, false otherwise. **/ private boolean hasEnoughSpace(final int index, final int numBytes) { final boolean result = index + numBytes < MAX_PAYLOAD_SIZE; if (!result) { final int totalBytesNeeded = index + numBytes; if (totalBytesNeeded > mMaxSize) { mOverflow = true; return false; } // Expand buffer if needed. if (mBytes.length < mMaxSize && totalBytesNeeded > mBytes.length) { int newSize = mBytes.length; do { newSize *= 2; } while (newSize <= totalBytesNeeded); if (newSize > mMaxSize) { newSize = mMaxSize; } return result; mBytes = Arrays.copyOf(mBytes, newSize); } return true; } /** Loading apex/statsd/framework/test/src/android/util/StatsEventTest.java +160 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import org.junit.runner.RunWith; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Random; /** * Internal tests for {@link StatsEvent}. Loading Loading @@ -644,6 +645,165 @@ public class StatsEventTest { statsEvent.release(); } @Test public void testLargePulledEvent() { final int expectedAtomId = 10_020; byte[] field1 = new byte[10 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not byte array") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_BYTE_ARRAY); final byte[] field1Actual = getByteArrayFromByteBuffer(buffer); assertWithMessage("Incorrect field 1").that(field1Actual).isEqualTo(field1); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } @Test public void testPulledEventOverflow() { final int expectedAtomId = 10_020; byte[] field1 = new byte[50 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not errors type") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_ERRORS); final int errorMask = buffer.getInt(); assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") .that(errorMask) .isEqualTo(StatsEvent.ERROR_OVERFLOW); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } @Test public void testPushedEventOverflow() { final int expectedAtomId = 10_020; byte[] field1 = new byte[10 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(expectedAtomId) .writeByteArray(field1) .usePooledBuffer() .build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not errors type") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_ERRORS); final int errorMask = buffer.getInt(); assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") .that(errorMask) .isEqualTo(StatsEvent.ERROR_OVERFLOW); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } private static byte[] getByteArrayFromByteBuffer(final ByteBuffer buffer) { final int numBytes = buffer.getInt(); byte[] bytes = new byte[numBytes]; Loading api/test-current.txt +124 −0 Original line number Diff line number Diff line Loading @@ -1298,6 +1298,130 @@ package android.hardware.display { } package android.hardware.hdmi { public final class HdmiControlManager { method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); method @RequiresPermission("android.permission.HDMI_CEC") public void setStandbyMode(boolean); field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; field public static final int AVR_VOLUME_MUTED = 101; // 0x65 field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 field public static final int POWER_STATUS_ON = 0; // 0x0 field public static final int POWER_STATUS_STANDBY = 1; // 0x1 field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 field public static final int RESULT_EXCEPTION = 5; // 0x5 field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 field public static final int RESULT_SUCCESS = 0; // 0x0 field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 field public static final int RESULT_TIMEOUT = 1; // 0x1 field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa } public final class HdmiControlServiceWrapper { ctor public HdmiControlServiceWrapper(); method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); method @BinderThread public void setDeviceTypes(@NonNull int[]); method @BinderThread public void setPortInfo(@NonNull java.util.List<android.hardware.hdmi.HdmiPortInfo>); field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 } public final class HdmiPortInfo implements android.os.Parcelable { ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); method public int describeContents(); method public int getAddress(); method public int getId(); method public int getType(); method public boolean isArcSupported(); method public boolean isCecSupported(); method public boolean isMhlSupported(); field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR; field public static final int PORT_INPUT = 0; // 0x0 field public static final int PORT_OUTPUT = 1; // 0x1 } public class HdmiSwitchClient { method public int getDeviceType(); method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo(); method public void sendKeyEvent(int, boolean); method public void sendVendorCommand(int, byte[], boolean); } } package android.hardware.lights { public final class Light implements android.os.Parcelable { Loading cmds/idmap2/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -168,13 +168,13 @@ cc_binary { ], host_supported: true, srcs: [ "idmap2/CommandUtils.cpp", "idmap2/Create.cpp", "idmap2/CreateMultiple.cpp", "idmap2/Dump.cpp", "idmap2/Lookup.cpp", "idmap2/Main.cpp", "idmap2/Scan.cpp", "idmap2/Verify.cpp", ], target: { android: { Loading Loading
apex/media/framework/java/android/media/MediaParser.java +2 −1 Original line number Diff line number Diff line Loading @@ -219,7 +219,8 @@ public final class MediaParser { * duration is unknown. */ public long getDurationMicros() { return mExoPlayerSeekMap.getDurationUs(); long durationUs = mExoPlayerSeekMap.getDurationUs(); return durationUs != C.TIME_UNSET ? durationUs : UNKNOWN_DURATION; } /** Loading
apex/statsd/framework/java/android/util/StatsEvent.java +42 −8 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.os.SystemClock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.util.Arrays; /** * StatsEvent builds and stores the buffer sent over the statsd socket. * This class defines and encapsulates the socket protocol. Loading Loading @@ -224,7 +226,9 @@ public final class StatsEvent { // Max payload size is 4 bytes less as 4 bytes are reserved for statsEventTag. // See android_util_StatsLog.cpp. private static final int MAX_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; private static final int MAX_PUSH_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; private static final int MAX_PULL_PAYLOAD_SIZE = 50 * 1024; // 50 KB private final int mAtomId; private final byte[] mPayload; Loading Loading @@ -619,6 +623,7 @@ public final class StatsEvent { @NonNull public Builder usePooledBuffer() { mUsePooledBuffer = true; mBuffer.setMaxSize(MAX_PUSH_PAYLOAD_SIZE, mPos); return this; } Loading Loading @@ -694,8 +699,9 @@ public final class StatsEvent { @GuardedBy("sLock") private static Buffer sPool; private final byte[] mBytes = new byte[MAX_PAYLOAD_SIZE]; private byte[] mBytes = new byte[MAX_PUSH_PAYLOAD_SIZE]; private boolean mOverflow = false; private int mMaxSize = MAX_PULL_PAYLOAD_SIZE; @NonNull private static Buffer obtain() { Loading @@ -717,15 +723,26 @@ public final class StatsEvent { } private void release() { // Recycle this Buffer if its size is MAX_PUSH_PAYLOAD_SIZE or under. if (mBytes.length <= MAX_PUSH_PAYLOAD_SIZE) { synchronized (sLock) { if (null == sPool) { sPool = this; } } } } private void reset() { mOverflow = false; mMaxSize = MAX_PULL_PAYLOAD_SIZE; } private void setMaxSize(final int maxSize, final int numBytesWritten) { mMaxSize = maxSize; if (numBytesWritten > maxSize) { mOverflow = true; } } private boolean hasOverflowed() { Loading @@ -740,11 +757,28 @@ public final class StatsEvent { * @return true if space is available, false otherwise. **/ private boolean hasEnoughSpace(final int index, final int numBytes) { final boolean result = index + numBytes < MAX_PAYLOAD_SIZE; if (!result) { final int totalBytesNeeded = index + numBytes; if (totalBytesNeeded > mMaxSize) { mOverflow = true; return false; } // Expand buffer if needed. if (mBytes.length < mMaxSize && totalBytesNeeded > mBytes.length) { int newSize = mBytes.length; do { newSize *= 2; } while (newSize <= totalBytesNeeded); if (newSize > mMaxSize) { newSize = mMaxSize; } return result; mBytes = Arrays.copyOf(mBytes, newSize); } return true; } /** Loading
apex/statsd/framework/test/src/android/util/StatsEventTest.java +160 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import org.junit.runner.RunWith; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Random; /** * Internal tests for {@link StatsEvent}. Loading Loading @@ -644,6 +645,165 @@ public class StatsEventTest { statsEvent.release(); } @Test public void testLargePulledEvent() { final int expectedAtomId = 10_020; byte[] field1 = new byte[10 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not byte array") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_BYTE_ARRAY); final byte[] field1Actual = getByteArrayFromByteBuffer(buffer); assertWithMessage("Incorrect field 1").that(field1Actual).isEqualTo(field1); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } @Test public void testPulledEventOverflow() { final int expectedAtomId = 10_020; byte[] field1 = new byte[50 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not errors type") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_ERRORS); final int errorMask = buffer.getInt(); assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") .that(errorMask) .isEqualTo(StatsEvent.ERROR_OVERFLOW); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } @Test public void testPushedEventOverflow() { final int expectedAtomId = 10_020; byte[] field1 = new byte[10 * 1024]; new Random().nextBytes(field1); final long minTimestamp = SystemClock.elapsedRealtimeNanos(); final StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(expectedAtomId) .writeByteArray(field1) .usePooledBuffer() .build(); final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); final ByteBuffer buffer = ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); assertWithMessage("Root element in buffer is not TYPE_OBJECT") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_OBJECT); assertWithMessage("Incorrect number of elements in root object") .that(buffer.get()) .isEqualTo(3); assertWithMessage("First element is not timestamp") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_LONG); assertWithMessage("Incorrect timestamp") .that(buffer.getLong()) .isIn(Range.closed(minTimestamp, maxTimestamp)); assertWithMessage("Second element is not atom id") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_INT); assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); assertWithMessage("Third element is not errors type") .that(buffer.get()) .isEqualTo(StatsEvent.TYPE_ERRORS); final int errorMask = buffer.getInt(); assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") .that(errorMask) .isEqualTo(StatsEvent.ERROR_OVERFLOW); assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); statsEvent.release(); } private static byte[] getByteArrayFromByteBuffer(final ByteBuffer buffer) { final int numBytes = buffer.getInt(); byte[] bytes = new byte[numBytes]; Loading
api/test-current.txt +124 −0 Original line number Diff line number Diff line Loading @@ -1298,6 +1298,130 @@ package android.hardware.display { } package android.hardware.hdmi { public final class HdmiControlManager { method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); method @RequiresPermission("android.permission.HDMI_CEC") public void setStandbyMode(boolean); field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; field public static final int AVR_VOLUME_MUTED = 101; // 0x65 field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 field public static final int POWER_STATUS_ON = 0; // 0x0 field public static final int POWER_STATUS_STANDBY = 1; // 0x1 field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 field public static final int RESULT_EXCEPTION = 5; // 0x5 field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 field public static final int RESULT_SUCCESS = 0; // 0x0 field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 field public static final int RESULT_TIMEOUT = 1; // 0x1 field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa } public final class HdmiControlServiceWrapper { ctor public HdmiControlServiceWrapper(); method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); method @BinderThread public void setDeviceTypes(@NonNull int[]); method @BinderThread public void setPortInfo(@NonNull java.util.List<android.hardware.hdmi.HdmiPortInfo>); field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 } public final class HdmiPortInfo implements android.os.Parcelable { ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); method public int describeContents(); method public int getAddress(); method public int getId(); method public int getType(); method public boolean isArcSupported(); method public boolean isCecSupported(); method public boolean isMhlSupported(); field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR; field public static final int PORT_INPUT = 0; // 0x0 field public static final int PORT_OUTPUT = 1; // 0x1 } public class HdmiSwitchClient { method public int getDeviceType(); method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo(); method public void sendKeyEvent(int, boolean); method public void sendVendorCommand(int, byte[], boolean); } } package android.hardware.lights { public final class Light implements android.os.Parcelable { Loading
cmds/idmap2/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -168,13 +168,13 @@ cc_binary { ], host_supported: true, srcs: [ "idmap2/CommandUtils.cpp", "idmap2/Create.cpp", "idmap2/CreateMultiple.cpp", "idmap2/Dump.cpp", "idmap2/Lookup.cpp", "idmap2/Main.cpp", "idmap2/Scan.cpp", "idmap2/Verify.cpp", ], target: { android: { Loading