# pierfrancescosoffritti/android-youtube-player architecture

> Architecture diagram of the GitHub repository pierfrancescosoffritti/android-youtube-player, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-24). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pierfrancescosoffritti/android-youtube-player
- Repository: https://github.com/pierfrancescosoffritti/android-youtube-player

## Overview

android-youtube-player provides an Android YouTube player backed by YouTube’s IFrame Player API in a WebView, plus an optional Chromecast sender/receiver extension and customizable controls. The main workflow is app integration → player setup and video commands → iframe playback and callbacks; casting adds session setup, message exchange, receiver playback, and remote callbacks. The README documents options, lifecycle handling, tracking, network events, and UI customization; some of those implementations were not sampled, so their internal wiring is omitted.

Main entry points: [`custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/DefaultPlayerUiController.kt`](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/DefaultPlayerUiController.kt) (Default Player UI), [`core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt`](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt) (WebView Player), [`chromecast-receiver/js/main.js`](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/main.js) (Receiver Entry), [`chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeIOChannel.kt`](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeIOChannel.kt) (Sender Channel)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_core["Core Playback"]
  node_view["Player View"]
  node_webview["WebView Player"]
  node_api["Player API<br/>[YouTubePlayer.kt]"]
  node_bridge["Player Bridge"]
  node_callbacks["Player Callbacks"]
  node_listeners["Player Listeners"]
  node_options["Iframe Options"]
  node_tracker["Playback Tracker"]
  node_resume["Playback Resumer<br/>[PlaybackResumer.kt]"]
  node_network["Network Observer<br/>[NetworkObserver.kt]"]
end

subgraph group_ui["Player UI"]
  node_uiapi["UI Controller API"]
  node_defaultui["Default Player UI"]
  node_seekbar["Seek Bar"]
  node_menu["Player Menu"]
end

subgraph group_sender["Cast Sender"]
  node_castplayer["Cast Player"]
  node_castcontext["Player Context"]
  node_castmanager["Session Manager"]
  node_castchannel["Sender Channel"]
  node_dispatcher["Sender Dispatcher"]
end

subgraph group_receiver["Cast Receiver"]
  node_receiver["Receiver Entry<br/>[main.js]"]
  node_recvdispatch["Receiver Dispatcher"]
  node_recvchannel["Receiver Channel"]
  node_remote["Remote Player<br/>[YouTubePlayer.js]"]
  node_remote_bridge["Remote Bridge"]
  node_message["Message Format<br/>[YouTubeMessage.js]"]
end

node_app(("Android App"))
node_youtube{{"YouTube IFrame API"}}
node_castapp(("Casting App"))
node_castdevice{{"Chromecast Device"}}

node_app -->|"embeds"| node_view
node_view -->|"hosts"| node_webview
node_webview -->|"loads iframe"| node_youtube
node_api -->|"sends commands"| node_bridge
node_bridge -->|"executes in"| node_webview
node_webview -->|"receives events"| node_callbacks
node_callbacks -->|"notifies"| node_listeners
node_app -->|"configures"| node_options
node_api -->|"tracks playback"| node_tracker
node_network -->|"supports recovery"| node_resume
node_app -->|"customizes controls"| node_uiapi
node_uiapi -->|"implemented by"| node_defaultui
node_defaultui -->|"controls playback"| node_api
node_defaultui -->|"uses"| node_seekbar
node_defaultui -->|"opens"| node_menu
node_castapp -->|"creates"| node_castplayer
node_castplayer -->|"uses context"| node_castcontext
node_castcontext -->|"manages sessions"| node_castmanager
node_castmanager -->|"sends init"| node_castchannel
node_castchannel -->|"transfers messages"| node_castdevice
node_castdevice -->|"delivers messages"| node_recvchannel
node_receiver -->|"creates"| node_recvchannel
node_receiver -->|"initializes"| node_remote
node_receiver -->|"registers handler"| node_recvdispatch
node_recvdispatch -->|"dispatches actions"| node_remote
node_remote -->|"controls player"| node_remote_bridge
node_remote_bridge -->|"loads iframe"| node_youtube
node_recvchannel -->|"sends responses"| node_castdevice
node_castchannel -->|"forwards messages"| node_dispatcher
node_dispatcher -->|"delivers callbacks"| node_castplayer

