THEOplayer / android-ui

UI component library for the THEOplayer Android SDK
https://www.theoplayer.com/docs/open-video-ui/android/
MIT License
7 stars 2 forks source link
android jetpack-compose theoplayer video-player

THEOplayer Open Video UI for Android

A component library for building a world-class video player experience powered by the THEOplayer Android SDK.

Note This project is under active development. While we believe it's ready for use in production, not all features are available in this first release. If you find a problem or have an idea for a new feature, don't hesitate to open an issue!

Screenshot

Motivation

THEOplayer Android SDK version 4.x comes with a built-in UI based on video.js running within a WebView inside of a THEOplayerView. This new UI aims to solve some limitations from the old approach:

Installation

  1. Create a new Jetpack Compose app or set up Compose in your existing Android app by following the Compose quick start guide.
  2. Add the native THEOplayer Android SDK to your project by following these installation instructions.
  3. Add the THEOplayer Maven repository to your project-level settings.gradle file:

    dependencyResolutionManagement {
        repositories {
            google()
            mavenCentral()
            maven { url = uri("https://maven.theoplayer.com/releases") }
        }
    }

    Alternatively, you can use the GitHub Packages mirror.

    GitHub Packages setup 1. [Add GitHub Packages as a Maven repository](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#using-a-published-package) to your project-level `settings.gradle` file: ```groovy dependencyResolutionManagement { repositories { google() mavenCentral() maven { url = uri("https://maven.pkg.github.com/THEOplayer/android-ui") credentials { // Define gpr.user and gpr.key preferably in your local ~/.gradle/gradle.properties username = (settings.ext.has("gpr.user")) ? settings.ext["gpr.user"] : System.getenv("USERNAME") password = (settings.ext.has("gpr.key")) ? settings.ext["gpr.key"] : System.getenv("TOKEN") } } maven { url = uri("https://maven.theoplayer.com/releases") } } } ``` 1. [Authenticate with GitHub Packages](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#authenticating-to-github-packages), and save your username and access token in `~/.gradle/gradle.properties`: ``` gpr.user=YOUR_USERNAME gpr.key=YOUR_ACCESS_TOKEN ```
  4. Add Open Video UI as a dependency in your module-level build.gradle file:
    dependencies {
        implementation "com.theoplayer.theoplayer-sdk-android:core:5.+"
        implementation "com.theoplayer.android-ui:android-ui:1.+"
    }

Usage

Default UI

DefaultUI provides a fully-featured video player experience with minimal setup.

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.theoplayer.android.api.THEOplayerConfig
import com.theoplayer.android.api.source.SourceDescription
import com.theoplayer.android.ui.DefaultUI
import com.theoplayer.android.ui.theme.THEOplayerTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            THEOplayerTheme(useDarkTheme = true) {
                DefaultUI(
                    config = THEOplayerConfig.Builder().build(),
                    source = SourceDescription.Builder("https://cdn.theoplayer.com/video/big_buck_bunny/big_buck_bunny.m3u8")
                        .build(),
                    title = "Big Buck Bunny"
                )
            }
        }
    }
}

See the demo app for a complete and working example.

Custom UI

If you want to fully customize your video player layout, you can use a UIController instead.

setContent {
    UIController(
        config = THEOplayerConfig.Builder().build(),
        source = SourceDescription.Builder("https://cdn.theoplayer.com/video/big_buck_bunny/big_buck_bunny.m3u8")
            .build(),
        // Choose your own layout using the provided components (or your own!)
        bottomChrome = {
            SeekBar()
            Row {
                PlayButton()
                MuteButton()
                Spacer(modifier = Modifier.weight(1f))
                FullscreenButton()
            }
        }
    )
}