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.
-
-
-
+
+
+
+
+
+
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;
+ },
+ );
+}