Import dosent work for android for some reason

help me pls
also some issue with deb package
fuck me
This commit is contained in:
dan63047 2023-06-30 01:41:11 +03:00
parent 1ef8474bb5
commit 52f1732723
15 changed files with 252 additions and 13 deletions

14
debian/debian.yaml vendored Normal file
View File

@ -0,0 +1,14 @@
flutter_app:
command: tetra_stats
arch: x64
parent: /usr/local/lib
control:
Package: tetra-stats
Version: 0.2.0
Architecture: amd64
Essential: no
Priority: optional
Depends:
Maintainer: dan63047
Description: Track your and other player stats in TETR.IO

9
debian/gui/tetra-stats.desktop vendored Normal file
View File

@ -0,0 +1,9 @@
[Desktop Entry]
Version=0.2.0
Name=Tetra Stats
GenericName=Tetra Stats
Comment=Track your and other player stats in TETR.IO
Terminal=false
Type=Application
Categories=Utility
Keywords=TETR.IO;tetrio;stats;

BIN
debian/gui/tetra-stats.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

View File

@ -16,6 +16,6 @@ void main() {
routes: {"/settings": (context) => const SettingsView(), "/states": (context) => const TrackedPlayersView(), "/calc": (context) => const CalcView()}, routes: {"/settings": (context) => const SettingsView(), "/states": (context) => const TrackedPlayersView(), "/calc": (context) => const CalcView()},
theme: ThemeData( theme: ThemeData(
fontFamily: 'Eurostile Round', fontFamily: 'Eurostile Round',
colorScheme: const ColorScheme.dark(primary: Colors.cyanAccent, secondary: Colors.purpleAccent), colorScheme: const ColorScheme.dark(primary: Colors.cyanAccent, secondary: Colors.white),
scaffoldBackgroundColor: Colors.black))); scaffoldBackgroundColor: Colors.black)));
} }

View File

