diff --git a/README.md b/README.md index 1a7d3a7..adb8640 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ A Bible reading schedule app for the New World Translation of the Holy Scriptures for Jehovah's Witnesses. - - - +Plans +Schedule +Schedule Dark Mode +New +Edit +Settings diff --git a/assets/store_presence/screenshots/ios-1-plans-overlay.png b/assets/store_presence/screenshots/ios-1-plans-overlay.png new file mode 100644 index 0000000..05e946a Binary files /dev/null and b/assets/store_presence/screenshots/ios-1-plans-overlay.png differ diff --git a/assets/store_presence/screenshots/ios-2-schedule-overlay.png b/assets/store_presence/screenshots/ios-2-schedule-overlay.png new file mode 100644 index 0000000..c66deef Binary files /dev/null and b/assets/store_presence/screenshots/ios-2-schedule-overlay.png differ diff --git a/assets/store_presence/screenshots/ios-3-schedule-dark-overlay.png b/assets/store_presence/screenshots/ios-3-schedule-dark-overlay.png new file mode 100644 index 0000000..c7cbb2f Binary files /dev/null and b/assets/store_presence/screenshots/ios-3-schedule-dark-overlay.png differ diff --git a/assets/store_presence/screenshots/ios-4-new-overlay.png b/assets/store_presence/screenshots/ios-4-new-overlay.png new file mode 100644 index 0000000..8a58f1c Binary files /dev/null and b/assets/store_presence/screenshots/ios-4-new-overlay.png differ diff --git a/assets/store_presence/screenshots/ios-5-edit-overlay.png b/assets/store_presence/screenshots/ios-5-edit-overlay.png new file mode 100644 index 0000000..68252a5 Binary files /dev/null and b/assets/store_presence/screenshots/ios-5-edit-overlay.png differ diff --git a/assets/store_presence/screenshots/ios-6-settings-overlay.png b/assets/store_presence/screenshots/ios-6-settings-overlay.png new file mode 100644 index 0000000..006e5ec Binary files /dev/null and b/assets/store_presence/screenshots/ios-6-settings-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-1-plans-overlay.png b/assets/store_presence/screenshots/ipad-1-plans-overlay.png new file mode 100644 index 0000000..159ded6 Binary files /dev/null and b/assets/store_presence/screenshots/ipad-1-plans-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-2-schedule-overlay.png b/assets/store_presence/screenshots/ipad-2-schedule-overlay.png new file mode 100644 index 0000000..cc90fdd Binary files /dev/null and b/assets/store_presence/screenshots/ipad-2-schedule-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-3-schedule-dark-overlay.png b/assets/store_presence/screenshots/ipad-3-schedule-dark-overlay.png new file mode 100644 index 0000000..f1eab14 Binary files /dev/null and b/assets/store_presence/screenshots/ipad-3-schedule-dark-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-4-new-overlay.png b/assets/store_presence/screenshots/ipad-4-new-overlay.png new file mode 100644 index 0000000..34228c5 Binary files /dev/null and b/assets/store_presence/screenshots/ipad-4-new-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-5-edit-overlay.png b/assets/store_presence/screenshots/ipad-5-edit-overlay.png new file mode 100644 index 0000000..c97123c Binary files /dev/null and b/assets/store_presence/screenshots/ipad-5-edit-overlay.png differ diff --git a/assets/store_presence/screenshots/ipad-6-settings-overlay.png b/assets/store_presence/screenshots/ipad-6-settings-overlay.png new file mode 100644 index 0000000..1b8535d Binary files /dev/null and b/assets/store_presence/screenshots/ipad-6-settings-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-1-plans-overlay.png b/assets/store_presence/screenshots/phone-1-plans-overlay.png new file mode 100644 index 0000000..e0a0d50 Binary files /dev/null and b/assets/store_presence/screenshots/phone-1-plans-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-2-schedule-overlay.png b/assets/store_presence/screenshots/phone-2-schedule-overlay.png new file mode 100644 index 0000000..baf23e9 Binary files /dev/null and b/assets/store_presence/screenshots/phone-2-schedule-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-3-schedule-dark-overlay.png b/assets/store_presence/screenshots/phone-3-schedule-dark-overlay.png new file mode 100644 index 0000000..83091f4 Binary files /dev/null and b/assets/store_presence/screenshots/phone-3-schedule-dark-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-4-new-overlay.png b/assets/store_presence/screenshots/phone-4-new-overlay.png new file mode 100644 index 0000000..11687a6 Binary files /dev/null and b/assets/store_presence/screenshots/phone-4-new-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-5-edit-overlay.png b/assets/store_presence/screenshots/phone-5-edit-overlay.png new file mode 100644 index 0000000..a3bcca4 Binary files /dev/null and b/assets/store_presence/screenshots/phone-5-edit-overlay.png differ diff --git a/assets/store_presence/screenshots/phone-6-settings-overlay.png b/assets/store_presence/screenshots/phone-6-settings-overlay.png new file mode 100644 index 0000000..ed726e1 Binary files /dev/null and b/assets/store_presence/screenshots/phone-6-settings-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-1-plans-overlay.png b/assets/store_presence/screenshots/tablet13-1-plans-overlay.png new file mode 100644 index 0000000..c46a6f6 Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-1-plans-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-2-schedule-overlay.png b/assets/store_presence/screenshots/tablet13-2-schedule-overlay.png new file mode 100644 index 0000000..70ab9f1 Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-2-schedule-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-3-schedule-dark-overlay.png b/assets/store_presence/screenshots/tablet13-3-schedule-dark-overlay.png new file mode 100644 index 0000000..78e3c1d Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-3-schedule-dark-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-4-new-overlay.png b/assets/store_presence/screenshots/tablet13-4-new-overlay.png new file mode 100644 index 0000000..07b9567 Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-4-new-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-5-edit-overlay.png b/assets/store_presence/screenshots/tablet13-5-edit-overlay.png new file mode 100644 index 0000000..5840794 Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-5-edit-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet13-6-settings-overlay.png b/assets/store_presence/screenshots/tablet13-6-settings-overlay.png new file mode 100644 index 0000000..0501059 Binary files /dev/null and b/assets/store_presence/screenshots/tablet13-6-settings-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-1-plans-overlay.png b/assets/store_presence/screenshots/tablet7-1-plans-overlay.png new file mode 100644 index 0000000..e0fda6d Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-1-plans-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-2-schedule-overlay.png b/assets/store_presence/screenshots/tablet7-2-schedule-overlay.png new file mode 100644 index 0000000..baf19aa Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-2-schedule-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-3-schedule-dark-overlay.png b/assets/store_presence/screenshots/tablet7-3-schedule-dark-overlay.png new file mode 100644 index 0000000..5e66618 Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-3-schedule-dark-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-4-new-overlay.png b/assets/store_presence/screenshots/tablet7-4-new-overlay.png new file mode 100644 index 0000000..11244fd Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-4-new-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-5-edit-overlay.png b/assets/store_presence/screenshots/tablet7-5-edit-overlay.png new file mode 100644 index 0000000..0945cf0 Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-5-edit-overlay.png differ diff --git a/assets/store_presence/screenshots/tablet7-6-settings-overlay.png b/assets/store_presence/screenshots/tablet7-6-settings-overlay.png new file mode 100644 index 0000000..c526f80 Binary files /dev/null and b/assets/store_presence/screenshots/tablet7-6-settings-overlay.png differ diff --git a/assets/store_presence/store-listing.md b/assets/store_presence/store-listing.md new file mode 100644 index 0000000..efe78b1 --- /dev/null +++ b/assets/store_presence/store-listing.md @@ -0,0 +1,28 @@ +# Store Listing + +## App name + +NWT Reading + +## Short description + +Bible reading schedule for the New World Translation, designed for Jehovah's Witnesses. +Bible reading schedule for the New World Translation of Jehovah's Witnesses. + +## Full description + +NWT Reading provides a Bible reading schedule for the New World Translation of the Holy Scriptures, specifically for Jehovah's Witnesses. + +• Supports reading the Bible in all available languages of the complete New World Translation, including sign languages. +• Scriptures open in the JW Library® app. +• Tracks your reading progress and shows the number of days you are ahead or behind schedule. +• Offers several reading plans: canonical, in the order the Bible books were written, and chronologically, as the events took place. +• Allows you to select the reading speed or read without a specific end date. +• Highlights dates with key events in the chronological plan. +• Shows locations mentioned in each section and where to find them in the brochure “See the Good Land.” +• NEW: Use multiple Bible reading plans in parallel. +• NEW: Enjoy a dark mode theme for a more comfortable reading experience. +• NEW: NWT Reading is now open source! Find us on GitHub and contribute. +• User interface available in Czech, English, French, German, Hungarian, Italian, Polish, Portuguese (Brazil), Romanian, Russian, and Spanish. + +JW Library is a registered trademark of the Watch Tower Bible and Tract Society of Pennsylvania. diff --git a/docs/screenshots/edit.png b/docs/screenshots/edit.png deleted file mode 100644 index 51e567d..0000000 Binary files a/docs/screenshots/edit.png and /dev/null differ diff --git a/docs/screenshots/plans.png b/docs/screenshots/plans.png deleted file mode 100644 index f797c59..0000000 Binary files a/docs/screenshots/plans.png and /dev/null differ diff --git a/docs/screenshots/schedule.png b/docs/screenshots/schedule.png deleted file mode 100644 index 42ed20b..0000000 Binary files a/docs/screenshots/schedule.png and /dev/null differ diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index 4276927..2de0e10 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -32,7 +32,6 @@ import 'package:shared_preferences/shared_preferences.dart'; import '../test/test_data.dart'; import 'settled_tester.dart'; -import 'take_screenshot.dart'; Future getDefaultProviderContainer( WidgetTester tester) async => @@ -130,7 +129,6 @@ void main() async { await tester.tap(find.byType(FloatingActionButton)); await tester.pumpAndSettle(); - await takeScreenshot(tester: tester, binding: binding, filename: 'new'); BuildContext buildContext = tester.firstElement(find.byKey(const Key('plan-name'))); @@ -328,7 +326,6 @@ void main() async { final providerContainer = await getDefaultProviderContainer(tester); final lastPlanCardFinder = find.byKey( Key('plan-${providerContainer.read(plansProvider).plans.last.id}')); - await takeScreenshot(tester: tester, binding: binding, filename: 'plans'); await tester.tap(find.byType(PlanCard).first); await tester.pumpAndSettle(); @@ -723,8 +720,6 @@ void main() async { expect(find.byKey(const Key('day-33')), findsOneWidget); expect(find.byIcon(Icons.check_circle), findsAtLeastNWidgets(3)); expect(find.byIcon(Icons.check_circle_outline), findsWidgets); - await takeScreenshot( - tester: tester, binding: binding, filename: 'schedule'); }); testWidgets('Change plan name', (tester) async { @@ -733,7 +728,6 @@ void main() async { await tester.pumpAndSettle(); await tester.tap(find.byIcon(Icons.edit)); await tester.pumpAndSettle(); - await takeScreenshot(tester: tester, binding: binding, filename: 'edit'); Plan plan = providerContainer.read(plansProvider).plans.first; BuildContext buildContext = @@ -828,7 +822,6 @@ void main() async { await tester.pumpAndSettle(); await tester.tap(find.byIcon(Icons.edit)); await tester.pumpAndSettle(); - await takeScreenshot(tester: tester, binding: binding, filename: 'edit'); await tester.tap(find.byKey(const Key('language'))); await tester.pumpAndSettle(); await tester.scrollUntilVisible( diff --git a/integration_test/take_screenshot.dart b/integration_test/take_screenshot.dart deleted file mode 100644 index 74c3308..0000000 --- a/integration_test/take_screenshot.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; - -// ignore: inference_failure_on_function_return_type -takeScreenshot( - {required WidgetTester tester, - required IntegrationTestWidgetsFlutterBinding binding, - required String filename}) async { - if (kIsWeb) { - await binding.takeScreenshot('docs/screenshots/$filename.png'); - } -} diff --git a/integration_test/take_screenshots.dart b/integration_test/take_screenshots.dart new file mode 100644 index 0000000..8c5aa0a --- /dev/null +++ b/integration_test/take_screenshots.dart @@ -0,0 +1,122 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:nwt_reading/src/plans/presentations/plan_card.dart'; + +import '../test/test_data.dart'; +import 'settled_tester.dart'; + +// Consider implementing +// https://medium.com/@mregnauld/generate-screenshots-for-a-flutter-app-with-golden-testing-and-upload-them-to-the-stores-1-2-45f8df777aef. + +Future getDefaultProviderContainer( + WidgetTester tester) async => + SettledTester(tester, sharedPreferences: { + ...testPlansPreferences, + ...await getWhatsNewSeenPreference() + }).providerContainer; + +final os = Platform.operatingSystem; + +void takeScreenshot( + {required IntegrationTestWidgetsFlutterBinding binding, + required String filename}) async { + await binding.takeScreenshot('assets/store_presence/screenshots/$os-$filename.png'); + await Future.delayed(const Duration(seconds: 5)); +} + +void main() async { + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + WidgetController.hitTestWarningShouldBeFatal = true; + + testWidgets('Take the plans list screenshot', (tester) async { + await getDefaultProviderContainer(tester); + await binding.convertFlutterSurfaceToImage(); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '1-plans'); + }); + + testWidgets('Take the schedule screenshot', (tester) async { + await getDefaultProviderContainer(tester); + await tester.tap(find.byType(PlanCard).first); + await tester.pumpAndSettle(); + await tester.scrollUntilVisible( + find.byKey(const Key('day-33')), + -500.0, + ); + await tester.pumpAndSettle(); + await tester.tap(find + .descendant( + of: find.byKey(const Key('day-34')), + matching: find.byType(IconButton)) + .first); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('confirm-toggle-read'))); + await tester.pumpAndSettle(); + await tester.scrollUntilVisible( + find.byKey(const Key('day-70')), + 500.0, + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pumpAndSettle(); + await binding.convertFlutterSurfaceToImage(); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '2-schedule'); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.settings)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.dark_mode)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(PlanCard).first); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '3-schedule-dark'); + }); + + testWidgets('Take the new plan screenshot', (tester) async { + await SettledTester(tester, + sharedPreferences: await getWhatsNewSeenPreference()) + .providerContainer; + await tester.tap(find.byType(FloatingActionButton)); + await tester.pumpAndSettle(); + + // Hide the keyboard. + SystemChannels.textInput.invokeMethod('TextInput.hide'); + await binding.convertFlutterSurfaceToImage(); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '4-new'); + }); + + testWidgets('Take the plan edit screenshot', (tester) async { + await getDefaultProviderContainer(tester); + await tester.tap(find.byType(PlanCard).first); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.edit)); + await tester.pumpAndSettle(); + + // Hide the keyboard. + SystemChannels.textInput.invokeMethod('TextInput.hide'); + await binding.convertFlutterSurfaceToImage(); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '5-edit'); + }); + + testWidgets('Take the settings screenshot', (tester) async { + await getDefaultProviderContainer(tester); + await tester.tap(find.byIcon(Icons.settings)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.dark_mode)); + await tester.pumpAndSettle(); + await binding.convertFlutterSurfaceToImage(); + await tester.pumpAndSettle(); + takeScreenshot(binding: binding, filename: '6-settings'); + }); +} diff --git a/test_driver/integration_test.dart b/test_driver/integration_test.dart deleted file mode 100644 index ccf5699..0000000 --- a/test_driver/integration_test.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'dart:io'; -import 'package:integration_test/integration_test_driver_extended.dart'; - -Future main() async { - try { - await integrationDriver( - onScreenshot: (String filePath, List bytes, [args]) async { - final File image = await File(filePath).create(recursive: true); - image.writeAsBytesSync(bytes); - - return true; - }, - ); - } catch (e) { - // ignore: avoid_print - print('Error occurred: $e'); - } -} diff --git a/test_driver/take_screenshots_test.dart b/test_driver/take_screenshots_test.dart new file mode 100644 index 0000000..186ffa7 --- /dev/null +++ b/test_driver/take_screenshots_test.dart @@ -0,0 +1,16 @@ +import 'dart:io'; +import 'package:integration_test/integration_test_driver_extended.dart'; + +Future main() async { + await integrationDriver( + onScreenshot: (String screenshotName, List screenshotBytes, + [Map? args]) async { + // ignore: avoid_print + print('Saving screen shot $screenshotName.'); + final File image = File(screenshotName); + image.writeAsBytesSync(screenshotBytes); + // Return false if the screenshot is invalid. + return true; + }, + ); +}