From 603cc0c1a9ed29d213b02b279364871ce9dd3ef1 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Mon, 12 Oct 2026 22:37:17 +0200 Subject: [PATCH] feat(core,app,android,ios): add a first share without a detour or a name to invent The empty library said to add a link "under Shares, then refresh" with nothing to press on the phones, and on the desktop only switched page. All three now open the add form from there, the desktop with the caret in the link field; and adding already crawls, so there is nothing to refresh. A share's name was required before the viewer had seen anything to name. It is optional now: without one, ShareStore::add_verified takes the shared folder's own name from the link it has just opened. The link comes first in each form. The desktop form submits on Enter, and the Android link field has an eye to check what was pasted. --- .../java/io/narl/protonstream/ui/Common.kt | 21 ++++- .../io/narl/protonstream/ui/LibraryScreen.kt | 4 +- .../narl/protonstream/ui/ProtonStreamApp.kt | 11 ++- .../io/narl/protonstream/ui/SharesScreen.kt | 28 +++++-- .../src/test/screenshots/downloads-empty.png | Bin 32937 -> 33598 bytes .../src/test/screenshots/library-empty.png | Bin 37202 -> 60100 bytes crates/pstr-app/src/app.rs | 10 ++- crates/pstr-app/src/ui/library.rs | 2 +- crates/pstr-app/src/ui/shares.rs | 78 ++++++++++++------ crates/pstr-core/src/shares.rs | 16 +++- ios/ProtonStream/App/ProtonStreamApp.swift | 10 ++- ios/ProtonStream/UI/Common.swift | 9 +- ios/ProtonStream/UI/LibraryView.swift | 7 +- ios/ProtonStream/UI/SharesView.swift | 7 +- 14 files changed, 153 insertions(+), 50 deletions(-) diff --git a/android/app/src/main/java/io/narl/protonstream/ui/Common.kt b/android/app/src/main/java/io/narl/protonstream/ui/Common.kt index b3f3e83..48e1fe8 100644 --- a/android/app/src/main/java/io/narl/protonstream/ui/Common.kt +++ b/android/app/src/main/java/io/narl/protonstream/ui/Common.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -19,7 +20,10 @@ import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp import io.narl.protonstream.download.RetainedDownload +import io.narl.protonstream.ui.theme.AccentButton import uniffi.pstr_android.EpisodeRecord /** @@ -93,11 +97,20 @@ internal fun Modifier.sharedArt(key: String): Modifier { } @Composable -internal fun EmptyState(title: String, body: String) { +internal fun EmptyState(title: String, body: String, action: Pair Unit>? = null) { Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text(title, style = MaterialTheme.typography.titleMedium) - Text(body, style = MaterialTheme.typography.bodyMedium) + Column(Modifier.padding(horizontal = 32.dp), horizontalAlignment = Alignment.CenterHorizontally) { + Text(title, style = MaterialTheme.typography.titleMedium, textAlign = TextAlign.Center) + Text( + body, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier.padding(top = 4.dp), + ) + action?.let { (label, onClick) -> + AccentButton(onClick = onClick, modifier = Modifier.padding(top = 16.dp)) { Text(label) } + } } } } diff --git a/android/app/src/main/java/io/narl/protonstream/ui/LibraryScreen.kt b/android/app/src/main/java/io/narl/protonstream/ui/LibraryScreen.kt index 28fea5d..d41c63c 100644 --- a/android/app/src/main/java/io/narl/protonstream/ui/LibraryScreen.kt +++ b/android/app/src/main/java/io/narl/protonstream/ui/LibraryScreen.kt @@ -124,6 +124,7 @@ internal fun LibraryScreen( onMatchChanged: () -> Unit = {}, onError: (Throwable) -> Unit = {}, onArrange: (LibrarySort, Boolean) -> Unit = { _, _ -> }, + onAddShare: () -> Unit = {}, ) { val context = LocalContext.current // What a long press opened a menu for: a title, or a Continue watching card. @@ -189,7 +190,8 @@ internal fun LibraryScreen( ) state.titles.isEmpty() -> EmptyState( "Your library is empty", - "Add a Proton Drive public link under Shares, then refresh.", + "Add a Proton Drive share link, and everything playable behind it shows up here.", + action = "Add a share" to onAddShare, ) else -> LibraryGrid( state, diff --git a/android/app/src/main/java/io/narl/protonstream/ui/ProtonStreamApp.kt b/android/app/src/main/java/io/narl/protonstream/ui/ProtonStreamApp.kt index 2c90e9b..9b275d1 100644 --- a/android/app/src/main/java/io/narl/protonstream/ui/ProtonStreamApp.kt +++ b/android/app/src/main/java/io/narl/protonstream/ui/ProtonStreamApp.kt @@ -133,6 +133,7 @@ fun ProtonStreamApp( // is what says so. Saved, because a rotation must not throw the viewer back // into the video they had just left. var playerMinimized by rememberSaveable { mutableStateOf(false) } + var addingShare by remember { mutableStateOf(false) } val selectedTitle = state.titles.firstOrNull { it.key == selectedTitleKey } val playing = playingTitleKey @@ -226,6 +227,10 @@ fun ProtonStreamApp( onMatchChanged = model::reloadAfterMetadataChange, onError = model::reportError, onArrange = model::arrange, + onAddShare = { + destination = Destination.Shares + addingShare = true + }, ) } val titlePane = @Composable { selected: TitleRecord -> @@ -277,8 +282,10 @@ fun ProtonStreamApp( model::repairShare, model::refreshShare, model::removeShare, - shareLink, - onShareLinkTaken, + // The empty library's button opens the form as a + // pasted link would, only with nothing in it. + shareLink ?: "".takeIf { addingShare }, + { addingShare = false; onShareLinkTaken() }, body, account = state.account, accountActions = AccountActions( diff --git a/android/app/src/main/java/io/narl/protonstream/ui/SharesScreen.kt b/android/app/src/main/java/io/narl/protonstream/ui/SharesScreen.kt index 1abad13..0f266c6 100644 --- a/android/app/src/main/java/io/narl/protonstream/ui/SharesScreen.kt +++ b/android/app/src/main/java/io/narl/protonstream/ui/SharesScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextOverflow import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.KeyboardType @@ -51,6 +52,8 @@ import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Key import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.FolderShared +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.ui.graphics.Color @Composable @@ -330,6 +333,7 @@ private fun AddShareDialog( ) { var name by remember { mutableStateOf("") } var url by remember(initialUrl) { mutableStateOf(initialUrl) } + var showLink by remember { mutableStateOf(false) } var password by remember { mutableStateOf("") } var adding by remember { mutableStateOf(false) } var refusal by remember { mutableStateOf(null) } @@ -340,17 +344,31 @@ private fun AddShareDialog( title = { Text("Add Proton Drive share") }, text = { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { - OutlinedTextField(name, { name = it }, label = { Text("Library name") }, singleLine = true) OutlinedTextField( url, { url = it }, - label = { Text("Public share URL") }, + label = { Text("Share link") }, singleLine = true, // The URL fragment is a secret. Password input disables // IME learning/suggestions while normal long-press paste - // remains available. - visualTransformation = PasswordVisualTransformation(), + // remains available; the eye shows what was pasted. + visualTransformation = if (showLink) VisualTransformation.None else PasswordVisualTransformation(), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + trailingIcon = { + IconButton(onClick = { showLink = !showLink }) { + Icon( + if (showLink) Icons.Default.VisibilityOff else Icons.Default.Visibility, + contentDescription = if (showLink) "Hide link" else "Show link", + ) + } + }, + ) + OutlinedTextField( + name, + { name = it }, + label = { Text("Name (optional)") }, + supportingText = { Text("Defaults to the shared folder's name") }, + singleLine = true, ) OutlinedTextField( password, @@ -381,7 +399,7 @@ private fun AddShareDialog( if (refusal == null) onDismiss() } }, - enabled = name.isNotBlank() && url.isNotBlank() && !adding, + enabled = url.isNotBlank() && !adding, ) { Text(if (adding) "Adding…" else "Add") } }, dismissButton = { TonalButton(onClick = onDismiss, enabled = !adding) { Text("Cancel") } }, diff --git a/android/app/src/test/screenshots/downloads-empty.png b/android/app/src/test/screenshots/downloads-empty.png index 823b4e17a638a893298f42f457c114a68f78573d..17ff516b987443cfd531bdacae8fff0a6ece64a1 100644 GIT binary patch delta 16832 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 b}% delta 16341 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 diff --git a/android/app/src/test/screenshots/library-empty.png b/android/app/src/test/screenshots/library-empty.png index 7db0f8a51c1cca5e80e5da0efc47cfd185bc15a8..8bb6594c95cd0497cb4646a460d3ee5f2035633e 100644 GIT binary patch literal 60100 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 Imj9-I0*Lz6Q2+n{ literal 37202 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, + /// Put the caret in the link field on the next frame the form is drawn. + pub focus: bool, } pub struct App { @@ -1512,7 +1516,11 @@ impl App { self.page = Page::Shares; self.form.url = url; self.form.error = None; - self.note(ctx, "share link pasted — name it and add it", false); + self.note(ctx, "share link pasted — add it, or name it first", false); + } + Action::OpenShareForm => { + self.page = Page::Shares; + self.form.focus = true; } Action::AddShare { name, diff --git a/crates/pstr-app/src/ui/library.rs b/crates/pstr-app/src/ui/library.rs index 13c0dec..b7bc31a 100644 --- a/crates/pstr-app/src/ui/library.rs +++ b/crates/pstr-app/src/ui/library.rs @@ -649,7 +649,7 @@ fn empty_state(ui: &mut egui::Ui, actions: &mut Vec) { )); ui.add_space(theme::space::XL); if ui::accent_button(ui, "Add a share").clicked() { - actions.push(Action::Goto(Page::Shares)); + actions.push(Action::OpenShareForm); } }); } diff --git a/crates/pstr-app/src/ui/shares.rs b/crates/pstr-app/src/ui/shares.rs index 8f1419a..91487ae 100644 --- a/crates/pstr-app/src/ui/shares.rs +++ b/crates/pstr-app/src/ui/shares.rs @@ -113,6 +113,15 @@ fn share_row( ui.add_space(theme::space::S); } +/// The add form's link field, which the library's empty state focuses. +pub fn link_field_id() -> egui::Id { + egui::Id::new("share-link") +} + +fn ui_enter_pressed(ctx: &egui::Context) -> bool { + ctx.input(|input| input.key_pressed(egui::Key::Enter)) +} + fn add_form(ui: &mut egui::Ui, shares: &[Share], form: &mut ShareForm, actions: &mut Vec) { ui::section(ui, "Add a share"); ui.label(ui::muted( @@ -128,24 +137,28 @@ fn add_form(ui: &mut egui::Ui, shares: &[Share], form: &mut ShareForm, actions: .show(ui, |ui| { ui.set_width(ui.available_width().min(640.0)); - ui.label(ui::muted("Name")); - ui.add( - egui::TextEdit::singleline(&mut form.name) - .hint_text("Anime") - .desired_width(f32::INFINITY), - ); - ui.add_space(theme::space::M); + // Enter in any field of the form submits it, as the sign-in + // form's do. + let mut entered = false; + let mut submitted_from = |response: egui::Response| { + entered |= response.lost_focus() && ui_enter_pressed(&response.ctx); + }; ui.label(ui::muted("Link")); ui.horizontal(|ui| { let paste = 60.0; - let field = egui::Id::new("share-link"); - ui.add( - egui::TextEdit::singleline(&mut form.url) - .id(field) - .password(true) - .hint_text("https://drive.proton.me/urls/…#…") - .desired_width(ui.available_width() - paste), + let field = link_field_id(); + if std::mem::take(&mut form.focus) { + ui.memory_mut(|memory| memory.request_focus(field)); + } + submitted_from( + ui.add( + egui::TextEdit::singleline(&mut form.url) + .id(field) + .password(true) + .hint_text("https://drive.proton.me/urls/…#…") + .desired_width(ui.available_width() - paste), + ), ); // The link is masked, so pasting is the only sensible way in — // and a button says that more plainly than the field does. @@ -170,20 +183,31 @@ fn add_form(ui: &mut egui::Ui, shares: &[Share], form: &mut ShareForm, actions: } ui.add_space(theme::space::M); + ui.label(ui::muted("Name (optional)")); + submitted_from( + ui.add( + egui::TextEdit::singleline(&mut form.name) + .hint_text("The shared folder's own name") + .desired_width(f32::INFINITY), + ), + ); + ui.add_space(theme::space::M); + ui::widgets::toggle(ui, &mut form.has_password, "The link asks for a password"); if form.has_password { ui.add_space(theme::space::S); - ui.add( - egui::TextEdit::singleline(&mut form.password) - .password(true) - .hint_text("Link password") - .desired_width(f32::INFINITY), + submitted_from( + ui.add( + egui::TextEdit::singleline(&mut form.password) + .password(true) + .hint_text("Link password") + .desired_width(f32::INFINITY), + ), ); } ui.add_space(theme::space::L); - let ready = !form.name.trim().is_empty() - && !form.url.trim().is_empty() + let ready = !form.url.trim().is_empty() && problem.is_none() && (!form.has_password || !form.password.is_empty()) && !form.sending; @@ -193,11 +217,11 @@ fn add_form(ui: &mut egui::Ui, shares: &[Share], form: &mut ShareForm, actions: ui.add_space(theme::space::S); } ui.horizontal(|ui| { - if ui - .add_enabled_ui(ready, |ui| ui::accent_button(ui, "Add and crawl")) + let clicked = ui + .add_enabled_ui(ready, |ui| ui::accent_button(ui, "Add share")) .inner - .clicked() - { + .clicked(); + if clicked || (ready && entered) { actions.push(Action::AddShare { name: form.name.trim().to_string(), url: form.url.trim().to_string(), @@ -210,8 +234,8 @@ fn add_form(ui: &mut egui::Ui, shares: &[Share], form: &mut ShareForm, actions: if form.sending { ui.add(egui::Spinner::new().size(14.0)); ui.label(ui::muted("adding…")); - } else if form.name.trim().is_empty() || form.url.trim().is_empty() { - ui.label(ui::muted("A name and a link are needed.")); + } else if form.url.trim().is_empty() { + ui.label(ui::muted("Paste a share link to add it.")); } }); }); diff --git a/crates/pstr-core/src/shares.rs b/crates/pstr-core/src/shares.rs index 1515c87..96255e0 100644 --- a/crates/pstr-core/src/shares.rs +++ b/crates/pstr-core/src/shares.rs @@ -422,7 +422,7 @@ impl ShareStore { } /// [`Self::add`], but only once the link has been opened with the - /// password given. + /// password given. An empty `name` takes the shared folder's own. /// /// A link that is mistyped, expired or behind the wrong password used to /// be stored anyway, so the first try failed on the crawl and every retry @@ -444,7 +444,19 @@ impl ShareStore { } let custom_password = custom_password.filter(|password| !password.is_empty()); let client = open_link(url, custom_password).await?; - let share = self.add(name, url, custom_password)?; + // A name is the viewer's to give, not theirs to invent before they + // can see anything: without one, the shared folder's own name. + let name = match name.trim() { + "" => client + .root_node() + .await + .ok() + .map(|root| root.name) + .filter(|name| !name.trim().is_empty()) + .unwrap_or_else(|| "Shared folder".to_owned()), + given => given.to_owned(), + }; + let share = self.add(&name, url, custom_password)?; Ok((share, client)) } diff --git a/ios/ProtonStream/App/ProtonStreamApp.swift b/ios/ProtonStream/App/ProtonStreamApp.swift index ea79371..ed82a1b 100644 --- a/ios/ProtonStream/App/ProtonStreamApp.swift +++ b/ios/ProtonStream/App/ProtonStreamApp.swift @@ -194,7 +194,15 @@ struct RootView: View { /// tap rather than back and in again. @ViewBuilder private func libraryPage(width: CGFloat) -> some View { let selected = selectedTitleKey.flatMap { key in model.titles.first { $0.key == key } } - let library = LibraryView(onResume: play, onTitle: { title in withAnimation(.easeOut(duration: 0.25)) { selectedTitleKey = title.key } }) + let library = LibraryView( + onResume: play, + onTitle: { title in withAnimation(.easeOut(duration: 0.25)) { selectedTitleKey = title.key } }, + // The form as a pasted link opens it, only with nothing in it. + onAddShare: { + incomingLink = "" + destination = .shares + } + ) if width >= twoPaneWidth { HStack(spacing: 0) { library.frame(width: width * 0.45) diff --git a/ios/ProtonStream/UI/Common.swift b/ios/ProtonStream/UI/Common.swift index 75b01ee..38292db 100644 --- a/ios/ProtonStream/UI/Common.swift +++ b/ios/ProtonStream/UI/Common.swift @@ -79,17 +79,22 @@ struct IconButton: View { struct EmptyState: View { let title: String let body_: String + let action: (label: String, run: () -> Void)? @Environment(\.scheme) private var scheme - init(_ title: String, _ body: String) { + init(_ title: String, _ body: String, action: (label: String, run: () -> Void)? = nil) { self.title = title body_ = body + self.action = action } var body: some View { VStack(spacing: 2) { Text(title).textStyle(.titleMedium).foregroundStyle(scheme.onSurface) - Text(body_).textStyle(.bodyMedium).foregroundStyle(scheme.onSurface) + Text(body_).textStyle(.bodyMedium).foregroundStyle(scheme.onSurfaceVariant) + if let action { + Button(action.label, action: action.run).buttonStyle(.accent).padding(.top, 16) + } } .multilineTextAlignment(.center) .padding(24) diff --git a/ios/ProtonStream/UI/LibraryView.swift b/ios/ProtonStream/UI/LibraryView.swift index 7753d13..c01a008 100644 --- a/ios/ProtonStream/UI/LibraryView.swift +++ b/ios/ProtonStream/UI/LibraryView.swift @@ -57,6 +57,7 @@ struct LibraryView: View { @Environment(\.scheme) private var scheme let onResume: (TitleRecord, Int) -> Void let onTitle: (TitleRecord) -> Void + var onAddShare: () -> Void = {} // What a long press opened a menu for: a title, or a Continue watching card. @State private var menuFor: TitleRecord? @@ -146,7 +147,11 @@ struct LibraryView: View { EmptyState("Nothing matches", "No title in the library is called “\(model.query.trimmingCharacters(in: .whitespaces))”.") } else if model.titles.isEmpty { ScrollView { - EmptyState("Your library is empty", "Add a Proton Drive public link under Shares, then refresh.") + EmptyState( + "Your library is empty", + "Add a Proton Drive share link, and everything playable behind it shows up here.", + action: ("Add a share", onAddShare) + ) .containerRelativeFrame(.vertical) } .refreshable { await model.crawlNow(nil) } diff --git a/ios/ProtonStream/UI/SharesView.swift b/ios/ProtonStream/UI/SharesView.swift index 064909b..8e19551 100644 --- a/ios/ProtonStream/UI/SharesView.swift +++ b/ios/ProtonStream/UI/SharesView.swift @@ -211,15 +211,14 @@ private struct AddShareSheet: View { } private var ready: Bool { - !name.trimmingCharacters(in: .whitespaces).isEmpty && !url.trimmingCharacters(in: .whitespaces).isEmpty + !url.trimmingCharacters(in: .whitespaces).isEmpty } var body: some View { DialogSheet("Add Proton Drive share") { - Field(label: "Library name", text: $name) // The URL fragment is a secret, so the field is a secure one: no // keyboard learning, no suggestions, and paste still works. - Field(label: "Public share URL", text: $url, secret: true) + Field(label: "Share link", text: $url, secret: true) // There is no share sheet into a sideloaded app, so a link copied // elsewhere comes in from the clipboard. if url.isEmpty { @@ -230,6 +229,8 @@ private struct AddShareSheet: View { } .buttonStyle(.quiet) } + // Without one, the shared folder's own name. + Field(label: "Name (optional)", text: $name) Field(label: "Custom password (optional)", text: $password, secret: true) if adding { HStack(spacing: 12) {