From 3fa10799e8faf4029bc7a4fb8d733a7fbf1fd294 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Wed, 30 Aug 2023 20:06:18 -0400 Subject: [PATCH 01/33] background timer --- lib/start_workout/workout.dart | 503 +++++++++--------- macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 232 ++++++-- pubspec.yaml | 15 +- 4 files changed, 476 insertions(+), 280 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 7322853a..48d92987 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -3,9 +3,9 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; -import 'package:timer_count_down/timer_controller.dart'; +import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; -import 'package:count_down_sound/timer_count_down.dart'; +import 'package:background_timer/background_timer.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -172,113 +172,113 @@ class CountDownTimerState extends State }); } - Widget timerScreen( - currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { - return Visibility( - visible: currentInterval == currentVisibleInterval ? true : false, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (pausePlayIcon == Icons.pause) { - _workoutController.pause(); - setState(() { - pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.start(); - setState(() { - pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, pausePlayIcon), - color: Colors.white), - ], - )), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - child: Text( - timerScreenText(currentVisibleInterval, exercises), - // intervals < exercises.length ? exercises[intervals] : "", - style: const TextStyle(fontSize: 35, color: Colors.white), - )), - Countdown( - controller: _workoutController, - seconds: seconds, - build: (_, int time) => Text( - time.toString(), - style: const TextStyle(fontSize: 205, color: Colors.white), - ), - interval: const Duration(milliseconds: 100), - endSound: endSound, - halfwaySound: workoutArgument.halfwaySound, - countdownSound: workoutArgument.countdownSound, - halfwayMark: (currentInterval == "workout") ? true : false, - onFinished: () async { - if (currentInterval == "start") { - startOnFinished(); - } else if (currentInterval == "workout") { - workoutOnFinished(workoutArgument, exercises); - } else if (currentInterval == "rest") { - restOnFinished(workoutArgument); - } - }, - ), - Expanded( - child: Container( - color: Color.fromARGB(22, 0, 0, 0), - child: AnimatedList( - key: _listKey, - initialItemCount: intervalInfo.length, - itemBuilder: (context, index, animation) { - return CardItemAnimated( - animation: animation, - item: intervalInfo[index], - fontColor: index == 0 - ? Colors.white - : Color.fromARGB(153, 255, 255, 255), - fontWeight: - index == 0 ? FontWeight.bold : FontWeight.normal, - ); - // return slideIt(context, index, animation); - }, - ), - ), - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItem( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255)); - // // return slideIt(context, index, animation); - // }, - // ), - // )), - ) - ], - ), - ); - } + // Widget timerScreen( + // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { + // return Visibility( + // visible: currentInterval == currentVisibleInterval ? true : false, + // child: Column( + // children: [ + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + // child: Row( + // children: [ + // IconButton( + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(size: 50.0, Icons.arrow_back), + // color: Colors.white), + // const Spacer(), + // IconButton( + // onPressed: () { + // if (pausePlayIcon == Icons.pause) { + // _workoutController.pause(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // } else { + // _workoutController.start(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // } + // }, + // icon: Icon(size: 50.0, pausePlayIcon), + // color: Colors.white), + // ], + // )), + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), + // child: Text( + // timerScreenText(currentVisibleInterval, exercises), + // // intervals < exercises.length ? exercises[intervals] : "", + // style: const TextStyle(fontSize: 35, color: Colors.white), + // )), + // Countdown( + // controller: _workoutController, + // seconds: seconds, + // build: (_, int time) => Text( + // time.toString(), + // style: const TextStyle(fontSize: 205, color: Colors.white), + // ), + // interval: const Duration(milliseconds: 100), + // endSound: endSound, + // halfwaySound: workoutArgument.halfwaySound, + // countdownSound: workoutArgument.countdownSound, + // halfwayMark: (currentInterval == "workout") ? true : false, + // onFinished: () async { + // if (currentInterval == "start") { + // startOnFinished(); + // } else if (currentInterval == "workout") { + // workoutOnFinished(workoutArgument, exercises); + // } else if (currentInterval == "rest") { + // restOnFinished(workoutArgument); + // } + // }, + // ), + // Expanded( + // child: Container( + // color: Color.fromARGB(22, 0, 0, 0), + // child: AnimatedList( + // key: _listKey, + // initialItemCount: intervalInfo.length, + // itemBuilder: (context, index, animation) { + // return CardItemAnimated( + // animation: animation, + // item: intervalInfo[index], + // fontColor: index == 0 + // ? Colors.white + // : Color.fromARGB(153, 255, 255, 255), + // fontWeight: + // index == 0 ? FontWeight.bold : FontWeight.normal, + // ); + // // return slideIt(context, index, animation); + // }, + // ), + // ), + // // child: Container( + // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, + // // child: AnimatedList( + // // key: _listKey, + // // initialItemCount: intervalInfo.length, + // // itemBuilder: (context, index, animation) { + // // return CardItem( + // // animation: animation, + // // item: intervalInfo[index], + // // fontColor: index == 0 + // // ? Colors.white + // // : Color.fromARGB(153, 255, 255, 255)); + // // // return slideIt(context, index, animation); + // // }, + // // ), + // // )), + // ) + // ], + // ), + // ); + // } // Widget slideIt(context, index, animation) { // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; @@ -365,138 +365,161 @@ class CountDownTimerState extends State ); } - return Scaffold( - backgroundColor: Colors.white10, - body: SizedBox.expand( - child: Container( - color: backgroundColor(), - child: Center( - child: Stack( - children: [ - timerScreen("start", exercises, workoutArgument.workSound, 10, - workoutArgument), - timerScreen("workout", exercises, workoutArgument.restSound, - workoutArgument.exerciseTime, workoutArgument), - timerScreen("rest", exercises, workoutArgument.workSound, - workoutArgument.restTime, workoutArgument), - Visibility( - visible: currentInterval == "done" ? true : false, - maintainAnimation: true, - maintainState: true, - child: Stack( - children: [ - Align( - alignment: Alignment.center, - child: ConfettiWidget( - confettiController: _controllerCenter, - blastDirectionality: BlastDirectionality - .explosive, // don't specify a direction, blast randomly - shouldLoop: - true, // start again as soon as the animation is finished - colors: const [ - Colors.green, - Colors.blue, - Colors.pink, - Colors.orange, - Colors.purple - ], // manually specify the colors to be used - createParticlePath: - drawStar, // define a custom shape/path. - ), - ), - Align( - alignment: Alignment.center, - child: AnimatedOpacity( - opacity: doneVisible ? 1.0 : 0.0, - duration: const Duration(milliseconds: 800), - child: SizedBox( - width: 300, - height: 300, - // color: Colors.green, - child: Center( - child: Column( - children: [ - const Text("Nice job!", - style: TextStyle( - color: Colors.white, - fontSize: 45, - fontWeight: FontWeight.bold)), - const Spacer(), - Align( - alignment: Alignment.center, - child: Row( - children: [ - TextButton.icon( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255))), - label: const Text( - "Back", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22), - ), - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(Icons.arrow_back, - color: Colors.white, - size: 38)), - const Spacer(), - TextButton.icon( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255))), - label: const Text( - "Restart", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22), - ), - onPressed: () { - setState(() { - currentInterval = "start"; - start = true; - intervals = 0; - pausePlayIcon = Icons.pause; - doneVisible = false; - _workoutController.restart(); - Wakelock.enable(); - }); - }, - icon: const Icon( - Icons.restart_alt, - color: Colors.white, - size: 38)) - ], - ), - ), - ], - ), - ), - ), - ), - ), - ], - ), - ), - ], - ), - ), + return SafeArea( + child: Countdown( + controller: _workoutController, + workSeconds: 5, + restSeconds: 3, + numberOfIntervals: 2, + build: (_, int time) => Text( + time.toString(), + style: TextStyle( + fontSize: 100, ), - )); + ), + interval: Duration(milliseconds: 100), + onFinished: () { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text('Timer is done!'), + // ), + // ); + }, + ), + ); + + // return Scaffold( + // backgroundColor: Colors.white10, + // body: SizedBox.expand( + // child: Container( + // color: backgroundColor(), + // child: Center( + // child: Stack( + // children: [ + // timerScreen("start", exercises, workoutArgument.workSound, 10, + // workoutArgument), + // timerScreen("workout", exercises, workoutArgument.restSound, + // workoutArgument.exerciseTime, workoutArgument), + // timerScreen("rest", exercises, workoutArgument.workSound, + // workoutArgument.restTime, workoutArgument), + // Visibility( + // visible: currentInterval == "done" ? true : false, + // maintainAnimation: true, + // maintainState: true, + // child: Stack( + // children: [ + // Align( + // alignment: Alignment.center, + // child: ConfettiWidget( + // confettiController: _controllerCenter, + // blastDirectionality: BlastDirectionality + // .explosive, // don't specify a direction, blast randomly + // shouldLoop: + // true, // start again as soon as the animation is finished + // colors: const [ + // Colors.green, + // Colors.blue, + // Colors.pink, + // Colors.orange, + // Colors.purple + // ], // manually specify the colors to be used + // createParticlePath: + // drawStar, // define a custom shape/path. + // ), + // ), + // Align( + // alignment: Alignment.center, + // child: AnimatedOpacity( + // opacity: doneVisible ? 1.0 : 0.0, + // duration: const Duration(milliseconds: 800), + // child: SizedBox( + // width: 300, + // height: 300, + // // color: Colors.green, + // child: Center( + // child: Column( + // children: [ + // const Text("Nice job!", + // style: TextStyle( + // color: Colors.white, + // fontSize: 45, + // fontWeight: FontWeight.bold)), + // const Spacer(), + // Align( + // alignment: Alignment.center, + // child: Row( + // children: [ + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Back", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(Icons.arrow_back, + // color: Colors.white, + // size: 38)), + // const Spacer(), + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Restart", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // setState(() { + // currentInterval = "start"; + // start = true; + // intervals = 0; + // pausePlayIcon = Icons.pause; + // doneVisible = false; + // _workoutController.restart(); + // Wakelock.enable(); + // }); + // }, + // icon: const Icon( + // Icons.restart_alt, + // color: Colors.white, + // size: 38)) + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // )); } Color backgroundColor() { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index da6221c1..f55399c9 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,14 +7,20 @@ import Foundation import audio_session import audioplayers_darwin +import device_info_plus +import flutter_local_notifications import path_provider_foundation +import shared_preferences_foundation import sqflite import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 179b0e3e..d4c31b38 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,58 +37,67 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" + sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.1.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c + sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.1" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" + sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.0.1" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" + sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 + sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 + sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" + sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.0.0" + background_timer: + dependency: "direct main" + description: + path: "." + ref: background-process-intervals + resolved-ref: "4c4de47066e4a94801218a2172d5ca2c45b511b8" + url: "https://github.com/a-mabe/background_timer.git" + source: git + version: "0.0.1" boolean_selector: dependency: transitive description: @@ -133,10 +142,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.17.2" confetti: dependency: "direct main" description: @@ -153,15 +162,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" - count_down_sound: - dependency: "direct dev" - description: - path: "." - ref: master - resolved-ref: "63e15af4e1c562c6e882623d11a77b51fb854d45" - url: "https://github.com/a-mabe/simple_count_down.git" - source: git - version: "2.2.2" coverage: dependency: "direct main" description: @@ -186,6 +186,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + url: "https://pub.dev" + source: hosted + version: "0.7.8" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 + url: "https://pub.dev" + source: hosted + version: "8.2.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" fake_async: dependency: transitive description: @@ -215,6 +239,48 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_background_service: + dependency: transitive + description: + path: "packages/flutter_background_service" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "5.0.1" + flutter_background_service_android: + dependency: transitive + description: + path: "packages/flutter_background_service_android" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "6.0.1" + flutter_background_service_ios: + dependency: transitive + description: + name: flutter_background_service_ios + sha256: ab73657535876e16abc89e40f924df3e92ad3dee83f64d187081417e824709ed + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_background_service_platform_interface: + dependency: transitive + description: + name: flutter_background_service_platform_interface + sha256: cd5720ff5b051d551a4734fae16683aace779bd0425e8d3f15d84a0cdcc2d8d9 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_fgbg: + dependency: transitive + description: + name: flutter_fgbg + sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" + url: "https://pub.dev" + source: hosted + version: "0.3.0" flutter_launcher_icons: dependency: "direct main" description: @@ -231,6 +297,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + flutter_local_notifications: + dependency: transitive + description: + name: flutter_local_notifications + sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + url: "https://pub.dev" + source: hosted + version: "15.1.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + url: "https://pub.dev" + source: hosted + version: "7.0.0+1" flutter_test: dependency: "direct dev" description: flutter @@ -309,18 +399,18 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: @@ -441,6 +531,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + url: "https://pub.dev" + source: hosted + version: "2.3.1" sky_engine: dependency: transitive description: flutter @@ -458,10 +604,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" sqflite: dependency: "direct main" description: @@ -538,10 +684,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.6.0" timer_count_down: dependency: "direct main" description: @@ -550,6 +696,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + timezone: + dependency: transitive + description: + name: timezone + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + url: "https://pub.dev" + source: hosted + version: "0.9.2" typed_data: dependency: transitive description: @@ -622,6 +776,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" win32: dependency: transitive description: @@ -655,5 +817,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.0 <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1ffb09d1..59068d2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: sqflite: ^2.2.8+2 uuid: ^3.0.7 timer_count_down: ^2.2.2 - audioplayers: ^4.1.0 + audioplayers: ^5.1.0 confetti: ^0.7.0 sqflite_common_ffi: ^2.2.5 wakelock: ^0.6.2 @@ -49,6 +49,11 @@ dependencies: coverage: ^1.6.3 audio_session: ^0.1.16 + background_timer: + git: + url: https://github.com/a-mabe/background_timer.git + ref: background-process-intervals # branch name + flutter_launcher_icons: android: "launcher_icon" ios: true @@ -81,10 +86,10 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^2.0.0 - count_down_sound: - git: - url: https://github.com/a-mabe/simple_count_down.git - ref: master # branch name + # background_timer: + # git: + # url: https://github.com/a-mabe/background_timer.git + # ref: background-process # branch name # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 4559b222aa1e88fdeb820622a885b3d1ad8c3a50 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:46 -0400 Subject: [PATCH 02/33] iOS release --- ios/Podfile.lock | 31 ++++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 12 ++++--- ios/Runner/AppDelegate.swift | 2 ++ .../Icon-App-1024x1024@1x.png | Bin 59641 -> 6538 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 551 -> 128 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 2081 -> 190 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 864 -> 136 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1973 -> 188 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 3215 -> 310 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2887 -> 286 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 1619 -> 180 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 3673 -> 350 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 1921 -> 188 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 4223 -> 382 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 6849 -> 598 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 2561 -> 262 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 5461 -> 469 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 2725 -> 278 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 5847 -> 505 bytes .../Icon-App-83.5x83.5@2x.png | Bin 6376 -> 563 bytes ios/Runner/Info.plist | 17 +++++++--- ios/Runner/Runner.entitlements | 8 +++++ 26 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 ios/Runner/Runner.entitlements diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fb6e9e77..b1317a7f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,13 +3,24 @@ PODS: - Flutter - audioplayers_darwin (0.0.1): - Flutter + - device_info_plus (0.0.1): + - Flutter - Flutter (1.0.0) + - flutter_background_service_ios (0.0.3): + - Flutter + - flutter_fgbg (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -19,8 +30,13 @@ PODS: DEPENDENCIES: - audio_session (from `.symlinks/plugins/audio_session/ios`) - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - Flutter (from `Flutter`) + - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) + - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -33,10 +49,20 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/audio_session/ios" audioplayers_darwin: :path: ".symlinks/plugins/audioplayers_darwin/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" Flutter: :path: Flutter + flutter_background_service_ios: + :path: ".symlinks/plugins/flutter_background_service_ios/ios" + flutter_fgbg: + :path: ".symlinks/plugins/flutter_fgbg/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -45,9 +71,14 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_background_service_ios: e30e0d3ee69e4cee66272d0c78eacd48c2e94aac + flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 9e5d0c02..a290b57e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4120B7D92AAA855B00D767CD /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -68,7 +69,6 @@ 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */, 09D2F883F979A99EC4DD64B5 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -105,6 +105,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 4120B7D92AAA855B00D767CD /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -358,6 +359,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -366,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -487,6 +489,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -495,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -510,6 +513,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -518,7 +522,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..c08f76a9 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -7,6 +7,8 @@ import Flutter _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + UIApplication.shared.beginReceivingRemoteControlEvents() + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 6c0b742e1e9a9ae4fb4120ab3cef800e6f6f6556..605d09e41086679f9f57c6561c86ba0e7e98d3b7 100644 GIT binary patch literal 6538 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGmw%jag8Vm&QB{TPb^AhC@(M9 z%goCzPEIUH)ypqRpZ(583aCcM)5S5Qg7M7_M_vX6fdd9|KepGbP*7PDy5ak`SuKYz{QwayzIY!MZp>q^C)cfx(7F=-*${Hyof;>gnp|vd$@? F2>{Wi)jt3L literal 59641 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

rpTv%S+;gJw83 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 k2H(TMc54{^|8T%bFPGQ0E2m=!WA^iX RU$zGnD2 zYbgV3uonZ9upsdUf>Kidk;@DTPHGJOQ?D`FT?d$AHZT7q5=%;EX+6!!)qW6urV_;=mWh? fEEopG7pVXMsXvait+{o|00000NkvXXu0mjf;K@Uuii`{j0t|*Mf3@ue1%wsyIJaFtv!?&;^~Tvvs}^Xj d;97;7;tNP)o);c|U5Eh)JYD@<);T3K0RRYfC076d delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index e6c6ce2a39955738850032cee4c1bc71df3f4a35..607d2f8a2294f2c40385626a2e3ec33072bbf472 100644 GIT binary patch delta 125 zcmZ1|u#a(qM;Swcr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAz&Yd^^q-%zbEe oxU}sx&vnUl#xdzT&XFP@`(YaMyTsn29tI%rboFyt=akR{02FLG1ONa4 delta 2031 zcmVzNkl>4QOF|ODW`JTK6QK}Uw2dfKtyWN6 zT9rDrbZlj+?E&pxy3QXRrQ679)k6=htzE2DryaXct>e<_P!ZJ9K~bnIWfhUirhrI7 zR_5LpO*;b!^*wM-%=esk$h+^pm*408?*09K_Xbff5pE!fu79@yBP|!Ov&#kS>~aA+ zyIjD|E*G$~%LP1K+EreUqQ=&KuZ1eTkUSx5MC=$b;N1lH!@`Pwug%k{oe%i`MI#1$ z>u4qJj?lnHmfu~SMhLAI$Q2SWZW2TX`i_(t!w+n;^`a=Z1?FrclzBolR(3&RqE`fX zRkIbL0X<+M!hc|@tAuF5EC>Vqht-~812&s&*thL8vfr$N)nLQ)#eqm&GY*<4Pk7dq zf`Juc-G@L!Bdo<`u;l&#W7Z~!;-^CL_;N7XkYTZFSb$HrcOmV?d`NfqBIV8TnE8Mj zLPp@YZpy7guh9r*))YYL4MrCQ$+9F^YwKZLyAk?(Qhx~aLy)Xo3V~3_t8Kgk=TtZ1 z-cJwU?syG0teXaRFL9qf0@Y0rn9Y6KnGg-+?`6QeCkH+0>tU;?hIH*q5J)7v*~csJ zk<(3BxaC_sf5)wOC1D~20=rk~K4C$AEB1bV7R3b@(B9CE7c6Jt?%M#*C|?95hCsC> z9E{9vj(>PQnag8uhGAJ63{R&+_Ri}NFbpp?@&;UU{vr~$euqaVN8;7llN{{_Ykon- zb0w(%M(=2o!UiFXFtn4Sssl|st5Hs-Kv?=@jCo8)hOq!l=orX|xAhM`4bz4#aC_=u zUhL!rn0j!d*h8eZ*#P*$vufx`wJoQVSn%kc$2s+==XlwYHBl}^vQ#0J8%Zk z+vl_1W^RdqbX6L9RvoXMm?obmH z)oz16t9e%qPAuJviC-;bJuSNDPB1&agYj=!kbja%-cJ87ZK&c5Og*`J|1qS-L?C38 zCx6?v@8>fP*ekj)#V{mbs&hN4QImNbq0dcXzh&D z+JUeCJcm8kn=E8_=lAK?6KKJu5aQ+9!6Pp9Vdd(hP~9I6xk>?MDhYsr0kC{~@cIMq zt~i4UDkZ}GyxH^ZB{ewP+1+p7wzzJ%*MIg+Q~xVPq!PhT=pga5j|iHJMG4bkDJa6w z#>l|p3|!FAj5%RJj`QqOwFCAw`CD;GYl5t@FEpbNLv`O+sFz2<=XMo4f9pHCpn<(F z6Fna0?cbo+X5&A+)?qu9@MJ|7`N{AxNsO%K0H`&_4ES2-gHK?HL2y?Pw?t#T>!--$o zU?B^I&K}cM@1b6fdBhK4zA6MJM?x{yZhTpDJKjEU3R{b+pf_6_{r`Qo1!^w^WW54- z(FRhIauFwBD*>jy(iem10SrJ0U?RL)SH_M?cO|G-_&pa_kS!$ z(8ZJE96{E<_1h_0P5A+3ta>lEClsn9a$|6q<=1>nXINR z!B_4!D6B#vhQ?dLex{|X2RZkWa$87n4qD>^eAwWU5);mz$AyeW-SL5ee~<164ghmG zBGd1PBHtyr-j&vj;L%u@R{|?Z7t}bq8Mm3tNj~)3jlF-8I5Afnbd}yi6KCK>kz?@e zo&w~MRT0g{@gXYK%el4ZIDb7i(%%P3A;4}9@J0`A(p4@Q!se~(Ckg)K>Oq+GS{WEPS&{`(w*5G?Vj(<9`nXN)kCRU=#@f7MWF0MK^KXB0mx!<;HUg_=M#D#D zUmh4OR^0d5zt{pLD}Qk+UuNj{yl&$8xy$f9 zF>uk={Um7ZK<4}@ST<41dWjY#bG2&rSf5|QR%L%B9{sIoZGXPA>@*(Td6+y)%8nHE z<-&t6@xD!~luL1tK)*qT@e{j_kfD5v-Poh)%U>bu_Z~Xb>AHGjK^Y1gTaiZM0p0ba zFNtpr%SOD25#puz2}mW?*SiI!$jCiOyq1r#e%_9a0{S1GNuM4-Wm_joTiRKVChNkm z{r*|Jd-cC;8)&vC6H$-S`I|m#B8rUXf39V31IWAkcYH0 zm`3E+Lz+KzBskIIddv0uu(Qhr?Cf#@JG)%K&Mp_Qv&#kS?7HEA{{sr=pAzmvv4FO#qvE8hHQ! delta 805 zcmV+=1KRwE0pJFZNPhzYNklpHC z9+VbgGg{1b;Q^k|Y#uN+Gn)slTP`aPlp4`gOysg7bWuV`B?swxO6fS|fBvkM%_*ID zV12gVgWvD>-}m+Z{rBJZCw55TA4mMx-~c*+%BiStA~C19 zzMf7*y*`$X#wILDX;@OyQSaD@;H>T+blq+XXdse5Qfwta2*jihFP!by9*_{9N>kf6dA;yM4RzAPv&U+gYp1SVROdFB5gIjN6LlQ9 z`?Pbt*?;nlw{>Pt7)!c6ziNs2V|ylqQ}%giOEs7&6|C`BRyb?jddB7eW&;haJVpVw2#o>7I9z_EzgY)H)^ zGSEjlv4Qxd1`_g0Y1kVhH;%NDauV`iaWZlaN`?JX_6oJdRjndnd8mA)txdj-MkP|! z(9FYkpQJz6!W^GbTv!o`*bA`Ns4cb=N9zOR(Pp*M*lJ;jT8T=u-)9{{yGA87ba$6O j#~vI)9nApx|DoRjH2VJoaQuT^00000NkvXXu0mjf@R^WS diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 4860af6d30dc76ac718a1820477580495e21e2e9..4ccc1b368ab65af2561177ef2cc1dbfa11a05eb4 100644 GIT binary patch delta 123 zcmdnWzlU*xM+rlmr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAzIId^?V2^j?%& nZ0eTXb4_BcVN~*#W5f&ad0R6-Gm_jc&j19Tu6{1-oD!Ml3=R5y7SL!6d{{YgiHsD^tP1M!kCV%Q`a1(VkxQV(N+(cas zZlXfsqeCb0!NC)4)};-O#Pa0foo>TDA!@O6XtLPatTU6kdjWUo3I%%HP4W+eub&hb z&on`Q)eJFb#}sWTg0%|xD(rAJ8zJ&kb*demM$~3^Aa{K=wtaRMHDv}29Hl{2oFDun zY>-HR7;hsytAEPCEm?u)w--Y?b|mEKGa!kK=oEW8h3Ju@T6~#W46$8=$uIZ8=qI&M z`^Z?Gb)>fV18o}j5D&J zTK_r3;lhv=jOeobU$NojSsc!M9Q^`)**Bxrj+JZ5uyO7==o@ZsFG@HNhx4udM8xAE zPw3F^y?^0QMfgCZP(b*WR{ezgltR^ml}pnq9sg;%+v&HgR)9VR=9pWXwhrwkz} zkxYz~Z)d@j`3CHT#cU1p0dJyPeyc)dqaHszJ%N>*ELNm^v-c*+KhZdhY$fILcD>pP zCs6!ME_~vGp$hkgWMn+VgJNJ?ySeL$t~y$Zv>`f#`+2eQ!u>@!+o1nP8%r<;LtiUA zD}UPd>fd44TXAa6Aq@R42_lgQiuCC)WzU22x*j55@4L2>7twly8F^K;SUO=CD_=8N z@WqkRHrqCgFhX4+zwMZQBf2AGQXi(`lqmHoluFo-9EWWDn7g)>7tw)YIT&sBHrrZ)I5bCE;c-UxuR2Ar3V)$9qM%KShF6RRoWqGrdINg+ctRwVLNcHq z9HkXNR}n3%yM_V5-Pp`i{8W9V!}ipx0cZXUKhi~$7>@9a0SHR&4Y5pu8bWUQfg*f$ ztelMNkMC2*v8G~ecQ`KB@iCPj(W@kMJ>@c-sHtb=%3Idvt*{1i7&GOh9*mmk1Y(&K=ycKe?)^C9R0_!H1Lv{TIA5-}ewQ&yAHW~5Oo?lp* zuF;OriwM^0MWY}l5ui6)v68Ik)xVVCB-xH`g@xmgu{9r@(}8$Sj+n4sNabNGFQU|& zp+0JCojI13C#}nE)94n|8B9#TRDUulqCVM#8Zt@kp__*S2hty7@6T_`M;@8fE+ZQ5 z=ZW2?|4Qd#g8ZXQSXcy424v} z-s#xm`fA~$ynV9Kp{=}n6J!sM!Jy?^u&3f8#z$%~bzlT`lvm>$a%8(3j3ozy7axdb z??spDvAN`T(BC93YsasMTG_WTmhlOPM)&n6vw5JVCY|Dk#w;bE3yO zD<{MG>&@)+^W*QAv8kjIm&tmZ9p4}GiRXPiZht_(Q*_D&HhT@(1;m@LkBVhiEnCU6 zuBZa_BxL^%Z-opA;X!zftYtbGew{$D1)ciug@$VC;7ImRk!dhmTFFvUGy@VsQU43> z+21ruh$^U1Dtf1I|2A|rxQV(N+(casZlbORH&IuEo2aYd4^=>z%vxnIX#fBK07*qo IM6N<$f|!k{?EnA( diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 8183a27696e1c7abb69d3e5a5e9f46b1c436bfaa..78d98e53c4ca66cff2df10c8d95c62c4e37e209b 100644 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVx1|$nl+{^(|k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu-SBjA45?szd%=;D!GPz$0ozyii+&`L4dpNJxkQhQzpxReq``;^>bP0l+XkK;%|Tz delta 3174 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 delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index d0fdab3803329c0426df043ed06a5e3cbc762d7a..e779e1a17de31849fde9f78356509602e97ebacf 100644 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu9q@E<45?szd*L7_gMz>T1NnFRKkaO;?U>*buh+ delta 2844 zcmai$XFSvo1HkV@_Fc9(GbsuuBYVe@bvY|_IP*{TI`b!I6UvG+itLq@bs{6X!kHnI zoqZ?{&-3DW`8=QJ`}X_!d|!X_DEin_5CGkVu9i9q3*N@l8nc>n^*)RLG%-f5teLdtO1P0+8~V16Ci|E@~isos~Pp{eQQ>R7Um$-p*AYjUCr6dgwP zNSmwJ-Q$F&Q#iPCOmD0E#MR_y` zTLK50v<|8U=BmX}tyGVg`q9v&=42oCVl1De2cqa31QO*tM}x?Z z$4z&STtMgao?cCfzEiTC@IF{myzZ6g;%{Lc606ZLnkhD1U3_nIi^jqKYR_lw*cgMT z28@dS6ur%0f5Z||eqHsH?i4U;QdbCMfMpEhgqp20iG>eAt85dCKU+9bfO0N0Sd>t! z%w?Cq{~V`*@yc-zrpw-$)Zo2O=Q*mztk$|4iAz~-tc`+9B03QK;Z(MH?$gKLv5~<6&pL#bJ~@y1!z{+DD`xkp zxMYF82E;aD#n?TN?^TMLl}b=s9e1Y@4Pk=%5q$V7OANa~RK>xkYBN-2@BVqO9Nr?D zT>02}SK21MmeSAz@W74r(QZ0RU`N)ek75_D#cBNx6l}RNUUgHm3)$f<*6_6|!ez}7 zaeA`Sj`jyPA3c#p-`LZ3AzZs8qev-3caQURC3+_tTM#PP7;I*Sw+^QO4$^w>V5maf zbjt@{vo)qB`b zn67pWuio!0)d31L?o({~nbFTJmKhqk%IImK4?)UYOT?#D8mpT^tk2pK*OiUBB#lRQ zG7aJ%jOS;lUoJVWPd*Djs6PrpC9u_iHZpxGpgE2j8GM&;-aJZ7y=bF?(or{44gpDV zJ3RY&P$?jBTd_IYvcPPs(OlH?o+CAe*|A%uoWn}oN}40OZ~zXIf397ZW&m>=aPOPsPIG+9}?tP&>%-v^MV}gO!|#(u|d3*gU-DH zyfIH1E;xR0vz9rXwcU{vv)g5i)hDV6g?$6-Vg$2_B)10(ufUJ|Me1Qi|6ETUqb*$Z zb}bj?wG2&?OZDfv!}#tzgCTNv*;B4rWcr{k_-NW&mZiSy%C*@c7_>7Gc2_`pZfp8-~)6|Coh6Fes@; z%IhbL20=-_Q=Nx#pg-a?cKkryNpppR(y4h_R_V7*u`eSv1lL+IZ=qE+kHEyL9{SEx z?Hg&oMv^aF`09p+7X^dc0yeqE1RhFxmAu+H^YcDNoLkh$#aqoyk$=x{s$- zP3rfa&YB)*lvm}@7O#AToH$MPzN<)vbG=E^8{v1miw2dmc{_76zD7iQc$djr&dyvS zkLRN*EZA8FD{H0$=oH5ec~9r~p&WNZ??%p}@tzO?ak9Mw7F>$N+jY41ut#CDUj#-5 zthIV7Y($R?-Y#1wwg6ST53KD)_P?0m$O?WhV%Q`=_&c6&-{(+qY7+|D^e)0bH8l#o z8%o+gacq)cGlegxb|vJ`D561-!z23);^J36jA50Dm9+df>dT;5o9yxSbEUWL>D$F$ zzdiX9g9RfF!*GZ@bNE0OYbA#WeGG4gveD<>kSkAMJkM&|&wxQ0W)9KUwm12f#j@Zx zP`IY#A_0LD*#n9YsJe8_bVJ@x=U=QPppNnjmkJ{f&|Sflera*NL} zuJ$!WVM0@OO*^hj(|^@!`}Zea=K83ycS?3-Z}Vm(EcSz}+_)wAy^eR?QdCyXzQpav+zQYgxBO>5iJfDAy*B%x8%^o4f9~`>Gmnv7&z1-4n;h;`Y2BNkU4+ zg0)MosgSpsC$F`w8S;+@kJ@buw1skOf&n1{oF}#EJU)O$Vi|*!|1b<=w9e#(!oFwr z_>h`%R=qe1YYs`jN83 zMeyQ4UuTbI>k)S$<_=|~O^lL4*;V8NucuQAGG@sd@xA^Z1J1yEBB+wu9jx(LZg*&;qrg-(ui*zls>pa-c3znSG0xVoSgCc5$13if< zAM+I<gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 delta 1566 zcmV+(2I2X%0n-eSNPh+ONkl?0wPdEg^lvsDhx$M z%{D}h&PAMaE+AXxwrHlAi*9b3>9WN*vyH@Q)XhiK;HHj|O~t7Q$U`F!K~w}4P#$B_ z+Q)5o?p4g9z~-gYX6ZkMq=3~#H4P+)^3WIe34S713+0{xsU2os_~zq=TedW2oZw+l$k z?M}S8wE&aKmDrG<2*1!F58KSS&47ggrF#~XQUOt7JZwwffNAFe=;tnhBy&E*3uZ$g z7?{fq801{jZ7xD>oF0#bD>M)9ceEQ(db$la%jJkOcYk4ssT#v#ec>KD3<8-HGz*aW z0`!?HV7uK0dRf-f18Kc$z|39w_-4j<%pMoa-K%fw!dGus;@E*^FlHNQSg{V*Ny|m9 z-IKsXY)HiLWHqQDHDo(C5m#FRDs&{oX{n9}VNb}54-{Zd|bM@G6$|+eh7+LVtKA`9m>54f?Hx=$<+sR0qK`!2OAzXbP4WcsH%;ti0OOG()3yB~p=Li@=k4utY2drVXWEXPhm zGB53kZQ=#;Tm2189OVZ$u?X$@d&nhg<54m0Hf~m=MUSr)Y2Z)RijTm8=rB;hfv}t{<6{y(kmkSi7($EjL&aqjHMaEmoK>&^)k`1sLtAF%@2Q7j6t`XsedyWHPCqQqqpoIY4HTJUz zh}JEO!%za9Q(TRlqH2_r*?d$T1|uq4J5VZ?p(%Dew(+ou7l@aPMyR(Z-cO9gKJsO^ zmDcw8?1?KkIgll}r}}&*g{-%%gb3^?t3_#-17}2|kfXAto%d`#j8G9h>bzCBw7hWJ>pmj|8?P;!f&k2GXvwGRSEUTq^jnHy;|^Dt;49uBH2HG7Uzvy(x91^3DMzfo557** zk=gO(QkFWB&i5v@r#se6iXpQR#vP{EbSE?S4+1d(o^BGygRs*2DLCV&Y=1pUpi(fE zxLHqHU)a!s6IX9SPKoC@%_0Pj8l1`C_5eDK5~1Q zV81F#;IN@Mm@$P*D1Rh}tQC31s3K_xo6fLx1@@@IZgxpQDjZsnia0gDlVD%6dtED1 zHJrP8)Kghx!|FgQCH-m8i`Y`JW9sCtYP_?_1>$USfjFC7AkHQih!?ZzZ+eRYD(M4q Q7XSbN07*qoM6N<$g5ebJ2LJ#7 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index 74d85b586aaa7badfd74a51db3801b33e32a771f..de24e4f8c1e494bd6947181da9bfc68ef2df492c 100644 GIT binary patch literal 350 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 literal 4223 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 659861a133c6b9e181340cd7621daeeaad1d3638..d962862e5363957733e2866cbfbb8512f90ee73b 100644 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b$r9IylHmNblJdl&REF~Ma=pyF z?Be9af>gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 xVS_$(Qy(u}Q@2%OTyyC;0yS4&` z`Z)^uiK}St6r?Lpeb7Z24KwmDS&U3QQ;rp00i_>zopr E06x#$mH+?% literal 6849 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 LT1l!}!VvZ!fgTlF diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index e21dd89a0af54c29ff178240114980d56a4db397..ed415b95151ead978426d83e3558293fc6f35d00 100644 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>But?+bl45?szd%;kUK|$bv0o$MGI*|g|L=TZKyRM(nS@-RA v!+l8+9xgW4<|fC33lahhG$aOqTfi`*f<^9otK1==n;AS^{an^LB{Ts5#FR{; delta 2515 zcmb7`=Q|sU0>*1sS{h=+9#u1xqEaz(jHcE(sI6MHTbrugh|z>viQ0-r96iJyu_+-O zqgJ(Q2d!AqQd*?WxzGIr?sMO7@AJIB_w(;LGm0%AL0y?7whG_sFMTPx<-J5#K6tj=cHA9Jr<)wIUVQR` zKnh&3Kq7z`mfs|~Sy50RD;55~N|bGB5e^WO6S|i~Ig4@t3tZ;XoE8iF)1Ix;s;RUN zf09IzL7(K)0@`l}sr~14(-wteoKnfKVfikbjIC&ZPAoprp~@JK5Muv%vmcMF)gs>W zoY;N>OdjY8$?y`q^P!SL>(3tgU8%pkh~i_ry~^*yvJ8Z^w$8yJ^>Jx$F6Vp*G$84N zw!GLh(z!Eb1`M@BdC5{tUR@6w0Z+6mc%AL;Q4*>wz#4z^mk@5de~h>SZFj6^Y)Kr! zYyD8~aX&qL_3Df4ngkZ(Wlxc;O+s@MJGU+l6T+pOn^~ph5RD6sj;vFe$tv%L5LTxA z&$+@Wm7#__qH8lWXlxd9RMJ$dGOsgSRA^A|#PgtZF6=_(*!)CHC9pxiI$lO^cKtXY z1ofC-(VSt=J-&oYZAvY9IGZPlF~ZkeX=zBrkPB;o!ya`-`YgCaEYecN`O*fW>f!f! zlK)~Lpkb#u|~{uB_H5FTiGkaM5NL$%GN6u9Y^LFAxl&79d~-3a`=MEc<6Lb z(RV7{86|X`6t89h@I`0|*6`Cl_3X1_)0F0;AkQTppU2KC=QLoy9!_Mq`+mY_P6Z#w zQ~ROg*z+RTHzqo>)v+TsQs8Y3w*yGRQ&ivnEBNly^-|+`fy87L&8vL-L(~?0`ho+N zBeL|W&XW2%(ojG=0Kz^QK^W6!rzK8yjwSVVz@uw(@J&YwN8{#+*<@ESMd`nb4ne!r zrmq?XY`HN3N?Vv>nS$KA4Lsqo+{7*}s;T!MC~beOnfa;Z7?kz9CAhvE%>2b>py=u6 z8QTS74LxRG$$=;AmVXz(Sm^-Rs6MB9+xo)rOz;HKZ;oYg_XdXLwCgkE)2eN0%5&NE zT>U-?Uc6L`DmlJF`LW+n$JFkvnG_#L0})#E}?IukJNi?#z3(x10io0PxB;!erg zjJXz!0}-kLtR@fqNVG=<=+z+d3a`re?-?)e!CdYS#7f^fGr6ZO%KZ_H_UL}PU%V-CU;^fAZ{W_9gGJU@uQp>H8^hPZx<@!mxc3-Fy@E+v{PnD{9L!}j}S} zQ_VB2oxRDn;-?{HP>tLZ1~wE@LUmj0Fyt}9SsyWe7!&Kl(KyQ9)mrAZzdgxaHbD(H zS*?Xdh~;kbnl2<&Z3B0J%SI4V>Vrcao$y+e#>ApqwCd$M);(QOUX`}%#n_mgVcRr zy83QsjL4Clbt?DHLUW8*1V3i*)j<8~kFgB4p^j4^{qWdh4JmXikj}S^u+74)0dx}p zUw79@Y4c6x9X-fRmD9V#^0V3HPWuB1?n{*CS@xJa-j;O{00k#wNM^t*@r-qUN12|; zuI=gGp3vLO@uyAKPl=<7aW;Oa?BIk42Yayo4tR(eXSYn-Fvsb^J}F)rBEs`_FzXK7 zqEMJJ_&`qFzXzmEM&2mQ-VgD+Nh6l%gGh= zX~;WYl_Bazi5HIFL!7*a5tU)lL6U>4KfxmR&#zPu|Gw~-hre_C_@9%sx`-baVvw&6 z1)`k_SQ@*28OR-4d<%jgVa(3s%WlePw2lx*_;GkkLP?o2gm!~x_`=|?%;f0r7DS;x zuO;8rZ=k#5Sf8mvQmaY%pvE5f#+vJkcOZ1#6|M$3x*gTplWUuAR>6iy`$JhV-D6cl zJ^lFDBO|z5JMp?%ZFf9k&CcNtU=qlmzFem6RtIr81P4m+NKb zWfvzW7NqLs7p2dBXCuYHz*z3-;uuoF`1X<^FN1=>0SC4}(RDT#8YkS*d~soKTH3*- zf2|t!OLiP_P+?Ot6zFX9;BiS(5MrJvF)BnsNE9)M*Rk3?H{JLU7*7nIu6{1-oD!M< DHkO37 literal 5461 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 b%C;Q@!rU`I4a2R?_Gi`>_U5goerf*#&chQ) diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 45ab767e92f3efe107d5f487f126b74c84af9b3a..7c6e461d9a8950fe00ae87b75108c1216ebb06a9 100644 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw4M<8HQcwg^k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+?-kFwXXLaSW+oe0#}|m%)JNzy{f;{yUuoeP`vcSQ@35^SeAN mWvDln&}^P)G)mAp40hGnv&OmeZ#)8wO9oF@KbLh*2~7aT0hojU literal 5847 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 E06(qwWB>pF literal 6376 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 + BGTaskSchedulerPermittedIdentifiers + + dev.flutter.background.refresh + + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +30,13 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + audio + fetch + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -43,9 +56,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..903def2a --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + From 05c380ff629e803994dec1b9d731a773d9586523 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:58 -0400 Subject: [PATCH 03/33] iOS release --- assets/icon/ios2.png | Bin 0 -> 619 bytes lib/start_workout/workout.dart | 627 ++++++++---------- macos/Podfile.lock | 19 + macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.lock | 66 +- pubspec.yaml | 2 +- 7 files changed, 338 insertions(+), 380 deletions(-) create mode 100644 assets/icon/ios2.png diff --git a/assets/icon/ios2.png b/assets/icon/ios2.png new file mode 100644 index 0000000000000000000000000000000000000000..cae16930901fc5f2c329c408cd8e045d89b179a0 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7vJY5_^D(1YsbdZxlLEwNv z>HoRsRaq9Q2!FY_H!aQa$WK`YeaTrO&Xbcef_Qwp7J3?*Xtt>xy|6@LRB#9fNDbP0l+XkKNO<3i literal 0 HcmV?d00001 diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 48d92987..859d4b27 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -6,6 +6,7 @@ import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:background_timer/background_timer.dart'; +import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -40,12 +41,11 @@ class CountDownTimerState extends State final CountdownController _workoutController = CountdownController(autoStart: true); - String currentInterval = "start"; - bool start = true; final player = AudioPlayer(); - int intervals = 0; + IconData pausePlayIcon = Icons.pause; bool doneVisible = false; + bool done = false; late ConfettiController _controllerCenter; @@ -56,7 +56,6 @@ class CountDownTimerState extends State @override void initState() { - super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -66,6 +65,7 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); + super.initState(); } void init() async { @@ -114,12 +114,14 @@ class CountDownTimerState extends State return path; } - String timerScreenText(currentVisibleInterval, exercises) { - switch (currentVisibleInterval) { + String timerScreenText(interval, status, exercises, Workout workoutArgument) { + switch (status) { case 'start': return "Get ready"; - case 'workout': - return intervals < exercises.length ? exercises[intervals] : "Work"; + case 'work': + return workoutArgument.numExercises < exercises.length + ? exercises[exercises.length - interval] + : "Work"; case 'rest': return "Rest"; default: @@ -127,181 +129,6 @@ class CountDownTimerState extends State } } - void startOnFinished() async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - start = false; - currentInterval = "workout"; - intervalInfo.removeAt(0); - _workoutController.restart(); - }); - } - - void workoutOnFinished(workoutArgument, exercises) async { - await Future.delayed(const Duration(milliseconds: 400)); - intervals = intervals + 1; - if (!(intervals < workoutArgument.numExercises) && - workoutArgument.completeSound != 'none') { - await player - .play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); - } - setState(() { - if (intervals < workoutArgument.numExercises) { - currentInterval = "rest"; - intervalInfo.removeAt(0); - _workoutController.restart(); - } else { - currentInterval = "done"; - _controllerCenter.play(); - doneVisible = !doneVisible; - Wakelock.disable(); - } - }); - } - - void restOnFinished(workoutArgument) async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - if (intervals < workoutArgument.numExercises) { - currentInterval = "workout"; - intervalInfo.removeAt(0); - // intervalInfo.removeAt(intervals + 1); - // intervalInfo.insert(intervalInfo.length, "Rest"); - _workoutController.restart(); - } else {} - }); - } - - // Widget timerScreen( - // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { - // return Visibility( - // visible: currentInterval == currentVisibleInterval ? true : false, - // child: Column( - // children: [ - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - // child: Row( - // children: [ - // IconButton( - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(size: 50.0, Icons.arrow_back), - // color: Colors.white), - // const Spacer(), - // IconButton( - // onPressed: () { - // if (pausePlayIcon == Icons.pause) { - // _workoutController.pause(); - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // }); - // } else { - // _workoutController.start(); - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // }); - // } - // }, - // icon: Icon(size: 50.0, pausePlayIcon), - // color: Colors.white), - // ], - // )), - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - // child: Text( - // timerScreenText(currentVisibleInterval, exercises), - // // intervals < exercises.length ? exercises[intervals] : "", - // style: const TextStyle(fontSize: 35, color: Colors.white), - // )), - // Countdown( - // controller: _workoutController, - // seconds: seconds, - // build: (_, int time) => Text( - // time.toString(), - // style: const TextStyle(fontSize: 205, color: Colors.white), - // ), - // interval: const Duration(milliseconds: 100), - // endSound: endSound, - // halfwaySound: workoutArgument.halfwaySound, - // countdownSound: workoutArgument.countdownSound, - // halfwayMark: (currentInterval == "workout") ? true : false, - // onFinished: () async { - // if (currentInterval == "start") { - // startOnFinished(); - // } else if (currentInterval == "workout") { - // workoutOnFinished(workoutArgument, exercises); - // } else if (currentInterval == "rest") { - // restOnFinished(workoutArgument); - // } - // }, - // ), - // Expanded( - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItemAnimated( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255), - // fontWeight: - // index == 0 ? FontWeight.bold : FontWeight.normal, - // ); - // // return slideIt(context, index, animation); - // }, - // ), - // ), - // // child: Container( - // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // // child: AnimatedList( - // // key: _listKey, - // // initialItemCount: intervalInfo.length, - // // itemBuilder: (context, index, animation) { - // // return CardItem( - // // animation: animation, - // // item: intervalInfo[index], - // // fontColor: index == 0 - // // ? Colors.white - // // : Color.fromARGB(153, 255, 255, 255)); - // // // return slideIt(context, index, animation); - // // }, - // // ), - // // )), - // ) - // ], - // ), - // ); - // } - - // Widget slideIt(context, index, animation) { - // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; - // return SlideTransition( - // position: Tween( - // begin: const Offset(-1, 0), - // end: const Offset(0, 0), - // ).animate(CurvedAnimation( - // parent: animation, - // curve: Curves.easeIn, - // reverseCurve: Curves.easeOut)), - // child: SizedBox( - // height: 50.0, - // child: Container( - // // color: Colors.transparent, - // child: Center( - // child: Text('Item $index', style: textStyle), - // ), - // ), - // ), - // ); - // } - List listItems(List exercises, Workout workoutArgument) { List listItems = []; @@ -348,6 +175,9 @@ class CountDownTimerState extends State return listItems; } + bool shouldReset = true; + bool restart = false; + @override Widget build(BuildContext context) { Workout workoutArgument = @@ -357,177 +187,286 @@ class CountDownTimerState extends State ? jsonDecode(workoutArgument.exercises) : []; - if (currentInterval == "start") { - intervalInfo = ListModel( - listKey: _listKey, - initialItems: listItems(exercises, workoutArgument), - removedItemBuilder: _buildRemovedItem, - ); + final GlobalKey listKey = GlobalKey(); + if (shouldReset) { + shouldReset = false; + setState(() { + intervalInfo = ListModel( + listKey: listKey, + initialItems: listItems(exercises, workoutArgument), + removedItemBuilder: _buildRemovedItem, + ); + print("${intervalInfo.length}"); + if (restart) { + _workoutController.restart(); + // restart = false; + } + }); + } + + String currentStatus = "start"; + + Widget complete() { + return Visibility( + visible: doneVisible, + maintainAnimation: true, + maintainState: true, + child: Container( + alignment: Alignment.center, + color: Color.fromARGB(255, 0, 225, 255), + child: Stack( + children: [ + Align( + alignment: Alignment.center, + child: ConfettiWidget( + confettiController: _controllerCenter, + blastDirectionality: BlastDirectionality + .explosive, // don't specify a direction, blast randomly + shouldLoop: + true, // start again as soon as the animation is finished + colors: const [ + Colors.green, + Colors.blue, + Colors.pink, + Colors.orange, + Colors.purple + ], // manually specify the colors to be used + createParticlePath: drawStar, // define a custom shape/path. + ), + ), + Align( + alignment: Alignment.center, + child: AnimatedOpacity( + opacity: doneVisible ? 1.0 : 0.0, + duration: const Duration(milliseconds: 800), + child: SizedBox( + width: 300, + height: 300, + // color: Colors.green, + child: Center( + child: Column( + children: [ + const Text("Nice job!", + style: TextStyle( + color: Colors.white, + fontSize: 45, + fontWeight: FontWeight.bold)), + const Spacer(), + Align( + alignment: Alignment.center, + child: Row( + children: [ + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Back", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(Icons.arrow_back, + color: Colors.white, size: 38)), + const Spacer(), + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Restart", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + setState(() { + shouldReset = true; + doneVisible = false; + restart = true; + done = false; + // _workoutController.restart(); + Wakelock.enable(); + }); + }, + icon: const Icon(Icons.restart_alt, + color: Colors.white, size: 38)) + ], + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + )); } return SafeArea( - child: Countdown( - controller: _workoutController, - workSeconds: 5, - restSeconds: 3, - numberOfIntervals: 2, - build: (_, int time) => Text( - time.toString(), - style: TextStyle( - fontSize: 100, + // child: Container( + // color: _backgroundColor, + + child: Stack( + children: [ + Countdown( + controller: _workoutController, + workSeconds: workoutArgument.exerciseTime, + restSeconds: workoutArgument.restTime, + workSound: workoutArgument.workSound, + restSound: workoutArgument.restSound, + endSound: workoutArgument.completeSound, + countdownSound: workoutArgument.countdownSound, + numberOfIntervals: workoutArgument.numExercises, + build: (_, BackgroundTimerData timerData) { + if (timerData.status == "complete" && restart == false) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _controllerCenter.play(); + // doneVisible = true; + // Wakelock.disable(); + // }); + done = true; + } else { + done = false; + restart = true; + } + + print(intervalInfo.length); + + return Container( + alignment: Alignment.center, + color: backgroundColor(timerData.status), + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), + child: Text( + timerScreenText(timerData.numberOfIntervals, + timerData.status, exercises, workoutArgument), + style: + TextStyle(fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: + TextStyle(fontSize: 160, color: Colors.white), + ), + ) + ], + ))); + }, + onFinished: () { + print("FINISHED"); + WidgetsBinding.instance.addPostFrameCallback((_) { + print("---------------------------"); + print(intervalInfo.length); + intervalInfo.removeAt(0); + print("REMOVED"); + if (intervalInfo.length == 0) { + Future.delayed(Duration(microseconds: 500000), () { + setState(() { + // _showText = true; + doneVisible = true; + _controllerCenter.play(); + }); + }); + // setState(() { + // doneVisible = true; + // }); + } + }); + }, ), - ), - interval: Duration(milliseconds: 100), - onFinished: () { - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text('Timer is done!'), - // ), - // ); - }, + Padding( + padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + if (pausePlayIcon == Icons.pause) { + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + setState(() { + pausePlayIcon = Icons.play_arrow; + Wakelock.disable(); + }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + setState(() { + pausePlayIcon = Icons.pause; + Wakelock.enable(); + }); + } + }, + icon: Icon(size: 50.0, pausePlayIcon), + color: Colors.white), + ], + )), + Align( + alignment: Alignment.bottomCenter, + child: FractionallySizedBox( + widthFactor: 1.0, + heightFactor: 0.5, + child: Container( + alignment: AlignmentDirectional.bottomCenter, + color: Color.fromARGB(22, 0, 0, 0), + child: AnimatedList( + key: listKey, + initialItemCount: intervalInfo.length, + itemBuilder: (context, index, animation) { + return CardItemAnimated( + animation: animation, + item: intervalInfo[index], + fontColor: index == 0 + ? Colors.white + : Color.fromARGB(153, 255, 255, 255), + fontWeight: index == 0 + ? FontWeight.bold + : FontWeight.normal, + ); + // return slideIt(context, index, animation); + }, + )))), + complete() + ], ), ); - - // return Scaffold( - // backgroundColor: Colors.white10, - // body: SizedBox.expand( - // child: Container( - // color: backgroundColor(), - // child: Center( - // child: Stack( - // children: [ - // timerScreen("start", exercises, workoutArgument.workSound, 10, - // workoutArgument), - // timerScreen("workout", exercises, workoutArgument.restSound, - // workoutArgument.exerciseTime, workoutArgument), - // timerScreen("rest", exercises, workoutArgument.workSound, - // workoutArgument.restTime, workoutArgument), - // Visibility( - // visible: currentInterval == "done" ? true : false, - // maintainAnimation: true, - // maintainState: true, - // child: Stack( - // children: [ - // Align( - // alignment: Alignment.center, - // child: ConfettiWidget( - // confettiController: _controllerCenter, - // blastDirectionality: BlastDirectionality - // .explosive, // don't specify a direction, blast randomly - // shouldLoop: - // true, // start again as soon as the animation is finished - // colors: const [ - // Colors.green, - // Colors.blue, - // Colors.pink, - // Colors.orange, - // Colors.purple - // ], // manually specify the colors to be used - // createParticlePath: - // drawStar, // define a custom shape/path. - // ), - // ), - // Align( - // alignment: Alignment.center, - // child: AnimatedOpacity( - // opacity: doneVisible ? 1.0 : 0.0, - // duration: const Duration(milliseconds: 800), - // child: SizedBox( - // width: 300, - // height: 300, - // // color: Colors.green, - // child: Center( - // child: Column( - // children: [ - // const Text("Nice job!", - // style: TextStyle( - // color: Colors.white, - // fontSize: 45, - // fontWeight: FontWeight.bold)), - // const Spacer(), - // Align( - // alignment: Alignment.center, - // child: Row( - // children: [ - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Back", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(Icons.arrow_back, - // color: Colors.white, - // size: 38)), - // const Spacer(), - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Restart", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // setState(() { - // currentInterval = "start"; - // start = true; - // intervals = 0; - // pausePlayIcon = Icons.pause; - // doneVisible = false; - // _workoutController.restart(); - // Wakelock.enable(); - // }); - // }, - // icon: const Icon( - // Icons.restart_alt, - // color: Colors.white, - // size: 38)) - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // ), - // ), - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // )); } - Color backgroundColor() { - if (currentInterval == "workout") { + Color backgroundColor(String status) { + if (status == "work") { return Colors.green; - } else if (currentInterval == "rest") { + } else if (status == "rest") { return Colors.red; - } else if (currentInterval == "start") { + } else if (status == "start") { return Colors.black; } else { return const Color.fromARGB(255, 0, 225, 255); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index c25e7f29..9beee45c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -3,6 +3,10 @@ PODS: - FlutterMacOS - audioplayers_darwin (0.0.1): - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) @@ -10,6 +14,9 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) @@ -19,8 +26,11 @@ PODS: DEPENDENCIES: - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) @@ -33,10 +43,16 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos audioplayers_darwin: :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos FlutterMacOS: :path: Flutter/ephemeral path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos wakelock_macos: @@ -45,9 +61,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 audioplayers_darwin: dcad41de4fbd0099cb3749f7ab3b0cb8f70b810c + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index f1a2e2c0..2971b052 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -203,7 +203,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 25131489..6f3e6e8e 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 29 Sep 2023 18:14:02 -0400 Subject: [PATCH 04/33] Use updated background timer package --- ios/Podfile.lock | 12 ++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 11 ++++++++++- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- ios/Runner/Info.plist | 1 + ios/Runner/Runner.entitlements | 5 +---- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b1317a7f..00f98462 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,12 +15,16 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - just_audio (0.0.1): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - soundpool (0.0.1): + - Flutter - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -35,8 +39,10 @@ DEPENDENCIES: - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - just_audio (from `.symlinks/plugins/just_audio/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - soundpool (from `.symlinks/plugins/soundpool/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -59,10 +65,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_fgbg/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + just_audio: + :path: ".symlinks/plugins/just_audio/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + soundpool: + :path: ".symlinks/plugins/soundpool/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -77,8 +87,10 @@ SPEC CHECKSUMS: flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + soundpool: c7f4422ca206e77f8900ed3c4ee6a6ff5a0e38a9 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a290b57e..66868c10 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -157,7 +157,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -360,6 +360,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -370,6 +372,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -490,6 +493,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -500,6 +505,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -514,6 +520,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -524,6 +532,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a3..a6b826db 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ audio fetch + processing UILaunchStoryboardName LaunchScreen diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 903def2a..0c67376e 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -1,8 +1,5 @@ - - aps-environment - development - + From 1f401a458225ca5aad2dc06011ea1d73987988a9 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 29 Sep 2023 18:14:14 -0400 Subject: [PATCH 05/33] Use updated background timer package --- .../app/FlutterMultiDexApplication.java | 25 ++ lib/main.dart | 48 ++-- lib/start_workout/workout.dart | 227 ++++++++++++------ macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 66 ++++- pubspec.yaml | 3 +- 6 files changed, 271 insertions(+), 102 deletions(-) create mode 100644 android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java diff --git a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java new file mode 100644 index 00000000..752fc185 --- /dev/null +++ b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java @@ -0,0 +1,25 @@ +// Generated file. +// +// If you wish to remove Flutter's multidex support, delete this entire file. +// +// Modifications to this file should be done in a copy under a different name +// as this file may be regenerated. + +package io.flutter.app; + +import android.app.Application; +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.multidex.MultiDex; + +/** + * Extension of {@link android.app.Application}, adding multidex support. + */ +public class FlutterMultiDexApplication extends Application { + @Override + @CallSuper + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/lib/main.dart b/lib/main.dart index 70a7a69b..65fdbf3c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:audio_session/audio_session.dart'; +// import 'package:audio_session/audio_session.dart'; import 'package:flutter/material.dart'; import 'create_workout/select_timer.dart'; import 'workout_data_type/workout_type.dart'; @@ -45,31 +45,31 @@ class _MyHomePageState extends State { @override initState() { super.initState(); - init(); + // init(); } - void init() async { - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration.music()); - - final session = await AudioSession.instance; - await session.configure(const AudioSessionConfiguration( - avAudioSessionCategory: AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: - AVAudioSessionCategoryOptions.mixWithOthers, - avAudioSessionMode: AVAudioSessionMode.defaultMode, - avAudioSessionRouteSharingPolicy: - AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - androidAudioAttributes: AndroidAudioAttributes( - contentType: AndroidAudioContentType.speech, - flags: AndroidAudioFlags.none, - usage: AndroidAudioUsage.voiceCommunication, - ), - androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - androidWillPauseWhenDucked: true, - )); - } + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); + + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + // } int calculateWorkoutTime(Workout workout) { return (((workout.exerciseTime * workout.numExercises) + diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 859d4b27..d74e3c43 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -1,10 +1,9 @@ import 'dart:convert'; import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; -import 'package:audioplayers/audioplayers.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:background_timer/background_timer.dart'; import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; @@ -56,6 +55,7 @@ class CountDownTimerState extends State @override void initState() { + super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -65,15 +65,41 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); - super.initState(); } void init() async { // final session = await AudioSession.instance; // await session.configure(const AudioSessionConfiguration.music()); - await player.play(AssetSource('audio/blank.mp3')); + + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + + // AssetSource('audio/blank.mp3') + // await player.setUrl('asset:audio/blank.mp3'); + // await player.play(); } + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); + // // await player.play(AssetSource('audio/blank.mp3')); + // } + @override void dispose() { _controllerCenter.dispose(); @@ -188,9 +214,12 @@ class CountDownTimerState extends State : []; final GlobalKey listKey = GlobalKey(); - if (shouldReset) { - shouldReset = false; - setState(() { + + print(shouldReset); + + setState(() { + if (shouldReset) { + shouldReset = false; intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), @@ -201,10 +230,12 @@ class CountDownTimerState extends State _workoutController.restart(); // restart = false; } - }); - } + } + }); + + print(intervalInfo.length); - String currentStatus = "start"; + // String currentStatus = "start"; Widget complete() { return Visibility( @@ -294,7 +325,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; - // _workoutController.restart(); + _workoutController.restart(); Wakelock.enable(); }); }, @@ -328,6 +359,7 @@ class CountDownTimerState extends State restSound: workoutArgument.restSound, endSound: workoutArgument.completeSound, countdownSound: workoutArgument.countdownSound, + halfwaySound: workoutArgument.halfwaySound, numberOfIntervals: workoutArgument.numExercises, build: (_, BackgroundTimerData timerData) { if (timerData.status == "complete" && restart == false) { @@ -342,36 +374,122 @@ class CountDownTimerState extends State restart = true; } + // if (timerData.paused) { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.play_arrow; + // // Wakelock.disable(); + // // }); + // // }); + // } else { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.pause; + // // Wakelock.disable(); + // // }); + // // }); + // } + print(intervalInfo.length); return Container( - alignment: Alignment.center, color: backgroundColor(timerData.status), - child: Align( - alignment: Alignment.topCenter, - child: Column( - children: [ - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), - child: Text( - timerScreenText(timerData.numberOfIntervals, - timerData.status, exercises, workoutArgument), - style: - TextStyle(fontSize: 30, color: Colors.white), - ), - ), - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), - child: Text( - timerData.currentMicroSeconds.toString(), - style: - TextStyle(fontSize: 160, color: Colors.white), - ), - ) - ], - ))); + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: + const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + print(timerData.paused); + if (!timerData.paused) { + // setState(() {}); + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.enable(); + // }); + // }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // }); + // }); + // // setState(() {}); + } + }, + icon: Icon( + size: 50.0, + timerData.paused + ? Icons.play_arrow + : Icons.pause), + color: Colors.white), + ], + )), + Container( + alignment: Alignment.center, + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 20.0, 0.0, 0.0), + child: Text( + timerScreenText( + timerData.numberOfIntervals, + timerData.status, + exercises, + workoutArgument), + style: TextStyle( + fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: TextStyle( + fontSize: 160, color: Colors.white), + ), + ) + ], + ))) + ], + )); }, onFinished: () { print("FINISHED"); @@ -395,41 +513,6 @@ class CountDownTimerState extends State }); }, ), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (pausePlayIcon == Icons.pause) { - _workoutController.pause(); - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - setState(() { - pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.resume(); - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - setState(() { - pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, pausePlayIcon), - color: Colors.white), - ], - )), Align( alignment: Alignment.bottomCenter, child: FractionallySizedBox( diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f55399c9..cf257ad5 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,8 +9,10 @@ import audio_session import audioplayers_darwin import device_info_plus import flutter_local_notifications +import just_audio import path_provider_foundation import shared_preferences_foundation +import soundpool_macos import sqflite import wakelock_macos @@ -19,8 +21,10 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SwiftSoundpoolPlugin.register(with: registry.registrar(forPlugin: "SwiftSoundpoolPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 1c98d0f3..a0c2ef33 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" + sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" url: "https://pub.dev" source: hosted - version: "3.3.8" + version: "3.4.2" args: dependency: transitive description: @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: aa03d702932dd2be4bfd4ce9ef1cff776f72dbae + resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -351,10 +351,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" infinite_listview: dependency: transitive description: @@ -379,6 +379,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b" + url: "https://pub.dev" + source: hosted + version: "0.9.35" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df + url: "https://pub.dev" + source: hosted + version: "4.2.1" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13 + url: "https://pub.dev" + source: hosted + version: "0.4.8" lints: dependency: transitive description: @@ -592,6 +616,38 @@ packages: description: flutter source: sdk version: "0.0.99" + soundpool: + dependency: transitive + description: + name: soundpool + sha256: fe7302005759d6a3561de1711e3ea818b1ba025a62375b469196dda5b654bd38 + url: "https://pub.dev" + source: hosted + version: "2.4.1" + soundpool_macos: + dependency: transitive + description: + name: soundpool_macos + sha256: e0440a19d4e8f344dace336923b369184e91eebbbd8348266f4434b675bd15db + url: "https://pub.dev" + source: hosted + version: "2.3.0" + soundpool_platform_interface: + dependency: transitive + description: + name: soundpool_platform_interface + sha256: "7c6666e19319151b2036c4fc9b6da3a83f2ebf4097989e6ba1c2b0bfe3612e9f" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + soundpool_web: + dependency: transitive + description: + name: soundpool_web + sha256: "3d1eb8d6cceb8a0aec38ff9aec4fbd11a9a8101d27b27a6eb29305b83d46aee5" + url: "https://pub.dev" + source: hosted + version: "2.3.0" source_maps: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 37e294a0..9b5cd58b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: git: url: https://github.com/a-mabe/background_timer.git ref: background-process-intervals # branch name + just_audio: ^0.9.35 flutter_launcher_icons: android: "launcher_icon" @@ -96,10 +97,10 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - assets: - assets/audio/ + # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. From 7881fc074d3f364fc410404a8d581af801e2a4af Mon Sep 17 00:00:00 2001 From: a-mabe Date: Mon, 2 Oct 2023 18:40:59 -0400 Subject: [PATCH 06/33] Use new timer version, add docs folder --- docs/test-cases.md | 16 ++++++++++++++++ pubspec.lock | 42 +++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 docs/test-cases.md diff --git a/docs/test-cases.md b/docs/test-cases.md new file mode 100644 index 00000000..650e5dcb --- /dev/null +++ b/docs/test-cases.md @@ -0,0 +1,16 @@ +# Test Cases + +1. [Create and save a new interval timer](https://github.com/a-mabe/OpenHIIT/blob/main/test/interval_timer_test.dart). +1. [Create and save a new workout](https://github.com/a-mabe/OpenHIIT/blob/main/test/workout_test.dart). +1. Edit an interval timer. +1. Edit a workout. +1. Play interval timer with default sound effects. +1. Play interval timer with custom sounds. +1. Play interval timer with no sounds. +1. Pause/play an interval timer. +1. Restart an interval timer. +1. Play workout with default sounds. +1. Play workout with custom sounds. +1. Play workout with no sounds. +1. Pause/play a workout. +1. Restart a workout. \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index a0c2ef33..bd7b08d0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" + sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.4.4" args: dependency: transitive description: @@ -37,64 +37,64 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" + sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" + sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" + sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "5.0.2" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 + sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" + sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" + sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" + sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" background_timer: dependency: "direct main" description: path: "." ref: background-process-intervals - resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b + resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -166,10 +166,10 @@ packages: dependency: "direct main" description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.6.4" crypto: dependency: transitive description: @@ -788,10 +788,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "12.0.0" wakelock: dependency: "direct main" description: From f0cd5ed6a011de77a9496e953ee79ef9aebb604b Mon Sep 17 00:00:00 2001 From: a-mabe Date: Wed, 30 Aug 2023 20:06:18 -0400 Subject: [PATCH 07/33] background timer --- lib/start_workout/workout.dart | 541 +++++++++--------- macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 222 ++++++- pubspec.yaml | 15 +- 4 files changed, 488 insertions(+), 296 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 8e6c565d..d3cf5e3c 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -3,9 +3,9 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; -import 'package:timer_count_down/timer_controller.dart'; +import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; -import 'package:count_down_sound/timer_count_down.dart'; +import 'package:background_timer/background_timer.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -34,10 +34,12 @@ class CountDownTimer extends StatefulWidget { CountDownTimerState createState() => CountDownTimerState(); } -class CountDownTimerState extends State with TickerProviderStateMixin { +class CountDownTimerState extends State + with TickerProviderStateMixin { /// VARS - final CountdownController _workoutController = CountdownController(autoStart: true); + final CountdownController _workoutController = + CountdownController(autoStart: true); String _currentInterval = "start"; bool _start = true; @@ -61,7 +63,8 @@ class CountDownTimerState extends State with TickerProviderState initialItems: [], removedItemBuilder: _buildRemovedItem, ); - _controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); + _controllerCenter = + ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); } @@ -104,8 +107,8 @@ class CountDownTimerState extends State with TickerProviderState path.moveTo(size.width, halfWidth); for (double step = 0; step < fullAngle; step += degreesPerStep) { - path.lineTo( - halfWidth + externalRadius * cos(step), halfWidth + externalRadius * sin(step)); + path.lineTo(halfWidth + externalRadius * cos(step), + halfWidth + externalRadius * sin(step)); path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep), halfWidth + internalRadius * sin(step + halfDegreesPerStep)); } @@ -141,7 +144,8 @@ class CountDownTimerState extends State with TickerProviderState _intervals = _intervals + 1; if (!(_intervals < workoutArgument.numExercises) && workoutArgument.completeSound != 'none') { - await _player.play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); + await _player + .play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); } setState(() { if (_intervals < workoutArgument.numExercises) { @@ -170,120 +174,113 @@ class CountDownTimerState extends State with TickerProviderState }); } - Widget timerScreen( - currentVisibleInterval, - exercises, - endSound, - seconds, - workoutArgument, - ) { - return Visibility( - visible: _currentInterval == currentVisibleInterval ? true : false, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white, - ), - const Spacer(), - IconButton( - onPressed: () { - if (_pausePlayIcon == Icons.pause) { - _workoutController.pause(); - setState(() { - _pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.start(); - setState(() { - _pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, _pausePlayIcon), - color: Colors.white, - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - child: Text( - timerScreenText(currentVisibleInterval, exercises), - // intervals < exercises.length ? exercises[intervals] : "", - style: const TextStyle(fontSize: 35, color: Colors.white), - ), - ), - Countdown( - controller: _workoutController, - seconds: seconds, - build: (_, int time) => Text( - time.toString(), - style: const TextStyle(fontSize: 205, color: Colors.white), - ), - interval: const Duration(milliseconds: 100), - endSound: endSound, - halfwaySound: workoutArgument.halfwaySound, - countdownSound: workoutArgument.countdownSound, - halfwayMark: (_currentInterval == "workout") ? true : false, - onFinished: () async { - if (_currentInterval == "start") { - startOnFinished(); - } else if (_currentInterval == "workout") { - workoutOnFinished(workoutArgument, exercises); - } else if (_currentInterval == "rest") { - restOnFinished(workoutArgument); - } - }, - ), - Expanded( - child: Container( - color: const Color.fromARGB(22, 0, 0, 0), - child: AnimatedList( - key: _listKey, - initialItemCount: _intervalInfo.length, - itemBuilder: (context, index, animation) { - return CardItemAnimated( - animation: animation, - item: _intervalInfo[index], - fontColor: index == 0 - ? Colors.white - : const Color.fromARGB(153, 255, 255, 255), - fontWeight: index == 0 ? FontWeight.bold : FontWeight.normal, - ); - }, - ), - ), - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItem( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255)); - // // return slideIt(context, index, animation); - // }, - // ), - // )), - ) - ], - ), - ); - } + // Widget timerScreen( + // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { + // return Visibility( + // visible: currentInterval == currentVisibleInterval ? true : false, + // child: Column( + // children: [ + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + // child: Row( + // children: [ + // IconButton( + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(size: 50.0, Icons.arrow_back), + // color: Colors.white), + // const Spacer(), + // IconButton( + // onPressed: () { + // if (pausePlayIcon == Icons.pause) { + // _workoutController.pause(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // } else { + // _workoutController.start(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // } + // }, + // icon: Icon(size: 50.0, pausePlayIcon), + // color: Colors.white), + // ], + // )), + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), + // child: Text( + // timerScreenText(currentVisibleInterval, exercises), + // // intervals < exercises.length ? exercises[intervals] : "", + // style: const TextStyle(fontSize: 35, color: Colors.white), + // )), + // Countdown( + // controller: _workoutController, + // seconds: seconds, + // build: (_, int time) => Text( + // time.toString(), + // style: const TextStyle(fontSize: 205, color: Colors.white), + // ), + // interval: const Duration(milliseconds: 100), + // endSound: endSound, + // halfwaySound: workoutArgument.halfwaySound, + // countdownSound: workoutArgument.countdownSound, + // halfwayMark: (currentInterval == "workout") ? true : false, + // onFinished: () async { + // if (currentInterval == "start") { + // startOnFinished(); + // } else if (currentInterval == "workout") { + // workoutOnFinished(workoutArgument, exercises); + // } else if (currentInterval == "rest") { + // restOnFinished(workoutArgument); + // } + // }, + // ), + // Expanded( + // child: Container( + // color: Color.fromARGB(22, 0, 0, 0), + // child: AnimatedList( + // key: _listKey, + // initialItemCount: intervalInfo.length, + // itemBuilder: (context, index, animation) { + // return CardItemAnimated( + // animation: animation, + // item: intervalInfo[index], + // fontColor: index == 0 + // ? Colors.white + // : Color.fromARGB(153, 255, 255, 255), + // fontWeight: + // index == 0 ? FontWeight.bold : FontWeight.normal, + // ); + // // return slideIt(context, index, animation); + // }, + // ), + // ), + // // child: Container( + // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, + // // child: AnimatedList( + // // key: _listKey, + // // initialItemCount: intervalInfo.length, + // // itemBuilder: (context, index, animation) { + // // return CardItem( + // // animation: animation, + // // item: intervalInfo[index], + // // fontColor: index == 0 + // // ? Colors.white + // // : Color.fromARGB(153, 255, 255, 255)); + // // // return slideIt(context, index, animation); + // // }, + // // ), + // // )), + // ) + // ], + // ), + // ); + // } // Widget slideIt(context, index, animation) { // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; @@ -370,10 +367,12 @@ class CountDownTimerState extends State with TickerProviderState @override Widget build(BuildContext context) { - Workout workoutArgument = ModalRoute.of(context)!.settings.arguments as Workout; + Workout workoutArgument = + ModalRoute.of(context)!.settings.arguments as Workout; - List exercises = - workoutArgument.exercises != "" ? jsonDecode(workoutArgument.exercises) : []; + List exercises = workoutArgument.exercises != "" + ? jsonDecode(workoutArgument.exercises) + : []; if (_currentInterval == "start") { _intervalInfo = ListModel( @@ -383,151 +382,161 @@ class CountDownTimerState extends State with TickerProviderState ); } - return Scaffold( - backgroundColor: Colors.white10, - body: SizedBox.expand( - child: Container( - color: backgroundColor(), - child: Center( - child: Stack( - children: [ - timerScreen( - "start", exercises, workoutArgument.workSound, 10, workoutArgument), - timerScreen("workout", exercises, workoutArgument.restSound, - workoutArgument.exerciseTime, workoutArgument), - timerScreen("rest", exercises, workoutArgument.workSound, - workoutArgument.restTime, workoutArgument), - Visibility( - visible: _currentInterval == "done" ? true : false, - maintainAnimation: true, - maintainState: true, - child: Stack( - children: [ - Align( - alignment: Alignment.center, - child: ConfettiWidget( - confettiController: _controllerCenter, - blastDirectionality: BlastDirectionality - .explosive, // don't specify a direction, blast randomly - shouldLoop: - true, // start again as soon as the animation is finished - colors: const [ - Colors.green, - Colors.blue, - Colors.pink, - Colors.orange, - Colors.purple - ], // manually specify the colors to be used - createParticlePath: drawStar, // define a custom shape/path. - ), - ), - Align( - alignment: Alignment.center, - child: AnimatedOpacity( - opacity: _doneVisible ? 1.0 : 0.0, - duration: const Duration(milliseconds: 800), - child: SizedBox( - width: 300, - height: 300, - // color: Colors.green, - child: Center( - child: Column( - children: [ - const Text( - "Nice job!", - style: TextStyle( - color: Colors.white, - fontSize: 45, - fontWeight: FontWeight.bold, - ), - ), - const Spacer(), - Align( - alignment: Alignment.center, - child: Row( - children: [ - TextButton.icon( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255, - ), - ), - ), - label: const Text( - "Back", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22, - ), - ), - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon( - Icons.arrow_back, - color: Colors.white, - size: 38, - ), - ), - const Spacer(), - TextButton.icon( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255, - ), - ), - ), - label: const Text( - "Restart", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22), - ), - onPressed: () { - setState(() { - _currentInterval = "start"; - _start = true; - _intervals = 0; - _pausePlayIcon = Icons.pause; - _doneVisible = false; - _workoutController.restart(); - Wakelock.enable(); - }); - }, - icon: const Icon( - Icons.restart_alt, - color: Colors.white, - size: 38, - ), - ) - ], - ), - ), - ], - ), - ), - ), - ), - ), - ], - ), - ), - ], - ), + return SafeArea( + child: Countdown( + controller: _workoutController, + workSeconds: 5, + restSeconds: 3, + numberOfIntervals: 2, + build: (_, int time) => Text( + time.toString(), + style: TextStyle( + fontSize: 100, ), ), + interval: Duration(milliseconds: 100), + onFinished: () { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text('Timer is done!'), + // ), + // ); + }, ), ); + + // return Scaffold( + // backgroundColor: Colors.white10, + // body: SizedBox.expand( + // child: Container( + // color: backgroundColor(), + // child: Center( + // child: Stack( + // children: [ + // timerScreen("start", exercises, workoutArgument.workSound, 10, + // workoutArgument), + // timerScreen("workout", exercises, workoutArgument.restSound, + // workoutArgument.exerciseTime, workoutArgument), + // timerScreen("rest", exercises, workoutArgument.workSound, + // workoutArgument.restTime, workoutArgument), + // Visibility( + // visible: currentInterval == "done" ? true : false, + // maintainAnimation: true, + // maintainState: true, + // child: Stack( + // children: [ + // Align( + // alignment: Alignment.center, + // child: ConfettiWidget( + // confettiController: _controllerCenter, + // blastDirectionality: BlastDirectionality + // .explosive, // don't specify a direction, blast randomly + // shouldLoop: + // true, // start again as soon as the animation is finished + // colors: const [ + // Colors.green, + // Colors.blue, + // Colors.pink, + // Colors.orange, + // Colors.purple + // ], // manually specify the colors to be used + // createParticlePath: + // drawStar, // define a custom shape/path. + // ), + // ), + // Align( + // alignment: Alignment.center, + // child: AnimatedOpacity( + // opacity: doneVisible ? 1.0 : 0.0, + // duration: const Duration(milliseconds: 800), + // child: SizedBox( + // width: 300, + // height: 300, + // // color: Colors.green, + // child: Center( + // child: Column( + // children: [ + // const Text("Nice job!", + // style: TextStyle( + // color: Colors.white, + // fontSize: 45, + // fontWeight: FontWeight.bold)), + // const Spacer(), + // Align( + // alignment: Alignment.center, + // child: Row( + // children: [ + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Back", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(Icons.arrow_back, + // color: Colors.white, + // size: 38)), + // const Spacer(), + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Restart", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // setState(() { + // currentInterval = "start"; + // start = true; + // intervals = 0; + // pausePlayIcon = Icons.pause; + // doneVisible = false; + // _workoutController.restart(); + // Wakelock.enable(); + // }); + // }, + // icon: const Icon( + // Icons.restart_alt, + // color: Colors.white, + // size: 38)) + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // )); } Color backgroundColor() { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index da6221c1..f55399c9 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,14 +7,20 @@ import Foundation import audio_session import audioplayers_darwin +import device_info_plus +import flutter_local_notifications import path_provider_foundation +import shared_preferences_foundation import sqflite import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index d9ed273d..a44aa334 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,58 +37,67 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" + sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.1.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c + sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.1" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" + sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.0.1" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" + sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 + sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 + sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" + sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.0.0" + background_timer: + dependency: "direct main" + description: + path: "." + ref: background-process-intervals + resolved-ref: "4c4de47066e4a94801218a2172d5ca2c45b511b8" + url: "https://github.com/a-mabe/background_timer.git" + source: git + version: "0.0.1" boolean_selector: dependency: transitive description: @@ -134,9 +143,11 @@ packages: description: name: collection sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted version: "1.17.2" + version: "1.17.2" confetti: dependency: "direct main" description: @@ -153,15 +164,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" - count_down_sound: - dependency: "direct dev" - description: - path: "." - ref: master - resolved-ref: "63e15af4e1c562c6e882623d11a77b51fb854d45" - url: "https://github.com/a-mabe/simple_count_down.git" - source: git - version: "2.2.2" coverage: dependency: "direct main" description: @@ -186,6 +188,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + url: "https://pub.dev" + source: hosted + version: "0.7.8" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 + url: "https://pub.dev" + source: hosted + version: "8.2.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" fake_async: dependency: transitive description: @@ -215,6 +241,48 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_background_service: + dependency: transitive + description: + path: "packages/flutter_background_service" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "5.0.1" + flutter_background_service_android: + dependency: transitive + description: + path: "packages/flutter_background_service_android" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "6.0.1" + flutter_background_service_ios: + dependency: transitive + description: + name: flutter_background_service_ios + sha256: ab73657535876e16abc89e40f924df3e92ad3dee83f64d187081417e824709ed + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_background_service_platform_interface: + dependency: transitive + description: + name: flutter_background_service_platform_interface + sha256: cd5720ff5b051d551a4734fae16683aace779bd0425e8d3f15d84a0cdcc2d8d9 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_fgbg: + dependency: transitive + description: + name: flutter_fgbg + sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" + url: "https://pub.dev" + source: hosted + version: "0.3.0" flutter_launcher_icons: dependency: "direct main" description: @@ -231,6 +299,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + flutter_local_notifications: + dependency: transitive + description: + name: flutter_local_notifications + sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + url: "https://pub.dev" + source: hosted + version: "15.1.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + url: "https://pub.dev" + source: hosted + version: "7.0.0+1" flutter_test: dependency: "direct dev" description: flutter @@ -310,17 +402,21 @@ packages: description: name: matcher sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted version: "0.12.16" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted version: "0.5.0" + version: "0.5.0" meta: dependency: transitive description: @@ -441,6 +537,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + url: "https://pub.dev" + source: hosted + version: "2.3.1" sky_engine: dependency: transitive description: flutter @@ -459,9 +611,11 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted version: "1.10.0" + version: "1.10.0" sqflite: dependency: "direct main" description: @@ -539,9 +693,11 @@ packages: description: name: test_api sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted version: "0.6.0" + version: "0.6.0" timer_count_down: dependency: "direct main" description: @@ -550,6 +706,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + timezone: + dependency: transitive + description: + name: timezone + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + url: "https://pub.dev" + source: hosted + version: "0.9.2" typed_data: dependency: transitive description: @@ -630,6 +794,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.4-beta" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" win32: dependency: transitive description: @@ -663,5 +835,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1ffb09d1..59068d2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: sqflite: ^2.2.8+2 uuid: ^3.0.7 timer_count_down: ^2.2.2 - audioplayers: ^4.1.0 + audioplayers: ^5.1.0 confetti: ^0.7.0 sqflite_common_ffi: ^2.2.5 wakelock: ^0.6.2 @@ -49,6 +49,11 @@ dependencies: coverage: ^1.6.3 audio_session: ^0.1.16 + background_timer: + git: + url: https://github.com/a-mabe/background_timer.git + ref: background-process-intervals # branch name + flutter_launcher_icons: android: "launcher_icon" ios: true @@ -81,10 +86,10 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^2.0.0 - count_down_sound: - git: - url: https://github.com/a-mabe/simple_count_down.git - ref: master # branch name + # background_timer: + # git: + # url: https://github.com/a-mabe/background_timer.git + # ref: background-process # branch name # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 403d5a489a2cc592f2732f3cd60c65e90510a0c1 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:46 -0400 Subject: [PATCH 08/33] iOS release --- ios/Podfile.lock | 31 ++++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 12 ++++--- ios/Runner/AppDelegate.swift | 2 ++ .../Icon-App-1024x1024@1x.png | Bin 59641 -> 6538 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 551 -> 128 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 2081 -> 190 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 864 -> 136 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1973 -> 188 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 3215 -> 310 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2887 -> 286 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 1619 -> 180 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 3673 -> 350 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 1921 -> 188 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 4223 -> 382 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 6849 -> 598 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 2561 -> 262 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 5461 -> 469 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 2725 -> 278 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 5847 -> 505 bytes .../Icon-App-83.5x83.5@2x.png | Bin 6376 -> 563 bytes ios/Runner/Info.plist | 17 +++++++--- ios/Runner/Runner.entitlements | 8 +++++ 26 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 ios/Runner/Runner.entitlements diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fb6e9e77..b1317a7f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,13 +3,24 @@ PODS: - Flutter - audioplayers_darwin (0.0.1): - Flutter + - device_info_plus (0.0.1): + - Flutter - Flutter (1.0.0) + - flutter_background_service_ios (0.0.3): + - Flutter + - flutter_fgbg (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -19,8 +30,13 @@ PODS: DEPENDENCIES: - audio_session (from `.symlinks/plugins/audio_session/ios`) - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - Flutter (from `Flutter`) + - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) + - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -33,10 +49,20 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/audio_session/ios" audioplayers_darwin: :path: ".symlinks/plugins/audioplayers_darwin/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" Flutter: :path: Flutter + flutter_background_service_ios: + :path: ".symlinks/plugins/flutter_background_service_ios/ios" + flutter_fgbg: + :path: ".symlinks/plugins/flutter_fgbg/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -45,9 +71,14 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_background_service_ios: e30e0d3ee69e4cee66272d0c78eacd48c2e94aac + flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2d39048c..28d7f691 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4120B7D92AAA855B00D767CD /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -68,7 +69,6 @@ 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */, 09D2F883F979A99EC4DD64B5 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -105,6 +105,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 4120B7D92AAA855B00D767CD /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -358,6 +359,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -366,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -487,6 +489,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -495,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -510,6 +513,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -518,7 +522,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..c08f76a9 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -7,6 +7,8 @@ import Flutter _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + UIApplication.shared.beginReceivingRemoteControlEvents() + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 6c0b742e1e9a9ae4fb4120ab3cef800e6f6f6556..605d09e41086679f9f57c6561c86ba0e7e98d3b7 100644 GIT binary patch literal 6538 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGmw%jag8Vm&QB{TPb^AhC@(M9 z%goCzPEIUH)ypqRpZ(583aCcM)5S5Qg7M7_M_vX6fdd9|KepGbP*7PDy5ak`SuKYz{QwayzIY!MZp>q^C)cfx(7F=-*${Hyof;>gnp|vd$@? F2>{Wi)jt3L literal 59641 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

rpTv%S+;gJw83 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 k2H(TMc54{^|8T%bFPGQ0E2m=!WA^iX RU$zGnD2 zYbgV3uonZ9upsdUf>Kidk;@DTPHGJOQ?D`FT?d$AHZT7q5=%;EX+6!!)qW6urV_;=mWh? fEEopG7pVXMsXvait+{o|00000NkvXXu0mjf;K@Uuii`{j0t|*Mf3@ue1%wsyIJaFtv!?&;^~Tvvs}^Xj d;97;7;tNP)o);c|U5Eh)JYD@<);T3K0RRYfC076d delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index e6c6ce2a39955738850032cee4c1bc71df3f4a35..607d2f8a2294f2c40385626a2e3ec33072bbf472 100644 GIT binary patch delta 125 zcmZ1|u#a(qM;Swcr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAz&Yd^^q-%zbEe oxU}sx&vnUl#xdzT&XFP@`(YaMyTsn29tI%rboFyt=akR{02FLG1ONa4 delta 2031 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 delta 805 zcmV+=1KRwE0pJFZNPhzYNklpHC z9+VbgGg{1b;Q^k|Y#uN+Gn)slTP`aPlp4`gOysg7bWuV`B?swxO6fS|fBvkM%_*ID zV12gVgWvD>-}m+Z{rBJZCw55TA4mMx-~c*+%BiStA~C19 zzMf7*y*`$X#wILDX;@OyQSaD@;H>T+blq+XXdse5Qfwta2*jihFP!by9*_{9N>kf6dA;yM4RzAPv&U+gYp1SVROdFB5gIjN6LlQ9 z`?Pbt*?;nlw{>Pt7)!c6ziNs2V|ylqQ}%giOEs7&6|C`BRyb?jddB7eW&;haJVpVw2#o>7I9z_EzgY)H)^ zGSEjlv4Qxd1`_g0Y1kVhH;%NDauV`iaWZlaN`?JX_6oJdRjndnd8mA)txdj-MkP|! z(9FYkpQJz6!W^GbTv!o`*bA`Ns4cb=N9zOR(Pp*M*lJ;jT8T=u-)9{{yGA87ba$6O j#~vI)9nApx|DoRjH2VJoaQuT^00000NkvXXu0mjf@R^WS diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 4860af6d30dc76ac718a1820477580495e21e2e9..4ccc1b368ab65af2561177ef2cc1dbfa11a05eb4 100644 GIT binary patch delta 123 zcmdnWzlU*xM+rlmr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAzIId^?V2^j?%& nZ0eTXb4_BcVN~*#W5f&ad0R6-Gm_jc&j19Tu6{1-oD!Ml3=R5y7SL!6d{{YgiHsD^tP1M!kCV%Q`a1(VkxQV(N+(cas zZlXfsqeCb0!NC)4)};-O#Pa0foo>TDA!@O6XtLPatTU6kdjWUo3I%%HP4W+eub&hb z&on`Q)eJFb#}sWTg0%|xD(rAJ8zJ&kb*demM$~3^Aa{K=wtaRMHDv}29Hl{2oFDun zY>-HR7;hsytAEPCEm?u)w--Y?b|mEKGa!kK=oEW8h3Ju@T6~#W46$8=$uIZ8=qI&M z`^Z?Gb)>fV18o}j5D&J zTK_r3;lhv=jOeobU$NojSsc!M9Q^`)**Bxrj+JZ5uyO7==o@ZsFG@HNhx4udM8xAE zPw3F^y?^0QMfgCZP(b*WR{ezgltR^ml}pnq9sg;%+v&HgR)9VR=9pWXwhrwkz} zkxYz~Z)d@j`3CHT#cU1p0dJyPeyc)dqaHszJ%N>*ELNm^v-c*+KhZdhY$fILcD>pP zCs6!ME_~vGp$hkgWMn+VgJNJ?ySeL$t~y$Zv>`f#`+2eQ!u>@!+o1nP8%r<;LtiUA zD}UPd>fd44TXAa6Aq@R42_lgQiuCC)WzU22x*j55@4L2>7twly8F^K;SUO=CD_=8N z@WqkRHrqCgFhX4+zwMZQBf2AGQXi(`lqmHoluFo-9EWWDn7g)>7tw)YIT&sBHrrZ)I5bCE;c-UxuR2Ar3V)$9qM%KShF6RRoWqGrdINg+ctRwVLNcHq z9HkXNR}n3%yM_V5-Pp`i{8W9V!}ipx0cZXUKhi~$7>@9a0SHR&4Y5pu8bWUQfg*f$ ztelMNkMC2*v8G~ecQ`KB@iCPj(W@kMJ>@c-sHtb=%3Idvt*{1i7&GOh9*mmk1Y(&K=ycKe?)^C9R0_!H1Lv{TIA5-}ewQ&yAHW~5Oo?lp* zuF;OriwM^0MWY}l5ui6)v68Ik)xVVCB-xH`g@xmgu{9r@(}8$Sj+n4sNabNGFQU|& zp+0JCojI13C#}nE)94n|8B9#TRDUulqCVM#8Zt@kp__*S2hty7@6T_`M;@8fE+ZQ5 z=ZW2?|4Qd#g8ZXQSXcy424v} z-s#xm`fA~$ynV9Kp{=}n6J!sM!Jy?^u&3f8#z$%~bzlT`lvm>$a%8(3j3ozy7axdb z??spDvAN`T(BC93YsasMTG_WTmhlOPM)&n6vw5JVCY|Dk#w;bE3yO zD<{MG>&@)+^W*QAv8kjIm&tmZ9p4}GiRXPiZht_(Q*_D&HhT@(1;m@LkBVhiEnCU6 zuBZa_BxL^%Z-opA;X!zftYtbGew{$D1)ciug@$VC;7ImRk!dhmTFFvUGy@VsQU43> z+21ruh$^U1Dtf1I|2A|rxQV(N+(casZlbORH&IuEo2aYd4^=>z%vxnIX#fBK07*qo IM6N<$f|!k{?EnA( diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 8183a27696e1c7abb69d3e5a5e9f46b1c436bfaa..78d98e53c4ca66cff2df10c8d95c62c4e37e209b 100644 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVx1|$nl+{^(|k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu-SBjA45?szd%=;D!GPz$0ozyii+&`L4dpNJxkQhQzpxReq``;^>bP0l+XkK;%|Tz delta 3174 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 delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index d0fdab3803329c0426df043ed06a5e3cbc762d7a..e779e1a17de31849fde9f78356509602e97ebacf 100644 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu9q@E<45?szd*L7_gMz>T1NnFRKkaO;?U>*buh+ delta 2844 zcmai$XFSvo1HkV@_Fc9(GbsuuBYVe@bvY|_IP*{TI`b!I6UvG+itLq@bs{6X!kHnI zoqZ?{&-3DW`8=QJ`}X_!d|!X_DEin_5CGkVu9i9q3*N@l8nc>n^*)RLG%-f5teLdtO1P0+8~V16Ci|E@~isos~Pp{eQQ>R7Um$-p*AYjUCr6dgwP zNSmwJ-Q$F&Q#iPCOmD0E#MR_y` zTLK50v<|8U=BmX}tyGVg`q9v&=42oCVl1De2cqa31QO*tM}x?Z z$4z&STtMgao?cCfzEiTC@IF{myzZ6g;%{Lc606ZLnkhD1U3_nIi^jqKYR_lw*cgMT z28@dS6ur%0f5Z||eqHsH?i4U;QdbCMfMpEhgqp20iG>eAt85dCKU+9bfO0N0Sd>t! z%w?Cq{~V`*@yc-zrpw-$)Zo2O=Q*mztk$|4iAz~-tc`+9B03QK;Z(MH?$gKLv5~<6&pL#bJ~@y1!z{+DD`xkp zxMYF82E;aD#n?TN?^TMLl}b=s9e1Y@4Pk=%5q$V7OANa~RK>xkYBN-2@BVqO9Nr?D zT>02}SK21MmeSAz@W74r(QZ0RU`N)ek75_D#cBNx6l}RNUUgHm3)$f<*6_6|!ez}7 zaeA`Sj`jyPA3c#p-`LZ3AzZs8qev-3caQURC3+_tTM#PP7;I*Sw+^QO4$^w>V5maf zbjt@{vo)qB`b zn67pWuio!0)d31L?o({~nbFTJmKhqk%IImK4?)UYOT?#D8mpT^tk2pK*OiUBB#lRQ zG7aJ%jOS;lUoJVWPd*Djs6PrpC9u_iHZpxGpgE2j8GM&;-aJZ7y=bF?(or{44gpDV zJ3RY&P$?jBTd_IYvcPPs(OlH?o+CAe*|A%uoWn}oN}40OZ~zXIf397ZW&m>=aPOPsPIG+9}?tP&>%-v^MV}gO!|#(u|d3*gU-DH zyfIH1E;xR0vz9rXwcU{vv)g5i)hDV6g?$6-Vg$2_B)10(ufUJ|Me1Qi|6ETUqb*$Z zb}bj?wG2&?OZDfv!}#tzgCTNv*;B4rWcr{k_-NW&mZiSy%C*@c7_>7Gc2_`pZfp8-~)6|Coh6Fes@; z%IhbL20=-_Q=Nx#pg-a?cKkryNpppR(y4h_R_V7*u`eSv1lL+IZ=qE+kHEyL9{SEx z?Hg&oMv^aF`09p+7X^dc0yeqE1RhFxmAu+H^YcDNoLkh$#aqoyk$=x{s$- zP3rfa&YB)*lvm}@7O#AToH$MPzN<)vbG=E^8{v1miw2dmc{_76zD7iQc$djr&dyvS zkLRN*EZA8FD{H0$=oH5ec~9r~p&WNZ??%p}@tzO?ak9Mw7F>$N+jY41ut#CDUj#-5 zthIV7Y($R?-Y#1wwg6ST53KD)_P?0m$O?WhV%Q`=_&c6&-{(+qY7+|D^e)0bH8l#o z8%o+gacq)cGlegxb|vJ`D561-!z23);^J36jA50Dm9+df>dT;5o9yxSbEUWL>D$F$ zzdiX9g9RfF!*GZ@bNE0OYbA#WeGG4gveD<>kSkAMJkM&|&wxQ0W)9KUwm12f#j@Zx zP`IY#A_0LD*#n9YsJe8_bVJ@x=U=QPppNnjmkJ{f&|Sflera*NL} zuJ$!WVM0@OO*^hj(|^@!`}Zea=K83ycS?3-Z}Vm(EcSz}+_)wAy^eR?QdCyXzQpav+zQYgxBO>5iJfDAy*B%x8%^o4f9~`>Gmnv7&z1-4n;h;`Y2BNkU4+ zg0)MosgSpsC$F`w8S;+@kJ@buw1skOf&n1{oF}#EJU)O$Vi|*!|1b<=w9e#(!oFwr z_>h`%R=qe1YYs`jN83 zMeyQ4UuTbI>k)S$<_=|~O^lL4*;V8NucuQAGG@sd@xA^Z1J1yEBB+wu9jx(LZg*&;qrg-(ui*zls>pa-c3znSG0xVoSgCc5$13if< zAM+I<gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 delta 1566 zcmV+(2I2X%0n-eSNPh+ONkl?0wPdEg^lvsDhx$M z%{D}h&PAMaE+AXxwrHlAi*9b3>9WN*vyH@Q)XhiK;HHj|O~t7Q$U`F!K~w}4P#$B_ z+Q)5o?p4g9z~-gYX6ZkMq=3~#H4P+)^3WIe34S713+0{xsU2os_~zq=TedW2oZw+l$k z?M}S8wE&aKmDrG<2*1!F58KSS&47ggrF#~XQUOt7JZwwffNAFe=;tnhBy&E*3uZ$g z7?{fq801{jZ7xD>oF0#bD>M)9ceEQ(db$la%jJkOcYk4ssT#v#ec>KD3<8-HGz*aW z0`!?HV7uK0dRf-f18Kc$z|39w_-4j<%pMoa-K%fw!dGus;@E*^FlHNQSg{V*Ny|m9 z-IKsXY)HiLWHqQDHDo(C5m#FRDs&{oX{n9}VNb}54-{Zd|bM@G6$|+eh7+LVtKA`9m>54f?Hx=$<+sR0qK`!2OAzXbP4WcsH%;ti0OOG()3yB~p=Li@=k4utY2drVXWEXPhm zGB53kZQ=#;Tm2189OVZ$u?X$@d&nhg<54m0Hf~m=MUSr)Y2Z)RijTm8=rB;hfv}t{<6{y(kmkSi7($EjL&aqjHMaEmoK>&^)k`1sLtAF%@2Q7j6t`XsedyWHPCqQqqpoIY4HTJUz zh}JEO!%za9Q(TRlqH2_r*?d$T1|uq4J5VZ?p(%Dew(+ou7l@aPMyR(Z-cO9gKJsO^ zmDcw8?1?KkIgll}r}}&*g{-%%gb3^?t3_#-17}2|kfXAto%d`#j8G9h>bzCBw7hWJ>pmj|8?P;!f&k2GXvwGRSEUTq^jnHy;|^Dt;49uBH2HG7Uzvy(x91^3DMzfo557** zk=gO(QkFWB&i5v@r#se6iXpQR#vP{EbSE?S4+1d(o^BGygRs*2DLCV&Y=1pUpi(fE zxLHqHU)a!s6IX9SPKoC@%_0Pj8l1`C_5eDK5~1Q zV81F#;IN@Mm@$P*D1Rh}tQC31s3K_xo6fLx1@@@IZgxpQDjZsnia0gDlVD%6dtED1 zHJrP8)Kghx!|FgQCH-m8i`Y`JW9sCtYP_?_1>$USfjFC7AkHQih!?ZzZ+eRYD(M4q Q7XSbN07*qoM6N<$g5ebJ2LJ#7 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index 74d85b586aaa7badfd74a51db3801b33e32a771f..de24e4f8c1e494bd6947181da9bfc68ef2df492c 100644 GIT binary patch literal 350 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 literal 4223 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 659861a133c6b9e181340cd7621daeeaad1d3638..d962862e5363957733e2866cbfbb8512f90ee73b 100644 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b$r9IylHmNblJdl&REF~Ma=pyF z?Be9af>gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 xVS_$(Qy(u}Q@2%OTyyC;0yS4&` z`Z)^uiK}St6r?Lpeb7Z24KwmDS&U3QQ;rp00i_>zopr E06x#$mH+?% literal 6849 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 LT1l!}!VvZ!fgTlF diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index e21dd89a0af54c29ff178240114980d56a4db397..ed415b95151ead978426d83e3558293fc6f35d00 100644 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>But?+bl45?szd%;kUK|$bv0o$MGI*|g|L=TZKyRM(nS@-RA v!+l8+9xgW4<|fC33lahhG$aOqTfi`*f<^9otK1==n;AS^{an^LB{Ts5#FR{; delta 2515 zcmb7`=Q|sU0>*1sS{h=+9#u1xqEaz(jHcE(sI6MHTbrugh|z>viQ0-r96iJyu_+-O zqgJ(Q2d!AqQd*?WxzGIr?sMO7@AJIB_w(;LGm0%AL0y?7whG_sFMTPx<-J5#K6tj=cHA9Jr<)wIUVQR` zKnh&3Kq7z`mfs|~Sy50RD;55~N|bGB5e^WO6S|i~Ig4@t3tZ;XoE8iF)1Ix;s;RUN zf09IzL7(K)0@`l}sr~14(-wteoKnfKVfikbjIC&ZPAoprp~@JK5Muv%vmcMF)gs>W zoY;N>OdjY8$?y`q^P!SL>(3tgU8%pkh~i_ry~^*yvJ8Z^w$8yJ^>Jx$F6Vp*G$84N zw!GLh(z!Eb1`M@BdC5{tUR@6w0Z+6mc%AL;Q4*>wz#4z^mk@5de~h>SZFj6^Y)Kr! zYyD8~aX&qL_3Df4ngkZ(Wlxc;O+s@MJGU+l6T+pOn^~ph5RD6sj;vFe$tv%L5LTxA z&$+@Wm7#__qH8lWXlxd9RMJ$dGOsgSRA^A|#PgtZF6=_(*!)CHC9pxiI$lO^cKtXY z1ofC-(VSt=J-&oYZAvY9IGZPlF~ZkeX=zBrkPB;o!ya`-`YgCaEYecN`O*fW>f!f! zlK)~Lpkb#u|~{uB_H5FTiGkaM5NL$%GN6u9Y^LFAxl&79d~-3a`=MEc<6Lb z(RV7{86|X`6t89h@I`0|*6`Cl_3X1_)0F0;AkQTppU2KC=QLoy9!_Mq`+mY_P6Z#w zQ~ROg*z+RTHzqo>)v+TsQs8Y3w*yGRQ&ivnEBNly^-|+`fy87L&8vL-L(~?0`ho+N zBeL|W&XW2%(ojG=0Kz^QK^W6!rzK8yjwSVVz@uw(@J&YwN8{#+*<@ESMd`nb4ne!r zrmq?XY`HN3N?Vv>nS$KA4Lsqo+{7*}s;T!MC~beOnfa;Z7?kz9CAhvE%>2b>py=u6 z8QTS74LxRG$$=;AmVXz(Sm^-Rs6MB9+xo)rOz;HKZ;oYg_XdXLwCgkE)2eN0%5&NE zT>U-?Uc6L`DmlJF`LW+n$JFkvnG_#L0})#E}?IukJNi?#z3(x10io0PxB;!erg zjJXz!0}-kLtR@fqNVG=<=+z+d3a`re?-?)e!CdYS#7f^fGr6ZO%KZ_H_UL}PU%V-CU;^fAZ{W_9gGJU@uQp>H8^hPZx<@!mxc3-Fy@E+v{PnD{9L!}j}S} zQ_VB2oxRDn;-?{HP>tLZ1~wE@LUmj0Fyt}9SsyWe7!&Kl(KyQ9)mrAZzdgxaHbD(H zS*?Xdh~;kbnl2<&Z3B0J%SI4V>Vrcao$y+e#>ApqwCd$M);(QOUX`}%#n_mgVcRr zy83QsjL4Clbt?DHLUW8*1V3i*)j<8~kFgB4p^j4^{qWdh4JmXikj}S^u+74)0dx}p zUw79@Y4c6x9X-fRmD9V#^0V3HPWuB1?n{*CS@xJa-j;O{00k#wNM^t*@r-qUN12|; zuI=gGp3vLO@uyAKPl=<7aW;Oa?BIk42Yayo4tR(eXSYn-Fvsb^J}F)rBEs`_FzXK7 zqEMJJ_&`qFzXzmEM&2mQ-VgD+Nh6l%gGh= zX~;WYl_Bazi5HIFL!7*a5tU)lL6U>4KfxmR&#zPu|Gw~-hre_C_@9%sx`-baVvw&6 z1)`k_SQ@*28OR-4d<%jgVa(3s%WlePw2lx*_;GkkLP?o2gm!~x_`=|?%;f0r7DS;x zuO;8rZ=k#5Sf8mvQmaY%pvE5f#+vJkcOZ1#6|M$3x*gTplWUuAR>6iy`$JhV-D6cl zJ^lFDBO|z5JMp?%ZFf9k&CcNtU=qlmzFem6RtIr81P4m+NKb zWfvzW7NqLs7p2dBXCuYHz*z3-;uuoF`1X<^FN1=>0SC4}(RDT#8YkS*d~soKTH3*- zf2|t!OLiP_P+?Ot6zFX9;BiS(5MrJvF)BnsNE9)M*Rk3?H{JLU7*7nIu6{1-oD!M< DHkO37 literal 5461 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 b%C;Q@!rU`I4a2R?_Gi`>_U5goerf*#&chQ) diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 45ab767e92f3efe107d5f487f126b74c84af9b3a..7c6e461d9a8950fe00ae87b75108c1216ebb06a9 100644 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw4M<8HQcwg^k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+?-kFwXXLaSW+oe0#}|m%)JNzy{f;{yUuoeP`vcSQ@35^SeAN mWvDln&}^P)G)mAp40hGnv&OmeZ#)8wO9oF@KbLh*2~7aT0hojU literal 5847 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 E06(qwWB>pF literal 6376 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 + BGTaskSchedulerPermittedIdentifiers + + dev.flutter.background.refresh + + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +30,13 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + audio + fetch + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -43,9 +56,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..903def2a --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + From 64de96852e7e11d230400965bb9ee0fa031a64fd Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:58 -0400 Subject: [PATCH 09/33] iOS release --- assets/icon/ios2.png | Bin 0 -> 619 bytes lib/start_workout/workout.dart | 635 ++++++++---------- macos/Podfile.lock | 19 + macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.lock | 66 +- pubspec.yaml | 2 +- 7 files changed, 342 insertions(+), 384 deletions(-) create mode 100644 assets/icon/ios2.png diff --git a/assets/icon/ios2.png b/assets/icon/ios2.png new file mode 100644 index 0000000000000000000000000000000000000000..cae16930901fc5f2c329c408cd8e045d89b179a0 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7vJY5_^D(1YsbdZxlLEwNv z>HoRsRaq9Q2!FY_H!aQa$WK`YeaTrO&Xbcef_Qwp7J3?*Xtt>xy|6@LRB#9fNDbP0l+XkKNO<3i literal 0 HcmV?d00001 diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index d3cf5e3c..7be31e7d 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -6,6 +6,7 @@ import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:background_timer/background_timer.dart'; +import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -41,12 +42,11 @@ class CountDownTimerState extends State final CountdownController _workoutController = CountdownController(autoStart: true); - String _currentInterval = "start"; - bool _start = true; - final _player = AudioPlayer(); - int _intervals = 0; - IconData _pausePlayIcon = Icons.pause; - bool _doneVisible = false; + final player = AudioPlayer(); + + IconData pausePlayIcon = Icons.pause; + bool doneVisible = false; + bool done = false; late ConfettiController _controllerCenter; @@ -57,8 +57,7 @@ class CountDownTimerState extends State @override void initState() { - super.initState(); - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -67,6 +66,7 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); + super.initState(); } void init() async { @@ -116,12 +116,14 @@ class CountDownTimerState extends State return path; } - String timerScreenText(currentVisibleInterval, exercises) { - switch (currentVisibleInterval) { + String timerScreenText(interval, status, exercises, Workout workoutArgument) { + switch (status) { case 'start': return "Get ready"; - case 'workout': - return _intervals < exercises.length ? exercises[_intervals] : "Work"; + case 'work': + return workoutArgument.numExercises < exercises.length + ? exercises[exercises.length - interval] + : "Work"; case 'rest': return "Rest"; default: @@ -129,181 +131,6 @@ class CountDownTimerState extends State } } - void startOnFinished() async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - _start = false; - _currentInterval = "workout"; - _intervalInfo.removeAt(0); - _workoutController.restart(); - }); - } - - void workoutOnFinished(workoutArgument, exercises) async { - await Future.delayed(const Duration(milliseconds: 400)); - _intervals = _intervals + 1; - if (!(_intervals < workoutArgument.numExercises) && - workoutArgument.completeSound != 'none') { - await _player - .play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); - } - setState(() { - if (_intervals < workoutArgument.numExercises) { - _currentInterval = "rest"; - _intervalInfo.removeAt(0); - _workoutController.restart(); - } else { - _currentInterval = "done"; - _controllerCenter.play(); - _doneVisible = !_doneVisible; - Wakelock.disable(); - } - }); - } - - void restOnFinished(workoutArgument) async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - if (_intervals < workoutArgument.numExercises) { - _currentInterval = "workout"; - _intervalInfo.removeAt(0); - // intervalInfo.removeAt(intervals + 1); - // intervalInfo.insert(intervalInfo.length, "Rest"); - _workoutController.restart(); - } else {} - }); - } - - // Widget timerScreen( - // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { - // return Visibility( - // visible: currentInterval == currentVisibleInterval ? true : false, - // child: Column( - // children: [ - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - // child: Row( - // children: [ - // IconButton( - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(size: 50.0, Icons.arrow_back), - // color: Colors.white), - // const Spacer(), - // IconButton( - // onPressed: () { - // if (pausePlayIcon == Icons.pause) { - // _workoutController.pause(); - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // }); - // } else { - // _workoutController.start(); - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // }); - // } - // }, - // icon: Icon(size: 50.0, pausePlayIcon), - // color: Colors.white), - // ], - // )), - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - // child: Text( - // timerScreenText(currentVisibleInterval, exercises), - // // intervals < exercises.length ? exercises[intervals] : "", - // style: const TextStyle(fontSize: 35, color: Colors.white), - // )), - // Countdown( - // controller: _workoutController, - // seconds: seconds, - // build: (_, int time) => Text( - // time.toString(), - // style: const TextStyle(fontSize: 205, color: Colors.white), - // ), - // interval: const Duration(milliseconds: 100), - // endSound: endSound, - // halfwaySound: workoutArgument.halfwaySound, - // countdownSound: workoutArgument.countdownSound, - // halfwayMark: (currentInterval == "workout") ? true : false, - // onFinished: () async { - // if (currentInterval == "start") { - // startOnFinished(); - // } else if (currentInterval == "workout") { - // workoutOnFinished(workoutArgument, exercises); - // } else if (currentInterval == "rest") { - // restOnFinished(workoutArgument); - // } - // }, - // ), - // Expanded( - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItemAnimated( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255), - // fontWeight: - // index == 0 ? FontWeight.bold : FontWeight.normal, - // ); - // // return slideIt(context, index, animation); - // }, - // ), - // ), - // // child: Container( - // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // // child: AnimatedList( - // // key: _listKey, - // // initialItemCount: intervalInfo.length, - // // itemBuilder: (context, index, animation) { - // // return CardItem( - // // animation: animation, - // // item: intervalInfo[index], - // // fontColor: index == 0 - // // ? Colors.white - // // : Color.fromARGB(153, 255, 255, 255)); - // // // return slideIt(context, index, animation); - // // }, - // // ), - // // )), - // ) - // ], - // ), - // ); - // } - - // Widget slideIt(context, index, animation) { - // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; - // return SlideTransition( - // position: Tween( - // begin: const Offset(-1, 0), - // end: const Offset(0, 0), - // ).animate(CurvedAnimation( - // parent: animation, - // curve: Curves.easeIn, - // reverseCurve: Curves.easeOut)), - // child: SizedBox( - // height: 50.0, - // child: Container( - // // color: Colors.transparent, - // child: Center( - // child: Text('Item $index', style: textStyle), - // ), - // ), - // ), - // ); - // } - List listItems(List exercises, Workout workoutArgument) { List listItems = []; @@ -365,6 +192,9 @@ class CountDownTimerState extends State return listItems; } + bool shouldReset = true; + bool restart = false; + @override Widget build(BuildContext context) { Workout workoutArgument = @@ -374,177 +204,286 @@ class CountDownTimerState extends State ? jsonDecode(workoutArgument.exercises) : []; - if (_currentInterval == "start") { - _intervalInfo = ListModel( - listKey: _listKey, - initialItems: listItems(exercises, workoutArgument), - removedItemBuilder: _buildRemovedItem, - ); + final GlobalKey listKey = GlobalKey(); + if (shouldReset) { + shouldReset = false; + setState(() { + intervalInfo = ListModel( + listKey: listKey, + initialItems: listItems(exercises, workoutArgument), + removedItemBuilder: _buildRemovedItem, + ); + print("${intervalInfo.length}"); + if (restart) { + _workoutController.restart(); + // restart = false; + } + }); + } + + String currentStatus = "start"; + + Widget complete() { + return Visibility( + visible: doneVisible, + maintainAnimation: true, + maintainState: true, + child: Container( + alignment: Alignment.center, + color: Color.fromARGB(255, 0, 225, 255), + child: Stack( + children: [ + Align( + alignment: Alignment.center, + child: ConfettiWidget( + confettiController: _controllerCenter, + blastDirectionality: BlastDirectionality + .explosive, // don't specify a direction, blast randomly + shouldLoop: + true, // start again as soon as the animation is finished + colors: const [ + Colors.green, + Colors.blue, + Colors.pink, + Colors.orange, + Colors.purple + ], // manually specify the colors to be used + createParticlePath: drawStar, // define a custom shape/path. + ), + ), + Align( + alignment: Alignment.center, + child: AnimatedOpacity( + opacity: doneVisible ? 1.0 : 0.0, + duration: const Duration(milliseconds: 800), + child: SizedBox( + width: 300, + height: 300, + // color: Colors.green, + child: Center( + child: Column( + children: [ + const Text("Nice job!", + style: TextStyle( + color: Colors.white, + fontSize: 45, + fontWeight: FontWeight.bold)), + const Spacer(), + Align( + alignment: Alignment.center, + child: Row( + children: [ + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Back", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(Icons.arrow_back, + color: Colors.white, size: 38)), + const Spacer(), + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Restart", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + setState(() { + shouldReset = true; + doneVisible = false; + restart = true; + done = false; + // _workoutController.restart(); + Wakelock.enable(); + }); + }, + icon: const Icon(Icons.restart_alt, + color: Colors.white, size: 38)) + ], + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + )); } return SafeArea( - child: Countdown( - controller: _workoutController, - workSeconds: 5, - restSeconds: 3, - numberOfIntervals: 2, - build: (_, int time) => Text( - time.toString(), - style: TextStyle( - fontSize: 100, + // child: Container( + // color: _backgroundColor, + + child: Stack( + children: [ + Countdown( + controller: _workoutController, + workSeconds: workoutArgument.exerciseTime, + restSeconds: workoutArgument.restTime, + workSound: workoutArgument.workSound, + restSound: workoutArgument.restSound, + endSound: workoutArgument.completeSound, + countdownSound: workoutArgument.countdownSound, + numberOfIntervals: workoutArgument.numExercises, + build: (_, BackgroundTimerData timerData) { + if (timerData.status == "complete" && restart == false) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _controllerCenter.play(); + // doneVisible = true; + // Wakelock.disable(); + // }); + done = true; + } else { + done = false; + restart = true; + } + + print(intervalInfo.length); + + return Container( + alignment: Alignment.center, + color: backgroundColor(timerData.status), + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), + child: Text( + timerScreenText(timerData.numberOfIntervals, + timerData.status, exercises, workoutArgument), + style: + TextStyle(fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: + TextStyle(fontSize: 160, color: Colors.white), + ), + ) + ], + ))); + }, + onFinished: () { + print("FINISHED"); + WidgetsBinding.instance.addPostFrameCallback((_) { + print("---------------------------"); + print(intervalInfo.length); + intervalInfo.removeAt(0); + print("REMOVED"); + if (intervalInfo.length == 0) { + Future.delayed(Duration(microseconds: 500000), () { + setState(() { + // _showText = true; + doneVisible = true; + _controllerCenter.play(); + }); + }); + // setState(() { + // doneVisible = true; + // }); + } + }); + }, ), - ), - interval: Duration(milliseconds: 100), - onFinished: () { - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text('Timer is done!'), - // ), - // ); - }, + Padding( + padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + if (pausePlayIcon == Icons.pause) { + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + setState(() { + pausePlayIcon = Icons.play_arrow; + Wakelock.disable(); + }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + setState(() { + pausePlayIcon = Icons.pause; + Wakelock.enable(); + }); + } + }, + icon: Icon(size: 50.0, pausePlayIcon), + color: Colors.white), + ], + )), + Align( + alignment: Alignment.bottomCenter, + child: FractionallySizedBox( + widthFactor: 1.0, + heightFactor: 0.5, + child: Container( + alignment: AlignmentDirectional.bottomCenter, + color: Color.fromARGB(22, 0, 0, 0), + child: AnimatedList( + key: listKey, + initialItemCount: intervalInfo.length, + itemBuilder: (context, index, animation) { + return CardItemAnimated( + animation: animation, + item: intervalInfo[index], + fontColor: index == 0 + ? Colors.white + : Color.fromARGB(153, 255, 255, 255), + fontWeight: index == 0 + ? FontWeight.bold + : FontWeight.normal, + ); + // return slideIt(context, index, animation); + }, + )))), + complete() + ], ), ); - - // return Scaffold( - // backgroundColor: Colors.white10, - // body: SizedBox.expand( - // child: Container( - // color: backgroundColor(), - // child: Center( - // child: Stack( - // children: [ - // timerScreen("start", exercises, workoutArgument.workSound, 10, - // workoutArgument), - // timerScreen("workout", exercises, workoutArgument.restSound, - // workoutArgument.exerciseTime, workoutArgument), - // timerScreen("rest", exercises, workoutArgument.workSound, - // workoutArgument.restTime, workoutArgument), - // Visibility( - // visible: currentInterval == "done" ? true : false, - // maintainAnimation: true, - // maintainState: true, - // child: Stack( - // children: [ - // Align( - // alignment: Alignment.center, - // child: ConfettiWidget( - // confettiController: _controllerCenter, - // blastDirectionality: BlastDirectionality - // .explosive, // don't specify a direction, blast randomly - // shouldLoop: - // true, // start again as soon as the animation is finished - // colors: const [ - // Colors.green, - // Colors.blue, - // Colors.pink, - // Colors.orange, - // Colors.purple - // ], // manually specify the colors to be used - // createParticlePath: - // drawStar, // define a custom shape/path. - // ), - // ), - // Align( - // alignment: Alignment.center, - // child: AnimatedOpacity( - // opacity: doneVisible ? 1.0 : 0.0, - // duration: const Duration(milliseconds: 800), - // child: SizedBox( - // width: 300, - // height: 300, - // // color: Colors.green, - // child: Center( - // child: Column( - // children: [ - // const Text("Nice job!", - // style: TextStyle( - // color: Colors.white, - // fontSize: 45, - // fontWeight: FontWeight.bold)), - // const Spacer(), - // Align( - // alignment: Alignment.center, - // child: Row( - // children: [ - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Back", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(Icons.arrow_back, - // color: Colors.white, - // size: 38)), - // const Spacer(), - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Restart", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // setState(() { - // currentInterval = "start"; - // start = true; - // intervals = 0; - // pausePlayIcon = Icons.pause; - // doneVisible = false; - // _workoutController.restart(); - // Wakelock.enable(); - // }); - // }, - // icon: const Icon( - // Icons.restart_alt, - // color: Colors.white, - // size: 38)) - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // ), - // ), - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // )); } - Color backgroundColor() { - if (_currentInterval == "workout") { + Color backgroundColor(String status) { + if (status == "work") { return Colors.green; - } else if (_currentInterval == "rest") { + } else if (status == "rest") { return Colors.red; - } else if (_currentInterval == "start") { + } else if (status == "start") { return Colors.black; } else { return const Color.fromARGB(255, 0, 225, 255); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index c25e7f29..9beee45c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -3,6 +3,10 @@ PODS: - FlutterMacOS - audioplayers_darwin (0.0.1): - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) @@ -10,6 +14,9 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) @@ -19,8 +26,11 @@ PODS: DEPENDENCIES: - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) @@ -33,10 +43,16 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos audioplayers_darwin: :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos FlutterMacOS: :path: Flutter/ephemeral path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos wakelock_macos: @@ -45,9 +61,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 audioplayers_darwin: dcad41de4fbd0099cb3749f7ab3b0cb8f70b810c + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index f1a2e2c0..2971b052 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -203,7 +203,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 25131489..6f3e6e8e 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 29 Sep 2023 18:14:02 -0400 Subject: [PATCH 10/33] Use updated background timer package --- ios/Podfile.lock | 12 ++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 9 +++++++++ ios/Runner/Info.plist | 1 + ios/Runner/Runner.entitlements | 5 +---- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b1317a7f..00f98462 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,12 +15,16 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - just_audio (0.0.1): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - soundpool (0.0.1): + - Flutter - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -35,8 +39,10 @@ DEPENDENCIES: - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - just_audio (from `.symlinks/plugins/just_audio/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - soundpool (from `.symlinks/plugins/soundpool/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -59,10 +65,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_fgbg/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + just_audio: + :path: ".symlinks/plugins/just_audio/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + soundpool: + :path: ".symlinks/plugins/soundpool/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -77,8 +87,10 @@ SPEC CHECKSUMS: flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + soundpool: c7f4422ca206e77f8900ed3c4ee6a6ff5a0e38a9 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 28d7f691..66868c10 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -360,6 +360,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -370,6 +372,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -490,6 +493,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -500,6 +505,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -514,6 +520,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -524,6 +532,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 471a20c0..2a0bc37b 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -36,6 +36,7 @@ audio fetch + processing UILaunchStoryboardName LaunchScreen diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 903def2a..0c67376e 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -1,8 +1,5 @@ - - aps-environment - development - + From c82bbac0581e159c480154ea896a0c2be34916bf Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 29 Sep 2023 18:14:14 -0400 Subject: [PATCH 11/33] Use updated background timer package --- .../app/FlutterMultiDexApplication.java | 25 ++ lib/main.dart | 51 ++-- lib/start_workout/workout.dart | 227 ++++++++++++------ macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 66 ++++- pubspec.yaml | 3 +- 6 files changed, 273 insertions(+), 103 deletions(-) create mode 100644 android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java diff --git a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java new file mode 100644 index 00000000..752fc185 --- /dev/null +++ b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java @@ -0,0 +1,25 @@ +// Generated file. +// +// If you wish to remove Flutter's multidex support, delete this entire file. +// +// Modifications to this file should be done in a copy under a different name +// as this file may be regenerated. + +package io.flutter.app; + +import android.app.Application; +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.multidex.MultiDex; + +/** + * Extension of {@link android.app.Application}, adding multidex support. + */ +public class FlutterMultiDexApplication extends Application { + @Override + @CallSuper + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/lib/main.dart b/lib/main.dart index 74fde530..c62f3ac4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:audio_session/audio_session.dart'; +// import 'package:audio_session/audio_session.dart'; import 'package:flutter/material.dart'; import 'create_workout/select_timer.dart'; import 'workout_data_type/workout_type.dart'; @@ -45,31 +45,31 @@ class _MyHomePageState extends State { @override initState() { super.initState(); - init(); + // init(); } - void init() async { - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration.music()); - - final session = await AudioSession.instance; - await session.configure( - const AudioSessionConfiguration( - avAudioSessionCategory: AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers, - avAudioSessionMode: AVAudioSessionMode.defaultMode, - avAudioSessionRouteSharingPolicy: AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - androidAudioAttributes: AndroidAudioAttributes( - contentType: AndroidAudioContentType.speech, - flags: AndroidAudioFlags.none, - usage: AndroidAudioUsage.voiceCommunication, - ), - androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - androidWillPauseWhenDucked: true, - ), - ); - } + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); + + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + // } int calculateWorkoutTime(Workout workout) { return (((workout.exerciseTime * workout.numExercises) + @@ -200,7 +200,8 @@ Total: ${calculateWorkoutTime(snapshot.data![index])} minutes'''), body: SafeArea( child: FutureBuilder>( future: workouts, - builder: (BuildContext context, AsyncSnapshot> snapshot) { + builder: + (BuildContext context, AsyncSnapshot> snapshot) { /// When [workouts] has successfully loaded. if (snapshot.hasData) { return workoutListView(snapshot); diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 7be31e7d..2af83bcf 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -1,10 +1,9 @@ import 'dart:convert'; import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; -import 'package:audioplayers/audioplayers.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:background_timer/background_timer.dart'; import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; @@ -57,6 +56,7 @@ class CountDownTimerState extends State @override void initState() { + super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -66,15 +66,41 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); - super.initState(); } void init() async { // final session = await AudioSession.instance; // await session.configure(const AudioSessionConfiguration.music()); - await _player.play(AssetSource('audio/blank.mp3')); + + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + + // AssetSource('audio/blank.mp3') + // await player.setUrl('asset:audio/blank.mp3'); + // await player.play(); } + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); + // // await player.play(AssetSource('audio/blank.mp3')); + // } + @override void dispose() { _controllerCenter.dispose(); @@ -205,9 +231,12 @@ class CountDownTimerState extends State : []; final GlobalKey listKey = GlobalKey(); - if (shouldReset) { - shouldReset = false; - setState(() { + + print(shouldReset); + + setState(() { + if (shouldReset) { + shouldReset = false; intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), @@ -218,10 +247,12 @@ class CountDownTimerState extends State _workoutController.restart(); // restart = false; } - }); - } + } + }); + + print(intervalInfo.length); - String currentStatus = "start"; + // String currentStatus = "start"; Widget complete() { return Visibility( @@ -311,7 +342,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; - // _workoutController.restart(); + _workoutController.restart(); Wakelock.enable(); }); }, @@ -345,6 +376,7 @@ class CountDownTimerState extends State restSound: workoutArgument.restSound, endSound: workoutArgument.completeSound, countdownSound: workoutArgument.countdownSound, + halfwaySound: workoutArgument.halfwaySound, numberOfIntervals: workoutArgument.numExercises, build: (_, BackgroundTimerData timerData) { if (timerData.status == "complete" && restart == false) { @@ -359,36 +391,122 @@ class CountDownTimerState extends State restart = true; } + // if (timerData.paused) { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.play_arrow; + // // Wakelock.disable(); + // // }); + // // }); + // } else { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.pause; + // // Wakelock.disable(); + // // }); + // // }); + // } + print(intervalInfo.length); return Container( - alignment: Alignment.center, color: backgroundColor(timerData.status), - child: Align( - alignment: Alignment.topCenter, - child: Column( - children: [ - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), - child: Text( - timerScreenText(timerData.numberOfIntervals, - timerData.status, exercises, workoutArgument), - style: - TextStyle(fontSize: 30, color: Colors.white), - ), - ), - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), - child: Text( - timerData.currentMicroSeconds.toString(), - style: - TextStyle(fontSize: 160, color: Colors.white), - ), - ) - ], - ))); + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: + const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + print(timerData.paused); + if (!timerData.paused) { + // setState(() {}); + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.enable(); + // }); + // }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // }); + // }); + // // setState(() {}); + } + }, + icon: Icon( + size: 50.0, + timerData.paused + ? Icons.play_arrow + : Icons.pause), + color: Colors.white), + ], + )), + Container( + alignment: Alignment.center, + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 20.0, 0.0, 0.0), + child: Text( + timerScreenText( + timerData.numberOfIntervals, + timerData.status, + exercises, + workoutArgument), + style: TextStyle( + fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: TextStyle( + fontSize: 160, color: Colors.white), + ), + ) + ], + ))) + ], + )); }, onFinished: () { print("FINISHED"); @@ -412,41 +530,6 @@ class CountDownTimerState extends State }); }, ), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (pausePlayIcon == Icons.pause) { - _workoutController.pause(); - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - setState(() { - pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.resume(); - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - setState(() { - pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, pausePlayIcon), - color: Colors.white), - ], - )), Align( alignment: Alignment.bottomCenter, child: FractionallySizedBox( diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f55399c9..cf257ad5 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,8 +9,10 @@ import audio_session import audioplayers_darwin import device_info_plus import flutter_local_notifications +import just_audio import path_provider_foundation import shared_preferences_foundation +import soundpool_macos import sqflite import wakelock_macos @@ -19,8 +21,10 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SwiftSoundpoolPlugin.register(with: registry.registrar(forPlugin: "SwiftSoundpoolPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 1c44cb2f..f26699f6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" + sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" url: "https://pub.dev" source: hosted - version: "3.3.8" + version: "3.4.2" args: dependency: transitive description: @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: aa03d702932dd2be4bfd4ce9ef1cff776f72dbae + resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -353,10 +353,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" infinite_listview: dependency: transitive description: @@ -381,6 +381,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b" + url: "https://pub.dev" + source: hosted + version: "0.9.35" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df + url: "https://pub.dev" + source: hosted + version: "4.2.1" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13 + url: "https://pub.dev" + source: hosted + version: "0.4.8" lints: dependency: transitive description: @@ -598,6 +622,38 @@ packages: description: flutter source: sdk version: "0.0.99" + soundpool: + dependency: transitive + description: + name: soundpool + sha256: fe7302005759d6a3561de1711e3ea818b1ba025a62375b469196dda5b654bd38 + url: "https://pub.dev" + source: hosted + version: "2.4.1" + soundpool_macos: + dependency: transitive + description: + name: soundpool_macos + sha256: e0440a19d4e8f344dace336923b369184e91eebbbd8348266f4434b675bd15db + url: "https://pub.dev" + source: hosted + version: "2.3.0" + soundpool_platform_interface: + dependency: transitive + description: + name: soundpool_platform_interface + sha256: "7c6666e19319151b2036c4fc9b6da3a83f2ebf4097989e6ba1c2b0bfe3612e9f" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + soundpool_web: + dependency: transitive + description: + name: soundpool_web + sha256: "3d1eb8d6cceb8a0aec38ff9aec4fbd11a9a8101d27b27a6eb29305b83d46aee5" + url: "https://pub.dev" + source: hosted + version: "2.3.0" source_maps: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 37e294a0..9b5cd58b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: git: url: https://github.com/a-mabe/background_timer.git ref: background-process-intervals # branch name + just_audio: ^0.9.35 flutter_launcher_icons: android: "launcher_icon" @@ -96,10 +97,10 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - assets: - assets/audio/ + # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. From 0ab3a887fc55a315294ec0ea4a70faeb3511e935 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Mon, 2 Oct 2023 18:40:59 -0400 Subject: [PATCH 12/33] Use new timer version, add docs folder --- docs/test-cases.md | 16 ++++++++++++++++ pubspec.lock | 42 +++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 docs/test-cases.md diff --git a/docs/test-cases.md b/docs/test-cases.md new file mode 100644 index 00000000..650e5dcb --- /dev/null +++ b/docs/test-cases.md @@ -0,0 +1,16 @@ +# Test Cases + +1. [Create and save a new interval timer](https://github.com/a-mabe/OpenHIIT/blob/main/test/interval_timer_test.dart). +1. [Create and save a new workout](https://github.com/a-mabe/OpenHIIT/blob/main/test/workout_test.dart). +1. Edit an interval timer. +1. Edit a workout. +1. Play interval timer with default sound effects. +1. Play interval timer with custom sounds. +1. Play interval timer with no sounds. +1. Pause/play an interval timer. +1. Restart an interval timer. +1. Play workout with default sounds. +1. Play workout with custom sounds. +1. Play workout with no sounds. +1. Pause/play a workout. +1. Restart a workout. \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index f26699f6..f65331d8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" + sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.4.4" args: dependency: transitive description: @@ -37,64 +37,64 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" + sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" + sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" + sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "5.0.2" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 + sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" + sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" + sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" + sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" background_timer: dependency: "direct main" description: path: "." ref: background-process-intervals - resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b + resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -168,10 +168,10 @@ packages: dependency: "direct main" description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.6.4" crypto: dependency: transitive description: @@ -798,10 +798,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "12.0.0" wakelock: dependency: "direct main" description: From 0ec98493781e53286753b23350f4aa60183c9d25 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 3 Oct 2023 19:35:57 -0400 Subject: [PATCH 13/33] Delete comments --- lib/start_workout/workout.dart | 138 ++++-------------------------- pubspec.lock | 151 --------------------------------- 2 files changed, 15 insertions(+), 274 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 2af83bcf..873a96a2 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -18,10 +18,8 @@ class StartWorkout extends StatelessWidget { @override Widget build(BuildContext context) { return const Scaffold( - body: SafeArea( - child: Center( - child: CountDownTimer(), - ), + body: Center( + child: CountDownTimer(), ), ); } @@ -57,7 +55,7 @@ class CountDownTimerState extends State @override void initState() { super.initState(); - intervalInfo = ListModel( + _intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -65,42 +63,8 @@ class CountDownTimerState extends State _controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); - init(); } - void init() async { - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration.music()); - - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration( - // // avAudioSessionCategory: AVAudioSessionCategory.ambient, - // avAudioSessionCategoryOptions: - // AVAudioSessionCategoryOptions.mixWithOthers, - // avAudioSessionMode: AVAudioSessionMode.defaultMode, - // avAudioSessionRouteSharingPolicy: - // AVAudioSessionRouteSharingPolicy.defaultPolicy, - // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - // androidAudioAttributes: AndroidAudioAttributes( - // contentType: AndroidAudioContentType.music, - // flags: AndroidAudioFlags.audibilityEnforced, - // usage: AndroidAudioUsage.media, - // ), - // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - // androidWillPauseWhenDucked: true, - // )); - - // AssetSource('audio/blank.mp3') - // await player.setUrl('asset:audio/blank.mp3'); - // await player.play(); - } - - // void init() async { - // // final session = await AudioSession.instance; - // // await session.configure(const AudioSessionConfiguration.music()); - // // await player.play(AssetSource('audio/blank.mp3')); - // } - @override void dispose() { _controllerCenter.dispose(); @@ -161,8 +125,6 @@ class CountDownTimerState extends State List listItems = []; for (var i = 0; i < workoutArgument.numExercises + 1; i++) { - // message.write('!'); - // intervalInfo.insert(i + 1, exercises[i]); if (i == 0) { listItems.add( ListTileModel( @@ -237,12 +199,12 @@ class CountDownTimerState extends State setState(() { if (shouldReset) { shouldReset = false; - intervalInfo = ListModel( + _intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), removedItemBuilder: _buildRemovedItem, ); - print("${intervalInfo.length}"); + print("${_intervalInfo.length}"); if (restart) { _workoutController.restart(); // restart = false; @@ -250,10 +212,6 @@ class CountDownTimerState extends State } }); - print(intervalInfo.length); - - // String currentStatus = "start"; - Widget complete() { return Visibility( visible: doneVisible, @@ -363,9 +321,7 @@ class CountDownTimerState extends State } return SafeArea( - // child: Container( - // color: _backgroundColor, - + bottom: false, child: Stack( children: [ Countdown( @@ -380,39 +336,12 @@ class CountDownTimerState extends State numberOfIntervals: workoutArgument.numExercises, build: (_, BackgroundTimerData timerData) { if (timerData.status == "complete" && restart == false) { - // WidgetsBinding.instance.addPostFrameCallback((_) { - // _controllerCenter.play(); - // doneVisible = true; - // Wakelock.disable(); - // }); done = true; } else { done = false; restart = true; } - // if (timerData.paused) { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // setState(() { - // // pausePlayIcon = Icons.play_arrow; - // // Wakelock.disable(); - // // }); - // // }); - // } else { - // pausePlayIcon = Icons.pause; - // Wakelock.disable(); - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // setState(() { - // // pausePlayIcon = Icons.pause; - // // Wakelock.disable(); - // // }); - // // }); - // } - - print(intervalInfo.length); - return Container( color: backgroundColor(timerData.status), child: Column( @@ -432,39 +361,10 @@ class CountDownTimerState extends State const Spacer(), IconButton( onPressed: () { - print(timerData.paused); if (!timerData.paused) { - // setState(() {}); _workoutController.pause(); - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // }); - // WidgetsBinding.instance - // .addPostFrameCallback((_) { - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.enable(); - // }); - // }); } else { _workoutController.resume(); - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // }); - // WidgetsBinding.instance - // .addPostFrameCallback((_) { - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.disable(); - // }); - // }); - // // setState(() {}); } }, icon: Icon( @@ -490,7 +390,7 @@ class CountDownTimerState extends State timerData.status, exercises, workoutArgument), - style: TextStyle( + style: const TextStyle( fontSize: 30, color: Colors.white), ), ), @@ -499,7 +399,7 @@ class CountDownTimerState extends State 0.0, 0.0, 0.0, 0.0), child: Text( timerData.currentMicroSeconds.toString(), - style: TextStyle( + style: const TextStyle( fontSize: 160, color: Colors.white), ), ) @@ -509,23 +409,15 @@ class CountDownTimerState extends State )); }, onFinished: () { - print("FINISHED"); WidgetsBinding.instance.addPostFrameCallback((_) { - print("---------------------------"); - print(intervalInfo.length); - intervalInfo.removeAt(0); - print("REMOVED"); - if (intervalInfo.length == 0) { - Future.delayed(Duration(microseconds: 500000), () { + _intervalInfo.removeAt(0); + if (_intervalInfo.length == 0) { + Future.delayed(const Duration(microseconds: 500000), () { setState(() { - // _showText = true; doneVisible = true; _controllerCenter.play(); }); }); - // setState(() { - // doneVisible = true; - // }); } }); }, @@ -537,17 +429,17 @@ class CountDownTimerState extends State heightFactor: 0.5, child: Container( alignment: AlignmentDirectional.bottomCenter, - color: Color.fromARGB(22, 0, 0, 0), + color: const Color.fromARGB(22, 0, 0, 0), child: AnimatedList( key: listKey, - initialItemCount: intervalInfo.length, + initialItemCount: _intervalInfo.length, itemBuilder: (context, index, animation) { return CardItemAnimated( animation: animation, - item: intervalInfo[index], + item: _intervalInfo[index], fontColor: index == 0 ? Colors.white - : Color.fromARGB(153, 255, 255, 255), + : const Color.fromARGB(153, 255, 255, 255), fontWeight: index == 0 ? FontWeight.bold : FontWeight.normal, diff --git a/pubspec.lock b/pubspec.lock index 670cc8c8..bd7b08d0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,11 +6,9 @@ packages: description: name: archive sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" - sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" url: "https://pub.dev" source: hosted version: "3.4.4" - version: "3.4.4" args: dependency: transitive description: @@ -40,80 +38,57 @@ packages: description: name: audioplayers sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f - sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f url: "https://pub.dev" source: hosted version: "5.2.0" - version: "5.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 - sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 url: "https://pub.dev" source: hosted version: "4.0.2" - version: "4.0.2" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" - sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" url: "https://pub.dev" source: hosted version: "5.0.2" - version: "5.0.2" audioplayers_linux: dependency: transitive description: name: audioplayers_linux sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" - sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" url: "https://pub.dev" source: hosted version: "3.1.0" - version: "3.1.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" - sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" url: "https://pub.dev" source: hosted version: "6.1.0" - version: "6.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" - sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" url: "https://pub.dev" source: hosted version: "4.1.0" - version: "4.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" - sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" url: "https://pub.dev" source: hosted version: "3.1.0" - background_timer: - dependency: "direct main" - description: - path: "." - ref: background-process-intervals - resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" - url: "https://github.com/a-mabe/background_timer.git" - source: git - version: "0.0.1" - version: "3.1.0" background_timer: dependency: "direct main" description: @@ -192,11 +167,9 @@ packages: description: name: coverage sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" - sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted version: "1.6.4" - version: "1.6.4" crypto: dependency: transitive description: @@ -229,31 +202,6 @@ packages: url: "https://pub.dev" source: hosted version: "8.2.2" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d - url: "https://pub.dev" - source: hosted - version: "1.0.6" - dbus: - dependency: transitive - description: - name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" - source: hosted - version: "0.7.8" - device_info_plus: - dependency: transitive - description: - name: device_info_plus - sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 - url: "https://pub.dev" - source: hosted - version: "8.2.2" device_info_plus_platform_interface: dependency: transitive description: @@ -262,7 +210,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" - version: "7.0.0" fake_async: dependency: transitive description: @@ -276,11 +223,9 @@ packages: description: name: ffi sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" url: "https://pub.dev" source: hosted version: "2.1.0" - version: "2.1.0" file: dependency: transitive description: @@ -336,48 +281,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" - flutter_background_service: - dependency: transitive - description: - path: "packages/flutter_background_service" - ref: stop-on-app-close - resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 - url: "https://github.com/a-mabe/flutter_background_service.git" - source: git - version: "5.0.1" - flutter_background_service_android: - dependency: transitive - description: - path: "packages/flutter_background_service_android" - ref: stop-on-app-close - resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 - url: "https://github.com/a-mabe/flutter_background_service.git" - source: git - version: "6.0.1" - flutter_background_service_ios: - dependency: transitive - description: - name: flutter_background_service_ios - sha256: ab73657535876e16abc89e40f924df3e92ad3dee83f64d187081417e824709ed - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_background_service_platform_interface: - dependency: transitive - description: - name: flutter_background_service_platform_interface - sha256: cd5720ff5b051d551a4734fae16683aace779bd0425e8d3f15d84a0cdcc2d8d9 - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_fgbg: - dependency: transitive - description: - name: flutter_fgbg - sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" - url: "https://pub.dev" - source: hosted - version: "0.3.0" flutter_launcher_icons: dependency: "direct main" description: @@ -410,31 +313,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0+1" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 - url: "https://pub.dev" - source: hosted - version: "2.0.3" - flutter_local_notifications: - dependency: transitive - description: - name: flutter_local_notifications - sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" - url: "https://pub.dev" - source: hosted - version: "15.1.1" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" - url: "https://pub.dev" - source: hosted - version: "4.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -443,7 +321,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0+1" - version: "7.0.0+1" flutter_test: dependency: "direct dev" description: flutter @@ -459,11 +336,9 @@ packages: description: name: http sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" url: "https://pub.dev" source: hosted version: "1.1.0" - version: "1.1.0" http_parser: dependency: transitive description: @@ -477,11 +352,9 @@ packages: description: name: image sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted version: "4.1.3" - version: "4.1.3" infinite_listview: dependency: transitive description: @@ -530,30 +403,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.8" - just_audio: - dependency: "direct main" - description: - name: just_audio - sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b" - url: "https://pub.dev" - source: hosted - version: "0.9.35" - just_audio_platform_interface: - dependency: transitive - description: - name: just_audio_platform_interface - sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df - url: "https://pub.dev" - source: hosted - version: "4.2.1" - just_audio_web: - dependency: transitive - description: - name: just_audio_web - sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13 - url: "https://pub.dev" - source: hosted - version: "0.4.8" lints: dependency: transitive description: From 8f3b472c10d0589ab0784430da128833b7f8f86e Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 6 Oct 2023 10:18:34 -0400 Subject: [PATCH 14/33] Update the UI list of intervals when coming back from a foreground process --- lib/models/list_model_animated.dart | 2 +- lib/start_workout/workout.dart | 416 ++++++++++++++++++++++------ macos/Podfile.lock | 12 + pubspec.lock | 6 +- 4 files changed, 346 insertions(+), 90 deletions(-) diff --git a/lib/models/list_model_animated.dart b/lib/models/list_model_animated.dart index 809b3f26..a4de7c63 100644 --- a/lib/models/list_model_animated.dart +++ b/lib/models/list_model_animated.dart @@ -35,7 +35,7 @@ class ListModel { E removeAt(int index) { final E removedItem = _items.removeAt(index); - if (removedItem != null) { + if (removedItem != null && _animatedList != null) { _animatedList!.removeItem( index, (BuildContext context, Animation animation) { diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 873a96a2..04c63cde 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -48,14 +48,14 @@ class CountDownTimerState extends State late ConfettiController _controllerCenter; final GlobalKey _listKey = GlobalKey(); - late ListModel _intervalInfo; + late ListModel intervalInfo; /// END VARS @override void initState() { super.initState(); - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -182,6 +182,9 @@ class CountDownTimerState extends State bool shouldReset = true; bool restart = false; + int intervalsCompleted = 0; + String lastStatus = "start"; + int intervalTotal = 0; @override Widget build(BuildContext context) { @@ -199,15 +202,16 @@ class CountDownTimerState extends State setState(() { if (shouldReset) { shouldReset = false; - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), removedItemBuilder: _buildRemovedItem, ); - print("${_intervalInfo.length}"); + intervalTotal = intervalInfo.length; + print("${intervalInfo.length}"); if (restart) { _workoutController.restart(); - // restart = false; + restart = false; } } }); @@ -300,7 +304,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; - _workoutController.restart(); + // _workoutController.restart(); Wakelock.enable(); }); }, @@ -321,10 +325,8 @@ class CountDownTimerState extends State } return SafeArea( - bottom: false, - child: Stack( - children: [ - Countdown( + bottom: false, + child: Countdown( controller: _workoutController, workSeconds: workoutArgument.exerciseTime, restSeconds: workoutArgument.restTime, @@ -333,48 +335,146 @@ class CountDownTimerState extends State endSound: workoutArgument.completeSound, countdownSound: workoutArgument.countdownSound, halfwaySound: workoutArgument.halfwaySound, - numberOfIntervals: workoutArgument.numExercises, + numberOfWorkIntervals: workoutArgument.numExercises, + onFinished: () { + print("FINISHED"); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (intervalInfo.length == 1) { + intervalInfo.removeAt(0); + print("should be empty"); + print(intervalInfo.length); + + Future.delayed(Duration(microseconds: 500000), () { + setState(() { + // _showText = true; + doneVisible = true; + _controllerCenter.play(); + + // intervalInfo = ListModel( + // listKey: listKey, + // initialItems: listItems(exercises, workoutArgument), + // removedItemBuilder: _buildRemovedItem, + // ); + }); + }); + + // intervalInfo = ListModel( + // listKey: listKey, + // initialItems: listItems(exercises, workoutArgument), + // removedItemBuilder: _buildRemovedItem, + // ); + } + // print("---------------------------"); + // print(intervalInfo.length); + // intervalInfo.removeAt(0); + + // print("REMOVED"); + // if (intervalInfo.length == 0) { + // Future.delayed(Duration(microseconds: 500000), () { + // setState(() { + // // _showText = true; + // doneVisible = true; + // _controllerCenter.play(); + // }); + // }); + // } + }); + }, build: (_, BackgroundTimerData timerData) { + // if (timerData.status == "complete") { + // doneVisible = true; + // // shouldReset = true; + // } else { + // doneVisible = false; + // // shouldReset = false; + // } + if (timerData.status == "complete" && restart == false) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _controllerCenter.play(); + // doneVisible = true; + // Wakelock.disable(); + // }); done = true; + } else if (timerData.status == "start") { + ListModel intervalList = + ListModel( + listKey: listKey, + initialItems: listItems(exercises, workoutArgument), + removedItemBuilder: _buildRemovedItem, + ); + + int count = 0; + while (intervalInfo.length < intervalTotal) { + // if (intervalInfo.length > 0 && doneVisible == false) { + intervalInfo.insert(count, intervalList[count]); + count++; + // } + } } else { done = false; restart = true; } - return Container( + while ((intervalInfo.length + timerData.numberOfIntervals) > + intervalTotal) { + if (intervalInfo.length > 0 && doneVisible == false) { + intervalInfo.removeAt(0); + } + } + + // int intervalDifference = + // if () + + // if (intervalsCompleted > 0) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // print("Remove"); + // _intervalInfo.removeAt(0); + // intervalsCompleted--; + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // }); + // } + + print(intervalsCompleted); + print(intervalInfo.length); + + return Stack(children: [ + Container( color: backgroundColor(timerData.status), child: Column( children: [ Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: - const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (!timerData.paused) { - _workoutController.pause(); - } else { - _workoutController.resume(); - } - }, - icon: Icon( - size: 50.0, - timerData.paused - ? Icons.play_arrow - : Icons.pause), - color: Colors.white), - ], - )), + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + child: Row(children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + if (!timerData.paused) { + _workoutController.pause(); + } else { + _workoutController.resume(); + } + }, + icon: Icon( + size: 50.0, + timerData.paused + ? Icons.play_arrow + : Icons.pause), + color: Colors.white), + ]), + ), Container( alignment: Alignment.center, child: Align( @@ -404,53 +504,197 @@ class CountDownTimerState extends State ), ) ], - ))) + ))), ], - )); - }, - onFinished: () { - WidgetsBinding.instance.addPostFrameCallback((_) { - _intervalInfo.removeAt(0); - if (_intervalInfo.length == 0) { - Future.delayed(const Duration(microseconds: 500000), () { - setState(() { - doneVisible = true; - _controllerCenter.play(); - }); - }); - } - }); - }, - ), - Align( - alignment: Alignment.bottomCenter, - child: FractionallySizedBox( - widthFactor: 1.0, - heightFactor: 0.5, - child: Container( - alignment: AlignmentDirectional.bottomCenter, - color: const Color.fromARGB(22, 0, 0, 0), - child: AnimatedList( - key: listKey, - initialItemCount: _intervalInfo.length, - itemBuilder: (context, index, animation) { - return CardItemAnimated( - animation: animation, - item: _intervalInfo[index], - fontColor: index == 0 - ? Colors.white - : const Color.fromARGB(153, 255, 255, 255), - fontWeight: index == 0 - ? FontWeight.bold - : FontWeight.normal, - ); - // return slideIt(context, index, animation); - }, - )))), - complete() - ], - ), - ); + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: FractionallySizedBox( + widthFactor: 1.0, + heightFactor: 0.5, + child: Container( + alignment: AlignmentDirectional.bottomCenter, + color: const Color.fromARGB(22, 0, 0, 0), + child: AnimatedList( + key: listKey, + initialItemCount: intervalInfo.length, + itemBuilder: (context, index, animation) { + return CardItemAnimated( + animation: animation, + item: intervalInfo[index], + fontColor: index == 0 + ? Colors.white + : const Color.fromARGB( + 153, 255, 255, 255), + fontWeight: index == 0 + ? FontWeight.bold + : FontWeight.normal, + ); + // return slideIt(context, index, animation); + }, + )))), + complete() + ]); + }) + // child: Stack( + // children: [ + // Countdown( + // controller: _workoutController, + // workSeconds: workoutArgument.exerciseTime, + // restSeconds: workoutArgument.restTime, + // workSound: workoutArgument.workSound, + // restSound: workoutArgument.restSound, + // endSound: workoutArgument.completeSound, + // countdownSound: workoutArgument.countdownSound, + // halfwaySound: workoutArgument.halfwaySound, + // numberOfIntervals: workoutArgument.numExercises, + // build: (_, BackgroundTimerData timerData) { + // if (timerData.status == "complete" && restart == false) { + // done = true; + // } else { + // done = false; + // restart = true; + // } + + // return Text("Hi"); + + // // return Container( + // // color: backgroundColor(timerData.status), + // // child: AnimatedList( + // // initialItemCount: 5, + // // itemBuilder: (context, index, animation) { + // // return Text("Hi"); + // // })); + + // // return AnimatedList( + // // initialItemCount: 5, + // // itemBuilder: (context, index, animation) { + // // return Text("Hi"); + // // }); + + // // if (currentStatus != timerData.status) {} + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // _intervalInfo.removeAt(0); + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // // } + // // }); + + // // return Container( + // // color: backgroundColor(timerData.status), + // // child: Column( + // // children: [ + // // Padding( + // // padding: + // // const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + // // child: Row( + // // children: [ + // // IconButton( + // // onPressed: () { + // // Navigator.pop(context); + // // }, + // // icon: + // // const Icon(size: 50.0, Icons.arrow_back), + // // color: Colors.white), + // // const Spacer(), + // // IconButton( + // // onPressed: () { + // // if (!timerData.paused) { + // // _workoutController.pause(); + // // } else { + // // _workoutController.resume(); + // // } + // // }, + // // icon: Icon( + // // size: 50.0, + // // timerData.paused + // // ? Icons.play_arrow + // // : Icons.pause), + // // color: Colors.white), + // // ], + // // )), + // // Container( + // // alignment: Alignment.center, + // // child: Align( + // // alignment: Alignment.topCenter, + // // child: Column( + // // children: [ + // // Padding( + // // padding: const EdgeInsets.fromLTRB( + // // 0.0, 20.0, 0.0, 0.0), + // // child: Text( + // // timerScreenText( + // // timerData.numberOfIntervals, + // // timerData.status, + // // exercises, + // // workoutArgument), + // // style: const TextStyle( + // // fontSize: 30, color: Colors.white), + // // ), + // // ), + // // Padding( + // // padding: const EdgeInsets.fromLTRB( + // // 0.0, 0.0, 0.0, 0.0), + // // child: Text( + // // timerData.currentMicroSeconds.toString(), + // // style: const TextStyle( + // // fontSize: 160, color: Colors.white), + // // ), + // // ) + // // ], + // // ))), + // // ], + // // )); + // }, + // onFinished: () { + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // _intervalInfo.removeAt(0); + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // // } + // // }); + // }, + // ), + // // Align( + // // alignment: Alignment.bottomCenter, + // // child: FractionallySizedBox( + // // widthFactor: 1.0, + // // heightFactor: 0.5, + // // child: Container( + // // alignment: AlignmentDirectional.bottomCenter, + // // color: const Color.fromARGB(22, 0, 0, 0), + // // child: AnimatedList( + // // key: listKey, + // // initialItemCount: _intervalInfo.length, + // // itemBuilder: (context, index, animation) { + // // return CardItemAnimated( + // // animation: animation, + // // item: _intervalInfo[index], + // // fontColor: index == 0 + // // ? Colors.white + // // : const Color.fromARGB(153, 255, 255, 255), + // // fontWeight: index == 0 + // // ? FontWeight.bold + // // : FontWeight.normal, + // // ); + // // // return slideIt(context, index, animation); + // // }, + // // )))), + // complete() + // ], + // ), + ); } Color backgroundColor(String status) { diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 9beee45c..8af690de 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -11,12 +11,16 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - just_audio (0.0.1): + - FlutterMacOS - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - soundpool_macos (1.0.0): + - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) @@ -29,8 +33,10 @@ DEPENDENCIES: - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - soundpool_macos (from `Flutter/ephemeral/.symlinks/plugins/soundpool_macos/macos`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) @@ -49,10 +55,14 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos FlutterMacOS: :path: Flutter/ephemeral + just_audio: + :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin shared_preferences_foundation: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + soundpool_macos: + :path: Flutter/ephemeral/.symlinks/plugins/soundpool_macos/macos sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos wakelock_macos: @@ -65,8 +75,10 @@ SPEC CHECKSUMS: flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + soundpool_macos: 3bc0b8b238407516ad9b8afc2647670ff58124f9 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 diff --git a/pubspec.lock b/pubspec.lock index bd7b08d0..73387bb2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" + resolved-ref: d5a7e90681912432443aece929c2b76b24e3557f url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -301,10 +301,10 @@ packages: dependency: transitive description: name: flutter_local_notifications - sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + sha256: "501ed9d54f1c8c0535b7991bade36f9e7e3b45a2346401f03775c1ec7a3c06ae" url: "https://pub.dev" source: hosted - version: "15.1.1" + version: "15.1.2" flutter_local_notifications_linux: dependency: transitive description: From 524435d4daa6aaf1e144ee027119fbbd1743f845 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Wed, 30 Aug 2023 20:06:18 -0400 Subject: [PATCH 15/33] background timer --- lib/start_workout/workout.dart | 544 +++++++++--------- macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 222 ++++++- pubspec.yaml | 15 +- 4 files changed, 488 insertions(+), 299 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index a33d048e..2e274f16 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -3,9 +3,9 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; -import 'package:timer_count_down/timer_controller.dart'; +import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; -import 'package:count_down_sound/timer_count_down.dart'; +import 'package:background_timer/background_timer.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -32,10 +32,12 @@ class CountDownTimer extends StatefulWidget { CountDownTimerState createState() => CountDownTimerState(); } -class CountDownTimerState extends State with TickerProviderStateMixin { +class CountDownTimerState extends State + with TickerProviderStateMixin { /// VARS - final CountdownController _workoutController = CountdownController(autoStart: true); + final CountdownController _workoutController = + CountdownController(autoStart: true); String _currentInterval = "start"; bool _start = true; @@ -59,7 +61,8 @@ class CountDownTimerState extends State with TickerProviderState initialItems: [], removedItemBuilder: _buildRemovedItem, ); - _controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); + _controllerCenter = + ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); } @@ -102,8 +105,8 @@ class CountDownTimerState extends State with TickerProviderState path.moveTo(size.width, halfWidth); for (double step = 0; step < fullAngle; step += degreesPerStep) { - path.lineTo( - halfWidth + externalRadius * cos(step), halfWidth + externalRadius * sin(step)); + path.lineTo(halfWidth + externalRadius * cos(step), + halfWidth + externalRadius * sin(step)); path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep), halfWidth + internalRadius * sin(step + halfDegreesPerStep)); } @@ -139,7 +142,8 @@ class CountDownTimerState extends State with TickerProviderState _intervals = _intervals + 1; if (!(_intervals < workoutArgument.numExercises) && workoutArgument.completeSound != 'none') { - await _player.play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); + await _player + .play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); } setState(() { if (_intervals < workoutArgument.numExercises) { @@ -168,120 +172,113 @@ class CountDownTimerState extends State with TickerProviderState }); } - Widget timerScreen( - currentVisibleInterval, - exercises, - endSound, - seconds, - workoutArgument, - ) { - return Visibility( - visible: _currentInterval == currentVisibleInterval ? true : false, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white, - ), - const Spacer(), - IconButton( - onPressed: () { - if (_pausePlayIcon == Icons.pause) { - _workoutController.pause(); - setState(() { - _pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.start(); - setState(() { - _pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, _pausePlayIcon), - color: Colors.white, - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - child: Text( - timerScreenText(currentVisibleInterval, exercises), - // intervals < exercises.length ? exercises[intervals] : "", - style: const TextStyle(fontSize: 35, color: Colors.white), - ), - ), - Countdown( - controller: _workoutController, - seconds: seconds, - build: (_, int time) => Text( - time.toString(), - style: const TextStyle(fontSize: 205, color: Colors.white), - ), - interval: const Duration(milliseconds: 100), - endSound: endSound, - halfwaySound: workoutArgument.halfwaySound, - countdownSound: workoutArgument.countdownSound, - halfwayMark: (_currentInterval == "workout") ? true : false, - onFinished: () async { - if (_currentInterval == "start") { - startOnFinished(); - } else if (_currentInterval == "workout") { - workoutOnFinished(workoutArgument, exercises); - } else if (_currentInterval == "rest") { - restOnFinished(workoutArgument); - } - }, - ), - Expanded( - child: Container( - color: const Color.fromARGB(22, 0, 0, 0), - child: AnimatedList( - key: _listKey, - initialItemCount: _intervalInfo.length, - itemBuilder: (context, index, animation) { - return CardItemAnimated( - animation: animation, - item: _intervalInfo[index], - fontColor: index == 0 - ? Colors.white - : const Color.fromARGB(153, 255, 255, 255), - fontWeight: index == 0 ? FontWeight.bold : FontWeight.normal, - ); - }, - ), - ), - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItem( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255)); - // // return slideIt(context, index, animation); - // }, - // ), - // )), - ) - ], - ), - ); - } + // Widget timerScreen( + // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { + // return Visibility( + // visible: currentInterval == currentVisibleInterval ? true : false, + // child: Column( + // children: [ + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + // child: Row( + // children: [ + // IconButton( + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(size: 50.0, Icons.arrow_back), + // color: Colors.white), + // const Spacer(), + // IconButton( + // onPressed: () { + // if (pausePlayIcon == Icons.pause) { + // _workoutController.pause(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // } else { + // _workoutController.start(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // } + // }, + // icon: Icon(size: 50.0, pausePlayIcon), + // color: Colors.white), + // ], + // )), + // Padding( + // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), + // child: Text( + // timerScreenText(currentVisibleInterval, exercises), + // // intervals < exercises.length ? exercises[intervals] : "", + // style: const TextStyle(fontSize: 35, color: Colors.white), + // )), + // Countdown( + // controller: _workoutController, + // seconds: seconds, + // build: (_, int time) => Text( + // time.toString(), + // style: const TextStyle(fontSize: 205, color: Colors.white), + // ), + // interval: const Duration(milliseconds: 100), + // endSound: endSound, + // halfwaySound: workoutArgument.halfwaySound, + // countdownSound: workoutArgument.countdownSound, + // halfwayMark: (currentInterval == "workout") ? true : false, + // onFinished: () async { + // if (currentInterval == "start") { + // startOnFinished(); + // } else if (currentInterval == "workout") { + // workoutOnFinished(workoutArgument, exercises); + // } else if (currentInterval == "rest") { + // restOnFinished(workoutArgument); + // } + // }, + // ), + // Expanded( + // child: Container( + // color: Color.fromARGB(22, 0, 0, 0), + // child: AnimatedList( + // key: _listKey, + // initialItemCount: intervalInfo.length, + // itemBuilder: (context, index, animation) { + // return CardItemAnimated( + // animation: animation, + // item: intervalInfo[index], + // fontColor: index == 0 + // ? Colors.white + // : Color.fromARGB(153, 255, 255, 255), + // fontWeight: + // index == 0 ? FontWeight.bold : FontWeight.normal, + // ); + // // return slideIt(context, index, animation); + // }, + // ), + // ), + // // child: Container( + // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, + // // child: AnimatedList( + // // key: _listKey, + // // initialItemCount: intervalInfo.length, + // // itemBuilder: (context, index, animation) { + // // return CardItem( + // // animation: animation, + // // item: intervalInfo[index], + // // fontColor: index == 0 + // // ? Colors.white + // // : Color.fromARGB(153, 255, 255, 255)); + // // // return slideIt(context, index, animation); + // // }, + // // ), + // // )), + // ) + // ], + // ), + // ); + // } // Widget slideIt(context, index, animation) { // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; @@ -368,10 +365,12 @@ class CountDownTimerState extends State with TickerProviderState @override Widget build(BuildContext context) { - Workout workoutArgument = ModalRoute.of(context)!.settings.arguments as Workout; + Workout workoutArgument = + ModalRoute.of(context)!.settings.arguments as Workout; - List exercises = - workoutArgument.exercises != "" ? jsonDecode(workoutArgument.exercises) : []; + List exercises = workoutArgument.exercises != "" + ? jsonDecode(workoutArgument.exercises) + : []; if (_currentInterval == "start") { _intervalInfo = ListModel( @@ -381,154 +380,161 @@ class CountDownTimerState extends State with TickerProviderState ); } - return Scaffold( - backgroundColor: backgroundColor(), - body: SafeArea( - bottom: false, - child: SizedBox.expand( - child: Container( - color: backgroundColor(), - child: Center( - child: Stack( - children: [ - timerScreen( - "start", exercises, workoutArgument.workSound, 10, workoutArgument), - timerScreen("workout", exercises, workoutArgument.restSound, - workoutArgument.exerciseTime, workoutArgument), - timerScreen("rest", exercises, workoutArgument.workSound, - workoutArgument.restTime, workoutArgument), - Visibility( - visible: _currentInterval == "done" ? true : false, - maintainAnimation: true, - maintainState: true, - child: Stack( - children: [ - Align( - alignment: Alignment.center, - child: ConfettiWidget( - confettiController: _controllerCenter, - blastDirectionality: BlastDirectionality - .explosive, // don't specify a direction, blast randomly - shouldLoop: - true, // start again as soon as the animation is finished - colors: const [ - Colors.green, - Colors.blue, - Colors.pink, - Colors.orange, - Colors.purple - ], // manually specify the colors to be used - createParticlePath: drawStar, // define a custom shape/path. - ), - ), - Align( - alignment: Alignment.center, - child: AnimatedOpacity( - opacity: _doneVisible ? 1.0 : 0.0, - duration: const Duration(milliseconds: 800), - child: SizedBox( - width: 300, - height: 300, - // color: Colors.green, - child: Center( - child: Column( - children: [ - const Text( - "Nice job!", - style: TextStyle( - color: Colors.white, - fontSize: 45, - fontWeight: FontWeight.bold, - ), - ), - const Spacer(), - Align( - alignment: Alignment.center, - child: Row( - children: [ - TextButton.icon( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255, - ), - ), - ), - label: const Text( - "Back", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22, - ), - ), - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon( - Icons.arrow_back, - color: Colors.white, - size: 38, - ), - ), - const Spacer(), - TextButton.icon( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - const Color.fromARGB( - 133, - 255, - 255, - 255, - ), - ), - ), - label: const Text( - "Restart", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 22), - ), - onPressed: () { - setState(() { - _currentInterval = "start"; - _start = true; - _intervals = 0; - _pausePlayIcon = Icons.pause; - _doneVisible = false; - _workoutController.restart(); - Wakelock.enable(); - }); - }, - icon: const Icon( - Icons.restart_alt, - color: Colors.white, - size: 38, - ), - ) - ], - ), - ), - ], - ), - ), - ), - ), - ), - ], - ), - ), - ], - ), - ), + return SafeArea( + child: Countdown( + controller: _workoutController, + workSeconds: 5, + restSeconds: 3, + numberOfIntervals: 2, + build: (_, int time) => Text( + time.toString(), + style: TextStyle( + fontSize: 100, ), ), + interval: Duration(milliseconds: 100), + onFinished: () { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text('Timer is done!'), + // ), + // ); + }, ), ); + + // return Scaffold( + // backgroundColor: Colors.white10, + // body: SizedBox.expand( + // child: Container( + // color: backgroundColor(), + // child: Center( + // child: Stack( + // children: [ + // timerScreen("start", exercises, workoutArgument.workSound, 10, + // workoutArgument), + // timerScreen("workout", exercises, workoutArgument.restSound, + // workoutArgument.exerciseTime, workoutArgument), + // timerScreen("rest", exercises, workoutArgument.workSound, + // workoutArgument.restTime, workoutArgument), + // Visibility( + // visible: currentInterval == "done" ? true : false, + // maintainAnimation: true, + // maintainState: true, + // child: Stack( + // children: [ + // Align( + // alignment: Alignment.center, + // child: ConfettiWidget( + // confettiController: _controllerCenter, + // blastDirectionality: BlastDirectionality + // .explosive, // don't specify a direction, blast randomly + // shouldLoop: + // true, // start again as soon as the animation is finished + // colors: const [ + // Colors.green, + // Colors.blue, + // Colors.pink, + // Colors.orange, + // Colors.purple + // ], // manually specify the colors to be used + // createParticlePath: + // drawStar, // define a custom shape/path. + // ), + // ), + // Align( + // alignment: Alignment.center, + // child: AnimatedOpacity( + // opacity: doneVisible ? 1.0 : 0.0, + // duration: const Duration(milliseconds: 800), + // child: SizedBox( + // width: 300, + // height: 300, + // // color: Colors.green, + // child: Center( + // child: Column( + // children: [ + // const Text("Nice job!", + // style: TextStyle( + // color: Colors.white, + // fontSize: 45, + // fontWeight: FontWeight.bold)), + // const Spacer(), + // Align( + // alignment: Alignment.center, + // child: Row( + // children: [ + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Back", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: const Icon(Icons.arrow_back, + // color: Colors.white, + // size: 38)), + // const Spacer(), + // TextButton.icon( + // style: ButtonStyle( + // backgroundColor: + // MaterialStateProperty.all( + // const Color.fromARGB( + // 133, + // 255, + // 255, + // 255))), + // label: const Text( + // "Restart", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 22), + // ), + // onPressed: () { + // setState(() { + // currentInterval = "start"; + // start = true; + // intervals = 0; + // pausePlayIcon = Icons.pause; + // doneVisible = false; + // _workoutController.restart(); + // Wakelock.enable(); + // }); + // }, + // icon: const Icon( + // Icons.restart_alt, + // color: Colors.white, + // size: 38)) + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // )); } Color backgroundColor() { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index da6221c1..f55399c9 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,14 +7,20 @@ import Foundation import audio_session import audioplayers_darwin +import device_info_plus +import flutter_local_notifications import path_provider_foundation +import shared_preferences_foundation import sqflite import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index d9ed273d..a44aa334 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,58 +37,67 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" + sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.1.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c + sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.1" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" + sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.0.1" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" + sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 + sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 + sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" + sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.0.0" + background_timer: + dependency: "direct main" + description: + path: "." + ref: background-process-intervals + resolved-ref: "4c4de47066e4a94801218a2172d5ca2c45b511b8" + url: "https://github.com/a-mabe/background_timer.git" + source: git + version: "0.0.1" boolean_selector: dependency: transitive description: @@ -134,9 +143,11 @@ packages: description: name: collection sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted version: "1.17.2" + version: "1.17.2" confetti: dependency: "direct main" description: @@ -153,15 +164,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" - count_down_sound: - dependency: "direct dev" - description: - path: "." - ref: master - resolved-ref: "63e15af4e1c562c6e882623d11a77b51fb854d45" - url: "https://github.com/a-mabe/simple_count_down.git" - source: git - version: "2.2.2" coverage: dependency: "direct main" description: @@ -186,6 +188,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + url: "https://pub.dev" + source: hosted + version: "0.7.8" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 + url: "https://pub.dev" + source: hosted + version: "8.2.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" fake_async: dependency: transitive description: @@ -215,6 +241,48 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_background_service: + dependency: transitive + description: + path: "packages/flutter_background_service" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "5.0.1" + flutter_background_service_android: + dependency: transitive + description: + path: "packages/flutter_background_service_android" + ref: stop-on-app-close + resolved-ref: c16905a587edfa2f7bd74423d6762a9372c792c4 + url: "https://github.com/a-mabe/flutter_background_service.git" + source: git + version: "6.0.1" + flutter_background_service_ios: + dependency: transitive + description: + name: flutter_background_service_ios + sha256: ab73657535876e16abc89e40f924df3e92ad3dee83f64d187081417e824709ed + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_background_service_platform_interface: + dependency: transitive + description: + name: flutter_background_service_platform_interface + sha256: cd5720ff5b051d551a4734fae16683aace779bd0425e8d3f15d84a0cdcc2d8d9 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_fgbg: + dependency: transitive + description: + name: flutter_fgbg + sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" + url: "https://pub.dev" + source: hosted + version: "0.3.0" flutter_launcher_icons: dependency: "direct main" description: @@ -231,6 +299,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + flutter_local_notifications: + dependency: transitive + description: + name: flutter_local_notifications + sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + url: "https://pub.dev" + source: hosted + version: "15.1.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + url: "https://pub.dev" + source: hosted + version: "7.0.0+1" flutter_test: dependency: "direct dev" description: flutter @@ -310,17 +402,21 @@ packages: description: name: matcher sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted version: "0.12.16" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted version: "0.5.0" + version: "0.5.0" meta: dependency: transitive description: @@ -441,6 +537,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + url: "https://pub.dev" + source: hosted + version: "2.3.1" sky_engine: dependency: transitive description: flutter @@ -459,9 +611,11 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted version: "1.10.0" + version: "1.10.0" sqflite: dependency: "direct main" description: @@ -539,9 +693,11 @@ packages: description: name: test_api sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted version: "0.6.0" + version: "0.6.0" timer_count_down: dependency: "direct main" description: @@ -550,6 +706,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + timezone: + dependency: transitive + description: + name: timezone + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + url: "https://pub.dev" + source: hosted + version: "0.9.2" typed_data: dependency: transitive description: @@ -630,6 +794,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.4-beta" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" win32: dependency: transitive description: @@ -663,5 +835,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1ffb09d1..59068d2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: sqflite: ^2.2.8+2 uuid: ^3.0.7 timer_count_down: ^2.2.2 - audioplayers: ^4.1.0 + audioplayers: ^5.1.0 confetti: ^0.7.0 sqflite_common_ffi: ^2.2.5 wakelock: ^0.6.2 @@ -49,6 +49,11 @@ dependencies: coverage: ^1.6.3 audio_session: ^0.1.16 + background_timer: + git: + url: https://github.com/a-mabe/background_timer.git + ref: background-process-intervals # branch name + flutter_launcher_icons: android: "launcher_icon" ios: true @@ -81,10 +86,10 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^2.0.0 - count_down_sound: - git: - url: https://github.com/a-mabe/simple_count_down.git - ref: master # branch name + # background_timer: + # git: + # url: https://github.com/a-mabe/background_timer.git + # ref: background-process # branch name # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 6f636cb480582e0053cdc23d69066f50db406f07 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:46 -0400 Subject: [PATCH 16/33] iOS release --- ios/Podfile.lock | 31 ++++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 12 ++++--- ios/Runner/AppDelegate.swift | 2 ++ .../Icon-App-1024x1024@1x.png | Bin 59641 -> 6538 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 551 -> 128 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 2081 -> 190 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 864 -> 136 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1973 -> 188 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 3215 -> 310 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1245 -> 162 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2887 -> 286 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 1619 -> 180 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 3673 -> 350 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 1921 -> 188 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 4223 -> 382 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 4507 -> 395 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 6849 -> 598 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 2561 -> 262 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 5461 -> 469 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 2725 -> 278 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 5847 -> 505 bytes .../Icon-App-83.5x83.5@2x.png | Bin 6376 -> 563 bytes ios/Runner/Info.plist | 17 +++++++--- ios/Runner/Runner.entitlements | 8 +++++ 26 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 ios/Runner/Runner.entitlements diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fb6e9e77..b1317a7f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,13 +3,24 @@ PODS: - Flutter - audioplayers_darwin (0.0.1): - Flutter + - device_info_plus (0.0.1): + - Flutter - Flutter (1.0.0) + - flutter_background_service_ios (0.0.3): + - Flutter + - flutter_fgbg (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -19,8 +30,13 @@ PODS: DEPENDENCIES: - audio_session (from `.symlinks/plugins/audio_session/ios`) - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - Flutter (from `Flutter`) + - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) + - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -33,10 +49,20 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/audio_session/ios" audioplayers_darwin: :path: ".symlinks/plugins/audioplayers_darwin/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" Flutter: :path: Flutter + flutter_background_service_ios: + :path: ".symlinks/plugins/flutter_background_service_ios/ios" + flutter_fgbg: + :path: ".symlinks/plugins/flutter_fgbg/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -45,9 +71,14 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_background_service_ios: e30e0d3ee69e4cee66272d0c78eacd48c2e94aac + flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2d39048c..28d7f691 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4120B7D92AAA855B00D767CD /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -68,7 +69,6 @@ 46552EC1EEAA2C7277B67E6F /* Pods-Runner.release.xcconfig */, 09D2F883F979A99EC4DD64B5 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -105,6 +105,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 4120B7D92AAA855B00D767CD /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -358,6 +359,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -366,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -487,6 +489,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -495,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -510,6 +513,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -518,7 +522,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.codepup.workoutTimer; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..c08f76a9 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -7,6 +7,8 @@ import Flutter _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + UIApplication.shared.beginReceivingRemoteControlEvents() + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 6c0b742e1e9a9ae4fb4120ab3cef800e6f6f6556..605d09e41086679f9f57c6561c86ba0e7e98d3b7 100644 GIT binary patch literal 6538 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGmw%jag8Vm&QB{TPb^AhC@(M9 z%goCzPEIUH)ypqRpZ(583aCcM)5S5Qg7M7_M_vX6fdd9|KepGbP*7PDy5ak`SuKYz{QwayzIY!MZp>q^C)cfx(7F=-*${Hyof;>gnp|vd$@? F2>{Wi)jt3L literal 59641 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

rpTv%S+;gJw83 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 k2H(TMc54{^|8T%bFPGQ0E2m=!WA^iX RU$zGnD2 zYbgV3uonZ9upsdUf>Kidk;@DTPHGJOQ?D`FT?d$AHZT7q5=%;EX+6!!)qW6urV_;=mWh? fEEopG7pVXMsXvait+{o|00000NkvXXu0mjf;K@Uuii`{j0t|*Mf3@ue1%wsyIJaFtv!?&;^~Tvvs}^Xj d;97;7;tNP)o);c|U5Eh)JYD@<);T3K0RRYfC076d delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index e6c6ce2a39955738850032cee4c1bc71df3f4a35..607d2f8a2294f2c40385626a2e3ec33072bbf472 100644 GIT binary patch delta 125 zcmZ1|u#a(qM;Swcr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAz&Yd^^q-%zbEe oxU}sx&vnUl#xdzT&XFP@`(YaMyTsn29tI%rboFyt=akR{02FLG1ONa4 delta 2031 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 delta 805 zcmV+=1KRwE0pJFZNPhzYNklpHC z9+VbgGg{1b;Q^k|Y#uN+Gn)slTP`aPlp4`gOysg7bWuV`B?swxO6fS|fBvkM%_*ID zV12gVgWvD>-}m+Z{rBJZCw55TA4mMx-~c*+%BiStA~C19 zzMf7*y*`$X#wILDX;@OyQSaD@;H>T+blq+XXdse5Qfwta2*jihFP!by9*_{9N>kf6dA;yM4RzAPv&U+gYp1SVROdFB5gIjN6LlQ9 z`?Pbt*?;nlw{>Pt7)!c6ziNs2V|ylqQ}%giOEs7&6|C`BRyb?jddB7eW&;haJVpVw2#o>7I9z_EzgY)H)^ zGSEjlv4Qxd1`_g0Y1kVhH;%NDauV`iaWZlaN`?JX_6oJdRjndnd8mA)txdj-MkP|! z(9FYkpQJz6!W^GbTv!o`*bA`Ns4cb=N9zOR(Pp*M*lJ;jT8T=u-)9{{yGA87ba$6O j#~vI)9nApx|DoRjH2VJoaQuT^00000NkvXXu0mjf@R^WS diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 4860af6d30dc76ac718a1820477580495e21e2e9..4ccc1b368ab65af2561177ef2cc1dbfa11a05eb4 100644 GIT binary patch delta 123 zcmdnWzlU*xM+rlmr;B4q1>@WEj=T&C0tXD_er&JV(U7u*YunzmwAzIId^?V2^j?%& nZ0eTXb4_BcVN~*#W5f&ad0R6-Gm_jc&j19Tu6{1-oD!Ml3=R5y7SL!6d{{YgiHsD^tP1M!kCV%Q`a1(VkxQV(N+(cas zZlXfsqeCb0!NC)4)};-O#Pa0foo>TDA!@O6XtLPatTU6kdjWUo3I%%HP4W+eub&hb z&on`Q)eJFb#}sWTg0%|xD(rAJ8zJ&kb*demM$~3^Aa{K=wtaRMHDv}29Hl{2oFDun zY>-HR7;hsytAEPCEm?u)w--Y?b|mEKGa!kK=oEW8h3Ju@T6~#W46$8=$uIZ8=qI&M z`^Z?Gb)>fV18o}j5D&J zTK_r3;lhv=jOeobU$NojSsc!M9Q^`)**Bxrj+JZ5uyO7==o@ZsFG@HNhx4udM8xAE zPw3F^y?^0QMfgCZP(b*WR{ezgltR^ml}pnq9sg;%+v&HgR)9VR=9pWXwhrwkz} zkxYz~Z)d@j`3CHT#cU1p0dJyPeyc)dqaHszJ%N>*ELNm^v-c*+KhZdhY$fILcD>pP zCs6!ME_~vGp$hkgWMn+VgJNJ?ySeL$t~y$Zv>`f#`+2eQ!u>@!+o1nP8%r<;LtiUA zD}UPd>fd44TXAa6Aq@R42_lgQiuCC)WzU22x*j55@4L2>7twly8F^K;SUO=CD_=8N z@WqkRHrqCgFhX4+zwMZQBf2AGQXi(`lqmHoluFo-9EWWDn7g)>7tw)YIT&sBHrrZ)I5bCE;c-UxuR2Ar3V)$9qM%KShF6RRoWqGrdINg+ctRwVLNcHq z9HkXNR}n3%yM_V5-Pp`i{8W9V!}ipx0cZXUKhi~$7>@9a0SHR&4Y5pu8bWUQfg*f$ ztelMNkMC2*v8G~ecQ`KB@iCPj(W@kMJ>@c-sHtb=%3Idvt*{1i7&GOh9*mmk1Y(&K=ycKe?)^C9R0_!H1Lv{TIA5-}ewQ&yAHW~5Oo?lp* zuF;OriwM^0MWY}l5ui6)v68Ik)xVVCB-xH`g@xmgu{9r@(}8$Sj+n4sNabNGFQU|& zp+0JCojI13C#}nE)94n|8B9#TRDUulqCVM#8Zt@kp__*S2hty7@6T_`M;@8fE+ZQ5 z=ZW2?|4Qd#g8ZXQSXcy424v} z-s#xm`fA~$ynV9Kp{=}n6J!sM!Jy?^u&3f8#z$%~bzlT`lvm>$a%8(3j3ozy7axdb z??spDvAN`T(BC93YsasMTG_WTmhlOPM)&n6vw5JVCY|Dk#w;bE3yO zD<{MG>&@)+^W*QAv8kjIm&tmZ9p4}GiRXPiZht_(Q*_D&HhT@(1;m@LkBVhiEnCU6 zuBZa_BxL^%Z-opA;X!zftYtbGew{$D1)ciug@$VC;7ImRk!dhmTFFvUGy@VsQU43> z+21ruh$^U1Dtf1I|2A|rxQV(N+(casZlbORH&IuEo2aYd4^=>z%vxnIX#fBK07*qo IM6N<$f|!k{?EnA( diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 8183a27696e1c7abb69d3e5a5e9f46b1c436bfaa..78d98e53c4ca66cff2df10c8d95c62c4e37e209b 100644 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVx1|$nl+{^(|k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu-SBjA45?szd%=;D!GPz$0ozyii+&`L4dpNJxkQhQzpxReq``;^>bP0l+XkK;%|Tz delta 3174 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 delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index d0fdab3803329c0426df043ed06a5e3cbc762d7a..e779e1a17de31849fde9f78356509602e97ebacf 100644 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>Bu9q@E<45?szd*L7_gMz>T1NnFRKkaO;?U>*buh+ delta 2844 zcmai$XFSvo1HkV@_Fc9(GbsuuBYVe@bvY|_IP*{TI`b!I6UvG+itLq@bs{6X!kHnI zoqZ?{&-3DW`8=QJ`}X_!d|!X_DEin_5CGkVu9i9q3*N@l8nc>n^*)RLG%-f5teLdtO1P0+8~V16Ci|E@~isos~Pp{eQQ>R7Um$-p*AYjUCr6dgwP zNSmwJ-Q$F&Q#iPCOmD0E#MR_y` zTLK50v<|8U=BmX}tyGVg`q9v&=42oCVl1De2cqa31QO*tM}x?Z z$4z&STtMgao?cCfzEiTC@IF{myzZ6g;%{Lc606ZLnkhD1U3_nIi^jqKYR_lw*cgMT z28@dS6ur%0f5Z||eqHsH?i4U;QdbCMfMpEhgqp20iG>eAt85dCKU+9bfO0N0Sd>t! z%w?Cq{~V`*@yc-zrpw-$)Zo2O=Q*mztk$|4iAz~-tc`+9B03QK;Z(MH?$gKLv5~<6&pL#bJ~@y1!z{+DD`xkp zxMYF82E;aD#n?TN?^TMLl}b=s9e1Y@4Pk=%5q$V7OANa~RK>xkYBN-2@BVqO9Nr?D zT>02}SK21MmeSAz@W74r(QZ0RU`N)ek75_D#cBNx6l}RNUUgHm3)$f<*6_6|!ez}7 zaeA`Sj`jyPA3c#p-`LZ3AzZs8qev-3caQURC3+_tTM#PP7;I*Sw+^QO4$^w>V5maf zbjt@{vo)qB`b zn67pWuio!0)d31L?o({~nbFTJmKhqk%IImK4?)UYOT?#D8mpT^tk2pK*OiUBB#lRQ zG7aJ%jOS;lUoJVWPd*Djs6PrpC9u_iHZpxGpgE2j8GM&;-aJZ7y=bF?(or{44gpDV zJ3RY&P$?jBTd_IYvcPPs(OlH?o+CAe*|A%uoWn}oN}40OZ~zXIf397ZW&m>=aPOPsPIG+9}?tP&>%-v^MV}gO!|#(u|d3*gU-DH zyfIH1E;xR0vz9rXwcU{vv)g5i)hDV6g?$6-Vg$2_B)10(ufUJ|Me1Qi|6ETUqb*$Z zb}bj?wG2&?OZDfv!}#tzgCTNv*;B4rWcr{k_-NW&mZiSy%C*@c7_>7Gc2_`pZfp8-~)6|Coh6Fes@; z%IhbL20=-_Q=Nx#pg-a?cKkryNpppR(y4h_R_V7*u`eSv1lL+IZ=qE+kHEyL9{SEx z?Hg&oMv^aF`09p+7X^dc0yeqE1RhFxmAu+H^YcDNoLkh$#aqoyk$=x{s$- zP3rfa&YB)*lvm}@7O#AToH$MPzN<)vbG=E^8{v1miw2dmc{_76zD7iQc$djr&dyvS zkLRN*EZA8FD{H0$=oH5ec~9r~p&WNZ??%p}@tzO?ak9Mw7F>$N+jY41ut#CDUj#-5 zthIV7Y($R?-Y#1wwg6ST53KD)_P?0m$O?WhV%Q`=_&c6&-{(+qY7+|D^e)0bH8l#o z8%o+gacq)cGlegxb|vJ`D561-!z23);^J36jA50Dm9+df>dT;5o9yxSbEUWL>D$F$ zzdiX9g9RfF!*GZ@bNE0OYbA#WeGG4gveD<>kSkAMJkM&|&wxQ0W)9KUwm12f#j@Zx zP`IY#A_0LD*#n9YsJe8_bVJ@x=U=QPppNnjmkJ{f&|Sflera*NL} zuJ$!WVM0@OO*^hj(|^@!`}Zea=K83ycS?3-Z}Vm(EcSz}+_)wAy^eR?QdCyXzQpav+zQYgxBO>5iJfDAy*B%x8%^o4f9~`>Gmnv7&z1-4n;h;`Y2BNkU4+ zg0)MosgSpsC$F`w8S;+@kJ@buw1skOf&n1{oF}#EJU)O$Vi|*!|1b<=w9e#(!oFwr z_>h`%R=qe1YYs`jN83 zMeyQ4UuTbI>k)S$<_=|~O^lL4*;V8NucuQAGG@sd@xA^Z1J1yEBB+wu9jx(LZg*&;qrg-(ui*zls>pa-c3znSG0xVoSgCc5$13if< zAM+I<gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 delta 1566 zcmV+(2I2X%0n-eSNPh+ONkl?0wPdEg^lvsDhx$M z%{D}h&PAMaE+AXxwrHlAi*9b3>9WN*vyH@Q)XhiK;HHj|O~t7Q$U`F!K~w}4P#$B_ z+Q)5o?p4g9z~-gYX6ZkMq=3~#H4P+)^3WIe34S713+0{xsU2os_~zq=TedW2oZw+l$k z?M}S8wE&aKmDrG<2*1!F58KSS&47ggrF#~XQUOt7JZwwffNAFe=;tnhBy&E*3uZ$g z7?{fq801{jZ7xD>oF0#bD>M)9ceEQ(db$la%jJkOcYk4ssT#v#ec>KD3<8-HGz*aW z0`!?HV7uK0dRf-f18Kc$z|39w_-4j<%pMoa-K%fw!dGus;@E*^FlHNQSg{V*Ny|m9 z-IKsXY)HiLWHqQDHDo(C5m#FRDs&{oX{n9}VNb}54-{Zd|bM@G6$|+eh7+LVtKA`9m>54f?Hx=$<+sR0qK`!2OAzXbP4WcsH%;ti0OOG()3yB~p=Li@=k4utY2drVXWEXPhm zGB53kZQ=#;Tm2189OVZ$u?X$@d&nhg<54m0Hf~m=MUSr)Y2Z)RijTm8=rB;hfv}t{<6{y(kmkSi7($EjL&aqjHMaEmoK>&^)k`1sLtAF%@2Q7j6t`XsedyWHPCqQqqpoIY4HTJUz zh}JEO!%za9Q(TRlqH2_r*?d$T1|uq4J5VZ?p(%Dew(+ou7l@aPMyR(Z-cO9gKJsO^ zmDcw8?1?KkIgll}r}}&*g{-%%gb3^?t3_#-17}2|kfXAto%d`#j8G9h>bzCBw7hWJ>pmj|8?P;!f&k2GXvwGRSEUTq^jnHy;|^Dt;49uBH2HG7Uzvy(x91^3DMzfo557** zk=gO(QkFWB&i5v@r#se6iXpQR#vP{EbSE?S4+1d(o^BGygRs*2DLCV&Y=1pUpi(fE zxLHqHU)a!s6IX9SPKoC@%_0Pj8l1`C_5eDK5~1Q zV81F#;IN@Mm@$P*D1Rh}tQC31s3K_xo6fLx1@@@IZgxpQDjZsnia0gDlVD%6dtED1 zHJrP8)Kghx!|FgQCH-m8i`Y`JW9sCtYP_?_1>$USfjFC7AkHQih!?ZzZ+eRYD(M4q Q7XSbN07*qoM6N<$g5ebJ2LJ#7 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index 74d85b586aaa7badfd74a51db3801b33e32a771f..de24e4f8c1e494bd6947181da9bfc68ef2df492c 100644 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^DImm^Z$(?QHDYfuYDdM29qX1DwOXUGN3Dh;sN3FK z?Y&nO=+&ULQy`4?@Vr+$x;osx)%=$@vAis9e1`F{b({<_C}74`Vf)10(>`-wf&K6JN>c@5?007`o5J{|4_9}q zdz3(;sx&>{jvGYVt&?gs!crb$5z{tzC+MuIn)GBuJ|3?Wh|3 z4jr<-lM zqfmH=^q@AUOK78N2m3)}$wUF&i=<1e-+&xpEaBGwL)m4`ukl$eR$uSaSBD%^t5ATq zms1gQ-Lu3r;G=jN;e?OQ!;17;wB~eNJ4^pLSgB%AdCZvG-0T&54o7Rvlt}G$So5QB zb2OSKpcO4o3eVAh;ZM~glH1wG=E@=oxe>;^-{0^=(|LPGYD}}W=MtgjI9%sNHYGftyFrv$^&Ni6#~ zEJ(uTAV4~di^ZRE8{EL17shf%!<0N)D0^^OT2Liwa3}BRI%yjk-li< z%xvW`0g_{p9Eh(t+xAO~cC`P!mxCh6Q&BITZ1sRxgDJa>YGyrvVcrDn`X6FhY~TY< zK3LGnwTI5ZeBJa_Y&T6*Rdtj9gOnvb4yHRVY?OHa4RGi&DCEI+`4zFgKft@KG1YQP zvk)vLVFTqqS;2EC)8>$US?WW0$l^JB8CSGGtjD<@xI9Z#c`2UVn5pD2=A4-$J%q|s zJy5VouEYPiKtuOM8_!VZGMq%kui3T&GSx}Go#veP$4Z8T%MC4ZVHEhzsiv|Kc)+FA zwIJL`=teJ1U7Liz-*$jEfBUB8@>_xG2tN73v{b^h2>8B|dfb2|nbcNL$>>8Se5+5s z=;q^LhzQ4mL{rLdLXbxCKn5ipe5_Z=HXvrG`97b1qT3afD@dBjM%_tTQSl=s+Y!?_ zp3eFOHNNdb2v_rm2FFRD;C&O>e>)n}4N+8HG`zmSkJ?*eLzU6~iAj1nfR1q&hx!B6 z{y-dXcY!It95M0M5Lbl-Hu?%zdJIymUmb5EP^V{-v+Dt-{C2ytF{Azw9u)OaSMHo< zL0p$H;Iyj8RYVj^@Xb1eWUA(ppws=Q&BgiLU#!| z?+s)y&;y+)nsXkh8N1iG8Xm_Up8Ar*i`=T8?7X>`&KHQnnb}cD?HgS_;xx2S2>((l zPEy9|vOH)&yMP!MH}3Z%jqGI`a+@dK%CawOYMHRS4_O{P@eq{Y=JiyTR(g7O1f=DO?0KCDi^qa(Q~g)EgyN!73#qJuS%}%hWgg#3m;}0Ewj%_N={cyL zv_S4J-da9xr0Rb?3%r^|zRJPzS3c30YoxYGOO<#vepPUpQHnEg78BYR)5480|B_0c z_=no4O}OQZ{;hodTg0ABm%@7Uk%LRna8gO9Gg9W9=og@wDb@)MSz?T*psGwO!?IjA6d zDdpYz(K4Ul()Iw7RXZ^Ow1o5u<#Dgve(Z8VtVZ|9`_6DVQK8wdU2 zo=yfGLRpM-w29&ShZLI$dk&%rGI={&G}%iEg2@)Z}3YcPW zR^KyM_L^!+&zxBGk|Ea|;az#bMQJU~0A=?E>SJ;3lZEo)_Vno2hr0j1oGW#X)qJpz zt%u|mJL6`mEylPiK>(4|LP694ee)V{`?lPYyo7a4YTex5D>_&!np-*^sbi-oH;Q4) z&XMM`Xd4)FG2Y=aD2L{{UK~!zbvc%81djwNY{D}f|J0F|>TNUf_nrV{xi3)&d| z;Gd9LNjXZggU#WFEq8wFxX5QFj3L+W$pnnFSWnmQKj2CwV$o-eJns~<2+^r;iVz8t zg6tCNWXjBN$~R97O&g2v9l3haI0=c&WPV>YH8z_s@O2;w7IZ+Cf+czJRqaIB>fRIq zK$-j}Mx0aMMB`JF*Ds*IH!nzCFdUsh7CC;{KKc+79}Ze7SHUmN&gzYQ+vjzR6C@=$ zeOn}YQKD7_n&}x?6Um68-J4%HRa@HW<0TRk2W4|p*SES`edd6VQV`@$%%?2_XfVUA znoMqD`W_CD`8BjKp<*JMvu~M7sgwd5OgnSGTD!N0U~0qr!+=VWXjVnavEy@lb6VjR3+^?-&L770o^Au@Ava0}w z(JcIHb`vHWEqx^y9ldVzWuDhbMHN+zR|6;yJ{P&~c3%4@T|*0Yj;pRL)tEt{XMapx zsc^`+?d^WX4yM=Ri$&U#Vo$&26-tACkcTzT*H4ozRph{v7|Z9s{25WSBYqxMSbI>wXp z@=9w9z@=2sGTihMWa|2g+i&N&ICe8w=a|kt5nv4!ZXWTRspG6g_;sx2*|oL?1EaU{ zlC)^!c+>#1Q=gtVcVZAz{@~2G(a$y)O{n@PnbhSW_|?^hns~}h3vP0D?b?d4F?G8v zE3vcHy5+B<@sTDU*R7tR8aMqNguFn*{W~!?I>8gi4}~y81yoQ4_G&-zDnPUSvxwI# z`rw{|uQrdtT<-@^(!D*5C11cHzOIftb2n|Qu!lc?*wx`fI2r!^hI}sk)80iXW`zp$ zeY%CmP9>@;-Y8!z2~}tF(=ny8LCQ~l%6iR+SghVcEF3y2kVD45B}^ZYHg3b^)wxj> z_Qt1t!cqdVsXHwn%$P6TwK7)*Be*Dj=m_DW?FQ-ZkIn~2H_owHWHt5~7cv@S1k$-8 z3v`gA#DRJZ+%*Oc zykEj)v9(0{%8}W&53j_%jEo>6Ng?_Xj%^o84u#_8Gnz*WRvd_QR(H6Lib z%D)P8@rP$M^_5uu(9z8q4;~osBNpQgE9{j};^0xnQWml3B32t6mXEt@UA`Tk2!UYF zJ7mVbWX{CCOT317KM;rU^S6x)^JPk$HZ3Eg9*B98>np=*%Y ziq3iQ8!$dE0wC!-EE@u`HrMGF+hXz@F)CI%YM2YsR(ORpL1vVd3DvH!>kp(U@ca*0 e^k0GMLdm?BK%4Lt;q;dki8NL9RLY^2$o~U2o`h;=K7v@I>x3+9z00K`}KbLh*2~7ZN`KN)U?piOu#&VCycUw# z#bq#>D3M#cI)M|5%=-SmBaU+mtm0zpacy?PU|n|5RJu+~_xCKOUR*MDdX7ous@C-(D(a$y1*Vg^7z zb3Tk0a-c{|fJi1x))kE8f$O&ry*?F721Q_U*EUc3ON#YK+L(_c=|#AftwZNBUkupr zGgLlyaE@#a@3Fyf=;-#)7^19d>k3rIe+>Ps`A{sGD~O_kkkppx5W8_V=JgGELa@$Y zz}NfFVt?ysEsVua#~RUq23<8Oi^!Exgd0mT;St*s?SJYGxw{R-K3-6*S%mw;r=V`t zX2>Ux;cXvpk~D)(_~Q^F{X8%;@}Vo1)zsphb!j-Fy#t313b^mKZE}t~+jCKV;x@Xb z#lkMwnYgbH6mw@lKl>|4`}cs@-Ke!Av(Oh-;l$h9(f!nDC_HQ+9oP%?TX&)M$6ulRehx1id6P^$l!Yl_ z!D#Ma!|uOGKlOwl#RKw&((oF%r#G!8MGYaEHDwRFBn@Fzf{eIo&BRY(yn7E~SLau@ zk$)G-JQ9nCZ`{V}VLjOWjnYc|aP&f>aTSl%tZZ6My3mxQ=0SJ040eH}a1ZMQk&6== z_8f+6WXvnu$%|xKP62}5ozT+7f!(h>c^UOaW8;C`BQ?`Zt7+5H5xx^O@Qx3L+*QT; zXlCU|#x-PQ0dI5`FMTyAxp+zdKZpGMp+X#s|BO;$-1nlVjuB2f)o%fkQVu(FZDA>F0^%$1gE8WgLf59Riyq z`Cl=T%tJx{jC~~DzwFbA*L=K4_6qP~3pgbmhqZXLA_cU@!UOgMS6Mxs75E{hV z$MTC%Sa~0VTdVn)$&aK$!eLxU5EdQILQJq9q?{P5NcGcuRq{(Sttl)Y(j9hk8Eeyd z;SRT_IQ+6E2|D`#Qx+dhVpc*N4^2=*LB z$$dS>{eA#5duT|~apG&DFq`ISWLY>!3iUy2Q?YO2V3zV}e0Ed2la2EktUr?r-E)gQ z1$B3-K20nwn%T2HU2PqPtWSg5(Uxt(g@7O=#bo)|IHEVA*QFxzmw#PI8rz>K;AL-v zWhBNDqrzAcp+rxRLSTGoYrIclnHCbZ&zzp;mservhIH26J$?|2aUmes8IMXTK}!5U z7K})8$b1T>gbOiZ4%=Vc;P85sp9K^1wx_X?yT?%cv4%PJyL`QK6ya{2AM>9B*ENpJP zmJdEuy>OCg>GdXH{d8w3u#&VCSV>w6tRyW3R+5$iD@jYiKL}!EE=i>kgcyqV(DCY@`?%7!^ES978G?-(Eb($)F%`z(D@p{!cqw6sDy#Ienis^XT_) ouNmGM7#%vnp{(4~GXfbFueDf?CI8s>5*VNip00i_>zopr0N5gmQUCw| literal 4223 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 659861a133c6b9e181340cd7621daeeaad1d3638..d962862e5363957733e2866cbfbb8512f90ee73b 100644 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b$r9IylHmNblJdl&REF~Ma=pyF z?Be9af>gcyqV(DCY@`?%71(qWzq}gjC4lq=O&hWr;9|U07I9-)78&qol`;+0A$;irvLx| literal 4507 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 xVS_$(Qy(u}Q@2%OTyyC;0yS4&` z`Z)^uiK}St6r?Lpeb7Z24KwmDS&U3QQ;rp00i_>zopr E06x#$mH+?% literal 6849 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 LT1l!}!VvZ!fgTlF diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index e21dd89a0af54c29ff178240114980d56a4db397..ed415b95151ead978426d83e3558293fc6f35d00 100644 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+>But?+bl45?szd%;kUK|$bv0o$MGI*|g|L=TZKyRM(nS@-RA v!+l8+9xgW4<|fC33lahhG$aOqTfi`*f<^9otK1==n;AS^{an^LB{Ts5#FR{; delta 2515 zcmb7`=Q|sU0>*1sS{h=+9#u1xqEaz(jHcE(sI6MHTbrugh|z>viQ0-r96iJyu_+-O zqgJ(Q2d!AqQd*?WxzGIr?sMO7@AJIB_w(;LGm0%AL0y?7whG_sFMTPx<-J5#K6tj=cHA9Jr<)wIUVQR` zKnh&3Kq7z`mfs|~Sy50RD;55~N|bGB5e^WO6S|i~Ig4@t3tZ;XoE8iF)1Ix;s;RUN zf09IzL7(K)0@`l}sr~14(-wteoKnfKVfikbjIC&ZPAoprp~@JK5Muv%vmcMF)gs>W zoY;N>OdjY8$?y`q^P!SL>(3tgU8%pkh~i_ry~^*yvJ8Z^w$8yJ^>Jx$F6Vp*G$84N zw!GLh(z!Eb1`M@BdC5{tUR@6w0Z+6mc%AL;Q4*>wz#4z^mk@5de~h>SZFj6^Y)Kr! zYyD8~aX&qL_3Df4ngkZ(Wlxc;O+s@MJGU+l6T+pOn^~ph5RD6sj;vFe$tv%L5LTxA z&$+@Wm7#__qH8lWXlxd9RMJ$dGOsgSRA^A|#PgtZF6=_(*!)CHC9pxiI$lO^cKtXY z1ofC-(VSt=J-&oYZAvY9IGZPlF~ZkeX=zBrkPB;o!ya`-`YgCaEYecN`O*fW>f!f! zlK)~Lpkb#u|~{uB_H5FTiGkaM5NL$%GN6u9Y^LFAxl&79d~-3a`=MEc<6Lb z(RV7{86|X`6t89h@I`0|*6`Cl_3X1_)0F0;AkQTppU2KC=QLoy9!_Mq`+mY_P6Z#w zQ~ROg*z+RTHzqo>)v+TsQs8Y3w*yGRQ&ivnEBNly^-|+`fy87L&8vL-L(~?0`ho+N zBeL|W&XW2%(ojG=0Kz^QK^W6!rzK8yjwSVVz@uw(@J&YwN8{#+*<@ESMd`nb4ne!r zrmq?XY`HN3N?Vv>nS$KA4Lsqo+{7*}s;T!MC~beOnfa;Z7?kz9CAhvE%>2b>py=u6 z8QTS74LxRG$$=;AmVXz(Sm^-Rs6MB9+xo)rOz;HKZ;oYg_XdXLwCgkE)2eN0%5&NE zT>U-?Uc6L`DmlJF`LW+n$JFkvnG_#L0})#E}?IukJNi?#z3(x10io0PxB;!erg zjJXz!0}-kLtR@fqNVG=<=+z+d3a`re?-?)e!CdYS#7f^fGr6ZO%KZ_H_UL}PU%V-CU;^fAZ{W_9gGJU@uQp>H8^hPZx<@!mxc3-Fy@E+v{PnD{9L!}j}S} zQ_VB2oxRDn;-?{HP>tLZ1~wE@LUmj0Fyt}9SsyWe7!&Kl(KyQ9)mrAZzdgxaHbD(H zS*?Xdh~;kbnl2<&Z3B0J%SI4V>Vrcao$y+e#>ApqwCd$M);(QOUX`}%#n_mgVcRr zy83QsjL4Clbt?DHLUW8*1V3i*)j<8~kFgB4p^j4^{qWdh4JmXikj}S^u+74)0dx}p zUw79@Y4c6x9X-fRmD9V#^0V3HPWuB1?n{*CS@xJa-j;O{00k#wNM^t*@r-qUN12|; zuI=gGp3vLO@uyAKPl=<7aW;Oa?BIk42Yayo4tR(eXSYn-Fvsb^J}F)rBEs`_FzXK7 zqEMJJ_&`qFzXzmEM&2mQ-VgD+Nh6l%gGh= zX~;WYl_Bazi5HIFL!7*a5tU)lL6U>4KfxmR&#zPu|Gw~-hre_C_@9%sx`-baVvw&6 z1)`k_SQ@*28OR-4d<%jgVa(3s%WlePw2lx*_;GkkLP?o2gm!~x_`=|?%;f0r7DS;x zuO;8rZ=k#5Sf8mvQmaY%pvE5f#+vJkcOZ1#6|M$3x*gTplWUuAR>6iy`$JhV-D6cl zJ^lFDBO|z5JMp?%ZFf9k&CcNtU=qlmzFem6RtIr81P4m+NKb zWfvzW7NqLs7p2dBXCuYHz*z3-;uuoF`1X<^FN1=>0SC4}(RDT#8YkS*d~soKTH3*- zf2|t!OLiP_P+?Ot6zFX9;BiS(5MrJvF)BnsNE9)M*Rk3?H{JLU7*7nIu6{1-oD!M< DHkO37 literal 5461 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 b%C;Q@!rU`I4a2R?_Gi`>_U5goerf*#&chQ) diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 45ab767e92f3efe107d5f487f126b74c84af9b3a..7c6e461d9a8950fe00ae87b75108c1216ebb06a9 100644 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw4M<8HQcwg^k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+?-kFwXXLaSW+oe0#}|m%)JNzy{f;{yUuoeP`vcSQ@35^SeAN mWvDln&}^P)G)mAp40hGnv&OmeZ#)8wO9oF@KbLh*2~7aT0hojU literal 5847 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 E06(qwWB>pF literal 6376 zcmd5>RaX>%5(cDGx=UJGx|;=oWfAEXWhs~LQW~W}a)AW}l$P!e>0DA5Tw>|2C9n4f z-1qx1GvC9UIWuR@)R{OC5I{o6K!|~XL87gt{_3AB{V(C;{^Q;>y8HhGy|;#`x1pPZ zx1XKoI}ATRKOrZGi-6w5zmDm252YGnGRPSzv!YpQq2ryr< zB}Yc)U=-?*<3H0=m&y5X_x@Kvsb6VqY1r#?`3vdMrDD?$ltiDfW?YnaxCpqCpR!?7 zutg=eN=Qvcx=PlFne`qzIGlwl6`;GvI@``5mr|1}`KSQ65tFS5XKd?F{%%|Rp8nxv z0bMBZaPR*o@J$Yuq_vo|^j<_YoL&s>cjhr&1{@MnmNM@vX2vWuviL5de27RKko8Zv zfzfa6kZ-kU{uii^2(q`}SX}9|E1=y!*r}QH1ZPPfzySVU54`+RZ12JpJ@qq@W5aLK zQS>QcEm$VaeXpw`^aJ?H(qB3@ca@cv61w@Ukothw#(o#Z;YYoYBrLm51T_*n?N@UW zWl3wmDz^;{iQL^oSY{fj*ESBZV5-f*e8B>bSD@`eP;sC4x}}>DaJoq5wZeKK%OYdh z#}Jq+%SQUmC^I*Z5jrd|IQS0r(+iDbIXWY;EhhdlZOz5VJ=Zxu7SfB9xgsp{6zcK55zqxB7VZX5j7vp3JsLc8=d!Atb!$0- zfsrpNiitWK>g|vli`l{CHWLbozdMTWTCf^=U-N#PxR00yyYk`!@d1wMN#m1K_h3=o zm>G;pnupJ{-CZ&yFj-}IgIb>F7SxjNiY3})HIU(3wssqy9_Uabgskms2x zbx>U@+qu-wt(VpZTlR%*F{uph_F4#Vnf*#hYS5U8*TRmPS8A06Ln|9Y^O0Wzxuis9 zfOI7803&Vs_*`Gr$3M=?Tf+M|6ILI;A4#a&@ma zY@AH5oN1apbeMJMSIX&2+Ua6CuROlG6d#oQG2p!mh6T7&g=M`0Dt8@si9r5XS-^@Y zZpbpan;pdDmHbJ{E)SsQtUsnV`m;kSsn#b@gB=W}?bRe*jp@&w0f8m!A-wYqI- zu&nxJiolw+3)65}dmHh9T@vvlV_^(jXP|iC+#;De=J8aZk!o=Nx4fvC!8o>cjc<#Mo;GUnN{`D$_(hbKV)98qo1DxB!c z8BKTdJCh3^$lL12Ns26eaL-vK?VnE8WzPPV^J6FZOZykZ4t1N$Vtzh7;VB`71~P-@ z&sD<<(ATXVSw&c63ldRfZa`_);cy;A^e~w8Wi%$j!&d^uslRLBFgNCl%0tu z%jIG7r;0g>ZzVK^oD1Cv*X20U6dGEpKa1P5DNDG2fWxsKa(0vnr9e4Ps*?~Oo+-ZxLCN(C4xkZkKm6_bLPuLl z&7<^^5__#uD)%4a*Lgl2KipAjS!WMr^A07%lSF;_W$|U0b?Bj<-TI!5eyK#zWSD%?2+F$2a#q+3 z6W)ygUF{qm%Sz!wxF&eCO}QFKGuLG`kZ2Wxi_WABv4VRaVZ~*y-=5=iwwfO8q#psy zM-4)pSE=>E`-g2V=H;?(*jaE3FR}?v*v=U&ZNshGM zv2m;JwLfGH5H2nAqP;#VgIaDYJuD06_%%HR#{rYT^LN&$Wm-yHj_>)VdF`p5#5Sk= ziB>|j=+^0i3NRN|QZoWm+Wx^h>m|u{vu*PB6HS_#vkRH;Stq&|;y5v(J7iP33`Fnt zL`;kp_?n}nR}tCaI?yTStmzJgLnl`DoBZIaFj?0Vb7-@tUcIGV7vXhjpz4n5o|)Rb zTny}T;o0S8Xwjx4c6DbMc6_^A9;FCmv8Qc`eDGq$ zHb>z}Sytmj^|!R-j(;8oP*F!O`{&Wdcms%R?AQ&Y2kn&(`yZg?zN-;U`FsiX3Ok8T zb&YJ_ZRmnmq$mYSUCD{Z)zfXeeo0p9BVqWhhUvkWNj zQYFPWsYK#MMVUBz2*Pa}eLy$uxeVa$tGVMD{atD| zPUBdRhx4wc=6i8`#ejD2H}2MGnFxyOcQ4t0Y1<>VB1l?I>{baOwi`R?0s8C}C^fGx zrG)Sa9Uzqx-bOB!B<15wF#Kb!XtHxhWUF!+sXP(PSV9L z+bOB---k4U zH}}UzG>q-yHla+iSn^SMZq-KHB5sC#6%Hf|ZN{yyp;CsS*UxJ+m;vW~y;ihFF?76g zL%qRw;$e^pdAzd$OWr;;DC>Y_pjv3aCi9;phrvfGS7(YqYA^)`lJ|jd< zpi+_p?Y!sxM$|3vjlE{#cHb8RwugJFkH%yWbR{xFww4n75&k^MxOih>E~*)1xqE)I zZH{nOfMc@6X3eL#w6-l%S7?GvHqY*Pjt5j$jAv-lMfIun)QPz3+-2haxj|#XAn@om zm|!gIu2gmr8BD@ZjD_=#WE2(JrmlB2kQ)-np@?Apboas^fU^kZYB?OfF{HgNxm`Hl zmo@l$sZ92~GQ-Tz%b88CYQ_}aqe=gRL(XGYw;^$W#hH4mV&(JEY%PRuVPul=$|v4C zFeDHVX?s>-5R8o8Wn5S-_*ONHjM!=aQn7Fo2P%<54j1_SEmtdb3rKi|b*kG?{>Es` zQ*DwpEw709!Tv9z`7k02=;?`?ua?h?xZ`dIt@d@f zR+^3*Irnjtd17h2?F5EkXe zZ`|9aWW&-J7g^ug^WQ^NzjpyQCM3a?$P05pXx{1x%8!d(t zv;nR8RA1>fkJpOl&2e|rE(vADyAeAw=-@LDn@@%fVoN1nJ>;>;c~BUrJkWTQY|zAJ zFwa#{XRwZYYcyEC~Yoa?I&Q-0N|ROwvfejMu18|8KAu(}*#M#&qc!2lTbTBjFpiGQ zmweUPeWAttaeP8>v!$R-U?AI8;zW<*QZSoVluvQl!7PWUz1q;?&elH8uqyJ}-!sE- zvHafI3@6caz-(Z}^jq?iS}O2luI3LHU_LDsk7&6cpoxM<&&tWDSEpoeMz}lhU0vp{ zZtam@ub|^HqbYOgGn16kKPZ|@fctq)nQs4Np@8>dJ z${pEFJxx+w>hs!vb_;dVHJ}SVxOc%wCT^a^#(Z&i{{YixET)~qUyQs7)5)I8cLR=n zM&{d3&T&T3Yu`cB%F=us79POAk=HXN_ZeF*Cm++ok(`G|RB@Ool{L5R_IbjV1T8%s z^7S!}+0|qP(bHvm1@q&gE4-4pwbbCZVoIC?>b8cOKJjDoVwu;(o>n-rk8c%}+N+fU zL+eM_51kWw?*1ygm(8A2{^-tXae$93g|CrWeYG@@DE&8wDfBP)T*-NUvdQ4+@Q{)V ztO{1hl=y!3@W*{>GS#9XR#nZH9~h+ZlADzt)YljH^O%~zK1H^c29-tn{@N%tN4e20 z(E(Y^{)e2Fg7-QftsQrLvbZFx4c^3ff628Gq5-n~t<=c;6FRHBo!!>jTI38=n@7I( zRKnQ&P=M|ueSqe;ET4J8&x5d6XN7*TerBPIjOkq2Dl$jNJZ93x{Je;S3T)i`o}bQ| zd(2o5Y?Y{`;So)6De00PN}LFJkmtyg`slu92q z;*Xj*0_HfxKXD!X^gK zUcvrU?#)kHe$n(_3-rQF#*D&Fp~ zDDD^iZ2lYs%Ftu#C0pKIw=^Iq32mzcw&sNWo~5*UyZiAiQ4={&3LQ&$SmJh+%-+=r z>by?x5hCY1ak^#!H;zjzwW>!YG3BIcWf_$*>(T`0?bDlJTO(m{N3#;oIs$7sfmP$4Fs#jtW-ETTg&FS*1Hih;n zv$*Na=@ehZ2Cfw?})SX`*OUND|izbv@HMm&^fK48Y&~C7cAB`K?bN{J?O{zi;_sgv>vmN!7Nz zqp}24CmGufY}mEqxZrP)YYh4GE5(n~%iJlFibY&JN(`yQm+`9!UV;nH@Ppy^);=moz3tCWUy<*mBq!O%TYeoUKc@{WW~ z$}7eRmZRq18BfP@R*z>-ynL$CIEIA9G+~BB0fz;lZQ=wT6c17Y6KUnXcGDldM}2Zq z>HA5bC7k_h7eRrN&Zi$=(U4=VL9XP%yF^erxPov;b z!3u%cVsZN<49c~=Lf>U`NmWoq$s`*UGab|ysZWe;FsbUm-V`=B5p5oFvSKXXB=`C^ z<+a3q%C)@uo-ckO4hCTzjZITIc_J$cePF@}))m%ArFuNXVkmaOftyVpKZFz^2w*_7g4bicvsDoA~5FQ<-7An*9? z`!HjjQz7jF`|{;#@O(Yj)7h9$LGs|vfdm~iqg>`7qEY^0ZXbYyJ_!)!qXq&X$rP*% zV?1?SF_a8;Hhh(9C>5tXYu$M4xR78};~jDDc#C50b3JRQ#8f1@3ve;O-xs)+`xRWX zVJl0zv4}`bLT>Cx6fU^o)i%zR2G@h}Laj3lh$vBd*8z^A<@$gJ7>TWkXT&$3ouzAq z+uDKI2Ow+$qopAs-er6U#~^Ix50fMl4rM8Rx<)oGr}tD99aX9NO2fAenrC&eEF1FH z79v}c;zah*#l*d@seRh3l7eW(@+n|fe5;7ZGQokShyE@8Lrt{h;`cD^#~DYP%2&rM zJN0c$??W6XtGbC-L_84e)=) + BGTaskSchedulerPermittedIdentifiers + + dev.flutter.background.refresh + + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +30,13 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + audio + fetch + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -43,9 +56,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..903def2a --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + From 6b9d67bb7c0031b9af2da52794598360aa5c8f96 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:58 -0400 Subject: [PATCH 17/33] iOS release --- assets/icon/ios2.png | Bin 0 -> 619 bytes lib/start_workout/workout.dart | 635 ++++++++---------- macos/Podfile.lock | 19 + macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.lock | 66 +- pubspec.yaml | 2 +- 7 files changed, 342 insertions(+), 384 deletions(-) create mode 100644 assets/icon/ios2.png diff --git a/assets/icon/ios2.png b/assets/icon/ios2.png new file mode 100644 index 0000000000000000000000000000000000000000..cae16930901fc5f2c329c408cd8e045d89b179a0 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7vJY5_^D(1YsbdZxlLEwNv z>HoRsRaq9Q2!FY_H!aQa$WK`YeaTrO&Xbcef_Qwp7J3?*Xtt>xy|6@LRB#9fNDbP0l+XkKNO<3i literal 0 HcmV?d00001 diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 2e274f16..f88d9d25 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -6,6 +6,7 @@ import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:background_timer/background_timer.dart'; +import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; import '../workout_data_type/workout_type.dart'; import '../card_widgets/card_item_animated.dart'; @@ -39,12 +40,11 @@ class CountDownTimerState extends State final CountdownController _workoutController = CountdownController(autoStart: true); - String _currentInterval = "start"; - bool _start = true; - final _player = AudioPlayer(); - int _intervals = 0; - IconData _pausePlayIcon = Icons.pause; - bool _doneVisible = false; + final player = AudioPlayer(); + + IconData pausePlayIcon = Icons.pause; + bool doneVisible = false; + bool done = false; late ConfettiController _controllerCenter; @@ -55,8 +55,7 @@ class CountDownTimerState extends State @override void initState() { - super.initState(); - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -65,6 +64,7 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); + super.initState(); } void init() async { @@ -114,12 +114,14 @@ class CountDownTimerState extends State return path; } - String timerScreenText(currentVisibleInterval, exercises) { - switch (currentVisibleInterval) { + String timerScreenText(interval, status, exercises, Workout workoutArgument) { + switch (status) { case 'start': return "Get ready"; - case 'workout': - return _intervals < exercises.length ? exercises[_intervals] : "Work"; + case 'work': + return workoutArgument.numExercises < exercises.length + ? exercises[exercises.length - interval] + : "Work"; case 'rest': return "Rest"; default: @@ -127,181 +129,6 @@ class CountDownTimerState extends State } } - void startOnFinished() async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - _start = false; - _currentInterval = "workout"; - _intervalInfo.removeAt(0); - _workoutController.restart(); - }); - } - - void workoutOnFinished(workoutArgument, exercises) async { - await Future.delayed(const Duration(milliseconds: 400)); - _intervals = _intervals + 1; - if (!(_intervals < workoutArgument.numExercises) && - workoutArgument.completeSound != 'none') { - await _player - .play(AssetSource('audio/${workoutArgument.completeSound}.mp3')); - } - setState(() { - if (_intervals < workoutArgument.numExercises) { - _currentInterval = "rest"; - _intervalInfo.removeAt(0); - _workoutController.restart(); - } else { - _currentInterval = "done"; - _controllerCenter.play(); - _doneVisible = !_doneVisible; - Wakelock.disable(); - } - }); - } - - void restOnFinished(workoutArgument) async { - await Future.delayed(const Duration(milliseconds: 400)); - setState(() { - if (_intervals < workoutArgument.numExercises) { - _currentInterval = "workout"; - _intervalInfo.removeAt(0); - // intervalInfo.removeAt(intervals + 1); - // intervalInfo.insert(intervalInfo.length, "Rest"); - _workoutController.restart(); - } else {} - }); - } - - // Widget timerScreen( - // currentVisibleInterval, exercises, endSound, seconds, workoutArgument) { - // return Visibility( - // visible: currentInterval == currentVisibleInterval ? true : false, - // child: Column( - // children: [ - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - // child: Row( - // children: [ - // IconButton( - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(size: 50.0, Icons.arrow_back), - // color: Colors.white), - // const Spacer(), - // IconButton( - // onPressed: () { - // if (pausePlayIcon == Icons.pause) { - // _workoutController.pause(); - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // }); - // } else { - // _workoutController.start(); - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // }); - // } - // }, - // icon: Icon(size: 50.0, pausePlayIcon), - // color: Colors.white), - // ], - // )), - // Padding( - // padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - // child: Text( - // timerScreenText(currentVisibleInterval, exercises), - // // intervals < exercises.length ? exercises[intervals] : "", - // style: const TextStyle(fontSize: 35, color: Colors.white), - // )), - // Countdown( - // controller: _workoutController, - // seconds: seconds, - // build: (_, int time) => Text( - // time.toString(), - // style: const TextStyle(fontSize: 205, color: Colors.white), - // ), - // interval: const Duration(milliseconds: 100), - // endSound: endSound, - // halfwaySound: workoutArgument.halfwaySound, - // countdownSound: workoutArgument.countdownSound, - // halfwayMark: (currentInterval == "workout") ? true : false, - // onFinished: () async { - // if (currentInterval == "start") { - // startOnFinished(); - // } else if (currentInterval == "workout") { - // workoutOnFinished(workoutArgument, exercises); - // } else if (currentInterval == "rest") { - // restOnFinished(workoutArgument); - // } - // }, - // ), - // Expanded( - // child: Container( - // color: Color.fromARGB(22, 0, 0, 0), - // child: AnimatedList( - // key: _listKey, - // initialItemCount: intervalInfo.length, - // itemBuilder: (context, index, animation) { - // return CardItemAnimated( - // animation: animation, - // item: intervalInfo[index], - // fontColor: index == 0 - // ? Colors.white - // : Color.fromARGB(153, 255, 255, 255), - // fontWeight: - // index == 0 ? FontWeight.bold : FontWeight.normal, - // ); - // // return slideIt(context, index, animation); - // }, - // ), - // ), - // // child: Container( - // // color: Color.fromARGB(22, 0, 0, 0), // height: 200, - // // child: AnimatedList( - // // key: _listKey, - // // initialItemCount: intervalInfo.length, - // // itemBuilder: (context, index, animation) { - // // return CardItem( - // // animation: animation, - // // item: intervalInfo[index], - // // fontColor: index == 0 - // // ? Colors.white - // // : Color.fromARGB(153, 255, 255, 255)); - // // // return slideIt(context, index, animation); - // // }, - // // ), - // // )), - // ) - // ], - // ), - // ); - // } - - // Widget slideIt(context, index, animation) { - // TextStyle? textStyle = Theme.of(context).textTheme.bodyMedium; - // return SlideTransition( - // position: Tween( - // begin: const Offset(-1, 0), - // end: const Offset(0, 0), - // ).animate(CurvedAnimation( - // parent: animation, - // curve: Curves.easeIn, - // reverseCurve: Curves.easeOut)), - // child: SizedBox( - // height: 50.0, - // child: Container( - // // color: Colors.transparent, - // child: Center( - // child: Text('Item $index', style: textStyle), - // ), - // ), - // ), - // ); - // } - List listItems(List exercises, Workout workoutArgument) { List listItems = []; @@ -363,6 +190,9 @@ class CountDownTimerState extends State return listItems; } + bool shouldReset = true; + bool restart = false; + @override Widget build(BuildContext context) { Workout workoutArgument = @@ -372,177 +202,286 @@ class CountDownTimerState extends State ? jsonDecode(workoutArgument.exercises) : []; - if (_currentInterval == "start") { - _intervalInfo = ListModel( - listKey: _listKey, - initialItems: listItems(exercises, workoutArgument), - removedItemBuilder: _buildRemovedItem, - ); + final GlobalKey listKey = GlobalKey(); + if (shouldReset) { + shouldReset = false; + setState(() { + intervalInfo = ListModel( + listKey: listKey, + initialItems: listItems(exercises, workoutArgument), + removedItemBuilder: _buildRemovedItem, + ); + print("${intervalInfo.length}"); + if (restart) { + _workoutController.restart(); + // restart = false; + } + }); + } + + String currentStatus = "start"; + + Widget complete() { + return Visibility( + visible: doneVisible, + maintainAnimation: true, + maintainState: true, + child: Container( + alignment: Alignment.center, + color: Color.fromARGB(255, 0, 225, 255), + child: Stack( + children: [ + Align( + alignment: Alignment.center, + child: ConfettiWidget( + confettiController: _controllerCenter, + blastDirectionality: BlastDirectionality + .explosive, // don't specify a direction, blast randomly + shouldLoop: + true, // start again as soon as the animation is finished + colors: const [ + Colors.green, + Colors.blue, + Colors.pink, + Colors.orange, + Colors.purple + ], // manually specify the colors to be used + createParticlePath: drawStar, // define a custom shape/path. + ), + ), + Align( + alignment: Alignment.center, + child: AnimatedOpacity( + opacity: doneVisible ? 1.0 : 0.0, + duration: const Duration(milliseconds: 800), + child: SizedBox( + width: 300, + height: 300, + // color: Colors.green, + child: Center( + child: Column( + children: [ + const Text("Nice job!", + style: TextStyle( + color: Colors.white, + fontSize: 45, + fontWeight: FontWeight.bold)), + const Spacer(), + Align( + alignment: Alignment.center, + child: Row( + children: [ + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Back", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(Icons.arrow_back, + color: Colors.white, size: 38)), + const Spacer(), + TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + const Color.fromARGB( + 133, 255, 255, 255))), + label: const Text( + "Restart", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 22), + ), + onPressed: () { + setState(() { + shouldReset = true; + doneVisible = false; + restart = true; + done = false; + // _workoutController.restart(); + Wakelock.enable(); + }); + }, + icon: const Icon(Icons.restart_alt, + color: Colors.white, size: 38)) + ], + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + )); } return SafeArea( - child: Countdown( - controller: _workoutController, - workSeconds: 5, - restSeconds: 3, - numberOfIntervals: 2, - build: (_, int time) => Text( - time.toString(), - style: TextStyle( - fontSize: 100, + // child: Container( + // color: _backgroundColor, + + child: Stack( + children: [ + Countdown( + controller: _workoutController, + workSeconds: workoutArgument.exerciseTime, + restSeconds: workoutArgument.restTime, + workSound: workoutArgument.workSound, + restSound: workoutArgument.restSound, + endSound: workoutArgument.completeSound, + countdownSound: workoutArgument.countdownSound, + numberOfIntervals: workoutArgument.numExercises, + build: (_, BackgroundTimerData timerData) { + if (timerData.status == "complete" && restart == false) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _controllerCenter.play(); + // doneVisible = true; + // Wakelock.disable(); + // }); + done = true; + } else { + done = false; + restart = true; + } + + print(intervalInfo.length); + + return Container( + alignment: Alignment.center, + color: backgroundColor(timerData.status), + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), + child: Text( + timerScreenText(timerData.numberOfIntervals, + timerData.status, exercises, workoutArgument), + style: + TextStyle(fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: + TextStyle(fontSize: 160, color: Colors.white), + ), + ) + ], + ))); + }, + onFinished: () { + print("FINISHED"); + WidgetsBinding.instance.addPostFrameCallback((_) { + print("---------------------------"); + print(intervalInfo.length); + intervalInfo.removeAt(0); + print("REMOVED"); + if (intervalInfo.length == 0) { + Future.delayed(Duration(microseconds: 500000), () { + setState(() { + // _showText = true; + doneVisible = true; + _controllerCenter.play(); + }); + }); + // setState(() { + // doneVisible = true; + // }); + } + }); + }, ), - ), - interval: Duration(milliseconds: 100), - onFinished: () { - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text('Timer is done!'), - // ), - // ); - }, + Padding( + padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + if (pausePlayIcon == Icons.pause) { + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + setState(() { + pausePlayIcon = Icons.play_arrow; + Wakelock.disable(); + }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + setState(() { + pausePlayIcon = Icons.pause; + Wakelock.enable(); + }); + } + }, + icon: Icon(size: 50.0, pausePlayIcon), + color: Colors.white), + ], + )), + Align( + alignment: Alignment.bottomCenter, + child: FractionallySizedBox( + widthFactor: 1.0, + heightFactor: 0.5, + child: Container( + alignment: AlignmentDirectional.bottomCenter, + color: Color.fromARGB(22, 0, 0, 0), + child: AnimatedList( + key: listKey, + initialItemCount: intervalInfo.length, + itemBuilder: (context, index, animation) { + return CardItemAnimated( + animation: animation, + item: intervalInfo[index], + fontColor: index == 0 + ? Colors.white + : Color.fromARGB(153, 255, 255, 255), + fontWeight: index == 0 + ? FontWeight.bold + : FontWeight.normal, + ); + // return slideIt(context, index, animation); + }, + )))), + complete() + ], ), ); - - // return Scaffold( - // backgroundColor: Colors.white10, - // body: SizedBox.expand( - // child: Container( - // color: backgroundColor(), - // child: Center( - // child: Stack( - // children: [ - // timerScreen("start", exercises, workoutArgument.workSound, 10, - // workoutArgument), - // timerScreen("workout", exercises, workoutArgument.restSound, - // workoutArgument.exerciseTime, workoutArgument), - // timerScreen("rest", exercises, workoutArgument.workSound, - // workoutArgument.restTime, workoutArgument), - // Visibility( - // visible: currentInterval == "done" ? true : false, - // maintainAnimation: true, - // maintainState: true, - // child: Stack( - // children: [ - // Align( - // alignment: Alignment.center, - // child: ConfettiWidget( - // confettiController: _controllerCenter, - // blastDirectionality: BlastDirectionality - // .explosive, // don't specify a direction, blast randomly - // shouldLoop: - // true, // start again as soon as the animation is finished - // colors: const [ - // Colors.green, - // Colors.blue, - // Colors.pink, - // Colors.orange, - // Colors.purple - // ], // manually specify the colors to be used - // createParticlePath: - // drawStar, // define a custom shape/path. - // ), - // ), - // Align( - // alignment: Alignment.center, - // child: AnimatedOpacity( - // opacity: doneVisible ? 1.0 : 0.0, - // duration: const Duration(milliseconds: 800), - // child: SizedBox( - // width: 300, - // height: 300, - // // color: Colors.green, - // child: Center( - // child: Column( - // children: [ - // const Text("Nice job!", - // style: TextStyle( - // color: Colors.white, - // fontSize: 45, - // fontWeight: FontWeight.bold)), - // const Spacer(), - // Align( - // alignment: Alignment.center, - // child: Row( - // children: [ - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Back", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon(Icons.arrow_back, - // color: Colors.white, - // size: 38)), - // const Spacer(), - // TextButton.icon( - // style: ButtonStyle( - // backgroundColor: - // MaterialStateProperty.all( - // const Color.fromARGB( - // 133, - // 255, - // 255, - // 255))), - // label: const Text( - // "Restart", - // style: TextStyle( - // color: Colors.white, - // fontWeight: FontWeight.bold, - // fontSize: 22), - // ), - // onPressed: () { - // setState(() { - // currentInterval = "start"; - // start = true; - // intervals = 0; - // pausePlayIcon = Icons.pause; - // doneVisible = false; - // _workoutController.restart(); - // Wakelock.enable(); - // }); - // }, - // icon: const Icon( - // Icons.restart_alt, - // color: Colors.white, - // size: 38)) - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // ), - // ), - // ], - // ), - // ), - // ], - // ), - // ), - // ), - // )); } - Color backgroundColor() { - if (_currentInterval == "workout") { + Color backgroundColor(String status) { + if (status == "work") { return Colors.green; - } else if (_currentInterval == "rest") { + } else if (status == "rest") { return Colors.red; - } else if (_currentInterval == "start") { + } else if (status == "start") { return Colors.black; } else { return const Color.fromARGB(255, 0, 225, 255); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index c25e7f29..9beee45c 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -3,6 +3,10 @@ PODS: - FlutterMacOS - audioplayers_darwin (0.0.1): - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) @@ -10,6 +14,9 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) @@ -19,8 +26,11 @@ PODS: DEPENDENCIES: - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) @@ -33,10 +43,16 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos audioplayers_darwin: :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos FlutterMacOS: :path: Flutter/ephemeral path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos wakelock_macos: @@ -45,9 +61,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 audioplayers_darwin: dcad41de4fbd0099cb3749f7ab3b0cb8f70b810c + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index f1a2e2c0..2971b052 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -203,7 +203,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 25131489..6f3e6e8e 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 29 Sep 2023 18:14:02 -0400 Subject: [PATCH 18/33] Use updated background timer package --- ios/Podfile.lock | 12 ++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 9 +++++++++ ios/Runner/Info.plist | 1 + ios/Runner/Runner.entitlements | 5 +---- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b1317a7f..00f98462 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,12 +15,16 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - just_audio (0.0.1): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - soundpool (0.0.1): + - Flutter - sqflite (0.0.3): - Flutter - FMDB (>= 2.7.5) @@ -35,8 +39,10 @@ DEPENDENCIES: - flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`) - flutter_fgbg (from `.symlinks/plugins/flutter_fgbg/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - just_audio (from `.symlinks/plugins/just_audio/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - soundpool (from `.symlinks/plugins/soundpool/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -59,10 +65,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_fgbg/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + just_audio: + :path: ".symlinks/plugins/just_audio/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + soundpool: + :path: ".symlinks/plugins/soundpool/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" wakelock: @@ -77,8 +87,10 @@ SPEC CHECKSUMS: flutter_fgbg: 31c0d1140a131daea2d342121808f6aa0dcd879d flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + soundpool: c7f4422ca206e77f8900ed3c4ee6a6ff5a0e38a9 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 28d7f691..66868c10 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -360,6 +360,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -370,6 +372,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -490,6 +493,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -500,6 +505,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -514,6 +520,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 4382W5FL3V; ENABLE_BITCODE = NO; @@ -524,6 +532,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 471a20c0..2a0bc37b 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -36,6 +36,7 @@ audio fetch + processing UILaunchStoryboardName LaunchScreen diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 903def2a..0c67376e 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -1,8 +1,5 @@ - - aps-environment - development - + From b7cd3ab00dd72c1c62f5105e29baa40eca93d6df Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 29 Sep 2023 18:14:14 -0400 Subject: [PATCH 19/33] Use updated background timer package --- .../app/FlutterMultiDexApplication.java | 25 ++ lib/main.dart | 49 ++-- lib/start_workout/workout.dart | 227 ++++++++++++------ macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 66 ++++- pubspec.yaml | 3 +- 6 files changed, 272 insertions(+), 102 deletions(-) create mode 100644 android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java diff --git a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java new file mode 100644 index 00000000..752fc185 --- /dev/null +++ b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java @@ -0,0 +1,25 @@ +// Generated file. +// +// If you wish to remove Flutter's multidex support, delete this entire file. +// +// Modifications to this file should be done in a copy under a different name +// as this file may be regenerated. + +package io.flutter.app; + +import android.app.Application; +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.multidex.MultiDex; + +/** + * Extension of {@link android.app.Application}, adding multidex support. + */ +public class FlutterMultiDexApplication extends Application { + @Override + @CallSuper + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/lib/main.dart b/lib/main.dart index 0d337296..f5c471e5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:audio_session/audio_session.dart'; +// import 'package:audio_session/audio_session.dart'; import 'package:flutter/material.dart'; import 'create_workout/select_timer.dart'; import 'workout_data_type/workout_type.dart'; @@ -45,31 +45,31 @@ class _MyHomePageState extends State { @override initState() { super.initState(); - init(); + // init(); } - void init() async { - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration.music()); + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); - final session = await AudioSession.instance; - await session.configure( - const AudioSessionConfiguration( - avAudioSessionCategory: AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers, - avAudioSessionMode: AVAudioSessionMode.defaultMode, - avAudioSessionRouteSharingPolicy: AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - androidAudioAttributes: AndroidAudioAttributes( - contentType: AndroidAudioContentType.speech, - flags: AndroidAudioFlags.none, - usage: AndroidAudioUsage.voiceCommunication, - ), - androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - androidWillPauseWhenDucked: true, - ), - ); - } + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + // } int calculateWorkoutTime(Workout workout) { return (((workout.exerciseTime * workout.numExercises) + @@ -232,7 +232,8 @@ Total: ${calculateWorkoutTime(snapshot.data![index])} minutes'''), body: SafeArea( child: FutureBuilder>( future: workouts, - builder: (BuildContext context, AsyncSnapshot> snapshot) { + builder: + (BuildContext context, AsyncSnapshot> snapshot) { /// When [workouts] has successfully loaded. if (snapshot.hasData) { if (snapshot.data!.isEmpty) { diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index f88d9d25..33a50fac 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -1,10 +1,9 @@ import 'dart:convert'; import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; -import 'package:audioplayers/audioplayers.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:background_timer/background_timer.dart'; import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; @@ -55,6 +54,7 @@ class CountDownTimerState extends State @override void initState() { + super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -64,15 +64,41 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); - super.initState(); } void init() async { // final session = await AudioSession.instance; // await session.configure(const AudioSessionConfiguration.music()); - await _player.play(AssetSource('audio/blank.mp3')); + + // final session = await AudioSession.instance; + // await session.configure(const AudioSessionConfiguration( + // // avAudioSessionCategory: AVAudioSessionCategory.ambient, + // avAudioSessionCategoryOptions: + // AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: + // AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, + // androidAudioAttributes: AndroidAudioAttributes( + // contentType: AndroidAudioContentType.music, + // flags: AndroidAudioFlags.audibilityEnforced, + // usage: AndroidAudioUsage.media, + // ), + // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, + // androidWillPauseWhenDucked: true, + // )); + + // AssetSource('audio/blank.mp3') + // await player.setUrl('asset:audio/blank.mp3'); + // await player.play(); } + // void init() async { + // // final session = await AudioSession.instance; + // // await session.configure(const AudioSessionConfiguration.music()); + // // await player.play(AssetSource('audio/blank.mp3')); + // } + @override void dispose() { _controllerCenter.dispose(); @@ -203,9 +229,12 @@ class CountDownTimerState extends State : []; final GlobalKey listKey = GlobalKey(); - if (shouldReset) { - shouldReset = false; - setState(() { + + print(shouldReset); + + setState(() { + if (shouldReset) { + shouldReset = false; intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), @@ -216,10 +245,12 @@ class CountDownTimerState extends State _workoutController.restart(); // restart = false; } - }); - } + } + }); + + print(intervalInfo.length); - String currentStatus = "start"; + // String currentStatus = "start"; Widget complete() { return Visibility( @@ -309,7 +340,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; - // _workoutController.restart(); + _workoutController.restart(); Wakelock.enable(); }); }, @@ -343,6 +374,7 @@ class CountDownTimerState extends State restSound: workoutArgument.restSound, endSound: workoutArgument.completeSound, countdownSound: workoutArgument.countdownSound, + halfwaySound: workoutArgument.halfwaySound, numberOfIntervals: workoutArgument.numExercises, build: (_, BackgroundTimerData timerData) { if (timerData.status == "complete" && restart == false) { @@ -357,36 +389,122 @@ class CountDownTimerState extends State restart = true; } + // if (timerData.paused) { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.play_arrow; + // // Wakelock.disable(); + // // }); + // // }); + // } else { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // setState(() { + // // pausePlayIcon = Icons.pause; + // // Wakelock.disable(); + // // }); + // // }); + // } + print(intervalInfo.length); return Container( - alignment: Alignment.center, color: backgroundColor(timerData.status), - child: Align( - alignment: Alignment.topCenter, - child: Column( - children: [ - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0), - child: Text( - timerScreenText(timerData.numberOfIntervals, - timerData.status, exercises, workoutArgument), - style: - TextStyle(fontSize: 30, color: Colors.white), - ), - ), - Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), - child: Text( - timerData.currentMicroSeconds.toString(), - style: - TextStyle(fontSize: 160, color: Colors.white), - ), - ) - ], - ))); + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + child: Row( + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: + const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + print(timerData.paused); + if (!timerData.paused) { + // setState(() {}); + _workoutController.pause(); + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.disable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.play_arrow; + // Wakelock.enable(); + // }); + // }); + } else { + _workoutController.resume(); + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.enable(); + // }); + // WidgetsBinding.instance + // .addPostFrameCallback((_) { + // setState(() { + // pausePlayIcon = Icons.pause; + // Wakelock.disable(); + // }); + // }); + // // setState(() {}); + } + }, + icon: Icon( + size: 50.0, + timerData.paused + ? Icons.play_arrow + : Icons.pause), + color: Colors.white), + ], + )), + Container( + alignment: Alignment.center, + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 20.0, 0.0, 0.0), + child: Text( + timerScreenText( + timerData.numberOfIntervals, + timerData.status, + exercises, + workoutArgument), + style: TextStyle( + fontSize: 30, color: Colors.white), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB( + 0.0, 0.0, 0.0, 0.0), + child: Text( + timerData.currentMicroSeconds.toString(), + style: TextStyle( + fontSize: 160, color: Colors.white), + ), + ) + ], + ))) + ], + )); }, onFinished: () { print("FINISHED"); @@ -410,41 +528,6 @@ class CountDownTimerState extends State }); }, ), - Padding( - padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (pausePlayIcon == Icons.pause) { - _workoutController.pause(); - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - setState(() { - pausePlayIcon = Icons.play_arrow; - Wakelock.disable(); - }); - } else { - _workoutController.resume(); - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - setState(() { - pausePlayIcon = Icons.pause; - Wakelock.enable(); - }); - } - }, - icon: Icon(size: 50.0, pausePlayIcon), - color: Colors.white), - ], - )), Align( alignment: Alignment.bottomCenter, child: FractionallySizedBox( diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f55399c9..cf257ad5 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,8 +9,10 @@ import audio_session import audioplayers_darwin import device_info_plus import flutter_local_notifications +import just_audio import path_provider_foundation import shared_preferences_foundation +import soundpool_macos import sqflite import wakelock_macos @@ -19,8 +21,10 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SwiftSoundpoolPlugin.register(with: registry.registrar(forPlugin: "SwiftSoundpoolPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 1c44cb2f..f26699f6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" + sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" url: "https://pub.dev" source: hosted - version: "3.3.8" + version: "3.4.2" args: dependency: transitive description: @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: aa03d702932dd2be4bfd4ce9ef1cff776f72dbae + resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -353,10 +353,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" infinite_listview: dependency: transitive description: @@ -381,6 +381,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b" + url: "https://pub.dev" + source: hosted + version: "0.9.35" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df + url: "https://pub.dev" + source: hosted + version: "4.2.1" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13 + url: "https://pub.dev" + source: hosted + version: "0.4.8" lints: dependency: transitive description: @@ -598,6 +622,38 @@ packages: description: flutter source: sdk version: "0.0.99" + soundpool: + dependency: transitive + description: + name: soundpool + sha256: fe7302005759d6a3561de1711e3ea818b1ba025a62375b469196dda5b654bd38 + url: "https://pub.dev" + source: hosted + version: "2.4.1" + soundpool_macos: + dependency: transitive + description: + name: soundpool_macos + sha256: e0440a19d4e8f344dace336923b369184e91eebbbd8348266f4434b675bd15db + url: "https://pub.dev" + source: hosted + version: "2.3.0" + soundpool_platform_interface: + dependency: transitive + description: + name: soundpool_platform_interface + sha256: "7c6666e19319151b2036c4fc9b6da3a83f2ebf4097989e6ba1c2b0bfe3612e9f" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + soundpool_web: + dependency: transitive + description: + name: soundpool_web + sha256: "3d1eb8d6cceb8a0aec38ff9aec4fbd11a9a8101d27b27a6eb29305b83d46aee5" + url: "https://pub.dev" + source: hosted + version: "2.3.0" source_maps: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 37e294a0..9b5cd58b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: git: url: https://github.com/a-mabe/background_timer.git ref: background-process-intervals # branch name + just_audio: ^0.9.35 flutter_launcher_icons: android: "launcher_icon" @@ -96,10 +97,10 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - assets: - assets/audio/ + # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. From b60988999d9162446e79a32a8dd7b59d5bd3344b Mon Sep 17 00:00:00 2001 From: a-mabe Date: Mon, 2 Oct 2023 18:40:59 -0400 Subject: [PATCH 20/33] Use new timer version, add docs folder --- docs/test-cases.md | 16 ++++++++++++++++ pubspec.lock | 42 +++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 docs/test-cases.md diff --git a/docs/test-cases.md b/docs/test-cases.md new file mode 100644 index 00000000..650e5dcb --- /dev/null +++ b/docs/test-cases.md @@ -0,0 +1,16 @@ +# Test Cases + +1. [Create and save a new interval timer](https://github.com/a-mabe/OpenHIIT/blob/main/test/interval_timer_test.dart). +1. [Create and save a new workout](https://github.com/a-mabe/OpenHIIT/blob/main/test/workout_test.dart). +1. Edit an interval timer. +1. Edit a workout. +1. Play interval timer with default sound effects. +1. Play interval timer with custom sounds. +1. Play interval timer with no sounds. +1. Pause/play an interval timer. +1. Restart an interval timer. +1. Play workout with default sounds. +1. Play workout with custom sounds. +1. Play workout with no sounds. +1. Pause/play a workout. +1. Restart a workout. \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index f26699f6..f65331d8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" + sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.4.4" args: dependency: transitive description: @@ -37,64 +37,64 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" + sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" + sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" + sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "5.0.2" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 + sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" + sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" + sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" + sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" background_timer: dependency: "direct main" description: path: "." ref: background-process-intervals - resolved-ref: a2fcc5d37d2fd0e83ba9eb01334f296530e54d7b + resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -168,10 +168,10 @@ packages: dependency: "direct main" description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.6.4" crypto: dependency: transitive description: @@ -798,10 +798,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "12.0.0" wakelock: dependency: "direct main" description: From a122e1e7559c355b326d76a9f1b75ef23556e091 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:46 -0400 Subject: [PATCH 21/33] iOS release --- ios/Podfile.lock | 3 +++ ios/Runner/Runner.entitlements | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 00f98462..fc5217d0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,6 +23,9 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - soundpool (0.0.1): - Flutter - sqflite (0.0.3): diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 0c67376e..903def2a 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -1,5 +1,8 @@ - + + aps-environment + development + From 4d74327ed00ea85a6b9998f3fbfc362c961ba807 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 12 Sep 2023 19:53:58 -0400 Subject: [PATCH 22/33] iOS release --- lib/start_workout/workout.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 33a50fac..0287c949 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -54,7 +54,6 @@ class CountDownTimerState extends State @override void initState() { - super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -64,6 +63,7 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); + super.initState(); } void init() async { From 740a5d2d437364300b77170b3a300492a88d121c Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 29 Sep 2023 18:14:02 -0400 Subject: [PATCH 23/33] Use updated background timer package --- ios/Runner/Runner.entitlements | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 903def2a..0c67376e 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -1,8 +1,5 @@ - - aps-environment - development - + From b98cfb9c38ea22336dc8240f5b7ccb61cb16d644 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 29 Sep 2023 18:14:14 -0400 Subject: [PATCH 24/33] Use updated background timer package --- lib/start_workout/workout.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 0287c949..33a50fac 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -54,6 +54,7 @@ class CountDownTimerState extends State @override void initState() { + super.initState(); intervalInfo = ListModel( listKey: _listKey, initialItems: [], @@ -63,7 +64,6 @@ class CountDownTimerState extends State ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); init(); - super.initState(); } void init() async { From 4cfa1170cbdb41ead490cbef0bb76fa2bc7a5d52 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Tue, 3 Oct 2023 19:35:57 -0400 Subject: [PATCH 25/33] Delete comments --- lib/start_workout/workout.dart | 132 ++++----------------------------- 1 file changed, 13 insertions(+), 119 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 33a50fac..873a96a2 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -55,7 +55,7 @@ class CountDownTimerState extends State @override void initState() { super.initState(); - intervalInfo = ListModel( + _intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -63,42 +63,8 @@ class CountDownTimerState extends State _controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); - init(); } - void init() async { - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration.music()); - - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration( - // // avAudioSessionCategory: AVAudioSessionCategory.ambient, - // avAudioSessionCategoryOptions: - // AVAudioSessionCategoryOptions.mixWithOthers, - // avAudioSessionMode: AVAudioSessionMode.defaultMode, - // avAudioSessionRouteSharingPolicy: - // AVAudioSessionRouteSharingPolicy.defaultPolicy, - // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - // androidAudioAttributes: AndroidAudioAttributes( - // contentType: AndroidAudioContentType.music, - // flags: AndroidAudioFlags.audibilityEnforced, - // usage: AndroidAudioUsage.media, - // ), - // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - // androidWillPauseWhenDucked: true, - // )); - - // AssetSource('audio/blank.mp3') - // await player.setUrl('asset:audio/blank.mp3'); - // await player.play(); - } - - // void init() async { - // // final session = await AudioSession.instance; - // // await session.configure(const AudioSessionConfiguration.music()); - // // await player.play(AssetSource('audio/blank.mp3')); - // } - @override void dispose() { _controllerCenter.dispose(); @@ -159,8 +125,6 @@ class CountDownTimerState extends State List listItems = []; for (var i = 0; i < workoutArgument.numExercises + 1; i++) { - // message.write('!'); - // intervalInfo.insert(i + 1, exercises[i]); if (i == 0) { listItems.add( ListTileModel( @@ -235,12 +199,12 @@ class CountDownTimerState extends State setState(() { if (shouldReset) { shouldReset = false; - intervalInfo = ListModel( + _intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), removedItemBuilder: _buildRemovedItem, ); - print("${intervalInfo.length}"); + print("${_intervalInfo.length}"); if (restart) { _workoutController.restart(); // restart = false; @@ -248,10 +212,6 @@ class CountDownTimerState extends State } }); - print(intervalInfo.length); - - // String currentStatus = "start"; - Widget complete() { return Visibility( visible: doneVisible, @@ -361,9 +321,7 @@ class CountDownTimerState extends State } return SafeArea( - // child: Container( - // color: _backgroundColor, - + bottom: false, child: Stack( children: [ Countdown( @@ -378,39 +336,12 @@ class CountDownTimerState extends State numberOfIntervals: workoutArgument.numExercises, build: (_, BackgroundTimerData timerData) { if (timerData.status == "complete" && restart == false) { - // WidgetsBinding.instance.addPostFrameCallback((_) { - // _controllerCenter.play(); - // doneVisible = true; - // Wakelock.disable(); - // }); done = true; } else { done = false; restart = true; } - // if (timerData.paused) { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // setState(() { - // // pausePlayIcon = Icons.play_arrow; - // // Wakelock.disable(); - // // }); - // // }); - // } else { - // pausePlayIcon = Icons.pause; - // Wakelock.disable(); - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // setState(() { - // // pausePlayIcon = Icons.pause; - // // Wakelock.disable(); - // // }); - // // }); - // } - - print(intervalInfo.length); - return Container( color: backgroundColor(timerData.status), child: Column( @@ -430,39 +361,10 @@ class CountDownTimerState extends State const Spacer(), IconButton( onPressed: () { - print(timerData.paused); if (!timerData.paused) { - // setState(() {}); _workoutController.pause(); - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.disable(); - // }); - // WidgetsBinding.instance - // .addPostFrameCallback((_) { - // setState(() { - // pausePlayIcon = Icons.play_arrow; - // Wakelock.enable(); - // }); - // }); } else { _workoutController.resume(); - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.enable(); - // }); - // WidgetsBinding.instance - // .addPostFrameCallback((_) { - // setState(() { - // pausePlayIcon = Icons.pause; - // Wakelock.disable(); - // }); - // }); - // // setState(() {}); } }, icon: Icon( @@ -488,7 +390,7 @@ class CountDownTimerState extends State timerData.status, exercises, workoutArgument), - style: TextStyle( + style: const TextStyle( fontSize: 30, color: Colors.white), ), ), @@ -497,7 +399,7 @@ class CountDownTimerState extends State 0.0, 0.0, 0.0, 0.0), child: Text( timerData.currentMicroSeconds.toString(), - style: TextStyle( + style: const TextStyle( fontSize: 160, color: Colors.white), ), ) @@ -507,23 +409,15 @@ class CountDownTimerState extends State )); }, onFinished: () { - print("FINISHED"); WidgetsBinding.instance.addPostFrameCallback((_) { - print("---------------------------"); - print(intervalInfo.length); - intervalInfo.removeAt(0); - print("REMOVED"); - if (intervalInfo.length == 0) { - Future.delayed(Duration(microseconds: 500000), () { + _intervalInfo.removeAt(0); + if (_intervalInfo.length == 0) { + Future.delayed(const Duration(microseconds: 500000), () { setState(() { - // _showText = true; doneVisible = true; _controllerCenter.play(); }); }); - // setState(() { - // doneVisible = true; - // }); } }); }, @@ -535,17 +429,17 @@ class CountDownTimerState extends State heightFactor: 0.5, child: Container( alignment: AlignmentDirectional.bottomCenter, - color: Color.fromARGB(22, 0, 0, 0), + color: const Color.fromARGB(22, 0, 0, 0), child: AnimatedList( key: listKey, - initialItemCount: intervalInfo.length, + initialItemCount: _intervalInfo.length, itemBuilder: (context, index, animation) { return CardItemAnimated( animation: animation, - item: intervalInfo[index], + item: _intervalInfo[index], fontColor: index == 0 ? Colors.white - : Color.fromARGB(153, 255, 255, 255), + : const Color.fromARGB(153, 255, 255, 255), fontWeight: index == 0 ? FontWeight.bold : FontWeight.normal, From 7bf5b17cabc9c46d760b0741e985d0bbf01a613c Mon Sep 17 00:00:00 2001 From: a-mabe Date: Fri, 6 Oct 2023 10:18:34 -0400 Subject: [PATCH 26/33] Update the UI list of intervals when coming back from a foreground process --- lib/models/list_model_animated.dart | 2 +- lib/start_workout/workout.dart | 416 ++++++++++++++++++++++------ macos/Podfile.lock | 12 + pubspec.lock | 6 +- 4 files changed, 346 insertions(+), 90 deletions(-) diff --git a/lib/models/list_model_animated.dart b/lib/models/list_model_animated.dart index 809b3f26..a4de7c63 100644 --- a/lib/models/list_model_animated.dart +++ b/lib/models/list_model_animated.dart @@ -35,7 +35,7 @@ class ListModel { E removeAt(int index) { final E removedItem = _items.removeAt(index); - if (removedItem != null) { + if (removedItem != null && _animatedList != null) { _animatedList!.removeItem( index, (BuildContext context, Animation animation) { diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 873a96a2..04c63cde 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -48,14 +48,14 @@ class CountDownTimerState extends State late ConfettiController _controllerCenter; final GlobalKey _listKey = GlobalKey(); - late ListModel _intervalInfo; + late ListModel intervalInfo; /// END VARS @override void initState() { super.initState(); - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: _listKey, initialItems: [], removedItemBuilder: _buildRemovedItem, @@ -182,6 +182,9 @@ class CountDownTimerState extends State bool shouldReset = true; bool restart = false; + int intervalsCompleted = 0; + String lastStatus = "start"; + int intervalTotal = 0; @override Widget build(BuildContext context) { @@ -199,15 +202,16 @@ class CountDownTimerState extends State setState(() { if (shouldReset) { shouldReset = false; - _intervalInfo = ListModel( + intervalInfo = ListModel( listKey: listKey, initialItems: listItems(exercises, workoutArgument), removedItemBuilder: _buildRemovedItem, ); - print("${_intervalInfo.length}"); + intervalTotal = intervalInfo.length; + print("${intervalInfo.length}"); if (restart) { _workoutController.restart(); - // restart = false; + restart = false; } } }); @@ -300,7 +304,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; - _workoutController.restart(); + // _workoutController.restart(); Wakelock.enable(); }); }, @@ -321,10 +325,8 @@ class CountDownTimerState extends State } return SafeArea( - bottom: false, - child: Stack( - children: [ - Countdown( + bottom: false, + child: Countdown( controller: _workoutController, workSeconds: workoutArgument.exerciseTime, restSeconds: workoutArgument.restTime, @@ -333,48 +335,146 @@ class CountDownTimerState extends State endSound: workoutArgument.completeSound, countdownSound: workoutArgument.countdownSound, halfwaySound: workoutArgument.halfwaySound, - numberOfIntervals: workoutArgument.numExercises, + numberOfWorkIntervals: workoutArgument.numExercises, + onFinished: () { + print("FINISHED"); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (intervalInfo.length == 1) { + intervalInfo.removeAt(0); + print("should be empty"); + print(intervalInfo.length); + + Future.delayed(Duration(microseconds: 500000), () { + setState(() { + // _showText = true; + doneVisible = true; + _controllerCenter.play(); + + // intervalInfo = ListModel( + // listKey: listKey, + // initialItems: listItems(exercises, workoutArgument), + // removedItemBuilder: _buildRemovedItem, + // ); + }); + }); + + // intervalInfo = ListModel( + // listKey: listKey, + // initialItems: listItems(exercises, workoutArgument), + // removedItemBuilder: _buildRemovedItem, + // ); + } + // print("---------------------------"); + // print(intervalInfo.length); + // intervalInfo.removeAt(0); + + // print("REMOVED"); + // if (intervalInfo.length == 0) { + // Future.delayed(Duration(microseconds: 500000), () { + // setState(() { + // // _showText = true; + // doneVisible = true; + // _controllerCenter.play(); + // }); + // }); + // } + }); + }, build: (_, BackgroundTimerData timerData) { + // if (timerData.status == "complete") { + // doneVisible = true; + // // shouldReset = true; + // } else { + // doneVisible = false; + // // shouldReset = false; + // } + if (timerData.status == "complete" && restart == false) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _controllerCenter.play(); + // doneVisible = true; + // Wakelock.disable(); + // }); done = true; + } else if (timerData.status == "start") { + ListModel intervalList = + ListModel( + listKey: listKey, + initialItems: listItems(exercises, workoutArgument), + removedItemBuilder: _buildRemovedItem, + ); + + int count = 0; + while (intervalInfo.length < intervalTotal) { + // if (intervalInfo.length > 0 && doneVisible == false) { + intervalInfo.insert(count, intervalList[count]); + count++; + // } + } } else { done = false; restart = true; } - return Container( + while ((intervalInfo.length + timerData.numberOfIntervals) > + intervalTotal) { + if (intervalInfo.length > 0 && doneVisible == false) { + intervalInfo.removeAt(0); + } + } + + // int intervalDifference = + // if () + + // if (intervalsCompleted > 0) { + // WidgetsBinding.instance.addPostFrameCallback((_) { + // print("Remove"); + // _intervalInfo.removeAt(0); + // intervalsCompleted--; + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // }); + // } + + print(intervalsCompleted); + print(intervalInfo.length); + + return Stack(children: [ + Container( color: backgroundColor(timerData.status), child: Column( children: [ Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: - const Icon(size: 50.0, Icons.arrow_back), - color: Colors.white), - const Spacer(), - IconButton( - onPressed: () { - if (!timerData.paused) { - _workoutController.pause(); - } else { - _workoutController.resume(); - } - }, - icon: Icon( - size: 50.0, - timerData.paused - ? Icons.play_arrow - : Icons.pause), - color: Colors.white), - ], - )), + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + child: Row(children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon(size: 50.0, Icons.arrow_back), + color: Colors.white), + const Spacer(), + IconButton( + onPressed: () { + if (!timerData.paused) { + _workoutController.pause(); + } else { + _workoutController.resume(); + } + }, + icon: Icon( + size: 50.0, + timerData.paused + ? Icons.play_arrow + : Icons.pause), + color: Colors.white), + ]), + ), Container( alignment: Alignment.center, child: Align( @@ -404,53 +504,197 @@ class CountDownTimerState extends State ), ) ], - ))) + ))), ], - )); - }, - onFinished: () { - WidgetsBinding.instance.addPostFrameCallback((_) { - _intervalInfo.removeAt(0); - if (_intervalInfo.length == 0) { - Future.delayed(const Duration(microseconds: 500000), () { - setState(() { - doneVisible = true; - _controllerCenter.play(); - }); - }); - } - }); - }, - ), - Align( - alignment: Alignment.bottomCenter, - child: FractionallySizedBox( - widthFactor: 1.0, - heightFactor: 0.5, - child: Container( - alignment: AlignmentDirectional.bottomCenter, - color: const Color.fromARGB(22, 0, 0, 0), - child: AnimatedList( - key: listKey, - initialItemCount: _intervalInfo.length, - itemBuilder: (context, index, animation) { - return CardItemAnimated( - animation: animation, - item: _intervalInfo[index], - fontColor: index == 0 - ? Colors.white - : const Color.fromARGB(153, 255, 255, 255), - fontWeight: index == 0 - ? FontWeight.bold - : FontWeight.normal, - ); - // return slideIt(context, index, animation); - }, - )))), - complete() - ], - ), - ); + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: FractionallySizedBox( + widthFactor: 1.0, + heightFactor: 0.5, + child: Container( + alignment: AlignmentDirectional.bottomCenter, + color: const Color.fromARGB(22, 0, 0, 0), + child: AnimatedList( + key: listKey, + initialItemCount: intervalInfo.length, + itemBuilder: (context, index, animation) { + return CardItemAnimated( + animation: animation, + item: intervalInfo[index], + fontColor: index == 0 + ? Colors.white + : const Color.fromARGB( + 153, 255, 255, 255), + fontWeight: index == 0 + ? FontWeight.bold + : FontWeight.normal, + ); + // return slideIt(context, index, animation); + }, + )))), + complete() + ]); + }) + // child: Stack( + // children: [ + // Countdown( + // controller: _workoutController, + // workSeconds: workoutArgument.exerciseTime, + // restSeconds: workoutArgument.restTime, + // workSound: workoutArgument.workSound, + // restSound: workoutArgument.restSound, + // endSound: workoutArgument.completeSound, + // countdownSound: workoutArgument.countdownSound, + // halfwaySound: workoutArgument.halfwaySound, + // numberOfIntervals: workoutArgument.numExercises, + // build: (_, BackgroundTimerData timerData) { + // if (timerData.status == "complete" && restart == false) { + // done = true; + // } else { + // done = false; + // restart = true; + // } + + // return Text("Hi"); + + // // return Container( + // // color: backgroundColor(timerData.status), + // // child: AnimatedList( + // // initialItemCount: 5, + // // itemBuilder: (context, index, animation) { + // // return Text("Hi"); + // // })); + + // // return AnimatedList( + // // initialItemCount: 5, + // // itemBuilder: (context, index, animation) { + // // return Text("Hi"); + // // }); + + // // if (currentStatus != timerData.status) {} + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // _intervalInfo.removeAt(0); + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // // } + // // }); + + // // return Container( + // // color: backgroundColor(timerData.status), + // // child: Column( + // // children: [ + // // Padding( + // // padding: + // // const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), + // // child: Row( + // // children: [ + // // IconButton( + // // onPressed: () { + // // Navigator.pop(context); + // // }, + // // icon: + // // const Icon(size: 50.0, Icons.arrow_back), + // // color: Colors.white), + // // const Spacer(), + // // IconButton( + // // onPressed: () { + // // if (!timerData.paused) { + // // _workoutController.pause(); + // // } else { + // // _workoutController.resume(); + // // } + // // }, + // // icon: Icon( + // // size: 50.0, + // // timerData.paused + // // ? Icons.play_arrow + // // : Icons.pause), + // // color: Colors.white), + // // ], + // // )), + // // Container( + // // alignment: Alignment.center, + // // child: Align( + // // alignment: Alignment.topCenter, + // // child: Column( + // // children: [ + // // Padding( + // // padding: const EdgeInsets.fromLTRB( + // // 0.0, 20.0, 0.0, 0.0), + // // child: Text( + // // timerScreenText( + // // timerData.numberOfIntervals, + // // timerData.status, + // // exercises, + // // workoutArgument), + // // style: const TextStyle( + // // fontSize: 30, color: Colors.white), + // // ), + // // ), + // // Padding( + // // padding: const EdgeInsets.fromLTRB( + // // 0.0, 0.0, 0.0, 0.0), + // // child: Text( + // // timerData.currentMicroSeconds.toString(), + // // style: const TextStyle( + // // fontSize: 160, color: Colors.white), + // // ), + // // ) + // // ], + // // ))), + // // ], + // // )); + // }, + // onFinished: () { + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // _intervalInfo.removeAt(0); + // // if (_intervalInfo.length == 0) { + // // Future.delayed(const Duration(microseconds: 500000), () { + // // setState(() { + // // doneVisible = true; + // // _controllerCenter.play(); + // // }); + // // }); + // // } + // // }); + // }, + // ), + // // Align( + // // alignment: Alignment.bottomCenter, + // // child: FractionallySizedBox( + // // widthFactor: 1.0, + // // heightFactor: 0.5, + // // child: Container( + // // alignment: AlignmentDirectional.bottomCenter, + // // color: const Color.fromARGB(22, 0, 0, 0), + // // child: AnimatedList( + // // key: listKey, + // // initialItemCount: _intervalInfo.length, + // // itemBuilder: (context, index, animation) { + // // return CardItemAnimated( + // // animation: animation, + // // item: _intervalInfo[index], + // // fontColor: index == 0 + // // ? Colors.white + // // : const Color.fromARGB(153, 255, 255, 255), + // // fontWeight: index == 0 + // // ? FontWeight.bold + // // : FontWeight.normal, + // // ); + // // // return slideIt(context, index, animation); + // // }, + // // )))), + // complete() + // ], + // ), + ); } Color backgroundColor(String status) { diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 9beee45c..8af690de 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -11,12 +11,16 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - just_audio (0.0.1): + - FlutterMacOS - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - soundpool_macos (1.0.0): + - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) @@ -29,8 +33,10 @@ DEPENDENCIES: - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - soundpool_macos (from `Flutter/ephemeral/.symlinks/plugins/soundpool_macos/macos`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) @@ -49,10 +55,14 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos FlutterMacOS: :path: Flutter/ephemeral + just_audio: + :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin shared_preferences_foundation: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + soundpool_macos: + :path: Flutter/ephemeral/.symlinks/plugins/soundpool_macos/macos sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos wakelock_macos: @@ -65,8 +75,10 @@ SPEC CHECKSUMS: flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + soundpool_macos: 3bc0b8b238407516ad9b8afc2647670ff58124f9 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 diff --git a/pubspec.lock b/pubspec.lock index f65331d8..5eefee42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: "25e284cf7a3aa1924c80b5275a7bb7d9ef28236a" + resolved-ref: d5a7e90681912432443aece929c2b76b24e3557f url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -303,10 +303,10 @@ packages: dependency: transitive description: name: flutter_local_notifications - sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + sha256: "501ed9d54f1c8c0535b7991bade36f9e7e3b45a2346401f03775c1ec7a3c06ae" url: "https://pub.dev" source: hosted - version: "15.1.1" + version: "15.1.2" flutter_local_notifications_linux: dependency: transitive description: From dc88d8f0a000c75af65bf9546d783e9555876856 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Sat, 14 Oct 2023 12:05:17 -0400 Subject: [PATCH 27/33] Test not restarting the timer --- lib/start_workout/workout.dart | 10 +++++++--- pubspec.lock | 24 +++--------------------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 04c63cde..2cb93781 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -3,7 +3,8 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; -import 'package:just_audio/just_audio.dart'; +// import 'package:just_audio/just_audio.dart'; +import 'package:audio_session/audio_session.dart'; import 'package:background_timer/background_timer.dart'; import 'package:background_timer/background_timer_data.dart'; import 'package:confetti/confetti.dart'; @@ -39,7 +40,7 @@ class CountDownTimerState extends State final CountdownController _workoutController = CountdownController(autoStart: true); - final player = AudioPlayer(); + // final player = AudioPlayer(); IconData pausePlayIcon = Icons.pause; bool doneVisible = false; @@ -298,7 +299,10 @@ class CountDownTimerState extends State fontWeight: FontWeight.bold, fontSize: 22), ), - onPressed: () { + onPressed: () async { + final session = + await AudioSession.instance; + session.setActive(false); setState(() { shouldReset = true; doneVisible = false; diff --git a/pubspec.lock b/pubspec.lock index 5eefee42..ef390331 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" + sha256: ca12e6c9ac022f33fd89128e7007fb5e97ab6e814d4fa05dd8d4f2db1e3c69cb url: "https://pub.dev" source: hosted - version: "3.4.4" + version: "3.4.5" args: dependency: transitive description: @@ -94,7 +94,7 @@ packages: description: path: "." ref: background-process-intervals - resolved-ref: d5a7e90681912432443aece929c2b76b24e3557f + resolved-ref: "57acef75ca067135ca28a6c0133fbfcdbaacf75f" url: "https://github.com/a-mabe/background_timer.git" source: git version: "0.0.1" @@ -143,11 +143,9 @@ packages: description: name: collection sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted version: "1.17.2" - version: "1.17.2" confetti: dependency: "direct main" description: @@ -426,21 +424,17 @@ packages: description: name: matcher sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted version: "0.12.16" - version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted version: "0.5.0" - version: "0.5.0" meta: dependency: transitive description: @@ -667,11 +661,9 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted version: "1.10.0" - version: "1.10.0" sqflite: dependency: "direct main" description: @@ -749,11 +741,9 @@ packages: description: name: test_api sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted version: "0.6.0" - version: "0.6.0" timer_count_down: dependency: "direct main" description: @@ -850,14 +840,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.4-beta" - web: - dependency: transitive - description: - name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 - url: "https://pub.dev" - source: hosted - version: "0.1.4-beta" win32: dependency: transitive description: From d382c2c4334e0cb56302f4d693dc082e636b370b Mon Sep 17 00:00:00 2001 From: a-mabe Date: Sun, 15 Oct 2023 09:39:30 -0400 Subject: [PATCH 28/33] Regenerate ios icons --- .../Icon-App-1024x1024@1x.png | Bin 6538 -> 59641 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 128 -> 551 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 162 -> 1245 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 190 -> 2081 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 136 -> 864 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 188 -> 1973 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 310 -> 3215 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 162 -> 1245 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 286 -> 2887 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 395 -> 4507 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 180 -> 1619 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 350 -> 3673 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 188 -> 1921 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 382 -> 4223 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 395 -> 4507 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 598 -> 6849 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 262 -> 2561 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 469 -> 5461 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 278 -> 2725 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 505 -> 5847 bytes .../Icon-App-83.5x83.5@2x.png | Bin 563 -> 6376 bytes pubspec.yaml | 2 +- 22 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 605d09e41086679f9f57c6561c86ba0e7e98d3b7..6c0b742e1e9a9ae4fb4120ab3cef800e6f6f6556 100644 GIT binary patch literal 59641 zcmeFY_g53$_XawEfP#pHqM)F!g(gL*QUnX2bO}W|NbkLu0Ez_!6s1d-AiYTf#1KRg zDWL}lAvC4;-jd9n_`QF^{pGIpVJ$KPYt}h?_Ib|U&wlpF8$BI$HWnTh007t?KYFMS z0LP%)W597H=mNha@*KKc@Kb&22lI6B3$*dE2Lb~F#hg7{eQj;L?8Q8N95YuHc>rKO z^YO!b20?Voq&Z(Zu~HnUy+*_f8K zJ9F6|G}-7NtAI#b(ZCUL+8qG+@%{T30PtP@_czeYKzk49Cn)mY1pwGj|KH6d9sU2^ zD60J5HIn)G|J|$u{~P3gKKUO`{+BbG)6amVQEEQ_sUuZxR!HCc{%kt!)-lbr>at?@z4kg9kBlfPDclf3q8y` z(A9Zz`U~pazi0HjRE1{>mMP3Y^8*^});RKibK;Z%VEqJ*9jZUfK&*~vot6G$5bv;D zVw7m;nbtWw;&kn(&1gWe+h9y1IjxPDsH?nnu!%2W!Dnnf);y3Jnp>0Z;Xa1AFZ8=2 zvy=q~kG^bp-eH&_)MADB0QSVmgB3@~^O?Q%gyRcJK~GmVSCBisL#QLOW-7Kp%$H>J zuBT2sli1b9^u$jB{sjQ6`TyDS+P#n0JHN!494O3|ETZl1F8dWT(3?=asWX80XeeB) zDAwp?q{pe{UwfSVIY;I|X^D5yV#2`K92ThW$$X4JL00Q(UCn;+zQ37td7x9|wsr(Z zVTCcf`(SHE)^xfy` zQGfx~MxCOKUt0001BtvYo~MqV z1fb`3lNlLoMzZO8n^qm@M?lp8E)|(WPZ3W( zpdK+X=2%&TIMBt-3@VDq*;qRV}cwzag63&-E?>A ziWIeOCBq>#u&(}TUs7>=a)yl2l5nN0mb4+!t+D%UWP}(=PzK8zqG-+5?`MaD_wupNC&Jbitpj@^(?dQSZ+N zhUF(};)X9~idR`0r={7}7UzB|wGMyqxcJN0rv^33hgM`iE*0a)_X3S&Seu!cbAv_0cM;#AYFFVhOk&Q792>~cH9dkcy66IP9EfcbGf&qqkDEvx`O=eN@G!Ep+v zqUGEVgc`@&lR|R0{wC}qt^FSIDCFhp5}cu(_;1==_qOaxEOGEqE%XJvws_MB7VlH$ zaOX+5KtSrs$;kMf#(?FMfG?JpB5SX{RgiJ;5T~oYnJB5S$sh6j0x%J4@i*6~XGqcs z`Oz)8Fs6`_PUoQ(c?o(t@t$W7^(_#3XMQR9Fr=mvL$Iw`VQ+bU1QoY(*JzR8EA+-T zh54a-vi@t|Q@DzRO+QsQ1?ClZJcCW8ESy8_)XmMR_e?&b%Gw_}C@@T_FaV`WzL!a2 zaEc`A2cU5E@>fav8^1Vo5**v!csr9HBC9S#fu;EzZE(*)9#PqNxN}4POmYcwXmQli zRd8HKt8kR$;u451-l6!CGfUDn0-mYb53CR6#QScscjR>eL1%G@eo`zt&7h=zu`x+q zl4a~<P0H)<*MT7V4Li)ly9hdZD5B> z7g8(z29`^(1b%S*u4^~^Ju9$$GO|E^A&=mboH46xVRAH031Dprv;1ECfkjtWP%+SS z>R^DSJKKkNk!jH$D#)9w??ZFQ$@EL{zOkGraScZ!@SJ9bhO(w5X(cG`1z$-ZrF7J? zT*NZ2aAi;${64&5@k+c32j{rvajV%;|5KXr_{Slck0ZI(ww<`s@3Pn=dcl|rbl=}$ z?!Loau5vx`R9%Jw0WXfWFWO?=Rfmx-jk2|cx*i_$$l^L?!*ZoEA@j$a708|`UFC`T z1HV=3z%-Ih3Z8av{Vfv^zT= z5lM0ZbWvu?lMD*yteXcXBUIkGKad- zPR52$3ic}h#)*Wi^s@W;xa8*`xuv3Xr!`|J)n(Mg!^yF*IOf2@y~}X$se9wBav9&Q z$ZqD!k^AvU(#gomcQQQvIwtLdW%{9?(v8XA+gQ}pITEt;BxI(=&@qg!m}ZhbNGL9+ zvH|PIAw*C9hCo!C?BwF0js>kv_U?`iViJ)b#jf=~%P1euu}j2B_QU6+FK5yrc6<0hu$ZxQG`>~T5abI=ze7dbzss$1? zGm0WC*_;=Y;8dGM&JXM=O5hL}(c{tLmx2<^il^mBps&urat%iG*4}k*nFj@UEe=`O z4kCO}vy(?uiX(kE6KT3i4w5z_a2$kKl*o2fPbGvBR}X&Sn9|G)M%{$7%%HS6jUfO5 z4$b=~V*V89SLfy$K%QX*{OXqs*qLdFfxD|>gB_pn4wsI8vxFH)#=9!HnulMs zK;q!WRyvsH!8@lo2T3`S$;QPB`o#i1c`DTkMfnO2_G=;@b9j*Z_kOzC>!oy2&Ij|mth7`nJdw9h;h=CUZ@x5Pm}w+jAlE-rL_-j|h$9_SUK zA&8+CY3M60YdAEvUC|N13C6sf*rRF@8$ zuj0hkq}OBg|Ee8rtrVcgcNS)PaDW6G#(lgt9mq)_qiw|$8vDTAlacF^l0eI&qgsY& z@hrM`zE>$8^pUJ|HJy(`9aQ=&>eIj2d$5`*Au<+qLpcjS5azL$4m^>L^vj77QrxYv3=I5~}q(S5b3#e%SzSx~=O1wX9+ikGWDftFIRrA&VTt! zJL{%%FJGJHBCpsN_~%}}g`UzjKJAtGNo9o_{7X+vo?8)fE?6htZnF!A6_?}v3tf4S z)I+U8E;2;Q1tfQi3d4{;#3WYYW`qLv!Eyz0?7JcgKt~>L2@jYQ9zv{ zOxm#Tmz(xdE#YLOpZt3neJFnPjFzpJS;0~-5!P_&Ov-Z^VG7z4M#i3h5$otPV79J0 zxwa22cxy*(^E@8HLhzQo9y18_`+qpB7V#_J{~ z_jDcmf=omwmj!g_Hz<{li`5UiIV_!0EFFbg^~Z}|4;WI#RQ&CG8~w&R=7TMZPJ+-U ziMH=i%ROBz2@8A2f!qQbzAxFBWgN^{VBo&0!*C2@32OqA%Ms4#;YwlcZ;sz#?wNcI zKW$fVv^y52kgptq(6n_#`%n9&HjI@|eNbi7wYy42jsa`l?u$7p?|L+mjcC3liyj?1 zCx=>kt?Qko8rs*lG&Q(Wl5gH@kY?0==YTColrr`#VNBjMZTqO-veT$Y)T2rmQt4l|J(t+Li3L@;}a?W?e9S?WqTFGN$t8`nl_mdiXf8glToIHhs zLhgU>jf|f9zWlula-AZy$AD(kELW@~Zf^UT$(p6v&`M7E!fwxSGV!>%NguT!F`}SG z_L*m9utJHlcd_~h#9f7c&!t3Tg0f#I>mI>(Ze@P|Lk(MCcN45Y{XgKi&&seZs_iJ_ zy(jT+k(q+WEhSk=Yme_)RykTYp=#FE6{GBSz}j;!GU#roxO*-CNp_)-BmWt#nAGlY zh+_fk=V?o-TNd6?!zC+RG0UGK4LTXK2G)*-8TiJ-pDK+F9~3RS#|;xL!+H|7iLLug zIvmmxF5L4XCE!Duc&z8|1TtKH+A|aEsi=Z;e15!aG?nN%W<=haP&^P2~uU)f7&{tc^)0 zdqCZ0ZoVNb=7P}J(0fJfL`9irCZ*}U8xa%Lm(QfWhnx{vO(dgzDY(A7P$p?8kizg! zd{TOt zz*2@VJ2!AEuii1IFlo?vo_R zgFZ4Ho{4|v8l@weGT%pp>AaJ~GNt>t@`X9{JwS=6)TQ8<>Xi%kyBV$r^4FK|H}&nt zGPin!I|*Ap)hCa?VyU#$_uHw-U&9uA**#iZO@j7Xvn$PjaGcx|k;i_XE}DBqsJhLn ze0x};ho{K54}uoA*l*+Dr}=k9a3hR|jfXxSXRuRmlGJqk7hW_d+KI8}++687Rwc40 z*`L^!g2M78*Wh=w2iyWVA6Ye&*x8F_Ub0RUSvndfaXl};`W0t=^p){Q-WDxtSGd^n zmU4kE;Ma3D#bvA5cm85Pv%o)NkO!4AwiZ}y1-RS&b|}KQ?{H0|!}vaDNoaga-$MRg z1}NfrDubs##`w^G3Qrf^xrOL>j~Y2} zb#O2v&SHySnjN)(n%gDTi0l&Ihs%yC6L!>xYtO(THL;CeH_PIYSC!RNGAm)D|4yMN zw!$vhaADK*s6J$Sh~>3yAzMQ^`+&nh`MJ{*-wM`SOk%iugy+}%(U3-&pbTw>^)yIi zaGNS_y+k?uqe`L@8jIODW#~C&Yx=%NpMrnvmDxVH|E0Q?)VO^(NqvoV-(N9`Xufw` z<9fS+l-y;DhRb!&hRxgdh^~xbUxD4!at%k>#H=WvQ+eDxw z!}3jL+LR2?76@`G9rN0m>`p0m$BmQv#z-|temwNHhU|gIlv3HpI3g4}lzmG6^1#gs z92@7GH20^pSX8^C|^?^%(B82*d!kUPU&R_}=o@FSNnUR!v zR!@=sDiwKvVkKuqR2cVQq(9G1@b%-@*h+gji$_!k60f#oKkx*V<^Lnx#$ji;n7^{F zr!y(s;+%-c^|KY>eWT2BMFmqaXh5D~+vE8$CoX)uQt5Dt$kL`xDn9iew9d9~a#n%K zC?k<47mFGL13L#1DSQTB-CP!Tk@@KcQ^=Yvx>JvsMpMrY>xhT#qPUl161&iQOS1MrA;T z0#%C$TRm~g!EdSyH8c*S>q*KjA|_{Yu6Gy~nh`xp!pYxv+y*H_N~p|8;+@NP$V$>A zAr^$&7C(9Q>P*D8BTLI=v&-+GsS;?}N$yw24x%F-;nC$ek0^e{@9sh|GK`-Yfr{`e zY@;uS$5o>-G3Ke6EtZ}f@9XI9dkHWvVA4blGNBEEcxs0s zWw9@xy43~~HrF)#mMrXY?3Mf`l&Z(`qQ#nIa#P`Q`JEFN{0czi6#MPM;N=4%a zb{TLBOxaic6eA*L>nv^PifaK2sZ?`C6iWrQ%IthKb=pFWkji51||ur zv^gKS^vp@Osq-pSc!+r}4sE{l5cP1$(|=;Do4e{8b(rG2Xm+O_PQSTw2Hfx^@hDG_ z?(RA*o2Q}`!)iXp?+zUOU=BVCto&;BLYE-_7|f^|(X)U=kW< zWTpGLY3t4m&-W-Mz~d)eqEfSxeIC!B*tm5hp24!rviNrYhvdDx;^{16+5U5cB5^Cj zMwk&9&8{8(dH+MG#;`0qe`5`s&I{StvHydkZ#(vT{e&G&@02ov9aO)S{z@O8oAdDWww_Bn)3dId%n`oJZuf& zledy%S(uJEF^AC#H(<3Z888<|Mgv#<@`&}yQl$@q)e2lA>8b(4k%f3lE4`thoedMD zMbM&*BZPQQQO`wzK!+VG5AEX7yPT6Eb-e2xUS&VYtk#)uUivVz(9*rcPmBG@vdlZ9 zR`H8FSUwmn@MIePh!QySQ6s6?$*VaA*fjvm%B`A;>c5E)Aj$74Q04Xq`!#>W;8_Ov z_d{q0+_3z@``7(;K8G-Ed3a;nJ3|X7N~>}ad2P~QgW>~fGm7)%wvb||Mg#x1!u9Qk zGQ5+0W&I7R*SF$k#r?triOh%@i|e}!@S`RL)hl5evH9FNu-=I|OG#jI{tC?nuidGc zh<0qlw>)rf_wC&@E9tu3pE+$z0MZa5*=kH_KlPk(a4FBlS11m-!Gh$K5%B=gLq1GF6z+8xj8EsN}c7e+HN=0`CC6;OryDW}UYrUyicD~>M0yqx)pwm7namq<|5C5QU>dSW^Go$cn$Fs> zo?}l;J%vLS?x>0@S5E%@((=JJrzrqv&if-P4FoYkXh)Ctq9r>I+g#bDuo%}xqBLma zFY%IJ(Q!%xK z<(Su^40Mwc5Q}O)0~JBVxEksX^&7P^k>6>Ud>>16QmX6m45Y8RqGB)CH(Q(%eQm!V zXqEwsa+dIcV1)U^(V75Fd)iqEWCzx9jEq}>y&o-tdW<%mei<$mVFL=*of~|r=pyX{ zPo!nT+)yH4ao||K51hh)5{vYiWu`Iui^4PjL^~imGDxHTbBDzD;F2b9#ewI~L{ta( zp=7shRL(u*jn9{+nNKV>^TK8XY7}m1`$&XflQ-dbIoPf4^wsOI|cvF$}GxK(g zdWHFU>!KO{DnIuJy8=ccImV4m#p^L5v6l7A_v3P#1EK&gTE#kfyaor-0$Wd@<4(`s z?ARiRlrJ30`O=r!I6JX=O0Rwx)2Rr+j{| zR-_TzL~5$^#bNEask$u&t+jV{xHUo+w%=LGOP2YH?=;N9t-p@+K@)O7(!tGoRr=@8 zo_tR~aeYn~HO!RO&b6Y@?9MQtfxq-e+57_!TMU$KwmY`;p$?Goa1`bgK-g8TPAoUkZK>P~sNgg7VKTs@RYkq-mq5`k&XepKv@DUkUw#TW_2kpF ziVZNx`@wMP&<=6oI<$jV!;VC$e6NT`W8^uqUXEDW;cD**SV5zYOEVO&=;sa@dgO^t zujDJgaEhGg_ty?`6DA31B2PUs^-Kd(IN@FoN~AfOo;lKg%eBt!DYt@-D=N|)`jAF8 zj|hDc=nfE5Cki7n?~;)RJu!J=iQ7w+Vmgb=bCCSzx5p@R30Uu{rHd39ATPxm50dAs z1WDzB>1JK`BcJy>2}|2EME?DCX{G~>I9M|d+U216>@;nLV>?F6JRtk5G3hl3#e<3i ztI9$4zX#~8JO120A;DpfDnDHu(zJaL;vDwWkva6#-vhdf^k{c$&%}IVE4|)<^8MX# zS>DU(7JBliw5&M4)6-9#e_Vt%ze~g^wMy*gFGetl+n?8eu7Cf=1g!s?m!3#o8_a}U z$j(3R3xlW^o*^`XNKV}SxSh&K5Wx$@qQ;TaApN7EwO-9aqy;gHS>mK&W<5f$cBaAA#Ss%3+&;8M;v`mTE zgarym5|L}U^uRyV=?azOah{0x`Np_#2zI?^XxIag+8?kMo{ff7xI%5&-kg!eA1hb? z2obR(bd$vt*y4q4lDv~Idqa0Vrtiuy8QrIRk^kQOZX~--Lc`X#oTs{|=v6UBtslD@ zy~85f8J=0np+77VJV}N=TNP%4ddUp(((O!iFkctSv<1pOcX}|4KT-J8d4;q&W7tHtL$l0gg% z@al@O38?q_#kqcMH}FIiaTDW%ckgsm|Fa@Q$IJzsU)VO6IR|Bsd%2G)X>nuS0P>#- z^Kv{H-0X`sTVH#AAU#YD4Ec-w7&mCo1IlXu0WHw|*gK=M@TyWM7BYIht*^WHA0#{q z%?*7#Z>T6gtv2iK8*$l;k*9q*+7x>Lm2aBPXVI#xKVavWH^%@kb11*5FhhAgr1l$j z6zfjq^>)mJcglbd5Cm|l;lrWTL{PUBl`-%Vz?Yfz_!$U4fZFPQPrt9{nqtFrH@d=h z(-@A^^%EFd5q8gEM`4~=9Vlr}(1N?7Y9>A;^e?u6Rc8>;(~WlSwfDs z)0zSuv^+n_Pi25-&B&KTaB|+Yj~3&fO2c*>@_&t2U&!oylQHXau_)H8cp+22u-ZaT z$v?TYEw<}Vfzh<^YkHKIb->AFamJ3o7#82W{BOmA2Hob}>23A?*Sp*s!aj#_G!U;U zC=tWMzFc-pm_ zk8J4`WFxaSTRIa~WUl0CSFu4y!`k)0kjKWB79>W0&aH}N({lj|?N#R+V!PS|d-h1) z=dv#*YY}4TepH{424_+=5DqvcF^k3hts>vJSoh-)3rDL(S*Fl3IPVqOj<7B;9d_6m z@TIQ&hSpa>X%n80{(Mg9dN{b8MqOU6x6C~6jf0EX?e7Sd68l01eph-9)ivRJ6P&wH z+P0RZttH0pTYRO?y!(yLlf1=A2A)MPVOk6H z%lX$9t?bz(A$U9oweWbNi%UIzziS>Y6AL}|@jf@p!v?n-D$h!6R&`tSw0#?%L1*9A zZfylA9C|v^jl72+1slBP;OJ^gOVq_ZQS~JmREQLP`3TEXsLU4%C6R_~#WG_@?H$=h zR42To2m?Ti2=~WQBhKv|!KQGl_7!IR+Us?um*7-82g`CR@NQ>5H?!A%a1Iw`{M+uxjJ>l#jQ1~x+_i| zHpaejobDb{U+ek?SB+rFD=CW#h&=Jkmrc)j_G6u!U7}hVgW))o(K=gAVRQ+PEWWhy zhL+N)BPm<}rTEg+xq+>s*`rGQ2bi1ie2>Vo_!l_?AAD%OSvW%D$8~?Uz+#D^^8Df! zCu5n==7_b;l~6l^1>IOTfH+_m&q}2(VTH4@WhbuIF`NMU(}PhrpvDdw_%Dnw_6WkL z?hELnDQ3m=fx-?VLJ9LFNBL>5I;}3$l@GIAE~a{9@yz$_^(3I*gQ>q>ns4#CjALEPT^EIPe-!_w<6Lp2wG zfUnB#X}?OHdEmq-B46jM26OH4qjSD_FAff`ZXG^Q&>%kISWe@{4C$4Y=4d*{PinEE)PN;S_T0x}CXj9W^<@yv1BQ3KG6sW=Zb+*b>;`Mu;Vz^xHmI4|dLI{Jw|R9_aPNfBj}U z(4nD?HWM|*W&Om*HiY}*5~#y<)p)&DsTO~Qe+nORD~V9PeOmu`Y_>H+AbN1mbB{R5^yXoWo@n)Hg&Mv_vB{K^d)5!)K zCC-~>$fmHayFoX8ZL+6iGTM}m=|3w$n%6ld!#BJw-bb%~I;=RE&STW$`(QCV;t?s8 ziBx)aC5wT5tYqC6<*xGjSu9~{7KE60DfXL}zH*~P9_#FFdB-(#DxuW^ zCu;b$$$Vhc$0B|=Kg`vYa2$Jy0`*VOnFw#vZ6&wsu2lTN&EJ~N1LW^UrX{!(T#kR) z;&KAAvfNIRPRFl-0L1K;0ioe*0Vq|QH&(&&2t7UPh-<14y}caE0S|hxp)Q*|>bqTP z#WkaNJ)k`K+7q9>ybR@obe{?MgGDi+`GxKwA*i=Q2lCK2pMz8d(q<160Jbp)l6U|a zj(I3(f%w+P!(?!N`e9p6PaxD~NZ&hba+a7la#9Vf^juhtcQ@oRExGy2Lz+U>WI4B6|;DExN>!ivgj|#@Djg8e%EsUvpGBpA~ehQBX2|ef4(7( zkO4@t_8+Qo(fcJSaYB75s4-)m0j^KqaVFEwUWGAIrH@6nS)<%*VPv>0y39&fbODoY zKTIZWQ561D6ZivZ9L=Z z(UgDC5IfZ6j!%ACo&_DJS`3?gE?_e}?sVOy!qBj~R#s-IWNbp8icv+iT5s4TYMfI# zYP%om5NQ!4VNL8R67Y;DUtZPU?=U13^88`1KrilV0cfv>rG@(+jyzmj=2wO}(}t%U zZj5-*167F-I{2QuQ#<1k5z6R%kn$Yu!4=5{$m3){kh*As@eeWZ%;8(w-#UOAg}dAF z#W6Jzf#HUzyW@ibh>n5k0LN#HYy($i?oM33{R@7Ku*2|d%d!G*4#gaAqQJ4mCb`L> z6X*B4(?rl7DiL2kVm=%LbhY2fx?_vylS?5DJrGW9-~RMy z>>m>0ZR7?Yr$DVclP`wg!LXmQtOX>GO48A{uEE13Bsy<-+=X#G?GzilL;Cn&5uquQa47!aULr!wL=H^@(TxRCyC@9v9(2Gtksah+D+#f z9qrPwG)00#LT1ZfhMf3fkrFqu4rE8` z(hA)9O-6$3mGq3{Az1~5bIlcP&x9Ky%ofNs(f9B5#q~Vi6}=9*=@s+aVzwD?Uk2~SKD4Ku}Em)JFhvsMjks!IYaiUD$&LbEN8o zW{(KJ06`0YdBioJ@;Ent|K$!_>#*{Z-r)k8u%fk+b(S8u3$?}~D>vFZQm8p*Fq(eJ z2xK8qqgXcJ`~eu?cFbD+Xae1kzXz{Hut(HZ%$k=Bg)Oe09KFImw;d{|ll-fi6>wXr z)`kxgBG|xIA!DUf<`YoTZ_Z}17KVB^`K*pB)C{QDOhN|MoX&;OPTN6^^Zb{50+ksf9$SvFcxsN8n>zOggG5AU zh!am^-9e*~HV(Jq;(?r21I=oSld{SVj6+5$&#OQ2Efv%Dbfu&sUP-m}r$eM}IK7O; zmM}_Jk!W}AV1six8z6aTN19)BL^Fg1{m81VJmpc4;o&Zlep{K}W9*67vxkt#8RICR zup0)f-@FXDNPNS|R$Vz5XH3o5jPcG}@mmQCW-Irj{wVPrQeV6T!}P-|Kk0dwDTGQ) zJW3RWM7QF3JU2(SLKf~={ZX&z$S?u0ZZq`ylQ6B{zOt_ZW$8d#0d^taGdvhoGJ&g@ zPfg^K!kDbiZ)L5n^({p4Q6|UgU8y~io8Z&wYrGp+PoBCXNd?oaiiVKw+_K^$`*P92 z+F9(@lJxZXxK3?+U1|A*cyYBs-_Wbh#U_c#q2u#1t#2a*3~maZpNDOavd*%j3ik`l zVk=2WrlJb*MYg(`UE=AWB_uzW+POXa-kS>@a!F9)2QJ$GGYxrwt^PWNJc5eaR!S?N z04WFXfBZx^4@|79pxQcZFzhrX;zNW)ypSs3rUQ}}0ZFoDrn*ZDE)(!R|{NZpQhjdp@ z+xAgFMJIuey9zSm%=OlKqa^6 zR`yu%*FyLK{@W@wz$|cr)SW@qklE(BeJt)&oQNnS+E0YQO~ox4%XhaZ z$AH8u^Q%c(4e3C^)m4s2sBtlyJ+ji|cAjNz ze1yp3?WvZG2&(nHVXk44`{P$?d55vVJKU^?)O2skO7Z}tpVeRO@iiZjzF-vK+9-=D zL`xDw_AN~k$BFnuH<@X1HL~|>Q~NEpdZ#A-iF8M~>DDvc zsjlTu`MWC@_$x`nYIUm~OB_UU&f*%abXbB%>?F~nf}XZzuckX@f|;GXhjZ+++v3

rpTv%S+;gJw83 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 F2>{Wi)jt3L diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 0e63b045bc7cef5cb258f5cbf207481c0a963a38..36732eb1c6804b2982f441f21adf259eb1f676bc 100644 GIT binary patch delta 489 zcmVU$zGnD2 zYbgV3uonZ9upsdUf>Kidk;@DTPHGJOQ?D`FT?d$AHZT7q5=%;EX+6!!)qW6urV_;=mWh? fEEopG7pVXMsXvait+{o|00000NkvXXu0mjf;KFPGQ0E2m=!WA^iX RNkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK delta 97 zcmcc1xrlLsM-+pLr;B4q1>@Uuii`{j0t|*Mf3@ue1%wsyIJaFtv!?&;^~Tvvs}^Xj d;97;7;tNP)o);c|U5Eh)JYD@<);T3K0RRYfC076d diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 607d2f8a2294f2c40385626a2e3ec33072bbf472..e6c6ce2a39955738850032cee4c1bc71df3f4a35 100644 GIT binary patch delta 2031 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 758d39bb82d3b59323de1753ec0f8461a9a3b1ec..407f5d72e90af173d9e548c8ce43b20e209e1ad7 100644 GIT binary patch delta 805 zcmV+=1KRwE0pJFZNPhzYNklpHC z9+VbgGg{1b;Q^k|Y#uN+Gn)slTP`aPlp4`gOysg7bWuV`B?swxO6fS|fBvkM%_*ID zV12gVgWvD>-}m+Z{rBJZCw55TA4mMx-~c*+%BiStA~C19 zzMf7*y*`$X#wILDX;@OyQSaD@;H>T+blq+XXdse5Qfwta2*jihFP!by9*_{9N>kf6dA;yM4RzAPv&U+gYp1SVROdFB5gIjN6LlQ9 z`?Pbt*?;nlw{>Pt7)!c6ziNs2V|ylqQ}%giOEs7&6|C`BRyb?jddB7eW&;haJVpVw2#o>7I9z_EzgY)H)^ zGSEjlv4Qxd1`_g0Y1kVhH;%NDauV`iaWZlaN`?JX_6oJdRjndnd8mA)txdj-MkP|! z(9FYkpQJz6!W^GbTv!o`*bA`Ns4cb=N9zOR(Pp*M*lJ;jT8T=u-)9{{yGA87ba$6O j#~vI)9nApx|DoRjH2VJoaQuT^00000NkvXXu0mjf@R^WS delta 71 zcmaFB*1zmvv4FO#qvE8hHQ! diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 4ccc1b368ab65af2561177ef2cc1dbfa11a05eb4..4860af6d30dc76ac718a1820477580495e21e2e9 100644 GIT binary patch delta 1922 zcmV-|2YvXw0ksd1NPh=cNkll3=R5y7SL!6d{{YgiHsD^tP1M!kCV%Q`a1(VkxQV(N+(cas zZlXfsqeCb0!NC)4)};-O#Pa0foo>TDA!@O6XtLPatTU6kdjWUo3I%%HP4W+eub&hb z&on`Q)eJFb#}sWTg0%|xD(rAJ8zJ&kb*demM$~3^Aa{K=wtaRMHDv}29Hl{2oFDun zY>-HR7;hsytAEPCEm?u)w--Y?b|mEKGa!kK=oEW8h3Ju@T6~#W46$8=$uIZ8=qI&M z`^Z?Gb)>fV18o}j5D&J zTK_r3;lhv=jOeobU$NojSsc!M9Q^`)**Bxrj+JZ5uyO7==o@ZsFG@HNhx4udM8xAE zPw3F^y?^0QMfgCZP(b*WR{ezgltR^ml}pnq9sg;%+v&HgR)9VR=9pWXwhrwkz} zkxYz~Z)d@j`3CHT#cU1p0dJyPeyc)dqaHszJ%N>*ELNm^v-c*+KhZdhY$fILcD>pP zCs6!ME_~vGp$hkgWMn+VgJNJ?ySeL$t~y$Zv>`f#`+2eQ!u>@!+o1nP8%r<;LtiUA zD}UPd>fd44TXAa6Aq@R42_lgQiuCC)WzU22x*j55@4L2>7twly8F^K;SUO=CD_=8N z@WqkRHrqCgFhX4+zwMZQBf2AGQXi(`lqmHoluFo-9EWWDn7g)>7tw)YIT&sBHrrZ)I5bCE;c-UxuR2Ar3V)$9qM%KShF6RRoWqGrdINg+ctRwVLNcHq z9HkXNR}n3%yM_V5-Pp`i{8W9V!}ipx0cZXUKhi~$7>@9a0SHR&4Y5pu8bWUQfg*f$ ztelMNkMC2*v8G~ecQ`KB@iCPj(W@kMJ>@c-sHtb=%3Idvt*{1i7&GOh9*mmk1Y(&K=ycKe?)^C9R0_!H1Lv{TIA5-}ewQ&yAHW~5Oo?lp* zuF;OriwM^0MWY}l5ui6)v68Ik)xVVCB-xH`g@xmgu{9r@(}8$Sj+n4sNabNGFQU|& zp+0JCojI13C#}nE)94n|8B9#TRDUulqCVM#8Zt@kp__*S2hty7@6T_`M;@8fE+ZQ5 z=ZW2?|4Qd#g8ZXQSXcy424v} z-s#xm`fA~$ynV9Kp{=}n6J!sM!Jy?^u&3f8#z$%~bzlT`lvm>$a%8(3j3ozy7axdb z??spDvAN`T(BC93YsasMTG_WTmhlOPM)&n6vw5JVCY|Dk#w;bE3yO zD<{MG>&@)+^W*QAv8kjIm&tmZ9p4}GiRXPiZht_(Q*_D&HhT@(1;m@LkBVhiEnCU6 zuBZa_BxL^%Z-opA;X!zftYtbGew{$D1)ciug@$VC;7ImRk!dhmTFFvUGy@VsQU43> z+21ruh$^U1Dtf1I|2A|rxQV(N+(casZlbORH&IuEo2aYd4^=>z%vxnIX#fBK07*qo IM6N<$f|!k{?EnA( delta 123 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 7167c643324c903ab8cc308f5c84b4013804b7f5..ec61cef3f54c5d6bcff396b6fdeda73c3625f6ba 100644 GIT binary patch delta 1189 zcmV;W1X}x|0o@6ZNPh%>Nkl{ zb7SC8Q;Ehor-WpN#mDB0NS2_B@elF2EH0WUZu5bfg>9Pg(kKfP3v-MCo8Y7l7_c%x zy3#^vJI_6dao9yEEzT_cCcot7-gEBnbIYAht`gyYEPug`2KYAx0sU1F&|d`s z{Z&8!XWSk*Nn9(I;X_EmUj+p4{g!ih;^>K4=U&QLiSq1~e&74%pW-Qp3u0 z)XQ&yCl*8W+<)WXM=Sq3K=b$&Y^wSeFD%#NjTh6wXL$6y%j5<;9`IF>G=v*-;A%Y$ z$F?%C+a855FLU7mhpcuO57y(u!gM4m<*?eE_+(EnzNsF>#U3kmy89tfbwIHp7TWDe zSd?r4^YL!jx0Zq@Vj;*%TR1>&XI6Zu5wEOIrf{Zy3x5g^G(cFvLO8*I1!pxgnEZJR zy(Iefbs*`}d_)v1L&)x3us`w?BuRSk!WJ(KVEr!x2o(u&_iY-q4p@-A?`uptU67@^ z5m6_d)s~xdw`~R|3%^22jS=!J4cJXaI6tU@=-I6c1Niod4pii&Qe)oy`F9kK(?r4) z!ka_DT7P+7eLPMNPHnD1W_J;U4;EnZo+7Z@i@{@K;=F1p9u72M40(Fn^bEBZL)0y3 zG=C3ywK+39Mr-r$aGdm{c2hJ8RQ}Wrb(qxay5E2aQQ>52N8uq}cz?VW@BGj?=OmoC zKAe6e-dRCvG2nnKv4xaq1saGKuGguNOQMb(&qa5}MpEzOj9t4VlzM5v0Xgkht4GP< zCQ^rLy40=Sdjx&I+y1eSMkYnoL)p~0%YPeAVrN#8FDZQkOdz$#Sxv?9c9f?6g^g$%-+-q;%fSkla0V)eK@O|$f%IaD$?r_qn zbCbOw_a~}_ybMhjh9M@ST$Y)L?B%NYq?te9pUSvZNy9=`7!Ig!+(rS_G6|i2uJ-&@ zKt7rjr1*_@XajL8FWvlKbqlQ^pdP;p0{W{UpuhS9o2-09xZHv#00000NkvXXu0mjf Dq{BSK delta 97 zcmcc1xrlLsM-+pLr;B4q1>@Uuii`{j0t|*Mf3@ue1%wsyIJaFtv!?&;^~Tvvs}^Xj d;97;7;tNP)o);c|U5Eh)JYD@<);T3K0RRYfC076d diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index e779e1a17de31849fde9f78356509602e97ebacf..d0fdab3803329c0426df043ed06a5e3cbc762d7a 100644 GIT binary patch delta 2844 zcmai$XFSvo1HkV@_Fc9(GbsuuBYVe@bvY|_IP*{TI`b!I6UvG+itLq@bs{6X!kHnI zoqZ?{&-3DW`8=QJ`}X_!d|!X_DEin_5CGkVu9i9q3*N@l8nc>n^*)RLG%-f5teLdtO1P0+8~V16Ci|E@~isos~Pp{eQQ>R7Um$-p*AYjUCr6dgwP zNSmwJ-Q$F&Q#iPCOmD0E#MR_y` zTLK50v<|8U=BmX}tyGVg`q9v&=42oCVl1De2cqa31QO*tM}x?Z z$4z&STtMgao?cCfzEiTC@IF{myzZ6g;%{Lc606ZLnkhD1U3_nIi^jqKYR_lw*cgMT z28@dS6ur%0f5Z||eqHsH?i4U;QdbCMfMpEhgqp20iG>eAt85dCKU+9bfO0N0Sd>t! z%w?Cq{~V`*@yc-zrpw-$)Zo2O=Q*mztk$|4iAz~-tc`+9B03QK;Z(MH?$gKLv5~<6&pL#bJ~@y1!z{+DD`xkp zxMYF82E;aD#n?TN?^TMLl}b=s9e1Y@4Pk=%5q$V7OANa~RK>xkYBN-2@BVqO9Nr?D zT>02}SK21MmeSAz@W74r(QZ0RU`N)ek75_D#cBNx6l}RNUUgHm3)$f<*6_6|!ez}7 zaeA`Sj`jyPA3c#p-`LZ3AzZs8qev-3caQURC3+_tTM#PP7;I*Sw+^QO4$^w>V5maf zbjt@{vo)qB`b zn67pWuio!0)d31L?o({~nbFTJmKhqk%IImK4?)UYOT?#D8mpT^tk2pK*OiUBB#lRQ zG7aJ%jOS;lUoJVWPd*Djs6PrpC9u_iHZpxGpgE2j8GM&;-aJZ7y=bF?(or{44gpDV zJ3RY&P$?jBTd_IYvcPPs(OlH?o+CAe*|A%uoWn}oN}40OZ~zXIf397ZW&m>=aPOPsPIG+9}?tP&>%-v^MV}gO!|#(u|d3*gU-DH zyfIH1E;xR0vz9rXwcU{vv)g5i)hDV6g?$6-Vg$2_B)10(ufUJ|Me1Qi|6ETUqb*$Z zb}bj?wG2&?OZDfv!}#tzgCTNv*;B4rWcr{k_-NW&mZiSy%C*@c7_>7Gc2_`pZfp8-~)6|Coh6Fes@; z%IhbL20=-_Q=Nx#pg-a?cKkryNpppR(y4h_R_V7*u`eSv1lL+IZ=qE+kHEyL9{SEx z?Hg&oMv^aF`09p+7X^dc0yeqE1RhFxmAu+H^YcDNoLkh$#aqoyk$=x{s$- zP3rfa&YB)*lvm}@7O#AToH$MPzN<)vbG=E^8{v1miw2dmc{_76zD7iQc$djr&dyvS zkLRN*EZA8FD{H0$=oH5ec~9r~p&WNZ??%p}@tzO?ak9Mw7F>$N+jY41ut#CDUj#-5 zthIV7Y($R?-Y#1wwg6ST53KD)_P?0m$O?WhV%Q`=_&c6&-{(+qY7+|D^e)0bH8l#o z8%o+gacq)cGlegxb|vJ`D561-!z23);^J36jA50Dm9+df>dT;5o9yxSbEUWL>D$F$ zzdiX9g9RfF!*GZ@bNE0OYbA#WeGG4gveD<>kSkAMJkM&|&wxQ0W)9KUwm12f#j@Zx zP`IY#A_0LD*#n9YsJe8_bVJ@x=U=QPppNnjmkJ{f&|Sflera*NL} zuJ$!WVM0@OO*^hj(|^@!`}Zea=K83ycS?3-Z}Vm(EcSz}+_)wAy^eR?QdCyXzQpav+zQYgxBO>5iJfDAy*B%x8%^o4f9~`>Gmnv7&z1-4n;h;`Y2BNkU4+ zg0)MosgSpsC$F`w8S;+@kJ@buw1skOf&n1{oF}#EJU)O$Vi|*!|1b<=w9e#(!oFwr z_>h`%R=qe1YYs`jN83 zMeyQ4UuTbI>k)S$<_=|~O^lL4*;V8NucuQAGG@sd@xA^Z1J1yEBB+wu9jx(LZg*&;qrg-(ui*zls>pa-c3znSG0xVoSgCc5$13if< zAM+I<Bu9q@E<45?szd*L7_gMz>T1NnFRKkaO;?U>*buh+ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index d962862e5363957733e2866cbfbb8512f90ee73b..659861a133c6b9e181340cd7621daeeaad1d3638 100644 GIT binary patch literal 4507 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png index fbd2e168b10168509f5752ef8d93538bb938eeb4..68a5d30df8f6bac4f0e008d642b92e73a875e3af 100644 GIT binary patch delta 1566 zcmV+(2I2X%0n-eSNPh+ONkl?0wPdEg^lvsDhx$M z%{D}h&PAMaE+AXxwrHlAi*9b3>9WN*vyH@Q)XhiK;HHj|O~t7Q$U`F!K~w}4P#$B_ z+Q)5o?p4g9z~-gYX6ZkMq=3~#H4P+)^3WIe34S713+0{xsU2os_~zq=TedW2oZw+l$k z?M}S8wE&aKmDrG<2*1!F58KSS&47ggrF#~XQUOt7JZwwffNAFe=;tnhBy&E*3uZ$g z7?{fq801{jZ7xD>oF0#bD>M)9ceEQ(db$la%jJkOcYk4ssT#v#ec>KD3<8-HGz*aW z0`!?HV7uK0dRf-f18Kc$z|39w_-4j<%pMoa-K%fw!dGus;@E*^FlHNQSg{V*Ny|m9 z-IKsXY)HiLWHqQDHDo(C5m#FRDs&{oX{n9}VNb}54-{Zd|bM@G6$|+eh7+LVtKA`9m>54f?Hx=$<+sR0qK`!2OAzXbP4WcsH%;ti0OOG()3yB~p=Li@=k4utY2drVXWEXPhm zGB53kZQ=#;Tm2189OVZ$u?X$@d&nhg<54m0Hf~m=MUSr)Y2Z)RijTm8=rB;hfv}t{<6{y(kmkSi7($EjL&aqjHMaEmoK>&^)k`1sLtAF%@2Q7j6t`XsedyWHPCqQqqpoIY4HTJUz zh}JEO!%za9Q(TRlqH2_r*?d$T1|uq4J5VZ?p(%Dew(+ou7l@aPMyR(Z-cO9gKJsO^ zmDcw8?1?KkIgll}r}}&*g{-%%gb3^?t3_#-17}2|kfXAto%d`#j8G9h>bzCBw7hWJ>pmj|8?P;!f&k2GXvwGRSEUTq^jnHy;|^Dt;49uBH2HG7Uzvy(x91^3DMzfo557** zk=gO(QkFWB&i5v@r#se6iXpQR#vP{EbSE?S4+1d(o^BGygRs*2DLCV&Y=1pUpi(fE zxLHqHU)a!s6IX9SPKoC@%_0Pj8l1`C_5eDK5~1Q zV81F#;IN@Mm@$P*D1Rh}tQC31s3K_xo6fLx1@@@IZgxpQDjZsnia0gDlVD%6dtED1 zHJrP8)Kghx!|FgQCH-m8i`Y`JW9sCtYP_?_1>$USfjFC7AkHQih!?ZzZ+eRYD(M4q Q7XSbN07*qoM6N<$g5ebJ2LJ#7 delta 115 zcmcc2vxRYjM-D@nr;B4q1>@WEj=T&C0tXD_er&Iqp^&J!wkdc0%t-kg>zVTmgOZmV n^XQ!@rEKb!)pJE+C1C+esX5HYOc=ab8Gyjk)z4*}Q$iB}8u}{a diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index de24e4f8c1e494bd6947181da9bfc68ef2df492c..74d85b586aaa7badfd74a51db3801b33e32a771f 100644 GIT binary patch literal 3673 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 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^MIg+<1|<9Mw$=hE$r9IylHmNblJdl&REF~Ma=pyF z?Be9af>gcyqV(DCY@`?%7!^ES978G?-(Eb($)F%`z(D@p{!cqw6sDy#Ienis^XT_) ouNmGM7#%vnp{(4~GXfbFueDf?CI8s>5*VNip00i_>zopr0N5gmQUCw| diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index d962862e5363957733e2866cbfbb8512f90ee73b..659861a133c6b9e181340cd7621daeeaad1d3638 100644 GIT binary patch literal 4507 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 7a2f1aa3f8b5cb730127906b5f946d251e9eba5c..0d369332066ac38c6db9f6a2776ab2804a1c51c8 100644 GIT binary patch literal 6849 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 LT1l!}!VvZ!fgTlF literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&k|nMYCBgY=CFO}lsSM@i<$9TU z*~Q6;1*v-ZMd`EO*+?-kF#hm#aSW+oe0ymlCxZdcfem~=|3CfG>2%OTyyC;0yS4&` z`Z)^uiK}St6r?Lpeb7Z24KwmDS&U3QQ;rp00i_>zopr E06x#$mH+?% diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index ed415b95151ead978426d83e3558293fc6f35d00..e21dd89a0af54c29ff178240114980d56a4db397 100644 GIT binary patch delta 2515 zcmb7`=Q|sU0>*1sS{h=+9#u1xqEaz(jHcE(sI6MHTbrugh|z>viQ0-r96iJyu_+-O zqgJ(Q2d!AqQd*?WxzGIr?sMO7@AJIB_w(;LGm0%AL0y?7whG_sFMTPx<-J5#K6tj=cHA9Jr<)wIUVQR` zKnh&3Kq7z`mfs|~Sy50RD;55~N|bGB5e^WO6S|i~Ig4@t3tZ;XoE8iF)1Ix;s;RUN zf09IzL7(K)0@`l}sr~14(-wteoKnfKVfikbjIC&ZPAoprp~@JK5Muv%vmcMF)gs>W zoY;N>OdjY8$?y`q^P!SL>(3tgU8%pkh~i_ry~^*yvJ8Z^w$8yJ^>Jx$F6Vp*G$84N zw!GLh(z!Eb1`M@BdC5{tUR@6w0Z+6mc%AL;Q4*>wz#4z^mk@5de~h>SZFj6^Y)Kr! zYyD8~aX&qL_3Df4ngkZ(Wlxc;O+s@MJGU+l6T+pOn^~ph5RD6sj;vFe$tv%L5LTxA z&$+@Wm7#__qH8lWXlxd9RMJ$dGOsgSRA^A|#PgtZF6=_(*!)CHC9pxiI$lO^cKtXY z1ofC-(VSt=J-&oYZAvY9IGZPlF~ZkeX=zBrkPB;o!ya`-`YgCaEYecN`O*fW>f!f! zlK)~Lpkb#u|~{uB_H5FTiGkaM5NL$%GN6u9Y^LFAxl&79d~-3a`=MEc<6Lb z(RV7{86|X`6t89h@I`0|*6`Cl_3X1_)0F0;AkQTppU2KC=QLoy9!_Mq`+mY_P6Z#w zQ~ROg*z+RTHzqo>)v+TsQs8Y3w*yGRQ&ivnEBNly^-|+`fy87L&8vL-L(~?0`ho+N zBeL|W&XW2%(ojG=0Kz^QK^W6!rzK8yjwSVVz@uw(@J&YwN8{#+*<@ESMd`nb4ne!r zrmq?XY`HN3N?Vv>nS$KA4Lsqo+{7*}s;T!MC~beOnfa;Z7?kz9CAhvE%>2b>py=u6 z8QTS74LxRG$$=;AmVXz(Sm^-Rs6MB9+xo)rOz;HKZ;oYg_XdXLwCgkE)2eN0%5&NE zT>U-?Uc6L`DmlJF`LW+n$JFkvnG_#L0})#E}?IukJNi?#z3(x10io0PxB;!erg zjJXz!0}-kLtR@fqNVG=<=+z+d3a`re?-?)e!CdYS#7f^fGr6ZO%KZ_H_UL}PU%V-CU;^fAZ{W_9gGJU@uQp>H8^hPZx<@!mxc3-Fy@E+v{PnD{9L!}j}S} zQ_VB2oxRDn;-?{HP>tLZ1~wE@LUmj0Fyt}9SsyWe7!&Kl(KyQ9)mrAZzdgxaHbD(H zS*?Xdh~;kbnl2<&Z3B0J%SI4V>Vrcao$y+e#>ApqwCd$M);(QOUX`}%#n_mgVcRr zy83QsjL4Clbt?DHLUW8*1V3i*)j<8~kFgB4p^j4^{qWdh4JmXikj}S^u+74)0dx}p zUw79@Y4c6x9X-fRmD9V#^0V3HPWuB1?n{*CS@xJa-j;O{00k#wNM^t*@r-qUN12|; zuI=gGp3vLO@uyAKPl=<7aW;Oa?BIk42Yayo4tR(eXSYn-Fvsb^J}F)rBEs`_FzXK7 zqEMJJ_&`qFzXzmEM&2mQ-VgD+Nh6l%gGh= zX~;WYl_Bazi5HIFL!7*a5tU)lL6U>4KfxmR&#zPu|Gw~-hre_C_@9%sx`-baVvw&6 z1)`k_SQ@*28OR-4d<%jgVa(3s%WlePw2lx*_;GkkLP?o2gm!~x_`=|?%;f0r7DS;x zuO;8rZ=k#5Sf8mvQmaY%pvE5f#+vJkcOZ1#6|M$3x*gTplWUuAR>6iy`$JhV-D6cl zJ^lFDBO|z5JMp?%ZFf9k&CBut?+bl45?szd%;kUK|$bv0o$MGI*|g|L=TZKyRM(nS@-RA v!+l8+9xgW4<|fC33lahhG$aOqTfi`*f<^9otK1==n;AS^{an^LB{Ts5#FR{; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png index 9f8be2b5905f7466323c52b5e9c105ab59dda5d5..4f90b3d9cdf4e6cf10146a8cac9b64d3e62cf03a 100644 GIT binary patch literal 5461 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 DHkO37 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c0e53cc4abeb44c245d09d90225893eba00f68be..02299acc6ae3e006375d39ac53c6427175a2fb64 100644 GIT binary patch delta 2680 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 b%C;Q@!rU`I4a2R?_Gi`>_U5goerf*#&chQ) literal 278 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 E06(qwWB>pF diff --git a/pubspec.yaml b/pubspec.yaml index 5b9b69b3..af98e4ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: flutter_launcher_icons: android: "launcher_icon" ios: true - image_path_ios: "assets/icon/ios2.png" + image_path_ios: "assets/icon/ios.png" image_path: "assets/icon/drawing.png" min_sdk_android: 21 # android min sdk min:16, default 21 adaptive_icon_background: "#ffffff" # only available for Android 8.0 devices and above From 8aec13186508931f6d5dcab911f2481232818d81 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Sun, 15 Oct 2023 12:51:27 -0400 Subject: [PATCH 29/33] Deactivate audio session on workout start --- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- lib/start_workout/workout.dart | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 66868c10..6e658938 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -370,7 +370,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -503,7 +503,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -530,7 +530,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.background-timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 2cb93781..5abe79dd 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -64,6 +64,12 @@ class CountDownTimerState extends State _controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); Wakelock.enable(); + init(); + } + + void init() async { + final session = await AudioSession.instance; + session.setActive(false); } @override From 3793dc403700e3d3a4d4bd28ef44d43944fb3f96 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Sun, 15 Oct 2023 13:44:42 -0400 Subject: [PATCH 30/33] Update iOS identifier --- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- lib/start_workout/workout.dart | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6e658938..d879303e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -370,7 +370,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workoutTimer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -503,7 +503,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workoutTimer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -530,7 +530,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workout_timer"; + PRODUCT_BUNDLE_IDENTIFIER = "com.codepup.workoutTimer"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index 5abe79dd..c80ae56f 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -3,7 +3,6 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; import 'package:background_timer/background_timer_controller.dart'; -// import 'package:just_audio/just_audio.dart'; import 'package:audio_session/audio_session.dart'; import 'package:background_timer/background_timer.dart'; import 'package:background_timer/background_timer_data.dart'; @@ -40,9 +39,9 @@ class CountDownTimerState extends State final CountdownController _workoutController = CountdownController(autoStart: true); - // final player = AudioPlayer(); - IconData pausePlayIcon = Icons.pause; + int currentWorkInterval = 0; + bool flipCurrentWorkInterval = true; bool doneVisible = false; bool done = false; @@ -114,14 +113,24 @@ class CountDownTimerState extends State } String timerScreenText(interval, status, exercises, Workout workoutArgument) { + print("------------- interval"); + print(currentWorkInterval); + print("------------- end"); + switch (status) { case 'start': return "Get ready"; case 'work': - return workoutArgument.numExercises < exercises.length - ? exercises[exercises.length - interval] + String exercise = workoutArgument.numExercises == exercises.length + ? exercises[interval] : "Work"; + flipCurrentWorkInterval = true; + return exercise; case 'rest': + if (flipCurrentWorkInterval) { + currentWorkInterval++; + flipCurrentWorkInterval = false; + } return "Rest"; default: return ""; @@ -314,6 +323,7 @@ class CountDownTimerState extends State doneVisible = false; restart = true; done = false; + // currentWorkInterval = 0; // _workoutController.restart(); Wakelock.enable(); }); @@ -400,13 +410,9 @@ class CountDownTimerState extends State // } if (timerData.status == "complete" && restart == false) { - // WidgetsBinding.instance.addPostFrameCallback((_) { - // _controllerCenter.play(); - // doneVisible = true; - // Wakelock.disable(); - // }); done = true; } else if (timerData.status == "start") { + currentWorkInterval = 0; ListModel intervalList = ListModel( listKey: listKey, @@ -496,7 +502,7 @@ class CountDownTimerState extends State 0.0, 20.0, 0.0, 0.0), child: Text( timerScreenText( - timerData.numberOfIntervals, + currentWorkInterval, timerData.status, exercises, workoutArgument), From 09d9ee75f2dcb95746d188133142eff342b5a90a Mon Sep 17 00:00:00 2001 From: a-mabe Date: Sun, 15 Oct 2023 20:28:43 -0400 Subject: [PATCH 31/33] Add new Android permission declerations and point background timer package at main branch --- android/app/src/main/AndroidManifest.xml | 2 ++ pubspec.lock | 24 ++++++++++++------------ pubspec.yaml | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a7a0ff5d..91b59fd6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ + + Date: Wed, 25 Oct 2023 16:59:32 -0400 Subject: [PATCH 32/33] Use sound_pool for playing sample sounds --- lib/create_workout/set_sounds.dart | 82 +++++++++++++++++++++--------- pubspec.lock | 2 +- pubspec.yaml | 1 + 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/lib/create_workout/set_sounds.dart b/lib/create_workout/set_sounds.dart index b361bb73..a89e7da7 100644 --- a/lib/create_workout/set_sounds.dart +++ b/lib/create_workout/set_sounds.dart @@ -1,7 +1,10 @@ +import 'dart:typed_data'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:soundpool/soundpool.dart'; import 'package:sqflite/sqflite.dart'; import 'package:uuid/uuid.dart'; -import 'package:audioplayers/audioplayers.dart'; import '../main.dart'; import '../workout_data_type/workout_type.dart'; import '../database/database_manager.dart'; @@ -56,8 +59,6 @@ class SetSounds extends StatefulWidget { // Define a corresponding State class. // This class holds the data related to the Form. class _SetSoundsState extends State { - final _player = AudioPlayer(); - String _workSound = "short-whistle"; String _restSound = "short-rest-beep"; String _halfwaySound = "short-halfway-beep"; @@ -72,7 +73,9 @@ class _SetSoundsState extends State { void pushHome() { Navigator.pushAndRemoveUntil( - context, MaterialPageRoute(builder: (_) => const MyHomePage()), (route) => false); + context, + MaterialPageRoute(builder: (_) => const MyHomePage()), + (route) => false); } void submitWorkout(Workout workoutArgument) async { @@ -87,12 +90,16 @@ class _SetSoundsState extends State { workoutArgument.id = const Uuid().v1(); Database database = await DatabaseManager().initDB(); - await DatabaseManager().insertList(workoutArgument, database).then((value) { + await DatabaseManager() + .insertList(workoutArgument, database) + .then((value) { pushHome(); }); } else { Database database = await DatabaseManager().initDB(); - await DatabaseManager().updateList(workoutArgument, database).then((value) { + await DatabaseManager() + .updateList(workoutArgument, database) + .then((value) { pushHome(); }); } @@ -100,23 +107,34 @@ class _SetSoundsState extends State { @override Widget build(BuildContext context) { - Workout _workoutArgument = ModalRoute.of(context)!.settings.arguments as Workout; + SoundpoolOptions soundpoolOptions = const SoundpoolOptions(); + + Soundpool pool = Soundpool.fromOptions(options: soundpoolOptions); + + var soundIdMap = {}; + + for (final sound in soundsList) { + soundIdMap[sound] = loadSound(sound, pool); + } - if (_workoutArgument.workSound != "") { + Workout workoutArgument = + ModalRoute.of(context)!.settings.arguments as Workout; + + if (workoutArgument.workSound != "") { if (!_workSoundChanged) { - _workSound = _workoutArgument.workSound; + _workSound = workoutArgument.workSound; } if (!_restSoundChanged) { - _restSound = _workoutArgument.restSound; + _restSound = workoutArgument.restSound; } if (!_halfwaySoundChanged) { - _halfwaySound = _workoutArgument.halfwaySound; + _halfwaySound = workoutArgument.halfwaySound; } if (!_completeSoundChanged) { - _completeSound = _workoutArgument.completeSound; + _completeSound = workoutArgument.completeSound; } if (!_countdownSoundChanged) { - _countdownSound = _workoutArgument.countdownSound; + _countdownSound = workoutArgument.countdownSound; } } @@ -145,14 +163,15 @@ class _SetSoundsState extends State { onChanged: (String? value) async { // This is called when the user selects an item. if (value != 'none') { - await _player.play(AssetSource('audio/$value.mp3')); + await pool.play(await soundIdMap[value]); } setState(() { _workSound = value!; _workSoundChanged = true; }); }, - items: soundsList.map>((String value) { + items: + soundsList.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -185,14 +204,15 @@ class _SetSoundsState extends State { onChanged: (String? value) async { // This is called when the user selects an item. if (value != 'none') { - await _player.play(AssetSource('audio/$value.mp3')); + await pool.play(await soundIdMap[value]); } setState(() { _restSound = value!; _restSoundChanged = true; }); }, - items: soundsList.map>((String value) { + items: + soundsList.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -225,14 +245,15 @@ class _SetSoundsState extends State { onChanged: (String? value) async { // This is called when the user selects an item. if (value != 'none') { - await _player.play(AssetSource('audio/$value.mp3')); + await pool.play(await soundIdMap[value]); } setState(() { _halfwaySound = value!; _halfwaySoundChanged = true; }); }, - items: soundsList.map>((String value) { + items: + soundsList.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -265,14 +286,15 @@ class _SetSoundsState extends State { onChanged: (String? value) async { // This is called when the user selects an item. if (value != 'none') { - await _player.play(AssetSource('audio/$value.mp3')); + await pool.play(await soundIdMap[value]); } setState(() { _completeSound = value!; _completeSoundChanged = true; }); }, - items: soundsList.map>((String value) { + items: + soundsList.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -305,14 +327,15 @@ class _SetSoundsState extends State { onChanged: (String? value) async { // This is called when the user selects an item. if (value != 'none') { - await _player.play(AssetSource('audio/$value.mp3')); + await pool.play(await soundIdMap[value]); } setState(() { _countdownSound = value!; _countdownSoundChanged = true; }); }, - items: countdownSounds.map>((String value) { + items: countdownSounds + .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -328,7 +351,7 @@ class _SetSoundsState extends State { padding: const EdgeInsets.symmetric(vertical: 16.0), child: ElevatedButton( onPressed: () async { - submitWorkout(_workoutArgument); + submitWorkout(workoutArgument); }, child: const Text('Submit'), ), @@ -337,4 +360,15 @@ class _SetSoundsState extends State { ], ); } + + static Future loadSound(String sound, Soundpool pool) async { + if (sound != "none") { + return await rootBundle + .load("packages/background_timer/lib/assets/audio/$sound.mp3") + .then((ByteData soundData) { + return pool.load(soundData); + }); + } + return -1; + } } diff --git a/pubspec.lock b/pubspec.lock index b3712784..26f86338 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -625,7 +625,7 @@ packages: source: sdk version: "0.0.99" soundpool: - dependency: transitive + dependency: "direct main" description: name: soundpool sha256: fe7302005759d6a3561de1711e3ea818b1ba025a62375b469196dda5b654bd38 diff --git a/pubspec.yaml b/pubspec.yaml index b97313ce..374e653c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: url: https://github.com/a-mabe/background_timer.git ref: main # branch name just_audio: ^0.9.35 + soundpool: ^2.4.1 flutter_launcher_icons: android: "launcher_icon" From 5967632c5d8d14e7c7fac1cdd085870c12828eb2 Mon Sep 17 00:00:00 2001 From: a-mabe Date: Wed, 25 Oct 2023 17:04:53 -0400 Subject: [PATCH 33/33] Code cleanup --- lib/main.dart | 23 ---- lib/start_workout/workout.dart | 233 +-------------------------------- 2 files changed, 3 insertions(+), 253 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 8714bf38..a9e841b2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,29 +48,6 @@ class _MyHomePageState extends State { // init(); } - // void init() async { - // // final session = await AudioSession.instance; - // // await session.configure(const AudioSessionConfiguration.music()); - - // final session = await AudioSession.instance; - // await session.configure(const AudioSessionConfiguration( - // avAudioSessionCategory: AVAudioSessionCategory.ambient, - // avAudioSessionCategoryOptions: - // AVAudioSessionCategoryOptions.mixWithOthers, - // avAudioSessionMode: AVAudioSessionMode.defaultMode, - // avAudioSessionRouteSharingPolicy: - // AVAudioSessionRouteSharingPolicy.defaultPolicy, - // avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, - // androidAudioAttributes: AndroidAudioAttributes( - // contentType: AndroidAudioContentType.music, - // flags: AndroidAudioFlags.audibilityEnforced, - // usage: AndroidAudioUsage.media, - // ), - // androidAudioFocusGainType: AndroidAudioFocusGainType.gain, - // androidWillPauseWhenDucked: true, - // )); - // } - int calculateWorkoutTime(Workout workout) { return (((workout.exerciseTime * workout.numExercises) + (workout.restTime * (workout.numExercises - 1)) + diff --git a/lib/start_workout/workout.dart b/lib/start_workout/workout.dart index c80ae56f..9abd0be2 100644 --- a/lib/start_workout/workout.dart +++ b/lib/start_workout/workout.dart @@ -113,10 +113,6 @@ class CountDownTimerState extends State } String timerScreenText(interval, status, exercises, Workout workoutArgument) { - print("------------- interval"); - print(currentWorkInterval); - print("------------- end"); - switch (status) { case 'start': return "Get ready"; @@ -213,8 +209,6 @@ class CountDownTimerState extends State final GlobalKey listKey = GlobalKey(); - print(shouldReset); - setState(() { if (shouldReset) { shouldReset = false; @@ -224,7 +218,6 @@ class CountDownTimerState extends State removedItemBuilder: _buildRemovedItem, ); intervalTotal = intervalInfo.length; - print("${intervalInfo.length}"); if (restart) { _workoutController.restart(); restart = false; @@ -239,7 +232,7 @@ class CountDownTimerState extends State maintainState: true, child: Container( alignment: Alignment.center, - color: Color.fromARGB(255, 0, 225, 255), + color: const Color.fromARGB(255, 0, 225, 255), child: Stack( children: [ Align( @@ -357,58 +350,20 @@ class CountDownTimerState extends State halfwaySound: workoutArgument.halfwaySound, numberOfWorkIntervals: workoutArgument.numExercises, onFinished: () { - print("FINISHED"); WidgetsBinding.instance.addPostFrameCallback((_) { if (intervalInfo.length == 1) { intervalInfo.removeAt(0); - print("should be empty"); - print(intervalInfo.length); - Future.delayed(Duration(microseconds: 500000), () { + Future.delayed(const Duration(microseconds: 500000), () { setState(() { - // _showText = true; doneVisible = true; _controllerCenter.play(); - - // intervalInfo = ListModel( - // listKey: listKey, - // initialItems: listItems(exercises, workoutArgument), - // removedItemBuilder: _buildRemovedItem, - // ); }); }); - - // intervalInfo = ListModel( - // listKey: listKey, - // initialItems: listItems(exercises, workoutArgument), - // removedItemBuilder: _buildRemovedItem, - // ); } - // print("---------------------------"); - // print(intervalInfo.length); - // intervalInfo.removeAt(0); - - // print("REMOVED"); - // if (intervalInfo.length == 0) { - // Future.delayed(Duration(microseconds: 500000), () { - // setState(() { - // // _showText = true; - // doneVisible = true; - // _controllerCenter.play(); - // }); - // }); - // } }); }, build: (_, BackgroundTimerData timerData) { - // if (timerData.status == "complete") { - // doneVisible = true; - // // shouldReset = true; - // } else { - // doneVisible = false; - // // shouldReset = false; - // } - if (timerData.status == "complete" && restart == false) { done = true; } else if (timerData.status == "start") { @@ -422,10 +377,8 @@ class CountDownTimerState extends State int count = 0; while (intervalInfo.length < intervalTotal) { - // if (intervalInfo.length > 0 && doneVisible == false) { intervalInfo.insert(count, intervalList[count]); count++; - // } } } else { done = false; @@ -439,27 +392,6 @@ class CountDownTimerState extends State } } - // int intervalDifference = - // if () - - // if (intervalsCompleted > 0) { - // WidgetsBinding.instance.addPostFrameCallback((_) { - // print("Remove"); - // _intervalInfo.removeAt(0); - // intervalsCompleted--; - // // if (_intervalInfo.length == 0) { - // // Future.delayed(const Duration(microseconds: 500000), () { - // // setState(() { - // // doneVisible = true; - // // _controllerCenter.play(); - // // }); - // // }); - // }); - // } - - print(intervalsCompleted); - print(intervalInfo.length); - return Stack(children: [ Container( color: backgroundColor(timerData.status), @@ -547,170 +479,11 @@ class CountDownTimerState extends State ? FontWeight.bold : FontWeight.normal, ); - // return slideIt(context, index, animation); }, )))), complete() ]); - }) - // child: Stack( - // children: [ - // Countdown( - // controller: _workoutController, - // workSeconds: workoutArgument.exerciseTime, - // restSeconds: workoutArgument.restTime, - // workSound: workoutArgument.workSound, - // restSound: workoutArgument.restSound, - // endSound: workoutArgument.completeSound, - // countdownSound: workoutArgument.countdownSound, - // halfwaySound: workoutArgument.halfwaySound, - // numberOfIntervals: workoutArgument.numExercises, - // build: (_, BackgroundTimerData timerData) { - // if (timerData.status == "complete" && restart == false) { - // done = true; - // } else { - // done = false; - // restart = true; - // } - - // return Text("Hi"); - - // // return Container( - // // color: backgroundColor(timerData.status), - // // child: AnimatedList( - // // initialItemCount: 5, - // // itemBuilder: (context, index, animation) { - // // return Text("Hi"); - // // })); - - // // return AnimatedList( - // // initialItemCount: 5, - // // itemBuilder: (context, index, animation) { - // // return Text("Hi"); - // // }); - - // // if (currentStatus != timerData.status) {} - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // _intervalInfo.removeAt(0); - // // if (_intervalInfo.length == 0) { - // // Future.delayed(const Duration(microseconds: 500000), () { - // // setState(() { - // // doneVisible = true; - // // _controllerCenter.play(); - // // }); - // // }); - // // } - // // }); - - // // return Container( - // // color: backgroundColor(timerData.status), - // // child: Column( - // // children: [ - // // Padding( - // // padding: - // // const EdgeInsets.fromLTRB(0.0, 0.0, 15.0, 0.0), - // // child: Row( - // // children: [ - // // IconButton( - // // onPressed: () { - // // Navigator.pop(context); - // // }, - // // icon: - // // const Icon(size: 50.0, Icons.arrow_back), - // // color: Colors.white), - // // const Spacer(), - // // IconButton( - // // onPressed: () { - // // if (!timerData.paused) { - // // _workoutController.pause(); - // // } else { - // // _workoutController.resume(); - // // } - // // }, - // // icon: Icon( - // // size: 50.0, - // // timerData.paused - // // ? Icons.play_arrow - // // : Icons.pause), - // // color: Colors.white), - // // ], - // // )), - // // Container( - // // alignment: Alignment.center, - // // child: Align( - // // alignment: Alignment.topCenter, - // // child: Column( - // // children: [ - // // Padding( - // // padding: const EdgeInsets.fromLTRB( - // // 0.0, 20.0, 0.0, 0.0), - // // child: Text( - // // timerScreenText( - // // timerData.numberOfIntervals, - // // timerData.status, - // // exercises, - // // workoutArgument), - // // style: const TextStyle( - // // fontSize: 30, color: Colors.white), - // // ), - // // ), - // // Padding( - // // padding: const EdgeInsets.fromLTRB( - // // 0.0, 0.0, 0.0, 0.0), - // // child: Text( - // // timerData.currentMicroSeconds.toString(), - // // style: const TextStyle( - // // fontSize: 160, color: Colors.white), - // // ), - // // ) - // // ], - // // ))), - // // ], - // // )); - // }, - // onFinished: () { - // // WidgetsBinding.instance.addPostFrameCallback((_) { - // // _intervalInfo.removeAt(0); - // // if (_intervalInfo.length == 0) { - // // Future.delayed(const Duration(microseconds: 500000), () { - // // setState(() { - // // doneVisible = true; - // // _controllerCenter.play(); - // // }); - // // }); - // // } - // // }); - // }, - // ), - // // Align( - // // alignment: Alignment.bottomCenter, - // // child: FractionallySizedBox( - // // widthFactor: 1.0, - // // heightFactor: 0.5, - // // child: Container( - // // alignment: AlignmentDirectional.bottomCenter, - // // color: const Color.fromARGB(22, 0, 0, 0), - // // child: AnimatedList( - // // key: listKey, - // // initialItemCount: _intervalInfo.length, - // // itemBuilder: (context, index, animation) { - // // return CardItemAnimated( - // // animation: animation, - // // item: _intervalInfo[index], - // // fontColor: index == 0 - // // ? Colors.white - // // : const Color.fromARGB(153, 255, 255, 255), - // // fontWeight: index == 0 - // // ? FontWeight.bold - // // : FontWeight.normal, - // // ); - // // // return slideIt(context, index, animation); - // // }, - // // )))), - // complete() - // ], - // ), - ); + })); } Color backgroundColor(String status) {