diff --git a/.kotlin/errors/errors-1721380185468.log b/.kotlin/errors/errors-1721380185468.log new file mode 100644 index 0000000..9300f96 --- /dev/null +++ b/.kotlin/errors/errors-1721380185468.log @@ -0,0 +1,4 @@ +kotlin version: 2.0.20-Beta2 +error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output: + 1. Kotlin compile daemon is ready + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 11661b4..cdaeb62 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -72,7 +72,7 @@ androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -newplayer = { group = "com.github.theScrabi", name = "NewPlayer", version.ref = "newplayer" } +newplayer = { group = "com.github.theScrabi.NewPlayer", name = "new-player", version.ref = "newplayer" } [plugins] diff --git a/new-player/src/main/java/net/newpipe/newplayer/VideoPlayerView.kt b/new-player/src/main/java/net/newpipe/newplayer/VideoPlayerView.kt index ba0e74c..9fc3f68 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/VideoPlayerView.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/VideoPlayerView.kt @@ -20,14 +20,31 @@ package net.newpipe.newplayer +import android.app.Activity import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.FragmentContainer +import androidx.fragment.app.FragmentContainerView import dagger.hilt.android.AndroidEntryPoint +import net.newpipe.newplayer.internal.VideoPlayerFragment @AndroidEntryPoint class VideoPlayerView : FrameLayout { + + val videoPlayerFragment:VideoPlayerFragment + + var maxLayoutRatio: Float + get() = videoPlayerFragment.maxLayoutRatio + set(value) {videoPlayerFragment.maxLayoutRatio=value} + + + var minLayoutRatio: Float + get() = videoPlayerFragment.minLayoutRatio + set(value) {videoPlayerFragment.maxLayoutRatio = value} + @JvmOverloads constructor( context: Context, @@ -35,5 +52,17 @@ class VideoPlayerView : FrameLayout { defStyleAttr: Int = 0 ) : super(context, attrs, defStyleAttr) { val view = LayoutInflater.from(context).inflate(R.layout.video_player_view, this) + + videoPlayerFragment = VideoPlayerFragment() + when (context) { + is AppCompatActivity -> { + context.supportFragmentManager.beginTransaction() + .add(R.id.video_player_fragment_container, videoPlayerFragment).commit() + } + + else -> { + throw Exception("The context that should host the NewPlayer Embedded VideoPlayerView is not an AppCompatActivity: $context") + } + } } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/internal/VideoPlayerFragment.kt b/new-player/src/main/java/net/newpipe/newplayer/internal/VideoPlayerFragment.kt index bd5f884..ba1802e 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/internal/VideoPlayerFragment.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/internal/VideoPlayerFragment.kt @@ -21,6 +21,7 @@ package net.newpipe.newplayer.internal import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -42,7 +43,36 @@ import net.newpipe.newplayer.internal.ui.theme.VideoPlayerTheme @AndroidEntryPoint class VideoPlayerFragment() : Fragment() { + private val TAG = "VideoPlayerFragment" private val viewModel: VideoPlayerViewModel by viewModels() + private var currentVideoRatio = 0F + private lateinit var composeView: ComposeView + + var minLayoutRatio = 4F / 3F + set(value) { + if (value <= 0 && maxLayoutRatio < minLayoutRatio) + Log.e( + TAG, + "minLayoutRatio can not be 0 or smaller or bigger then maxLayoutRatio. Ignore: $value" + ) + else { + field = value + updateViewRatio() + } + } + + var maxLayoutRatio = 16F / 9F + set(value) { + if (value <= 0 && value < minLayoutRatio) + Log.e( + TAG, + "maxLayoutRatio can not be 0 smaller ans smaller then minLayoutRatio. Ignore: $value" + ) + else { + field = value + updateViewRatio() + } + } override fun onCreateView( inflater: LayoutInflater, @@ -51,16 +81,16 @@ class VideoPlayerFragment() : Fragment() { ): View? { val window = activity?.window!! val insetsController = WindowCompat.getInsetsController(window, window.decorView) - insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + insetsController.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE val view = inflater.inflate(R.layout.video_player_framgent, container, false) - val composeView = view.findViewById(R.id.player_copose_view) + composeView = view.findViewById(R.id.player_copose_view) viewModel.listener = object : VideoPlayerViewModel.Listener { - override fun requestUpdateLayoutRatio(ratio: Float) { - composeView.updateLayoutParams { - dimensionRatio = "$ratio:1" - } + override fun requestUpdateLayoutRatio(videoRatio: Float) { + currentVideoRatio = videoRatio + updateViewRatio() } } @@ -77,4 +107,11 @@ class VideoPlayerFragment() : Fragment() { return view } + + private fun updateViewRatio() { + composeView.updateLayoutParams { + val ratio = currentVideoRatio.coerceIn(minLayoutRatio, maxLayoutRatio) + dimensionRatio = "$ratio:1" + } + } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/internal/model/VideoPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/internal/model/VideoPlayerViewModel.kt index 3c39e3c..a1f64ff 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/internal/model/VideoPlayerViewModel.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/internal/model/VideoPlayerViewModel.kt @@ -166,7 +166,7 @@ class VideoPlayerViewModelImpl @Inject constructor( player.prepare() } - player.setMediaItem(MediaItem.fromUri(app.getString(R.string.ccc_chromebooks_video))) + player.setMediaItem(MediaItem.fromUri(app.getString(R.string.portrait_video_example))) player.playWhenReady = true } diff --git a/new-player/src/main/res/layout/video_player_view.xml b/new-player/src/main/res/layout/video_player_view.xml index 044df84..5ef0d2e 100644 --- a/new-player/src/main/res/layout/video_player_view.xml +++ b/new-player/src/main/res/layout/video_player_view.xml @@ -20,8 +20,7 @@ \ No newline at end of file + android:minHeight="50dp" /> \ No newline at end of file diff --git a/new-player/src/main/res/values/test_streams.xml b/new-player/src/main/res/values/test_streams.xml index 22ff7de..728cc6b 100644 --- a/new-player/src/main/res/values/test_streams.xml +++ b/new-player/src/main/res/values/test_streams.xml @@ -23,4 +23,5 @@ https://ftp.fau.de/cdn.media.ccc.de/congress/2010/mp4-h264-HQ/27c3-4159-en-reverse_engineering_mos_6502.mp4 https://ftp.fau.de/cdn.media.ccc.de/congress/2010/ogg-audio-only/27c3-4159-en-reverse_engineering_mos_6502.ogg https://ftp.fau.de/cdn.media.ccc.de/congress/2023/h264-hd/37c3-11929-eng-deu-swe-Turning_Chromebooks_into_regular_laptops_hd.mp4 + https://videos.pexels.com/video-files/5512609/5512609-hd_1080_1920_25fps.mp4 \ No newline at end of file diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt index 8a2a59c..6d1793c 100644 --- a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt +++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt @@ -27,6 +27,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import dagger.hilt.android.AndroidEntryPoint +import net.newpipe.newplayer.VideoPlayerView @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -35,6 +36,10 @@ class MainActivity : AppCompatActivity() { enableEdgeToEdge() setContentView(R.layout.activity_main) + val video_view = findViewById(R.id.new_player_video_view) + + video_view.minLayoutRatio + //TODO: This is a dirty hack. Fix this later on if (getResources().configuration.orientation != Configuration.ORIENTATION_LANDSCAPE) { ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->