From 2c9159ca96c7d92da0339957cf428becfa2e0e6f Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Fri, 24 Aug 2018 09:13:10 +0300 Subject: [PATCH 01/18] Updated dependencies versions --- dependencies.gradle | 18 +++++++++--------- library/build.gradle | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 86ca746..8772e74 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,15 +1,15 @@ ext.versions = [ minSdk : 19, - compileSdk : 27, - buildTools : '27.0.3', - publishVersion : '0.0.8', + compileSdk : 28, + buildTools : '28.0.2', + publishVersion : '0.0.9', publishVersionCode: 1, - gradlePlugin : '3.1.2', - bintrayPlugin : '1.7.3', + gradlePlugin : '3.1.4', + bintrayPlugin : '1.8.4', mavenPlugin : '1.4.1', - supportLib : '27.1.1', - espresso : '3.0.1', - kotlin : '1.2.41', - leakCanary : '1.5.4' + supportLib : '28.0.0-rc01', + espresso : '3.0.2', + kotlin : '1.2.61', + leakCanary : '1.6.1' ] \ No newline at end of file diff --git a/library/build.gradle b/library/build.gradle index 7572823..0521e5a 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -12,7 +12,6 @@ android { targetSdkVersion versions.compileSdk versionCode versions.publishVersionCode versionName versions.publishVersion - } lintOptions { abortOnError false From e7ee86d8e9f65e9706f916fd1b7c64e5c266c168 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Fri, 24 Aug 2018 09:45:25 +0300 Subject: [PATCH 02/18] Added test rules dependency in the sample's build.gradle Removed the deviceRotation test --- dependencies.gradle | 3 ++- sample/build.gradle | 1 + .../FullscreenVideoViewTest.java | 22 ------------------- 3 files changed, 3 insertions(+), 23 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 8772e74..b40412e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -11,5 +11,6 @@ ext.versions = [ supportLib : '28.0.0-rc01', espresso : '3.0.2', kotlin : '1.2.61', - leakCanary : '1.6.1' + leakCanary : '1.6.1', + testRules : '1.0.2' ] \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index a118d3d..c68e7c7 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -38,6 +38,7 @@ dependencies { implementation "com.android.support:design:$versions.supportLib" implementation "org.jetbrains.kotlin:kotlin-stdlib:$versions.kotlin" debugImplementation "com.squareup.leakcanary:leakcanary-android:$versions.leakCanary" + androidTestImplementation "com.android.support.test:rules:$versions.testRules" androidTestImplementation "com.android.support.test.espresso:espresso-core:$versions.espresso" } diff --git a/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/FullscreenVideoViewTest.java b/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/FullscreenVideoViewTest.java index 97352b0..816ec85 100644 --- a/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/FullscreenVideoViewTest.java +++ b/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/FullscreenVideoViewTest.java @@ -1,8 +1,5 @@ package bg.devlabs.fullscreenvideoviewsample; -import android.content.ContentResolver; -import android.content.pm.ActivityInfo; -import android.provider.Settings; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -22,7 +19,6 @@ import static bg.devlabs.fullscreenvideoviewsample.CustomChecks.clickNoConstraints; import static bg.devlabs.fullscreenvideoviewsample.CustomChecks.isOrientationLandscape; import static bg.devlabs.fullscreenvideoviewsample.CustomChecks.isOrientationPortrait; -import static bg.devlabs.fullscreenvideoviewsample.CustomChecks.setOrientation; import static junit.framework.Assert.assertTrue; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.not; @@ -94,27 +90,9 @@ public void fullscreenButtonClick() { assertTrue(isOrientationPortrait(isRoot())); } - @Test - public void deviceRotation() { - if (isRotationEnabled()) { - onView(isRoot()) - .perform(setOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)); - - assertTrue(isOrientationLandscape(isRoot())); - } else { - throw new IllegalStateException("The orientation of the device is not unlocked!"); - } - } - private static void clickToShowController() { onView(withId(R.id.fullscreenVideoView)) .check(matches(isDisplayed())) .perform(click()); } - - private boolean isRotationEnabled() { - ContentResolver contentResolver = activityTestRule.getActivity().getContentResolver(); - return Settings.System.getInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION, - 0) == 1; - } } From a206c477563e5efbccb697f8060eec3051eeef4c Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Fri, 24 Aug 2018 12:56:57 +0300 Subject: [PATCH 03/18] Removed unused methods --- .../CustomChecks.java | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/CustomChecks.java b/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/CustomChecks.java index fd41117..416478e 100644 --- a/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/CustomChecks.java +++ b/sample/src/androidTest/java/bg/devlabs/fullscreenvideoviewsample/CustomChecks.java @@ -87,31 +87,6 @@ private static Activity getActivityByView(Context context) { return null; } - // TODO: Add method for checking if the rotation is enabled - static ViewAction setOrientation(final int orientation) { - return new ViewAction() { - @Override - public Matcher getConstraints() { - return isRoot(); - } - - @Override - public String getDescription() { - return "Change orientation"; - } - - @Override - public void perform(UiController uiController, View view) { - uiController.loopMainThreadUntilIdle(); - changeOrientation(view, orientation); - } - }; - } - - private static void changeOrientation(View view, int orientation) { - getActivityByView(view).setRequestedOrientation(orientation); - } - static class OrientationViewAction implements ViewAction { enum OrientationType {PORTRAIT, LANDSCAPE} From a6702b451de4d368cd0a4746abf2b47dbeb7b6ab Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Fri, 24 Aug 2018 13:01:40 +0300 Subject: [PATCH 04/18] Added two new methods for showing the seek forward and seek backward buttons and added deprecated annotation to the old methods --- .../devlabs/fullscreenvideoview/Builder.java | 34 +++++++++++++++++-- .../VideoControllerView.java | 22 ++++++------ .../fullscreenvideoview/VideoMediaPlayer.java | 30 ++++++++++------ 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java index 8d8f35b..e71dd77 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java @@ -24,8 +24,10 @@ public class Builder { private final OrientationHelper orientationHelper; private final VideoMediaPlayer videoMediaPlayer; - Builder(FullscreenVideoView fullscreenVideoView, VideoControllerView controller, - OrientationHelper orientationHelper, VideoMediaPlayer videoMediaPlayer) { + Builder(FullscreenVideoView fullscreenVideoView, + VideoControllerView controller, + OrientationHelper orientationHelper, + VideoMediaPlayer videoMediaPlayer) { this.fullscreenVideoView = fullscreenVideoView; this.controller = controller; this.orientationHelper = orientationHelper; @@ -137,11 +139,39 @@ public Builder canPause(boolean canPause) { return this; } + public Builder addSeekForwardButton() { + videoMediaPlayer.addSeekForwardButton(); + return this; + } + + public Builder addSeekBackwardButton() { + videoMediaPlayer.addSeekBackwardButton(); + return this; + } + + /** + * Method implementation: pass 'true' to enable and pass 'false' to disable the + * seek backward button. It's is disabled by default, so when it has to be disabled the + * user passes 'false' to the method or just does not use it. In this case passing 'true' or + * 'false' is confusing. + * + * @deprecated As of release 1.0.0, replaced by {@link #addSeekBackwardButton()} ()} + */ + @Deprecated public Builder canSeekBackward(boolean canSeekBackward) { videoMediaPlayer.setCanSeekBackward(canSeekBackward); return this; } + /** + * Method implementation: pass 'true' to enable and pass 'false' to disable the + * seek forward button. It's is disabled by default, so when it has to be disabled the + * user passes 'false' to the method or just does not use it. In this case passing 'true' or + * 'false' is confusing. + * + * @deprecated As of release 1.0.0, replaced by {@link #addSeekForwardButton()} + */ + @Deprecated public Builder canSeekForward(boolean canSeekForward) { videoMediaPlayer.setCanSeekForward(canSeekForward); return this; diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java index 95b4c9d..1c63890 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java @@ -157,7 +157,7 @@ public void onClick(View v) { public VideoControllerView(Context context) { super(context); - LayoutInflater layoutInflater = LayoutInflater.from(getContext()); + LayoutInflater layoutInflater = LayoutInflater.from(context); layoutInflater.inflate(R.layout.video_controller, this, true); initControllerView(); } @@ -241,25 +241,23 @@ public void show() { } /** - * Disable pause or seek buttons if the stream cannot be paused or seeked. - * This requires the control interface to be a MediaPlayerControlExt + * Change the buttons visibility according to the flags in {@link #videoMediaPlayer}. */ - @SuppressWarnings("FeatureEnvy") - private void disableUnsupportedButtons() { + private void setupButtonsVisibility() { if (videoMediaPlayer == null) { return; } try { if (startPauseButton != null && !videoMediaPlayer.canPause()) { - startPauseButton.setEnabled(false); + startPauseButton.setEnabled(true); } - if (rewButton != null && !videoMediaPlayer.canSeekBackward()) { - rewButton.setEnabled(false); + if (rewButton != null && !videoMediaPlayer.showSeekBackwardButton()) { + rewButton.setEnabled(true); rewButton.setVisibility(INVISIBLE); } - if (ffwdButton != null && !videoMediaPlayer.canSeekForward()) { - ffwdButton.setEnabled(false); + if (ffwdButton != null && !videoMediaPlayer.showSeekForwardButton()) { + ffwdButton.setEnabled(true); ffwdButton.setVisibility(INVISIBLE); } } catch (IncompatibleClassChangeError ex) { @@ -284,7 +282,7 @@ private void show(int timeout) { if (startPauseButton != null) { startPauseButton.requestFocus(); } - disableUnsupportedButtons(); + setupButtonsVisibility(); setVisibility(VISIBLE); } @@ -403,7 +401,7 @@ public void setEnabled(boolean enabled) { if (progress != null) { progress.setEnabled(enabled); } - disableUnsupportedButtons(); + setupButtonsVisibility(); super.setEnabled(enabled); } diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java index 1cc27ef..ad65688 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java @@ -13,8 +13,8 @@ class VideoMediaPlayer extends MediaPlayer { private FullscreenVideoView fullscreenVideoView; private boolean isAutoStartEnabled; private boolean canPause = true; - private boolean canSeekBackward = true; - private boolean canSeekForward = true; + private boolean showSeekBackwardButton = false; + private boolean showSeekForwardButton = false; VideoMediaPlayer(@Nullable FullscreenVideoView fullscreenVideoView) { this.fullscreenVideoView = fullscreenVideoView; @@ -28,12 +28,12 @@ public boolean canPause() { return canPause; } - public boolean canSeekBackward() { - return canSeekBackward; + public boolean showSeekForwardButton() { + return showSeekForwardButton; } - public boolean canSeekForward() { - return canSeekForward; + public boolean showSeekBackwardButton() { + return showSeekBackwardButton; } public void toggleFullScreen() { @@ -69,11 +69,21 @@ public void setPauseEnabled(boolean canPause) { this.canPause = canPause; } - public void setCanSeekBackward(boolean canSeekBackward) { - this.canSeekBackward = canSeekBackward; + public void addSeekForwardButton() { + this.showSeekForwardButton = true; } - public void setCanSeekForward(boolean canSeekForward) { - this.canSeekForward = canSeekForward; + public void addSeekBackwardButton() { + this.showSeekBackwardButton = true; + } + + @Deprecated + void setCanSeekBackward(boolean canSeekBackward) { + this.showSeekBackwardButton = canSeekBackward; + } + + @Deprecated + void setCanSeekForward(boolean canSeekForward) { + this.showSeekForwardButton = canSeekForward; } } From 1fa4ada2d2e7046ef07a116876e7dc05c501fa76 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Fri, 24 Aug 2018 14:02:41 +0300 Subject: [PATCH 05/18] Added playback ImageButton in the layout video_controller Added the drawable files for the playback ImageButton Added showing or hiding the ImageButton by using the library's Builder --- .../devlabs/fullscreenvideoview/Builder.java | 5 +++ .../VideoControllerView.java | 23 +++++++++-- .../fullscreenvideoview/VideoMediaPlayer.java | 11 +++++- .../res/drawable/ic_playback_speed_0_25.xml | 12 ++++++ .../res/drawable/ic_playback_speed_0_5.xml | 12 ++++++ .../res/drawable/ic_playback_speed_0_75.xml | 12 ++++++ .../main/res/drawable/ic_playback_speed_1.xml | 12 ++++++ .../res/drawable/ic_playback_speed_1_25.xml | 12 ++++++ .../res/drawable/ic_playback_speed_1_5.xml | 12 ++++++ .../main/res/drawable/ic_playback_speed_2.xml | 12 ++++++ .../src/main/res/layout/video_controller.xml | 38 +++++++++++++------ library/src/main/res/values/cd_strings.xml | 1 + .../ActionBarActivity.kt | 5 ++- 13 files changed, 149 insertions(+), 18 deletions(-) create mode 100644 library/src/main/res/drawable/ic_playback_speed_0_25.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_0_5.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_0_75.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_1.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_1_25.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_1_5.xml create mode 100644 library/src/main/res/drawable/ic_playback_speed_2.xml diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java index e71dd77..2a66e2a 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java @@ -149,6 +149,11 @@ public Builder addSeekBackwardButton() { return this; } + public Builder addPlaybackSpeedButton() { + videoMediaPlayer.addPlaybackSpeedButton(); + return this; + } + /** * Method implementation: pass 'true' to enable and pass 'false' to disable the * seek backward button. It's is disabled by default, so when it has to be disabled the diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java index 1c63890..576abf7 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java @@ -87,6 +87,7 @@ class VideoControllerView extends FrameLayout { private ImageButton startPauseButton; private ImageButton ffwdButton; private ImageButton rewButton; + private ImageButton playbackSpeedButton; @Nullable private View.OnClickListener pauseListener = new OnClickListener() { @Override @@ -148,6 +149,13 @@ public void onClick(View v) { show(DEFAULT_TIMEOUT); } }; + @Nullable + private View.OnClickListener playbackSpeedListener = new OnClickListener() { + @Override + public void onClick(View v) { + + } + }; private DrawableHelper drawableHelper; private int progressBarColor = Color.WHITE; @@ -217,6 +225,11 @@ private void initControllerView() { rewButton.setOnClickListener(rewListener); } + playbackSpeedButton = findViewById(R.id.playback_speed_button); + if (playbackSpeedButton != null) { + playbackSpeedButton.setOnClickListener(playbackSpeedListener); + } + drawableHelper = new DrawableHelper(getContext(), startPauseButton, ffwdButton, rewButton, fullscreenButton); @@ -250,16 +263,20 @@ private void setupButtonsVisibility() { try { if (startPauseButton != null && !videoMediaPlayer.canPause()) { - startPauseButton.setEnabled(true); + startPauseButton.setEnabled(false); } if (rewButton != null && !videoMediaPlayer.showSeekBackwardButton()) { - rewButton.setEnabled(true); + rewButton.setEnabled(false); rewButton.setVisibility(INVISIBLE); } if (ffwdButton != null && !videoMediaPlayer.showSeekForwardButton()) { - ffwdButton.setEnabled(true); + ffwdButton.setEnabled(false); ffwdButton.setVisibility(INVISIBLE); } + if (playbackSpeedButton != null && !videoMediaPlayer.showPlaybackSpeedButton()) { + playbackSpeedButton.setEnabled(false); + playbackSpeedButton.setVisibility(INVISIBLE); + } } catch (IncompatibleClassChangeError ex) { // We were given an old version of the interface, that doesn't have // the canPause/canSeekXYZ methods. This is OK, it just means we diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java index ad65688..520e61d 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java @@ -15,6 +15,7 @@ class VideoMediaPlayer extends MediaPlayer { private boolean canPause = true; private boolean showSeekBackwardButton = false; private boolean showSeekForwardButton = false; + private boolean showPlaybackSpeedButton = false; VideoMediaPlayer(@Nullable FullscreenVideoView fullscreenVideoView) { this.fullscreenVideoView = fullscreenVideoView; @@ -36,6 +37,10 @@ public boolean showSeekBackwardButton() { return showSeekBackwardButton; } + public boolean showPlaybackSpeedButton() { + return showPlaybackSpeedButton; + } + public void toggleFullScreen() { if (fullscreenVideoView != null) { fullscreenVideoView.toggleFullscreen(); @@ -76,7 +81,11 @@ public void addSeekForwardButton() { public void addSeekBackwardButton() { this.showSeekBackwardButton = true; } - + + public void addPlaybackSpeedButton() { + this.showPlaybackSpeedButton = true; + } + @Deprecated void setCanSeekBackward(boolean canSeekBackward) { this.showSeekBackwardButton = canSeekBackward; diff --git a/library/src/main/res/drawable/ic_playback_speed_0_25.xml b/library/src/main/res/drawable/ic_playback_speed_0_25.xml new file mode 100644 index 0000000..ebdf21c --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_0_25.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_0_5.xml b/library/src/main/res/drawable/ic_playback_speed_0_5.xml new file mode 100644 index 0000000..3d653e1 --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_0_5.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_0_75.xml b/library/src/main/res/drawable/ic_playback_speed_0_75.xml new file mode 100644 index 0000000..2cd652a --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_0_75.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_1.xml b/library/src/main/res/drawable/ic_playback_speed_1.xml new file mode 100644 index 0000000..3ccac48 --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_1.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_1_25.xml b/library/src/main/res/drawable/ic_playback_speed_1_25.xml new file mode 100644 index 0000000..edd97b6 --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_1_25.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_1_5.xml b/library/src/main/res/drawable/ic_playback_speed_1_5.xml new file mode 100644 index 0000000..cb3422f --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_1_5.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/drawable/ic_playback_speed_2.xml b/library/src/main/res/drawable/ic_playback_speed_2.xml new file mode 100644 index 0000000..106e4f3 --- /dev/null +++ b/library/src/main/res/drawable/ic_playback_speed_2.xml @@ -0,0 +1,12 @@ + + + diff --git a/library/src/main/res/layout/video_controller.xml b/library/src/main/res/layout/video_controller.xml index c9c8d60..ff1348d 100644 --- a/library/src/main/res/layout/video_controller.xml +++ b/library/src/main/res/layout/video_controller.xml @@ -1,4 +1,5 @@ + - + android:gravity="center" + android:paddingEnd="8dp" + android:paddingStart="8dp" + android:text="1.00x" + android:textColor="#CC000000" + tools:ignore="HardcodedText" /> Date: Tue, 28 Aug 2018 12:24:58 +0300 Subject: [PATCH 13/18] Fixed issues related to the results from Analyze -> Inspect Code --- .../main/java/bg/devlabs/fullscreenvideoview/ButtonHelper.java | 2 +- .../bg/devlabs/fullscreenvideoview/PlaybackSpeedPopupMenu.java | 2 +- .../java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/ButtonHelper.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/ButtonHelper.java index 10195fe..79d8feb 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/ButtonHelper.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/ButtonHelper.java @@ -16,7 +16,7 @@ * Dev Labs * slavi@devlabs.bg */ -public class ButtonHelper { +class ButtonHelper { // Drawables for the buttons of the controller private Drawable exitFullscreenDrawable; private Drawable enterFullscreenDrawable; diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/PlaybackSpeedPopupMenu.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/PlaybackSpeedPopupMenu.java index cdfc63d..d5942ee 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/PlaybackSpeedPopupMenu.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/PlaybackSpeedPopupMenu.java @@ -14,7 +14,7 @@ * Dev Labs * slavi@devlabs.bg */ -public class PlaybackSpeedPopupMenu extends android.support.v7.widget.PopupMenu { +class PlaybackSpeedPopupMenu extends android.support.v7.widget.PopupMenu { private ArrayList values = new ArrayList<>(Arrays.asList(0.25f, 0.5f, 0.75f, 1f, 1.25f, 1.5f, 2f)); diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java index 1ff7a99..f1ba6b5 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java @@ -89,12 +89,10 @@ public void addPlaybackSpeedButton() { this.showPlaybackSpeedButton = true; } - @Deprecated void setCanSeekBackward(boolean canSeekBackward) { this.showSeekBackwardButton = canSeekBackward; } - @Deprecated void setCanSeekForward(boolean canSeekForward) { this.showSeekForwardButton = canSeekForward; } From f283a2cf0bf418b9e8ba2df305aa88c1d65d9380 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Thu, 4 Oct 2018 15:37:09 +0300 Subject: [PATCH 14/18] Updated Gradle's and dependencies' versions Fixed videos not working on Android Pie Changed the MediaPlayer AudioAttributes content type from CONTENT_TYPE_SPEECH to CONTENT_TYPE_MUSIC Removed the contentDescription from the playback_speed_button in video_controller.xml --- dependencies.gradle | 17 ++++++++--------- gradle/wrapper/gradle-wrapper.properties | 4 ++-- .../FullscreenVideoView.java | 2 +- .../src/main/res/layout/video_controller.xml | 1 - .../ActionBarActivity.kt | 2 +- .../NoActionBarActivity.kt | 2 +- .../RegularActivity.kt | 2 +- .../ToolbarActivity.kt | 2 +- 8 files changed, 15 insertions(+), 17 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index b40412e..97d0b64 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,16 +1,15 @@ ext.versions = [ minSdk : 19, compileSdk : 28, - buildTools : '28.0.2', - publishVersion : '0.0.9', + buildTools : '28.0.3', + publishVersion : '0.0.8', publishVersionCode: 1, - gradlePlugin : '3.1.4', - bintrayPlugin : '1.8.4', + gradlePlugin : '3.2.0', + bintrayPlugin : '1.7.3', mavenPlugin : '1.4.1', - supportLib : '28.0.0-rc01', - espresso : '3.0.2', - kotlin : '1.2.61', - leakCanary : '1.6.1', - testRules : '1.0.2' + supportLib : '28.0.0', + espresso : '3.0.1', + kotlin : '1.2.71', + leakCanary : '1.6.1' ] \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index edfd5b1..d9c58a3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 25 17:03:14 EEST 2018 +#Thu Oct 04 12:51:40 EEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/FullscreenVideoView.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/FullscreenVideoView.java index 27d3164..a5d0367 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/FullscreenVideoView.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/FullscreenVideoView.java @@ -221,7 +221,7 @@ public void setupMediaPlayer(String videoPath) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setLegacyStreamType(AudioManager.STREAM_MUSIC) .build(); videoMediaPlayer.setAudioAttributes(audioAttributes); diff --git a/library/src/main/res/layout/video_controller.xml b/library/src/main/res/layout/video_controller.xml index 6535fd5..27f1c08 100644 --- a/library/src/main/res/layout/video_controller.xml +++ b/library/src/main/res/layout/video_controller.xml @@ -54,7 +54,6 @@ android:layout_centerVertical="true" android:layout_marginEnd="16dp" android:background="@color/white" - android:contentDescription="@string/cd_playback_speed_button" android:gravity="center" android:paddingEnd="8dp" android:paddingStart="8dp" diff --git a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ActionBarActivity.kt b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ActionBarActivity.kt index ce0389d..50218b7 100644 --- a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ActionBarActivity.kt +++ b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ActionBarActivity.kt @@ -29,7 +29,7 @@ class ActionBarActivity : AppCompatActivity() { // Change the ActionBar title supportActionBar?.title = getString(R.string.action_bar_activity) - val videoPath = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" + val videoPath = "https://clips.vorwaerts-gmbh.de/VfE_html5.mp4" fullscreenVideoView.videoUrl(videoPath) .progressBarColor(R.color.colorAccent) diff --git a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/NoActionBarActivity.kt b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/NoActionBarActivity.kt index 57e95cd..9944ce3 100644 --- a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/NoActionBarActivity.kt +++ b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/NoActionBarActivity.kt @@ -17,7 +17,7 @@ class NoActionBarActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_no_action_bar) - val videoPath = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" + val videoPath = "https://clips.vorwaerts-gmbh.de/VfE_html5.mp4" fullscreenVideoView.videoUrl(videoPath) } } diff --git a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/RegularActivity.kt b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/RegularActivity.kt index e3b3ed8..d3c3b2a 100644 --- a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/RegularActivity.kt +++ b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/RegularActivity.kt @@ -17,7 +17,7 @@ class RegularActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_regular) - val videoPath = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" + val videoPath = "https://clips.vorwaerts-gmbh.de/VfE_html5.mp4" fullscreenVideoView.videoUrl(videoPath) } } diff --git a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ToolbarActivity.kt b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ToolbarActivity.kt index 33dff60..b436de0 100644 --- a/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ToolbarActivity.kt +++ b/sample/src/main/java/bg/devlabs/fullscreenvideoviewsample/ToolbarActivity.kt @@ -17,7 +17,7 @@ class ToolbarActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_toolbar) - val videoPath = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4" + val videoPath = "https://clips.vorwaerts-gmbh.de/VfE_html5.mp4" fullscreenVideoView.videoUrl(videoPath) } } From 2829b23f0ee03cfd093ef180b1d714ca3eb1b6c4 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Thu, 4 Oct 2018 16:06:15 +0300 Subject: [PATCH 15/18] Updated libraryVersion --- library/release.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/release.gradle b/library/release.gradle index b2f9a1e..480b537 100644 --- a/library/release.gradle +++ b/library/release.gradle @@ -5,7 +5,7 @@ apply from: 'keystore.gradle' ext { publishedGroupId = 'bg.devlabs.fullscreenvideoview' artifactId = 'library' - libraryVersion = '0.0.9' + libraryVersion = '0.1.0' } version = libraryVersion From 175b2e12d4c260c8cf27e1277b2601d1a6ef0aa5 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Thu, 4 Oct 2018 16:18:06 +0300 Subject: [PATCH 16/18] Fixed a typo in Builder.java Updated libraryVersion --- library/release.gradle | 2 +- .../src/main/java/bg/devlabs/fullscreenvideoview/Builder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/release.gradle b/library/release.gradle index 480b537..8b3b523 100644 --- a/library/release.gradle +++ b/library/release.gradle @@ -5,7 +5,7 @@ apply from: 'keystore.gradle' ext { publishedGroupId = 'bg.devlabs.fullscreenvideoview' artifactId = 'library' - libraryVersion = '0.1.0' + libraryVersion = '1.0.0' } version = libraryVersion diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java index 6e8bae3..8f7fb56 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java @@ -163,7 +163,7 @@ public Builder addPlaybackSpeedButton() { * user passes 'false' to the method or just does not use it. In this case passing 'true' or * 'false' is confusing. * - * @deprecated As of release 1.0.0, replaced by {@link #addSeekBackwardButton()} ()} + * @deprecated As of release 1.0.0, replaced by {@link #addSeekBackwardButton()} */ @Deprecated public Builder canSeekBackward(boolean canSeekBackward) { From 6663fc5428eceb586c15d11866169d2c5dbb822f Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Thu, 4 Oct 2018 16:48:38 +0300 Subject: [PATCH 17/18] Added method disablePause Deprecated the method canPause in Builder.java --- .../devlabs/fullscreenvideoview/Builder.java | 27 +++++++++++++------ .../VideoControllerView.java | 1 + .../fullscreenvideoview/VideoMediaPlayer.java | 4 +++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java index 8f7fb56..124bf10 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/Builder.java @@ -136,8 +136,8 @@ public Builder portraitOrientation(PortraitOrientation portraitOrientation) { return this; } - public Builder canPause(boolean canPause) { - videoMediaPlayer.setPauseEnabled(canPause); + public Builder disablePause() { + videoMediaPlayer.disablePause(); return this; } @@ -157,11 +157,23 @@ public Builder addPlaybackSpeedButton() { return this; } + /** + * Method implementation: pass 'true' to enable and pass 'false' to disable the play/pause + * button. It's enabled by default and to disable it the user passes 'false' to the method + * or just does not use it. In this case passing 'true' or 'false' is confusing. + * + * @deprecated As of release 1.0.0, replaced by {@link #disablePause()} + */ + @Deprecated + public Builder canPause(boolean canPause) { + videoMediaPlayer.setPauseEnabled(canPause); + return this; + } + /** * Method implementation: pass 'true' to enable and pass 'false' to disable the - * seek backward button. It's is disabled by default, so when it has to be disabled the - * user passes 'false' to the method or just does not use it. In this case passing 'true' or - * 'false' is confusing. + * seek backward button. It's is disabled by default and to enable it the user passes 'true' + * to the method or just does not use it. In this case passing 'true' or 'false' is confusing. * * @deprecated As of release 1.0.0, replaced by {@link #addSeekBackwardButton()} */ @@ -173,9 +185,8 @@ public Builder canSeekBackward(boolean canSeekBackward) { /** * Method implementation: pass 'true' to enable and pass 'false' to disable the - * seek forward button. It's is disabled by default, so when it has to be disabled the - * user passes 'false' to the method or just does not use it. In this case passing 'true' or - * 'false' is confusing. + * seek forward button. It's is disabled by default and to enable it the user passes 'true' + * to the method or just does not use it. In this case passing 'true' or 'false' is confusing. * * @deprecated As of release 1.0.0, replaced by {@link #addSeekForwardButton()} */ diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java index 6a35219..3c6b8e4 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoControllerView.java @@ -295,6 +295,7 @@ private void setupButtonsVisibility() { try { if (startPauseButton != null && !videoMediaPlayer.canPause()) { startPauseButton.setEnabled(false); + startPauseButton.setVisibility(INVISIBLE); } if (rewButton != null && !videoMediaPlayer.showSeekBackwardButton()) { rewButton.setEnabled(false); diff --git a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java index f1ba6b5..7d6705f 100644 --- a/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java +++ b/library/src/main/java/bg/devlabs/fullscreenvideoview/VideoMediaPlayer.java @@ -77,6 +77,10 @@ public void setPauseEnabled(boolean canPause) { this.canPause = canPause; } + public void disablePause() { + this.canPause = false; + } + public void addSeekForwardButton() { this.showSeekForwardButton = true; } From 7ae087fed9643d6f2fb1788f87759b79994a3753 Mon Sep 17 00:00:00 2001 From: Slavi Petrov Date: Thu, 4 Oct 2018 17:13:46 +0300 Subject: [PATCH 18/18] Updated README.md --- README.md | 75 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index d089ee2..9b37233 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![logo](https://raw.githubusercontent.com/dev-labs-bg/fullscreen-video-view/master/logo.png) -========== +=== [![Download](https://api.bintray.com/packages/slavipetrov/maven/fullscreen-video-view/images/download.svg) ](https://bintray.com/slavipetrov/maven/fullscreen-video-view/_latestVersion) -[![Build Status](https://travis-ci.org/dev-labs-bg/fullscreen-video-view.svg?branch=0.0.9)](https://travis-ci.org/dev-labs-bg/fullscreen-video-view) +[![Build Status](https://travis-ci.org/dev-labs-bg/fullscreen-video-view.svg?branch=1.0.0)](https://travis-ci.org/dev-labs-bg/fullscreen-video-view) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/5d2c2572dd7b4a2fb5eeabd6c2e18fbc)](https://www.codacy.com/app/slavipetrov/fullscreen-video-view?utm_source=github.com&utm_medium=referral&utm_content=dev-labs-bg/fullscreen-video-view&utm_campaign=Badge_Grade) FullscreenVideoView is a custom VideoView Android library which makes loading, setting up and going fullscreen for video views easy. @@ -9,28 +9,27 @@ FullscreenVideoView is a custom VideoView Android library which makes loading, s Download -========== +=== You can use Gradle: ```gradle -compile 'bg.devlabs.fullscreenvideoview:library:0.0.9' +compile 'bg.devlabs.fullscreenvideoview:library:1.0.0' ``` or Maven: ```maven bg.devlabs.fullscreenvideoview library - 0.0.9 + 1.0.0 pom ``` How to use FullscreenVideoView? -========== +=== Declare the FullscreenVideoView in the XML layout file ```xml @@ -50,28 +49,28 @@ The Activity where the FullscreenVideoView is declared should handle configurati ``` Basic video loading (from URL or from a file) -```java +```kotlin // Loading from URL -@Override public void onCreate(Bundle savedInstanceState) { +override fun onCreate(savedInstanceState: Bundle?) { ... - FullscreenVideoView fullscreenVideoView = findViewById(R.id.fullscreenVideoView); - String videoUrl = "http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"; - fullscreenVideoView.videoUrl(videoUrl); + val fullscreenVideoView = findViewById(R.id.fullscreenVideoView) + val videoUrl = "https://clips.vorwaerts-gmbh.de/VfE_html5.mp4" + fullscreenVideoView.videoUrl(videoUrl) } // Loading from file -@Override public void onCreate(Bundle savedInstanceState) { +override fun onCreate(savedInstanceState: Bundle?) { ... - FullscreenVideoView fullscreenVideoView = findViewById(R.id.fullscreenVideoView); - File videoFile = new File("file_path"); - fullscreenVideoView.videoFile(videoFile); + val fullscreenVideoView = findViewById(R.id.fullscreenVideoView) + val videoFile = new File("file_path") + fullscreenVideoView.videoFile(videoFile) } ``` Change controls drawable resources ----------- -Java -```java +--- +Java or Kotlin +```kotlin fullscreenVideoView.videoUrl(videoUrl) .playDrawable(R.drawable.ic_play) .pauseDrawable(R.drawable.ic_pause) @@ -96,39 +95,49 @@ XML ``` Enable/disable controls ----------- -```java +--- +```kotlin fullscreenVideoView.videoUrl(videoUrl) - .canPause(true) - .canSeekBackward(false) - .canSeekForward(false) + .disablePause() + .addSeekBackwardButton() + .addSeekForwardButton() ``` Enable video auto-start ----------- -```java +--- +```kotlin fullscreenVideoView.videoUrl(videoUrl) .enableAutoStart() ``` Customize fast-forward and/or rewind seconds ----------- -```java +--- +```kotlin fullscreenVideoView.videoUrl(videoUrl) .fastForwardSeconds(5) .rewindSeconds(5) ``` +Change the playback speed (only for API 23 and above) +--- +There are 7 playback speed values which are added by default, but they can be changed with custom ones when `playbackSpeedOptions` is used. +```kotlin +val playbackOptions = PlaybackSpeedOptions().addSpeeds(0.25f, 0.5f, 0.75f, 1f) + +fullscreenVideoView.videoUrl(videoUrl) + .addPlaybackSpeedButton() + .playbackSpeedOptions(playbackOptions) +``` Compatibility -========== +=== - Minimum Android SDK: API level 19 -- Compile Android SDK: API level 27 +- Compile Android SDK: API level 28 Known issues -========== +=== There is a memory leak in Android 7 (API levels 24 and 25), which is known and [listed](https://github.com/square/leakcanary/issues/721) in the LeakCanary repository issues. License -========== -Apache 2.0. See the [LICENSE](https://github.com/dev-labs-bg/fullscreen-video-view/blob/master/LICENSE.txt) file for details. +=== +Apache 2.0. See the [LICENSE](https://github.com/dev-labs-bg/fullscreen-video-view/blob/master/LICENSE.txt) file for details. \ No newline at end of file