new: custom foreground service on Android (#556)

This commit is contained in:
lollipopkit🏳️‍⚧️
2024-08-28 16:42:09 +08:00
committed by GitHub
parent 479250c207
commit 2d9dc044f9
6 changed files with 95 additions and 75 deletions

View File

@@ -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;

View File

@@ -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,
),
);
}),
),
);
}),
);
),
);
});
}
}