Commit d79f8f64 by ojw28 Committed by GitHub

Merge pull request #1970 from google/dev-v2-r2.0.4

r2.0.4
parents 08256eee c7824c46
# Release notes # # Release notes #
### r2.0.3 ### ### r2.0.4 ###
This release contains important bug fixes. Users of r2.0.0, r2.0.1 and r2.0.2 This release contains important bug fixes. Users of earlier r2.0.x versions
should proactively update to this version. should proactively update to this version.
* Fix crash on Jellybean devices when using playback controls
([#1965](https://github.com/google/ExoPlayer/issues/1965)).
### r2.0.3 ###
* Fixed NullPointerException in ExtractorMediaSource * Fixed NullPointerException in ExtractorMediaSource
([#1914](https://github.com/google/ExoPlayer/issues/1914). ([#1914](https://github.com/google/ExoPlayer/issues/1914)).
* Fixed NullPointerException in HlsMediaPeriod * Fixed NullPointerException in HlsMediaPeriod
([#1907](https://github.com/google/ExoPlayer/issues/1907). ([#1907](https://github.com/google/ExoPlayer/issues/1907)).
* Fixed memory leak in PlaybackControlView * Fixed memory leak in PlaybackControlView
([#1908](https://github.com/google/ExoPlayer/issues/1908). ([#1908](https://github.com/google/ExoPlayer/issues/1908)).
* Fixed strict mode violation when using * Fixed strict mode violation when using
SimpleExoPlayer.setVideoPlayerTextureView(). SimpleExoPlayer.setVideoPlayerTextureView().
* Fixed L3 Widevine provisioning * Fixed L3 Widevine provisioning
([#1925](https://github.com/google/ExoPlayer/issues/1925). ([#1925](https://github.com/google/ExoPlayer/issues/1925)).
* Fixed hiding of controls with use_controller="false" * Fixed hiding of controls with use_controller="false"
([#1919](https://github.com/google/ExoPlayer/issues/1919). ([#1919](https://github.com/google/ExoPlayer/issues/1919)).
* Improvements to Cronet network stack extension. * Improvements to Cronet network stack extension.
* Misc bug fixes. * Misc bug fixes.
......
...@@ -35,7 +35,7 @@ allprojects { ...@@ -35,7 +35,7 @@ allprojects {
releaseRepoName = 'exoplayer' releaseRepoName = 'exoplayer'
releaseUserOrg = 'google' releaseUserOrg = 'google'
releaseGroupId = 'com.google.android.exoplayer' releaseGroupId = 'com.google.android.exoplayer'
releaseVersion = 'r2.0.3' releaseVersion = 'r2.0.4'
releaseWebsite = 'https://github.com/google/ExoPlayer' releaseWebsite = 'https://github.com/google/ExoPlayer'
} }
} }
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.exoplayer2.demo" package="com.google.android.exoplayer2.demo"
android:versionCode="2003" android:versionCode="2004"
android:versionName="2.0.3"> android:versionName="2.0.4">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
......
...@@ -23,7 +23,7 @@ public interface ExoPlayerLibraryInfo { ...@@ -23,7 +23,7 @@ public interface ExoPlayerLibraryInfo {
/** /**
* The version of the library, expressed as a string. * The version of the library, expressed as a string.
*/ */
String VERSION = "2.0.3"; String VERSION = "2.0.4";
/** /**
* The version of the library, expressed as an integer. * The version of the library, expressed as an integer.
...@@ -32,7 +32,7 @@ public interface ExoPlayerLibraryInfo { ...@@ -32,7 +32,7 @@ public interface ExoPlayerLibraryInfo {
* corresponding integer version 1002003 (001-002-003), and "123.45.6" has the corresponding * corresponding integer version 1002003 (001-002-003), and "123.45.6" has the corresponding
* integer version 123045006 (123-045-006). * integer version 123045006 (123-045-006).
*/ */
int VERSION_INT = 2000003; int VERSION_INT = 2000004;
/** /**
* Whether the library was compiled with {@link com.google.android.exoplayer2.util.Assertions} * Whether the library was compiled with {@link com.google.android.exoplayer2.util.Assertions}
......
...@@ -44,6 +44,7 @@ import java.util.Collections; ...@@ -44,6 +44,7 @@ import java.util.Collections;
private static final int SUFFIX_SEI_NUT = 40; private static final int SUFFIX_SEI_NUT = 40;
private TrackOutput output; private TrackOutput output;
private SampleReader sampleReader;
private SeiReader seiReader; private SeiReader seiReader;
// State that should not be reset on seek. // State that should not be reset on seek.
...@@ -56,7 +57,6 @@ import java.util.Collections; ...@@ -56,7 +57,6 @@ import java.util.Collections;
private final NalUnitTargetBuffer pps; private final NalUnitTargetBuffer pps;
private final NalUnitTargetBuffer prefixSei; private final NalUnitTargetBuffer prefixSei;
private final NalUnitTargetBuffer suffixSei; // TODO: Are both needed? private final NalUnitTargetBuffer suffixSei; // TODO: Are both needed?
private final SampleReader sampleReader;
private long totalBytesWritten; private long totalBytesWritten;
// Per packet state that gets reset at the start of each packet. // Per packet state that gets reset at the start of each packet.
...@@ -72,7 +72,6 @@ import java.util.Collections; ...@@ -72,7 +72,6 @@ import java.util.Collections;
pps = new NalUnitTargetBuffer(PPS_NUT, 128); pps = new NalUnitTargetBuffer(PPS_NUT, 128);
prefixSei = new NalUnitTargetBuffer(PREFIX_SEI_NUT, 128); prefixSei = new NalUnitTargetBuffer(PREFIX_SEI_NUT, 128);
suffixSei = new NalUnitTargetBuffer(SUFFIX_SEI_NUT, 128); suffixSei = new NalUnitTargetBuffer(SUFFIX_SEI_NUT, 128);
sampleReader = new SampleReader(output);
seiWrapper = new ParsableByteArray(); seiWrapper = new ParsableByteArray();
} }
...@@ -91,6 +90,7 @@ import java.util.Collections; ...@@ -91,6 +90,7 @@ import java.util.Collections;
@Override @Override
public void init(ExtractorOutput extractorOutput, TrackIdGenerator idGenerator) { public void init(ExtractorOutput extractorOutput, TrackIdGenerator idGenerator) {
output = extractorOutput.track(idGenerator.getNextId()); output = extractorOutput.track(idGenerator.getNextId());
sampleReader = new SampleReader(output);
seiReader = new SeiReader(extractorOutput.track(idGenerator.getNextId())); seiReader = new SeiReader(extractorOutput.track(idGenerator.getNextId()));
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.ui; package com.google.android.exoplayer2.ui;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.os.SystemClock; import android.os.SystemClock;
...@@ -75,6 +76,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -75,6 +76,7 @@ public class PlaybackControlView extends FrameLayout {
private ExoPlayer player; private ExoPlayer player;
private VisibilityListener visibilityListener; private VisibilityListener visibilityListener;
private boolean isAttachedToWindow;
private boolean dragging; private boolean dragging;
private int rewindMs; private int rewindMs;
private int fastForwardMs; private int fastForwardMs;
...@@ -264,7 +266,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -264,7 +266,7 @@ public class PlaybackControlView extends FrameLayout {
removeCallbacks(hideAction); removeCallbacks(hideAction);
if (showTimeoutMs > 0) { if (showTimeoutMs > 0) {
hideAtMs = SystemClock.uptimeMillis() + showTimeoutMs; hideAtMs = SystemClock.uptimeMillis() + showTimeoutMs;
if (isAttachedToWindow()) { if (isAttachedToWindow) {
postDelayed(hideAction, showTimeoutMs); postDelayed(hideAction, showTimeoutMs);
} }
} else { } else {
...@@ -279,7 +281,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -279,7 +281,7 @@ public class PlaybackControlView extends FrameLayout {
} }
private void updatePlayPauseButton() { private void updatePlayPauseButton() {
if (!isVisible() || !isAttachedToWindow()) { if (!isVisible() || !isAttachedToWindow) {
return; return;
} }
boolean playing = player != null && player.getPlayWhenReady(); boolean playing = player != null && player.getPlayWhenReady();
...@@ -291,7 +293,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -291,7 +293,7 @@ public class PlaybackControlView extends FrameLayout {
} }
private void updateNavigation() { private void updateNavigation() {
if (!isVisible() || !isAttachedToWindow()) { if (!isVisible() || !isAttachedToWindow) {
return; return;
} }
Timeline currentTimeline = player != null ? player.getCurrentTimeline() : null; Timeline currentTimeline = player != null ? player.getCurrentTimeline() : null;
...@@ -315,7 +317,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -315,7 +317,7 @@ public class PlaybackControlView extends FrameLayout {
} }
private void updateProgress() { private void updateProgress() {
if (!isVisible() || !isAttachedToWindow()) { if (!isVisible() || !isAttachedToWindow) {
return; return;
} }
long duration = player == null ? 0 : player.getDuration(); long duration = player == null ? 0 : player.getDuration();
...@@ -350,13 +352,18 @@ public class PlaybackControlView extends FrameLayout { ...@@ -350,13 +352,18 @@ public class PlaybackControlView extends FrameLayout {
private void setButtonEnabled(boolean enabled, View view) { private void setButtonEnabled(boolean enabled, View view) {
view.setEnabled(enabled); view.setEnabled(enabled);
if (Util.SDK_INT >= 11) { if (Util.SDK_INT >= 11) {
view.setAlpha(enabled ? 1f : 0.3f); setViewAlphaV11(view, enabled ? 1f : 0.3f);
view.setVisibility(VISIBLE); view.setVisibility(VISIBLE);
} else { } else {
view.setVisibility(enabled ? VISIBLE : INVISIBLE); view.setVisibility(enabled ? VISIBLE : INVISIBLE);
} }
} }
@TargetApi(11)
private void setViewAlphaV11(View view, float alpha) {
view.setAlpha(alpha);
}
private String stringForTime(long timeMs) { private String stringForTime(long timeMs) {
if (timeMs == C.TIME_UNSET) { if (timeMs == C.TIME_UNSET) {
timeMs = 0; timeMs = 0;
...@@ -426,6 +433,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -426,6 +433,7 @@ public class PlaybackControlView extends FrameLayout {
@Override @Override
public void onAttachedToWindow() { public void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
isAttachedToWindow = true;
if (hideAtMs != C.TIME_UNSET) { if (hideAtMs != C.TIME_UNSET) {
long delayMs = hideAtMs - SystemClock.uptimeMillis(); long delayMs = hideAtMs - SystemClock.uptimeMillis();
if (delayMs <= 0) { if (delayMs <= 0) {
...@@ -440,6 +448,7 @@ public class PlaybackControlView extends FrameLayout { ...@@ -440,6 +448,7 @@ public class PlaybackControlView extends FrameLayout {
@Override @Override
public void onDetachedFromWindow() { public void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
isAttachedToWindow = false;
removeCallbacks(updateProgressAction); removeCallbacks(updateProgressAction);
removeCallbacks(hideAction); removeCallbacks(hideAction);
} }
......
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.google.android.exoplayer2.playbacktests" package="com.google.android.exoplayer2.playbacktests"
android:versionCode="2003" android:versionCode="2004"
android:versionName="2.0.3"> android:versionName="2.0.4">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment