diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Format.java b/library/core/src/main/java/com/google/android/exoplayer2/Format.java index 4c6e1838a8..3456fc39a2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Format.java @@ -1409,10 +1409,8 @@ public final class Format implements Parcelable { // Utility methods - /** - * Returns a prettier {@link String} than {@link #toString()}, intended for logging. - */ - public static String toLogString(Format format) { + /** Returns a prettier {@link String} than {@link #toString()}, intended for logging. */ + public static String toLogString(@Nullable Format format) { if (format == null) { return "null"; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java index c2adda88e5..14f678374c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java @@ -19,6 +19,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataDecoder; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; @@ -39,8 +40,8 @@ public final class EventMessageDecoder implements MetadataDecoder { byte[] data = buffer.array(); int size = buffer.limit(); ParsableByteArray emsgData = new ParsableByteArray(data, size); - String schemeIdUri = emsgData.readNullTerminatedString(); - String value = emsgData.readNullTerminatedString(); + String schemeIdUri = Assertions.checkNotNull(emsgData.readNullTerminatedString()); + String value = Assertions.checkNotNull(emsgData.readNullTerminatedString()); long timescale = emsgData.readUnsignedInt(); long presentationTimeUs = Util.scaleLargeTimestamp(emsgData.readUnsignedInt(), C.MICROS_PER_SECOND, timescale); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java b/library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java index b33fc2b922..5c1ee36a21 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java @@ -103,7 +103,7 @@ public final class AtomicFile { str = new AtomicFileOutputStream(baseName); } catch (FileNotFoundException e) { File parent = baseName.getParentFile(); - if (!parent.mkdirs()) { + if (parent == null || !parent.mkdirs()) { throw new IOException("Couldn't create directory " + baseName, e); } try { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 0861e706b5..a267d9fccb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -42,6 +42,7 @@ import java.text.NumberFormat; import java.util.Locale; /** Logs events from {@link Player} and other core components using {@link Log}. */ +@SuppressWarnings("UngroupedOverloads") public class EventLogger implements AnalyticsListener { private static final String DEFAULT_TAG = "EventLogger"; @@ -435,7 +436,7 @@ public class EventLogger implements AnalyticsListener { * @param msg The message to log. * @param tr The exception to log. */ - protected void loge(String msg, Throwable tr) { + protected void loge(String msg, @Nullable Throwable tr) { Log.e(tag, msg, tr); } @@ -449,12 +450,15 @@ public class EventLogger implements AnalyticsListener { logd(getEventString(eventTime, eventName, eventDescription)); } - private void loge(EventTime eventTime, String eventName, Throwable throwable) { + private void loge(EventTime eventTime, String eventName, @Nullable Throwable throwable) { loge(getEventString(eventTime, eventName), throwable); } private void loge( - EventTime eventTime, String eventName, String eventDescription, Throwable throwable) { + EventTime eventTime, + String eventName, + String eventDescription, + @Nullable Throwable throwable) { loge(getEventString(eventTime, eventName, eventDescription), throwable); } @@ -548,8 +552,8 @@ public class EventLogger implements AnalyticsListener { // Suppressing reference equality warning because the track group stored in the track selection // must point to the exact track group object to be considered part of it. @SuppressWarnings("ReferenceEquality") - private static String getTrackStatusString(TrackSelection selection, TrackGroup group, - int trackIndex) { + private static String getTrackStatusString( + @Nullable TrackSelection selection, TrackGroup group, int trackIndex) { return getTrackStatusString(selection != null && selection.getTrackGroup() == group && selection.indexOf(trackIndex) != C.INDEX_UNSET); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java index c60caf9ba8..2d8bf95fd1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java @@ -28,10 +28,10 @@ public final class ParsableBitArray { private int bitOffset; private int byteLimit; - /** - * Creates a new instance that initially has no backing data. - */ - public ParsableBitArray() {} + /** Creates a new instance that initially has no backing data. */ + public ParsableBitArray() { + data = Util.EMPTY_BYTE_ARRAY; + } /** * Creates a new instance that wraps an existing array. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java index b92673e331..464061153f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.util; +import android.support.annotation.Nullable; import com.google.android.exoplayer2.C; import java.nio.ByteBuffer; import java.nio.charset.Charset; @@ -30,10 +31,10 @@ public final class ParsableByteArray { private int position; private int limit; - /** - * Creates a new instance that initially has no backing data. - */ - public ParsableByteArray() {} + /** Creates a new instance that initially has no backing data. */ + public ParsableByteArray() { + data = Util.EMPTY_BYTE_ARRAY; + } /** * Creates a new instance with {@code limit} bytes and sets the limit. @@ -131,7 +132,7 @@ public final class ParsableByteArray { * Returns the capacity of the array, which may be larger than the limit. */ public int capacity() { - return data == null ? 0 : data.length; + return data.length; } /** @@ -481,7 +482,7 @@ public final class ParsableByteArray { * @return The string not including any terminating NUL byte, or null if the end of the data has * already been reached. */ - public String readNullTerminatedString() { + public @Nullable String readNullTerminatedString() { if (bytesLeft() == 0) { return null; } @@ -507,7 +508,7 @@ public final class ParsableByteArray { * @return The line not including any line-termination characters, or null if the end of the data * has already been reached. */ - public String readLine() { + public @Nullable String readLine() { if (bytesLeft() == 0) { return null; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java index 3a7202c674..6d34a4190e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java @@ -35,6 +35,7 @@ public final class ParsableNalUnitBitArray { * @param offset The byte offset in {@code data} to start reading from. * @param limit The byte offset of the end of the bitstream in {@code data}. */ + @SuppressWarnings({"initialization.fields.uninitialized", "method.invocation.invalid"}) public ParsableNalUnitBitArray(byte[] data, int offset, int limit) { reset(data, offset, limit); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java b/library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java index 2516b538c6..2ebda60821 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java @@ -111,7 +111,7 @@ public final class PriorityTaskManager { public void remove(int priority) { synchronized (lock) { queue.remove(priority); - highestPriority = queue.isEmpty() ? Integer.MIN_VALUE : queue.peek(); + highestPriority = queue.isEmpty() ? Integer.MIN_VALUE : Util.castNonNull(queue.peek()); lock.notifyAll(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java index 6ee1247dc2..5ed0ba6b7e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -1678,9 +1678,9 @@ public final class Util { * * @param input Wraps the compressed input data. * @param output Wraps an output buffer to be used to store the uncompressed data. If {@code - * output.data} is null or it isn't big enough to hold the uncompressed data, a new array is - * created. If {@code true} is returned then the output's position will be set to 0 and its - * limit will be set to the length of the uncompressed data. + * output.data} isn't big enough to hold the uncompressed data, a new array is created. If + * {@code true} is returned then the output's position will be set to 0 and its limit will be + * set to the length of the uncompressed data. * @param inflater If not null, used to uncompressed the input. Otherwise a new {@link Inflater} * is created. * @return Whether the input is uncompressed successfully. @@ -1691,8 +1691,8 @@ public final class Util { return false; } byte[] outputData = output.data; - if (outputData == null) { - outputData = new byte[input.bytesLeft()]; + if (outputData.length < input.bytesLeft()) { + outputData = new byte[2 * input.bytesLeft()]; } if (inflater == null) { inflater = new Inflater(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/XmlPullParserUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/util/XmlPullParserUtil.java index 6d568b14c6..3b72a60fb9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/XmlPullParserUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/XmlPullParserUtil.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.util; +import android.support.annotation.Nullable; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -93,7 +94,7 @@ public final class XmlPullParserUtil { * @return The value of the attribute, or null if the current event is not a start tag or if no * such attribute was found. */ - public static String getAttributeValue(XmlPullParser xpp, String attributeName) { + public static @Nullable String getAttributeValue(XmlPullParser xpp, String attributeName) { int attributeCount = xpp.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { if (xpp.getAttributeName(i).equals(attributeName)) { @@ -112,7 +113,8 @@ public final class XmlPullParserUtil { * @return The value of the attribute, or null if the current event is not a start tag or if no * such attribute was found. */ - public static String getAttributeValueIgnorePrefix(XmlPullParser xpp, String attributeName) { + public static @Nullable String getAttributeValueIgnorePrefix( + XmlPullParser xpp, String attributeName) { int attributeCount = xpp.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { if (stripPrefix(xpp.getAttributeName(i)).equals(attributeName)) {