Add PiP for native (ExoPlayer) video on Android. Video renders into a SurfaceView behind the WebView, so PiP is driven by the Activity shrinking into a floating window rather than the HTML5 PiP API (which WebKitGTK does not implement, hence Android-only). - PictureInPictureManager.kt: enter PiP with the video's aspect ratio (clamped to the 1:2.39-2.39:1 range Android accepts, outside which it throws), plus a play/pause RemoteAction. Hides the WebView while in PiP - it is opaque and sits above the surface, so it would otherwise occlude the video entirely - and re-fits the surface on exit. - MainActivity.kt: onUserLeaveHint auto-PiP, onPictureInPictureModeChanged, and an AndroidPictureInPicture JS interface following the existing AndroidAudioFocus pattern. - pictureInPicture.ts + VideoPlayer.svelte: PiP button, rendered only when the native bridge reports support. - proguard: keep rules for @JavascriptInterface methods, which are only referenced from JS and would be stripped in minified release builds. Casting needs no special handling: canEnterPip() checks natively that a local video surface is attached and playing, which a remote session lacks. While wiring the manifest, found that three tracked files under src-tauri/android/ were never reaching any build. Gradle reads only gen/android/app/src/main/, and sync-android-sources.sh did not copy them: - src/main/AndroidManifest.xml was a partial <application> fragment written as if Tauri merged it. It does not - there is no manifest-merger hook here, so its hardwareAccelerated flag never reached an APK. Promoted to the complete authoritative manifest (folding in that flag) and synced. - src/main/res/values/themes.xml (transparent status bar, fitsSystemWindows) was never copied; the sync only globbed mipmap-*. Now synced. - build.gradle.kts was a leftover com.android.library module config with stale media3 1.5.1 deps. The live deps are in app/build.gradle.kts at 1.5.0. Deleted. Verified: merged manifest now carries hardwareAccelerated, supportsPictureInPicture, resizeableActivity and the density configChange; themes.xml compiles into merged resources; Kotlin builds warning-free; svelte-check clean; 537 frontend tests pass. Not verified: PiP behaviour on a device, and the release keep rules against a minified build. assembleUniversalDebug cannot complete in this environment - the Rust step wants a dev-server addr file that only exists under `tauri android dev`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
1.1 KiB
Prolog
25 lines
1.1 KiB
Prolog
# JellyTau custom keep rules.
|
|
#
|
|
# These classes are loaded by name from the Rust backend via JNI
|
|
# (env.find_class / class-loader lookups), so R8 cannot see the
|
|
# references and would otherwise strip or rename them in a minified
|
|
# release build — causing an instant ClassNotFoundException crash on
|
|
# startup. See src-tauri/src/player/android/mod.rs and
|
|
# src-tauri/src/credentials.rs.
|
|
-keep class com.dtourolle.jellytau.player.** { *; }
|
|
-keep class com.dtourolle.jellytau.security.** { *; }
|
|
|
|
# Picture-in-picture is driven from the WebView through an
|
|
# @JavascriptInterface bridge, so the only references to these methods live
|
|
# in JavaScript. R8 sees them as unused and would strip them, silently
|
|
# breaking the PiP button in release builds only.
|
|
-keep class com.dtourolle.jellytau.PictureInPictureManager { *; }
|
|
-keep class com.dtourolle.jellytau.VideoOverlayManager { *; }
|
|
-keepclassmembers class * {
|
|
@android.webkit.JavascriptInterface <methods>;
|
|
}
|
|
|
|
# Media3 / ExoPlayer is accessed reflectively in places; keep it intact.
|
|
-keep class androidx.media3.** { *; }
|
|
-dontwarn androidx.media3.**
|