mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
Merge pull request #568 from lollipopkit/lollipopkit/issue564
This commit is contained in:
@@ -53,7 +53,6 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId "tech.lolli.toolbox"
|
applicationId "tech.lolli.toolbox"
|
||||||
// You can update the following values to match your application needs.
|
// 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.
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
@@ -15,7 +16,8 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:hasFragileUserData="true"
|
android:hasFragileUserData="true"
|
||||||
android:restoreAnyVersion="true">
|
android:restoreAnyVersion="true"
|
||||||
|
tools:targetApi="q">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@@ -29,12 +31,12 @@
|
|||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
to determine the Window background behind the Flutter UI. -->
|
to determine the Window background behind the Flutter UI. -->
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
android:resource="@style/NormalTheme"
|
android:resource="@style/NormalTheme"
|
||||||
/>
|
/>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
@@ -43,11 +45,6 @@
|
|||||||
android:name="flutterEmbedding"
|
android:name="flutterEmbedding"
|
||||||
android:value="2" />
|
android:value="2" />
|
||||||
|
|
||||||
<service
|
|
||||||
android:name="id.flutter.flutter_background_service.BackgroundService"
|
|
||||||
android:foregroundServiceType="dataSync"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name=".widget.HomeWidget"
|
android:name=".widget.HomeWidget"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
@@ -67,7 +64,12 @@
|
|||||||
android:resource="@xml/home_widget" />
|
android:resource="@xml/home_widget" />
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<service android:name=".KeepAliveService"/>
|
<service
|
||||||
|
android:name=".ForegroundService"
|
||||||
|
android:enabled="true"
|
||||||
|
android:foregroundServiceType="dataSync"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
<!-- Required to query activities that can process text, see:
|
<!-- Required to query activities that can process text, see:
|
||||||
https://developer.android.com/training/package-visibility?hl=en and
|
https://developer.android.com/training/package-visibility?hl=en and
|
||||||
@@ -76,8 +78,8 @@
|
|||||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
<action android:name="android.intent.action.PROCESS_TEXT" />
|
||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,11 @@
|
|||||||
package tech.lolli.toolbox
|
package tech.lolli.toolbox
|
||||||
|
|
||||||
import android.content.Intent
|
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.android.FlutterFragmentActivity
|
||||||
import io.flutter.embedding.engine.FlutterEngine
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
import io.flutter.plugin.common.MethodChannel
|
import io.flutter.plugin.common.MethodChannel
|
||||||
@@ -18,8 +23,13 @@ class MainActivity: FlutterFragmentActivity() {
|
|||||||
result.success(null)
|
result.success(null)
|
||||||
}
|
}
|
||||||
"startService" -> {
|
"startService" -> {
|
||||||
val intent = Intent(this@MainActivity, KeepAliveService::class.java)
|
reqPerm()
|
||||||
startService(intent)
|
val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
startForegroundService(serviceIntent)
|
||||||
|
} else {
|
||||||
|
startService(serviceIntent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
result.notImplemented()
|
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,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:flutter_displaymode/flutter_displaymode.dart';
|
|||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:server_box/app.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/icloud.dart';
|
||||||
import 'package:server_box/core/utils/sync/webdav.dart';
|
import 'package:server_box/core/utils/sync/webdav.dart';
|
||||||
import 'package:server_box/data/model/app/menu/server_func.dart';
|
import 'package:server_box/data/model/app/menu/server_func.dart';
|
||||||
@@ -109,6 +110,10 @@ void _doPlatformRelated() async {
|
|||||||
if (isAndroid) {
|
if (isAndroid) {
|
||||||
// try switch to highest refresh rate
|
// try switch to highest refresh rate
|
||||||
FlutterDisplayMode.setHighRefreshRate();
|
FlutterDisplayMode.setHighRefreshRate();
|
||||||
|
if (Stores.setting.bgRun.fetch()) {
|
||||||
|
Loggers.app.info('Start foreground service');
|
||||||
|
BgRunMC.startService();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final serversCount = Stores.server.box.keys.length;
|
final serversCount = Stores.server.box.keys.length;
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ class BackupPage extends StatelessWidget {
|
|||||||
trailing: ListenableBuilder(
|
trailing: ListenableBuilder(
|
||||||
listenable: webdavLoading,
|
listenable: webdavLoading,
|
||||||
builder: (_, __) {
|
builder: (_, __) {
|
||||||
if (webdavLoading.value) return SizedLoading.centerSmall;
|
if (webdavLoading.value) return SizedLoading.small;
|
||||||
|
|
||||||
return Row(
|
return Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FocusScope.of(context).unfocus();
|
FocusScope.of(context).unfocus();
|
||||||
_loading.value = SizedLoading.centerMedium;
|
_loading.value = SizedLoading.medium;
|
||||||
try {
|
try {
|
||||||
final decrypted = await Computer.shared.start(decyptPem, [key, pwd]);
|
final decrypted = await Computer.shared.start(decyptPem, [key, pwd]);
|
||||||
final pki = PrivateKeyInfo(id: name, key: decrypted);
|
final pki = PrivateKeyInfo(id: name, key: decrypted);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import 'package:dartssh2/dartssh2.dart';
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_background_service/flutter_background_service.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:server_box/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:server_box/core/utils/ssh_auth.dart';
|
import 'package:server_box/core/utils/ssh_auth.dart';
|
||||||
@@ -85,6 +84,7 @@ class SSHPageState extends State<SSHPage>
|
|||||||
_terminalController.dispose();
|
_terminalController.dispose();
|
||||||
_discontinuityTimer?.cancel();
|
_discontinuityTimer?.cancel();
|
||||||
if (!Stores.setting.generalWakeLock.fetch()) WakelockPlus.disable();
|
if (!Stores.setting.generalWakeLock.fetch()) WakelockPlus.disable();
|
||||||
|
_setupDiscontinuityTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -95,7 +95,7 @@ class SSHPageState extends State<SSHPage>
|
|||||||
2 => true,
|
2 => true,
|
||||||
_ => context.isDark,
|
_ => context.isDark,
|
||||||
};
|
};
|
||||||
_media = MediaQuery.of(context);
|
_media = context.media;
|
||||||
|
|
||||||
_terminalTheme = _isDark ? TerminalThemes.dark : TerminalThemes.light;
|
_terminalTheme = _isDark ? TerminalThemes.dark : TerminalThemes.light;
|
||||||
_terminalTheme = _terminalTheme.copyWith(selectionCursor: UIs.primaryColor);
|
_terminalTheme = _terminalTheme.copyWith(selectionCursor: UIs.primaryColor);
|
||||||
@@ -415,8 +415,6 @@ class SSHPageState extends State<SSHPage>
|
|||||||
_listen(session.stdout);
|
_listen(session.stdout);
|
||||||
_listen(session.stderr);
|
_listen(session.stderr);
|
||||||
|
|
||||||
_initService();
|
|
||||||
|
|
||||||
for (final snippet in SnippetProvider.snippets.value) {
|
for (final snippet in SnippetProvider.snippets.value) {
|
||||||
if (snippet.autoRunOn?.contains(widget.spi.id) == true) {
|
if (snippet.autoRunOn?.contains(widget.spi.id) == true) {
|
||||||
snippet.runInTerm(_terminal, widget.spi);
|
snippet.runInTerm(_terminal, widget.spi);
|
||||||
@@ -451,64 +449,43 @@ class SSHPageState extends State<SSHPage>
|
|||||||
.listen(_terminal.write);
|
.listen(_terminal.write);
|
||||||
}
|
}
|
||||||
|
|
||||||
// void _setupDiscontinuityTimer() {
|
void _setupDiscontinuityTimer() {
|
||||||
// _discontinuityTimer = Timer.periodic(
|
_discontinuityTimer = Timer.periodic(
|
||||||
// const Duration(seconds: 5),
|
const Duration(seconds: 5),
|
||||||
// (_) async {
|
(_) async {
|
||||||
// var throwTimeout = true;
|
var throwTimeout = true;
|
||||||
// Future.delayed(const Duration(seconds: 3), () {
|
Future.delayed(const Duration(seconds: 3), () {
|
||||||
// if (throwTimeout) {
|
if (throwTimeout) {
|
||||||
// _catchTimeout();
|
_catchTimeout();
|
||||||
// }
|
}
|
||||||
// });
|
});
|
||||||
// await _client?.ping();
|
await _client?.ping();
|
||||||
// throwTimeout = false;
|
throwTimeout = false;
|
||||||
// },
|
},
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// void _catchTimeout() {
|
void _catchTimeout() {
|
||||||
// _discontinuityTimer?.cancel();
|
_discontinuityTimer?.cancel();
|
||||||
// if (!mounted) return;
|
if (!mounted) return;
|
||||||
// _writeLn('\n\nConnection lost\r\n');
|
_writeLn('\n\nConnection lost\r\n');
|
||||||
// context.showRoundDialog(
|
context.showRoundDialog(
|
||||||
// title: Text(l10n.attention),
|
title: libL10n.attention,
|
||||||
// child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
|
child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
|
||||||
// barrierDismiss: false,
|
barrierDismiss: false,
|
||||||
// actions: [
|
actions: Btn.ok(
|
||||||
// TextButton(
|
onTap: () {
|
||||||
// onPressed: () {
|
if (mounted) {
|
||||||
// if (mounted) {
|
context.pop();
|
||||||
// context.pop();
|
}
|
||||||
// if (widget.pop) {
|
},
|
||||||
// context.pop();
|
).toList,
|
||||||
// }
|
);
|
||||||
// }
|
}
|
||||||
// },
|
|
||||||
// child: Text(l10n.ok),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
|
|
||||||
Future<void> _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() {
|
void _initStoredCfg() {
|
||||||
final fontFamilly = Stores.setting.fontPath.fetch().getFileName();
|
final fontFamilly = Stores.setting.fontPath.fetch().getFileName();
|
||||||
final textSize = Stores.setting.termFontSize.fetch();
|
final textSize = Stores.setting.termFontSize.fetch();
|
||||||
@@ -546,5 +523,3 @@ class SSHPageState extends State<SSHPage>
|
|||||||
if (Stores.setting.sshWakeLock.fetch()) WakelockPlus.enable();
|
if (Stores.setting.sshWakeLock.fetch()) WakelockPlus.enable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onStart(ServiceInstance service) async {}
|
|
||||||
|
|||||||
@@ -107,18 +107,18 @@ class _SSHTabPageState extends State<SSHTabPage>
|
|||||||
final idxs = _tabMap.keys
|
final idxs = _tabMap.keys
|
||||||
.map((e) => reg.firstMatch(e))
|
.map((e) => reg.firstMatch(e))
|
||||||
.map((e) => e?.group(1))
|
.map((e) => e?.group(1))
|
||||||
.where((e) => e != null);
|
.whereType<String>();
|
||||||
if (idxs.isEmpty) {
|
if (idxs.isEmpty) {
|
||||||
return _tabMap.keys.contains(spi.name) ? '${spi.name}(1)' : spi.name;
|
return _tabMap.keys.contains(spi.name) ? '${spi.name}(1)' : spi.name;
|
||||||
}
|
}
|
||||||
final biggest = idxs.reduce((a, b) => a!.length > b!.length ? a : b);
|
final biggest = idxs.reduce((a, b) => a.length > b.length ? a : b);
|
||||||
final biggestInt = int.tryParse(biggest ?? '0');
|
final biggestInt = int.tryParse(biggest);
|
||||||
if (biggestInt != null && biggestInt > 0) {
|
if (biggestInt != null && biggestInt > 0) {
|
||||||
return '${spi.name}(${biggestInt + 1})';
|
return '${spi.name}(${biggestInt + 1})';
|
||||||
}
|
}
|
||||||
return spi.name;
|
return spi.name;
|
||||||
}();
|
}();
|
||||||
final key = GlobalKey<SSHPageState>();
|
final key = Key(name);
|
||||||
_tabMap[name] = (
|
_tabMap[name] = (
|
||||||
page: SSHPage(
|
page: SSHPage(
|
||||||
// Keep it, or the Flutter will works unexpectedly
|
// Keep it, or the Flutter will works unexpectedly
|
||||||
@@ -259,11 +259,11 @@ class _AddPage extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
const viewPadding = 3.0;
|
const viewPadding = 7.0;
|
||||||
final viewWidth = context.media.size.width - 2 * viewPadding;
|
final viewWidth = context.media.size.width - 2 * viewPadding;
|
||||||
|
|
||||||
final itemCount = ServerProvider.servers.length;
|
final itemCount = ServerProvider.servers.length;
|
||||||
const itemPadding = 3.0;
|
const itemPadding = 1.0;
|
||||||
const itemWidth = 150.0;
|
const itemWidth = 150.0;
|
||||||
const itemHeight = 50.0;
|
const itemHeight = 50.0;
|
||||||
|
|
||||||
@@ -272,62 +272,55 @@ class _AddPage extends StatelessWidget {
|
|||||||
max(viewWidth ~/ (visualCrossCount * itemPadding + itemWidth), 1);
|
max(viewWidth ~/ (visualCrossCount * itemPadding + itemWidth), 1);
|
||||||
final mainCount = itemCount ~/ crossCount + 1;
|
final mainCount = itemCount ~/ crossCount + 1;
|
||||||
|
|
||||||
return Center(
|
return ServerProvider.serverOrder.listenVal((order) {
|
||||||
key: const Key('sshTabAddServer'),
|
if (order.isEmpty) {
|
||||||
child: ServerProvider.serverOrder.listenVal((order) {
|
return Center(
|
||||||
if (order.isEmpty) {
|
child: Text(libL10n.empty, textAlign: TextAlign.center),
|
||||||
return Center(
|
);
|
||||||
child: Text(libL10n.empty, textAlign: TextAlign.center),
|
}
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom grid
|
// Custom grid
|
||||||
return ListView(
|
return ListView(
|
||||||
padding: const EdgeInsets.all(viewPadding),
|
padding: const EdgeInsets.all(viewPadding),
|
||||||
children: List.generate(
|
children: List.generate(
|
||||||
mainCount,
|
mainCount,
|
||||||
(rowIndex) => Row(
|
(rowIndex) => Row(
|
||||||
children: List.generate(crossCount, (columnIndex) {
|
children: List.generate(crossCount, (columnIndex) {
|
||||||
final idx = rowIndex * crossCount + columnIndex;
|
final idx = rowIndex * crossCount + columnIndex;
|
||||||
final id = order.elementAtOrNull(idx);
|
final id = order.elementAtOrNull(idx);
|
||||||
if (id == null) return _placeholder;
|
final spi = ServerProvider.pick(id: id)?.value.spi;
|
||||||
|
if (spi == null) return _placeholder;
|
||||||
|
|
||||||
final spi = ServerProvider.pick(id: order[idx])?.value.spi;
|
return Expanded(
|
||||||
if (spi == null) return _placeholder;
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(itemPadding),
|
||||||
return Expanded(
|
child: InkWell(
|
||||||
child: Padding(
|
onTap: () => onTapInitCard(spi),
|
||||||
padding: const EdgeInsets.all(itemPadding),
|
child: Container(
|
||||||
child: CardX(
|
height: itemHeight,
|
||||||
child: InkWell(
|
alignment: Alignment.centerLeft,
|
||||||
onTap: () => onTapInitCard(spi),
|
padding: const EdgeInsets.only(left: 17, right: 7),
|
||||||
child: Container(
|
child: Row(
|
||||||
height: itemHeight,
|
children: [
|
||||||
alignment: Alignment.centerLeft,
|
Expanded(
|
||||||
padding: const EdgeInsets.only(left: 17, right: 7),
|
child: Text(
|
||||||
child: Row(
|
spi.name,
|
||||||
children: [
|
style: UIs.text18,
|
||||||
Expanded(
|
maxLines: 1,
|
||||||
child: Text(
|
overflow: TextOverflow.ellipsis,
|
||||||
spi.name,
|
),
|
||||||
style: UIs.text18,
|
|
||||||
maxLines: 1,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const Icon(Icons.chevron_right)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
const Icon(Icons.chevron_right)
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
).cardx,
|
||||||
);
|
),
|
||||||
}),
|
);
|
||||||
),
|
}),
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
}),
|
);
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ final class _SystemdPageState extends State<SystemdPage> {
|
|||||||
curve: Curves.fastEaseInToSlowEaseOut,
|
curve: Curves.fastEaseInToSlowEaseOut,
|
||||||
height: isBusy ? 30 : 0,
|
height: isBusy ? 30 : 0,
|
||||||
child: isBusy
|
child: isBusy
|
||||||
? SizedLoading.centerSmall.paddingOnly(bottom: 7)
|
? SizedLoading.small.paddingOnly(bottom: 7)
|
||||||
: const SizedBox.shrink(),
|
: const SizedBox.shrink(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <dynamic_color/dynamic_color_plugin.h>
|
#include <dynamic_color/dynamic_color_plugin.h>
|
||||||
|
#include <gtk/gtk_plugin.h>
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
#include <window_manager/window_manager_plugin.h>
|
||||||
@@ -15,6 +16,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
|
|||||||
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
|
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
|
||||||
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
|
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 =
|
g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
|
||||||
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
|
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
dynamic_color
|
dynamic_color
|
||||||
|
gtk
|
||||||
screen_retriever
|
screen_retriever
|
||||||
url_launcher_linux
|
url_launcher_linux
|
||||||
window_manager
|
window_manager
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import app_links
|
||||||
import dynamic_color
|
import dynamic_color
|
||||||
import icloud_storage
|
import icloud_storage
|
||||||
import local_auth_darwin
|
import local_auth_darwin
|
||||||
@@ -18,6 +19,7 @@ import wakelock_plus
|
|||||||
import window_manager
|
import window_manager
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
|
||||||
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
||||||
IcloudStoragePlugin.register(with: registry.registrar(forPlugin: "IcloudStoragePlugin"))
|
IcloudStoragePlugin.register(with: registry.registrar(forPlugin: "IcloudStoragePlugin"))
|
||||||
FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin"))
|
FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin"))
|
||||||
|
|||||||
172
pubspec.lock
172
pubspec.lock
@@ -30,6 +30,38 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.2"
|
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:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -438,8 +470,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "v1.0.145"
|
ref: "v1.0.149"
|
||||||
resolved-ref: "9f37be2b15c9d87887d704599f8fcc17263b8335"
|
resolved-ref: "291a7b445fcf116517cfbb6b3534f6b535e8276c"
|
||||||
url: "https://github.com/lppcg/fl_lib"
|
url: "https://github.com/lppcg/fl_lib"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
@@ -448,38 +480,6 @@ packages:
|
|||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
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:
|
flutter_displaymode:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -575,6 +575,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
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:
|
glob:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -583,6 +591,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
|
gotrue:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: gotrue
|
||||||
|
sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.8.4"
|
||||||
graphs:
|
graphs:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -591,6 +607,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.2"
|
||||||
|
gtk:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: gtk
|
||||||
|
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
highlight:
|
highlight:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -727,6 +751,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.8.0"
|
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:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1008,14 +1040,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.8"
|
version: "2.1.8"
|
||||||
pocketbase:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: pocketbase
|
|
||||||
sha256: "1d2958a3a7cb1e0050f425f179bd6557441fafcf740a79d5b8b80d6954149790"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.18.1"
|
|
||||||
pointycastle:
|
pointycastle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1032,6 +1056,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.1"
|
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:
|
pretty_qr_code:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1088,6 +1120,30 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.1"
|
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:
|
screen_retriever:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1237,6 +1293,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
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:
|
stream_channel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1261,6 +1325,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
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:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1584,6 +1664,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
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:
|
zmodem:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ dependencies:
|
|||||||
dynamic_color: ^1.6.6
|
dynamic_color: ^1.6.6
|
||||||
xml: ^6.4.2 # for parsing nvidia-smi
|
xml: ^6.4.2 # for parsing nvidia-smi
|
||||||
flutter_displaymode: ^0.6.0
|
flutter_displaymode: ^0.6.0
|
||||||
flutter_background_service: ^5.0.5
|
|
||||||
fl_chart: ^0.67.0
|
fl_chart: ^0.67.0
|
||||||
wakelock_plus: ^1.2.4
|
wakelock_plus: ^1.2.4
|
||||||
wake_on_lan: ^4.1.1+3
|
wake_on_lan: ^4.1.1+3
|
||||||
@@ -60,7 +59,7 @@ dependencies:
|
|||||||
fl_lib:
|
fl_lib:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/lppcg/fl_lib
|
url: https://github.com/lppcg/fl_lib
|
||||||
ref: v1.0.145
|
ref: v1.0.149
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
# dartssh2:
|
# dartssh2:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <app_links/app_links_plugin_c_api.h>
|
||||||
#include <dynamic_color/dynamic_color_plugin_c_api.h>
|
#include <dynamic_color/dynamic_color_plugin_c_api.h>
|
||||||
#include <local_auth_windows/local_auth_plugin.h>
|
#include <local_auth_windows/local_auth_plugin.h>
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
@@ -14,6 +15,8 @@
|
|||||||
#include <window_manager/window_manager_plugin.h>
|
#include <window_manager/window_manager_plugin.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
|
AppLinksPluginCApiRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("AppLinksPluginCApi"));
|
||||||
DynamicColorPluginCApiRegisterWithRegistrar(
|
DynamicColorPluginCApiRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
|
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
|
||||||
LocalAuthPluginRegisterWithRegistrar(
|
LocalAuthPluginRegisterWithRegistrar(
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
app_links
|
||||||
dynamic_color
|
dynamic_color
|
||||||
local_auth_windows
|
local_auth_windows
|
||||||
screen_retriever
|
screen_retriever
|
||||||
|
|||||||
Reference in New Issue
Block a user