diff --git a/integration_test/1_dashboard.dart b/integration_test/1_dashboard.dart index 7580b828..135e37e6 100644 --- a/integration_test/1_dashboard.dart +++ b/integration_test/1_dashboard.dart @@ -57,31 +57,38 @@ Widget createDashboardScreen({String locale = 'en'}) { final mockUserProvider = MockUserProvider(); when(mockUserProvider.profile).thenReturn(tProfile1); - return MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => mockUserProvider, + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => mockUserProvider, + ), + ChangeNotifierProvider( + create: (context) => mockWorkoutProvider, + ), + ChangeNotifierProvider( + create: (context) => mockNutritionProvider, + ), + ChangeNotifierProvider( + create: (context) => mockWeightProvider, + ), + ChangeNotifierProvider( + create: (context) => mockMeasurementProvider, + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + theme: wgerLightTheme, + home: const DashboardScreen(), ), - ChangeNotifierProvider( - create: (context) => mockWorkoutProvider, - ), - ChangeNotifierProvider( - create: (context) => mockNutritionProvider, - ), - ChangeNotifierProvider( - create: (context) => mockWeightProvider, - ), - ChangeNotifierProvider( - create: (context) => mockMeasurementProvider, - ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - theme: wgerLightTheme, - home: const DashboardScreen(), ), ); } diff --git a/integration_test/2_workout.dart b/integration_test/2_workout.dart index 9abe0767..5f4d40a5 100644 --- a/integration_test/2_workout.dart +++ b/integration_test/2_workout.dart @@ -19,27 +19,34 @@ Widget createWorkoutDetailScreen({locale = 'en'}) { when(mockRoutinesProvider.findById(1)).thenReturn(routine); // when(mockRoutinesProvider.fetchAndSetRoutineFull(1)).thenAnswer((_) => Future.value(routine)); - return MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => mockRoutinesProvider, - ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - theme: wgerLightTheme, - navigatorKey: key, - home: TextButton( - onPressed: () => key.currentState!.push( - MaterialPageRoute( - settings: RouteSettings(arguments: routine.id), - builder: (_) => const RoutineScreen(), - ), + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => mockRoutinesProvider, + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + theme: wgerLightTheme, + navigatorKey: key, + home: TextButton( + onPressed: () => key.currentState!.push( + MaterialPageRoute( + settings: RouteSettings(arguments: routine.id), + builder: (_) => const RoutineScreen(), + ), + ), + child: const SizedBox(), ), - child: const SizedBox(), ), ), ); diff --git a/integration_test/3_gym_mode.dart b/integration_test/3_gym_mode.dart index 76431f08..a10e9382 100644 --- a/integration_test/3_gym_mode.dart +++ b/integration_test/3_gym_mode.dart @@ -28,37 +28,44 @@ Widget createGymModeScreen({locale = 'en'}) { //when(mockExerciseProvider.findExerciseBaseById(2)).thenReturn(bases[1]); // crunches //when(mockExerciseProvider.findExerciseBaseById(3)).thenReturn(bases[2]); // dead lift - return riverpod.ProviderScope( - child: MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => mockRoutinesProvider, - ), - ChangeNotifierProvider( - create: (context) => mockExerciseProvider, - ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - navigatorKey: key, - theme: wgerLightTheme, - home: TextButton( - onPressed: () => key.currentState!.push( - MaterialPageRoute( - settings: RouteSettings( - arguments: GymModeArguments(routine.id!, routine.days.first.id!, 1), - ), - builder: (_) => const GymModeScreen(), - ), + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: riverpod.ProviderScope( + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => mockRoutinesProvider, ), - child: const SizedBox(), + ChangeNotifierProvider( + create: (context) => mockExerciseProvider, + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + navigatorKey: key, + theme: wgerLightTheme, + home: TextButton( + onPressed: () => key.currentState!.push( + MaterialPageRoute( + settings: RouteSettings( + arguments: GymModeArguments(routine.id!, routine.days.first.id!, 1), + ), + builder: (_) => const GymModeScreen(), + ), + ), + child: const SizedBox(), + ), + routes: { + RoutineScreen.routeName: (ctx) => const RoutineScreen(), + }, ), - routes: { - RoutineScreen.routeName: (ctx) => const RoutineScreen(), - }, ), ), ); diff --git a/integration_test/4_measurements.dart b/integration_test/4_measurements.dart index d2dce605..bac130db 100644 --- a/integration_test/4_measurements.dart +++ b/integration_test/4_measurements.dart @@ -13,19 +13,26 @@ Widget createMeasurementScreen({locale = 'en'}) { final mockMeasurementProvider = MockMeasurementProvider(); when(mockMeasurementProvider.categories).thenReturn(getMeasurementCategories()); - return MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => mockMeasurementProvider, + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => mockMeasurementProvider, + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + theme: wgerLightTheme, + home: const MeasurementCategoriesScreen(), ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - theme: wgerLightTheme, - home: const MeasurementCategoriesScreen(), ), ); } diff --git a/integration_test/5_nutritional_plan.dart b/integration_test/5_nutritional_plan.dart index dacb1725..3bc9acd0 100644 --- a/integration_test/5_nutritional_plan.dart +++ b/integration_test/5_nutritional_plan.dart @@ -16,34 +16,41 @@ Widget createNutritionalPlanScreen({locale = 'en'}) { final key = GlobalKey(); - return MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => NutritionPlansProvider( - mockBaseProvider, - [], - database: IngredientDatabase.inMemory(NativeDatabase.memory()), - ), - ), - ChangeNotifierProvider( - create: (context) => BodyWeightProvider(mockBaseProvider), - ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - theme: wgerLightTheme, - navigatorKey: key, - home: TextButton( - onPressed: () => key.currentState!.push( - MaterialPageRoute( - settings: RouteSettings(arguments: getNutritionalPlanScreenshot()), - builder: (_) => const NutritionalPlanScreen(), + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => NutritionPlansProvider( + mockBaseProvider, + [], + database: IngredientDatabase.inMemory(NativeDatabase.memory()), ), ), - child: const SizedBox(), + ChangeNotifierProvider( + create: (context) => BodyWeightProvider(mockBaseProvider), + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + theme: wgerLightTheme, + navigatorKey: key, + home: TextButton( + onPressed: () => key.currentState!.push( + MaterialPageRoute( + settings: RouteSettings(arguments: getNutritionalPlanScreenshot()), + builder: (_) => const NutritionalPlanScreen(), + ), + ), + child: const SizedBox(), + ), ), ), ); diff --git a/integration_test/6_weight.dart b/integration_test/6_weight.dart index f02c059d..6de46602 100644 --- a/integration_test/6_weight.dart +++ b/integration_test/6_weight.dart @@ -26,26 +26,33 @@ Widget createWeightScreen({locale = 'en'}) { when(mockNutritionPlansProvider.currentPlan).thenReturn(null); when(mockNutritionPlansProvider.items).thenReturn([getNutritionalPlan()]); - return MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => mockUserProvider, + return MediaQuery( + data: const MediaQueryData( + padding: EdgeInsets.zero, + viewPadding: EdgeInsets.zero, + viewInsets: EdgeInsets.zero, + ), + child: MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => mockUserProvider, + ), + ChangeNotifierProvider( + create: (context) => weightProvider, + ), + ChangeNotifierProvider( + create: (context) => mockNutritionPlansProvider, + ), + ], + child: MaterialApp( + locale: Locale(locale), + debugShowCheckedModeBanner: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + theme: wgerLightTheme, + home: const WeightScreen(), + routes: {FormScreen.routeName: (ctx) => const FormScreen()}, ), - ChangeNotifierProvider( - create: (context) => weightProvider, - ), - ChangeNotifierProvider( - create: (context) => mockNutritionPlansProvider, - ), - ], - child: MaterialApp( - locale: Locale(locale), - debugShowCheckedModeBanner: false, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - theme: wgerLightTheme, - home: const WeightScreen(), - routes: {FormScreen.routeName: (ctx) => const FormScreen()}, ), ); } diff --git a/integration_test/README.md b/integration_test/README.md index cdc6a593..bbc54923 100644 --- a/integration_test/README.md +++ b/integration_test/README.md @@ -2,7 +2,16 @@ This will generate some screenshots and save them to the Play Store metadata fol 1) Set the correct value for the device size by setting the `destination` variable 2) Start the correct emulator and - run `flutter drive --driver=test_driver/screenshot_driver.dart --target=integration_test/make_screenshots_test.dart` + run + ``` + flutter drive \ + --driver=test_driver/screenshot_driver.dart \ + --target=integration_test/make_screenshots_test.dart \ + --dart-define=DEVICE_TYPE=androidPhone + ``` + For the values of device type, consult the values of the DeviceType enum in + `make_screenshots_test.dart` +5) flutter drive --driver=test_driver/screenshot_driver.dart --target=integration_test/make_screenshots_test.dart --dart-define=DEVICE_TYPE=androidPhone` 3) If you get errors or the screenshots are not written to disk, edit the `languages` list and comment some of the languages diff --git a/integration_test/make_screenshots_test.dart b/integration_test/make_screenshots_test.dart index 3d475363..5ab6b318 100644 --- a/integration_test/make_screenshots_test.dart +++ b/integration_test/make_screenshots_test.dart @@ -11,16 +11,41 @@ import '4_measurements.dart'; import '5_nutritional_plan.dart'; import '6_weight.dart'; -// Type of device +/// Type of device +/// +/// For Apple: https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications enum DeviceType { - phoneScreenshots, - sevenInchScreenshots, - tenInchScreenshots, - tvScreenshots, - wearScreenshots, + androidPhone('phoneScreenshots'), + androidTableSmall('7inchScreenshots'), + androidTabletBig('10inchScreenshots'), + androidTv('tvScreenshots'), + androidWear('wearScreenshots'), + + iOSPhoneBig('iPhone 6.9', isAndroid: false), + iOSPhoneSmall('iPhone 6.7', isAndroid: false); + + final String folderName; + final bool isAndroid; + + const DeviceType(this.folderName, {this.isAndroid = true}); + + String fastlanePath(String language, String name) { + final os = isAndroid ? 'android' : 'ios'; + + return 'fastlane/metadata/$os/$language/images/$folderName/$name.png'; + } } -final destination = DeviceType.phoneScreenshots.name; +const _deviceArg = String.fromEnvironment('DEVICE_TYPE', defaultValue: 'androidPhone'); + +// Determine the destination device type based on the provided argument +final DeviceType destination = DeviceType.values.firstWhere( + (d) => d.toString().split('.').last == _deviceArg || ((d.name ?? '') == _deviceArg), + orElse: () { + print('***** Unknown DEVICE_TYPE="$_deviceArg", defaulting to androidPhone *****'); + return DeviceType.androidPhone; + }, +); Future takeScreenshot( WidgetTester tester, @@ -33,7 +58,8 @@ Future takeScreenshot( await binding.convertFlutterSurfaceToImage(); await tester.pumpAndSettle(); } - final filename = 'fastlane/metadata/android/$language/images/$destination/$name.png'; + + final filename = destination.fastlanePath(language, name); await binding.takeScreenshot(filename); } @@ -42,31 +68,7 @@ Future takeScreenshot( const languages = [ // Note: it seems if too many languages are processed at once, some processes // disappear and no images are written. Doing this in smaller steps works fine - 'ar', - 'ca', - 'cs-CZ', 'de-DE', - 'el-GR', - 'en-US', - 'es-ES', - - 'fr-FR', - 'hi-IN', - 'hr', - 'it-IT', - 'ko-KR', - 'nb-NO', - 'pl-PL', - - 'pt-BR', - 'pt-PT', - 'ru-RU', - 'sr', - 'ta-IN', - 'tr-TR', - 'uk', - 'zh-CN', - 'zh-TW', ]; void main() { diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e2a08f6f..de80655b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -104,22 +104,22 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/video_player_avfoundation/darwin" SPEC CHECKSUMS: - camera_avfoundation: be3be85408cd4126f250386828e9b1dfa40ab436 + camera_avfoundation: 5675ca25298b6f81fa0a325188e7df62cc217741 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 flutter_zxing: e8bcc43bd3056c70c271b732ed94e7a16fd62f93 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 + pointer_interceptor_ios: da06a662d5bfd329602b45b2ab41bc0fb5fdb0f0 rive_common: dd421daaf9ae69f0125aa761dd96abd278399952 - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a -PODFILE CHECKSUM: 5a367937f10bf0c459576e5e472a1159ee029c13 +PODFILE CHECKSUM: 140d612345f5f5eda8a7ae30f1ccf4e0b07aced5 COCOAPODS: 1.16.2