From a7d20f77bcf62a09d3184847bbe3b9ef9c0fbb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Taha=20K=C3=B6rkem?= <65918918+tahakorkem@users.noreply.github.com> Date: Sat, 16 Sep 2023 12:07:28 +0300 Subject: [PATCH 01/16] Update README.md (#1055) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55f507d8..17d2bc82 100644 --- a/README.md +++ b/README.md @@ -707,7 +707,7 @@ This component is useful to display and control the time of the playback. It sho You can add it to your layout programmatically or in your xml. ```xml - Date: Sun, 12 Nov 2023 18:22:34 +0100 Subject: [PATCH 02/16] Add extra playback rates (breaking change) (#1073) * add playback rate fields for supported playback rates in web youtube client * add playback rate function to handle arbitrary float values * remove redundant toFloat call * add setPlaybackRate method to ChromecastYoutubePlayer * Fix up some compile errors and some fixes to get the proper values back from the listeners * fix function to parse PlaybackRate * Remove setPlaybackRate(Float) * Clean up diff --------- Co-authored-by: santi Co-authored-by: Pierfrancesco Soffritti --- .../androidyoutubeplayer/core/player/PlayerConstants.kt | 5 ++++- .../androidyoutubeplayer/core/player/YouTubePlayerBridge.kt | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/PlayerConstants.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/PlayerConstants.kt index aeb3f8b0..32406eec 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/PlayerConstants.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/PlayerConstants.kt @@ -15,7 +15,7 @@ class PlayerConstants { } enum class PlaybackRate { - UNKNOWN, RATE_0_25, RATE_0_5, RATE_1, RATE_1_5, RATE_2 + UNKNOWN, RATE_0_25, RATE_0_5, RATE_0_75, RATE_1, RATE_1_25, RATE_1_5, RATE_1_75, RATE_2 } } @@ -24,8 +24,11 @@ fun PlayerConstants.PlaybackRate.toFloat(): Float { PlayerConstants.PlaybackRate.UNKNOWN -> 1f PlayerConstants.PlaybackRate.RATE_0_25 -> 0.25f PlayerConstants.PlaybackRate.RATE_0_5 -> 0.5f + PlayerConstants.PlaybackRate.RATE_0_75 -> 0.75f PlayerConstants.PlaybackRate.RATE_1 -> 1f + PlayerConstants.PlaybackRate.RATE_1_25 -> 1.25f PlayerConstants.PlaybackRate.RATE_1_5 -> 1.5f + PlayerConstants.PlaybackRate.RATE_1_75 -> 1.75f PlayerConstants.PlaybackRate.RATE_2 -> 2f } } \ No newline at end of file diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt index 69e14147..a9f71674 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt @@ -33,8 +33,11 @@ class YouTubePlayerBridge(private val youTubePlayerOwner: YouTubePlayerBridgeCal private const val RATE_0_25 = "0.25" private const val RATE_0_5 = "0.5" + private const val RATE_0_75 = "0.75" private const val RATE_1 = "1" + private const val RATE_1_25 = "1.25" private const val RATE_1_5 = "1.5" + private const val RATE_1_75 = "1.75" private const val RATE_2 = "2" private const val ERROR_INVALID_PARAMETER_IN_REQUEST = "2" @@ -182,8 +185,11 @@ class YouTubePlayerBridge(private val youTubePlayerOwner: YouTubePlayerBridgeCal return when { rate.equals(RATE_0_25, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_0_25 rate.equals(RATE_0_5, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_0_5 + rate.equals(RATE_0_75, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_0_75 rate.equals(RATE_1, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_1 + rate.equals(RATE_1_25, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_1_25 rate.equals(RATE_1_5, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_1_5 + rate.equals(RATE_1_75, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_1_75 rate.equals(RATE_2, ignoreCase = true) -> PlayerConstants.PlaybackRate.RATE_2 else -> PlayerConstants.PlaybackRate.UNKNOWN } From c09af7879643d092ae0a2ab3fe41ed510e11980e Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Sun, 12 Nov 2023 17:32:34 +0000 Subject: [PATCH 03/16] Update dependencies --- dependencies.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index e0f279a2..f59ef8f8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,7 +1,7 @@ ext.versions = [ // Project minSdk : 17, - compileSdk : 33, + compileSdk : 34, publishVersion_core : '12.1.0', publishVersionCode_core : 20, @@ -10,7 +10,7 @@ ext.versions = [ publishVersionCode_chromecast : 14, // Plugins - gradlePlugin : '8.1.0', + gradlePlugin : '8.1.3', dexCount : '4.0.0', gradleNexus : '1.3.0', dokka : '1.8.10', @@ -19,16 +19,16 @@ ext.versions = [ kotlin : '1.8.0', // AndroidX - androidxCore : '1.9.0', + androidxCore : '1.12.0', appcompat : '1.6.1', androidxAnnotations : '1.6.0', androidxConstraintLayout : '2.1.4', - androidxRecyclerView : '1.3.0', - androidxMediarouter : '1.3.1', + androidxRecyclerView : '1.3.2', + androidxMediarouter : '1.6.0', androidxLifecycleRuntime : '2.6.0', // Google Play - googlePlayServicesCastFramework : '21.2.0', + googlePlayServicesCastFramework : '21.3.0', // psoffritti sampleAppTemplate : '1.0.3', From 746b6b3ea02327648e142f3249e794845c9d3d7d Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Mon, 13 Nov 2023 06:42:11 +0000 Subject: [PATCH 04/16] Add banner to readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 17d2bc82..a34d9639 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ +
+ + + Use AI to manage your app's reviews on Google Play + + +
+
+ # android-youtube-player [![Build Status](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player.svg?branch=master)](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player) From ff2eb6435e6e0ba63c45268516c8241d2cd7be5d Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Mon, 13 Nov 2023 06:57:35 +0000 Subject: [PATCH 05/16] Update readme --- README.md | 15 +++++++-------- images/banner.png | Bin 0 -> 28684 bytes 2 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 images/banner.png diff --git a/README.md b/README.md index a34d9639..4b4c9d85 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ -
- - - Use AI to manage your app's reviews on Google Play - - -
-
+## Ad + +[banner](https://playstorereply.com) + +#### [:mega: Use AI to manage your app's reviews on Google Play :arrow_right:](https://playstorereply.com) +Increase your apps ratings. Engage with all users, no more unanswered reviews. +Save time and increase customer satisfaction. # android-youtube-player diff --git a/images/banner.png b/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..0bac181116ebcffefc56a05cf397517d8b50a9ad GIT binary patch literal 28684 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 Date: Mon, 13 Nov 2023 07:07:03 +0000 Subject: [PATCH 06/16] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4b4c9d85..71a8b288 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ -## Ad - [banner](https://playstorereply.com) -#### [:mega: Use AI to manage your app's reviews on Google Play :arrow_right:](https://playstorereply.com) +:arrow_right: Check out [PlayStoreReply](https://playstorereply.com): reply to Google Play reviews using AI. +
Increase your apps ratings. Engage with all users, no more unanswered reviews. Save time and increase customer satisfaction. From 22f222628e4828ec75abf5ea6ae03e423871c1c5 Mon Sep 17 00:00:00 2001 From: Pierfrancesco Soffritti Date: Tue, 14 May 2024 07:55:46 +0100 Subject: [PATCH 07/16] Add Google Play SDK Console verification file --- .../androidyoutubeplayer/core/verification.properties | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties diff --git a/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties b/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties new file mode 100644 index 00000000..747f77c1 --- /dev/null +++ b/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties @@ -0,0 +1,3 @@ +#This is the verification token for the com.pierfrancescosoffritti.androidyoutubeplayer:core SDK. +#Mon May 13 23:48:24 PDT 2024 +token=EGXY6SDXTJDURCXOIE2DXBUPZI From f9bc0f8a9d25019e543d020446594561cd33f070 Mon Sep 17 00:00:00 2001 From: Andrew Shu Date: Fri, 6 Sep 2024 08:30:59 -0700 Subject: [PATCH 08/16] Pass videoId during initialization (#1169) This is an optional optimization to allow the API to load the video assets as early as possible during initialization. --- README.md | 6 ++++++ .../core/player/views/LegacyYouTubePlayerView.kt | 15 +++++++++++++-- .../core/player/views/WebViewYouTubePlayer.kt | 7 ++++--- .../core/player/views/YouTubePlayerView.kt | 8 +++++--- core/src/main/res/raw/ayp_youtube_player.html | 1 + 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 71a8b288..455f134e 100644 --- a/README.md +++ b/README.md @@ -296,6 +296,9 @@ YouTubePlayerView.initialize(YouTubePlayerListener listener, boolean handleNetwo ```java YouTubePlayerView.initialize(YouTubePlayerListener listener, boolean handleNetworkEvents, IFramePlayerOptions iframePlayerOptions) ``` +```java +YouTubePlayerView.initialize(YouTubePlayerListener listener, boolean handleNetworkEvents, IFramePlayerOptions iframePlayerOptions, String videoId) +``` #### `initialize(YouTubePlayerListener)` Initialize the `YouTubePlayer`. Network events are automatically handled by the player. @@ -309,6 +312,9 @@ By passing an `IFramePlayerOptions` to the initialize method it is possible to s All the possible parameters and values are listed [here](https://developers.google.com/youtube/player_parameters#Parameters). Not all of them are supported in this library because some don't make sense in this context. [Open an issue](https://github.com/PierfrancescoSoffritti/android-youtube-player/issues) if you need a parameter that is not currently supported. +#### `initialize(YouTubePlayerListener, boolean, IFramePlayerOptions, String)` +By passing the `videoId` the video will be loaded as soon as possible after initialization. + ### IFramePlayerOptions The `IFramePlayerOptions` is an optional argument that can be passed to `YouTubePlayerView.initialize(YouTubePlayerListener, boolean, IFramePlayerOptions)`, it can be used to set some of the parameters of the IFrame YouTubePlayer. diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/LegacyYouTubePlayerView.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/LegacyYouTubePlayerView.kt index 5c01f78f..846bd4de 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/LegacyYouTubePlayerView.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/LegacyYouTubePlayerView.kt @@ -88,11 +88,13 @@ internal class LegacyYouTubePlayerView( * @param handleNetworkEvents if set to true a broadcast receiver will be registered and network events will be handled automatically. * If set to false, you should handle network events with your own broadcast receiver. * @param playerOptions customizable options for the embedded video player, can be null. + * @param videoId optional, used to load a video right after initialization. */ fun initialize( youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, - playerOptions: IFramePlayerOptions + playerOptions: IFramePlayerOptions, + videoId: String? ) { if (isYouTubePlayerReady) { throw IllegalStateException("This YouTubePlayerView has already been initialized.") @@ -103,7 +105,7 @@ internal class LegacyYouTubePlayerView( } initialize = { - webViewYouTubePlayer.initialize({ it.addListener(youTubePlayerListener) }, playerOptions) + webViewYouTubePlayer.initialize({ it.addListener(youTubePlayerListener) }, playerOptions, videoId) } if (!handleNetworkEvents) { @@ -111,6 +113,15 @@ internal class LegacyYouTubePlayerView( } } + /** + * Initialize the player. + * @param playerOptions customizable options for the embedded video player. + * + * @see LegacyYouTubePlayerView.initialize + */ + fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions) = + initialize(youTubePlayerListener, handleNetworkEvents, playerOptions, null) + /** * Initialize the player. * @param handleNetworkEvents if set to true a broadcast receiver will be registered and network events will be handled automatically. diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt index d0d229d3..0432fabf 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt @@ -93,9 +93,9 @@ internal class WebViewYouTubePlayer constructor( internal var isBackgroundPlaybackEnabled = false - internal fun initialize(initListener: (YouTubePlayer) -> Unit, playerOptions: IFramePlayerOptions?) { + internal fun initialize(initListener: (YouTubePlayer) -> Unit, playerOptions: IFramePlayerOptions?, videoId: String?) { youTubePlayerInitListener = initListener - initWebView(playerOptions ?: IFramePlayerOptions.default) + initWebView(playerOptions ?: IFramePlayerOptions.default, videoId) } // create new set to avoid concurrent modifications @@ -111,7 +111,7 @@ internal class WebViewYouTubePlayer constructor( } @SuppressLint("SetJavaScriptEnabled") - private fun initWebView(playerOptions: IFramePlayerOptions) { + private fun initWebView(playerOptions: IFramePlayerOptions, videoId: String?) { settings.apply { javaScriptEnabled = true mediaPlaybackRequiresUserGesture = false @@ -121,6 +121,7 @@ internal class WebViewYouTubePlayer constructor( addJavascriptInterface(YouTubePlayerBridge(this), "YouTubePlayerBridge") val htmlPage = readHTMLFromUTF8File(resources.openRawResource(R.raw.ayp_youtube_player)) + .replace("<>", if (videoId != null) { "'$videoId'" } else { "undefined" }) .replace("<>", playerOptions.toString()) loadDataWithBaseURL(playerOptions.getOrigin(), htmlPage, "text/html", "utf-8", null) diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt index 11694865..f104911d 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt @@ -90,7 +90,8 @@ class YouTubePlayerView( legacyTubePlayerView.initialize( youTubePlayerListener, handleNetworkEvents, - IFramePlayerOptions.default + IFramePlayerOptions.default, + videoId ) } } @@ -101,13 +102,14 @@ class YouTubePlayerView( * @param handleNetworkEvents if set to true a broadcast receiver will be registered and network events will be handled automatically. * If set to false, you should handle network events with your own broadcast receiver. * @param playerOptions customizable options for the embedded video player. + * @param videoId optional, used to load an initial video. */ - fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions) { + fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions, videoId: String? = null) { if (enableAutomaticInitialization) { throw IllegalStateException(AUTO_INIT_ERROR) } else { - legacyTubePlayerView.initialize(youTubePlayerListener, handleNetworkEvents, playerOptions) + legacyTubePlayerView.initialize(youTubePlayerListener, handleNetworkEvents, playerOptions, videoId) } } diff --git a/core/src/main/res/raw/ayp_youtube_player.html b/core/src/main/res/raw/ayp_youtube_player.html index e5263323..0b51eec1 100644 --- a/core/src/main/res/raw/ayp_youtube_player.html +++ b/core/src/main/res/raw/ayp_youtube_player.html @@ -45,6 +45,7 @@ height: '100%', width: '100%', + videoId: <>, events: { onReady: function(event) { YouTubePlayerBridge.sendReady() }, From 80070483e00e3e6f0a7086fde8256b4fbcf97063 Mon Sep 17 00:00:00 2001 From: Andrew Shu Date: Fri, 6 Sep 2024 09:21:51 -0700 Subject: [PATCH 09/16] Set MaxMetaspaceSize to 512m to fix Dokka Gradle build step (#1170) --- gradle.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle.properties b/gradle.properties index 10c8f5e7..873c4aac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,6 +11,7 @@ # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From 1714e4e0f8c5a8e4e106faf4f17f06e109b40b64 Mon Sep 17 00:00:00 2001 From: Andrew Shu Date: Tue, 10 Sep 2024 00:31:31 -0700 Subject: [PATCH 10/16] IFramePlayerOptions: Add "start", deprecate "modestBranding" (#1171) * Deprecate modestBranding in IFramePlayerOptions August 15, 2023 deprecation announcement: https://developers.google.com/youtube/player_parameters#release_notes_08_15_2023 * Add "start" option to IFramePlayerOptions * Remove "showinfo" from IFramePlayerOptions "showinfo" was deprecated in August 2018 and ignored after September 2018. Deprecation announcement: https://developers.google.com/youtube/player_parameters#august-23,-2018 * Add "end" option to IFramePlayerOptions * Document "start" and "end" IFramePlayerOptions in readme --- README.md | 8 +++++ chromecast-receiver/js/YouTubePlayer.js | 1 - .../player/options/IFramePlayerOptions.kt | 34 ++++++++++++++----- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 455f134e..da55cfa7 100644 --- a/README.md +++ b/README.md @@ -360,6 +360,14 @@ If set to 0: the player will show captions. If set to 1: the player won't show captions. +##### `start` +This parameter causes the player to begin playing the video at the given number of seconds from the start of the video. The parameter value is a positive integer. + +It works similarly to the `seekTo` method, and the `startSeconds` argument of `loadVideo` and `cueVideo`. + +##### `end` +This parameter specifies the time, measured in seconds from the beginning of the video, when the player should stop playing the video. The parameter value is a positive integer. + ### Full screen The full screen button can be added to the player by using `IFramePlayerOptions` diff --git a/chromecast-receiver/js/YouTubePlayer.js b/chromecast-receiver/js/YouTubePlayer.js index 3142a7a3..3a5ddb90 100644 --- a/chromecast-receiver/js/YouTubePlayer.js +++ b/chromecast-receiver/js/YouTubePlayer.js @@ -38,7 +38,6 @@ function YouTubePlayer(communicationConstants, communicationChannel) { fs: 0, origin: 'https://www.youtube.com', rel: 0, - showinfo: 0, iv_load_policy: 3 } }) diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt index 1fb0d307..55726d35 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt @@ -30,13 +30,13 @@ class IFramePlayerOptions private constructor(private val playerOptions: JSONObj private const val FS = "fs" internal const val ORIGIN = "origin" private const val REL = "rel" - private const val SHOW_INFO = "showinfo" private const val IV_LOAD_POLICY = "iv_load_policy" - private const val MODEST_BRANDING = "modestbranding" private const val CC_LOAD_POLICY = "cc_load_policy" private const val CC_LANG_PREF = "cc_lang_pref" private const val LIST = "list" private const val LIST_TYPE = "listType" + private const val START = "start" + private const val END = "end" } private val builderOptions = JSONObject() @@ -49,9 +49,7 @@ class IFramePlayerOptions private constructor(private val playerOptions: JSONObj addInt(FS, 0) addString(ORIGIN, "https://www.youtube.com") addInt(REL, 0) - addInt(SHOW_INFO, 0) addInt(IV_LOAD_POLICY, 3) - addInt(MODEST_BRANDING, 1) addInt(CC_LOAD_POLICY, 0) } @@ -175,12 +173,32 @@ class IFramePlayerOptions private constructor(private val playerOptions: JSONObj } /** - * Controls if the YouTube logo will be displayed in the control bar or not. - * @param modestBranding If set to 1: the YouTube logo will not be displayed in the control bar. - * If set to 0: the YouTube logo will be displayed in the control bar. + * This parameter causes the player to begin playing the video at the given number of seconds from the start of the video. + * The parameter value is a positive integer. + * @param startSeconds positive integer, number of seconds to offset playback from the start of the video. */ + fun start(startSeconds: Int): Builder { + addInt(START, startSeconds) + return this + } + + /** + * This parameter specifies the time, measured in seconds from the beginning of the video, when the player should stop playing the video. + * The parameter value is a positive integer. + * @param endSeconds positive integer specifying the time, measured in seconds from the beginning of the video, when the player should stop playing the video. + */ + fun end(endSeconds: Int): Builder { + addInt(END, endSeconds) + return this + } + + /** + * The modestbranding parameter is deprecated and will have no effect. + * To align with YouTube's branding requirements, the player now determines the appropriate branding treatment based on a combination of factors, including player size, other API parameters (e.g. controls), and additional signals. + * See August 15, 2023 deprecation announcement: https://developers.google.com/youtube/player_parameters#release_notes_08_15_2023 + */ + @Deprecated("Deprecated and will have no effect") fun modestBranding(modestBranding: Int): Builder { - addInt(MODEST_BRANDING, modestBranding) return this } From a3010b23cdd12c5f657af87990218aedb2f53b2d Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Wed, 25 Sep 2024 07:19:59 +0200 Subject: [PATCH 11/16] Update advertisment section --- README.md | 7 ++++--- images/banner.png | Bin 28684 -> 0 bytes 2 files changed, 4 insertions(+), 3 deletions(-) delete mode 100644 images/banner.png diff --git a/README.md b/README.md index da55cfa7..974b0c33 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ -[banner](https://playstorereply.com) +#### \ -:arrow_right: Check out [PlayStoreReply](https://playstorereply.com): reply to Google Play reviews using AI. -
+#### [:mega: Reply to Google Play Reviews using AI :arrow_right:](https://playstorereply.com) Increase your apps ratings. Engage with all users, no more unanswered reviews. Save time and increase customer satisfaction. +#### \
+ # android-youtube-player [![Build Status](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player.svg?branch=master)](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player) diff --git a/images/banner.png b/images/banner.png deleted file mode 100644 index 0bac181116ebcffefc56a05cf397517d8b50a9ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28684 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
ELqY$872G+#TmEy-Tgtc zG8;dHADb#Fm5f{4{^ZAOoKd`kIV8noqE*D*G@+)ASQQpIP&>kzgu4-h zG_o31t?g>^6VgcAbqkrT6vb<&q@sdHuSreV075n#NG~9-22_qLcj#a^p1tyjcIn~) z3NOa!l2gyufJ0TZ<0$6ww7N%%po=HDWsnM)GI_VmW;lTk7c!Y99N+9!__^gJ+QU?- z6?5^zs{+7=N+#^C6IUkV-qwaSDBuEK=XD|4+EvqnOG{K|_a=(s+x+#aNfjG`Y>%36 z-Mp`Mc}b?>X#&-xkZ1$PCrNmh#V_;|gD=5B2^^fUZ*&kmD@joE>=#2vLPT-=CkV(IpzY^0~VS!=|h! zxw5NLkSGkP@CmU`FVhg7e|J*0JAYZj+?eXC{#&Yg;M1m{bwz2Q6??pRW|&8B^WCV9 z&1a^nOACBzhl;LD0O?<3tbTRc2cUG*X)w)k=CA_(o()J@CtbcK0a-D%MRg`Jw{abPC|KSODPHUE+ADI8*Curk;!0~^#-irpL;;Nd{L zv*%LOj@IHlu+~@j+f7<>Fixp*n z9mdx6O6+JY;sNDb=(E`PU(_7`G|^>SW)KqnQFBLY0R|Ke@xMz*pZ&Lk{okKDi-8?Z z5_JsO(ON(OWij*f8si09NkC~= zT(PhsfGd9~!NEN{99g~eJeu%mTD8BzJt(Q^$__)0Noab5b@-aY>T32;X%(}QVQcco zGh&auMTV6M7{hDYGKX^Je|l5wKf0IJVJ{lqf<6x&A*9cTl3vLxSCc$kIjDs%5C@D> zuft{w|7e)xiNTCp5r6DNOuE!=7yV@(u57&Qv9(Q#ssks)Ka!&uB{Nw~I&n%Ivom4o z^cO(Rl0SFnALYPL=K!{GUDI~0wUAT$VMp;I4iIBBe-iO4+U=hUSz-y~Zv@XrMQKNF zDi2uL@C&uL|BzF)(v`N0t){d?^*c&4# Date: Wed, 25 Sep 2024 07:20:19 +0200 Subject: [PATCH 12/16] Remove broken build status badge --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 974b0c33..d0ab5f11 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ Save time and increase customer satisfaction. # android-youtube-player -[![Build Status](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player.svg?branch=master)](https://travis-ci.com/PierfrancescoSoffritti/android-youtube-player) [![Android YouTube Player](https://www.appbrain.com/stats/libraries/shield/android_youtube_player.svg)](https://www.appbrain.com/stats/libraries/details/android_youtube_player/android-youtube-player) [![android arsenal](https://img.shields.io/badge/Android%20Arsenal-android--youtube--player-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/4322) [![website](https://img.shields.io/badge/-website-brightgreen.svg)](https://pierfrancescosoffritti.github.io/android-youtube-player/) From 9aa41cb192e072ccb1575590f6bb7cc5944dc047 Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Wed, 25 Sep 2024 07:29:32 +0200 Subject: [PATCH 13/16] Update verification properties --- .../androidyoutubeplayer/core/verification.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties b/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties index 747f77c1..c1343171 100644 --- a/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties +++ b/core/src/main/resources/META-INF/com/pierfrancescosoffritti/androidyoutubeplayer/core/verification.properties @@ -1,3 +1,3 @@ #This is the verification token for the com.pierfrancescosoffritti.androidyoutubeplayer:core SDK. -#Mon May 13 23:48:24 PDT 2024 -token=EGXY6SDXTJDURCXOIE2DXBUPZI +#Tue Sep 24 22:28:45 PDT 2024 +token=RLCF53RSTNFKXKRKVCHR7GH2LM From ec068f37e4aa3f63f0e940c510819610bae35d0b Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Wed, 25 Sep 2024 08:39:46 +0200 Subject: [PATCH 14/16] Release version 12.1.1 --- README.md | 2 +- dependencies.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0ab5f11..25e824bb 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ Add this to your module level `build.gradle` file. ```gradle dependencies { - implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.0' + implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.1' } ``` diff --git a/dependencies.gradle b/dependencies.gradle index f59ef8f8..452aedb1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ minSdk : 17, compileSdk : 34, - publishVersion_core : '12.1.0', + publishVersion_core : '12.1.1', publishVersionCode_core : 20, publishVersion_chromecast : '0.29', From dedaf09a3658cef4f9d2d130a88697e987490666 Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Wed, 25 Sep 2024 08:58:01 +0200 Subject: [PATCH 15/16] Fix build error --- .../core/player/views/YouTubePlayerView.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt index f104911d..ecb19b80 100644 --- a/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt +++ b/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt @@ -2,7 +2,6 @@ package com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams @@ -96,6 +95,16 @@ class YouTubePlayerView( } } + // TODO: Use @JvmOverloads instead of duplicating the method. Unfortunately that will cause a breaking change. + fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions, videoId: String?) { + if (enableAutomaticInitialization) { + throw IllegalStateException(AUTO_INIT_ERROR) + } + else { + legacyTubePlayerView.initialize(youTubePlayerListener, handleNetworkEvents, playerOptions, videoId) + } + } + /** * Initialize the player. You must call this method before using the player. * @param youTubePlayerListener listener for player events @@ -104,12 +113,12 @@ class YouTubePlayerView( * @param playerOptions customizable options for the embedded video player. * @param videoId optional, used to load an initial video. */ - fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions, videoId: String? = null) { + fun initialize(youTubePlayerListener: YouTubePlayerListener, handleNetworkEvents: Boolean, playerOptions: IFramePlayerOptions) { if (enableAutomaticInitialization) { throw IllegalStateException(AUTO_INIT_ERROR) } else { - legacyTubePlayerView.initialize(youTubePlayerListener, handleNetworkEvents, playerOptions, videoId) + legacyTubePlayerView.initialize(youTubePlayerListener, handleNetworkEvents, playerOptions, null) } } From 363c013f77ce9d52a60ee37faa8aed544e0c4e6d Mon Sep 17 00:00:00 2001 From: PierfrancescoSoffritti Date: Wed, 25 Sep 2024 08:59:24 +0200 Subject: [PATCH 16/16] Release version 12.1.1 --- README.md | 2 +- dependencies.gradle | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 25e824bb..941c682e 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Add this to your module level `build.gradle` file. ```gradle dependencies { - implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender:0.28' + implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender:0.30' } ``` diff --git a/dependencies.gradle b/dependencies.gradle index 452aedb1..b71db85c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -4,10 +4,10 @@ ext.versions = [ compileSdk : 34, publishVersion_core : '12.1.1', - publishVersionCode_core : 20, + publishVersionCode_core : 21, - publishVersion_chromecast : '0.29', - publishVersionCode_chromecast : 14, + publishVersion_chromecast : '0.30', + publishVersionCode_chromecast : 15, // Plugins gradlePlugin : '8.1.3',