Release v0.2.34

This commit is contained in:
ponzischeme89
2026-08-09 08:25:50 +12:00
parent b1128bcce2
commit fdd9e6cab2
116 changed files with 11418 additions and 879 deletions
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Dark on both the green resting plate and the white focused plate. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FF07090A" />
</selector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- What sits behind the scrubbing thumbnail. Black rather than translucent: a frame drawn
over the film it came from reads as a rendering fault, and this is the one preview with
nothing but the picture in it to say otherwise. The hairline is what separates a dark
scene from the dark screen around it. -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FF000000" />
<stroke
android:width="1dp"
android:color="#33FFFFFF" />
<corners android:radius="4dp" />
</shape>
@@ -44,6 +44,11 @@
nothing to say about what comes next. -->
<include layout="@layout/player_next_up_banner" />
<!-- The credits pane, above the banner it stands in for. While it is up the banner is
suppressed: both shrink the same picture and both say what is on next, and two of
them would fight over the transform and print the episode twice. -->
<include layout="@layout/player_end_credits" />
<!-- App-owned subtitle controls. ExoPlayer supplies tracks and rendering only; this
overlay deliberately stays in Memby's TV design language. -->
<include layout="@layout/player_subtitle_overlay" />
@@ -261,4 +261,25 @@
</FrameLayout>
</LinearLayout>
<!-- The frame the scrubber is sitting on, while the transport is up and Left/Right
belong to the time bar rather than to us. Declared last so it draws over the OSD
gradients, and positioned horizontally from code so it rides above the scrubber
instead of naming a place on screen the scrubber may not be.
There is no wording beside it, unlike the centred chip: the transport is already
printing the position it would say, and a second copy of it over somebody's film
is a caption on a caption. The bottom margin clears the button row (72dp), its
padding (28dp) and the bar itself (34dp), with a gap above that. -->
<ImageView
android:id="@+id/player_scrub_preview"
android:layout_width="214dp"
android:layout_height="120dp"
android:layout_gravity="bottom|start"
android:layout_marginBottom="146dp"
android:background="@drawable/player_scrub_preview_background"
android:contentDescription="@null"
android:focusable="false"
android:scaleType="fitCenter"
android:visibility="gone" />
</merge>
@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The closing credits, moved aside.
From the `CreditsStart` marker Emby writes into the chapter list, the picture is scaled
into the left half of the screen and run at double speed while this panel says what is
on next. The transform is the *activity's* — the same scale-and-translate the next-up
banner has always used on the PlayerView, deliberately not the pre-roll's reparenting,
because moving a SurfaceView between parents mid-playback tears the surface down and
flashes black. The pre-roll can afford that; a running credit roll cannot.
So the left half of this layout is empty on purpose: it is a hole for the picture that
is already there to show through.
There is no scrim and no card behind the picture. It sits on somebody's film, and the
only lit surface is the button under focus. -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/player_end_credits"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:visibility="gone">
<!-- Why the picture is running fast. Without it a viewer who looks up mid-roll has a
sped-up image and no stated reason for it, which reads as the stream misbehaving.
It sits under the picture's left half rather than in the panel, because it is a
label on the video and not part of what is on next.
The start margin is aligned with the shrunken picture's own left edge, which
CREDITS_VIDEO_SCALE and CREDITS_VIDEO_SHIFT_X put at ~34dp on a 16:9 set, so it reads
as a caption on the credits rather than as something floating in the black beside
them. The bottom margin is the seek chip's, for the same reason: it is the height
this app already puts a chip at. -->
<TextView
android:id="@+id/player_end_credits_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|start"
android:layout_marginStart="34dp"
android:layout_marginBottom="104dp"
android:background="@drawable/time_remaining_cue_background"
android:letterSpacing="0.06"
android:paddingStart="14dp"
android:paddingTop="7dp"
android:paddingEnd="14dp"
android:paddingBottom="7dp"
android:textColor="#FF69CD61"
android:textSize="14sp"
android:textStyle="bold"
tools:text="2×" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!-- The hole the picture occupies. Weighted rather than fixed so the split is half
the screen on every set, whatever its width. -->
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<LinearLayout
android:id="@+id/player_end_credits_panel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingStart="30dp"
android:paddingEnd="72dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:letterSpacing="0.14"
android:text="@string/next_up_label"
android:textColor="#FF69CD61"
android:textSize="11sp" />
<ImageView
android:id="@+id/player_end_credits_image"
android:layout_width="match_parent"
android:layout_height="196dp"
android:layout_marginTop="14dp"
android:background="#FF1B2026"
android:contentDescription="@null"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/player_end_credits_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="#FFFFFFFF"
android:textSize="26sp"
android:textStyle="bold"
tools:text="The Crossing" />
<TextView
android:id="@+id/player_end_credits_meta"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="#BFFFFFFF"
android:textSize="13sp"
tools:text="S02E05 · Northbound" />
<!-- Gone rather than blank until the last minute. The pane opens minutes before
the file ends, and a countdown that sat there reading "starting in 4:12"
would be the most prominent thing on it for most of its life. -->
<TextView
android:id="@+id/player_end_credits_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:textColor="#FF69CD61"
android:textSize="16sp"
android:textStyle="bold"
android:visibility="gone"
tools:text="Starting in 28s"
tools:visibility="visible" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:orientation="horizontal"
tools:ignore="ButtonStyle">
<Button
android:id="@+id/player_end_credits_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/next_up_primary_button"
android:focusable="true"
android:minWidth="0dp"
android:paddingStart="22dp"
android:paddingTop="9dp"
android:paddingEnd="22dp"
android:paddingBottom="9dp"
android:stateListAnimator="@null"
android:text="@string/next_up_play_now"
android:textAllCaps="false"
android:textColor="@color/next_up_button_text"
android:textSize="15sp" />
<!-- Restores the picture and normal speed. Worded as watching the credits
rather than as dismissing a panel: somebody who presses this wants the
credits, and it is the only way back to them. -->
<Button
android:id="@+id/player_end_credits_dismiss"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:background="@drawable/next_up_secondary_button"
android:focusable="true"
android:minWidth="0dp"
android:paddingStart="22dp"
android:paddingTop="9dp"
android:paddingEnd="22dp"
android:paddingBottom="9dp"
android:stateListAnimator="@null"
android:text="@string/end_credits_watch"
android:textAllCaps="false"
android:textColor="@color/next_up_button_text"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>
@@ -50,6 +50,22 @@
android:textSize="11sp"
android:textStyle="bold" />
<!-- Why the list under this heading has nothing but Off in it. Without the
line, a title carrying no subtitles reads as the menu having failed rather
than as the film not having any, and the row that could fix it is below a
rule the eye has no reason to travel past. -->
<TextView
android:id="@+id/player_subtitle_empty_notice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="6dp"
android:layout_marginEnd="14dp"
android:text="@string/player_subtitle_none"
android:textColor="#96FFFFFF"
android:textSize="12sp"
android:visibility="gone" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+16
View File
@@ -32,10 +32,21 @@
<string name="player_subtitle_download">GET SUBTITLES</string>
<string name="player_subtitle_search">Search for subtitles…</string>
<string name="player_subtitle_search_again">Search again</string>
<!-- What the panel says when the title carries no subtitles at all. It is the reason
the track list has nothing but Off in it, and without it that list reads as the
menu having failed rather than as the film not having any. -->
<string name="player_subtitle_none">This title has no subtitles.</string>
<string name="player_subtitle_none_search">Find subtitles for this title…</string>
<!-- Shown in place of the track list on a backend that cannot fetch one, where there
is nothing to offer and the only honest thing to do is say so. -->
<string name="player_subtitle_none_unavailable">This title has no subtitles, and none can be downloaded.</string>
<string name="player_subtitle_searching">Looking for subtitles. This can take a moment.</string>
<string name="player_subtitle_search_empty">No subtitles were found for this release.</string>
<string name="player_subtitle_downloading">Downloading %1$s subtitles…</string>
<string name="player_subtitle_download_failed">That subtitle could not be downloaded. Try another.</string>
<string name="player_subtitle_loaded">%1$s subtitles loaded</string>
<string name="player_subtitle_disabled">Subtitles off</string>
<string name="player_subtitle_generic">Selected</string>
<string name="player_cast_open">Cast</string>
<string name="player_back_to_close">BACK · CLOSE</string>
<string name="player_ends_at">Ends at %1$s</string>
@@ -69,6 +80,11 @@
<string name="next_up_play_now">Play now</string>
<string name="next_up_dismiss">Dismiss</string>
<string name="next_up_starting_in">Starting in %1$ds</string>
<!-- The way back to the credits at normal size and normal speed. Worded as wanting the
credits rather than as dismissing a panel: it is the only thing this button does,
and somebody pressing it is asking to watch them. -->
<string name="end_credits_watch">Watch credits</string>
<string name="end_credits_speed">%1$s speed</string>
<string name="next_up_starting_now">Starting now…</string>
<string name="app_name">Memby</string>
<string name="screensaver_name">Memby Screensaver</string>