Compare commits

...

3 Commits

Author SHA1 Message Date
LollipopKit
7c34530821 Fix update things 2021-11-02 20:58:50 +08:00
LollipopKit
72c1901989 Add check update btn in setting 2021-11-02 20:31:44 +08:00
LollipopKit
ff76c6c539 Allow keep data on uninstalling 2021-11-02 19:49:29 +08:00
7 changed files with 96 additions and 65 deletions

View File

@@ -31,15 +31,16 @@ A new Flutter project which provide a chart view to display server status data.
</table> </table>
## Milestone ## Milestone
- [x] SSH Connect - [x] SSH connect
- [x] Server Info Store - [x] Server info store
- [x] Status Chart View - [x] Status chart view
- [x] Base64/Url En/Decode - [x] Base64/Url En/Decode
- [x] Private Key Store - [x] Private key store
- [x] Server Status Detail Page - [x] Server status detail page
- [x] Theme Switch - [x] Theme switch
- [ ] Execute Snippet - [ ] Execute snippet
- [ ] Migrate from `ssh2` to `dartssh2` - [ ] Migrate from `ssh2` to `dartssh2`
- [ ] Desktop support.
## Build ## Build
Please use `make.dart` to build. Please use `make.dart` to build.

View File

@@ -2,7 +2,10 @@
package="tech.lolli.toolbox"> package="tech.lolli.toolbox">
<application <application
android:label="ServerBox" android:label="ServerBox"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:hasFragileUserData="true"
android:restoreAnyVersion="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:launchMode="singleTop" android:launchMode="singleTop"

View File

@@ -39,8 +39,8 @@ Future<void> doUpdate(BuildContext context, {bool force = false}) async {
showSnackBarWithAction( showSnackBarWithAction(
context, context,
update.min > BuildData.build update.min > BuildData.build
? '您的版本过旧,请及时更新' ? 'Your version is too old. \nPlease update to v1.0.${update.newest}.'
: '${BuildData.name}有更新啦Ver${update.newest}\n${update.changelog}', : 'Update: v1.0.${update.newest} available. \n${update.changelog}',
'更新', 'Update',
() => openUrl(Platform.isAndroid ? update.android : update.ios)); () => openUrl(Platform.isAndroid ? update.android : update.ios));
} }

View File

@@ -2,9 +2,8 @@
class BuildData { class BuildData {
static const String name = "ToolBox"; static const String name = "ToolBox";
static const int build = 55; static const int build = 60;
static const String engine = static const String engine = "Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700\nEngine • revision d3ea636dc5\nTools • Dart 2.14.4\n";
"Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700\nEngine • revision d3ea636dc5\nTools • Dart 2.14.4\n"; static const String buildAt = "2021-11-02 20:36:41.010803";
static const String buildAt = "2021-11-02 15:32:29.280614"; static const int modifications = 2;
static const int modifications = 1;
} }

View File

