diff --git a/android/app/build.gradle b/android/app/build.gradle
index b556ffd2..27376a3f 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -53,7 +53,6 @@ android {
}
defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "tech.lolli.toolbox"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index feea319e..bd4fe308 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,4 +1,5 @@
-
+
@@ -15,7 +16,8 @@
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:hasFragileUserData="true"
- android:restoreAnyVersion="true">
+ android:restoreAnyVersion="true"
+ tools:targetApi="q">
+ android:name="io.flutter.embedding.android.NormalTheme"
+ android:resource="@style/NormalTheme"
+ />
-
-
+
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/tech/lolli/toolbox/ForegroundService.kt b/android/app/src/main/kotlin/tech/lolli/toolbox/ForegroundService.kt
new file mode 100644
index 00000000..ccff8c40
--- /dev/null
+++ b/android/app/src/main/kotlin/tech/lolli/toolbox/ForegroundService.kt
@@ -0,0 +1,66 @@
+package tech.lolli.toolbox
+
+import android.app.*
+import android.content.Intent
+import android.os.Build
+import android.os.IBinder
+
+class ForegroundService : Service() {
+ private val chanId = "ForegroundServiceChannel"
+
+ override fun onCreate() {
+ super.onCreate()
+ createNotificationChannel()
+ }
+
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ val notification = createNotification()
+ startForeground(1, notification)
+
+ // Exec your code here
+
+ return START_STICKY
+ }
+
+ override fun onBind(intent: Intent): IBinder? {
+ return null
+ }
+
+ private fun createNotificationChannel() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ val serviceChannel = NotificationChannel(
+ chanId,
+ chanId,
+ NotificationManager.IMPORTANCE_DEFAULT
+ )
+ val manager = getSystemService(NotificationManager::class.java)
+ manager.createNotificationChannel(serviceChannel)
+ }
+ }
+
+ private fun createNotification(): Notification {
+ val notificationIntent = Intent(this, MainActivity::class.java)
+ val pendingIntent = PendingIntent.getActivity(
+ this,
+ 0,
+ notificationIntent,
+ PendingIntent.FLAG_IMMUTABLE
+ )
+
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ Notification.Builder(this, chanId)
+ .setContentTitle("App is running")
+ .setContentText("Click to open the app")
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentIntent(pendingIntent)
+ .build()
+ } else {
+ Notification.Builder(this)
+ .setContentTitle("App is running")
+ .setContentText("Click to open the app")
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentIntent(pendingIntent)
+ .build()
+ }
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/tech/lolli/toolbox/KeepAliveService.kt b/android/app/src/main/kotlin/tech/lolli/toolbox/KeepAliveService.kt
deleted file mode 100644
index 75c1518d..00000000
--- a/android/app/src/main/kotlin/tech/lolli/toolbox/KeepAliveService.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package tech.lolli.toolbox
-
-import android.app.Service
-import android.content.Intent
-
-import android.os.IBinder
-import org.jetbrains.annotations.Nullable
-
-class KeepAliveService : Service() {
- override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- return START_STICKY
- }
-
- @Nullable
- override fun onBind(intent: Intent?): IBinder? {
- return null
- }
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt b/android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt
index 4cac19c2..9bc17d37 100644
--- a/android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt
+++ b/android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt
@@ -1,6 +1,11 @@
package tech.lolli.toolbox
import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Build
+import android.Manifest
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
@@ -18,8 +23,13 @@ class MainActivity: FlutterFragmentActivity() {
result.success(null)
}
"startService" -> {
- val intent = Intent(this@MainActivity, KeepAliveService::class.java)
- startService(intent)
+ reqPerm()
+ val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ startForegroundService(serviceIntent)
+ } else {
+ startService(serviceIntent)
+ }
}
else -> {
result.notImplemented()
@@ -28,4 +38,16 @@ class MainActivity: FlutterFragmentActivity() {
}
}
}
+
+ private fun reqPerm() {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(
+ this,
+ arrayOf(Manifest.permission.POST_NOTIFICATIONS),
+ 123,
+ )
+ }
+ }
}
diff --git a/lib/main.dart b/lib/main.dart
index fbceb053..eb0e1bbf 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -9,6 +9,7 @@ import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:logging/logging.dart';
import 'package:server_box/app.dart';
+import 'package:server_box/core/channel/bg_run.dart';
import 'package:server_box/core/utils/sync/icloud.dart';
import 'package:server_box/core/utils/sync/webdav.dart';
import 'package:server_box/data/model/app/menu/server_func.dart';
@@ -109,6 +110,10 @@ void _doPlatformRelated() async {
if (isAndroid) {
// try switch to highest refresh rate
FlutterDisplayMode.setHighRefreshRate();
+ if (Stores.setting.bgRun.fetch()) {
+ Loggers.app.info('Start foreground service');
+ BgRunMC.startService();
+ }
}
final serversCount = Stores.server.box.keys.length;
diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart
index b03a80a8..ed0bb9dd 100644
--- a/lib/view/page/backup.dart
+++ b/lib/view/page/backup.dart
@@ -156,7 +156,7 @@ class BackupPage extends StatelessWidget {
trailing: ListenableBuilder(
listenable: webdavLoading,
builder: (_, __) {
- if (webdavLoading.value) return SizedLoading.centerSmall;
+ if (webdavLoading.value) return SizedLoading.small;
return Row(
mainAxisSize: MainAxisSize.min,
diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart
index a2918085..2e31022b 100644
--- a/lib/view/page/private_key/edit.dart
+++ b/lib/view/page/private_key/edit.dart
@@ -199,7 +199,7 @@ class _PrivateKeyEditPageState extends State {
return;
}
FocusScope.of(context).unfocus();
- _loading.value = SizedLoading.centerMedium;
+ _loading.value = SizedLoading.medium;
try {
final decrypted = await Computer.shared.start(decyptPem, [key, pwd]);
final pki = PrivateKeyInfo(id: name, key: decrypted);
diff --git a/lib/view/page/ssh/page.dart b/lib/view/page/ssh/page.dart
index 9cf25aab..88b18e25 100644
--- a/lib/view/page/ssh/page.dart
+++ b/lib/view/page/ssh/page.dart
@@ -5,7 +5,6 @@ import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
-import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:provider/provider.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/core/utils/ssh_auth.dart';
@@ -85,6 +84,7 @@ class SSHPageState extends State
_terminalController.dispose();
_discontinuityTimer?.cancel();
if (!Stores.setting.generalWakeLock.fetch()) WakelockPlus.disable();
+ _setupDiscontinuityTimer();
}
@override
@@ -95,7 +95,7 @@ class SSHPageState extends State
2 => true,
_ => context.isDark,
};
- _media = MediaQuery.of(context);
+ _media = context.media;
_terminalTheme = _isDark ? TerminalThemes.dark : TerminalThemes.light;
_terminalTheme = _terminalTheme.copyWith(selectionCursor: UIs.primaryColor);
@@ -415,8 +415,6 @@ class SSHPageState extends State
_listen(session.stdout);
_listen(session.stderr);
- _initService();
-
for (final snippet in SnippetProvider.snippets.value) {
if (snippet.autoRunOn?.contains(widget.spi.id) == true) {
snippet.runInTerm(_terminal, widget.spi);
@@ -451,64 +449,43 @@ class SSHPageState extends State
.listen(_terminal.write);
}
- // void _setupDiscontinuityTimer() {
- // _discontinuityTimer = Timer.periodic(
- // const Duration(seconds: 5),
- // (_) async {
- // var throwTimeout = true;
- // Future.delayed(const Duration(seconds: 3), () {
- // if (throwTimeout) {
- // _catchTimeout();
- // }
- // });
- // await _client?.ping();
- // throwTimeout = false;
- // },
- // );
- // }
+ void _setupDiscontinuityTimer() {
+ _discontinuityTimer = Timer.periodic(
+ const Duration(seconds: 5),
+ (_) async {
+ var throwTimeout = true;
+ Future.delayed(const Duration(seconds: 3), () {
+ if (throwTimeout) {
+ _catchTimeout();
+ }
+ });
+ await _client?.ping();
+ throwTimeout = false;
+ },
+ );
+ }
- // void _catchTimeout() {
- // _discontinuityTimer?.cancel();
- // if (!mounted) return;
- // _writeLn('\n\nConnection lost\r\n');
- // context.showRoundDialog(
- // title: Text(l10n.attention),
- // child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
- // barrierDismiss: false,
- // actions: [
- // TextButton(
- // onPressed: () {
- // if (mounted) {
- // context.pop();
- // if (widget.pop) {
- // context.pop();
- // }
- // }
- // },
- // child: Text(l10n.ok),
- // ),
- // ],
- // );
- // }
+ void _catchTimeout() {
+ _discontinuityTimer?.cancel();
+ if (!mounted) return;
+ _writeLn('\n\nConnection lost\r\n');
+ context.showRoundDialog(
+ title: libL10n.attention,
+ child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
+ barrierDismiss: false,
+ actions: Btn.ok(
+ onTap: () {
+ if (mounted) {
+ context.pop();
+ }
+ },
+ ).toList,
+ );
+ }
@override
bool get wantKeepAlive => true;
- Future _initService() async {
- if (!isAndroid) return;
-
- await FlutterBackgroundService().configure(
- androidConfiguration: AndroidConfiguration(
- onStart: _onStart,
- autoStart: true,
- isForegroundMode: true,
- initialNotificationTitle: 'SSH',
- initialNotificationContent: l10n.bgRun,
- ),
- iosConfiguration: IosConfiguration(),
- );
- }
-
void _initStoredCfg() {
final fontFamilly = Stores.setting.fontPath.fetch().getFileName();
final textSize = Stores.setting.termFontSize.fetch();
@@ -546,5 +523,3 @@ class SSHPageState extends State
if (Stores.setting.sshWakeLock.fetch()) WakelockPlus.enable();
}
}
-
-Future _onStart(ServiceInstance service) async {}
diff --git a/lib/view/page/ssh/tab.dart b/lib/view/page/ssh/tab.dart
index 928b5c3b..d39484fd 100644
--- a/lib/view/page/ssh/tab.dart
+++ b/lib/view/page/ssh/tab.dart
@@ -107,18 +107,18 @@ class _SSHTabPageState extends State
final idxs = _tabMap.keys
.map((e) => reg.firstMatch(e))
.map((e) => e?.group(1))
- .where((e) => e != null);
+ .whereType();
if (idxs.isEmpty) {
return _tabMap.keys.contains(spi.name) ? '${spi.name}(1)' : spi.name;
}
- final biggest = idxs.reduce((a, b) => a!.length > b!.length ? a : b);
- final biggestInt = int.tryParse(biggest ?? '0');
+ final biggest = idxs.reduce((a, b) => a.length > b.length ? a : b);
+ final biggestInt = int.tryParse(biggest);
if (biggestInt != null && biggestInt > 0) {
return '${spi.name}(${biggestInt + 1})';
}
return spi.name;
}();
- final key = GlobalKey();
+ final key = Key(name);
_tabMap[name] = (
page: SSHPage(
// Keep it, or the Flutter will works unexpectedly
@@ -259,11 +259,11 @@ class _AddPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
- const viewPadding = 3.0;
+ const viewPadding = 7.0;
final viewWidth = context.media.size.width - 2 * viewPadding;
final itemCount = ServerProvider.servers.length;
- const itemPadding = 3.0;
+ const itemPadding = 1.0;
const itemWidth = 150.0;
const itemHeight = 50.0;
@@ -272,62 +272,55 @@ class _AddPage extends StatelessWidget {
max(viewWidth ~/ (visualCrossCount * itemPadding + itemWidth), 1);
final mainCount = itemCount ~/ crossCount + 1;
- return Center(
- key: const Key('sshTabAddServer'),
- child: ServerProvider.serverOrder.listenVal((order) {
- if (order.isEmpty) {
- return Center(
- child: Text(libL10n.empty, textAlign: TextAlign.center),
- );
- }
+ return ServerProvider.serverOrder.listenVal((order) {
+ if (order.isEmpty) {
+ return Center(
+ child: Text(libL10n.empty, textAlign: TextAlign.center),
+ );
+ }
- // Custom grid
- return ListView(
- padding: const EdgeInsets.all(viewPadding),
- children: List.generate(
- mainCount,
- (rowIndex) => Row(
- children: List.generate(crossCount, (columnIndex) {
- final idx = rowIndex * crossCount + columnIndex;
- final id = order.elementAtOrNull(idx);
- if (id == null) return _placeholder;
+ // Custom grid
+ return ListView(
+ padding: const EdgeInsets.all(viewPadding),
+ children: List.generate(
+ mainCount,
+ (rowIndex) => Row(
+ children: List.generate(crossCount, (columnIndex) {
+ final idx = rowIndex * crossCount + columnIndex;
+ final id = order.elementAtOrNull(idx);
+ final spi = ServerProvider.pick(id: id)?.value.spi;
+ if (spi == null) return _placeholder;
- final spi = ServerProvider.pick(id: order[idx])?.value.spi;
- if (spi == null) return _placeholder;
-
- return Expanded(
- child: Padding(
- padding: const EdgeInsets.all(itemPadding),
- child: CardX(
- child: InkWell(
- onTap: () => onTapInitCard(spi),
- child: Container(
- height: itemHeight,
- alignment: Alignment.centerLeft,
- padding: const EdgeInsets.only(left: 17, right: 7),
- child: Row(
- children: [
- Expanded(
- child: Text(
- spi.name,
- style: UIs.text18,
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- ),
- ),
- const Icon(Icons.chevron_right)
- ],
+ return Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(itemPadding),
+ child: InkWell(
+ onTap: () => onTapInitCard(spi),
+ child: Container(
+ height: itemHeight,
+ alignment: Alignment.centerLeft,
+ padding: const EdgeInsets.only(left: 17, right: 7),
+ child: Row(
+ children: [
+ Expanded(
+ child: Text(
+ spi.name,
+ style: UIs.text18,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ ),
),
- ),
+ const Icon(Icons.chevron_right)
+ ],
),
),
- ),
- );
- }),
- ),
+ ).cardx,
+ ),
+ );
+ }),
),
- );
- }),
- );
+ ),
+ );
+ });
}
}
diff --git a/lib/view/page/systemd.dart b/lib/view/page/systemd.dart
index 4be4af07..bf2e4938 100644
--- a/lib/view/page/systemd.dart
+++ b/lib/view/page/systemd.dart
@@ -56,7 +56,7 @@ final class _SystemdPageState extends State {
curve: Curves.fastEaseInToSlowEaseOut,
height: isBusy ? 30 : 0,
child: isBusy
- ? SizedLoading.centerSmall.paddingOnly(bottom: 7)
+ ? SizedLoading.small.paddingOnly(bottom: 7)
: const SizedBox.shrink(),
),
),
diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc
index 965f5cf6..412a5437 100644
--- a/linux/flutter/generated_plugin_registrant.cc
+++ b/linux/flutter/generated_plugin_registrant.cc
@@ -7,6 +7,7 @@
#include "generated_plugin_registrant.h"
#include
+#include
#include
#include
#include
@@ -15,6 +16,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
+ g_autoptr(FlPluginRegistrar) gtk_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin");
+ gtk_plugin_register_with_registrar(gtk_registrar);
g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake
index dacf00d7..eb9e8cbb 100644
--- a/linux/flutter/generated_plugins.cmake
+++ b/linux/flutter/generated_plugins.cmake
@@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color
+ gtk
screen_retriever
url_launcher_linux
window_manager
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
index 7a6a1957..24b84125 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -5,6 +5,7 @@
import FlutterMacOS
import Foundation
+import app_links
import dynamic_color
import icloud_storage
import local_auth_darwin
@@ -18,6 +19,7 @@ import wakelock_plus
import window_manager
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
IcloudStoragePlugin.register(with: registry.registrar(forPlugin: "IcloudStoragePlugin"))
FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin"))
diff --git a/pubspec.lock b/pubspec.lock
index 05927ae5..88852f0c 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -30,6 +30,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.2"
+ app_links:
+ dependency: transitive
+ description:
+ name: app_links
+ sha256: "50437e5916e6f56c1ca53e967cbfd6d53b3451465b41eef05ba1533bf1e1c5ea"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.3.0"
+ app_links_linux:
+ dependency: transitive
+ description:
+ name: app_links_linux
+ sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.3"
+ app_links_platform_interface:
+ dependency: transitive
+ description:
+ name: app_links_platform_interface
+ sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.2"
+ app_links_web:
+ dependency: transitive
+ description:
+ name: app_links_web
+ sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.4"
archive:
dependency: transitive
description:
@@ -438,8 +470,8 @@ packages:
dependency: "direct main"
description:
path: "."
- ref: "v1.0.145"
- resolved-ref: "9f37be2b15c9d87887d704599f8fcc17263b8335"
+ ref: "v1.0.149"
+ resolved-ref: "291a7b445fcf116517cfbb6b3534f6b535e8276c"
url: "https://github.com/lppcg/fl_lib"
source: git
version: "0.0.1"
@@ -448,38 +480,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
- flutter_background_service:
- dependency: "direct main"
- description:
- name: flutter_background_service
- sha256: "8807ed792227be05329478870b92f2df62c7af96f49763f6d62ad39d2eac6ee6"
- url: "https://pub.dev"
- source: hosted
- version: "5.0.7"
- flutter_background_service_android:
- dependency: transitive
- description:
- name: flutter_background_service_android
- sha256: fe06c4bd719b8ce8512d5724a229526155c1f54f734524b8e43f8212e98384a8
- url: "https://pub.dev"
- source: hosted
- version: "6.2.4"
- flutter_background_service_ios:
- dependency: transitive
- description:
- name: flutter_background_service_ios
- sha256: "45c8aca1e8850e5c45822152b06d5806aba9470517dcd2c291fce8ef99a44d60"
- url: "https://pub.dev"
- source: hosted
- version: "5.0.2"
- flutter_background_service_platform_interface:
- dependency: transitive
- description:
- name: flutter_background_service_platform_interface
- sha256: "91dd3391c213e37094fbc3fb7f34319b99ea9df76036a5c054d6371be843b0ae"
- url: "https://pub.dev"
- source: hosted
- version: "5.1.1"
flutter_displaymode:
dependency: "direct main"
description:
@@ -575,6 +575,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.0"
+ functions_client:
+ dependency: transitive
+ description:
+ name: functions_client
+ sha256: e63f49cd3b41727f47b3bde284a11a4ac62839e0604f64077d4257487510e484
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
glob:
dependency: transitive
description:
@@ -583,6 +591,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.2"
+ gotrue:
+ dependency: transitive
+ description:
+ name: gotrue
+ sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.8.4"
graphs:
dependency: transitive
description:
@@ -591,6 +607,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.2"
+ gtk:
+ dependency: transitive
+ description:
+ name: gtk
+ sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
highlight:
dependency: "direct main"
description:
@@ -727,6 +751,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.8.0"
+ jwt_decode:
+ dependency: transitive
+ description:
+ name: jwt_decode
+ sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.3.1"
leak_tracker:
dependency: transitive
description:
@@ -1008,14 +1040,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
- pocketbase:
- dependency: transitive
- description:
- name: pocketbase
- sha256: "1d2958a3a7cb1e0050f425f179bd6557441fafcf740a79d5b8b80d6954149790"
- url: "https://pub.dev"
- source: hosted
- version: "0.18.1"
pointycastle:
dependency: transitive
description:
@@ -1032,6 +1056,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.1"
+ postgrest:
+ dependency: transitive
+ description:
+ name: postgrest
+ sha256: c4197238601c7c3103b03a4bb77f2050b17d0064bf8b968309421abdebbb7f0e
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
pretty_qr_code:
dependency: transitive
description:
@@ -1088,6 +1120,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.2.1"
+ realtime_client:
+ dependency: transitive
+ description:
+ name: realtime_client
+ sha256: d897a65ee3b1b5ddc1cf606f0b83792262d38fd5679c2df7e38da29c977513da
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ retry:
+ dependency: transitive
+ description:
+ name: retry
+ sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ rxdart:
+ dependency: transitive
+ description:
+ name: rxdart
+ sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.28.0"
screen_retriever:
dependency: transitive
description:
@@ -1237,6 +1293,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.11.1"
+ storage_client:
+ dependency: transitive
+ description:
+ name: storage_client
+ sha256: "28c147c805304dbc2b762becd1fc26ee0cb621ace3732b9ae61ef979aab8b367"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.3"
stream_channel:
dependency: transitive
description:
@@ -1261,6 +1325,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
+ supabase:
+ dependency: transitive
+ description:
+ name: supabase
+ sha256: "4ed1cf3298f39865c05b2d8557f92eb131a9b9af70e32e218672a0afce01a6bc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.0"
+ supabase_flutter:
+ dependency: transitive
+ description:
+ name: supabase_flutter
+ sha256: ff6ba3048fd47d831fdc0027d3efb99346d99b95becfcb406562454bd9b229c5
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.0"
term_glyph:
dependency: transitive
description:
@@ -1584,6 +1664,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.2"
+ yet_another_json_isolate:
+ dependency: transitive
+ description:
+ name: yet_another_json_isolate
+ sha256: "47ed3900e6b0e4dfe378811a4402e85b7fc126a7daa94f840fef65ea9c8e46f4"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.2"
zmodem:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index b2b86944..a8aec451 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -22,7 +22,6 @@ dependencies:
dynamic_color: ^1.6.6
xml: ^6.4.2 # for parsing nvidia-smi
flutter_displaymode: ^0.6.0
- flutter_background_service: ^5.0.5
fl_chart: ^0.67.0
wakelock_plus: ^1.2.4
wake_on_lan: ^4.1.1+3
@@ -60,7 +59,7 @@ dependencies:
fl_lib:
git:
url: https://github.com/lppcg/fl_lib
- ref: v1.0.145
+ ref: v1.0.149
dependency_overrides:
# dartssh2:
diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc
index b29d6496..1adfc297 100644
--- a/windows/flutter/generated_plugin_registrant.cc
+++ b/windows/flutter/generated_plugin_registrant.cc
@@ -6,6 +6,7 @@
#include "generated_plugin_registrant.h"
+#include
#include
#include
#include
@@ -14,6 +15,8 @@
#include
void RegisterPlugins(flutter::PluginRegistry* registry) {
+ AppLinksPluginCApiRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("AppLinksPluginCApi"));
DynamicColorPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
LocalAuthPluginRegisterWithRegistrar(
diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake
index 16e54273..89509209 100644
--- a/windows/flutter/generated_plugins.cmake
+++ b/windows/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
+ app_links
dynamic_color
local_auth_windows
screen_retriever