@@ -20,6 +20,9 @@ import '../../util/cc_project_structure.dart';
2020import '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' ;
2326import '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 ();
0 commit comments