Skip to content

Commit 68fa88a

Browse files
committed
Update checker + change version to v0.0.4
1 parent ba36987 commit 68fa88a

File tree

4 files changed

+146
-49
lines changed

4 files changed

+146
-49
lines changed

lib/main.dart

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'dart:io';
22

3+
import 'package:archive/archive.dart';
34
import 'package:corecoder_develop/screens/editor/editor.dart';
45
import 'package:corecoder_develop/screens/settings/plugins_browser.dart';
56
import 'package:corecoder_develop/util/cc_project_structure.dart';
7+
import 'package:corecoder_develop/util/plugins_manager.dart';
68
import 'package:corecoder_develop/util/theme_manager.dart';
79
import 'package:flutter/material.dart';
810
import 'package:flutter/services.dart';
@@ -12,7 +14,6 @@ import 'package:shared_preferences/shared_preferences.dart';
1214
import 'screens/homepage/homepage.dart';
1315
import 'screens/editor/editor_drawer.dart';
1416
import 'package:bitsdojo_window/bitsdojo_window.dart';
15-
1617
void main() async {
1718
runApp(const CoreCoderApp());
1819
if (CoreCoderApp.isDesktop) {
@@ -30,12 +31,16 @@ const borderColor = Color(0xFF3BBA73);
3031

3132
class CoreCoderApp extends StatefulWidget {
3233
const CoreCoderApp({Key? key}) : super(key: key);
33-
static const String version = "v0.0.3.1";
34-
static bool isDesktop = (Platform.isWindows || Platform.isLinux || Platform.isMacOS);
35-
static bool isLandscape(BuildContext context){
34+
static const String version = "v0.0.4";
35+
static bool isDesktop =
36+
(Platform.isWindows || Platform.isLinux || Platform.isMacOS);
37+
38+
static bool isLandscape(BuildContext context) {
3639
var q = MediaQuery.of(context);
37-
return q.orientation == Orientation.landscape || q.size.width > q.size.height;
40+
return q.orientation == Orientation.landscape ||
41+
q.size.width > q.size.height;
3842
}
43+
3944
@override
4045
State<StatefulWidget> createState() {
4146
return CoreCoderAppState();
@@ -81,11 +86,10 @@ class CoreCoderAppState extends State<CoreCoderApp> {
8186
// debugPrint(result as String);
8287
// });
8388
}
84-
85-
8689
}
90+
8791
static final Future<SharedPreferences> _pref =
88-
SharedPreferences.getInstance();
92+
SharedPreferences.getInstance();
8993

9094
@override
9195
Widget build(BuildContext context) {
@@ -109,33 +113,33 @@ class CoreCoderAppState extends State<CoreCoderApp> {
109113
child: Column(
110114
children: [
111115
// The title bar
112-
if(CoreCoderApp.isDesktop)
113-
WindowTitleBarBox(
114-
child: Row(children: [
115-
Expanded(
116-
child: MoveWindow(
117-
child: Row(children: [
118-
const SizedBox(
119-
width: 16.0,
120-
),
121-
Image.asset(
122-
"assets/logo.png",
123-
isAntiAlias: true,
124-
filterQuality: FilterQuality.high,
125-
width: 20,
126-
height: 20,
127-
),
128-
const SizedBox(
129-
width: 16.0,
130-
),
131-
Text(
132-
"CoreCoder:Develop ${CoreCoderApp.version}",
133-
style: Theme.of(context).textTheme.bodyText1!,
134-
)
135-
]),
136-
)),
137-
const WindowButtons()
138-
])),
116+
if (CoreCoderApp.isDesktop)
117+
WindowTitleBarBox(
118+
child: Row(children: [
119+
Expanded(
120+
child: MoveWindow(
121+
child: Row(children: [
122+
const SizedBox(
123+
width: 16.0,
124+
),
125+
Image.asset(
126+
"assets/logo.png",
127+
isAntiAlias: true,
128+
filterQuality: FilterQuality.high,
129+
width: 20,
130+
height: 20,
131+
),
132+
const SizedBox(
133+
width: 16.0,
134+
),
135+
Text(
136+
"CoreCoder:Develop ${CoreCoderApp.version}",
137+
style: Theme.of(context).textTheme.bodyText1!,
138+
)
139+
]),
140+
)),
141+
const WindowButtons()
142+
])),
139143
if (widget != null) Expanded(child: widget)
140144
],
141145
));

lib/screens/homepage/homepage.dart

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import '../../util/cc_project_structure.dart';
2020
import 'package:corecoder_develop/util/modules_manager.dart'
2121
show Module, ModulesManager, Template;
2222

23+
import 'package:github/github.dart';
24+
import 'package:http/http.dart' as http;
25+
import 'package:corecoder_develop/util/string_extensions.dart';
2326
import 'homepage_projectlist.dart';
2427

2528
/// Updates the file last modified
@@ -143,13 +146,10 @@ class _HomePageState extends State<HomePage> {
143146
),
144147
title: Text(
145148
p.name,
146-
style: const TextStyle(
147-
fontWeight: FontWeight.bold
148-
),
149+
style: const TextStyle(fontWeight: FontWeight.bold),
149150
),
150-
subtitle: Text(
151-
"Last Modified: " +
152-
Utils.getFormattedDateTime(dateTime: p.dateModified)),
151+
subtitle: Text("Last Modified: " +
152+
Utils.getFormattedDateTime(dateTime: p.dateModified)),
153153
trailing: PopupMenuButton<String>(
154154
onSelected: (String result) {
155155
switch (result) {
@@ -231,10 +231,10 @@ class _HomePageState extends State<HomePage> {
231231
value: "export",
232232
child: Text('Export Project'),
233233
),
234-
const PopupMenuItem<String>(
235-
//TODO: Implement this menu
236-
value: "remove",
237-
child: Text('Remove from list')),
234+
const PopupMenuItem<String>(
235+
//TODO: Implement this menu
236+
value: "remove",
237+
child: Text('Remove from list')),
238238
],
239239
))));
240240
// IconButton(
@@ -260,7 +260,6 @@ class _HomePageState extends State<HomePage> {
260260
}
261261

262262
Future<void> showCreateProjectDialog() async {
263-
264263
if (Platform.isAndroid) {
265264
var status = await Permission.storage.status;
266265
if (!status.isGranted) {
@@ -271,8 +270,11 @@ class _HomePageState extends State<HomePage> {
271270
await Permission.manageExternalStorage.request();
272271
}
273272
}
274-
Navigator.push(context,MaterialPageRoute<void>(
275-
builder: (BuildContext context) =>HomePageProjectCreate(refreshProjects: refreshRecentProjects)));
273+
Navigator.push(
274+
context,
275+
MaterialPageRoute<void>(
276+
builder: (BuildContext context) =>
277+
HomePageProjectCreate(refreshProjects: refreshRecentProjects)));
276278
}
277279

278280
Future loadPrefs() async {
@@ -316,6 +318,7 @@ class _HomePageState extends State<HomePage> {
316318
}
317319
}
318320
});
321+
checkForUpdate();
319322
}
320323

321324
@override
@@ -338,6 +341,49 @@ class _HomePageState extends State<HomePage> {
338341
}
339342
}
340343

