~repos /only-bible-app

#kotlin#android#ios

git clone https://pyrossh.dev/repos/only-bible-app.git

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


b982c302 pyrossh

2 years ago
add privacy policy
README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Only Bible App
2
2
 
3
- The only bible app you will ever need. No ads, No in-app purchases, No unwanted menus, No images, No Additional downloads,
3
+ The only bible app you will ever need. No ads, No in-app purchases, No distractions.
4
4
  Optimized for reading and highlighting.
5
5
  Just the bibles which are freely available in the public domain.
6
6
  Verse by verse audio is also supported for some of the languages generated using Azure TTS.
@@ -72,7 +72,5 @@ Note:
72
72
 
73
73
  ## Todo
74
74
 
75
- 1. Add Sqlite for highlighting, notes, chapter verses
76
- 2. Custom Selection should show action bar instead of tooltip/popup menu
77
- 3. Figure out history
75
+ 1. Figure out history
78
- 4. Add more text options compact/loose, line spacing
76
+ 2. Add more text options compact/loose, line spacing
assets/privacy-policy.md ADDED
@@ -0,0 +1,76 @@
1
+ Peter John built the Only Bible App app as a Free app. This SERVICE is provided by Peter John at no cost and is intended
2
+ for use as is.
3
+
4
+ This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal
5
+ Information if anyone decided to use my Service.
6
+
7
+ If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The
8
+ Personal Information that I collect is used for providing and improving the Service. I will not use or share your
9
+ information with anyone except as described in this Privacy Policy.
10
+
11
+ The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at
12
+ Only Bible App unless otherwise defined in this Privacy Policy.
13
+
14
+ **Information Collection and Use**
15
+
16
+ For a better experience, while using our Service, I may require you to provide us with certain personally identifiable
17
+ information. The information that I request will be retained on your device and is not collected by me in any way.
18
+
19
+ The app does use third-party services that may collect information used to identify you.
20
+
21
+ Link to the privacy policy of third-party service providers used by the app
22
+
23
+ * [Google Play Services](https://www.google.com/policies/privacy/)
24
+ * [Firebase Crashlytics](https://firebase.google.com/support/privacy/)
25
+ * [Firebase Performance Monitoring](https://firebase.google.com/support/privacy/)
26
+
27
+ **Log Data**
28
+
29
+ I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (
30
+ through third-party products) on your phone called Log Data. This Log Data may include information such as your device
31
+ Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my
32
+ Service, the time and date of your use of the Service, and other statistics.
33
+
34
+ **Service Providers**
35
+
36
+ I may employ third-party companies and individuals due to the following reasons:
37
+
38
+ * To facilitate our Service;
39
+ * To provide the Service on our behalf;
40
+ * To perform Service-related services; or
41
+ * To assist us in analyzing how our Service is used.
42
+
43
+ I want to inform users of this Service that these third parties have access to their Personal Information. The reason is
44
+ to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information
45
+ for any other purpose.
46
+
47
+ **Security**
48
+
49
+ I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means
50
+ of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100%
51
+ secure and reliable, and I cannot guarantee its absolute security.
52
+
53
+ **Links to Other Sites**
54
+
55
+ This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site.
56
+ Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of
57
+ these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of
58
+ any third-party sites or services.
59
+
60
+ **Children’s Privacy**
61
+
62
+ These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information
63
+ from children under 13 years of age. In the case I discover that a child under 13 has provided me with personal
64
+ information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your
65
+ child has provided us with personal information, please contact me so that I will be able to do the necessary actions.
66
+
67
+ **Changes to This Privacy Policy**
68
+
69
+ I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any
70
+ changes. I will notify you of any changes by posting the new Privacy Policy on this page.
71
+
72
+ This policy is effective as of 2023-08-21
73
+
74
+ **Contact Us**
75
+
76
+ If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at pyros2097@gmail.com.
ios/Podfile.lock CHANGED
@@ -120,6 +120,8 @@ PODS:
120
120
  - shared_preferences_foundation (0.0.1):
121
121
  - Flutter
122
122
  - FlutterMacOS
123
+ - url_launcher_ios (0.0.1):
124
+ - Flutter
123
125
 
124
126
  DEPENDENCIES:
125
127
  - audio_session (from `.symlinks/plugins/audio_session/ios`)
@@ -134,6 +136,7 @@ DEPENDENCIES:
134
136
  - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
135
137
  - share_plus (from `.symlinks/plugins/share_plus/ios`)
136
138
  - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
139
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
137
140
 
138
141
  SPEC REPOS:
139
142
  trunk:
@@ -182,6 +185,8 @@ EXTERNAL SOURCES:
182
185
  :path: ".symlinks/plugins/share_plus/ios"
183
186
  shared_preferences_foundation:
184
187
  :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
188
+ url_launcher_ios:
189
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
185
190
 
186
191
  SPEC CHECKSUMS:
187
192
  audio_session: 4f3e461722055d21515cf3261b64c973c062f345
@@ -215,6 +220,7 @@ SPEC CHECKSUMS:
215
220
  PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265
216
221
  share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
217
222
  shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
223
+ url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
218
224
 
219
225
  PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
220
226
 
lib/main.dart CHANGED
@@ -1,5 +1,6 @@
1
1
  import "package:flutter/material.dart";
2
2
  import "package:flutter/foundation.dart";
3
+ import 'package:flutter_web_plugins/url_strategy.dart';
3
4
  import "package:firebase_core/firebase_core.dart";
4
5
  import "package:firebase_crashlytics/firebase_crashlytics.dart";
5
6
  import "package:only_bible_app/firebase_options.dart";
@@ -9,11 +10,13 @@ import "package:only_bible_app/providers/app_model.dart";
9
10
  import "package:provider/provider.dart";
10
11
 
11
12
  void main() async {
13
+ usePathUrlStrategy();
12
14
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
13
15
  await Firebase.initializeApp(
14
16
  options: DefaultFirebaseOptions.currentPlatform,
15
17
  );
16
18
  FlutterError.onError = (errorDetails) {
19
+ FlutterError.presentError(errorDetails);
17
20
  FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
18
21
  };
19
22
  PlatformDispatcher.instance.onError = (error, stack) {
lib/providers/app_model.dart CHANGED
@@ -4,6 +4,7 @@ import "package:flutter/material.dart";
4
4
  import "package:only_bible_app/screens/bible_select_screen.dart";
5
5
  import "package:only_bible_app/screens/book_select_screen.dart";
6
6
  import "package:only_bible_app/models.dart";
7
+ import "package:only_bible_app/screens/privacy_policy_screen.dart";
7
8
  import "package:only_bible_app/widgets/actions_sheet.dart";
8
9
  import "package:only_bible_app/widgets/highlight_button.dart";
9
10
  import "package:only_bible_app/widgets/note_sheet.dart";
@@ -98,6 +99,14 @@ class AppModel extends ChangeNotifier {
98
99
  );
99
100
  }
100
101
 
102
+ void showPrivacyPolicy(BuildContext context) {
103
+ Navigator.of(context).push(
104
+ createNoTransitionPageRoute(
105
+ const PrivacyPolicyScreen(),
106
+ ),
107
+ );
108
+ }
109
+
101
110
  updateCurrentBible(BuildContext context, int id) async {
102
111
  // TODO: maybe use a future as the bible needs to load
103
112
  bible = await loadBible(id);
lib/screens/privacy_policy_screen.dart ADDED
@@ -0,0 +1,34 @@
1
+ import "package:flutter/material.dart";
2
+ import "package:flutter_markdown/flutter_markdown.dart";
3
+ import "package:url_launcher/url_launcher.dart";
4
+
5
+ class PrivacyPolicyScreen extends StatelessWidget {
6
+ const PrivacyPolicyScreen({super.key});
7
+
8
+ @override
9
+ Widget build(BuildContext context) {
10
+ return Scaffold(
11
+ appBar: AppBar(
12
+ title: const Text("Privacy Policy"),
13
+ ),
14
+ body: SafeArea(
15
+ child: FutureBuilder(
16
+ future: DefaultAssetBundle.of(context).loadString("assets/privacy-policy.md"),
17
+ builder: (context, snapshot) {
18
+ if (snapshot.hasData) {
19
+ return Markdown(
20
+ data: snapshot.data!,
21
+ onTapLink: (text, href, title) {
22
+ launchUrl(Uri.parse(href!));
23
+ },
24
+ );
25
+ }
26
+ return const Center(
27
+ child: CircularProgressIndicator(),
28
+ );
29
+ },
30
+ ),
31
+ ),
32
+ );
33
+ }
34
+ }
lib/widgets/highlight_button.dart CHANGED
@@ -11,7 +11,7 @@ class HighlightButton extends StatelessWidget {
11
11
  return InkWell(
12
12
  onTap: () => onColorSelected(color),
13
13
  child: Container(
14
- padding: EdgeInsets.symmetric(horizontal: 10),
14
+ padding: const EdgeInsets.symmetric(horizontal: 10),
15
15
  decoration: BoxDecoration(
16
16
  color: color.withOpacity(1),
17
17
  shape: BoxShape.circle,
lib/widgets/settings_sheet.dart CHANGED
@@ -44,10 +44,7 @@ class SettingsSheet extends StatelessWidget {
44
44
  leading: const Icon(Icons.book_outlined, color: Colors.blueAccent),
45
45
  title: const Text("Bible"),
46
46
  value: Text(selectedBible.name),
47
- onPressed: (c) {
48
- app.changeBible(c);
47
+ onPressed: app.changeBible,
49
- return null;
50
- },
51
48
  ),
52
49
  SettingsTile.switchTile(
53
50
  onToggle: (value) {
@@ -83,6 +80,17 @@ class SettingsSheet extends StatelessWidget {
83
80
  ),
84
81
  ],
85
82
  ),
83
+ SettingsSection(
84
+ margin: const EdgeInsetsDirectional.symmetric(horizontal: 20, vertical: 20),
85
+ title: const Text("About"),
86
+ tiles: [
87
+ SettingsTile.navigation(
88
+ leading: const Icon(Icons.info_outline, color: Colors.grey),
89
+ title: const Text("Privacy Policy"),
90
+ onPressed: app.showPrivacyPolicy,
91
+ ),
92
+ ],
93
+ ),
86
94
  ],
87
95
  ),
88
96
  ),
macos/Flutter/GeneratedPluginRegistrant.swift CHANGED
@@ -13,6 +13,7 @@ import just_audio
13
13
  import path_provider_foundation
14
14
  import share_plus
15
15
  import shared_preferences_foundation
16
+ import url_launcher_macos
16
17
 
17
18
  func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
18
19
  AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
@@ -23,4 +24,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
23
24
  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
24
25
  SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
25
26
  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
27
+ UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
26
28
  }
pubspec.lock CHANGED
@@ -392,6 +392,14 @@ packages:
392
392
  description: flutter
393
393
  source: sdk
394
394
  version: "0.0.0"
395
+ flutter_markdown:
396
+ dependency: "direct main"
397
+ description:
398
+ name: flutter_markdown
399
+ sha256: "2b206d397dd7836ea60035b2d43825c8a303a76a5098e66f42d55a753e18d431"
400
+ url: "https://pub.dev"
401
+ source: hosted
402
+ version: "0.6.17+1"
395
403
  flutter_native_splash:
396
404
  dependency: "direct main"
397
405
  description:
@@ -580,6 +588,14 @@ packages:
580
588
  url: "https://pub.dev"
581
589
  source: hosted
582
590
  version: "1.2.0"
591
+ markdown:
592
+ dependency: transitive
593
+ description:
594
+ name: markdown
595
+ sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd
596
+ url: "https://pub.dev"
597
+ source: hosted
598
+ version: "7.1.1"
583
599
  matcher:
584
600
  dependency: transitive
585
601
  description:
@@ -953,6 +969,30 @@ packages:
953
969
  url: "https://pub.dev"
954
970
  source: hosted
955
971
  version: "2.2.2"
972
+ url_launcher:
973
+ dependency: "direct main"
974
+ description:
975
+ name: url_launcher
976
+ sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e"
977
+ url: "https://pub.dev"
978
+ source: hosted
979
+ version: "6.1.12"
980
+ url_launcher_android:
981
+ dependency: transitive
982
+ description:
983
+ name: url_launcher_android
984
+ sha256: "3dd2388cc0c42912eee04434531a26a82512b9cb1827e0214430c9bcbddfe025"
985
+ url: "https://pub.dev"
986
+ source: hosted
987
+ version: "6.0.38"
988
+ url_launcher_ios:
989
+ dependency: transitive
990
+ description:
991
+ name: url_launcher_ios
992
+ sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
993
+ url: "https://pub.dev"
994
+ source: hosted
995
+ version: "6.1.4"
956
996
  url_launcher_linux:
957
997
  dependency: transitive
958
998
  description:
@@ -961,6 +1001,14 @@ packages:
961
1001
  url: "https://pub.dev"
962
1002
  source: hosted
963
1003
  version: "3.0.5"
1004
+ url_launcher_macos:
1005
+ dependency: transitive
1006
+ description:
1007
+ name: url_launcher_macos
1008
+ sha256: "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1"
1009
+ url: "https://pub.dev"
1010
+ source: hosted
1011
+ version: "3.0.6"
964
1012
  url_launcher_platform_interface:
965
1013
  dependency: transitive
966
1014
  description:
@@ -1067,4 +1115,4 @@ packages:
1067
1115
  version: "3.1.2"
1068
1116
  sdks:
1069
1117
  dart: ">=3.0.6 <4.0.0"
1070
- flutter: ">=3.3.0"
1118
+ flutter: ">=3.10.0"
pubspec.yaml CHANGED
@@ -26,6 +26,8 @@ dependencies:
26
26
  settings_ui: ^2.0.2
27
27
  get_storage: ^2.1.1
28
28
  share_plus: ^7.1.0
29
+ flutter_markdown: ^0.6.17+1
30
+ url_launcher: ^6.1.12
29
31
 
30
32
  dev_dependencies:
31
33
  flutter_test:
@@ -42,6 +44,7 @@ flutter:
42
44
  assets:
43
45
  - assets/bibles/
44
46
  - assets/fonts/
47
+ - assets/privacy-policy.md
45
48
  fonts:
46
49
  - family: Roboto
47
50
  fonts: