diff --git a/.fvmrc b/.fvmrc index 5ffa690a..aa516b10 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,3 +1,3 @@ { - "flutter": "3.24.0" + "flutter": "3.38.9" } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c8aeb149..c7e5b89e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "dart.flutterSdkPath": ".fvm/flutter_sdk", "dart.sdkPath": ".fvm/flutter_sdk/bin/cache/dart-sdk", + "dart.lineLength": 180, // Remove .fvm files from search "search.exclude": { "**/.fvm": true diff --git a/analysis_options.yaml b/analysis_options.yaml index 67cbb1f3..22e84b97 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -22,7 +22,6 @@ linter: rules: - unawaited_futures - always_declare_return_types - - unsafe_html - use_full_hex_values_for_flutter_colors - prefer_final_in_for_each - prefer_final_fields diff --git a/android/app/build.gradle b/android/app/build.gradle index bf5cbb3b..3d42c2b7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -24,8 +24,10 @@ if (flutterVersionName == null) { } android { - buildToolsVersion "30.0.0" - compileSdkVersion 34 + buildToolsVersion "34.0.0" + compileSdkVersion 36 + ndkVersion "29.0.14033849" + namespace "com.icapps.fluttertemplate" sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -39,7 +41,7 @@ android { defaultConfig { applicationId "com.icapps.fluttertemplate" minSdkVersion flutter.minSdkVersion - targetSdkVersion 34 + targetSdkVersion 35 multiDexEnabled true versionCode flutterVersionCode.toInteger() versionName flutterVersionName @@ -93,6 +95,19 @@ android { dimension "flavors" } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + + buildFeatures { + buildConfig = true + } } flutter { diff --git a/android/gradle.properties b/android/gradle.properties index b6e61b62..3d9f097c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -2,3 +2,4 @@ android.enableJetifier=true android.useAndroidX=true org.gradle.jvmargs=-Xmx1536M android.enableR8=true +kotlin.jvm.target.validation.mode=IGNORE \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 6b665338..bc658507 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip \ No newline at end of file diff --git a/android/settings.gradle b/android/settings.gradle index dd496b31..a82b9e33 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,9 +18,9 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false - id "org.jetbrains.kotlin.android" version "1.9.0" apply false - id "com.google.gms.google-services"version "4.3.8" apply false + id "com.android.application" version "8.7.0" apply false + id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.google.gms.google-services"version "4.4.2" apply false id "com.google.firebase.crashlytics" version "2.9.9" apply false } diff --git a/coverage/lcov_cobertura.py b/coverage/lcov_cobertura.py deleted file mode 100644 index 97487780..00000000 --- a/coverage/lcov_cobertura.py +++ /dev/null @@ -1,403 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2011-2012 Eric Wendelin -# -# This is free software, licensed under the Apache License, Version 2.0, -# available in the accompanying LICENSE.txt file. - -""" -Converts lcov line coverage output to Cobertura-compatible XML for CI -""" - -import re -import sys -import os -import time -import subprocess -from xml.dom import minidom -from optparse import OptionParser - -from distutils.spawn import find_executable - -CPPFILT = "c++filt" -HAVE_CPPFILT = False - -if find_executable(CPPFILT) is not None: - HAVE_CPPFILT = True - -VERSION = '1.6' -__all__ = ['LcovCobertura'] - - -def demangle(name): - pipe = subprocess.Popen([CPPFILT, name], stdin=subprocess.PIPE, stdout=subprocess.PIPE) - stdout, _ = pipe.communicate() - return stdout.split("\n")[0] - - -class LcovCobertura(object): - """ - Converts code coverage report files in lcov format to Cobertura's XML - report format so that CI servers like Jenkins can aggregate results and - determine build stability etc. - - >>> from lcov_cobertura import LcovCobertura - >>> LCOV_INPUT = 'your lcov input' - >>> converter = LcovCobertura(LCOV_INPUT) - >>> cobertura_xml = converter.convert() - >>> print(cobertura_xml) - """ - - def __init__(self, lcov_data, base_dir='.', excludes=None, demangle=False): - """ - Create a new :class:`LcovCobertura` object using the given `lcov_data` - and `options`. - - :param lcov_data: Path to LCOV data file - :type lcov_data: string - :param base_dir: Path upon which to base all sources - :type base_dir: string - :param excludes: list of regexes to packages as excluded - :type excludes: [string] - :param demangle: whether to demangle function names using c++filt - :type demangle: bool - """ - - if not excludes: - excludes = [] - self.lcov_data = lcov_data - self.base_dir = base_dir - self.excludes = excludes - self.demangle = demangle - - def convert(self): - """ - Convert lcov file to cobertura XML using options from this instance. - """ - coverage_data = self.parse() - return self.generate_cobertura_xml(coverage_data) - - def parse(self): - """ - Generate a data structure representing it that can be serialized in any - logical format. - """ - - coverage_data = { - 'packages': {}, - 'summary': {'lines-total': 0, 'lines-covered': 0, - 'branches-total': 0, 'branches-covered': 0}, - 'timestamp': str(int(time.time())) - } - package = None - current_file = None - file_lines_total = 0 - file_lines_covered = 0 - file_lines = {} - file_methods = {} - file_branches_total = 0 - file_branches_covered = 0 - - for line in self.lcov_data.split('\n'): - if line.strip() == 'end_of_record': - if current_file is not None: - package_dict = coverage_data['packages'][package] - package_dict['lines-total'] += file_lines_total - package_dict['lines-covered'] += file_lines_covered - package_dict['branches-total'] += file_branches_total - package_dict['branches-covered'] += file_branches_covered - file_dict = package_dict['classes'][current_file] - file_dict['lines-total'] = file_lines_total - file_dict['lines-covered'] = file_lines_covered - file_dict['lines'] = dict(file_lines) - file_dict['methods'] = dict(file_methods) - file_dict['branches-total'] = file_branches_total - file_dict['branches-covered'] = file_branches_covered - coverage_data['summary']['lines-total'] += file_lines_total - coverage_data['summary']['lines-covered'] += file_lines_covered - coverage_data['summary']['branches-total'] += file_branches_total - coverage_data['summary']['branches-covered'] += file_branches_covered - - line_parts = line.split(':', 1) - input_type = line_parts[0] - - if input_type == 'SF': - # Get file name - file_name = line_parts[-1].strip() - relative_file_name = os.path.relpath(file_name, self.base_dir) - package = '.'.join(relative_file_name.split(os.path.sep)[0:-1]) - class_name = '.'.join(relative_file_name.split(os.path.sep)) - if package not in coverage_data['packages']: - coverage_data['packages'][package] = { - 'classes': {}, 'lines-total': 0, 'lines-covered': 0, - 'branches-total': 0, 'branches-covered': 0 - } - coverage_data['packages'][package]['classes'][ - relative_file_name] = { - 'name': class_name, 'lines': {}, 'lines-total': 0, - 'lines-covered': 0, 'branches-total': 0, - 'branches-covered': 0 - } - package = package - current_file = relative_file_name - file_lines_total = 0 - file_lines_covered = 0 - file_lines.clear() - file_methods.clear() - file_branches_total = 0 - file_branches_covered = 0 - elif input_type == 'DA': - # DA:2,0 - (line_number, line_hits) = line_parts[-1].strip().split(',') - line_number = int(line_number) - if line_number not in file_lines: - file_lines[line_number] = { - 'branch': 'false', 'branches-total': 0, - 'branches-covered': 0 - } - file_lines[line_number]['hits'] = line_hits - # Increment lines total/covered for class and package - try: - if int(line_hits) > 0: - file_lines_covered += 1 - except: - pass - file_lines_total += 1 - elif input_type == 'BRDA': - # BRDA:1,1,2,0 - (line_number, block_number, branch_number, branch_hits) = line_parts[-1].strip().split(',') - line_number = int(line_number) - if line_number not in file_lines: - file_lines[line_number] = { - 'branch': 'true', 'branches-total': 0, - 'branches-covered': 0, 'hits': 0 - } - file_lines[line_number]['branch'] = 'true' - file_lines[line_number]['branches-total'] += 1 - file_branches_total += 1 - if branch_hits != '-' and int(branch_hits) > 0: - file_lines[line_number]['branches-covered'] += 1 - file_branches_covered += 1 - elif input_type == 'BRF': - file_branches_total = int(line_parts[1]) - elif input_type == 'BRH': - file_branches_covered = int(line_parts[1]) - elif input_type == 'FN': - # FN:5,(anonymous_1) - function_line, function_name = line_parts[-1].strip().split(',') - file_methods[function_name] = [function_line, '0'] - elif input_type == 'FNDA': - # FNDA:0,(anonymous_1) - (function_hits, function_name) = line_parts[-1].strip().split(',') - if function_name not in file_methods: - file_methods[function_name] = ['0', '0'] - file_methods[function_name][-1] = function_hits - - # Exclude packages - excluded = [x for x in coverage_data['packages'] for e in self.excludes - if re.match(e, x)] - for package in excluded: - del coverage_data['packages'][package] - - # Compute line coverage rates - for package_data in list(coverage_data['packages'].values()): - package_data['line-rate'] = self._percent( - package_data['lines-total'], - package_data['lines-covered']) - package_data['branch-rate'] = self._percent( - package_data['branches-total'], - package_data['branches-covered']) - - return coverage_data - - def generate_cobertura_xml(self, coverage_data): - """ - Given parsed coverage data, return a String cobertura XML representation. - - :param coverage_data: Nested dict representing coverage information. - :type coverage_data: dict - """ - - dom_impl = minidom.getDOMImplementation() - doctype = dom_impl.createDocumentType("coverage", None, - "http://cobertura.sourceforge.net/xml/coverage-04.dtd") - document = dom_impl.createDocument(None, "coverage", doctype) - root = document.documentElement - summary = coverage_data['summary'] - self._attrs(root, { - 'branch-rate': self._percent(summary['branches-total'], - summary['branches-covered']), - 'branches-covered': str(summary['branches-covered']), - 'branches-valid': str(summary['branches-total']), - 'complexity': '0', - 'line-rate': self._percent(summary['lines-total'], - summary['lines-covered']), - 'lines-covered': str(summary['lines-covered']), - 'lines-valid': str(summary['lines-total']), - 'timestamp': coverage_data['timestamp'], - 'version': '2.0.3' - }) - - sources = self._el(document, 'sources', {}) - source = self._el(document, 'source', {}) - source.appendChild(document.createTextNode(self.base_dir)) - sources.appendChild(source) - - root.appendChild(sources) - - packages_el = self._el(document, 'packages', {}) - - packages = coverage_data['packages'] - for package_name, package_data in list(packages.items()): - package_el = self._el(document, 'package', { - 'line-rate': package_data['line-rate'], - 'branch-rate': package_data['branch-rate'], - 'name': package_name, - 'complexity': '0', - }) - classes_el = self._el(document, 'classes', {}) - for class_name, class_data in list(package_data['classes'].items()): - class_el = self._el(document, 'class', { - 'branch-rate': self._percent(class_data['branches-total'], - class_data['branches-covered']), - 'complexity': '0', - 'filename': class_name, - 'line-rate': self._percent(class_data['lines-total'], - class_data['lines-covered']), - 'name': class_data['name'] - }) - - # Process methods - methods_el = self._el(document, 'methods', {}) - for method_name, (line, hits) in list(class_data['methods'].items()): - method_el = self._el(document, 'method', { - 'name': demangle(method_name) if self.demangle else method_name, - 'signature': '', - 'line-rate': '1.0' if int(hits) > 0 else '0.0', - 'branch-rate': '1.0' if int(hits) > 0 else '0.0', - }) - method_lines_el = self._el(document, 'lines', {}) - method_line_el = self._el(document, 'line', { - 'hits': hits, - 'number': line, - 'branch': 'false', - }) - method_lines_el.appendChild(method_line_el) - method_el.appendChild(method_lines_el) - methods_el.appendChild(method_el) - - # Process lines - lines_el = self._el(document, 'lines', {}) - lines = list(class_data['lines'].keys()) - lines.sort() - for line_number in lines: - line_el = self._el(document, 'line', { - 'branch': class_data['lines'][line_number]['branch'], - 'hits': str(class_data['lines'][line_number]['hits']), - 'number': str(line_number) - }) - if class_data['lines'][line_number]['branch'] == 'true': - total = int(class_data['lines'][line_number]['branches-total']) - covered = int(class_data['lines'][line_number]['branches-covered']) - percentage = int((covered * 100.0) / total) - line_el.setAttribute('condition-coverage', - '{0}% ({1}/{2})'.format( - percentage, covered, total)) - lines_el.appendChild(line_el) - - class_el.appendChild(methods_el) - class_el.appendChild(lines_el) - classes_el.appendChild(class_el) - package_el.appendChild(classes_el) - packages_el.appendChild(package_el) - root.appendChild(packages_el) - - return document.toprettyxml() - - def _el(self, document, name, attrs): - """ - Create an element within document with given name and attributes. - - :param document: Document element - :type document: Document - :param name: Element name - :type name: string - :param attrs: Attributes for element - :type attrs: dict - """ - return self._attrs(document.createElement(name), attrs) - - def _attrs(self, element, attrs): - """ - Set attributes on given element. - - :param element: DOM Element - :type element: Element - :param attrs: Attributes for element - :type attrs: dict - """ - for attr, val in list(attrs.items()): - element.setAttribute(attr, val) - return element - - def _percent(self, lines_total, lines_covered): - """ - Get the percentage of lines covered in the total, with formatting. - - :param lines_total: Total number of lines in given module - :type lines_total: number - :param lines_covered: Number of lines covered by tests in module - :type lines_covered: number - """ - - if lines_total == 0: - return '0.0' - return str(float(float(lines_covered) / float(lines_total))) - -if __name__ == '__main__': - def main(argv): - """ - Converts LCOV coverage data to Cobertura-compatible XML for reporting. - - Usage: - lcov_cobertura.py lcov-file.dat - lcov_cobertura.py lcov-file.dat -b src/dir -e test.lib -o path/out.xml - - By default, XML output will be written to ./coverage.xml - """ - - parser = OptionParser() - parser.usage = 'lcov_cobertura.py lcov-file.dat [-b source/dir] [-e ] [-o output.xml] [-d]' - parser.description = 'Converts lcov output to cobertura-compatible XML' - parser.add_option('-b', '--base-dir', action='store', - help='Directory where source files are located', - dest='base_dir', default='.') - parser.add_option('-e', '--excludes', - help='Comma-separated list of regexes of packages to exclude', - action='append', dest='excludes', default=[]) - parser.add_option('-o', '--output', - help='Path to store cobertura xml file', - action='store', dest='output', default='coverage.xml') - parser.add_option('-d', '--demangle', - help='Demangle C++ function names using %s' % CPPFILT, - action='store_true', dest='demangle', default=False) - (options, args) = parser.parse_args(args=argv) - - if options.demangle and not HAVE_CPPFILT: - raise RuntimeError("C++ filter executable (%s) not found!" % CPPFILT) - - if len(args) != 2: - print(main.__doc__) - sys.exit(1) - - try: - with open(args[1], 'r') as lcov_file: - lcov_data = lcov_file.read() - lcov_cobertura = LcovCobertura(lcov_data, options.base_dir, options.excludes, options.demangle) - cobertura_xml = lcov_cobertura.convert() - with open(options.output, mode='wt') as output_file: - output_file.write(cobertura_xml) - except IOError: - sys.stderr.write("Unable to convert %s to Cobertura XML" % args[1]) - - main(sys.argv) diff --git a/coverage/test_coverage_filter.dart b/coverage/test_coverage_filter.dart new file mode 100644 index 00000000..b75dde99 --- /dev/null +++ b/coverage/test_coverage_filter.dart @@ -0,0 +1,127 @@ +import 'dart:io'; + +void main() { + printMessage('Start filtering the lcov.info file'); + final file = File('coverage/lcov.info'); + if (!file.existsSync()) { + printMessage('"lcov.info" does not exist'); + return; + } + const endOfRecord = 'end_of_record'; + final sections = []; + final lines = file.readAsLinesSync(); + LcovSection? currentSection; + for (final line in lines) { + if (line.endsWith('.dart')) { + final filePath = line.replaceAll('SF:', ''); + currentSection = LcovSection() + ..header = line + ..filePath = filePath; + } else if (line == endOfRecord) { + final currentSectionTmp = currentSection; + if (currentSectionTmp != null) { + currentSectionTmp.footer = line; + sections.add(currentSectionTmp); + } + } else { + currentSection?.body.add(line); + } + } + final filteredSections = getFilteredSections(sections); + final sb = StringBuffer(); + for (final section in filteredSections) { + sb.write(section.toString()); + } + file.writeAsStringSync(sb.toString()); + printMessage('Filtered the lcov.info file'); +} + +class LcovSection { + String? filePath; + String? header; + final body = []; + String? footer; + + String? getBodyString() { + final filePathTmp = filePath; + if (filePathTmp == null) return null; + final file = File(filePathTmp); + final content = file.readAsLinesSync(); + final sb = StringBuffer(); + getFilteredBody(body, content).forEach((item) => sb..write(item)..write('\n')); + return sb.toString(); + } + + @override + String toString() { + return '$header\n${getBodyString()}$footer\n'; + } +} + +List getFilteredSections(List sections) { + return sections.where((section) { + final header = section.header; + if (header == null) return false; + if (header.endsWith('.g.dart')) { + return false; + } else if (header.endsWith('dummy_service.dart')) { + return false; + } else if (header.startsWith('SF:lib/vendor/')) { + return false; + } else if (header.startsWith('SF:lib/util/locale')) { + return false; + } else if (header.contains('widgetbook/')) { + return false; + } + return true; + }).toList(); +} + +List getFilteredBody(List body, List lines) { + return body.where((line) { + if (line.startsWith('DA:')) { + final sections = line.split(','); + final lineNr = int.parse(sections[0].replaceAll('DA:', '')); + final callCount = int.parse(sections[1]); + if (callCount == 0) { + final fileLine = lines[lineNr - 1].trim(); + if (excludedLines.contains(fileLine)) { + return false; + } + for (final line in excludedStartsWithLines) { + if (fileLine.trim().startsWith(line)) { + return false; + } + } + } + } + return true; + }).toList(); +} + +const excludedLines = [ + 'AppConstants._();', + 'EnvUtils._();', + 'FlutterTemplateLogger._();', + 'FlutterTemplateThemeData._();', + 'Keys._();', + 'LicenseUtil._();', + 'ThemeAssets._();', + 'ThemeColors._();', + 'ThemeDimens._();', + 'ThemeDurations._();', + 'ThemeFonts._();', + 'ThemeTextStyles._();', +]; + +const excludedStartsWithLines = [ + 'IntColumn get ', + 'TextColumn get ', + 'BoolColumn get ', + 'DateTimeColumn get ', +]; + +void printMessage(String message) { + // ignore: avoid_print + print(message); +} diff --git a/fastlane/Fastfile b/fastlane/Fastfile index a01200d9..e08d6bfe 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -51,10 +51,10 @@ lane :pr do checkCompilationAndAnalyzer Dir.chdir ".." do sh("fvm", "flutter", "test") - #sh("fvm", "flutter", "test", "--coverage") - #sh("dart", "--version") - #sh("dart", "coverage/filter_test_coverage.dart") - #sh("python3", "coverage/lcov_cobertura.py", "coverage/lcov.info", "--output", "coverage/coverage.xml") + sh("fvm", "flutter", "test", "--coverage") + sh("fvm", "dart", "--version") + sh("fvm", "dart", "coverage/test_coverage_filter.dart") + sh("cobertura", "convert", "-i", "coverage/lcov.info", "-o", "coverage/coverage.xml") end git_reset end diff --git a/fastlane/analysis_options_check_compilation.yaml b/fastlane/analysis_options_check_compilation.yaml index 6e48eb5d..9f4cef51 100644 --- a/fastlane/analysis_options_check_compilation.yaml +++ b/fastlane/analysis_options_check_compilation.yaml @@ -7,6 +7,9 @@ analyzer: unused_import: ignore unused_element: ignore unused_local_variable: ignore + unused_element_parameter: ignore + deprecated_member_use: ignore + invalid_use_of_internal_member: ignore linter: rules: diff --git a/fastlane/report.xml b/fastlane/report.xml new file mode 100644 index 00000000..ed2b86a2 --- /dev/null +++ b/fastlane/report.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 7c569640..1dc6cf76 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 399e9340..11afe5b0 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1,2 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.$(CONFIGURATION).xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/ephemeral/flutter_lldb_helper.py b/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 00000000..a88caf99 --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/ios/Flutter/ephemeral/flutter_lldbinit b/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 00000000..e3ba6fbe --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/ios/Podfile b/ios/Podfile index 279576f3..10f3c9b4 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f5eea6c6..1f6c291e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -4,111 +4,111 @@ PODS: - ReachabilitySwift - device_info_plus (0.0.1): - Flutter - - Firebase/Analytics (10.25.0): + - Firebase/Analytics (11.6.0): - Firebase/Core - - Firebase/Core (10.25.0): + - Firebase/Core (11.6.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 10.25.0) - - Firebase/CoreOnly (10.25.0): - - FirebaseCore (= 10.25.0) - - Firebase/Crashlytics (10.25.0): + - FirebaseAnalytics (~> 11.6.0) + - Firebase/CoreOnly (11.6.0): + - FirebaseCore (~> 11.6.0) + - Firebase/Crashlytics (11.6.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 10.25.0) - - Firebase/RemoteConfig (10.25.0): + - FirebaseCrashlytics (~> 11.6.0) + - Firebase/RemoteConfig (11.6.0): - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 10.25.0) - - Firebase/Storage (10.25.0): + - FirebaseRemoteConfig (~> 11.6.0) + - Firebase/Storage (11.6.0): - Firebase/CoreOnly - - FirebaseStorage (~> 10.25.0) - - firebase_analytics (10.10.7): - - Firebase/Analytics (= 10.25.0) + - FirebaseStorage (~> 11.6.0) + - firebase_analytics (11.4.1): + - Firebase/Analytics (= 11.6.0) - firebase_core - Flutter - - firebase_core (2.32.0): - - Firebase/CoreOnly (= 10.25.0) + - firebase_core (3.10.1): + - Firebase/CoreOnly (= 11.6.0) - Flutter - - firebase_crashlytics (3.5.7): - - Firebase/Crashlytics (= 10.25.0) + - firebase_crashlytics (4.3.1): + - Firebase/Crashlytics (= 11.6.0) - firebase_core - Flutter - - firebase_remote_config (4.4.7): - - Firebase/RemoteConfig (= 10.25.0) + - firebase_remote_config (5.3.1): + - Firebase/RemoteConfig (= 11.6.0) - firebase_core - Flutter - - firebase_storage (11.7.7): - - Firebase/Storage (= 10.25.0) + - firebase_storage (12.4.1): + - Firebase/Storage (= 11.6.0) - firebase_core - Flutter - - FirebaseABTesting (10.29.0): - - FirebaseCore (~> 10.0) - - FirebaseAnalytics (10.25.0): - - FirebaseAnalytics/AdIdSupport (= 10.25.0) - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30911.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (10.25.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement (= 10.25.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30911.0, >= 2.30908.0) - - FirebaseAppCheckInterop (10.29.0) - - FirebaseAuthInterop (10.29.0) - - FirebaseCore (10.25.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreExtension (10.29.0): - - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.29.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseCrashlytics (10.25.0): - - FirebaseCore (~> 10.5) - - FirebaseInstallations (~> 10.0) - - FirebaseRemoteConfigInterop (~> 10.23) - - FirebaseSessions (~> 10.5) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.8) - - nanopb (< 2.30911.0, >= 2.30908.0) - - PromisesObjC (~> 2.1) - - FirebaseInstallations (10.29.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseRemoteConfig (10.25.0): - - FirebaseABTesting (~> 10.0) - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - FirebaseRemoteConfigInterop (~> 10.23) - - FirebaseSharedSwift (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseRemoteConfigInterop (10.29.0) - - FirebaseSessions (10.29.0): - - FirebaseCore (~> 10.5) - - FirebaseCoreExtension (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.13) - - GoogleUtilities/UserDefaults (~> 7.13) - - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseABTesting (11.6.0): + - FirebaseCore (~> 11.6.0) + - FirebaseAnalytics (11.6.0): + - FirebaseAnalytics/AdIdSupport (= 11.6.0) + - FirebaseCore (~> 11.6.0) + - FirebaseInstallations (~> 11.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/AdIdSupport (11.6.0): + - FirebaseCore (~> 11.6.0) + - FirebaseInstallations (~> 11.0) + - GoogleAppMeasurement (= 11.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - FirebaseAppCheckInterop (11.15.0) + - FirebaseAuthInterop (11.15.0) + - FirebaseCore (11.6.0): + - FirebaseCoreInternal (~> 11.6.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Logger (~> 8.0) + - FirebaseCoreExtension (11.6.0): + - FirebaseCore (~> 11.6.0) + - FirebaseCoreInternal (11.6.0): + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseCrashlytics (11.6.0): + - FirebaseCore (~> 11.6.0) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSessions (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.0) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (11.6.0): + - FirebaseCore (~> 11.6.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - FirebaseRemoteConfig (11.6.0): + - FirebaseABTesting (~> 11.0) + - FirebaseCore (~> 11.6.0) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSharedSwift (~> 11.0) + - GoogleUtilities/Environment (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseRemoteConfigInterop (11.15.0) + - FirebaseSessions (11.6.0): + - FirebaseCore (~> 11.6.0) + - FirebaseCoreExtension (~> 11.6.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - nanopb (~> 3.30910.0) - PromisesSwift (~> 2.1) - - FirebaseSharedSwift (10.29.0) - - FirebaseStorage (10.25.0): - - FirebaseAppCheckInterop (~> 10.0) - - FirebaseAuthInterop (~> 10.25) - - FirebaseCore (~> 10.0) - - FirebaseCoreExtension (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GTMSessionFetcher/Core (< 4.0, >= 2.1) + - FirebaseSharedSwift (11.15.0) + - FirebaseStorage (11.6.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (~> 11.6.0) + - FirebaseCoreExtension (~> 11.6.0) + - GoogleUtilities/Environment (~> 8.0) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) - Flutter (1.0.0) - flutter_key_value_file_storage (0.0.1): - Flutter @@ -116,64 +116,64 @@ PODS: - Flutter - flutter_secure_storage (6.0.0): - Flutter - - GoogleAppMeasurement (10.25.0): - - GoogleAppMeasurement/AdIdSupport (= 10.25.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30911.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (10.25.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.25.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30911.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (10.25.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30911.0, >= 2.30908.0) - - GoogleDataTransport (9.4.1): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30911.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - GoogleAppMeasurement (11.6.0): + - GoogleAppMeasurement/AdIdSupport (= 11.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/AdIdSupport (11.6.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 11.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/WithoutAdIdSupport (11.6.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (7.13.3): + - GoogleUtilities/MethodSwizzler (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Network (8.1.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.13.3)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (7.13.3) - - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GTMSessionFetcher/Core (3.5.0) - - nanopb (2.30910.0): - - nanopb/decode (= 2.30910.0) - - nanopb/encode (= 2.30910.0) - - nanopb/decode (2.30910.0) - - nanopb/encode (2.30910.0) + - GTMSessionFetcher/Core (4.5.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - package_info_plus (0.4.5): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS @@ -181,26 +181,32 @@ PODS: - PromisesSwift (2.4.0): - PromisesObjC (= 2.4.0) - ReachabilitySwift (5.2.4) + - Sentry/HybridSDK (8.56.2) + - sentry_flutter (9.12.0): + - Flutter + - FlutterMacOS + - Sentry/HybridSDK (= 8.56.2) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - "sqlite3 (3.46.1+1)": - - "sqlite3/common (= 3.46.1+1)" - - "sqlite3/common (3.46.1+1)" - - "sqlite3/dbstatvtab (3.46.1+1)": + - sqlite3 (3.48.0): + - sqlite3/common (= 3.48.0) + - sqlite3/common (3.48.0) + - sqlite3/dbstatvtab (3.48.0): - sqlite3/common - - "sqlite3/fts5 (3.46.1+1)": + - sqlite3/fts5 (3.48.0): - sqlite3/common - - "sqlite3/perf-threadsafe (3.46.1+1)": + - sqlite3/perf-threadsafe (3.48.0): - sqlite3/common - - "sqlite3/rtree (3.46.1+1)": + - sqlite3/rtree (3.48.0): - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - - "sqlite3 (~> 3.46.0+1)" + - FlutterMacOS + - sqlite3 (~> 3.48.0) - sqlite3/dbstatvtab - sqlite3/fts5 - sqlite3/perf-threadsafe @@ -220,10 +226,12 @@ DEPENDENCIES: - flutter_key_value_file_storage (from `.symlinks/plugins/flutter_key_value_file_storage/ios`) - flutter_secure_file_storage (from `.symlinks/plugins/flutter_secure_file_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) + - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: @@ -251,6 +259,7 @@ SPEC REPOS: - PromisesObjC - PromisesSwift - ReachabilitySwift + - Sentry - sqlite3 EXTERNAL SOURCES: @@ -276,59 +285,66 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_secure_file_storage/ios" flutter_secure_storage: :path: ".symlinks/plugins/flutter_secure_storage/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + sentry_flutter: + :path: ".symlinks/plugins/sentry_flutter/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite_darwin: :path: ".symlinks/plugins/sqflite_darwin/darwin" sqlite3_flutter_libs: - :path: ".symlinks/plugins/sqlite3_flutter_libs/ios" + :path: ".symlinks/plugins/sqlite3_flutter_libs/darwin" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 - Firebase: 0312a2352584f782ea56f66d91606891d4607f06 - firebase_analytics: cc06e24d6a2343c44f845b3112143db72d10ef78 - firebase_core: a626d00494efa398e7c54f25f1454a64c8abf197 - firebase_crashlytics: 17e856fabec68d993662abaf2f6fe2413f0abece - firebase_remote_config: 7b05c80210ab558c80f7a756681022b4ee98eea0 - firebase_storage: 5c0f552d6b27d621429d7fd16ebab4be94a3c954 - FirebaseABTesting: d87f56707159bae64e269757a6e963d490f2eebe - FirebaseAnalytics: ec00fe8b93b41dc6fe4a28784b8e51da0647a248 - FirebaseAppCheckInterop: 6a1757cfd4067d8e00fccd14fcc1b8fd78cfac07 - FirebaseAuthInterop: 17db81e9b198afb0f95ce48c133825727eed55d3 - FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483 - FirebaseCoreExtension: 705ca5b14bf71d2564a0ddc677df1fc86ffa600f - FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 - FirebaseCrashlytics: 4b96efb0ce73b38b2a85e8b8bd1bd8f63f09d015 - FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd - FirebaseRemoteConfig: 9f3935cefecd85d5b312192117f444957de24a75 - FirebaseRemoteConfigInterop: 6efda51fb5e2f15b16585197e26eaa09574e8a4d - FirebaseSessions: dbd14adac65ce996228652c1fc3a3f576bdf3ecc - FirebaseSharedSwift: 20530f495084b8d840f78a100d8c5ee613375f6e - FirebaseStorage: 44f4e25073f6fa0d4d8c09f5bec299ee9e4eb985 - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + Firebase: 374a441a91ead896215703a674d58cdb3e9d772b + firebase_analytics: 13ea4ad8a42c5060bad7e6694304dabb8b02fe7e + firebase_core: e2aa06dbd854d961f8ce46c2e20933bee1bf2d2b + firebase_crashlytics: 868f9aa408c704313eebff880c26c1446081679e + firebase_remote_config: 63c9a32cc875d2f66a6bd12a32ef8a9835168cce + firebase_storage: 5f8f929f2b1a4f3d37d32ef6b8c474db40bfbe13 + FirebaseABTesting: 663ece168d2d65a31f71603d71937e326020a887 + FirebaseAnalytics: 7114c698cac995602e3b1b96663473e50d54d6e7 + FirebaseAppCheckInterop: 06fe5a3799278ae4667e6c432edd86b1030fa3df + FirebaseAuthInterop: 7087d7a4ee4bc4de019b2d0c240974ed5d89e2fd + FirebaseCore: 48b0dd707581cf9c1a1220da68223fb0a562afaa + FirebaseCoreExtension: 2d77d6430c16cf43ca2b04608302ed02b3598361 + FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2 + FirebaseCrashlytics: b21c665fb50138766480bce73ebdb1aa30f7f300 + FirebaseInstallations: efc0946fc756e4d22d8113f7c761948120322e8c + FirebaseRemoteConfig: ee5161282c4e857ad81c0197cd8baec9d5dfef0e + FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa + FirebaseSessions: 9529d14180868e29a8da164b3a729c036204918b + FirebaseSharedSwift: e17c654ef1f1a616b0b33054e663ad1035c8fd40 + FirebaseStorage: 52fb65a69d3e87675186881a08e2a5db86452ace + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_key_value_file_storage: b91fb1747ffa3e36810c752a1763655fda0b9f3d flutter_secure_file_storage: cdf659810f1849916ea5371ed5df339a3aaa802c flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 - GoogleAppMeasurement: 9abf64b682732fed36da827aa2a68f0221fd2356 - GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a - GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - nanopb: 438bc412db1928dac798aa6fd75726007be04262 + GoogleAppMeasurement: 6a9e6317b6a6d810ad03d4a66564ca6c4c5818a3 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMSessionFetcher: fc75fc972958dceedee61cb662ae1da7a83a91cf + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda + Sentry: b53951377b78e21a734f5dc8318e333dbfc682d7 + sentry_flutter: 31f669b138780f222e60ffb79da14ce94ef59d9c shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 - sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb - sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: 3da10a59910c809fb584a93aa46a3f05b785e12e + sqlite3_flutter_libs: 5f386339eccc9516a12ab10e4aa925cbef5f2dcf url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe -PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 +PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d346eed5..3e87d1a8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -317,13 +317,16 @@ "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", "${BUILT_PRODUCTS_DIR}/PromisesSwift/Promises.framework", "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", + "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", "${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework", "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework", "${BUILT_PRODUCTS_DIR}/flutter_key_value_file_storage/flutter_key_value_file_storage.framework", "${BUILT_PRODUCTS_DIR}/flutter_secure_file_storage/flutter_secure_file_storage.framework", "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework", "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", + "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework", "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework", "${BUILT_PRODUCTS_DIR}/sqflite_darwin/sqflite_darwin.framework", "${BUILT_PRODUCTS_DIR}/sqlite3/sqlite3.framework", @@ -351,13 +354,16 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Promises.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_key_value_file_storage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_file_storage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite_darwin.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3.framework", @@ -497,7 +503,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -519,7 +525,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -581,7 +587,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -628,7 +634,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -652,7 +658,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -686,7 +692,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -750,7 +756,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -775,7 +781,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -841,7 +847,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -864,7 +870,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -929,7 +935,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -952,7 +958,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1017,7 +1023,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1040,7 +1046,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1099,7 +1105,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1125,7 +1131,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1184,7 +1190,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1208,7 +1214,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1266,7 +1272,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1290,7 +1296,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1348,7 +1354,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1372,7 +1378,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1430,7 +1436,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1452,7 +1458,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1509,7 +1515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1533,7 +1539,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1591,7 +1597,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1613,7 +1619,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1670,7 +1676,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1692,7 +1698,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme index ab16a71a..55c260f6 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> @@ -45,6 +46,7 @@ buildConfiguration = "Debug-dev" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/lib/di/injectable.config.dart b/lib/di/injectable.config.dart index 4feee8f7..95aee8fd 100644 --- a/lib/di/injectable.config.dart +++ b/lib/di/injectable.config.dart @@ -1,3 +1,4 @@ +// dart format width=80 // GENERATED CODE - DO NOT MODIFY BY HAND // ************************************************************************** @@ -58,6 +59,8 @@ import 'package:flutter_template/util/locale/localization_overrides.dart' as _i613; import 'package:flutter_template/util/locale/localization_overrides_impl.dart' as _i908; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart' + as _i1012; import 'package:flutter_template/util/snackbar/error_util.dart' as _i235; import 'package:flutter_template/util/theme/theme_config.dart' as _i437; import 'package:flutter_template/viewmodel/debug/debug_platform_selector_viewmodel.dart' @@ -132,6 +135,8 @@ extension GetItInjectableX on _i174.GetIt { () => registerModule.provideFirebaseRemoteConfig()); gh.lazySingleton<_i235.ErrorUtil>(() => _i235.ErrorUtil()); gh.lazySingleton<_i437.ThemeConfigUtil>(() => _i437.ThemeConfigUtil()); + gh.lazySingleton<_i1012.SentryPerformanceLogger>( + () => _i1012.SentryPerformanceLogger()); gh.lazySingleton<_i44.RemoteConfigRepository>( () => _i44.RemoteConfigRepository(gh<_i627.FirebaseRemoteConfig>())); gh.singleton<_i40.CacheControlling>(() => _i979.CacheController()); @@ -212,6 +217,12 @@ extension GetItInjectableX on _i174.GetIt { gh<_i327.FlutterTemplateDatabase>(), gh<_i855.LocalStorage>(), )); + gh.factory<_i532.SplashViewModel>(() => _i532.SplashViewModel( + gh<_i855.LocalStorage>(), + gh<_i76.OnboardingNavigator>(), + gh<_i44.RemoteConfigRepository>(), + gh<_i1012.SentryPerformanceLogger>(), + )); gh.lazySingleton<_i836.GlobalViewModel>(() => _i836.GlobalViewModel( gh<_i587.LocaleRepository>(), gh<_i380.DebugRepository>(), @@ -237,11 +248,6 @@ extension GetItInjectableX on _i174.GetIt { gh<_i861.MainNavigator>(), gh<_i836.GlobalViewModel>(), )); - gh.factory<_i532.SplashViewModel>(() => _i532.SplashViewModel( - gh<_i855.LocalStorage>(), - gh<_i76.OnboardingNavigator>(), - gh<_i44.RemoteConfigRepository>(), - )); gh.lazySingleton<_i556.CombiningSmartInterceptor>( () => registerModule.provideCombiningSmartInterceptor( gh<_i1069.NetworkLogInterceptor>(), diff --git a/lib/main.dart b/lib/main.dart index 8fe551bd..00211515 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_template/app.dart'; import 'package:flutter_template/di/environments.dart'; -import 'package:flutter_template/di/injectable.dart'; +import 'package:flutter_template/di/injectable.dart' as di; import 'package:flutter_template/main_common.dart'; import 'package:flutter_template/util/env/flavor_config.dart'; import 'package:flutter_template/util/inspector/database_inspector.dart'; import 'package:flutter_template/util/inspector/local_storage_inspector.dart'; import 'package:flutter_template/util/inspector/niddler.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; Future main() async { await wrapMain(() async { @@ -24,10 +26,24 @@ Future main() async { ); // ignore: avoid_print print('Starting app from main.dart'); - await configureDependencies(Environments.dev); + await di.configureDependencies(Environments.dev); await addDatabaseInspector(); await initAllStorageInspectors(); - runApp(const MyApp()); + await SentryFlutter.init( + (options) { + options + ..dsn = '' + ..debug = true + ..enableLogs = true + ..diagnosticLevel = SentryLevel.debug + ..environment = 'development' + ..tracesSampleRate = 1.0; + }, + appRunner: () { + di.getIt().startAppLoadTransaction(); + runApp(const MyApp()); + }, + ); }); } diff --git a/lib/main_alpha.dart b/lib/main_alpha.dart index f2cf3547..a96a8518 100644 --- a/lib/main_alpha.dart +++ b/lib/main_alpha.dart @@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_template/app.dart'; import 'package:flutter_template/di/environments.dart'; import 'package:flutter_template/di/injectable.dart'; +import 'package:flutter_template/di/injectable.dart' as di; import 'package:flutter_template/main_common.dart'; import 'package:flutter_template/util/env/flavor_config.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; Future main() async { await wrapMain(() async { @@ -19,6 +22,24 @@ Future main() async { values: values, ); await configureDependencies(Environments.prod); - runApp(const MyApp()); + await SentryFlutter.init( + (options) { + options + ..dsn = '' + ..debug = false + ..beforeSendLog = (event) { + if (event.level == SentryLogLevel.debug || event.level == SentryLogLevel.info) { + return null; + } + return event; + } + ..diagnosticLevel = SentryLevel.error + ..environment = 'development'; + }, + appRunner: () { + di.getIt().startAppLoadTransaction(); + runApp(const MyApp()); + }, + ); }); } diff --git a/lib/main_beta.dart b/lib/main_beta.dart index 5cf16038..75a4bf0d 100644 --- a/lib/main_beta.dart +++ b/lib/main_beta.dart @@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_template/app.dart'; import 'package:flutter_template/di/environments.dart'; import 'package:flutter_template/di/injectable.dart'; +import 'package:flutter_template/di/injectable.dart' as di; import 'package:flutter_template/main_common.dart'; import 'package:flutter_template/util/env/flavor_config.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; Future main() async { await wrapMain(() async { @@ -19,6 +22,24 @@ Future main() async { values: values, ); await configureDependencies(Environments.prod); - runApp(const MyApp()); + await SentryFlutter.init( + (options) { + options + ..dsn = '' + ..debug = false + ..beforeSendLog = (event) { + if (event.level == SentryLogLevel.debug || event.level == SentryLogLevel.info) { + return null; + } + return event; + } + ..diagnosticLevel = SentryLevel.error + ..environment = 'development'; + }, + appRunner: () { + di.getIt().startAppLoadTransaction(); + runApp(const MyApp()); + }, + ); }); } diff --git a/lib/main_common.dart b/lib/main_common.dart index b816f416..2456582d 100644 --- a/lib/main_common.dart +++ b/lib/main_common.dart @@ -3,10 +3,10 @@ import 'dart:async'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_template/architecture.dart'; import 'package:flutter_template/util/logging/flutter_template_logger.dart'; import 'package:flutter_template/util/web/app_configurator.dart' if (dart.library.html) 'package:flutter_template/util/web/app_configurator_web.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; Future _setupCrashLogging() async { await Firebase.initializeApp(); @@ -23,7 +23,7 @@ Future _setupCrashLogging() async { FutureOr? wrapMain(FutureOr Function() appCode) async { PlatformDispatcher.instance.onError = (error, trace) { try { - WidgetsFlutterBinding.ensureInitialized(); + SentryWidgetsFlutterBinding.ensureInitialized(); } catch (_) {} try { @@ -41,7 +41,7 @@ FutureOr? wrapMain(FutureOr Function() appCode) async { return true; // Handled }; - WidgetsFlutterBinding.ensureInitialized(); + SentryWidgetsFlutterBinding.ensureInitialized(); configureWebApp(); await _setupCrashLogging(); await initArchitecture(); diff --git a/lib/main_prod.dart b/lib/main_prod.dart index f46ec18b..0cb4d960 100644 --- a/lib/main_prod.dart +++ b/lib/main_prod.dart @@ -3,8 +3,11 @@ import 'package:flutter_template/app.dart'; import 'package:flutter_template/architecture.dart'; import 'package:flutter_template/di/environments.dart'; import 'package:flutter_template/di/injectable.dart'; +import 'package:flutter_template/di/injectable.dart' as di; import 'package:flutter_template/main_common.dart'; import 'package:flutter_template/util/env/flavor_config.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; Future main() async { await wrapMain(() async { @@ -21,6 +24,24 @@ Future main() async { values: values, ); await configureDependencies(Environments.prod); - runApp(const MyApp()); + await SentryFlutter.init( + (options) { + options + ..dsn = '' + ..debug = false + ..beforeSendLog = (event) { + if (event.level == SentryLogLevel.debug || event.level == SentryLogLevel.info) { + return null; + } + return event; + } + ..diagnosticLevel = SentryLevel.error + ..environment = 'production'; + }, + appRunner: () { + di.getIt().startAppLoadTransaction(); + runApp(const MyApp()); + }, + ); }); } diff --git a/lib/navigator/main_navigator.navigator.dart b/lib/navigator/main_navigator.navigator.dart index d1e02f79..fae2b3dc 100644 --- a/lib/navigator/main_navigator.navigator.dart +++ b/lib/navigator/main_navigator.navigator.dart @@ -1,3 +1,4 @@ +// dart format width=80 // GENERATED CODE - DO NOT MODIFY BY HAND // ************************************************************************** @@ -117,11 +118,8 @@ mixin BaseNavigator { (_) => false, arguments: {}, ); - Future goToLicenseScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.licenseScreen, - arguments: {}, - ); + Future goToLicenseScreen() async => navigatorKey.currentState + ?.pushNamed(RouteNames.licenseScreen, arguments: {}); Future goToLogDetailScreen({required String date}) async => navigatorKey.currentState?.pushNamed( Uri( @@ -130,42 +128,28 @@ mixin BaseNavigator { ).toString(), arguments: {'date': date}, ); - Future goToTodoAddScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.todoAddScreen, - arguments: {}, - ); - Future goToLogsScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.logsScreen, - arguments: {}, - ); - Future goToAnalyticsPermissionScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.analyticsPermissionScreen, - arguments: {}, - ); + Future goToTodoAddScreen() async => navigatorKey.currentState + ?.pushNamed(RouteNames.todoAddScreen, arguments: {}); + Future goToLogsScreen() async => navigatorKey.currentState + ?.pushNamed(RouteNames.logsScreen, arguments: {}); + Future goToAnalyticsPermissionScreen() async => navigatorKey + .currentState + ?.pushNamed(RouteNames.analyticsPermissionScreen, arguments: {}); void goToLoginScreen() => navigatorKey.currentState?.pushNamedAndRemoveUntil( RouteNames.loginScreen, (_) => false, arguments: {}, ); - Future goToThemeModeSelectorScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.themeModeSelectorScreen, - arguments: {}, - ); + Future goToThemeModeSelectorScreen() async => navigatorKey.currentState + ?.pushNamed(RouteNames.themeModeSelectorScreen, arguments: {}); Future goToDebugPlatformSelectorScreen() async => navigatorKey.currentState?.pushNamed( RouteNames.debugPlatformSelectorScreen, arguments: {}, ); - Future goToDebugScreen() async => - navigatorKey.currentState?.pushNamed( - RouteNames.debugScreen, - arguments: {}, - ); + Future goToDebugScreen() async => navigatorKey.currentState + ?.pushNamed(RouteNames.debugScreen, arguments: {}); void goBack() => navigatorKey.currentState?.pop(); void goBackWithResult({T? result}) => navigatorKey.currentState?.pop(result); diff --git a/lib/repository/login/login_repository.dart b/lib/repository/login/login_repository.dart index e4622c17..f420b8f3 100644 --- a/lib/repository/login/login_repository.dart +++ b/lib/repository/login/login_repository.dart @@ -1,5 +1,6 @@ import 'package:flutter_template/repository/secure_storage/auth/auth_storage.dart'; import 'package:flutter_template/util/logging/flutter_template_logger.dart'; +import 'package:flutter_template/util/logging/log_types.dart'; import 'package:injectable/injectable.dart'; @lazySingleton @@ -27,6 +28,6 @@ class _LoginRepository implements LoginRepository { @override Future login({required String email, required String password}) async { await _storage.saveUserCredentials(accessToken: 'test_access_token', refreshToken: 'test_refresh_token'); - FlutterTemplateLogger.logDebug('Login should be implemented'); + FlutterTemplateLogger.logDebug('Login should be implemented', type: LogType.login); } } diff --git a/lib/screen/logs/logs_screen.dart b/lib/screen/logs/logs_screen.dart index fbd73849..15a5383a 100644 --- a/lib/screen/logs/logs_screen.dart +++ b/lib/screen/logs/logs_screen.dart @@ -64,6 +64,12 @@ class LogsScreenState extends State { text: 'Trigger crash', onClick: viewModel.triggerError, ), + ...viewModel.availableLogLevels.map( + (level) => FlutterTemplateButton( + text: level.name, + onClick: () => viewModel.triggerLog(level), + ), + ), ], ), ), diff --git a/lib/screen/splash/splash_screen.dart b/lib/screen/splash/splash_screen.dart index 1429bebe..8d621ca4 100644 --- a/lib/screen/splash/splash_screen.dart +++ b/lib/screen/splash/splash_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_navigation_generator_annotations/flutter_navigation_generator_annotations.dart'; import 'package:flutter_template/di/injectable.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; import 'package:flutter_template/viewmodel/splash/splash_viewmodel.dart'; import 'package:flutter_template/widget/general/status_bar.dart'; import 'package:flutter_template/widget/library/flutter_template_progress_indicator.dart'; @@ -18,6 +19,13 @@ class SplashScreen extends StatefulWidget { @visibleForTesting class SplashScreenState extends State { + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) => getIt().finishAppLoadTransaction()); + } + @override Widget build(BuildContext context) { return ProviderWidget( diff --git a/lib/screen/todo/todo_list/todo_list_screen.dart b/lib/screen/todo/todo_list/todo_list_screen.dart index 0f11832c..3abd44bd 100644 --- a/lib/screen/todo/todo_list/todo_list_screen.dart +++ b/lib/screen/todo/todo_list/todo_list_screen.dart @@ -104,7 +104,7 @@ class TodoListScreenState extends State { padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( height: 1, - color: theme.main.withOpacity(0.1), + color: theme.main.withValues(alpha: 0.1), ), ), ); diff --git a/lib/styles/theme_data.dart b/lib/styles/theme_data.dart index a4eeccff..cbba4fba 100644 --- a/lib/styles/theme_data.dart +++ b/lib/styles/theme_data.dart @@ -27,7 +27,7 @@ class FlutterTemplateThemeData { textSelectionTheme: TextSelectionThemeData( cursorColor: ThemeColors.accentThink40, selectionHandleColor: ThemeColors.accentThink40, - selectionColor: ThemeColors.accentThink40.withOpacity(0.4), + selectionColor: ThemeColors.accentThink40.withValues(alpha: 0.4), ), pageTransitionsTheme: PageTransitionsTheme( builders: { @@ -263,9 +263,9 @@ class FlutterTemplateTheme { bodyNeutralFaded: ThemeColors.neutral48, actionDefault: ThemeColors.accentThink32, effects: FlutterTemplateThemeEffects( - elevationDefault1: ThemeColors.main16.withOpacity(0.04), - elevationDefault2: ThemeColors.main16.withOpacity(0.08), - elevationDefault3: ThemeColors.main16.withOpacity(0.12), + elevationDefault1: ThemeColors.main16.withValues(alpha: 0.04), + elevationDefault2: ThemeColors.main16.withValues(alpha: 0.08), + elevationDefault3: ThemeColors.main16.withValues(alpha: 0.12), ), ); @@ -318,9 +318,9 @@ class FlutterTemplateTheme { bodyNeutralFaded: ThemeColors.neutral48, actionDefault: ThemeColors.accentThink32, effects: FlutterTemplateThemeEffects( - elevationDefault1: ThemeColors.main16.withOpacity(0.04), - elevationDefault2: ThemeColors.main16.withOpacity(0.08), - elevationDefault3: ThemeColors.main16.withOpacity(0.12), + elevationDefault1: ThemeColors.main16.withValues(alpha: 0.04), + elevationDefault2: ThemeColors.main16.withValues(alpha: 0.08), + elevationDefault3: ThemeColors.main16.withValues(alpha: 0.12), ), ); diff --git a/lib/util/extension/text_style_extensions.dart b/lib/util/extension/text_style_extensions.dart index 65142159..07978a84 100644 --- a/lib/util/extension/text_style_extensions.dart +++ b/lib/util/extension/text_style_extensions.dart @@ -9,5 +9,5 @@ extension TextStyleExtensions on TextStyle { TextStyle withOpacity60() => _withOpacity(0.6); //Light dark - TextStyle _withOpacity(double opacity) => copyWith(color: color?.withOpacity(opacity)); + TextStyle _withOpacity(double opacity) => copyWith(color: color?.withValues(alpha: opacity)); } diff --git a/lib/util/logging/app_transactions.dart b/lib/util/logging/app_transactions.dart new file mode 100644 index 00000000..194598c2 --- /dev/null +++ b/lib/util/logging/app_transactions.dart @@ -0,0 +1,16 @@ +class AppTransactions { + final String name; + final String operation; + + const AppTransactions(this.name, this.operation); + + static const AppTransactions appLoad = AppTransactions( + 'App Load', + 'app.load', + ); + + static const AppTransactions splashComplete = AppTransactions( + 'Splash Complete', + 'splash.complete', + ); +} diff --git a/lib/util/logging/flutter_template_logger.dart b/lib/util/logging/flutter_template_logger.dart index bcbf1f13..f5776500 100644 --- a/lib/util/logging/flutter_template_logger.dart +++ b/lib/util/logging/flutter_template_logger.dart @@ -5,6 +5,8 @@ import 'package:flutter_template/model/exceptions/forbidden_error.dart'; import 'package:flutter_template/model/exceptions/no_internet_error.dart'; import 'package:flutter_template/model/exceptions/un_authorized_error.dart'; import 'package:flutter_template/repository/remote_config/remote_config.dart'; +import 'package:flutter_template/util/logging/log_types.dart'; +import 'package:flutter_template/util/logging/sentry_logger.dart'; import 'package:icapps_architecture/icapps_architecture.dart'; class FlutterTemplateLogger { @@ -12,24 +14,36 @@ class FlutterTemplateLogger { FlutterTemplateLogger._(); - static void logWarning(String message) => staticLogger.warning(message); - - static void logNetworkRequest(RequestOptions request) => staticLogger.logNetworkRequest(request); + static void logDebug(String message, {LogType? type}) { + staticLogger.debug(message); + SentryLogger.logDebug(message, type: type); + } - static void logNetworkError(NetworkError error) => staticLogger.logNetworkError(error); + static void logInfo(String message, {LogType? type}) { + staticLogger.info(message); + SentryLogger.logInfo(message, type: type); + } - static void logNetworkResponse(Response response) => staticLogger.logNetworkResponse(response); + static void logWarning(String message, {LogType? type}) { + staticLogger.warning(message); + SentryLogger.logWarning(message, type: type); + } - static void logDebug(String message) => staticLogger.debug(message); + static void logFatal(String message, {LogType? type}) { + staticLogger.error(message); + SentryLogger.logFatal(message, type: type); + } static void logError( String message, { bool sendToFirebase = true, required dynamic error, required StackTrace? stackTrace, + LogType? type, }) { staticLogger.error(message, error: error, stackTrace: stackTrace); _recordToFirebase(message, error: error, stackTrace: stackTrace); + _recordToSentry(error, stackTrace, message, type); } static Future _recordToFirebase( @@ -45,4 +59,22 @@ class FlutterTemplateLogger { staticLogger.error('Failed to log to firebase', error: error, stackTrace: trace); } } + + static void _recordToSentry( + dynamic error, + StackTrace? stackTrace, + String message, + LogType? type, + ) { + final shouldNotSendError = error is UnAuthorizedError || error is ForbiddenError || error is NoInternetError || isInDebug; + if (shouldNotSendError) return; + SentryLogger.logFatal(message, type: type); + SentryLogger.captureException(error, stackTrace: stackTrace, message: message); + } + + static void logNetworkRequest(RequestOptions request) => staticLogger.logNetworkRequest(request); + + static void logNetworkError(NetworkError error) => staticLogger.logNetworkError(error); + + static void logNetworkResponse(Response response) => staticLogger.logNetworkResponse(response); } diff --git a/lib/util/logging/log_types.dart b/lib/util/logging/log_types.dart new file mode 100644 index 00000000..5417f63f --- /dev/null +++ b/lib/util/logging/log_types.dart @@ -0,0 +1,19 @@ +import 'package:sentry_flutter/sentry_flutter.dart'; + +enum LogType { + debug, + global, + license, + logDetal, + login, + logs, + permission, + splash, + todo, +} + +extension LogTypeExtension on LogType { + SentryAttribute get sentryAttribute => SentryAttribute.string( + name.toUpperCase(), + ); +} diff --git a/lib/util/logging/sentry_logger.dart b/lib/util/logging/sentry_logger.dart new file mode 100644 index 00000000..45ce6b04 --- /dev/null +++ b/lib/util/logging/sentry_logger.dart @@ -0,0 +1,67 @@ +import 'package:flutter_template/util/logging/log_types.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +class SentryLogger { + SentryLogger._(); + + static void logDebug(String message, {LogType? type}) { + final attributes = {}; + if (type != null) { + attributes['subtype'] = type.sentryAttribute; + } + Sentry.logger.debug( + message, + attributes: attributes, + ); + } + + static void logInfo(String message, {LogType? type}) { + final attributes = {}; + if (type != null) { + attributes['subtype'] = type.sentryAttribute; + } + Sentry.logger.info( + message, + attributes: attributes, + ); + } + + static void logWarning(String message, {LogType? type}) { + final attributes = {}; + if (type != null) { + attributes['subtype'] = type.sentryAttribute; + } + Sentry.logger.warn( + message, + attributes: attributes, + ); + } + + static void logError(String message, {LogType? type}) { + final attributes = {}; + if (type != null) { + attributes['subtype'] = type.sentryAttribute; + } + Sentry.logger.error( + message, + attributes: attributes, + ); + } + + static void logFatal(String message, {LogType? type}) { + final attributes = {}; + if (type != null) { + attributes['subtype'] = type.sentryAttribute; + } + Sentry.logger.fatal( + message, + attributes: attributes, + ); + } + + static void captureException(dynamic error, {StackTrace? stackTrace, String? message}) => Sentry.captureException( + error, + stackTrace: stackTrace, + message: message != null ? SentryMessage(message) : null, + ); +} diff --git a/lib/util/logging/sentry_performance_logger.dart b/lib/util/logging/sentry_performance_logger.dart new file mode 100644 index 00000000..67e3f628 --- /dev/null +++ b/lib/util/logging/sentry_performance_logger.dart @@ -0,0 +1,65 @@ +import 'package:flutter_template/util/logging/app_transactions.dart'; +import 'package:flutter_template/util/logging/flutter_template_logger.dart'; +import 'package:injectable/injectable.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +@lazySingleton +abstract class SentryPerformanceLogger { + Future startAppLoadTransaction(); + Future finishAppLoadTransaction(); + Future startTransaction(AppTransactions transaction); + Future finishTransaction(AppTransactions transaction); + + @factoryMethod + factory SentryPerformanceLogger() = _SentryPerformanceLogger; +} + +class _SentryPerformanceLogger implements SentryPerformanceLogger { + ISentrySpan? _appLoadTransaction; + final Map _transactions = {}; + + @override + Future startAppLoadTransaction() async { + await _appLoadTransaction?.finish(); + _appLoadTransaction = Sentry.startTransaction( + AppTransactions.appLoad.name, + AppTransactions.appLoad.operation, + bindToScope: true, + ); + } + + @override + Future finishAppLoadTransaction() async { + final transaction = _appLoadTransaction; + _appLoadTransaction = null; + await transaction?.finish(); + } + + @override + Future startTransaction(AppTransactions transaction) async { + if (_transactions.containsKey(transaction.name)) { + FlutterTemplateLogger.logDebug('Already started transaction: ${transaction.name}'); + return; + } + FlutterTemplateLogger.logDebug('Starting transaction: ${transaction.name}'); + final sentryTransaction = Sentry.startTransaction( + transaction.name, + transaction.operation, + bindToScope: true, + ); + _transactions[transaction.name] = sentryTransaction; + } + + @override + Future finishTransaction(AppTransactions transaction) async { + final sentryTransaction = _transactions[transaction.name]; + if (sentryTransaction == null) { + FlutterTemplateLogger.logDebug('Already finished transaction: ${transaction.name}'); + return; + } + FlutterTemplateLogger.logDebug('Finishing transaction: ${transaction.name}'); + + await sentryTransaction.finish(); + _transactions.remove(transaction.name); + } +} diff --git a/lib/viewmodel/login/login_viewmodel.dart b/lib/viewmodel/login/login_viewmodel.dart index 7933fb39..aeadc564 100644 --- a/lib/viewmodel/login/login_viewmodel.dart +++ b/lib/viewmodel/login/login_viewmodel.dart @@ -4,6 +4,7 @@ import 'package:flutter_template/navigator/onboarding_navigator.dart'; import 'package:flutter_template/repository/login/login_repository.dart'; import 'package:flutter_template/util/locale/localization_keys.dart'; import 'package:flutter_template/util/logging/flutter_template_logger.dart'; +import 'package:flutter_template/util/logging/log_types.dart'; import 'package:icapps_architecture/icapps_architecture.dart'; import 'package:injectable/injectable.dart'; @@ -46,7 +47,7 @@ class LoginViewModel with ChangeNotifierEx { TextInput.finishAutofillContext(); return _onboardingNavigator.goToNextScreen(); } catch (e, stack) { - FlutterTemplateLogger.logError('Failed to login', error: e, stackTrace: stack); + FlutterTemplateLogger.logError('Failed to login', error: e, stackTrace: stack, type: LogType.login); if (e is LocalizedError) { _navigator.showErrorWithLocaleKey(messageKey: e.getLocalizedKey()); } else { diff --git a/lib/viewmodel/logs/logs_viewmodel.dart b/lib/viewmodel/logs/logs_viewmodel.dart index 5ae32cc7..3b6ee042 100644 --- a/lib/viewmodel/logs/logs_viewmodel.dart +++ b/lib/viewmodel/logs/logs_viewmodel.dart @@ -1,9 +1,18 @@ import 'package:flutter_template/navigator/main_navigator.dart'; import 'package:flutter_template/util/logging/flutter_template_logger.dart'; +import 'package:flutter_template/util/logging/log_types.dart'; import 'package:icapps_architecture/icapps_architecture.dart'; import 'package:injectable/injectable.dart'; import 'package:log_to_secure_file/log_to_secure_file.dart'; +enum LogLevel { + error, + fatal, + warning, + info, + debug, +} + @injectable class LogsViewModel with ChangeNotifierEx { final MainNavigator _navigator; @@ -13,6 +22,8 @@ class LogsViewModel with ChangeNotifierEx { List get availableDates => _dates; + List get availableLogLevels => LogLevel.values; + LogsViewModel( this._navigator, this._secureLogStorage, @@ -24,6 +35,26 @@ class LogsViewModel with ChangeNotifierEx { notifyListeners(); } + void triggerLog(LogLevel level) { + switch (level) { + case LogLevel.debug: + FlutterTemplateLogger.logDebug('Debug', type: LogType.logs); + break; + case LogLevel.info: + FlutterTemplateLogger.logInfo('Info', type: LogType.logs); + break; + case LogLevel.warning: + FlutterTemplateLogger.logWarning('Warning', type: LogType.logs); + break; + case LogLevel.fatal: + FlutterTemplateLogger.logFatal('Fatal', type: LogType.logs); + break; + case LogLevel.error: + FlutterTemplateLogger.logError('Error', error: Exception('This is a test error'), stackTrace: StackTrace.current, type: LogType.logs); + break; + } + } + void triggerError() { try { throw Exception('This is a test error'); diff --git a/lib/viewmodel/splash/splash_viewmodel.dart b/lib/viewmodel/splash/splash_viewmodel.dart index 8223c704..cf23d32e 100644 --- a/lib/viewmodel/splash/splash_viewmodel.dart +++ b/lib/viewmodel/splash/splash_viewmodel.dart @@ -3,6 +3,8 @@ import 'dart:async'; import 'package:flutter_template/navigator/onboarding_navigator.dart'; import 'package:flutter_template/repository/remote_config/remote_config_repository.dart'; import 'package:flutter_template/repository/shared_prefs/local/local_storage.dart'; +import 'package:flutter_template/util/logging/app_transactions.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; import 'package:icapps_architecture/icapps_architecture.dart'; import 'package:injectable/injectable.dart'; @@ -11,16 +13,20 @@ class SplashViewModel with ChangeNotifierEx { final LocalStorage _localStorage; final OnboardingNavigator _onboardingNavigator; final RemoteConfigRepository _remoteConfigRepository; + final SentryPerformanceLogger _sentryPerformanceLogger; SplashViewModel( this._localStorage, this._onboardingNavigator, this._remoteConfigRepository, + this._sentryPerformanceLogger, ); Future init() async { + await _sentryPerformanceLogger.startTransaction(AppTransactions.splashComplete); await _localStorage.checkForNewInstallation(); await _remoteConfigRepository.refreshRemoteConfig(); + await _sentryPerformanceLogger.finishTransaction(AppTransactions.splashComplete); await _onboardingNavigator.goToNextScreen(); } } diff --git a/lib/viewmodel/todo/todo_list/todo_list_viewmodel.dart b/lib/viewmodel/todo/todo_list/todo_list_viewmodel.dart index c13ac6b4..ab2ec87e 100644 --- a/lib/viewmodel/todo/todo_list/todo_list_viewmodel.dart +++ b/lib/viewmodel/todo/todo_list/todo_list_viewmodel.dart @@ -3,6 +3,7 @@ import 'package:flutter_template/navigator/main_navigator.dart'; import 'package:flutter_template/repository/todo/todo_repository.dart'; import 'package:flutter_template/util/locale/localization_keys.dart'; import 'package:flutter_template/util/logging/flutter_template_logger.dart'; +import 'package:flutter_template/util/logging/log_types.dart'; import 'package:icapps_architecture/icapps_architecture.dart'; import 'package:injectable/injectable.dart'; @@ -38,7 +39,7 @@ class TodoListViewModel with ChangeNotifierEx { notifyListeners(); await _todoRepo.fetchTodos(); } catch (e, stack) { - FlutterTemplateLogger.logError('failed to get todos', error: e, stackTrace: stack); + FlutterTemplateLogger.logError('failed to get todos', error: e, stackTrace: stack, type: LogType.todo); if (e is LocalizedError) { _errorKey = e.getLocalizedKey(); } else { diff --git a/lib/webservice/todo/todo_webservice.g.dart b/lib/webservice/todo/todo_webservice.g.dart index cf2cfb3a..19134aa5 100644 --- a/lib/webservice/todo/todo_webservice.g.dart +++ b/lib/webservice/todo/todo_webservice.g.dart @@ -9,11 +9,7 @@ part of 'todo_webservice.dart'; // ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations class _TodoWebService implements TodoWebService { - _TodoWebService( - this._dio, { - this.baseUrl, - this.errorLogger, - }); + _TodoWebService(this._dio, {this.baseUrl, this.errorLogger}); final Dio _dio; @@ -27,22 +23,16 @@ class _TodoWebService implements TodoWebService { final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _options = _setStreamType>(Options( - method: 'GET', - headers: _headers, - extra: _extra, - ) - .compose( - _dio.options, - '/todos', - queryParameters: queryParameters, - data: _data, - ) - .copyWith( - baseUrl: _combineBaseUrls( - _dio.options.baseUrl, - baseUrl, - ))); + final _options = _setStreamType>( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + '/todos', + queryParameters: queryParameters, + data: _data, + ) + .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)), + ); final _result = await _dio.fetch>(_options); late List _value; try { @@ -69,10 +59,7 @@ class _TodoWebService implements TodoWebService { return requestOptions; } - String _combineBaseUrls( - String dioBaseUrl, - String? baseUrl, - ) { + String _combineBaseUrls(String dioBaseUrl, String? baseUrl) { if (baseUrl == null || baseUrl.trim().isEmpty) { return dioBaseUrl; } diff --git a/lib/widgetbook/widgetbook.dart b/lib/widgetbook/widgetbook.dart index e91dbafe..08fa8444 100644 --- a/lib/widgetbook/widgetbook.dart +++ b/lib/widgetbook/widgetbook.dart @@ -38,10 +38,12 @@ class WidgetbookApp extends StatelessWidget { Widget build(BuildContext context) { return Widgetbook.material( addons: [ - DeviceFrameAddon(devices: [ - ...Devices.ios.all, - ...Devices.android.all, - ]), + ViewportAddon( + [ + IosViewports.iPhone12ProMax, + AndroidViewports.onePlus8Pro, + ], + ), InspectorAddon(), ThemeAddon( themes: [ diff --git a/lib/widgetbook/widgetbook.directories.g.dart b/lib/widgetbook/widgetbook.directories.g.dart index 6c26c0a9..40d3576e 100644 --- a/lib/widgetbook/widgetbook.directories.g.dart +++ b/lib/widgetbook/widgetbook.directories.g.dart @@ -1,3 +1,4 @@ +// dart format width=80 // coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_import, prefer_relative_imports, directives_ordering @@ -10,62 +11,71 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:flutter_template/widgetbook/widgetbook_widgets/use_cases.dart' - as _i2; -import 'package:widgetbook/widgetbook.dart' as _i1; + as _flutter_template_widgetbook_widgetbook_widgets_use_cases; +import 'package:widgetbook/widgetbook.dart' as _widgetbook; -final directories = <_i1.WidgetbookNode>[ - _i1.WidgetbookFolder( +final directories = <_widgetbook.WidgetbookNode>[ + _widgetbook.WidgetbookFolder( name: 'widget', children: [ - _i1.WidgetbookLeafComponent( + _widgetbook.WidgetbookLeafComponent( name: 'Icon', - useCase: _i1.WidgetbookUseCase( + useCase: _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.icons, + builder: + _flutter_template_widgetbook_widgetbook_widgets_use_cases.icons, ), ), - _i1.WidgetbookFolder( + _widgetbook.WidgetbookFolder( name: 'library', children: [ - _i1.WidgetbookLeafComponent( + _widgetbook.WidgetbookLeafComponent( name: 'FlutterTemplateBackButton', - useCase: _i1.WidgetbookUseCase( + useCase: _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.backButton, + builder: _flutter_template_widgetbook_widgetbook_widgets_use_cases + .backButton, ), ), - _i1.WidgetbookComponent( + _widgetbook.WidgetbookComponent( name: 'FlutterTemplateButton', useCases: [ - _i1.WidgetbookUseCase( + _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.button, + builder: + _flutter_template_widgetbook_widgetbook_widgets_use_cases + .button, ), - _i1.WidgetbookUseCase( + _widgetbook.WidgetbookUseCase( name: 'Text', - builder: _i2.textButton, + builder: + _flutter_template_widgetbook_widgetbook_widgets_use_cases + .textButton, ), ], ), - _i1.WidgetbookLeafComponent( + _widgetbook.WidgetbookLeafComponent( name: 'FlutterTemplateCheckBox', - useCase: _i1.WidgetbookUseCase( + useCase: _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.checkBox, + builder: _flutter_template_widgetbook_widgetbook_widgets_use_cases + .checkBox, ), ), - _i1.WidgetbookLeafComponent( + _widgetbook.WidgetbookLeafComponent( name: 'FlutterTemplateProgressIndicator', - useCase: _i1.WidgetbookUseCase( + useCase: _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.progressIndicator, + builder: _flutter_template_widgetbook_widgetbook_widgets_use_cases + .progressIndicator, ), ), - _i1.WidgetbookLeafComponent( + _widgetbook.WidgetbookLeafComponent( name: 'FlutterTemplateSwitch', - useCase: _i1.WidgetbookUseCase( + useCase: _widgetbook.WidgetbookUseCase( name: 'Default', - builder: _i2.switchWidget, + builder: _flutter_template_widgetbook_widgetbook_widgets_use_cases + .switchWidget, ), ), ], diff --git a/pubspec.lock b/pubspec.lock index 4c881320..4ed2fde4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "72.0.0" + version: "85.0.0" _flutterfire_internals: dependency: transitive description: @@ -17,27 +17,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.50" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.2" accessibility_tools: dependency: transitive description: name: accessibility_tools - sha256: b49df78d786610d642f16787a84da737bcc4dd18533a9cb41cb35eb5ceee5e4c + sha256: c29732e423175a51e0a6ace7df1255f5d77812c7c7b7101d8ba0186a43d533aa url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.8.0" analyzer: dependency: transitive description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "7.7.1" another_flushbar: dependency: "direct main" description: @@ -82,10 +77,10 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_config: dependency: transitive description: @@ -106,26 +101,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.15" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" built_collection: dependency: transitive description: @@ -146,10 +141,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -178,10 +173,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -194,10 +189,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" computer: dependency: transitive description: @@ -258,10 +253,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "3.1.1" db_viewer: dependency: transitive description: @@ -278,14 +273,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.11" - device_frame: + device_frame_plus: dependency: transitive description: - name: device_frame - sha256: d031a06f5d6f4750009672db98a5aa1536aa4a231713852469ce394779a23d75 + name: device_frame_plus + sha256: ccc94abccd4d9f0a9f19ef239001b3a59896e678ad42601371d7065889f2bf78 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.5.0" device_info_plus: dependency: "direct main" description: @@ -322,10 +317,10 @@ packages: dependency: "direct main" description: name: drift - sha256: af3941e4d544727b2eb80590eb64e9cb8d77cd68c7690265502ea6a2427aa621 + sha256: "540cf382a3bfa99b76e51514db5b0ebcd81ce3679b7c1c9cb9478ff3735e47a1" url: "https://pub.dev" source: hosted - version: "2.23.1" + version: "2.28.2" drift_db_viewer: dependency: "direct main" description: @@ -338,10 +333,10 @@ packages: dependency: "direct dev" description: name: drift_dev - sha256: fa98fdbb7303a1b5b2dc110cb516eda2253a5d291680f8cbc72b1af24099f7f9 + sha256: "68c138e884527d2bd61df2ade276c3a144df84d1adeb0ab8f3196b5afe021bd4" url: "https://pub.dev" source: hosted - version: "2.23.1" + version: "2.28.0" drift_local_storage_inspector: dependency: "direct main" description: @@ -354,10 +349,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" ffi: dependency: transitive description: @@ -519,10 +514,10 @@ packages: dependency: transitive description: name: flutter_key_value_file_storage - sha256: a39cb3814eae20aa58747c874235d94411955df4bb287afb3aab12f1f2bbdfe6 + sha256: bd41274a2f11e45d146d8f1da7a063790a398007fd2fe404f384b9672e4e2b53 url: "https://pub.dev" source: hosted - version: "0.0.8" + version: "0.1.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -548,10 +543,10 @@ packages: dependency: "direct dev" description: name: flutter_navigation_generator - sha256: "81bc317266cd905465bfbc1f1b4616acd4f0b18fd47cfe759a5b1642c3af8da1" + sha256: "48e5e0e7bda2a8639ad8d3038c8bffa9e6c8033bba3aa175a17ffbe77a7a7d15" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" flutter_navigation_generator_annotations: dependency: "direct main" description: @@ -564,10 +559,10 @@ packages: dependency: transitive description: name: flutter_secure_file_storage - sha256: ea582e959c9ab8916041bf39c93ce0e5ccbd9e93c38d8424ef48b4cb4dd6a0c6 + sha256: b44256b8d599bfbd3404f56729ccd35a800b8b20f7c2a72e2db9c9c00e5ed7fd url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" flutter_secure_storage: dependency: "direct main" description: @@ -634,14 +629,6 @@ packages: description: flutter source: sdk version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 - url: "https://pub.dev" - source: hosted - version: "2.4.4" frontend_server_client: dependency: transitive description: @@ -742,10 +729,10 @@ packages: dependency: "direct dev" description: name: injectable_generator - sha256: af403d76c7b18b4217335e0075e950cd0579fd7f8d7bd47ee7c85ada31680ba1 + sha256: b04673a4c88b3a848c0c77bf58b8309f9b9e064d9fe1df5450c8ee1675eaea1a url: "https://pub.dev" source: hosted - version: "2.6.2" + version: "2.7.0" inspector: dependency: transitive description: @@ -758,10 +745,10 @@ packages: dependency: "direct main" description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" io: dependency: transitive description: @@ -770,6 +757,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" js: dependency: transitive description: @@ -790,34 +785,34 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c + sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c url: "https://pub.dev" source: hosted - version: "6.9.0" + version: "6.9.5" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" license_generator: dependency: "direct dev" description: @@ -845,11 +840,10 @@ packages: log_to_secure_file: dependency: "direct main" description: - path: "." - ref: main - resolved-ref: "44e7f61a7c31e474274f613fcdd15bdd758e8a50" - url: "https://github.com/icapps/log_to_secure_file.git" - source: git + name: log_to_secure_file + sha256: "28d5e7330d0e8271b8e4d86538db3941e7f637da1b3ba0898f708a28dfb0e2c6" + url: "https://pub.dev" + source: hosted version: "1.0.0" logger: dependency: transitive @@ -867,22 +861,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" - url: "https://pub.dev" - source: hosted - version: "0.1.2-main.4" matcher: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -895,10 +881,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.17.0" mime: dependency: transitive description: @@ -911,10 +897,10 @@ packages: dependency: "direct dev" description: name: mockito - sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + sha256: "4546eac99e8967ea91bae633d2ca7698181d008e95fa4627330cf903d573277a" url: "https://pub.dev" source: hosted - version: "5.4.4" + version: "5.4.6" model_generator: dependency: "direct dev" description: @@ -955,14 +941,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d + url: "https://pub.dev" + source: hosted + version: "9.0.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: "direct main" description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_parsing: dependency: transitive description: @@ -1079,10 +1081,10 @@ packages: dependency: transitive description: name: protobuf - sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d" + sha256: de9c9eb2c33f8e933a42932fe1dc504800ca45ebc3d673e6ed7f39754ee4053e url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.2.0" provider: dependency: "direct main" description: @@ -1095,10 +1097,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pubspec_parse: dependency: transitive description: @@ -1143,10 +1145,10 @@ packages: dependency: "direct dev" description: name: retrofit_generator - sha256: f76fdb2b66854690d5a332e7364d7561fc9dc2b3c924d7956ab8070495e21f6a + sha256: "65d28d3a7b4db485f1c73fee8ee32f552ef23ee4ecb68ba491f39d80b73bdcbf" url: "https://pub.dev" source: hosted - version: "9.1.5" + version: "9.2.0" rxdart: dependency: transitive description: @@ -1171,6 +1173,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + sentry: + dependency: transitive + description: + name: sentry + sha256: "80b2a6667db8e0bb148ad70b2af242eb6aa8da9b56b56e72332a4221d93bc01d" + url: "https://pub.dev" + source: hosted + version: "9.12.0" + sentry_flutter: + dependency: "direct main" + description: + name: sentry_flutter + sha256: df09c63e0111a9ad5c4a13a89def67327fc2028bec0f55c246d8c083d486e418 + url: "https://pub.dev" + source: hosted + version: "9.12.0" shared_preferences: dependency: "direct main" description: @@ -1247,15 +1265,15 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_gen: dependency: transitive description: name: source_gen - sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "2.0.0" source_helper: dependency: transitive description: @@ -1340,18 +1358,18 @@ packages: dependency: transitive description: name: sqlparser - sha256: "4cad4b2c5f63dc9ea1a8dcffb58cf762322bea5dd8836870164a65e913bdae41" + sha256: "57090342af1ce32bb499aa641f4ecdd2d6231b9403cea537ac059e803cc20d67" url: "https://pub.dev" source: hosted - version: "0.40.0" + version: "0.41.2" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" storage_inspector: dependency: "direct main" description: @@ -1364,10 +1382,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1404,10 +1422,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.7" timing: dependency: transitive description: @@ -1540,10 +1558,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -1588,26 +1606,26 @@ packages: dependency: "direct main" description: name: widgetbook - sha256: "8738bfa29cc314b68ac5068cb0d086a0ddf8db4e167d0e4d0f539e1ad1042949" + sha256: "0ffadb039b1811870b2f643e1730d419d38435b0e1931cc83f32ecd7e50200e4" url: "https://pub.dev" source: hosted - version: "3.10.2" + version: "3.20.2" widgetbook_annotation: dependency: "direct main" description: name: widgetbook_annotation - sha256: "08570e3568275c4c283cdf78409c125f86c96c9b4f94f0a390d6a163349e9934" + sha256: "55504431b15eedef3c1fc4af2d108ac98b32610b59d4a4e2eea87a8515d17eef" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.9.0" widgetbook_generator: dependency: "direct dev" description: name: widgetbook_generator - sha256: d664ba02805c37ef4bf2a061493a6ec254b40f0d14c5546311566226d71845a2 + sha256: "361f28ae26a4eb9c74625ff1e53eb6a783c8f0e6032baed80de4489da778f955" url: "https://pub.dev" source: hosted - version: "3.9.1" + version: "3.14.0" win32: dependency: transitive description: @@ -1649,5 +1667,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.5.0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.38.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1562ef08..e6199e8a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,10 +41,7 @@ dependencies: injectable: ^2.1.0 intl: ^0.19.0 json_annotation: ^4.7.0 - log_to_secure_file: - git: - url: https://github.com/icapps/log_to_secure_file.git - ref: main + log_to_secure_file: ^1.0.0 niddler_dart: ^1.6.0 path: ^1.8.2 path_provider: ^2.0.11 @@ -53,6 +50,7 @@ dependencies: retrofit: ^4.0.1 scroll_when_needed: ^3.0.1 secure_storage_local_storage_inspector: ^0.7.0 + sentry_flutter: ^9.12.0 shared_preferences: ^2.0.16 shared_preferences_web: ^2.0.4 sprintf: ^7.0.0 @@ -60,8 +58,8 @@ dependencies: storage_inspector: ^0.4.0 synchronized: ^3.3.0+3 url_launcher: ^6.3.1 - widgetbook: ^3.10.2 - widgetbook_annotation: ^3.2.0 + widgetbook: ^3.20.2 + widgetbook_annotation: ^3.9.0 dev_dependencies: build_runner: ^2.3.3 @@ -80,6 +78,9 @@ dev_dependencies: retrofit_generator: ^9.1.5 widgetbook_generator: ^3.9.1 +dependency_overrides: + intl: ^0.20.0 + flutter: uses-material-design: true assets: diff --git a/test/flutter_test_config.dart b/test/flutter_test_config.dart new file mode 100644 index 00000000..d47e340b --- /dev/null +++ b/test/flutter_test_config.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; + +import 'local_file_comparator_with_threshold.dart'; + +/// Customise your threshold here +/// For example, the error threshold here is 0.1% +/// Golden tests will pass if the pixel difference is equal to or below 0.1% +const _kGoldenTestsThreshold = 0.1 / 100; + +Future testExecutable(FutureOr Function() testMain) async { + if (goldenFileComparator is LocalFileComparator) { + final testUrl = (goldenFileComparator as LocalFileComparator).basedir; + + goldenFileComparator = LocalFileComparatorWithThreshold( + // flutter_test's LocalFileComparator expects the test's URI to be passed + // as an argument, but it only uses it to parse the baseDir in order to + // obtain the directory where the golden tests will be placed. + // As such, we use the default `testUrl`, which is only the `baseDir` and + // append a generically named `test.dart` so that the `baseDir` is + // properly extracted. + Uri.parse('$testUrl/test.dart'), + _kGoldenTestsThreshold, + ); + } else { + throw Exception( + 'Expected `goldenFileComparator` to be of type `LocalFileComparator`, ' + 'but it is of type `${goldenFileComparator.runtimeType}`', + ); + } + + await testMain(); +} diff --git a/test/local_file_comparator_with_threshold.dart b/test/local_file_comparator_with_threshold.dart new file mode 100644 index 00000000..44c8a968 --- /dev/null +++ b/test/local_file_comparator_with_threshold.dart @@ -0,0 +1,59 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; + +/// Works just like [LocalFileComparator] but includes a [threshold] that, when +/// exceeded, marks the test as a failure. +/// +/// Performance: uses a fast path when the image bytes match the golden exactly, +/// avoiding the full pixel-diff computation. The expensive [compareLists] (and +/// thus [diffPercent]) is only run when the images differ. +class LocalFileComparatorWithThreshold extends LocalFileComparator { + /// Threshold above which tests will be marked as failing. + /// Ranges from 0 to 1, both inclusive. + final double threshold; + + // ignore: use_super_parameters + LocalFileComparatorWithThreshold(Uri testFile, this.threshold) + : assert(threshold >= 0 && threshold <= 1), + super(testFile); + + /// Copy of [LocalFileComparator]'s [compare] method, except for the fact that + /// it checks if the [ComparisonResult.diffPercent] is not greater than + /// [threshold] to decide whether this test is successful or a failure. + /// + /// Optimized: if the image bytes equal the golden bytes, returns [true] + /// without calling [GoldenFileComparator.compareLists], so the expensive + /// diff is only computed when the test would otherwise fail. + @override + Future compare(Uint8List imageBytes, Uri golden) async { + final goldenBytes = await getGoldenBytes(golden); + + // Fast path: exact match. Skip compareLists so we only run the expensive + // pixel diff when there is an actual difference. + if (imageBytes.length == goldenBytes.length && + listEquals(imageBytes, goldenBytes)) { + return true; + } + + final result = await GoldenFileComparator.compareLists( + imageBytes, + goldenBytes, + ); + + if (!result.passed && result.diffPercent <= threshold) { + debugPrint( + 'A difference of ${result.diffPercent * 100}% was found, but it is ' + 'acceptable since it is not greater than the threshold of ' + '${threshold * 100}%', + ); + + return true; + } + + if (!result.passed) { + final error = await generateFailureOutput(result, golden, basedir); + throw FlutterError(error); + } + return result.passed; + } +} \ No newline at end of file diff --git a/test/repository/debug/debug_repository_test.mocks.dart b/test/repository/debug/debug_repository_test.mocks.dart index 130e5190..3287137c 100644 --- a/test/repository/debug/debug_repository_test.mocks.dart +++ b/test/repository/debug/debug_repository_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/debug/debug_repository_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/locale/locale_repository_test.mocks.dart b/test/repository/locale/locale_repository_test.mocks.dart index 7a5c2263..db55dc85 100644 --- a/test/repository/locale/locale_repository_test.mocks.dart +++ b/test/repository/locale/locale_repository_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/locale/locale_repository_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/login/login_repository_test.mocks.dart b/test/repository/login/login_repository_test.mocks.dart index 33d9b0c4..fbb118af 100644 --- a/test/repository/login/login_repository_test.mocks.dart +++ b/test/repository/login/login_repository_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/login/login_repository_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/refresh/refresh_repository_test.mocks.dart b/test/repository/refresh/refresh_repository_test.mocks.dart index c3001bf6..a298d92e 100644 --- a/test/repository/refresh/refresh_repository_test.mocks.dart +++ b/test/repository/refresh/refresh_repository_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/refresh/refresh_repository_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/secure_storage/auth/auth_storage_test.mocks.dart b/test/repository/secure_storage/auth/auth_storage_test.mocks.dart index eec10952..b1282311 100644 --- a/test/repository/secure_storage/auth/auth_storage_test.mocks.dart +++ b/test/repository/secure_storage/auth/auth_storage_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/secure_storage/auth/auth_storage_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/secure_storage/secure_storage_test.mocks.dart b/test/repository/secure_storage/secure_storage_test.mocks.dart index b8a5d821..552281e1 100644 --- a/test/repository/secure_storage/secure_storage_test.mocks.dart +++ b/test/repository/secure_storage/secure_storage_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/secure_storage/secure_storage_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/repository/todo/todo_repository_test.mocks.dart b/test/repository/todo/todo_repository_test.mocks.dart index 513e59e1..fbf34f26 100644 --- a/test/repository/todo/todo_repository_test.mocks.dart +++ b/test/repository/todo/todo_repository_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/repository/todo/todo_repository_test.dart. // Do not manually edit this file. @@ -18,6 +18,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/debug/debug_platform_selector_screen_test.mocks.dart b/test/screen/debug/debug_platform_selector_screen_test.mocks.dart index 91697a25..da82bc3b 100644 --- a/test/screen/debug/debug_platform_selector_screen_test.mocks.dart +++ b/test/screen/debug/debug_platform_selector_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/debug/debug_platform_selector_screen_test.dart. // Do not manually edit this file. @@ -19,6 +19,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/debug/debug_screen_test.mocks.dart b/test/screen/debug/debug_screen_test.mocks.dart index 19845d3f..e9e5374c 100644 --- a/test/screen/debug/debug_screen_test.mocks.dart +++ b/test/screen/debug/debug_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/debug/debug_screen_test.dart. // Do not manually edit this file. @@ -22,6 +22,7 @@ import 'package:mockito/src/dummies.dart' as _i8; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_ipad_pro.png b/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_ipad_pro.png index bfcdbb98..329e23e4 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_ipad_pro.png and b/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_ipad_pro.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_iphone_11.png b/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_iphone_11.png index 27d7ed1d..b5205641 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_iphone_11.png and b/test/screen/debug/img/debug_platform_selector_screen_inital_state_darkmode_iphone_11.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_ipad_pro.png b/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_ipad_pro.png index bfcdbb98..329e23e4 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_ipad_pro.png and b/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_ipad_pro.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_iphone_11.png b/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_iphone_11.png index 27d7ed1d..b5205641 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_iphone_11.png and b/test/screen/debug/img/debug_platform_selector_screen_inital_state_lightmode_iphone_11.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_android_ipad_pro.png b/test/screen/debug/img/debug_platform_selector_screen_selected_android_ipad_pro.png index bfcdbb98..329e23e4 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_android_ipad_pro.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_android_ipad_pro.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_android_iphone_11.png b/test/screen/debug/img/debug_platform_selector_screen_selected_android_iphone_11.png index 27d7ed1d..b5205641 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_android_iphone_11.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_android_iphone_11.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_ios_ipad_pro.png b/test/screen/debug/img/debug_platform_selector_screen_selected_ios_ipad_pro.png index bfcdbb98..329e23e4 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_ios_ipad_pro.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_ios_ipad_pro.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_ios_iphone_11.png b/test/screen/debug/img/debug_platform_selector_screen_selected_ios_iphone_11.png index 27d7ed1d..b5205641 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_ios_iphone_11.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_ios_iphone_11.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_system_ipad_pro.png b/test/screen/debug/img/debug_platform_selector_screen_selected_system_ipad_pro.png index bfcdbb98..329e23e4 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_system_ipad_pro.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_system_ipad_pro.png differ diff --git a/test/screen/debug/img/debug_platform_selector_screen_selected_system_iphone_11.png b/test/screen/debug/img/debug_platform_selector_screen_selected_system_iphone_11.png index 27d7ed1d..b5205641 100644 Binary files a/test/screen/debug/img/debug_platform_selector_screen_selected_system_iphone_11.png and b/test/screen/debug/img/debug_platform_selector_screen_selected_system_iphone_11.png differ diff --git a/test/screen/home/home_screen_test.mocks.dart b/test/screen/home/home_screen_test.mocks.dart index 48830a0f..27112e17 100644 --- a/test/screen/home/home_screen_test.mocks.dart +++ b/test/screen/home/home_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/home/home_screen_test.dart. // Do not manually edit this file. @@ -27,6 +27,7 @@ import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/home/img/home_screen_initial_state_darkmode_ipad_pro.png b/test/screen/home/img/home_screen_initial_state_darkmode_ipad_pro.png index 8e679b79..2ad4f900 100644 Binary files a/test/screen/home/img/home_screen_initial_state_darkmode_ipad_pro.png and b/test/screen/home/img/home_screen_initial_state_darkmode_ipad_pro.png differ diff --git a/test/screen/home/img/home_screen_initial_state_darkmode_iphone_11.png b/test/screen/home/img/home_screen_initial_state_darkmode_iphone_11.png index dfaa6dd5..0e25c2c7 100644 Binary files a/test/screen/home/img/home_screen_initial_state_darkmode_iphone_11.png and b/test/screen/home/img/home_screen_initial_state_darkmode_iphone_11.png differ diff --git a/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_ipad_pro.png b/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_ipad_pro.png index 8e679b79..2ad4f900 100644 Binary files a/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_ipad_pro.png and b/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_ipad_pro.png differ diff --git a/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_iphone_11.png b/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_iphone_11.png index dfaa6dd5..0e25c2c7 100644 Binary files a/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_iphone_11.png and b/test/screen/home/img/home_screen_initial_state_first_tab_darkmode_iphone_11.png differ diff --git a/test/screen/home/img/home_screen_initial_state_first_tab_ipad_pro.png b/test/screen/home/img/home_screen_initial_state_first_tab_ipad_pro.png index 8e679b79..2ad4f900 100644 Binary files a/test/screen/home/img/home_screen_initial_state_first_tab_ipad_pro.png and b/test/screen/home/img/home_screen_initial_state_first_tab_ipad_pro.png differ diff --git a/test/screen/home/img/home_screen_initial_state_first_tab_iphone_11.png b/test/screen/home/img/home_screen_initial_state_first_tab_iphone_11.png index dfaa6dd5..0e25c2c7 100644 Binary files a/test/screen/home/img/home_screen_initial_state_first_tab_iphone_11.png and b/test/screen/home/img/home_screen_initial_state_first_tab_iphone_11.png differ diff --git a/test/screen/home/img/home_screen_initial_state_ipad_pro.png b/test/screen/home/img/home_screen_initial_state_ipad_pro.png index 8e679b79..2ad4f900 100644 Binary files a/test/screen/home/img/home_screen_initial_state_ipad_pro.png and b/test/screen/home/img/home_screen_initial_state_ipad_pro.png differ diff --git a/test/screen/home/img/home_screen_initial_state_iphone_11.png b/test/screen/home/img/home_screen_initial_state_iphone_11.png index dfaa6dd5..0e25c2c7 100644 Binary files a/test/screen/home/img/home_screen_initial_state_iphone_11.png and b/test/screen/home/img/home_screen_initial_state_iphone_11.png differ diff --git a/test/screen/license/license_screen_test.mocks.dart b/test/screen/license/license_screen_test.mocks.dart index f08f0186..92598209 100644 --- a/test/screen/license/license_screen_test.mocks.dart +++ b/test/screen/license/license_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/license/license_screen_test.dart. // Do not manually edit this file. @@ -24,6 +24,7 @@ import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/login/img/login_screen_initial_state_dark_mode_ipad_pro.png b/test/screen/login/img/login_screen_initial_state_dark_mode_ipad_pro.png index 40478aed..685a3a88 100644 Binary files a/test/screen/login/img/login_screen_initial_state_dark_mode_ipad_pro.png and b/test/screen/login/img/login_screen_initial_state_dark_mode_ipad_pro.png differ diff --git a/test/screen/login/img/login_screen_initial_state_dark_mode_iphone_11.png b/test/screen/login/img/login_screen_initial_state_dark_mode_iphone_11.png index 9fea6442..7edd4583 100644 Binary files a/test/screen/login/img/login_screen_initial_state_dark_mode_iphone_11.png and b/test/screen/login/img/login_screen_initial_state_dark_mode_iphone_11.png differ diff --git a/test/screen/login/img/login_screen_initial_state_ipad_pro.png b/test/screen/login/img/login_screen_initial_state_ipad_pro.png index 40478aed..685a3a88 100644 Binary files a/test/screen/login/img/login_screen_initial_state_ipad_pro.png and b/test/screen/login/img/login_screen_initial_state_ipad_pro.png differ diff --git a/test/screen/login/img/login_screen_initial_state_iphone_11.png b/test/screen/login/img/login_screen_initial_state_iphone_11.png index 9fea6442..7edd4583 100644 Binary files a/test/screen/login/img/login_screen_initial_state_iphone_11.png and b/test/screen/login/img/login_screen_initial_state_iphone_11.png differ diff --git a/test/screen/login/img/login_screen_login_button_disabled_ipad_pro.png b/test/screen/login/img/login_screen_login_button_disabled_ipad_pro.png index c873f226..5896e0c1 100644 Binary files a/test/screen/login/img/login_screen_login_button_disabled_ipad_pro.png and b/test/screen/login/img/login_screen_login_button_disabled_ipad_pro.png differ diff --git a/test/screen/login/img/login_screen_login_button_disabled_iphone_11.png b/test/screen/login/img/login_screen_login_button_disabled_iphone_11.png index e5c2de5c..3ff20f0b 100644 Binary files a/test/screen/login/img/login_screen_login_button_disabled_iphone_11.png and b/test/screen/login/img/login_screen_login_button_disabled_iphone_11.png differ diff --git a/test/screen/login/login_screen_test.mocks.dart b/test/screen/login/login_screen_test.mocks.dart index 25afa6b8..cdf6c977 100644 --- a/test/screen/login/login_screen_test.mocks.dart +++ b/test/screen/login/login_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/login/login_screen_test.dart. // Do not manually edit this file. @@ -18,6 +18,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/permission/analytics_permission_screen_test.mocks.dart b/test/screen/permission/analytics_permission_screen_test.mocks.dart index 3c36b469..68ec7938 100644 --- a/test/screen/permission/analytics_permission_screen_test.mocks.dart +++ b/test/screen/permission/analytics_permission_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/permission/analytics_permission_screen_test.dart. // Do not manually edit this file. @@ -19,6 +19,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_ipad_pro.png b/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_ipad_pro.png index 28adf616..97036838 100644 Binary files a/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_ipad_pro.png and b/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_ipad_pro.png differ diff --git a/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_iphone_11.png b/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_iphone_11.png index 9c19b21d..5af441da 100644 Binary files a/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_iphone_11.png and b/test/screen/permission/img/analytics_permission_screen_initial_state_dark_mode_iphone_11.png differ diff --git a/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_ipad_pro.png b/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_ipad_pro.png index 28adf616..97036838 100644 Binary files a/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_ipad_pro.png and b/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_ipad_pro.png differ diff --git a/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_iphone_11.png b/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_iphone_11.png index 9c19b21d..5af441da 100644 Binary files a/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_iphone_11.png and b/test/screen/permission/img/analytics_permission_screen_initial_state_light_mode_iphone_11.png differ diff --git a/test/screen/splash/splash_screen_test.dart b/test/screen/splash/splash_screen_test.dart index c68a6af9..bc08fae1 100644 --- a/test/screen/splash/splash_screen_test.dart +++ b/test/screen/splash/splash_screen_test.dart @@ -1,5 +1,6 @@ import 'package:flutter_template/di/injectable.dart'; import 'package:flutter_template/screen/splash/splash_screen.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; import 'package:flutter_template/viewmodel/splash/splash_viewmodel.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; @@ -11,10 +12,12 @@ import 'splash_screen_test.mocks.dart'; @GenerateMocks([ SplashViewModel, + SentryPerformanceLogger, ]) void main() { setUp(() { getIt.registerLazySingleton(() => MockSplashViewModel()); + getIt.registerLazySingleton(() => MockSentryPerformanceLogger()); }); tearDown(() async { diff --git a/test/screen/splash/splash_screen_test.mocks.dart b/test/screen/splash/splash_screen_test.mocks.dart index 5d2d0a74..44366cef 100644 --- a/test/screen/splash/splash_screen_test.mocks.dart +++ b/test/screen/splash/splash_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/splash/splash_screen_test.dart. // Do not manually edit this file. @@ -6,6 +6,9 @@ import 'dart:async' as _i3; import 'dart:ui' as _i4; +import 'package:flutter_template/util/logging/app_transactions.dart' as _i7; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart' + as _i6; import 'package:flutter_template/viewmodel/splash/splash_viewmodel.dart' as _i2; import 'package:icapps_architecture/icapps_architecture.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; @@ -18,6 +21,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -108,3 +112,55 @@ class MockSplashViewModel extends _i1.Mock implements _i2.SplashViewModel { returnValueForMissingStub: null, ); } + +/// A class which mocks [SentryPerformanceLogger]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentryPerformanceLogger extends _i1.Mock + implements _i6.SentryPerformanceLogger { + MockSentryPerformanceLogger() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future startAppLoadTransaction() => (super.noSuchMethod( + Invocation.method( + #startAppLoadTransaction, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future finishAppLoadTransaction() => (super.noSuchMethod( + Invocation.method( + #finishAppLoadTransaction, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future startTransaction(_i7.AppTransactions? transaction) => + (super.noSuchMethod( + Invocation.method( + #startTransaction, + [transaction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future finishTransaction(_i7.AppTransactions? transaction) => + (super.noSuchMethod( + Invocation.method( + #finishTransaction, + [transaction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/screen/todo/todo_add/img/todo_add_screen_enabled_ipad_pro.png b/test/screen/todo/todo_add/img/todo_add_screen_enabled_ipad_pro.png index eb40a4cd..fbb0a725 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_enabled_ipad_pro.png and b/test/screen/todo/todo_add/img/todo_add_screen_enabled_ipad_pro.png differ diff --git a/test/screen/todo/todo_add/img/todo_add_screen_enabled_iphone_11.png b/test/screen/todo/todo_add/img/todo_add_screen_enabled_iphone_11.png index 80a3d720..c020e328 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_enabled_iphone_11.png and b/test/screen/todo/todo_add/img/todo_add_screen_enabled_iphone_11.png differ diff --git a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_ipad_pro.png b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_ipad_pro.png index b3b8c647..6b3c9fe1 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_ipad_pro.png and b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_ipad_pro.png differ diff --git a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_iphone_11.png b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_iphone_11.png index c8ef8900..2ffd8f3c 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_iphone_11.png and b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_darkmode_iphone_11.png differ diff --git a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_ipad_pro.png b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_ipad_pro.png index b3b8c647..6b3c9fe1 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_ipad_pro.png and b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_ipad_pro.png differ diff --git a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_iphone_11.png b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_iphone_11.png index c8ef8900..2ffd8f3c 100644 Binary files a/test/screen/todo/todo_add/img/todo_add_screen_inital_state_iphone_11.png and b/test/screen/todo/todo_add/img/todo_add_screen_inital_state_iphone_11.png differ diff --git a/test/screen/todo/todo_add/todo_add_screen_test.mocks.dart b/test/screen/todo/todo_add/todo_add_screen_test.mocks.dart index c133b7ec..c180143a 100644 --- a/test/screen/todo/todo_add/todo_add_screen_test.mocks.dart +++ b/test/screen/todo/todo_add/todo_add_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/todo/todo_add/todo_add_screen_test.dart. // Do not manually edit this file. @@ -19,6 +19,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_ipad_pro.png b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_ipad_pro.png index b579b11b..c0047a3e 100644 Binary files a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_ipad_pro.png and b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_ipad_pro.png differ diff --git a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_iphone_11.png b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_iphone_11.png index 08d2d34b..7a344361 100644 Binary files a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_iphone_11.png and b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_dark_mode_iphone_11.png differ diff --git a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_ipad_pro.png b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_ipad_pro.png index b579b11b..c0047a3e 100644 Binary files a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_ipad_pro.png and b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_ipad_pro.png differ diff --git a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_iphone_11.png b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_iphone_11.png index 08d2d34b..7a344361 100644 Binary files a/test/screen/todo/todo_list/img/todo_list_screen_inital_state_iphone_11.png and b/test/screen/todo/todo_list/img/todo_list_screen_inital_state_iphone_11.png differ diff --git a/test/screen/todo/todo_list/todo_list_screen_test.mocks.dart b/test/screen/todo/todo_list/todo_list_screen_test.mocks.dart index e57c0d0b..0a842ef1 100644 --- a/test/screen/todo/todo_list/todo_list_screen_test.mocks.dart +++ b/test/screen/todo/todo_list/todo_list_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/screen/todo/todo_list/todo_list_screen_test.dart. // Do not manually edit this file. @@ -20,6 +20,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/util/interceptor/network_auth_interceptor_test.mocks.dart b/test/util/interceptor/network_auth_interceptor_test.mocks.dart index c46ead50..2434349b 100644 --- a/test/util/interceptor/network_auth_interceptor_test.mocks.dart +++ b/test/util/interceptor/network_auth_interceptor_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/util/interceptor/network_auth_interceptor_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/util/interceptor/network_error_interceptor_test.mocks.dart b/test/util/interceptor/network_error_interceptor_test.mocks.dart index eb685bd5..bc3ca93e 100644 --- a/test/util/interceptor/network_error_interceptor_test.mocks.dart +++ b/test/util/interceptor/network_error_interceptor_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/util/interceptor/network_error_interceptor_test.dart. // Do not manually edit this file. @@ -18,6 +18,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/util/interceptor/network_refresh_interceptor_test.mocks.dart b/test/util/interceptor/network_refresh_interceptor_test.mocks.dart index 85454b32..1805d5e6 100644 --- a/test/util/interceptor/network_refresh_interceptor_test.mocks.dart +++ b/test/util/interceptor/network_refresh_interceptor_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/util/interceptor/network_refresh_interceptor_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -201,15 +202,6 @@ class MockDio extends _i1.Mock implements _i2.Dio { ), ) as _i2.BaseOptions); - @override - set options(_i2.BaseOptions? _options) => super.noSuchMethod( - Invocation.setter( - #options, - _options, - ), - returnValueForMissingStub: null, - ); - @override _i2.HttpClientAdapter get httpClientAdapter => (super.noSuchMethod( Invocation.getter(#httpClientAdapter), @@ -219,6 +211,33 @@ class MockDio extends _i1.Mock implements _i2.Dio { ), ) as _i2.HttpClientAdapter); + @override + _i2.Transformer get transformer => (super.noSuchMethod( + Invocation.getter(#transformer), + returnValue: _FakeTransformer_2( + this, + Invocation.getter(#transformer), + ), + ) as _i2.Transformer); + + @override + _i2.Interceptors get interceptors => (super.noSuchMethod( + Invocation.getter(#interceptors), + returnValue: _FakeInterceptors_3( + this, + Invocation.getter(#interceptors), + ), + ) as _i2.Interceptors); + + @override + set options(_i2.BaseOptions? _options) => super.noSuchMethod( + Invocation.setter( + #options, + _options, + ), + returnValueForMissingStub: null, + ); + @override set httpClientAdapter(_i2.HttpClientAdapter? _httpClientAdapter) => super.noSuchMethod( @@ -229,15 +248,6 @@ class MockDio extends _i1.Mock implements _i2.Dio { returnValueForMissingStub: null, ); - @override - _i2.Transformer get transformer => (super.noSuchMethod( - Invocation.getter(#transformer), - returnValue: _FakeTransformer_2( - this, - Invocation.getter(#transformer), - ), - ) as _i2.Transformer); - @override set transformer(_i2.Transformer? _transformer) => super.noSuchMethod( Invocation.setter( @@ -247,15 +257,6 @@ class MockDio extends _i1.Mock implements _i2.Dio { returnValueForMissingStub: null, ); - @override - _i2.Interceptors get interceptors => (super.noSuchMethod( - Invocation.getter(#interceptors), - returnValue: _FakeInterceptors_3( - this, - Invocation.getter(#interceptors), - ), - ) as _i2.Interceptors); - @override void close({bool? force = false}) => super.noSuchMethod( Invocation.method( @@ -706,7 +707,7 @@ class MockDio extends _i1.Mock implements _i2.Dio { Map? queryParameters, _i2.CancelToken? cancelToken, bool? deleteOnError = true, - String? lengthHeader = r'content-length', + String? lengthHeader = 'content-length', Object? data, _i2.Options? options, }) => @@ -756,7 +757,7 @@ class MockDio extends _i1.Mock implements _i2.Dio { _i2.ProgressCallback? onReceiveProgress, _i2.CancelToken? cancelToken, bool? deleteOnError = true, - String? lengthHeader = r'content-length', + String? lengthHeader = 'content-length', Object? data, _i2.Options? options, }) => diff --git a/test/util/test_screen_type.dart b/test/util/test_screen_type.dart index a66276ec..f9689e1a 100644 --- a/test/util/test_screen_type.dart +++ b/test/util/test_screen_type.dart @@ -9,8 +9,6 @@ extension ScreenTypeProperties on ScreenType { return Size(828 * 1.5, 1792 * 1.5 - getStatusBarHeight); case ScreenType.iPadPro: return Size(2048 * 1.5, 2732 * 1.5 - getStatusBarHeight); - default: - return const Size(500, 500); } } @@ -20,8 +18,6 @@ extension ScreenTypeProperties on ScreenType { return 88; case ScreenType.iPadPro: return 40; - default: - return 48; } } @@ -31,8 +27,6 @@ extension ScreenTypeProperties on ScreenType { return 'iphone_11'; case ScreenType.iPadPro: return 'ipad_pro'; - default: - return 'unknown_device'; } } } diff --git a/test/util/test_util.mocks.dart b/test/util/test_util.mocks.dart index e16ef400..0707f831 100644 --- a/test/util/test_util.mocks.dart +++ b/test/util/test_util.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/util/test_util.dart. // Do not manually edit this file. @@ -25,6 +25,7 @@ import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/debug/debug_platform_selector_viewmodel_test.mocks.dart b/test/viewmodel/debug/debug_platform_selector_viewmodel_test.mocks.dart index b1596c8d..b39668ea 100644 --- a/test/viewmodel/debug/debug_platform_selector_viewmodel_test.mocks.dart +++ b/test/viewmodel/debug/debug_platform_selector_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/debug/debug_platform_selector_viewmodel_test.dart. // Do not manually edit this file. @@ -24,6 +24,7 @@ import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/debug/debug_viewmodel_test.mocks.dart b/test/viewmodel/debug/debug_viewmodel_test.mocks.dart index f7808a1a..bcb35252 100644 --- a/test/viewmodel/debug/debug_viewmodel_test.mocks.dart +++ b/test/viewmodel/debug/debug_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/debug/debug_viewmodel_test.dart. // Do not manually edit this file. @@ -26,6 +26,7 @@ import 'package:mockito/src/dummies.dart' as _i11; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -1194,6 +1195,38 @@ class MockFlutterTemplateDatabase extends _i1.Mock returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); + @override + _i6.Future runWithInterceptor( + _i6.Future Function()? action, { + required _i4.QueryInterceptor? interceptor, + }) => + (super.noSuchMethod( + Invocation.method( + #runWithInterceptor, + [action], + {#interceptor: interceptor}, + ), + returnValue: _i11.ifNotNull( + _i11.dummyValueOrNull( + this, + Invocation.method( + #runWithInterceptor, + [action], + {#interceptor: interceptor}, + ), + ), + (T v) => _i6.Future.value(v), + ) ?? + _FakeFuture_13( + this, + Invocation.method( + #runWithInterceptor, + [action], + {#interceptor: interceptor}, + ), + ), + ) as _i6.Future); + @override _i4.GenerationContext $write( _i4.Component? component, { diff --git a/test/viewmodel/global/global_viewmodel_test.mocks.dart b/test/viewmodel/global/global_viewmodel_test.mocks.dart index 0555f4ae..7fb00166 100644 --- a/test/viewmodel/global/global_viewmodel_test.mocks.dart +++ b/test/viewmodel/global/global_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/global/global_viewmodel_test.dart. // Do not manually edit this file. @@ -25,6 +25,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/license/license_viewmodel_test.mocks.dart b/test/viewmodel/license/license_viewmodel_test.mocks.dart index e2ae7d54..d23642fe 100644 --- a/test/viewmodel/license/license_viewmodel_test.mocks.dart +++ b/test/viewmodel/license/license_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/license/license_viewmodel_test.dart. // Do not manually edit this file. @@ -19,6 +19,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/login/login_viewmodel_test.mocks.dart b/test/viewmodel/login/login_viewmodel_test.mocks.dart index 5a14370b..bdd8c9ce 100644 --- a/test/viewmodel/login/login_viewmodel_test.mocks.dart +++ b/test/viewmodel/login/login_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/login/login_viewmodel_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/splash/splash_viewmodel_test.dart b/test/viewmodel/splash/splash_viewmodel_test.dart index c36e9ac3..6eb120e5 100644 --- a/test/viewmodel/splash/splash_viewmodel_test.dart +++ b/test/viewmodel/splash/splash_viewmodel_test.dart @@ -1,6 +1,7 @@ import 'package:flutter_template/navigator/onboarding_navigator.dart'; import 'package:flutter_template/repository/remote_config/remote_config_repository.dart'; import 'package:flutter_template/repository/shared_prefs/local/local_storage.dart'; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart'; import 'package:flutter_template/viewmodel/splash/splash_viewmodel.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; @@ -13,22 +14,26 @@ import 'splash_viewmodel_test.mocks.dart'; LocalStorage, OnboardingNavigator, RemoteConfigRepository, + SentryPerformanceLogger, ]) void main() { late SplashViewModel sut; late LocalStorage localStorage; late OnboardingNavigator onboardingNavigator; late RemoteConfigRepository remoteConfigRepository; + late SentryPerformanceLogger sentryPerformanceLogger; setUp(() async { onboardingNavigator = MockOnboardingNavigator(); localStorage = MockLocalStorage(); remoteConfigRepository = MockRemoteConfigRepository(); - + sentryPerformanceLogger = MockSentryPerformanceLogger(); + sut = SplashViewModel( localStorage, onboardingNavigator, remoteConfigRepository, + sentryPerformanceLogger, ); }); diff --git a/test/viewmodel/splash/splash_viewmodel_test.mocks.dart b/test/viewmodel/splash/splash_viewmodel_test.mocks.dart index 7149259d..b0493281 100644 --- a/test/viewmodel/splash/splash_viewmodel_test.mocks.dart +++ b/test/viewmodel/splash/splash_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/splash/splash_viewmodel_test.dart. // Do not manually edit this file. @@ -11,6 +11,9 @@ import 'package:flutter_template/repository/remote_config/remote_config_reposito as _i6; import 'package:flutter_template/repository/shared_prefs/local/local_storage.dart' as _i2; +import 'package:flutter_template/util/logging/app_transactions.dart' as _i8; +import 'package:flutter_template/util/logging/sentry_performance_logger.dart' + as _i7; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -21,6 +24,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -171,3 +175,55 @@ class MockRemoteConfigRepository extends _i1.Mock returnValue: [], ) as List); } + +/// A class which mocks [SentryPerformanceLogger]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentryPerformanceLogger extends _i1.Mock + implements _i7.SentryPerformanceLogger { + MockSentryPerformanceLogger() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future startAppLoadTransaction() => (super.noSuchMethod( + Invocation.method( + #startAppLoadTransaction, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future finishAppLoadTransaction() => (super.noSuchMethod( + Invocation.method( + #finishAppLoadTransaction, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future startTransaction(_i8.AppTransactions? transaction) => + (super.noSuchMethod( + Invocation.method( + #startTransaction, + [transaction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future finishTransaction(_i8.AppTransactions? transaction) => + (super.noSuchMethod( + Invocation.method( + #finishTransaction, + [transaction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/viewmodel/theme_selector/theme_selector_viewmodel_test.mocks.dart b/test/viewmodel/theme_selector/theme_selector_viewmodel_test.mocks.dart index ced17b6b..2206b3da 100644 --- a/test/viewmodel/theme_selector/theme_selector_viewmodel_test.mocks.dart +++ b/test/viewmodel/theme_selector/theme_selector_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/theme_selector/theme_selector_viewmodel_test.dart. // Do not manually edit this file. @@ -24,6 +24,7 @@ import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/todo/todo_add/todo_add_viewmodel_test.mocks.dart b/test/viewmodel/todo/todo_add/todo_add_viewmodel_test.mocks.dart index c57863ab..a48995ef 100644 --- a/test/viewmodel/todo/todo_add/todo_add_viewmodel_test.mocks.dart +++ b/test/viewmodel/todo/todo_add/todo_add_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/todo/todo_add/todo_add_viewmodel_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/viewmodel/todo/todo_list/todo_list_viewmodel_test.mocks.dart b/test/viewmodel/todo/todo_list/todo_list_viewmodel_test.mocks.dart index 829552a1..745c07e8 100644 --- a/test/viewmodel/todo/todo_list/todo_list_viewmodel_test.mocks.dart +++ b/test/viewmodel/todo/todo_list/todo_list_viewmodel_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/viewmodel/todo/todo_list/todo_list_viewmodel_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/widget/debug/img/debug_row_item_with_subtitle.png b/test/widget/debug/img/debug_row_item_with_subtitle.png index 6175deb8..27b71bdf 100644 Binary files a/test/widget/debug/img/debug_row_item_with_subtitle.png and b/test/widget/debug/img/debug_row_item_with_subtitle.png differ diff --git a/test/widget/debug/img/debug_row_item_with_title.png b/test/widget/debug/img/debug_row_item_with_title.png index 84c4f509..301bb7ef 100644 Binary files a/test/widget/debug/img/debug_row_item_with_title.png and b/test/widget/debug/img/debug_row_item_with_title.png differ diff --git a/test/widget/debug/img/debug_row_title_default_state.png b/test/widget/debug/img/debug_row_title_default_state.png index cdbf90f9..4a2c5268 100644 Binary files a/test/widget/debug/img/debug_row_title_default_state.png and b/test/widget/debug/img/debug_row_title_default_state.png differ diff --git a/test/widget/debug/img/debug_switch_row_item_selected_state.png b/test/widget/debug/img/debug_switch_row_item_selected_state.png index 45dea45a..bab3fa9d 100644 Binary files a/test/widget/debug/img/debug_switch_row_item_selected_state.png and b/test/widget/debug/img/debug_switch_row_item_selected_state.png differ diff --git a/test/widget/debug/img/debug_switch_row_item_selected_state_subtitle.png b/test/widget/debug/img/debug_switch_row_item_selected_state_subtitle.png index f7ba79b3..2e9b8962 100644 Binary files a/test/widget/debug/img/debug_switch_row_item_selected_state_subtitle.png and b/test/widget/debug/img/debug_switch_row_item_selected_state_subtitle.png differ diff --git a/test/widget/debug/img/debug_switch_row_item_unselected_state.png b/test/widget/debug/img/debug_switch_row_item_unselected_state.png index 08bc76c3..2300ca7f 100644 Binary files a/test/widget/debug/img/debug_switch_row_item_unselected_state.png and b/test/widget/debug/img/debug_switch_row_item_unselected_state.png differ diff --git a/test/widget/debug/img/debug_switch_row_item_unselected_state_subtitle.png b/test/widget/debug/img/debug_switch_row_item_unselected_state_subtitle.png index bd147b8d..157e630f 100644 Binary files a/test/widget/debug/img/debug_switch_row_item_unselected_state_subtitle.png and b/test/widget/debug/img/debug_switch_row_item_unselected_state_subtitle.png differ diff --git a/test/widget/debug/img/select_language_dialog_en_selected.png b/test/widget/debug/img/select_language_dialog_en_selected.png index 74bdcbf2..d18ffc1d 100644 Binary files a/test/widget/debug/img/select_language_dialog_en_selected.png and b/test/widget/debug/img/select_language_dialog_en_selected.png differ diff --git a/test/widget/debug/img/select_language_dialog_initial_state.png b/test/widget/debug/img/select_language_dialog_initial_state.png index 74bdcbf2..d18ffc1d 100644 Binary files a/test/widget/debug/img/select_language_dialog_initial_state.png and b/test/widget/debug/img/select_language_dialog_initial_state.png differ diff --git a/test/widget/debug/img/select_language_dialog_nl_selected.png b/test/widget/debug/img/select_language_dialog_nl_selected.png index eb31686b..0c5c1d11 100644 Binary files a/test/widget/debug/img/select_language_dialog_nl_selected.png and b/test/widget/debug/img/select_language_dialog_nl_selected.png differ diff --git a/test/widget/debug/img/select_language_dialog_system_defaults_selected.png b/test/widget/debug/img/select_language_dialog_system_defaults_selected.png index 6a08c330..b2797faa 100644 Binary files a/test/widget/debug/img/select_language_dialog_system_defaults_selected.png and b/test/widget/debug/img/select_language_dialog_system_defaults_selected.png differ diff --git a/test/widget/debug/img/selector_item_initial_state.png b/test/widget/debug/img/selector_item_initial_state.png index 6b9a53ca..4bf6661e 100644 Binary files a/test/widget/debug/img/selector_item_initial_state.png and b/test/widget/debug/img/selector_item_initial_state.png differ diff --git a/test/widget/debug/img/selector_item_selected_state.png b/test/widget/debug/img/selector_item_selected_state.png index df484ad3..28fe59a0 100644 Binary files a/test/widget/debug/img/selector_item_selected_state.png and b/test/widget/debug/img/selector_item_selected_state.png differ diff --git a/test/widget/debug/select_language_dialog_test.mocks.dart b/test/widget/debug/select_language_dialog_test.mocks.dart index b4c8b406..4b1e8969 100644 --- a/test/widget/debug/select_language_dialog_test.mocks.dart +++ b/test/widget/debug/select_language_dialog_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/widget/debug/select_language_dialog_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/widget/general/flavor_banner_prod_test.dart b/test/widget/general/flavor_banner_prod_test.dart index b6cd01e1..12c6d8d8 100644 --- a/test/widget/general/flavor_banner_prod_test.dart +++ b/test/widget/general/flavor_banner_prod_test.dart @@ -20,7 +20,7 @@ void main() { ); final sut = FlavorBanner( child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); diff --git a/test/widget/general/flavor_banner_test.dart b/test/widget/general/flavor_banner_test.dart index 9293ac44..2ea25745 100644 --- a/test/widget/general/flavor_banner_test.dart +++ b/test/widget/general/flavor_banner_test.dart @@ -20,7 +20,7 @@ void main() { ); final sut = FlavorBanner( child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); diff --git a/test/widget/general/img/flavor_banner_initial_state.png b/test/widget/general/img/flavor_banner_initial_state.png index dfb451f0..c8d0ae23 100644 Binary files a/test/widget/general/img/flavor_banner_initial_state.png and b/test/widget/general/img/flavor_banner_initial_state.png differ diff --git a/test/widget/general/img/flavor_banner_prod_initial_state.png b/test/widget/general/img/flavor_banner_prod_initial_state.png index f4c9aa9d..ab4a00e3 100644 Binary files a/test/widget/general/img/flavor_banner_prod_initial_state.png and b/test/widget/general/img/flavor_banner_prod_initial_state.png differ diff --git a/test/widget/general/img/status_bar_animated_dark.png b/test/widget/general/img/status_bar_animated_dark.png index f4c9aa9d..ab4a00e3 100644 Binary files a/test/widget/general/img/status_bar_animated_dark.png and b/test/widget/general/img/status_bar_animated_dark.png differ diff --git a/test/widget/general/img/status_bar_animated_light.png b/test/widget/general/img/status_bar_animated_light.png index f4c9aa9d..ab4a00e3 100644 Binary files a/test/widget/general/img/status_bar_animated_light.png and b/test/widget/general/img/status_bar_animated_light.png differ diff --git a/test/widget/general/img/status_bar_dark.png b/test/widget/general/img/status_bar_dark.png index f4c9aa9d..ab4a00e3 100644 Binary files a/test/widget/general/img/status_bar_dark.png and b/test/widget/general/img/status_bar_dark.png differ diff --git a/test/widget/general/img/status_bar_light.png b/test/widget/general/img/status_bar_light.png index f4c9aa9d..ab4a00e3 100644 Binary files a/test/widget/general/img/status_bar_light.png and b/test/widget/general/img/status_bar_light.png differ diff --git a/test/widget/general/status_bar_test.dart b/test/widget/general/status_bar_test.dart index d9835818..0896de69 100644 --- a/test/widget/general/status_bar_test.dart +++ b/test/widget/general/status_bar_test.dart @@ -8,7 +8,7 @@ void main() { testWidgets('StatusBar light', (tester) async { final sut = StatusBar.light( child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); @@ -18,7 +18,7 @@ void main() { testWidgets('StatusBar dark', (tester) async { final sut = StatusBar.dark( child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); @@ -30,7 +30,7 @@ void main() { final sut = StatusBar.animated( isDarkStyle: true, child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); @@ -41,7 +41,7 @@ void main() { final sut = StatusBar.animated( isDarkStyle: false, child: Container( - color: Colors.amber.withOpacity(0.5), + color: Colors.amber.withValues(alpha: 0.5), ), ); diff --git a/test/widget/general/styled/img/flutter_template_button_default_state_android.png b/test/widget/general/styled/img/flutter_template_button_default_state_android.png index ee57151e..5519463e 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_default_state_android.png and b/test/widget/general/styled/img/flutter_template_button_default_state_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_default_state_ios.png b/test/widget/general/styled/img/flutter_template_button_default_state_ios.png index ee57151e..5519463e 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_default_state_ios.png and b/test/widget/general/styled/img/flutter_template_button_default_state_ios.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_not_enabled_android.png b/test/widget/general/styled/img/flutter_template_button_not_enabled_android.png index 51e5d173..558773b8 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_not_enabled_android.png and b/test/widget/general/styled/img/flutter_template_button_not_enabled_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_not_enabled_ios.png b/test/widget/general/styled/img/flutter_template_button_not_enabled_ios.png index 51e5d173..558773b8 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_not_enabled_ios.png and b/test/widget/general/styled/img/flutter_template_button_not_enabled_ios.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_not_expanded_android.png b/test/widget/general/styled/img/flutter_template_button_not_expanded_android.png index 2738d821..bb5c7e35 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_not_expanded_android.png and b/test/widget/general/styled/img/flutter_template_button_not_expanded_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_not_expanded_ios.png b/test/widget/general/styled/img/flutter_template_button_not_expanded_ios.png index 2738d821..bb5c7e35 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_not_expanded_ios.png and b/test/widget/general/styled/img/flutter_template_button_not_expanded_ios.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_with_key_android.png b/test/widget/general/styled/img/flutter_template_button_with_key_android.png index ee57151e..5519463e 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_with_key_android.png and b/test/widget/general/styled/img/flutter_template_button_with_key_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_button_with_key_ios.png b/test/widget/general/styled/img/flutter_template_button_with_key_ios.png index ee57151e..5519463e 100644 Binary files a/test/widget/general/styled/img/flutter_template_button_with_key_ios.png and b/test/widget/general/styled/img/flutter_template_button_with_key_ios.png differ diff --git a/test/widget/general/styled/img/flutter_template_input_field_type_text_after.png b/test/widget/general/styled/img/flutter_template_input_field_type_text_after.png index e45a91a8..036bcf41 100644 Binary files a/test/widget/general/styled/img/flutter_template_input_field_type_text_after.png and b/test/widget/general/styled/img/flutter_template_input_field_type_text_after.png differ diff --git a/test/widget/general/styled/img/flutter_template_input_field_type_text_before.png b/test/widget/general/styled/img/flutter_template_input_field_type_text_before.png index f6c755f7..d8617420 100644 Binary files a/test/widget/general/styled/img/flutter_template_input_field_type_text_before.png and b/test/widget/general/styled/img/flutter_template_input_field_type_text_before.png differ diff --git a/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_disabled.png b/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_disabled.png index e905f139..8daf5f00 100644 Binary files a/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_disabled.png and b/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_disabled.png differ diff --git a/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_enabled.png b/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_enabled.png index f6c755f7..d8617420 100644 Binary files a/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_enabled.png and b/test/widget/general/styled/img/flutter_template_input_field_with_hint_and_enabled.png differ diff --git a/test/widget/general/styled/img/flutter_template_switch_false_android.png b/test/widget/general/styled/img/flutter_template_switch_false_android.png index 136d4b7c..b13f6484 100644 Binary files a/test/widget/general/styled/img/flutter_template_switch_false_android.png and b/test/widget/general/styled/img/flutter_template_switch_false_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_switch_false_ios.png b/test/widget/general/styled/img/flutter_template_switch_false_ios.png index 136d4b7c..b13f6484 100644 Binary files a/test/widget/general/styled/img/flutter_template_switch_false_ios.png and b/test/widget/general/styled/img/flutter_template_switch_false_ios.png differ diff --git a/test/widget/general/styled/img/flutter_template_switch_true_android.png b/test/widget/general/styled/img/flutter_template_switch_true_android.png index d00ce46e..30b1a9ca 100644 Binary files a/test/widget/general/styled/img/flutter_template_switch_true_android.png and b/test/widget/general/styled/img/flutter_template_switch_true_android.png differ diff --git a/test/widget/general/styled/img/flutter_template_switch_true_ios.png b/test/widget/general/styled/img/flutter_template_switch_true_ios.png index d00ce46e..30b1a9ca 100644 Binary files a/test/widget/general/styled/img/flutter_template_switch_true_ios.png and b/test/widget/general/styled/img/flutter_template_switch_true_ios.png differ diff --git a/test/widget/provider/data_provider_widget_test.mocks.dart b/test/widget/provider/data_provider_widget_test.mocks.dart index 5d2f3a24..2300466d 100644 --- a/test/widget/provider/data_provider_widget_test.mocks.dart +++ b/test/widget/provider/data_provider_widget_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in flutter_template/test/widget/provider/data_provider_widget_test.dart. // Do not manually edit this file. @@ -21,6 +21,7 @@ import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/test/widget/provider/img/provider_widget_consumer.png b/test/widget/provider/img/provider_widget_consumer.png index 542af140..d6e5a882 100644 Binary files a/test/widget/provider/img/provider_widget_consumer.png and b/test/widget/provider/img/provider_widget_consumer.png differ diff --git a/test/widget/todo/img/todo_row_item_selected_state.png b/test/widget/todo/img/todo_row_item_selected_state.png index 2962d2ac..06cb603c 100644 Binary files a/test/widget/todo/img/todo_row_item_selected_state.png and b/test/widget/todo/img/todo_row_item_selected_state.png differ diff --git a/test/widget/todo/img/todo_row_item_unselected_state.png b/test/widget/todo/img/todo_row_item_unselected_state.png index 93df069d..42e88dd9 100644 Binary files a/test/widget/todo/img/todo_row_item_unselected_state.png and b/test/widget/todo/img/todo_row_item_unselected_state.png differ diff --git a/tool/github/test_coverage_create_helper.dart b/tool/github/test_coverage_create_helper.dart index c12097f9..8f0cfdc2 100644 --- a/tool/github/test_coverage_create_helper.dart +++ b/tool/github/test_coverage_create_helper.dart @@ -9,6 +9,7 @@ void main() { if (!element.path.endsWith('.dart')) return false; if (element.path.endsWith('.g.dart')) return false; if (element.path.endsWith('_web.dart')) return false; + if (element.path.contains('/widgetbook/')) return false; return true; }).map((element) { final importPath = element.path.replaceFirst('lib', packageName); diff --git a/tool/github/test_coverage_filter.dart b/tool/github/test_coverage_filter.dart index 40cec0cb..b75dde99 100644 --- a/tool/github/test_coverage_filter.dart +++ b/tool/github/test_coverage_filter.dart @@ -70,6 +70,8 @@ List getFilteredSections(List sections) { return false; } else if (header.startsWith('SF:lib/util/locale')) { return false; + } else if (header.contains('widgetbook/')) { + return false; } return true; }).toList(); diff --git a/tool/setup/dart/rename_project.dart b/tool/setup/dart/rename_project.dart index ba05bccf..07871b0c 100644 --- a/tool/setup/dart/rename_project.dart +++ b/tool/setup/dart/rename_project.dart @@ -232,6 +232,7 @@ void _renamePackage(String packageName, String description, String classNamePref Logger.info('Replace the description & name in the pubspec.yaml...'); _replaceInFile('pubspec.yaml', 'name: $originalProjectName', 'name: $packageName'); _replaceInFile('pubspec.yaml', 'description: $originalDescription', 'description: $description'); + _replaceInFile('coverage/test_coverage_filter.dart', originalClassNamePrefix, classNamePrefix); _replaceInFile('tool/test_coverage_filter.dart', originalClassNamePrefix, classNamePrefix); _replaceInFile('tool/test_coverage_create_helper.dart', originalProjectName, packageName); @@ -320,6 +321,7 @@ void _performFinalCheck() { if (element.path.startsWith('./.idea/')) return false; if (element.path.startsWith('./.DS_STORE')) return false; if (element.path.startsWith('./widgetbook/')) return false; + if (element.path.startsWith('./coverage/')) return false; return true; }).forEach((element) { if (element.path.contains(originalProjectName) ||