feat: Android TV support (#503)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-09-28 21:07:49 +02:00 committed by GitHub
parent 7ab8c015b9
commit c299492d6d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
168 changed files with 12019 additions and 3073 deletions

View file

@ -1,7 +1,77 @@
package nl.jknaapen.fladder
import io.flutter.embedding.android.FlutterFragmentActivity
import com.ryanheise.audioservice.AudioServiceFragmentActivity;
import NativeVideoActivity
import PlayerSettingsPigeon
import StartResult
import VideoPlayerApi
import VideoPlayerControlsCallback
import VideoPlayerListenerCallback
import android.content.Intent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.ryanheise.audioservice.AudioServiceFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import nl.jknaapen.fladder.objects.PlayerSettingsObject
import nl.jknaapen.fladder.objects.VideoPlayerObject
import nl.jknaapen.fladder.utility.leanBackEnabled
class MainActivity: AudioServiceFragmentActivity () {
class MainActivity : AudioServiceFragmentActivity(), NativeVideoActivity {
private lateinit var videoPlayerLauncher: ActivityResultLauncher<Intent>
private var videoPlayerCallback: ((Result<StartResult>) -> Unit)? = null
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
val videoPlayerHost = VideoPlayerObject
NativeVideoActivity.setUp(
flutterEngine.dartExecutor.binaryMessenger,
this
)
VideoPlayerApi.setUp(
flutterEngine.dartExecutor.binaryMessenger,
videoPlayerHost.implementation
)
videoPlayerHost.videoPlayerListener =
VideoPlayerListenerCallback(flutterEngine.dartExecutor.binaryMessenger)
videoPlayerHost.videoPlayerControls =
VideoPlayerControlsCallback(flutterEngine.dartExecutor.binaryMessenger)
PlayerSettingsPigeon.setUp(
flutterEngine.dartExecutor.binaryMessenger,
api = PlayerSettingsObject
)
videoPlayerLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
val callback = videoPlayerCallback
videoPlayerCallback = null
val startResult = if (result.resultCode == RESULT_OK) {
StartResult(resultValue = result.data?.getStringExtra("result") ?: "Finished")
} else {
StartResult(resultValue = "Cancelled")
}
callback?.invoke(Result.success(startResult))
}
}
override fun launchActivity(callback: (Result<StartResult>) -> Unit) {
try {
videoPlayerCallback = callback
val intent = Intent(this, VideoPlayerActivity::class.java)
videoPlayerLauncher.launch(intent)
} catch (e: Exception) {
e.printStackTrace()
callback(Result.failure(e))
}
}
override fun disposeActivity() {
VideoPlayerObject.currentActivity?.finish()
}
override fun isLeanBackEnabled(): Boolean = leanBackEnabled(applicationContext)
}