344+
Future<void> checkForUpdate() async {
345+
var url = "https://github.com/Hanprogramer/corecoder_develop";
346+
var git = "Hanprogramer/corecoder_develop";
347+
var github = GitHub();
348+
try {
349+
Repository repo =
350+
await github.repositories.getRepository(RepositorySlug.full(git));
351+
352+
List<Release> releases =
353+
await github.repositories.listReleases(repo.slug()).toList();
354+
355+
if (repo.hasDownloads) {
356+
var r = releases.first;
357+
String onGithubVersion = r.name ?? "v0.0.0";
358+
var requireUpdate =
359+
CoreCoderApp.version.compareVersion(onGithubVersion);
360+
if (requireUpdate) {
361+
final snackBar = SnackBar(
362+
content: Text('An update is available! $onGithubVersion'),
363+
action: SnackBarAction(
364+
label: 'View on Github',
365+
onPressed: () {
366+
_launchInBrowser(r.htmlUrl ?? url);
367+
},
368+
),
369+
);
370+
371+
// Find the ScaffoldMessenger in the widget tree
372+
// and use it to show a SnackBar.
373+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
374+
}
375+
}
376+
} on GitHubError catch (err) {
377+
debugPrint("[Update Checker] Can't fetch update from url $url");
378+
final snackBar = SnackBar(
379+
content: Text("Can't fetch update from url $url"),
380+
);
381+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
382+
} on SocketException catch (err){
383+
debugPrint("[Update Checker] Can't connect to github");
384+
}
385+
}
386+
341387
/// Delete a folder recursively with the added indicator
342388
Future<void> deleteFolderWithIndicator(
343389
BuildContext context, List<String> paths) async {
@@ -385,7 +431,7 @@ class _HomePageState extends State<HomePage> {
385431
/// Called from ProjectList
386432
void onAddProject(String path) async {
387433
CCSolution? sln = await CCSolution.loadFromFile(path);
388-
if(sln != null){
434+
if (sln != null) {
389435
await RecentProjectsManager.instance.addSolution(path);
390436
setState(() {
391437
RecentProjectsManager.staticCommit();

lib/util/string_extensions.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'dart:math';
2+
3+
import 'package:flutter/material.dart';
4+
extension StringExt on String{
5+
/// Checks whether the version is LOWER than the provided argument
6+
/// //TODO: this is very inaccurate way to do it but kinda fast
7+
bool compareVersion(String b){
8+
var strSplitA = substring(1).split(".");
9+
var strSplitB = b.substring(1).split(".");
10+
int versionA = 0, versionB = 0;
11+
12+
// Version A as int
13+
int multiplier = 1000000;
14+
for(int i = 0; i < strSplitA.length; i++){
15+
multiplier = multiplier ~/ 10;
16+
try {
17+
versionA += int.parse(strSplitA[i]) * multiplier;
18+
}on FormatException catch (e){
19+
debugPrint(e.message);
20+
continue;
21+
}
22+
}
23+
24+
25+
// Version B as int
26+
multiplier = 1000000;
27+
for(int i = 0; i < strSplitB.length; i++){
28+
multiplier = multiplier ~/ 10;
29+
try {
30+
versionB += int.parse(strSplitB[i]) * multiplier;
31+
}on FormatException catch (e){
32+
debugPrint(e.message);
33+
continue;
34+
}
35+
}
36+
// debugPrint("versionA $versionA : $this");
37+
// debugPrint("versionB $versionB : $b");
38+
return versionA < versionB;
39+
}
40+
}

lib/util/theme_manager.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ class ThemeManager {
7272
checkboxTheme: CheckboxThemeData(
7373
checkColor: MaterialStateProperty.all(backgroundColor),
7474
fillColor: MaterialStateProperty.all(primaryColor)
75+
),
76+
snackBarTheme: SnackBarThemeData(
77+
backgroundColor: backgroundColor,
78+
actionTextColor: primaryColor,
79+
contentTextStyle: TextStyle(
80+
color: foregroundColor
81+
)
7582
)
7683
);
7784
return theme;

0 commit comments

Comments
 (0)