click node_view "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt"
click node_webview "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt"
click node_api "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayer.kt"
click node_bridge "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt"
click node_callbacks "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerCallbacks.kt"
click node_listeners "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/listeners/YouTubePlayerListener.kt"
click node_options "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt"
click node_tracker "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/YouTubePlayerTracker.kt"
click node_resume "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/PlaybackResumer.kt"
click node_network "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/NetworkObserver.kt"
click node_uiapi "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/PlayerUiController.kt"
click node_defaultui "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/DefaultPlayerUiController.kt"
click node_seekbar "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/views/YouTubePlayerSeekBar.kt"
click node_menu "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/menu/defaultMenu/DefaultYouTubePlayerMenu.kt"
click node_castplayer "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayer.kt"
click node_castcontext "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayerContext.kt"
click node_castmanager "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/infrastructure/ChromecastManager.kt"
click node_castchannel "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeIOChannel.kt"
click node_dispatcher "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeMessageDispatcher.kt"
click node_receiver "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/main.js"
click node_recvdispatch "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/SenderMessagesDispatcher.js"
click node_recvchannel "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/ChromecastCommunicationChannel.js"
click node_remote "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/YouTubePlayer.js"
click node_remote_bridge "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/YouTubePlayerRemoteBridge.js"
click node_message "https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/YouTubeMessage.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_view,node_webview,node_api,node_bridge,node_callbacks,node_listeners,node_options,node_tracker,node_resume,node_network toneBlue
class node_uiapi,node_defaultui,node_seekbar,node_menu toneAmber
class node_castplayer,node_castcontext,node_castmanager,node_castchannel,node_dispatcher,node_youtube toneMint
class node_receiver,node_recvdispatch,node_recvchannel,node_remote,node_remote_bridge,node_message toneRose
class node_app,node_castapp,node_castdevice toneIndigo
```

## Components

### Core Playback

- [Player View](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/YouTubePlayerView.kt`
- [WebView Player](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/views/WebViewYouTubePlayer.kt`
- [Player API](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayer.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayer.kt`
- [Player Bridge](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerBridge.kt`
- [Player Callbacks](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerCallbacks.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/YouTubePlayerCallbacks.kt`
- [Player Listeners](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/listeners/YouTubePlayerListener.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/listeners/YouTubePlayerListener.kt`
- [Iframe Options](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/options/IFramePlayerOptions.kt`
- [Playback Tracker](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/YouTubePlayerTracker.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/YouTubePlayerTracker.kt`
- [Playback Resumer](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/PlaybackResumer.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/PlaybackResumer.kt`
- [Network Observer](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/NetworkObserver.kt): `core/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/player/utils/NetworkObserver.kt`

### Player UI

- [UI Controller API](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/PlayerUiController.kt): `custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/PlayerUiController.kt`
- [Default Player UI](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/DefaultPlayerUiController.kt): `custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/DefaultPlayerUiController.kt`
- [Seek Bar](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/views/YouTubePlayerSeekBar.kt): `custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/views/YouTubePlayerSeekBar.kt`
- [Player Menu](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/menu/defaultMenu/DefaultYouTubePlayerMenu.kt): `custom-ui/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/core/customui/menu/defaultMenu/DefaultYouTubePlayerMenu.kt`

### Cast Sender

- [Cast Player](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayer.kt): `chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayer.kt`
- [Player Context](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayerContext.kt): `chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/ChromecastYouTubePlayerContext.kt`
- [Session Manager](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/infrastructure/ChromecastManager.kt): `chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/infrastructure/ChromecastManager.kt`
- [Sender Channel](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeIOChannel.kt): `chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeIOChannel.kt`
- [Sender Dispatcher](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeMessageDispatcher.kt): `chromecast-sender/src/main/java/com/pierfrancescosoffritti/androidyoutubeplayer/chromecast/chromecastsender/io/youtube/ChromecastYouTubeMessageDispatcher.kt`

### Cast Receiver

- [Receiver Entry](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/main.js): `chromecast-receiver/js/main.js`
- [Receiver Dispatcher](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/SenderMessagesDispatcher.js): `chromecast-receiver/js/io/SenderMessagesDispatcher.js`
- [Receiver Channel](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/ChromecastCommunicationChannel.js): `chromecast-receiver/js/io/ChromecastCommunicationChannel.js`
- [Remote Player](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/YouTubePlayer.js): `chromecast-receiver/js/YouTubePlayer.js`
- [Remote Bridge](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/YouTubePlayerRemoteBridge.js): `chromecast-receiver/js/io/YouTubePlayerRemoteBridge.js`
- [Message Format](https://github.com/pierfrancescosoffritti/android-youtube-player/blob/dev/chromecast-receiver/js/io/YouTubeMessage.js): `chromecast-receiver/js/io/YouTubeMessage.js`

### Other components

- **Android App**
- **YouTube IFrame API**
- **Casting App**
- **Chromecast Device**

## Connections

- Android App → Player View: embeds
- Player View → WebView Player: hosts
- WebView Player → YouTube IFrame API: loads iframe
- Player API → Player Bridge: sends commands
- Player Bridge → WebView Player: executes in
- WebView Player → Player Callbacks: receives events
- Player Callbacks → Player Listeners: notifies
- Android App → Iframe Options: configures
- Player API → Playback Tracker: tracks playback
- Network Observer → Playback Resumer: supports recovery
- Android App → UI Controller API: customizes controls
- UI Controller API → Default Player UI: implemented by
- Default Player UI → Player API: controls playback
- Default Player UI → Seek Bar: uses
- Default Player UI → Player Menu: opens
- Casting App → Cast Player: creates
- Cast Player → Player Context: uses context
- Player Context → Session Manager: manages sessions
- Session Manager → Sender Channel: sends init
- Sender Channel → Chromecast Device: transfers messages
- Chromecast Device → Receiver Channel: delivers messages
- Receiver Entry → Receiver Channel: creates
- Receiver Entry → Remote Player: initializes
- Receiver Entry → Receiver Dispatcher: registers handler
- Receiver Dispatcher → Remote Player: dispatches actions
- Remote Player → Remote Bridge: controls player
- Remote Bridge → YouTube IFrame API: loads iframe
- Receiver Channel → Chromecast Device: sends responses
- Sender Channel → Sender Dispatcher: forwards messages
- Sender Dispatcher → Cast Player: delivers callbacks
