Add GET_CONTENT picker support, fix account/login bugs, restyle selection UI
Build APK / build (push) Successful in 7m40s
Build APK / build (push) Successful in 7m40s
- Let Noo be picked as a source (Files + Photos) by other apps' native file/photo pickers via Android's GET_CONTENT intent, mirroring the existing "Share to Noo" plumbing: MainActivity.kt/PickIntentService/ PickRequest, ServerProvider.pickRequest/confirmPick/cancelPick, and pick-mode tap handling in FilesView/PhotosView. While picking, the bottom nav and MoreTabsButton are restricted to Files/Photos only. - Fix two account bugs: testConnection() failures no longer delete a still-valid stored app password (only an actual 401 does), and switchAccount() now retries a nominally-active-but-logged-out account instead of no-op'ing - both were silently locking users out of "Continue as" with no way back in except removing and re-adding the account (now exposed via login_view.dart's inline remove button). - Fix the login WebView: clear cookies before every load so "Add Account" can't silently reuse an existing session, and push it as a non-animated route to avoid a known WebView-as-PlatformView black-screen- on-pop issue under Impeller. - Redesign the Files/Photos selection toolbar to take over the top app bar entirely (SyncedHeaderScaffold.selectionBar) instead of sitting as a second bar under the controls row, with a horizontally-scrollable, uniformly-colored actions row and the same one-shot scroll-hint nudge the controls row uses. - Redesign ShareUploadView to share the same SyncedHeaderScaffold chrome as every tab, with the uploading-file summary (marqueed via the new shared MarqueeTitle widget) and upload button grouped into one rounded/elevated bottom sheet. - Restyle ShareSheet to open on the same DetailsHeader every other per-item sheet uses, and fix a couple of small design-language drifts (hardcoded text style, a non-rounded icon). - Settings' account card: icon buttons with tooltips instead of text buttons for refresh/logout/remove, divider removed.
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
/// Another app asking Noo (via Android's GET_CONTENT chooser) to pick a
|
||||
/// file/photo and hand it back - see `PickIntentService`/`MainActivity.kt`.
|
||||
class PickRequest {
|
||||
final String mimeType;
|
||||
final bool allowMultiple;
|
||||
final String? callerLabel;
|
||||
|
||||
const PickRequest({
|
||||
required this.mimeType,
|
||||
required this.allowMultiple,
|
||||
this.callerLabel,
|
||||
});
|
||||
|
||||
factory PickRequest.fromMap(Map<dynamic, dynamic> map) {
|
||||
return PickRequest(
|
||||
mimeType: map['mimeType'] as String? ?? '*/*',
|
||||
allowMultiple: map['allowMultiple'] as bool? ?? false,
|
||||
callerLabel: map['callerLabel'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
/// Whether an item's mime type satisfies this request's filter (which may
|
||||
/// be a wildcard like `image/*` or the catch-all `*/*`).
|
||||
bool matches(String? itemMimeType) {
|
||||
if (mimeType == '*/*') return true;
|
||||
if (itemMimeType == null) return false;
|
||||
if (mimeType.endsWith('/*')) {
|
||||
return itemMimeType.startsWith(
|
||||
mimeType.substring(0, mimeType.length - 1),
|
||||
);
|
||||
}
|
||||
return itemMimeType == mimeType;
|
||||
}
|
||||
}
|
||||
@@ -6,13 +6,11 @@ import 'package:flutter/material.dart';
|
||||
class SelectionAction {
|
||||
final IconData icon;
|
||||
final String label;
|
||||
final Color? color;
|
||||
final VoidCallback onTap;
|
||||
|
||||
const SelectionAction({
|
||||
required this.icon,
|
||||
required this.label,
|
||||
required this.onTap,
|
||||
this.color,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user