@ -54,8 +54,12 @@ class CompareState extends State<CompareView> {
redSideStates!.add(DropdownMenuItem<TetrioPlayer>( redSideStates!.add(DropdownMenuItem<TetrioPlayer>(
value: state, child: Text(dateFormat.format(state.state)))); value: state, child: Text(dateFormat.format(state.state))));
} }
redSideStates!.add(DropdownMenuItem<TetrioPlayer>( redSideStates!.firstWhere((element) => element.value == theRedSide, orElse: () {
redSideStates!.add(DropdownMenuItem<TetrioPlayer>(
value: theRedSide!, child: const Text("Most recent one"))); value: theRedSide!, child: const Text("Most recent one")));
return DropdownMenuItem<TetrioPlayer>(
value: theRedSide!, child: const Text("Most recent one"));
},);
}on Exception { }on Exception {
states = []; states = [];
redSideStates = null; redSideStates = null;
@ -78,13 +82,17 @@ class CompareState extends State<CompareView> {
greenSideStates = null; greenSideStates = null;
try{ try{
states = await teto.getPlayer(theGreenSide!.userId); states = await teto.getPlayer(theGreenSide!.userId);
greenSideStates = <DropdownMenuItem<TetrioPlayer>>[]; greenSideStates = <DropdownMenuItem<TetrioPlayer>>[];
for (final TetrioPlayer state in states) { for (final TetrioPlayer state in states) {
greenSideStates!.add(DropdownMenuItem<TetrioPlayer>( greenSideStates!.add(DropdownMenuItem<TetrioPlayer>(
value: state, child: Text(dateFormat.format(state.state)))); value: state, child: Text(dateFormat.format(state.state))));
} }
greenSideStates!.add(DropdownMenuItem<TetrioPlayer>( greenSideStates!.firstWhere((element) => element.value == theGreenSide, orElse: () {
greenSideStates!.add(DropdownMenuItem<TetrioPlayer>(
value: theGreenSide!, child: const Text("Most recent one"))); value: theGreenSide!, child: const Text("Most recent one")));
return DropdownMenuItem<TetrioPlayer>(
value: theGreenSide!, child: const Text("Most recent one"));
},);
}on Exception { }on Exception {
states = []; states = [];
greenSideStates = null; greenSideStates = null;

View File

@ -118,17 +118,22 @@ class _MainState extends State<MainView> with SingleTickerProviderStateMixin {
List<TetraLeagueAlphaRecord> tlMatches = []; List<TetraLeagueAlphaRecord> tlMatches = [];
bool isTracking = await teto.isPlayerTracking(me.userId); bool isTracking = await teto.isPlayerTracking(me.userId);
List<TetrioPlayer> states = []; List<TetrioPlayer> states = [];
TetraLeagueAlpha? compareWith = null; TetraLeagueAlpha? compareWith;
var uniqueTL = Set(); var uniqueTL = <dynamic>{};
if (isTracking){ if (isTracking){
teto.storeState(me); teto.storeState(me);
teto.saveTLMatchesFromStream(await teto.getTLStream(me.userId)); teto.saveTLMatchesFromStream(await teto.getTLStream(me.userId));
states.addAll(await teto.getPlayer(me.userId)); states.addAll(await teto.getPlayer(me.userId));
states.forEach((element) { for (var element in states) {
if (uniqueTL.isNotEmpty && uniqueTL.last != element.tlSeason1) uniqueTL.add(element.tlSeason1); if (uniqueTL.isNotEmpty && uniqueTL.last != element.tlSeason1) uniqueTL.add(element.tlSeason1);
if (uniqueTL.isEmpty) uniqueTL.add(element.tlSeason1); if (uniqueTL.isEmpty) uniqueTL.add(element.tlSeason1);
}); }
compareWith = uniqueTL.toList()[uniqueTL.length - 2]; try{
compareWith = uniqueTL.toList()[uniqueTL.length - 2];
}on RangeError {
compareWith = null;
}
chartsData = <DropdownMenuItem<List<FlSpot>>>[ chartsData = <DropdownMenuItem<List<FlSpot>>>[
DropdownMenuItem(value: [for (var tl in uniqueTL) if (tl.gamesPlayed > 9) FlSpot(tl.timestamp.millisecondsSinceEpoch.toDouble(), tl.rating)], child: const Text("Tetra Rating")), DropdownMenuItem(value: [for (var tl in uniqueTL) if (tl.gamesPlayed > 9) FlSpot(tl.timestamp.millisecondsSinceEpoch.toDouble(), tl.rating)], child: const Text("Tetra Rating")),
DropdownMenuItem(value: [for (var tl in uniqueTL) if (tl.gamesPlayed > 9) FlSpot(tl.timestamp.millisecondsSinceEpoch.toDouble(), tl.glicko!)], child: const Text("Glicko")), DropdownMenuItem(value: [for (var tl in uniqueTL) if (tl.gamesPlayed > 9) FlSpot(tl.timestamp.millisecondsSinceEpoch.toDouble(), tl.glicko!)], child: const Text("Glicko")),

View File

@ -1,5 +1,9 @@
import 'dart:io';
import 'package:file_selector/file_selector.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:tetra_stats/services/crud_exceptions.dart'; import 'package:tetra_stats/services/crud_exceptions.dart';
import 'package:tetra_stats/services/tetrio_crud.dart'; import 'package:tetra_stats/services/tetrio_crud.dart';
@ -12,7 +16,11 @@ class SettingsView extends StatefulWidget {
} }
class SettingsState extends State<SettingsView> { class SettingsState extends State<SettingsView> {
PackageInfo _packageInfo = PackageInfo(appName: "TetraStats", packageName: "idk man", version: "some numbers", buildNumber: "anotherNumber"); PackageInfo _packageInfo = PackageInfo(
appName: "TetraStats",
packageName: "idk man",
version: "some numbers",
buildNumber: "anotherNumber");
late SharedPreferences prefs; late SharedPreferences prefs;
final TetrioService teto = TetrioService(); final TetrioService teto = TetrioService();
String defaultNickname = "Checking..."; String defaultNickname = "Checking...";
@ -67,8 +75,108 @@ class SettingsState extends State<SettingsView> {
children: [ children: [
ListTile( ListTile(
title: const Text("Export local database"), title: const Text("Export local database"),
subtitle: const Text("It contains states and Tetra League records of the tracked players and list of tracked players."), subtitle: const Text(
onTap: (){}, "It contains states and Tetra League records of the tracked players and list of tracked players."),
onTap: () {
if (Platform.isLinux || Platform.isWindows) {
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text("Desktop export",
style: TextStyle(
fontFamily: "Eurostile Round Extended")),
content: const SingleChildScrollView(
child: ListBody(children: [
Text(
"It seems like you using this app on desktop. Check your documents folder, you should find \"TetraStats.db\". Copy it somewhere")
]),
),
actions: <Widget>[
TextButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
));
}
if (Platform.isAndroid){
var downloadFolder = Directory("/storage/emulated/0/Download");
File exportedDB = File("${downloadFolder.path}/TetraStats.db");
getApplicationDocumentsDirectory().then((value) {
exportedDB.writeAsBytes(File("${value.path}/TetraStats.db").readAsBytesSync());
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text("Android export",
style: TextStyle(
fontFamily: "Eurostile Round Extended")),
content: SingleChildScrollView(
child: ListBody(children: [Text("Exported.\n$exportedDB")]),
),
actions: <Widget>[
TextButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
));
});
}
},
),
ListTile(
title: const Text("Import local database"),
subtitle: const Text("Restore your backup. Notice that already stored database will be overwritten."),
onTap: () {
if(Platform.isAndroid){
FilePicker.platform.pickFiles(
type: FileType.any,
).then((value){
if (value != null){
var newDB = value.paths[0]!;
teto.close().then((value){
if(!newDB.endsWith("db")){
return ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Wrong file type")));
}
getApplicationDocumentsDirectory().then((value){
var oldDB = File("${value.path}/TetraStats.db");
oldDB.writeAsBytes(File(newDB).readAsBytesSync(), flush: true).then((value){
teto.open();
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Import successful")));
});
});
});
} else {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Operation was cancelled")));
}
});
}else{
const XTypeGroup typeGroup = XTypeGroup(
label: 'Tetra Stats Database',
extensions: <String>['db'],
);
openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]).then((value){
if (value != null){
var newDB = value.path;
teto.close().then((value){
getApplicationDocumentsDirectory().then((value){
var oldDB = File("${value.path}/TetraStats.db");
oldDB.writeAsBytes(File(newDB).readAsBytesSync()).then((value){
teto.open();
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Import successful")));
});
});
});
} else {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Operation was cancelled")));
}
});
}
},
), ),
ListTile( ListTile(
title: const Text("Your TETR.IO account"), title: const Text("Your TETR.IO account"),
@ -76,7 +184,9 @@ class SettingsState extends State<SettingsView> {
onTap: () => showDialog( onTap: () => showDialog(
context: context, context: context,
builder: (BuildContext context) => AlertDialog( builder: (BuildContext context) => AlertDialog(
title: const Text("Your TETR.IO account nickname or ID", style: TextStyle(fontFamily: "Eurostile Round Extended")), title: const Text("Your TETR.IO account nickname or ID",
style: TextStyle(
fontFamily: "Eurostile Round Extended")),
content: SingleChildScrollView( content: SingleChildScrollView(
child: ListBody(children: [ child: ListBody(children: [
const Text( const Text(

View File

@ -6,9 +6,13 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h> #include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin");
sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);

View File

@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
sqlite3_flutter_libs sqlite3_flutter_libs
) )

View File

@ -5,6 +5,7 @@
import FlutterMacOS import FlutterMacOS
import Foundation import Foundation
import file_selector_macos
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import shared_preferences_foundation import shared_preferences_foundation
@ -12,6 +13,7 @@ import sqflite
import sqlite3_flutter_libs import sqlite3_flutter_libs
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))

View File

@ -81,6 +81,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
url: "https://pub.dev"
source: hosted
version: "0.3.3+4"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@ -129,6 +137,70 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.4" version: "6.1.4"
file_picker:
dependency: "direct main"
description:
name: file_picker
sha256: b1729fc96627dd44012d0a901558177418818d6bd428df59dcfeb594e5f66432
url: "https://pub.dev"
source: hosted
version: "5.3.2"
file_selector:
dependency: "direct main"
description:
name: file_selector
sha256: "2b9acc3587127132da2a8d88d069172c49e32f977211cdf8f61f4b8e68e2a165"
url: "https://pub.dev"
source: hosted
version: "0.9.4"
file_selector_ios:
dependency: transitive
description:
name: file_selector_ios
sha256: "54542b6b35e3ced6246df5fae13cf0b879d14669d0fdff1a53a098f16e23328b"
url: "https://pub.dev"
source: hosted
version: "0.5.1+4"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046"
url: "https://pub.dev"
source: hosted
version: "0.9.2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "7a6f1ae6107265664f3f7f89a66074882c4d506aef1441c9af313c1f7e6f41ce"
url: "https://pub.dev"
source: hosted
version: "0.9.3"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c"
url: "https://pub.dev"
source: hosted
version: "2.6.0"
file_selector_web:
dependency: transitive
description:
name: file_selector_web
sha256: a890ca514f053e976ad7632cd1e665e2c4543d5acd82ec352a8d5709c55d6363
url: "https://pub.dev"
source: hosted
version: "0.9.1"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26"
url: "https://pub.dev"
source: hosted
version: "0.9.3"
fl_chart: fl_chart:
dependency: "direct main" dependency: "direct main"
description: description:
@ -158,6 +230,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360"
url: "https://pub.dev"
source: hosted
version: "2.0.15"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter

View File

@ -41,6 +41,8 @@ dependencies:
shared_preferences: ^2.1.1 shared_preferences: ^2.1.1
intl: ^0.18.1 intl: ^0.18.1
syncfusion_flutter_gauges: ^22.1.34 syncfusion_flutter_gauges: ^22.1.34
file_selector: ^0.9.4
file_picker: ^5.3.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

View File

@ -6,9 +6,12 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_windows/file_selector_windows.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h> #include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
Sqlite3FlutterLibsPluginRegisterWithRegistrar( Sqlite3FlutterLibsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
} }

View File

@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_windows
sqlite3_flutter_libs sqlite3_flutter_libs
) )