~repos /only-bible-app

#kotlin#android#ios

GIT_CONFIG_PARAMETERS="'http.version=HTTP/1.1'" git clone https://git.pyrossh.dev/only-bible-app.git
Discussions: https://groups.google.com/g/rust-embed-devs

The only bible app you will ever need. No ads. No in-app purchases. No distractions.


lib/widgets/home_app_bar.dart CHANGED
@@ -30,15 +30,16 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
30
30
  crossAxisAlignment: CrossAxisAlignment.center,
31
31
  children: [
32
32
  InkWell(
33
+ key: const Key("bookTitle"),
33
34
  enableFeedback: true,
34
35
  onTap: () => context.dispatch(ShowBookSelectAction(context, bible)),
35
36
  child: Text(
36
37
  bookName,
37
38
  style: Theme.of(context).textTheme.headlineMedium,
38
- key: const Key("bookTitle"),
39
39
  ),
40
40
  ),
41
41
  InkWell(
42
+ key: const Key("chapterTitle"),
42
43
  enableFeedback: true,
43
44
  onTap: () => context.dispatch(ShowChapterSelectAction(context, bible, book)),
44
45
  child: Padding(
@@ -46,7 +47,6 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
46
47
  child: Text(
47
48
  "${chapter.index + 1}",
48
49
  style: Theme.of(context).textTheme.headlineMedium,
49
- key: const Key("chapterTitle"),
50
50
  ),
51
51
  ),
52
52
  ),
@@ -69,6 +69,7 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
69
69
  Padding(
70
70
  padding: const EdgeInsets.only(left: 10),
71
71
  child: IconButton(
72
+ key: const Key("settingsButton"),
72
73
  padding: EdgeInsets.zero,
73
74
  icon: const Icon(Icons.more_vert, size: 28),
74
75
  onPressed: () => context.dispatch(ShowSettingsAction(context, bible)),
pubspec.lock CHANGED
@@ -125,10 +125,10 @@ packages:
125
125
  dependency: transitive
126
126
  description:
127
127
  name: built_value
128
- sha256: "6ae8a6435a8c6520c7077b107e77f1fb4ba7009633259a4d49a8afd8e7efc5e9"
128
+ sha256: "0730c18c770d05636a8f945c32a4d7d81cb6e0f0148c8db4ad12e7748f7e49af"
129
129
  url: "https://pub.dev"
130
130
  source: hosted
131
- version: "8.12.4"
131
+ version: "8.12.5"
132
132
  characters:
133
133
  dependency: transitive
134
134
  description:
@@ -350,14 +350,6 @@ packages:
350
350
  url: "https://pub.dev"
351
351
  source: hosted
352
352
  version: "1.0.0"
353
- flutter_dotenv:
354
- dependency: "direct main"
355
- description:
356
- name: flutter_dotenv
357
- sha256: d4130c4a43e0b13fefc593bc3961f2cb46e30cb79e253d4a526b1b5d24ae1ce4
358
- url: "https://pub.dev"
359
- source: hosted
360
- version: "6.0.0"
361
353
  flutter_driver:
362
354
  dependency: transitive
363
355
  description: flutter
@@ -447,6 +439,14 @@ packages:
447
439
  url: "https://pub.dev"
448
440
  source: hosted
449
441
  version: "2.1.3"
442
+ golden_screenshot:
443
+ dependency: "direct dev"
444
+ description:
445
+ name: golden_screenshot
446
+ sha256: c3ebae338a174bc4e6c20c19201002b839da38948e853ae3965bacb694e3b2d5
447
+ url: "https://pub.dev"
448
+ source: hosted
449
+ version: "11.0.1"
450
450
  graphs:
451
451
  dependency: transitive
452
452
  description:
pubspec.yaml CHANGED
@@ -26,7 +26,6 @@ dependencies:
26
26
  http: ^1.6.0
27
27
  async_redux: ^27.1.1
28
28
  flat_buffers: ^25.9.23
29
- flutter_dotenv: ^6.0.0
30
29
 
31
30
  dev_dependencies:
32
31
  flutter_test:
@@ -39,12 +38,12 @@ dev_dependencies:
39
38
  build_runner: any
40
39
  flutter_gen_runner: any
41
40
  html: any
41
+ golden_screenshot: ^11.0.1
42
42
 
43
43
  flutter:
44
44
  generate: true
45
45
  uses-material-design: true
46
46
  assets:
47
- - .env
48
47
  - assets/bibles/
49
48
  - assets/fonts/
50
49
  fonts:
screenshots/ipadScreenshots/book_select.png ADDED
Binary file
screenshots/ipadScreenshots/chapter_select.png ADDED
Binary file
screenshots/ipadScreenshots/home_dark.png ADDED
Binary file
screenshots/ipadScreenshots/home_light.png ADDED
Binary file
screenshots/ipadScreenshots/settings.png ADDED
Binary file
screenshots/ipadScreenshots/verse_select.png ADDED
Binary file
screenshots/iphoneScreenshots/book_select.png ADDED
Binary file
screenshots/iphoneScreenshots/chapter_select.png ADDED
Binary file
screenshots/iphoneScreenshots/home_dark.png ADDED
Binary file
screenshots/iphoneScreenshots/home_light.png ADDED
Binary file
screenshots/iphoneScreenshots/settings.png ADDED
Binary file
screenshots/iphoneScreenshots/verse_select.png ADDED
Binary file
screenshots/{0x0ss (1).png → macScreenshots/0x0ss (1).png} RENAMED
File without changes
screenshots/{0x0ss (2).png → macScreenshots/0x0ss (2).png} RENAMED
File without changes
screenshots/{0x0ss (3).png → macScreenshots/0x0ss (3).png} RENAMED
File without changes
screenshots/{0x0ss.png → macScreenshots/0x0ss.png} RENAMED
File without changes
screenshots/phoneScreenshots/book_select.png ADDED
Binary file
screenshots/phoneScreenshots/chapter_select.png ADDED
Binary file
screenshots/phoneScreenshots/home_dark.png ADDED
Binary file
screenshots/phoneScreenshots/home_light.png ADDED
Binary file
screenshots/phoneScreenshots/settings.png ADDED
Binary file
screenshots/phoneScreenshots/verse_select.png ADDED
Binary file
test/screenshot_test.dart ADDED
@@ -0,0 +1,144 @@
1
+ import "package:async_redux/async_redux.dart";
2
+ import "package:flutter/material.dart";
3
+ import "package:flutter_test/flutter_test.dart";
4
+ import "package:golden_screenshot/golden_screenshot.dart";
5
+ import "package:only_bible_app/gen/bible.gen.dart";
6
+ import "package:only_bible_app/gen/l10n/app_localizations.dart";
7
+ import "package:only_bible_app/home.dart";
8
+ import "package:only_bible_app/store/app_state.dart";
9
+ import "package:only_bible_app/theme.dart";
10
+ import "package:only_bible_app/utils.dart";
11
+
12
+ Widget buildScreenshotApp({
13
+ required ScreenshotDevice device,
14
+ required Store<AppState> store,
15
+ required Widget home,
16
+ ThemeMode themeMode = ThemeMode.light,
17
+ }) {
18
+ return StoreProvider<AppState>(
19
+ store: store,
20
+ child: ScreenshotApp(
21
+ device: device,
22
+ theme: lightTheme,
23
+ darkTheme: darkTheme,
24
+ themeMode: themeMode,
25
+ localizationsDelegates: AppLocalizations.localizationsDelegates,
26
+ supportedLocales: AppLocalizations.supportedLocales,
27
+ locale: const Locale("en"),
28
+ home: home,
29
+ ),
30
+ );
31
+ }
32
+
33
+ void main() {
34
+ late Bible bible;
35
+ ScreenshotDevice.screenshotsFolder = '../screenshots/';
36
+
37
+ setUpAll(() async {
38
+ bible = await loadBible("English");
39
+ });
40
+
41
+ final devices = [
42
+ GoldenScreenshotDevices.iphone,
43
+ GoldenScreenshotDevices.ipad,
44
+ GoldenScreenshotDevices.androidPhone,
45
+ ];
46
+
47
+ for (final device in devices) {
48
+ testGoldens("${device.name} - home light", (tester) async {
49
+ final store = Store<AppState>(initialState: AppState(bible: bible));
50
+ await tester.pumpWidget(buildScreenshotApp(
51
+ device: device.device,
52
+ store: store,
53
+ home: const Home(),
54
+ ));
55
+ await tester.loadAssets();
56
+ await tester.pump();
57
+ await tester.expectScreenshot(device.device, "home_light");
58
+ });
59
+
60
+ testGoldens("${device.name} - home dark", (tester) async {
61
+ final store = Store<AppState>(
62
+ initialState: AppState(bible: bible, darkMode: true),
63
+ );
64
+ await tester.pumpWidget(buildScreenshotApp(
65
+ device: device.device,
66
+ store: store,
67
+ home: const Home(),
68
+ themeMode: ThemeMode.dark,
69
+ ));
70
+ await tester.loadAssets();
71
+ await tester.pump();
72
+ await tester.expectScreenshot(device.device, "home_dark");
73
+ });
74
+
75
+ testGoldens("${device.name} - book select", (tester) async {
76
+ final store = Store<AppState>(initialState: AppState(bible: bible));
77
+ await tester.pumpWidget(buildScreenshotApp(
78
+ device: device.device,
79
+ store: store,
80
+ home: const Home(),
81
+ ));
82
+ await tester.pumpAndSettle();
83
+ await tester.tap(find.byKey(const Key("bookTitle")));
84
+ await tester.pumpAndSettle();
85
+ await tester.loadAssets();
86
+ await tester.pump();
87
+ await tester.expectScreenshot(device.device, "book_select");
88
+ });
89
+
90
+ testGoldens("${device.name} - chapter select", (tester) async {
91
+ final store = Store<AppState>(initialState: AppState(bible: bible));
92
+ await tester.pumpWidget(buildScreenshotApp(
93
+ device: device.device,
94
+ store: store,
95
+ home: const Home(),
96
+ ));
97
+ await tester.pumpAndSettle();
98
+ await tester.tap(find.byKey(const Key("chapterTitle")));
99
+ await tester.pumpAndSettle();
100
+ await tester.loadAssets();
101
+ await tester.pump();
102
+ await tester.expectScreenshot(device.device, "chapter_select");
103
+ });
104
+
105
+ testGoldens("${device.name} - verse select", (tester) async {
106
+ final verses = bible.books![0].chapters![0].verses!;
107
+ final store = Store<AppState>(
108
+ initialState: AppState(
109
+ bible: bible,
110
+ selectedVerses: [verses[0], verses[1], verses[2]],
111
+ highlights: {
112
+ "0:0:3": 0,
113
+ "0:0:4": 1,
114
+ "0:0:5": 2,
115
+ "0:0:6": 3,
116
+ },
117
+ ),
118
+ );
119
+ await tester.pumpWidget(buildScreenshotApp(
120
+ device: device.device,
121
+ store: store,
122
+ home: const Home(),
123
+ ));
124
+ await tester.loadAssets();
125
+ await tester.pump();
126
+ await tester.expectScreenshot(device.device, "verse_select");
127
+ });
128
+
129
+ testGoldens("${device.name} - settings", (tester) async {
130
+ final store = Store<AppState>(initialState: AppState(bible: bible));
131
+ await tester.pumpWidget(buildScreenshotApp(
132
+ device: device.device,
133
+ store: store,
134
+ home: const Home(),
135
+ ));
136
+ await tester.pumpAndSettle();
137
+ await tester.tap(find.byKey(const Key("settingsButton")));
138
+ await tester.pumpAndSettle();
139
+ await tester.loadAssets();
140
+ await tester.pump();
141
+ await tester.expectScreenshot(device.device, "settings");
142
+ });
143
+ }
144
+ }