profile
viewpoint

maks/aosp-signapk 10

Apk/Zip signing tool pulled out of the AOSP

maks/chrome-app-npm 3

NPM as a chrome packaged app

maks/batteryalarm 2

Customisable low battery warning alert for Android phones

maks/angel-sensor-crx 1

Chrome App for the Angel Sensor device

maks/brackets-shell 1

CEF3-based application shell for Brackets. NOT READY FOR USE YET!

maks/adb-fastboot-install 0

Installs ADB & Fastboot on Linux and Mac OS X

maks/adb-on-chrome 0

ADB (Android Debug Bridge) server as a Chrome Extension

startedpshihn/rough-notation

started time in a day

startedgoldfire/howler.js

started time in 4 days

startedgohai/processing-glvideo

started time in 5 days

startedleisim/dartx

started time in 5 days

startedsbis04/video_trimmer

started time in 5 days

issue commentmaks/viper-edit

F-Droid

Hi, I hadn't planned to, but you are welcome to do so if you would like to.

JohnVeness

comment created time in 6 days

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Luke Sleeman

commit sha f30882fd7b2d2f9a1de0f061e89d87a7047ca087

Emoji tweaks and other cleanups for new screens (#324) * Updated release notes * Removed comments * Removed unncecessary : * Use red heart emoji * Update Riker scale * Fix up formatting

view details

Maksim Lin

commit sha 09035fcff0fc14120bcb05b63d82281f8a7adf1e

Merge branch 'master' into feature/staticless-settings

view details

Maksim Lin

commit sha 2eaa687781a0621cdecc7baacef03e35815f5fa8

update to new run zoned api

view details

push time in 11 days

startedFiloSottile/yubikey-agent

started time in 13 days

startedFlutterando/dartion

started time in 14 days

startedfnx-io/i69n

started time in 14 days

startedfoxanna/WWW-flutter

started time in 14 days

startedNoDiskNoFun/LinuxOnAcerCB5-311

started time in 18 days

startedrodydavis/storyboard

started time in 19 days

startedrodydavis/golden_layout

started time in 19 days

issue commentarnoldthebat/chromiumos

Completely disable nvidia gpu

Unfortunately not all laptops with nvidia dGPUs using Optimus have an option to disable the nvidia gpu in the bios, would anyone has any suggestons for that case? Perhaps something along the lines of what is mentioned in this thread on the cloudready forum? https://neverware.zendesk.com/hc/en-us/community/posts/360037962254-Solved-Turn-off-power-to-unused-Nvidia-GeForce-GT-525M-GPU-in-CloudReady

DiogoSilva48

comment created time in 21 days

startedlovell/farmhash

started time in 22 days

startedAU-COVIDSafe/mobile-android

started time in 23 days

pull request commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Add place holder for last updated time

Ok I've added to CI the timestamp as seconds after epoch, @yimingc2 you can then just easily format it as needed on Dart side. I've also added this to PR build workflow and kicked off a new PR build with this PR branch to test it out.

yimingc2

comment created time in 23 days

startedGirkovArpa/clasm

started time in 24 days

startednikersify/pico

started time in 24 days

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Add place holder for last updated time

 class InfoView extends StatelessWidget {    static Widget _buildSpacer({double height = 16}) => Container(height: height); +  Widget _buildLastUpdatedDate() {+    if (lastUpdatedTime.isEmpty) {+      return Container();+    } else {+      return Container(+        margin: const EdgeInsets.all(8.0),+        child: Text(+          'Last updated $lastUpdatedTime',

Probably want the timestamp format to include the timezone? The default unix date format is eg Fri 08 May 2020 14:49:33 AEST can we just use that?

yimingc2

comment created time in 24 days

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Maksim Lin

commit sha d97d15376ea88cce9a37e145fcb2b63e3072f9b9

update widget tests to use new DI arch

view details

Maksim Lin

commit sha 5d4a2a79a4df16fce4b7cd15d1c72353343da979

fix const lint

view details

Maksim Lin

commit sha 2a907e0fa1c77ebc8a24d63352f801d646182962

test that browser url open sends analyticsrefactor url util to allow testing to confirm that opening urlsends correct analytics event

view details

push time in 25 days

PR opened Western-Health-Covid19-Collaboration/wh_covid19_app

staticless settings

Refactors app architecture to use DI using Provider and some manual constructor injection instead of static methods.

WIP: [ ] Waiting on #312 to land. [ ] refactor Sentry usage per latest recommendations in Sentry dart package docs.

Fixes: #327

+164 -117

0 comment

13 changed files

pr created time in 25 days

issue openedWestern-Health-Covid19-Collaboration/wh_covid19_app

need to use DI for app architecture

Currently there a number of classes using static methods that make dependent classes pretty much impossible to unit test properly as its not possible to stub/mock statid methods [sic].

Need to refactor the app architecture to make use of Provider along wiht som simple manual constructor dependency injection to use DI instead.

created time in 25 days

startedpd4d10/system-monitor

started time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:shared_preferences/shared_preferences.dart';++import '../constants.dart';++/// Persistent Storage on device read/write+/// Read Settings values at app startup and set app state for these values+/// (app state continue to use Provider package), These app state values are+/// used multiple places through the code for each setting. This is approach+/// is preferred rather than read the value from persistent storage at multiple+/// places throughout the code. This minimises the reads/writes from/to+/// persistent storage as devices have slow storage speeds.++class Settings {+  static Future<bool> readDisclaimerAgreed() async {

@workerbee22 I'd it's easier, I can do implementation of this later tonight?

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:shared_preferences/shared_preferences.dart';++import '../constants.dart';++/// Persistent Storage on device read/write+/// Read Settings values at app startup and set app state for these values+/// (app state continue to use Provider package), These app state values are+/// used multiple places through the code for each setting. This is approach+/// is preferred rather than read the value from persistent storage at multiple+/// places throughout the code. This minimises the reads/writes from/to+/// persistent storage as devices have slow storage speeds.++class Settings {+  static Future<bool> readDisclaimerAgreed() async {

Mike the whole point of Provider is DI (dependency injection) so you don't use static, the fact that Provider helps with state mgmt is almost secondary concern. So for this case if you have static access to the settings class, how will you mock or stub it as a dependency in a test? If on # other hand you provide it via Provider, mocking in tests is straight forward.

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:shared_preferences/shared_preferences.dart';++import '../constants.dart';+import '../strings.dart';++/// Persistent Storage on device read/write+/// Read Settings values at app startup and set app state for these values+/// (app state continue to use Provider package), These app state values are+/// used multiple places through the code for each setting. This is approach+/// is preferred rather than read the value from persistent storage at multiple+/// places throughout the code. This minimises the reads/writes from/to

Oh complete agree on using Provider and abstracting shared prefs access 💯 on that. My feedback just on the read/write comment

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

reusable PDF widget

+import 'package:flutter/material.dart';+import 'package:native_pdf_view/native_pdf_view.dart';++import '../style.dart';++class ReusableInfographicPdf extends StatefulWidget {+  // Navigation bar title+  final String title;+  final String pdfUrl;+  final Color backgroundColor;+  final Color toolBarColor;++  const ReusableInfographicPdf({+    this.title,+    this.pdfUrl,+    this.backgroundColor,+    this.toolBarColor,+  });++  @override+  _ReusableInfographicPdfState createState() => _ReusableInfographicPdfState();+}++class _ReusableInfographicPdfState extends State<ReusableInfographicPdf> {+  int _pageNumber;+  PdfController pdfController;+  @override+  void initState() {+    pdfController = PdfController(+      document: PdfDocument.openAsset(widget.pdfUrl),+    );+    super.initState();+  }++  @override+  Widget build(BuildContext context) {+    return Scaffold(+        backgroundColor: widget.backgroundColor,+        appBar: AppBar(+          // Warning brightness interacts with SystemUiOverlayStyle+          // See system_bars.dart comments+          brightness: Brightness.light,+          backgroundColor: widget.toolBarColor,+          iconTheme: Styles.appBarIconTheme,+          title:+              Column(crossAxisAlignment: CrossAxisAlignment.start, children: [+            Text(+              widget.title,+              style: Styles.textH5,+            ),+            if (_pageNumber != null)+              Text(+                'Page $_pageNumber of ${pdfController.pagesCount}',+                style: Styles.textFooter,+              )+          ]),+          leading: IconButton(+              icon: Icon(Icons.close),+              onPressed: () => Navigator.of(context).pop(null)),+        ),+        body: Scrollbar(+            child: PdfView(+                controller: pdfController,+                scrollDirection: Axis.vertical,+                onPageChanged: (page) {+                  setState(() {+                    _pageNumber = page;+                  });+                },+                onDocumentLoaded: (_) => setState(() {+                      _pageNumber = pdfController.page;+                    }))));

Could we please have the trailing commas pls 🙏

rockgecko-development

comment created time in a month

startedmifi/editly

started time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:shared_preferences/shared_preferences.dart';++import '../constants.dart';+import '../strings.dart';++/// Persistent Storage on device read/write+/// Read Settings values at app startup and set app state for these values+/// (app state continue to use Provider package), These app state values are+/// used multiple places through the code for each setting. This is approach+/// is preferred rather than read the value from persistent storage at multiple+/// places throughout the code. This minimises the reads/writes from/to

This isn't actually correct: on Android the SharedPrefs framework code already does in-memory read and write caching so no need attempt to replicate that in Flutter side. I think iOS equivalent may also do this.

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:flutter/cupertino.dart';+import 'package:flutter/gestures.dart';+import 'package:flutter/material.dart';+import 'package:url_launcher/url_launcher.dart';++import '../hard_data.dart';+import '../strings.dart';+import '../style.dart';++class SwitchCard extends StatefulWidget {

I'm assuming this is intended to get wired up to the settings? If so once you do that if you expose the Settings via a Provider, this can become a stateless widget and the _selected state bool won't be needed.

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

 class _DisclaimerViewState extends State<DisclaimerView> {                           ' for this.',                           style: Styles.textH5,                         ),-                        Text.rich(TextSpan(children: [-                          const TextSpan(-                            text: '\n\nPlease refer to ',-                            style: Styles.textH5,-                          ),+                        Text.rich(                           TextSpan(-                              text: whCoronavirusInfoURL,-                              style: Styles.textH5Hyperlink,-                              recognizer: TapGestureRecognizer()-                                ..onTap = () {-                                  launch(whCoronavirusInfoURL);-                                }),-                          const TextSpan(-                            text:-                                ' to ensure you have the latest up-to-date information on Western Health\'s Coronavirus guidelines.\n\n',-                            style: Styles.textH5,+                            children: [+                              const TextSpan(+                                text: '\n\nPlease refer to ',+                                style: Styles.textH5,+                              ),+                              TextSpan(+                                text: whCoronavirusInfoURL,+                                style: Styles.textH5Hyperlink,+                                recognizer: TapGestureRecognizer()+                                  ..onTap = () {+                                    launch(whCoronavirusInfoURL);+                                  },+                              ),+                              const TextSpan(+                                text:+                                    ' to ensure you have the latest up-to-date information on Western Health\'s Coronavirus guidelines.\n\n',

also strings const?

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

 class _DisclaimerViewState extends State<DisclaimerView> {                           ' for this.',                           style: Styles.textH5,                         ),-                        Text.rich(TextSpan(children: [-                          const TextSpan(-                            text: '\n\nPlease refer to ',-                            style: Styles.textH5,-                          ),+                        Text.rich(                           TextSpan(-                              text: whCoronavirusInfoURL,-                              style: Styles.textH5Hyperlink,-                              recognizer: TapGestureRecognizer()-                                ..onTap = () {-                                  launch(whCoronavirusInfoURL);-                                }),-                          const TextSpan(-                            text:-                                ' to ensure you have the latest up-to-date information on Western Health\'s Coronavirus guidelines.\n\n',-                            style: Styles.textH5,+                            children: [+                              const TextSpan(+                                text: '\n\nPlease refer to ',

better to use padding/margin vs embedded newlines. also shouldn't this be in string consts?

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

 class ReusableCardBase extends StatelessWidget {     final col = Column(       mainAxisAlignment: verticalAlignment,       crossAxisAlignment: CrossAxisAlignment.start,-      mainAxisSize: MainAxisSize.min,+      //mainAxisSize: MainAxisSize.min,

needs to be deleted?

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[WIP] [Feature] Settings support and Privacy Setting

+import 'package:shared_preferences/shared_preferences.dart';++import '../constants.dart';++/// Persistent Storage on device read/write+/// Read Settings values at app startup and set app state for these values+/// (app state continue to use Provider package), These app state values are+/// used multiple places through the code for each setting. This is approach+/// is preferred rather than read the value from persistent storage at multiple+/// places throughout the code. This minimises the reads/writes from/to+/// persistent storage as devices have slow storage speeds.++class Settings {+  static Future<bool> readDisclaimerAgreed() async {

making these static is going to make it impossible to test code that uses the settings. It would be better to make these class methods and then just have a Provider at the top of the widget tree to give access to whatever parts of the app need it.

workerbee22

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[Feature] Add Resources Section

+import 'package:flutter/material.dart';++import '../models/home_card.dart';+import '../strings.dart';+import '../style.dart';+import '../widget/reusable_card.dart';++class ReferenceView extends StatelessWidget {+  final EdgeInsets _titlePadding = const EdgeInsets.fromLTRB(0, 24, 16, 0);+  final EdgeInsets _contentPadding = const EdgeInsets.fromLTRB(16, 0, 16, 16);+  final double _sectionHeight = 48;++  static const List<HomeCard> _sections = [+    HomeCard(+      title: 'Safe Airway Society',+      description: 'Guidelines and Infographics',+      route: 'https://www.safeairwaysociety.org/covid19/',+    ),+    HomeCard(+      title: 'Intensive Care Society',+      description: 'Wellbeing Guidelines',+      route: 'https://www.ics.ac.uk/ICS/Education/Wellbeing/ICS/Wellbeing'+          '.aspx',+    ),+    HomeCard(+      title: 'Australian New Zealand Intensive Care Society',+      description: 'COVID-19 Guidelines',+      route: 'https://www.anzics.com.au/coronavirus-guidelines/',+    ),+    HomeCard(+      title: 'Western Health Department of Anaesthesia',+      description: 'Policies and procedures available on the microsite',+      route: 'https://whcovid19.wixsite.com/covid19',+    ),+    HomeCard(+      title: 'Western Health Novel Coronavirus Information',+      description: 'COVID-19 Information',+      route: 'https://coronavirus.wh.org.au/',+    ),+    HomeCard(+      title: 'RNS ASCAR (Royal North Shore)',+      description: 'Cognitive Aids and Inforgraphics',+      route: 'https://www.rnsascar.com/',+    )+  ];++  @override+  Widget build(BuildContext context) {+    return Scaffold(+        backgroundColor: AppColors.appBackground,+        appBar: AppBar(+          // Warning brightness interacts with SystemUiOverlayStyle+          // See system_bars.dart comments+          brightness: Brightness.light,+          backgroundColor: AppColors.appBarBackground,+          iconTheme: Styles.appBarIconTheme,+          title: const Text(+            Strings.referencesTitle,+            style: Styles.textH5,+          ),+        ),+        body: Padding(+            padding: _contentPadding,+            child: SingleChildScrollView(+                child: Column(+                    crossAxisAlignment: CrossAxisAlignment.stretch,+                    children: [+                  Padding(+                    padding: _titlePadding,+                    child: const Text('References', style: Styles.textH4),+                  ),+                  ..._sections.map((e) =>+                      ReusableCard.fromData(card: e, height: _sectionHeight))+                ]))));

please add trailing commas for better formatting

yimingc2

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[Feature] Add Resources Section

+import 'package:flutter/material.dart';++import '../../hard_data.dart';+import '../../strings.dart';+import '../../style.dart';+import '../../widget/reusable_card.dart';++class DefinitiveView extends StatelessWidget {+  static const _cardHeight = 40.0;+  static const _cardElevation = 1.0;++  final cards = <Widget>[+    ReusableCard(+      title: Strings.informationWhCoronaTitle,+      height: _cardHeight,+      elevation: _cardElevation,+      routeTo: whCoronavirusInfoURL,+    ),+    ReusableCard(+      title: Strings.informationWhAnaestheticTitle,+      height: _cardHeight,+      elevation: _cardElevation,+      routeTo: whAnaestheticMicrositeURL,+    ),+    ReusableCard(+      title: Strings.informationWhIcuTitle,+      height: _cardHeight,+      elevation: _cardElevation,+      routeTo: whIcuMicrositeURL,+    ),+  ];++  static Widget _buildSpacer({double height = 16}) => Container(height: height);

could we name 16 as const, seems to be used in more than one place in this file

yimingc2

comment created time in a month

startedexcalidraw/excalidraw

started time in a month

startedGoogleChromeLabs/browser-nativefs

started time in a month

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Make app GDPR compliant + better inform our users about what data is gathered

Excellent job @lukesleeman ! Likewise for Sentry error reporting we are not collecting or sending any user personally identifiable information and only limited device information as can be seen here:

Screenshot from 2020-04-29 08-15-34

lukesleeman

comment created time in a month

startedawslabs/aws-lambda-dart-runtime

started time in a month

startedghuntley/COVIDSafe_1.0.11.apk

started time in a month

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Emoji alignments in Your Welfare and Cross Skilling

I'd agree, given we have great designers helping us, using actual icons would be much better

sallychung

comment created time in a month

issue commentflutter/flutter_markdown

markdown toc supported

I am buildingmy personal blog through flutter web. So it's an important function for me.

@asjqkkkk That's understandable, but it's very difficult for anyone else to know exactly what functionality you are requesting or how it should be implemented as there is nothing in the markdown or commonmark specs that document it.

asjqkkkk

comment created time in a month

issue commentflutter/flutter_markdown

markdown toc supported

As far as I'm aware neither the original Markdown spec nor Commonmark specify table of contents functionality?

asjqkkkk

comment created time in a month

startedIDerr/Goodix92

started time in a month

startedAshark/hliss

started time in a month

startedjifalops/setup_dev_machine

started time in a month

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Maksim Lin

commit sha a3ebee48d3c29372d4f3967322782e5f2a1ee4d3

add sentry error reporting (#266) Adds Sentry reporting for Flutter and Android native, refactor App widget.

view details

push time in a month

delete branch Western-Health-Covid19-Collaboration/wh_covid19_app

delete branch : feature/add-sentry-error-reporting

delete time in a month

PR merged Western-Health-Covid19-Collaboration/wh_covid19_app

Reviewers
add sentry error reporting

Add Sentry reporting for app across Flutter, native Android and iOS.

Includes refactor, renaming the App widget and moving it into its own file.

This has no impact on user visible UI or functionality.

+300 -136

1 comment

12 changed files

maks

pr closed time in a month

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Maksim Lin

commit sha dcd6c9e34afb115f3212a2721eca394db19d0d1b

fix imports

view details

push time in a month

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Bramley

commit sha 6f22181c8fc2b72278384c8aa5fe12c86722fb63

implement #45 additional resources

view details

Bramley

commit sha a924ff65018737afbaddcd5109919aa649d331d5

Simplify info view url routes

view details

Bramley

commit sha 82dd8ce24ab6e33260d9146567e43a5e674dba79

info view imports

view details

Mike Hughes

commit sha a0336c12b120efaf1f7099048497f7d29456e460

Merge pull request #271 from Western-Health-Covid19-Collaboration/feature/additionalResources implement #45 additional resources

view details

Maksim Lin

commit sha 0e740204fd5e997c865903e70a8524b955ef99af

Merge branch 'master' into feature/add-sentry-error-reporting

view details

Maksim Lin

commit sha e025937df7e9c6176c1853d629a9dd7e62e8383f

latest route from master

view details

Maksim Lin

commit sha dbb33c608a04b0c1928f1ec88e810904721efba4

remove debug comments

view details

push time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

add sentry error reporting

+import 'dart:async';++import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'intro_router.dart';-import 'routes.dart';-import 'strings.dart';-import 'style.dart';-import 'utils/firebase.dart';-import 'view/acknowledgements_view.dart';-import 'view/airway/checklist/intubation_checklist_infographic_page.dart';-import 'view/airway/checklist/intubation_checklist_page.dart';-import 'view/airway/extubation/extubation_guidance_page.dart';-import 'view/airway/extubation/extubation_infographic_page.dart';-import 'view/airway/guidance/intubation_guidance_infographic_page.dart';-import 'view/airway/guidance/intubation_guidance_page.dart';-import 'view/disclaimer_view.dart';-import 'view/home_page.dart';-import 'view/icu_non_intensivist/als_bls_guide_view.dart';-import 'view/icu_non_intensivist/daily_round/daily_round_view.dart';-import 'view/icu_non_intensivist/proning_guide_view.dart';-import 'view/icu_non_intensivist/tips_junior_staff_view.dart';-import 'view/icu_non_intensivist/ventilation/ventilation_infographic_page.dart';-import 'view/icu_non_intensivist/ventilation/ventilation_view.dart';-import 'view/info_view.dart';-import 'view/license_view.dart';-import 'view/ppe/ppe_off_guidance_method_1.dart';-import 'view/ppe/ppe_off_guidance_method_1_infographic.dart';-import 'view/ppe/ppe_off_guidance_method_2.dart';-import 'view/ppe/ppe_off_guidance_method_2_infographic.dart';-import 'view/ppe/ppe_on_guidance.dart';-import 'view/ppe/ppe_on_infographic_page.dart';-import 'view/ppe/ppe_view.dart';-import 'view/sbs_guide_view.dart';-import 'view/staff_welfare/your_welfare_view.dart';+import 'error_reporting.dart';+import 'wh_app.dart';  void main() {   // Add this, and it should be the first line in main method to ensure no crashes before runApp()-  WidgetsFlutterBinding.ensureInitialized();+  //WidgetsFlutterBinding.ensureInitialized();

Oops, I thats a mistake, I meant to put that back.

maks

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

add sentry error reporting

+### Sentry config

Ah yes I should include here that it needs to be a pre-build step Codemagic workflow script

maks

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

add sentry error reporting

+package org.whegba.wh_covid19

yep see my comment above about native Android sentry init

maks

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

add sentry error reporting

          additional functionality it is fine to subclass or reimplement          FlutterApplication and put your custom class here. -->     <application-        android:name="io.flutter.app.FlutterApplication"+        android:name=".WHApplication"

Yes, we need a custom Android App singleton class in order to do native android Sentry initialisation in its onCreate()

maks

comment created time in a month

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

add sentry error reporting

 flutter {  dependencies {     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"++    implementation 'io.sentry:sentry-android:1.7.27'

Yes we want to be able to catch errors that happen in native Android code, either in Flutter framework or plugins, which won't necessarily be reported to Dart.

maks

comment created time in a month

startedyusufnb/verify-json

started time in a month

PR opened Western-Health-Covid19-Collaboration/wh_covid19_app

Reviewers
add sentry error reporting

Add Sentry reporting for app across Flutter, native Android and iOS.

Includes refactor, renaming the App widget and moving it into its own file.

This has no impact on user visible UI or functionality.

+299 -136

0 comment

12 changed files

pr created time in 2 months

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Bramley

commit sha 4f764ac9460bd2ad3cc0dbe7cb004b66a60ab35f

redesign ventilation screen using intubation and daily round models

view details

Bramley

commit sha a4ff3f4d63d21c6a91f75cb2c44dbecfa92a0d1c

combine different ventilation model types into one list

view details

Bramley

commit sha 21b445fd27b97003d57db5ed95e012d6fd9bcb3e

tab indicator colour

view details

Bramley

commit sha 678c1a9f9a881e07441e347b8287e5d94f38fa4d

comma

view details

Bramley

commit sha edb583b38064ac41b31d627bae508ef22debf653

Merge branch 'master' into fix/issue233

view details

Bramley

commit sha 45b8d68299ba8c70c0fd7a0561d6eb8091c62399

proning screen WIP

view details

Bramley

commit sha 0f4c30371acbcdff2af8bb4d8cf658b6771c8081

ALS/BLS guide screen WIP

view details

Bramley

commit sha 3817ede1ca482a68eb1f6c5420cf46bed6e649bc

als bls hard data WIP

view details

rockgecko-development

commit sha 951f64d3bbbad85e1e535be42aefdd192d8c7d6e

remaining proning guide data Co-Authored-By: Kim <42886400+kimngyn@users.noreply.github.com>

view details

Bramley

commit sha c091157e3db3080f6e7416cded49c703e4a30a70

Merge branch 'master' into feature/crossSkilling

view details

Bramley

commit sha ad44b60fc12259f5e2d3345b7139e67c71a83f18

proning guide complete

view details

Bramley

commit sha 3f4cd25f39cf596a900fa1239a3822f11147ad9c

proning video data

view details

Mike Hughes

commit sha 573bb71a849f4995ea52cd30ecb02f27dd83d174

Merge branch 'master' into feature/crossSkilling

view details

Mike Hughes

commit sha 323a3ec629feb813bfbfdff33a4f420e2ce3cf71

Merge pull request #257 from Western-Health-Covid19-Collaboration/feature/crossSkilling Implement #43 Feature/cross skilling

view details

Bramley

commit sha 3e75845be4542928912baf211ce648bb48149b60

Implement AcknowledgementsView

view details

rockgecko-development

commit sha 6391aa0a3acc257533cdf12f4aa09f98735ce7af

style link colour

view details

Mike Hughes

commit sha aa56f19a1a013e8dec768d030b5f44599dcebc4b

Merge pull request #265 from Western-Health-Covid19-Collaboration/feature/acknowledgements Implement Acknowledgements View

view details

Maksim Lin

commit sha c01835fc8ccf6a1007855c89c3c09a67793db370

Merge branch 'master' into feature/add-sentry-error-reporting

view details

Maksim Lin

commit sha 1b5335b0abf691173bafdc43fee10b525a52cc72

add new code missed from merge with master

view details

Maksim Lin

commit sha 9ea6d439381b539dbde664345ac906f8d1a7a0d1

fix lint, disable analyze rule need to disable types of closures rule due to false positive with onerror callback

view details

push time in 2 months

startedlesnitsky/howtodothisinflutter

started time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fix #233 - ventilation design changes

 class VentilationView extends StatelessWidget {     // Analytics set screen name, stays until another screen changes it     Analytics.analyticsScreen(Constants.analyticsVentilationScreen); -    final tabs = ventilationGuide.map((e) => e.heading).toList();--    return TabViewTemplate(-      Strings.ventilationTitle,-      color: AppColors.blue50,-      tabs: tabs,-      actions: <Widget>[-        IconButton(-          icon: SvgPicture.asset(-            'assets/images/icon/SVG/icon_infographic.svg',-          ),-          onPressed: () =>-              Navigator.of(context).pushNamed(Routes.ventilationInfographic),-        )-      ],-      children: ventilationGuide-          .map((e) => VentilationGuideContainer(guideSections: e.guideList))-          .toList(),-    );+    final tabs = ventilationGuide.map((e) {+      if (e is IntubationContent) {

ah right thats tricky but I understand now.

rockgecko-development

comment created time in 2 months

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

App Publishing - Android Google Play

@workerbee22 what is still left to do?

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fix #233 - ventilation design changes

 class VentilationView extends StatelessWidget {     // Analytics set screen name, stays until another screen changes it     Analytics.analyticsScreen(Constants.analyticsVentilationScreen); -    final tabs = ventilationGuide.map((e) => e.heading).toList();--    return TabViewTemplate(-      Strings.ventilationTitle,-      color: AppColors.blue50,-      tabs: tabs,-      actions: <Widget>[-        IconButton(-          icon: SvgPicture.asset(-            'assets/images/icon/SVG/icon_infographic.svg',-          ),-          onPressed: () =>-              Navigator.of(context).pushNamed(Routes.ventilationInfographic),-        )-      ],-      children: ventilationGuide-          .map((e) => VentilationGuideContainer(guideSections: e.guideList))-          .toList(),-    );+    final tabs = ventilationGuide.map((e) {+      if (e is IntubationContent) {+        return e.heading;+      } else if (e is ICUDailyRoundSteps) {+        return e.heading;+      }+      return e.toString();+    }).toList();+    return TabViewTemplate(Strings.ventilationTitle,+        color: AppColors.blue50,+        tabs: tabs,+        indicatorColor: AppColors.blue900,+        actions: <Widget>[+          IconButton(+            icon: SvgPicture.asset(+              'assets/images/icon/SVG/icon_infographic.svg',+            ),+            onPressed: () =>+                Navigator.of(context).pushNamed(Routes.ventilationInfographic),+          )+        ],+        children: ventilationGuide.map((e) {+          if (e is IntubationContent) {+            return IntubationContentViewTemplate(+              content: e,+              color: AppColors.blue500,+            );+          } else if (e is ICUDailyRoundSteps) {+            return ICUDailyRoundStepsContainer(+                steps: e, backgroundColor: AppColors.blue500);+          } else {+            throw Exception('Unknown model ${e.runtimeType}');

:+1:

rockgecko-development

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fix #233 - ventilation design changes

 class VentilationView extends StatelessWidget {     // Analytics set screen name, stays until another screen changes it     Analytics.analyticsScreen(Constants.analyticsVentilationScreen); -    final tabs = ventilationGuide.map((e) => e.heading).toList();--    return TabViewTemplate(-      Strings.ventilationTitle,-      color: AppColors.blue50,-      tabs: tabs,-      actions: <Widget>[-        IconButton(-          icon: SvgPicture.asset(-            'assets/images/icon/SVG/icon_infographic.svg',-          ),-          onPressed: () =>-              Navigator.of(context).pushNamed(Routes.ventilationInfographic),-        )-      ],-      children: ventilationGuide-          .map((e) => VentilationGuideContainer(guideSections: e.guideList))-          .toList(),-    );+    final tabs = ventilationGuide.map((e) {+      if (e is IntubationContent) {+        return e.heading;+      } else if (e is ICUDailyRoundSteps) {+        return e.heading;+      }+      return e.toString();+    }).toList();+    return TabViewTemplate(Strings.ventilationTitle,+        color: AppColors.blue50,+        tabs: tabs,+        indicatorColor: AppColors.blue900,+        actions: <Widget>[+          IconButton(+            icon: SvgPicture.asset(+              'assets/images/icon/SVG/icon_infographic.svg',+            ),+            onPressed: () =>+                Navigator.of(context).pushNamed(Routes.ventilationInfographic),+          )+        ],+        children: ventilationGuide.map((e) {+          if (e is IntubationContent) {+            return IntubationContentViewTemplate(+              content: e,+              color: AppColors.blue500,+            );+          } else if (e is ICUDailyRoundSteps) {+            return ICUDailyRoundStepsContainer(+                steps: e, backgroundColor: AppColors.blue500);

trailing comma pls :slightly_smiling_face:

rockgecko-development

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fix #233 - ventilation design changes

 class VentilationView extends StatelessWidget {     // Analytics set screen name, stays until another screen changes it     Analytics.analyticsScreen(Constants.analyticsVentilationScreen); -    final tabs = ventilationGuide.map((e) => e.heading).toList();--    return TabViewTemplate(-      Strings.ventilationTitle,-      color: AppColors.blue50,-      tabs: tabs,-      actions: <Widget>[-        IconButton(-          icon: SvgPicture.asset(-            'assets/images/icon/SVG/icon_infographic.svg',-          ),-          onPressed: () =>-              Navigator.of(context).pushNamed(Routes.ventilationInfographic),-        )-      ],-      children: ventilationGuide-          .map((e) => VentilationGuideContainer(guideSections: e.guideList))-          .toList(),-    );+    final tabs = ventilationGuide.map((e) {+      if (e is IntubationContent) {

what does the if-else do if both branches return e.heading ?

rockgecko-development

comment created time in 2 months

issue closedWestern-Health-Covid19-Collaboration/wh_covid19_app

App Publishing - Android Google Play

Setup CI/CD integrated publishing of Release and signed builds of the app for Beta to Google Play.

closed time in 2 months

workerbee22

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

App Publishing - Android Google Play

Thanks @adamkoch yes the app is now published on Beta track :tada: Thanks for all your help!!

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

238 - Move UI config out of data layer

-// A list of two cards-import 'package:flutter/material.dart';+// import 'package:flutter/material.dart';

Doh! thanks for spotting that @domesticmouse , yes that's a plain mistake I'm the same - no leaving commented out code! Unfort this has been merged, I'll make sure to fix that in my next PR !

maks

comment created time in 2 months

startedsindresorhus/notifier-for-github

started time in 2 months

PR opened Western-Health-Covid19-Collaboration/wh_covid19_app

Reviewers
238 - Move UI config out of data layer

Refactor that removes all UI configuration from the data layer (which is currently just hardcoded in hard_data.dart)

Screenshots

There should be no visual changes to the existing app as the refactor just cleans up the app code architecture.

Fixes: #238

+82 -57

0 comment

5 changed files

pr created time in 2 months

push eventWestern-Health-Covid19-Collaboration/wh_covid19_app

Maksim Lin

commit sha 1e6bb3952872ea8e761193b0d9952d23426415ed

remove last of UI config from data layer

view details

push time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature #36 phases of pandemic screen

 import '../../strings.dart'; import '../../style.dart'; import '../../utils/firebase.dart'; import '../../utils/url_utils.dart';-import '../../widget/reusable_card.dart';+import '../../view/view_templates/tab_view_template.dart';+import '../../widget/containers/icu_daily_round_container.dart';  class YourWelfareView extends StatelessWidget {-  final card = const ReusableCard(-    title: Strings.yourWelfarePhasesTitle,-    description: '',-    color: Colors.white,-  );-   @override   Widget build(BuildContext context) {     // Analytics set screen name, stays until another screen changes it     Analytics.analyticsScreen(Constants.analyticsWelfareScreen); -    return Scaffold(-      backgroundColor: AppColors.appBackground,-      appBar: AppBar(-        // Warning brightness interacts with SystemUiOverlayStyle-        // See system_bars.dart comments-        brightness: Brightness.light,-        backgroundColor: AppColors.appBarBackground,-        iconTheme: Styles.appBarIconTheme,-        title: Text(-          Strings.yourWelfareTitle,-          style: Styles.textSemiBold.copyWith(-            color: AppColors.blackAlpha800,-          ),-        ),-        actions: <Widget>[-          IconButton(-            icon: Stack(-              children: <Widget>[-                Align(-                  alignment: Alignment.center,-                  child: Icon(Icons.call),-                ),-                Align(-                  alignment: Alignment.topRight,-                  child: Icon(-                    Icons.call_made,-                    size: 20,-                  ),-                )-              ],-            ),-            onPressed: () => UrlUtils.launchWithBrowser(whURL),-          ),-        ],-      ),-      body: ListView(-        children: <Widget>[-          Container(-            color: AppColors.grey50,-            child: Padding(-              padding: const EdgeInsets.all(16.0),-              child: Column(-                crossAxisAlignment: CrossAxisAlignment.start,-                children: <Widget>[-                  _buildSpacer(),-                  const Text(-                    "It's okay to not be okay.",-                    style: Styles.textH1,-                  ),-                  _buildSpacer(),-                  const Text(-                    'Please look after yourself.',-                    style: Styles.textH2,-                  ),-                  _buildSpacer(),-                  _buildSpacer(),-                  const Text(-                    'Basic Tips',-                    style: Styles.textH3,-                  ),-                  _buildIconTextRow(-                    const Text('🛑'),-                    'STOP, BREATHE then think',-                  ),-                  _buildIconTextRow(-                    const Text('🗞'),-                    'Limit news intake',-                  ),-                  _buildSpacer(),-                  const Text(-                    'Take Care of Basic Needs',-                    style: Styles.textH3,-                  ),-                  _buildIconTextRow(-                    const Text('🛌'),-                    'Rest',-                  ),-                  _buildIconTextRow(-                    const Text('🥦'),-                    'Eat well',-                  ),-                  _buildIconTextRow(-                    const Text('🏃‍'),-                    'Engage in physical activity',-                  ),-                  _buildIconTextRow(-                    const Text('🥰'),-                    'Stay in contact with loved ones',-                  ),-                  _buildIconTextRow(-                    const Text('🧻'),-                    'Avoid unhelpful coping strategies (Tobacco, alcohol or other drugs)',-                  ),-                  _buildIconTextRow(-                    const Text('🔋'),-                    'Consider psychological energy levels. “Fill up” after “Emptying the tank”',-                  ),-                ],+    return TabViewTemplate(+      Strings.yourWelfareTitle,+      color: AppColors.grey50,+      actions: [+        IconButton(+          icon: Stack(+            children: <Widget>[+              Align(+                alignment: Alignment.center,+                child: Icon(Icons.call),               ),-            ),-          ),-          Padding(-            padding: const EdgeInsets.all(16.0),-            child: card,-          ),-        ],-      ),-    );-  }--  Widget _buildIconTextRow(Widget icon, String text) {-    return Padding(-      padding: const EdgeInsets.symmetric(-        horizontal: 16,-        vertical: 4,-      ),-      child: Row(-        mainAxisSize: MainAxisSize.max,-        children: <Widget>[-          Padding(-            padding: const EdgeInsets.only(right: 16),-            child: icon,-          ),-          Expanded(-            child: Text(-              text,-              style: Styles.textP.copyWith(color: AppColors.blackAlpha900),-            ),+              Align(+                alignment: Alignment.topRight,+                child: Icon(+                  Icons.call_made,+                  size: 20,+                ),+              )+            ],           ),-        ],-      ),+          onPressed: () => UrlUtils.launchWithBrowser(whURL),+        ),+      ],+      tabs: yourWelfareSteps.map((s) => s.heading).toList(),+      children: yourWelfareSteps+          .map((e) => ICUDailyRoundStepsContainer(+                steps: e,+                backgroundColor: AppColors.grey500,+              ))

Please add trailing commas

rockgecko-development

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature #36 phases of pandemic screen

 class ICUDailyRoundStepSubsection { }  class ICUDailyRoundItem {-  final String icon, title;+  final String icon, title, subtitle;

Would be good to make name casing consistent with subHeading

rockgecko-development

comment created time in 2 months

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

UI classes need to be removed from data layer

Yeah sorry I should have been more clear, I don't expect this to go into the beta. I'll make a label to make that clear.

maks

comment created time in 2 months

pull request commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

So I've tested all 3 levels of crash locally on Android and iOS for the simulations. Just waiting on crash data to show up in the console ... but its been a while so will go back and check. But if the app isn't talking to Crashlytics then when you goto the Firebase console you only get the setup wizard'. So because we can see the proper Crashlytics console view the app MUST have talked to Crashlytics already.

@workerbee22 So I'd feel much better once we can actual app generated errors, especially app crashes in the console :slightly_smiling_face:
as this is exactly what I experienced previously trying and failing to use Crashlytics in a Flutter app: everything looked fine locally but nothing ever showed up in the web console...

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

+import 'dart:async';++import 'package:firebase_analytics/firebase_analytics.dart';+import 'package:firebase_analytics/observer.dart';+import 'package:firebase_crashlytics/firebase_crashlytics.dart';+import 'package:flutter/foundation.dart';++/// Analytics - Initialises and provides helper methods for Firebase Google Analytics+class Analytics {+  static FirebaseAnalytics analytics = FirebaseAnalytics();+  static FirebaseAnalyticsObserver observer =+      FirebaseAnalyticsObserver(analytics: analytics);++  Future<void> analyticsScreen(String screenName) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.setCurrentScreen(+        screenName: screenName,+      );+    }+  }++  Future<void> analyticsEvent(String event, String eventData) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.logEvent(+        name: event,+        parameters: <String, dynamic>{+          'eventData': eventData,+        },+      );+    }+  }+}++/// Crash Reporting - Initialise and provide helper methods for Crashlytics+class CrashReporting {+  void init() {+    // Set `enableInDevMode` to true to see reports while in debug mode+    // This is only to be used for confirming that reports are being+    // submitted as expected. It is not intended to be used for everyday+    // development.+    Crashlytics.instance.enableInDevMode = false;++    // Pass all uncaught errors from the Flutter framework to Crashlytics+    FlutterError.onError = Crashlytics.instance.recordFlutterError;+  }++  /// WARNING - Leave these here and commented out unless simulating errors

yes the simulation is only for local debugging and testing so if its useful to keep once this is ready for merging then yes please the simulation should be separate from the production code that does the initialisation

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 import 'view/staff_welfare/your_welfare_view.dart'; import 'view/view_templates/html_text_card_view_template.dart';  void main() {-  runApp(const MyApp());+  // Add this, and it should be the first line in main method to ensure no crashes before runApp()+  // Currently Crashlytics and SharedPreferences packages below use platform channels so need this before runApp()+  WidgetsFlutterBinding.ensureInitialized();++  // Crash Reporting configured for not reporting whilst doing Dev mode builds+  CrashReporting();

So consolidating the comment about the constructor with this one: can really just be a static function, no class needed

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 class Constants {   static const String settingDisclaimerVersion = 'disclaimer_version';   static const String settingDisclaimerAgreedDateTime =       'disclaimer_agreed_date_time';++  /// Analytics screen names avoid changing to keep analytics data constant+  /// Even if the UI screen name changes try to keep this as analytics name+  static const String analyticsHomeScreen = 'home';

Hmm, ok, I've never been a consumer of analytics so will defer to those that do :+1:

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; +import '../../../constants.dart'; import '../../../hard_data.dart'; import '../../../models/icu_daily_round_checklist.dart';+import '../../../strings.dart'; import '../../../style.dart';+import '../../../utils/firebase.dart'; import '../../../widget/containers/icu_daily_round_container.dart'; import '../../../widget/lists/checklist_card.dart'; import '../../view_templates/tab_view_template.dart';  class ICUDailyRoundView extends StatelessWidget {-  final title = 'Daily Round';

:+1:

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 import 'view/staff_welfare/your_welfare_view.dart'; import 'view/view_templates/html_text_card_view_template.dart';  void main() {-  runApp(const MyApp());+  // Add this, and it should be the first line in main method to ensure no crashes before runApp()+  // Currently Crashlytics and SharedPreferences packages below use platform channels so need this before runApp()+  WidgetsFlutterBinding.ensureInitialized();++  // Crash Reporting configured for not reporting whilst doing Dev mode builds+  CrashReporting();

it looks quite strange just calling a constructor and then not doing anything with the object itself. Since CrashReporting has no instance properties can it just be a static function?

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 import 'package:flutter/material.dart'; +import '../../../constants.dart'; import '../../../style.dart';+import '../../../utils/firebase.dart'; import '../../reusable_infographic_page.dart';  class IntubationChecklistInfographicPage extends StatelessWidget {   @override   Widget build(BuildContext context) {+    // Analytics set screen name, stays until another screen changes it

I'm not very familiar with Google analytics client, but if its already tracking route navigation events, what does this add as there are no other analytics events being tracked on this screen?

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 class IntubationChecklistPage extends StatelessWidget {    @override   Widget build(BuildContext context) {+    // Analytics set screen name, stays until another screen changes it+    Analytics().analyticsScreen(Constants.analyticsIntubationChecklistScreen);

ditto above for all the other calls to Analytics().analyticsScreen()

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

+import 'dart:async';++import 'package:firebase_analytics/firebase_analytics.dart';+import 'package:firebase_analytics/observer.dart';+import 'package:firebase_crashlytics/firebase_crashlytics.dart';+import 'package:flutter/foundation.dart';++/// Analytics - Initialises and provides helper methods for Firebase Google Analytics+class Analytics {+  static FirebaseAnalytics analytics = FirebaseAnalytics();+  static FirebaseAnalyticsObserver observer =+      FirebaseAnalyticsObserver(analytics: analytics);++  Future<void> analyticsScreen(String screenName) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.setCurrentScreen(+        screenName: screenName,+      );+    }+  }++  Future<void> analyticsEvent(String event, String eventData) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.logEvent(+        name: event,+        parameters: <String, dynamic>{+          'eventData': eventData,+        },+      );+    }+  }+}++/// Crash Reporting - Initialise and provide helper methods for Crashlytics+class CrashReporting {+  void init() {+    // Set `enableInDevMode` to true to see reports while in debug mode+    // This is only to be used for confirming that reports are being+    // submitted as expected. It is not intended to be used for everyday+    // development.+    Crashlytics.instance.enableInDevMode = false;++    // Pass all uncaught errors from the Flutter framework to Crashlytics+    FlutterError.onError = Crashlytics.instance.recordFlutterError;+  }++  /// WARNING - Leave these here and commented out unless simulating errors+  /// Retaining this code to allow future verification of crash reporting.+  //  void simulateCrashlyticsCaughtErrors() async {+  //    // Crashlytics caught errors simulation+  //    Crashlytics.instance.crash();+  //  }+  //+  //  void simulateFlutterCaughtErrors() async {+  //    // Flutter caught errors simulation+  //    throw StateError('Uncaught error thrown by app.');+  //  }+  //+  //  void simulateUncaughtErrors() async {+  //    // Uncaught errors simulation+  //    Future<void>.delayed(+  //      const Duration(seconds: 2),+  //      () {+  //        List<int> list = <int>[];+  //        print(list[100]);+  //      },+  //    );+  //  }++  CrashReporting() {

Its a bit strange to have a separate init method thats only called from the constructor, is there a reason for that?

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

 class Constants {   static const String settingDisclaimerVersion = 'disclaimer_version';   static const String settingDisclaimerAgreedDateTime =       'disclaimer_agreed_date_time';++  /// Analytics screen names avoid changing to keep analytics data constant+  /// Even if the UI screen name changes try to keep this as analytics name+  static const String analyticsHomeScreen = 'home';

can these just be the route name consts to keep things more DRY ?

workerbee22

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Feature - Firebase Analytics & Crashlytics

+import 'dart:async';++import 'package:firebase_analytics/firebase_analytics.dart';+import 'package:firebase_analytics/observer.dart';+import 'package:firebase_crashlytics/firebase_crashlytics.dart';+import 'package:flutter/foundation.dart';++/// Analytics - Initialises and provides helper methods for Firebase Google Analytics+class Analytics {+  static FirebaseAnalytics analytics = FirebaseAnalytics();+  static FirebaseAnalyticsObserver observer =+      FirebaseAnalyticsObserver(analytics: analytics);++  Future<void> analyticsScreen(String screenName) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.setCurrentScreen(+        screenName: screenName,+      );+    }+  }++  Future<void> analyticsEvent(String event, String eventData) async {+    // Only report to analytics if this is a release build+    if (kReleaseMode) {+      // Setting the Analytics data+      await analytics.logEvent(+        name: event,+        parameters: <String, dynamic>{+          'eventData': eventData,+        },+      );+    }+  }+}++/// Crash Reporting - Initialise and provide helper methods for Crashlytics+class CrashReporting {+  void init() {+    // Set `enableInDevMode` to true to see reports while in debug mode+    // This is only to be used for confirming that reports are being+    // submitted as expected. It is not intended to be used for everyday+    // development.+    Crashlytics.instance.enableInDevMode = false;++    // Pass all uncaught errors from the Flutter framework to Crashlytics+    FlutterError.onError = Crashlytics.instance.recordFlutterError;+  }++  /// WARNING - Leave these here and commented out unless simulating errors

could we at least just move this into a CrashSimlutator class please? if we want to keep code then lets make sure its not commented out so all the usual tooling works with it.

workerbee22

comment created time in 2 months

issue openedWestern-Health-Covid19-Collaboration/wh_covid19_app

UI classes need to be removed from data layer

For now hard_data.dart and the classes within it are our data layer so UI classes like ReusableCard have no business being there and needed to be refactored into separate datamodels holding the data, which is displayed by the ReusabelCard widgets

created time in 2 months

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

hash of the disclaimer text needs to be used

@workerbee22 yep that can be tracked in #237

maks

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fixed Home Page Layout

 const List<ReusableCard> staffWelfare = [     description: '3 guides',     color: Colors.white,     routeTo: Routes.ppe,+    margin: EdgeInsets.all(0.0),

@rockgecko-development yes I only noticed that after I talked about this directly with @alessandrofavero on slack and had look at code in editor vs the diffs here. So definitely this needs to be fixed, we have proper data model classes now so there should not be any Widgets in the data layer. As discusses on slack with @alessandrofavero I'm fine for this PR to go in just fixing the immediate layout tweaks and Im going to follow up with PR to fix the structural issues.

alessandrofavero

comment created time in 2 months

issue openedWestern-Health-Covid19-Collaboration/wh_covid19_app

hash of the disclaimer text needs to be used

Instead of setting a incremented integer as the value, we need to use a hash of the disclaimer text (eg sha1) as the value to be certain of the exact disclaimer text that a user has accepted.

As a bonus: if this value is then reported as a analytics event along with a unique id for the device we had an auditable way to know every user is accepting specific disclaimer text.

created time in 2 months

issue closedWestern-Health-Covid19-Collaboration/wh_covid19_app

Figure out a managed release process

At the moment everything merged to master gets rolled out to everybody signed up for testing. This is great for quickly iterating, but if we are to ship this "to production" we are going to need a more managed process for promoting a particular test build to prod.

This is for medical and ethical reasons: We need to have at least one of the WH medical staff test and approve the build before it is widely released.

We need to design some kind of process for a build being promoted. Ideally there should be some kind of button which does it, which can only be clicked by one of the medical staff - but any kind of process which involves getting a sign off by the medical staff is fine.

I'm interested in hearing from @maks and @workerbee22 about what kind of technological options our current CI and build pipeline setup can give us.

A nice have would also be to include other input in the process such as design signoff, qa signoff, etc

closed time in 2 months

lukesleeman

issue commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Figure out a managed release process

@workerbee22 I think we can consider the release process agreed on at this stage, despite waiting on Google Play approval so going to close, but feel free to reopen if there are any unresolved issues with this.

lukesleeman

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

Fixed Home Page Layout

 const List<ReusableCard> staffWelfare = [     description: '3 guides',     color: Colors.white,     routeTo: Routes.ppe,+    margin: EdgeInsets.all(0.0),

Sorry I don't think putting layout/ui into the data is a good idea. A better approach would be to give these a diff type (eg make a subclass Reuseablecard) and then in UI apply the different margins/heights based on the data type

alessandrofavero

comment created time in 2 months

Pull request review commentWestern-Health-Covid19-Collaboration/wh_covid19_app

[Feature] Build ICU Daily Round Screen

 class IntubationChecklistContainer extends StatelessWidget {           child: ListView(             children: [               Container(padding: const EdgeInsetsDirectional.only(top: 10)),-              ...renderList(),+              ...__renderList(),

just one underline in the name please :pray: :slightly_smiling_face:

yimingc2

comment created time in 2 months

more