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.
103 lines
5.3 KiB
XML
103 lines
5.3 KiB
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
<uses-permission android:name="android.permission.INTERNET"/>
|
|
<!-- For local_auth's biometric app-lock (Settings > Security). -->
|
|
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
|
|
<!-- For ShareUploadService, which keeps a "Share to Noo" upload going
|
|
(and cancellable from its notification) even if the app is fully
|
|
closed - see the service's own doc comment. -->
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
|
<application
|
|
android:label="Noo"
|
|
android:name="${applicationName}"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:networkSecurityConfig="@xml/network_security_config"
|
|
android:usesCleartextTraffic="true"
|
|
android:enableOnBackInvokedCallback="true">
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:exported="true"
|
|
android:launchMode="singleTask"
|
|
android:taskAffinity=""
|
|
android:theme="@style/LaunchTheme"
|
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
android:hardwareAccelerated="true"
|
|
android:windowSoftInputMode="adjustResize">
|
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
|
the Android process has started. This theme is visible to the user
|
|
while the Flutter UI initializes. After that, this theme continues
|
|
to determine the Window background behind the Flutter UI. -->
|
|
<meta-data
|
|
android:name="io.flutter.embedding.android.NormalTheme"
|
|
android:resource="@style/NormalTheme"
|
|
/>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN"/>
|
|
<category android:name="android.intent.category.LAUNCHER"/>
|
|
</intent-filter>
|
|
<!-- Lets other apps' share sheets ("Share to...") send a file here
|
|
to be uploaded - handled by MainActivity.kt directly, not a
|
|
plugin (see its doc comment for why). -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.SEND"/>
|
|
<category android:name="android.intent.category.DEFAULT"/>
|
|
<data android:mimeType="*/*"/>
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.SEND_MULTIPLE"/>
|
|
<category android:name="android.intent.category.DEFAULT"/>
|
|
<data android:mimeType="*/*"/>
|
|
</intent-filter>
|
|
<!-- Lets Noo be picked as a source ("Google Photos", "Files", ...)
|
|
from another app's own file/photo picker chooser - handled by
|
|
MainActivity.kt/PickIntentService, not a plugin. A single
|
|
"*/*" filter matches any mimeType the caller requests
|
|
(image/*, video/*, or a generic file pick). -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.GET_CONTENT"/>
|
|
<category android:name="android.intent.category.DEFAULT"/>
|
|
<category android:name="android.intent.category.OPENABLE"/>
|
|
<data android:mimeType="*/*"/>
|
|
</intent-filter>
|
|
</activity>
|
|
<service
|
|
android:name=".ShareUploadService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="dataSync"/>
|
|
<!-- Hands back the file(s) a caller picked via the GET_CONTENT filter
|
|
above - only the app's own cache/picker/ subfolder is exposed,
|
|
see file_paths.xml. -->
|
|
<provider
|
|
android:name="androidx.core.content.FileProvider"
|
|
android:authorities="${applicationId}.picker.fileprovider"
|
|
android:exported="false"
|
|
android:grantUriPermissions="true">
|
|
<meta-data
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
android:resource="@xml/file_paths"/>
|
|
</provider>
|
|
<!-- Don't delete the meta-data below.
|
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
|
<meta-data
|
|
android:name="flutterEmbedding"
|
|
android:value="2" />
|
|
</application>
|
|
<!-- Required to query activities that can process text, see:
|
|
https://developer.android.com/training/package-visibility and
|
|
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
|
|
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
|
<queries>
|
|
<intent>
|
|
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
|
<data android:mimeType="text/plain"/>
|
|
</intent>
|
|
<!-- Needed so open_file can find apps to open downloaded files. -->
|
|
<intent>
|
|
<action android:name="android.intent.action.VIEW"/>
|
|
<data android:mimeType="*/*"/>
|
|
</intent>
|
|
</queries>
|
|
</manifest>
|