@@ -1,5 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_material_color_picker/flutter_material_color_picker.dart'; import 'package:flutter_material_color_picker/flutter_material_color_picker.dart';
import 'package:provider/provider.dart';
import 'package:toolbox/core/update.dart';
import 'package:toolbox/data/provider/app.dart';
import 'package:toolbox/data/res/build_data.dart';
import 'package:toolbox/data/res/color.dart'; import 'package:toolbox/data/res/color.dart';
import 'package:toolbox/data/store/setting.dart'; import 'package:toolbox/data/store/setting.dart';
import 'package:toolbox/locator.dart'; import 'package:toolbox/locator.dart';
@@ -17,6 +21,7 @@ class _SettingPageState extends State<SettingPage> {
late int _selectedColorValue; late int _selectedColorValue;
double _intervalValue = 0; double _intervalValue = 0;
late Color priColor; late Color priColor;
static const textStyle = TextStyle(fontSize: 14);
@override @override
void didChangeDependencies() { void didChangeDependencies() {
@@ -40,56 +45,79 @@ class _SettingPageState extends State<SettingPage> {
body: ListView( body: ListView(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
children: [ children: [
RoundRectCard(_buildAppColorPreview()), _buildAppColorPreview(),
RoundRectCard( _buildUpdateInterval(),
ExpansionTile( _buildCheckUpdate()
tilePadding: EdgeInsets.zero, ].map((e) => RoundRectCard(e)).toList(),
childrenPadding: EdgeInsets.zero,
textColor: priColor,
title: const Text(
'Server status update interval',
style: TextStyle(fontSize: 14),
textAlign: TextAlign.start,
),
subtitle: const Text(
'Will take effect the next time app launches.',
style: TextStyle(color: Colors.grey),
),
trailing: Text('${_intervalValue.toInt()} s'),
children: [
Slider(
thumbColor: priColor,
activeColor: priColor.withOpacity(0.7),
min: 0,
max: 10,
value: _intervalValue,
onChanged: (newValue) {
setState(() {
_intervalValue = newValue;
});
},
onChangeEnd: (val) =>
_store.serverStatusUpdateInterval.put(val.toInt()),
label: '${_intervalValue.toInt()} seconds',
divisions: 10,
),
const SizedBox(
height: 3,
),
_intervalValue == 0.0
? const Text('You set to 0, will not update automatically.')
: const SizedBox(),
const SizedBox(
height: 13,
)
],
),
)
],
), ),
); );
} }
Widget _buildCheckUpdate() {
return Consumer<AppProvider>(builder: (_, app, __) {
String display;
if (app.newestBuild != null) {
if (app.newestBuild! > BuildData.build) {
display = 'Found: v1.0.${app.newestBuild}, click to update';
} else {
display = 'Current: v1.0.${BuildData.build}is up to date';
}
} else {
display = 'Current: v1.0.${BuildData.build}';
}
return ListTile(
contentPadding: EdgeInsets.zero,
trailing: const Icon(Icons.keyboard_arrow_right),
title: Text(display, style: textStyle,
textAlign: TextAlign.start,), onTap: () => doUpdate(context, force: true));
});
}
Widget _buildUpdateInterval() {
return ExpansionTile(
tilePadding: EdgeInsets.zero,
childrenPadding: EdgeInsets.zero,
textColor: priColor,
title: const Text(
'Server status update interval',
style: textStyle,
textAlign: TextAlign.start,
),
subtitle: const Text(
'Will take effect the next time app launches.',
style: TextStyle(color: Colors.grey),
),
trailing: Text('${_intervalValue.toInt()} s'),
children: [
Slider(
thumbColor: priColor,
activeColor: priColor.withOpacity(0.7),
min: 0,
max: 10,
value: _intervalValue,
onChanged: (newValue) {
setState(() {
_intervalValue = newValue;
});
},
onChangeEnd: (val) =>
_store.serverStatusUpdateInterval.put(val.toInt()),
label: '${_intervalValue.toInt()} seconds',
divisions: 10,
),
const SizedBox(
height: 3,
),
_intervalValue == 0.0
? const Text('You set to 0, will not update automatically.')
: const SizedBox(),
const SizedBox(
height: 13,
)
],
);
}
Widget _buildAppColorPreview() { Widget _buildAppColorPreview() {
return ExpansionTile( return ExpansionTile(
textColor: priColor, textColor: priColor,
@@ -108,7 +136,7 @@ class _SettingPageState extends State<SettingPage> {
), ),
title: const Text( title: const Text(
'App primary color', 'App primary color',
style: TextStyle(fontSize: 14), style: textStyle,
)); ));
} }

View File

@@ -10,6 +10,6 @@ class SnippetEditPage extends StatefulWidget {
class _SnippetEditPageState extends State<SnippetEditPage> { class _SnippetEditPageState extends State<SnippetEditPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container(); return Scaffold(appBar: AppBar(title: const Text('Snippet Edit'),), body: const Center(child: Text('Developing'),),);
} }
} }

View File

@@ -10,6 +10,6 @@ class SnippetListPage extends StatefulWidget {
class _SnippetListPageState extends State<SnippetListPage> { class _SnippetListPageState extends State<SnippetListPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container(); return Scaffold(appBar: AppBar(title: const Text('Snippet List'),), body: const Center(child: Text('Developing'),),);
} }
} }