Compare commits
198 commits
Author | SHA1 | Date | |
---|---|---|---|
|
e7ba5042ee | ||
|
4e436c70ce | ||
|
350da61d17 | ||
|
f6ab4c1e4e | ||
|
1b0d12eb65 | ||
|
f1244c4fbd | ||
|
62dda58723 | ||
|
03c04c94d1 | ||
|
91b81b1054 | ||
|
84dc016cb4 | ||
|
ca629c760d | ||
|
d11464883c | ||
|
244ee01e2b | ||
|
0a798516d1 | ||
|
311ed12770 | ||
|
10ed53b92f | ||
|
c536146abb | ||
|
691eebd416 | ||
|
e3a1961773 | ||
|
5210141b9c | ||
|
475146a8a0 | ||
|
0fd54cf17f | ||
|
57577d257d | ||
|
8ca3a493c6 | ||
|
b4ada90d22 | ||
|
043d5b3462 | ||
|
4e5134bdaf | ||
|
2128a7b9ae | ||
|
26d28e811f | ||
|
f8bfdcf52e | ||
|
94bd973730 | ||
|
75caab2976 | ||
|
59791dfb42 | ||
|
f5dd413a93 | ||
|
68dbecdbee | ||
|
6812279341 | ||
|
ae1a4847d0 | ||
|
3f4a9220d9 | ||
|
b9d329bd13 | ||
|
90ebc52537 | ||
|
3a42fb84ef | ||
|
01d67ec2a8 | ||
|
493bfd2d64 | ||
|
1575d7ec92 | ||
|
41de9c763e | ||
|
262459f1e1 | ||
|
04949d2bf9 | ||
|
c1c8a2171e | ||
|
7a6c4115f3 | ||
|
fe2833c41b | ||
|
bede343db9 | ||
|
f87717efb2 | ||
|
d4b42cb09a | ||
|
b4e42d1528 | ||
|
1291878921 | ||
|
f38b266dde | ||
|
525eb600a3 | ||
|
dd41e28c28 | ||
|
1830a78c54 | ||
|
d21f5d98b9 | ||
|
6f29f52a96 | ||
|
28e21f7de2 | ||
|
fd5517767b | ||
|
a7ba31fe45 | ||
|
01de9b31c9 | ||
|
9263e05a2d | ||
|
c3eece4717 | ||
|
92d355ae1c | ||
|
20e105c68f | ||
|
0e1661fe4b | ||
|
4112190dbc | ||
|
6aa3746f09 | ||
|
786528f52b | ||
|
1975b9a6f7 | ||
|
484004ce1f | ||
|
63ea056c2a | ||
|
438768d7b7 | ||
|
f2bde77358 | ||
|
570de3a8df | ||
|
0b7a624ba9 | ||
|
3363600ea9 | ||
|
521445c3e3 | ||
|
cf2cb349c9 | ||
|
d3d154ea54 | ||
|
df225cc67e | ||
|
53034c6077 | ||
|
7f4c827772 | ||
|
628ff95151 | ||
|
a6a73d21e9 | ||
|
598536896c | ||
|
f5f24ce3ff | ||
|
9be426a274 | ||
|
1929325572 | ||
|
fe1422a370 | ||
|
f9c5752fc9 | ||
|
5c6add7f3e | ||
|
07b99da79c | ||
|
0ae5f16abc | ||
|
e4b01640a4 | ||
|
30e322f471 | ||
|
8226ba0182 | ||
|
b84520df59 | ||
|
0ebd35c546 | ||
|
4069ba5f83 | ||
|
57dff9e531 | ||
|
031d4dc233 | ||
|
08702a4af2 | ||
|
87a4e8f0b9 | ||
|
88d68e97a1 | ||
|
2a60bdff50 | ||
|
893b3b51c2 | ||
|
e294228ab4 | ||
|
c357d5dc83 | ||
|
7cf23c7bfe | ||
|
9a66675a88 | ||
|
82cc280581 | ||
|
5fcc3c3f35 | ||
|
3400ee9ad1 | ||
|
7df60ec0ec | ||
|
2e270a4f6c | ||
|
691da18166 | ||
|
dcec1a9d6b | ||
|
2dd2d68c32 | ||
|
c2d7226901 | ||
|
4d3e5454e0 | ||
|
b96e5f4677 | ||
|
5feecd6a26 | ||
|
653d6b9768 | ||
|
d428b3f3cd | ||
|
06f0d7df5c | ||
|
d92fe2ea4d | ||
|
d880b20d2e | ||
|
cca6b7a126 | ||
|
d6584c16fe | ||
|
4868fabb6e | ||
|
d0c732696b | ||
|
74dc7800a6 | ||
|
1ec59afc77 | ||
|
6d4a9a572f | ||
|
6ddbe6eed6 | ||
|
0f570ad59c | ||
|
eab87349da | ||
|
a5f3cf76b0 | ||
|
48c6a8270f | ||
|
232eb95c4a | ||
|
ef0a0c03f1 | ||
|
c9fb13a263 | ||
|
950afe5a4d | ||
|
8b2f6c6e2c | ||
|
f2e4cb350d | ||
|
260fc4aeab | ||
|
14c8521916 | ||
|
f00e82c404 | ||
|
f1b933b7db | ||
|
7d9a4c66ed | ||
|
e09bb3db14 | ||
|
b73e328a8e | ||
|
ca474f8d09 | ||
|
a599033d17 | ||
|
c683dc64b5 | ||
|
7998580856 | ||
|
2212027339 | ||
|
8edcce5ebb | ||
|
461086e37f | ||
|
ff5c5f24ce | ||
|
c136ae59e8 | ||
|
96163b7416 | ||
|
edd85bb7f4 | ||
|
8e3e6130eb | ||
|
d3493402ca | ||
|
c4ca95c775 | ||
|
737b43d2c8 | ||
|
7a7e1b6daa | ||
|
9a821c39e9 | ||
|
3b0797c7a4 | ||
|
916e019870 | ||
|
b5cd91b2e9 | ||
|
f118b53e70 | ||
|
7cff0a2a61 | ||
|
eb55e432ae | ||
|
f3e4a77135 | ||
|
4d8225cf68 | ||
|
efd0a9209f | ||
|
7deedc5538 | ||
|
0c72daa831 | ||
|
6369ec6606 | ||
|
775b1be0de | ||
|
411fe1d86f | ||
|
d8236584ff | ||
|
bb84bf3c78 | ||
|
ccefa81b35 | ||
|
d77d70c447 | ||
|
4ece3a4004 | ||
|
d9b7f31e50 | ||
|
cff2f4e785 | ||
|
1630eb5976 | ||
|
53811093af | ||
|
2495cfb41e |
1
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
BIN
.github/images/Paypal-badge.png
vendored
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
BIN
.github/images/github-badge.png
vendored
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
BIN
.github/images/icon_round.png
vendored
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
.github/images/screenshot_0.png
vendored
Normal file
After Width: | Height: | Size: 586 KiB |
BIN
.github/images/screenshot_1.png
vendored
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
.github/images/screenshot_2.png
vendored
Normal file
After Width: | Height: | Size: 655 KiB |
BIN
.github/images/screenshot_3.png
vendored
Normal file
After Width: | Height: | Size: 634 KiB |
BIN
.github/images/screenshot_4.png
vendored
Normal file
After Width: | Height: | Size: 734 KiB |
BIN
.github/images/screenshot_5.png
vendored
Normal file
After Width: | Height: | Size: 647 KiB |
142
README.md
|
@ -1,31 +1,32 @@
|
|||
# Simple QR
|
||||
|
||||
<p align="center"><br><img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/icon_round.png" width="100" height="100" /></p>
|
||||
<p align="center">
|
||||
<img alt="Simple QR" src="./resources/icon.png" width="100px">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#about">About</a>
|
||||
• <a href="#features">Features</a>
|
||||
• <a href="#support-developer">Support Developer</a>
|
||||
|
||||
<strong>
|
||||
Simple QR
|
||||
</strong>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="#contribute">Contribute</a>
|
||||
• <a href="#framework">Framework</a>
|
||||
• <a href="#privacy-policy">Privacy Policy</a>
|
||||
• <a href="#license">License</a>
|
||||
Simple and lightweight app to scan, create and store QR codes
|
||||
</p>
|
||||
<br>
|
||||
<p align="center">
|
||||
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_1.png">
|
||||
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_2.png">
|
||||
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_3.png">
|
||||
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_4.png">
|
||||
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_5.png">
|
||||
</p>
|
||||
|
||||
## About
|
||||
|
||||
Simple QR is an app providing the simplest way to scan, create and store QR codes on your phone. No backend service connected. No data collected. No ads.
|
||||
Simple QR is an open-source app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
|
||||
It's available on the App Store, Google Play and IzzyOnDroid. You can also download the apk from <a href="https://github.com/tomfong/simple-qr/releases">release</a>.
|
||||
It's now available on the following platforms.
|
||||
|
||||
| App Store | Google Play | IzzyOnDroid |
|
||||
| Google Play | GitHub | IzzyOnDroid |
|
||||
|:-:|:-:|:-:|
|
||||
| [<img src="badges/appstore-badge.png" height="50">](https://apps.apple.com/us/app/simple-qr-by-tom-fong/id1621121553) | [<img src="badges/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=com.tomfong.simpleqr) | [<img src="badges/IzzyOnDroid.png" height="50">](https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr) |
|
||||
| [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=com.tomfong.simpleqr) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/github-badge.png" height="50">](https://github.com/tomfong/simple-qr/releases/latest) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/IzzyOnDroid-badge.png" height="50">](https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr) |
|
||||
|
||||
## Features
|
||||
|
||||
|
@ -35,52 +36,60 @@ By using the app, you can
|
|||
|
||||
2. Import image files and scan the QR Code on it.
|
||||
|
||||
3. Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi.
|
||||
3. Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email, Wi-Fi and Geolocation.
|
||||
|
||||
4. Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.
|
||||
|
||||
5. Do tasks on the result with a tap, including but not limited to
|
||||
5. Do tasks on the result content with a tap, including but not limited to
|
||||
* Use it as a keyword to do web search.
|
||||
* Quickly copy it to the clipboard.
|
||||
* Execute base64 encoding/decoding on it.
|
||||
* Generate a new shareable QR code by using it as the content.
|
||||
* Directly do special tasks, if it is a link, vCard contact, phone number, message or email.
|
||||
* Use it as a content to generate a new shareable QR code.
|
||||
* Do corresponding tasks if it is a
|
||||
* URL: Browse website / Open application
|
||||
* vCard contact: Add contact
|
||||
* Phone number: Phone call, add contact
|
||||
* Message: Send message, add contact
|
||||
* Email: Send email
|
||||
* Geolocation: Open map
|
||||
|
||||
6. Adjust the generated QR code, e.g. error correction level and screen brightness.
|
||||
6. Customize the generated QR code, e.g. error correction level, color, margin and screen brightness.
|
||||
|
||||
7. Customize the app, e.g. app initial page, language and color theme etc.
|
||||
|
||||
### Demo
|
||||
|
||||
[](https://www.youtube.com/watch?v=D57VveikN8U)
|
||||
[](https://www.youtube.com/watch?v=TIC6ZAkWoXY)
|
||||
|
||||
## Languages Supported
|
||||
### Languages Supported
|
||||
|
||||
* English (en)
|
||||
* Traditional Chinese 正體中文 (zh)
|
||||
* Simplified Chinese 简体中文 (zh-CN)
|
||||
* Chinese (Hong Kong) 中文 (香港) (zh-HK)
|
||||
* Chinese (Simplified) 简体中文 (zh-CN)
|
||||
* German Deutsch (de)
|
||||
* French Français (fr)
|
||||
* Italian Italiano (it)
|
||||
* Portuguese (Brazil) (pt-BR)
|
||||
* Russian Русский (ru)
|
||||
|
||||
You are welcomed to help translate the app into more languages (see <a href="#how-to-help-translate">section</a>)
|
||||
|
||||
## Support Developer
|
||||
|
||||
If you want to support me or my projects, please <a href="https://github.com/tomfong"><b>click me</b></a>😊
|
||||
You are welcomed to help translate the app into more languages (refer to this <a href="#how-to-help-translate">section</a>)
|
||||
|
||||
## Contribute
|
||||
|
||||
* Star and watch the project.
|
||||
* Sponsor the project.
|
||||
|
||||
[](https://github.com/sponsors/tomfong?frequency=one-time)
|
||||
[](https://www.buymeacoffee.com/tomfong)
|
||||
|
||||
* Star the project.
|
||||
|
||||
[](https://github.com/tomfong/simple-qr/stargazers)
|
||||
|
||||
* Open issues to report bugs or share any new ideas.
|
||||
|
||||
[](https://github.com/tomfong/simple-qr/issues)
|
||||
|
||||
* Translate the app into different languages.
|
||||
* Open issues for reporting bugs or any new ideas.
|
||||
|
||||
### Contributors
|
||||
|
||||
Thank you the following contributors who have made the app better!
|
||||
|
||||
| Name | GitHub | How? |
|
||||
|:-:|:-:|:-:|
|
||||
| mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | Translate the app into German |
|
||||
|
||||
### How to help translate?
|
||||
|
||||
|
@ -95,45 +104,36 @@ Thank you the following contributors who have made the app better!
|
|||
* <b>DO NOT</b> change the order.
|
||||
4. Email the JSON to me (tomfong.dev@gmail.com) after you finish.
|
||||
|
||||
## Build the project (Android)
|
||||
### Build the project
|
||||
|
||||
1. Run ```npm install``` to install all dependencies
|
||||
2. Run ```npm run sync``` and ```npm run copy:an```
|
||||
3. In ```android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml```, add ```android:exported="true"``` inside receiver tag.
|
||||
4. In ```android/capacitor-cordova-android-plugins/src/main/java/nl/xservices/plugins/SocialSharing.java```, change line 274 to
|
||||
1. Run ```npm install``` to install all dependencies.
|
||||
2. Run ```npm run build```
|
||||
|
||||
```java
|
||||
final PendingIntent pendingIntent = PendingIntent.getBroadcast(cordova.getActivity().getApplicationContext(), 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);
|
||||
```
|
||||
### Contributors
|
||||
|
||||
5. In ```android/app/src/main/res/values/styles.xml```, change
|
||||
Thank you the following contributors who have made the app better!
|
||||
|
||||
```xml
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
</style>
|
||||
```
|
||||
| Name | GitHub | How? |
|
||||
|:-:|:-:|:-:|
|
||||
| mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | German language translation |
|
||||
| Valentino Bocchetti | [luftmensch-luftmensch](https://github.com/luftmensch-luftmensch) | Italian language translation |
|
||||
| Smooth-E | [Smooth-E](https://github.com/Smooth-E) | Russian language translation |
|
||||
| Daniel Ribeiro | [drcsj](https://github.com/drcsj) | Portuguese (Brazil) language translation |
|
||||
|
||||
## Framework
|
||||
|
||||
```sh
|
||||
Ionic CLI : 6.19.0
|
||||
Ionic Framework : @ionic/angular 6.1.6
|
||||
@angular-devkit/build-angular : 13.3.6
|
||||
@angular-devkit/schematics : 13.3.6
|
||||
@angular/cli : 13.3.6
|
||||
@ionic/angular-toolkit : 6.1.0
|
||||
Ionic CLI : 7.2.0
|
||||
Ionic Framework : @ionic/angular 7.8.2
|
||||
@angular-devkit/build-angular : 16.2.13
|
||||
@angular-devkit/schematics : 16.2.13
|
||||
@angular/cli : 16.2.13
|
||||
@ionic/angular-toolkit : 9.0.0
|
||||
|
||||
Capacitor CLI : 3.5.1
|
||||
@capacitor/android : 3.5.1
|
||||
@capacitor/core : 3.5.1
|
||||
@capacitor/ios : 3.5.1
|
||||
|
||||
Cordova CLI : 10.0.0
|
||||
|
||||
Android SDK Tools : 26.1.1
|
||||
NodeJS : v16.15.4
|
||||
npm : 8.8.0
|
||||
Capacitor CLI : 5.7.4
|
||||
@capacitor/android : 5.7.4
|
||||
@capacitor/core : 5.7.4
|
||||
@capacitor/ios : 5.7.4
|
||||
```
|
||||
|
||||
## Privacy Policy
|
||||
|
@ -142,4 +142,4 @@ Please read the [Privacy Policy](https://www.privacypolicies.com/live/771b1123-9
|
|||
|
||||
## License
|
||||
|
||||
Please view the [LICENSE](LICENSE)
|
||||
[](https://github.com/tomfong/simple-qr/blob/main/LICENSE)
|
||||
|
|
2
android/.idea/compiler.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="11" />
|
||||
<bytecodeTargetLevel target="17" />
|
||||
</component>
|
||||
</project>
|
13
android/.idea/misc.xml
generated
|
@ -1,6 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<component name="DesignSurface">
|
||||
<option name="filePathToZoomLevelMap">
|
||||
<map>
|
||||
<entry key="app/src/main/res/drawable/ic_baseline_qr_code_24.xml" value="0.2485" />
|
||||
<entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.2485" />
|
||||
<entry key="app/src/main/res/drawable/splash_background.xml" value="0.2485" />
|
||||
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.2485" />
|
||||
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.2485" />
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
namespace "com.tomfong.simpleqr"
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
defaultConfig {
|
||||
applicationId "com.tomfong.simpleqr"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2060400
|
||||
versionName "2.6.4"
|
||||
versionCode 4010000
|
||||
versionName "4.1.0"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
aaptOptions {
|
||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||
|
@ -30,6 +31,8 @@ repositories {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
|
||||
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
|
||||
implementation project(':capacitor-android')
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
android {
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,7 @@ dependencies {
|
|||
implementation project(':capacitor-filesystem')
|
||||
implementation project(':capacitor-haptics')
|
||||
implementation project(':capacitor-keyboard')
|
||||
implementation project(':capacitor-preferences')
|
||||
implementation project(':capacitor-splash-screen')
|
||||
implementation project(':capacitor-status-bar')
|
||||
implementation project(':capacitor-toast')
|
||||
|
|
20
android/app/release/output-metadata.json
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"version": 3,
|
||||
"artifactType": {
|
||||
"type": "APK",
|
||||
"kind": "Directory"
|
||||
},
|
||||
"applicationId": "com.tomfong.simpleqr",
|
||||
"variantName": "release",
|
||||
"elements": [
|
||||
{
|
||||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"attributes": [],
|
||||
"versionCode": 4010000,
|
||||
"versionName": "4.1.0",
|
||||
"outputFile": "app-release.apk"
|
||||
}
|
||||
],
|
||||
"elementType": "File"
|
||||
}
|
|
@ -1,7 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.tomfong.simpleqr">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >
|
||||
|
||||
<application android:hardwareAccelerated="true" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:requestLegacyExternalStorage="true" android:largeHeap="true">
|
||||
<application
|
||||
android:hardwareAccelerated="true"
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:largeHeap="true">
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:name="com.tomfong.simpleqr.MainActivity" android:label="@string/title_activity_main" android:theme="@style/AppTheme.NoActionBarLaunch" android:launchMode="singleTask" android:exported="true">
|
||||
|
||||
|
@ -15,13 +24,29 @@
|
|||
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
|
||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
|
||||
</provider>
|
||||
|
||||
<service
|
||||
android:name=".MyQSTileService"
|
||||
android:label="@string/app_name"
|
||||
android:icon="@drawable/ic_baseline_qr_code_24"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
</application>
|
||||
|
||||
<!-- Permissions -->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera"
|
||||
android:required="true" />
|
||||
</manifest>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
},
|
||||
{
|
||||
"pkg": "@capacitor-community/contacts",
|
||||
"classpath": "ch.byrds.capacitor.contacts.Contacts"
|
||||
"classpath": "getcapacitor.community.contacts.ContactsPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor-community/screen-brightness",
|
||||
|
@ -39,6 +39,10 @@
|
|||
"pkg": "@capacitor/keyboard",
|
||||
"classpath": "com.capacitorjs.plugins.keyboard.KeyboardPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/preferences",
|
||||
"classpath": "com.capacitorjs.plugins.preferences.PreferencesPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/splash-screen",
|
||||
"classpath": "com.capacitorjs.plugins.splashscreen.SplashScreenPlugin"
|
||||
|
|
|
@ -2,4 +2,20 @@ package com.tomfong.simpleqr;
|
|||
|
||||
import com.getcapacitor.BridgeActivity;
|
||||
|
||||
public class MainActivity extends BridgeActivity {}
|
||||
public class MainActivity extends BridgeActivity {
|
||||
|
||||
static boolean active = false;
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
active = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
active = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
package com.tomfong.simpleqr;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.service.quicksettings.Tile;
|
||||
import android.service.quicksettings.TileService;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.N)
|
||||
public class MyQSTileService extends TileService {
|
||||
|
||||
public MyQSTileService() {}
|
||||
|
||||
// Called when the user adds your tile.
|
||||
@Override
|
||||
public void onTileAdded() {
|
||||
super.onTileAdded();
|
||||
Log.println(Log.INFO,"MyQSTileService","onTileAdded");
|
||||
}
|
||||
|
||||
// Called when your app can update your tile.
|
||||
@Override
|
||||
public void onStartListening() {
|
||||
super.onStartListening();
|
||||
Log.println(Log.INFO,"MyQSTileService","onStartListening");
|
||||
Tile tile = this.getQsTile();
|
||||
if (MainActivity.active) {
|
||||
tile.setState(Tile.STATE_ACTIVE);
|
||||
} else {
|
||||
tile.setState(Tile.STATE_INACTIVE);
|
||||
}
|
||||
tile.updateTile();
|
||||
}
|
||||
|
||||
// Called when your app can no longer update your tile.
|
||||
@Override
|
||||
public void onStopListening() {
|
||||
super.onStopListening();
|
||||
Log.println(Log.INFO,"MyQSTileService","onStopListening");
|
||||
}
|
||||
|
||||
// Called when the user taps on your tile in an active or inactive state.
|
||||
@Override
|
||||
public void onClick() {
|
||||
super.onClick();
|
||||
Log.println(Log.INFO,"MyQSTileService","onClick");
|
||||
Tile tile = this.getQsTile();
|
||||
Intent intent = new Intent(this.getApplicationContext(), MainActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivityAndCollapse(intent);
|
||||
tile.setState(Tile.STATE_ACTIVE);
|
||||
tile.updateTile();
|
||||
}
|
||||
|
||||
// Called when the user removes your tile.
|
||||
@Override
|
||||
public void onTileRemoved() {
|
||||
super.onTileRemoved();
|
||||
Log.println(Log.INFO,"MyQSTileService","onTileRemoved");
|
||||
}
|
||||
}
|
15
android/app/src/main/res/drawable/ic_baseline_qr_code_24.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<vector android:height="24dp" android:tint="#000000"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M3,11h8V3H3V11zM5,5h4v4H5V5z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M3,21h8v-8H3V21zM5,15h4v4H5V15z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M13,3v8h8V3H13zM19,9h-4V5h4V9z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M19,19h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M13,13h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M15,15h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M13,17h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M15,19h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M17,17h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M17,13h2v2h-2z"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M19,15h2v2h-2z"/>
|
||||
</vector>
|
5
android/app/src/main/res/drawable/splash_background.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@color/colorPrimary"/>
|
||||
<item android:gravity="center" android:drawable="@drawable/splash"/>
|
||||
</layer-list>
|
6
android/app/src/main/res/values-ru/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
7
android/app/src/main/res/values-ru/strings.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="app_name">Simple QR</string>
|
||||
<string name="title_activity_main">Simple QR</string>
|
||||
<string name="package_name">com.tomfong.simpleqr</string>
|
||||
<string name="custom_url_scheme">com.tomfong.simpleqr</string>
|
||||
</resources>
|
22
android/app/src/main/res/values-ru/styles.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
6
android/app/src/main/res/values-zh-rCN/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
|
@ -9,14 +9,14 @@
|
|||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
6
android/app/src/main/res/values-zh-rSG/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
|
@ -9,14 +9,14 @@
|
|||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
6
android/app/src/main/res/values-zh-rTW/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
|
@ -9,14 +9,14 @@
|
|||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
6
android/app/src/main/res/values-zh/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
|
@ -9,14 +9,14 @@
|
|||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
</style>
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
6
android/app/src/main/res/values/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
|
@ -9,14 +9,14 @@
|
|||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
|
||||
<item name="android:background">#00a5aa</item>
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
|
@ -4,11 +4,11 @@ buildscript {
|
|||
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath 'com.google.gms:google-services:4.3.5'
|
||||
classpath 'com.android.tools.build:gradle:8.0.2'
|
||||
classpath 'com.google.gms:google-services:4.3.15'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
@ -20,10 +20,11 @@ apply from: "variables.gradle"
|
|||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,9 @@ project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/
|
|||
include ':capacitor-keyboard'
|
||||
project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android')
|
||||
|
||||
include ':capacitor-preferences'
|
||||
project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android')
|
||||
|
||||
include ':capacitor-splash-screen'
|
||||
project(':capacitor-splash-screen').projectDir = new File('../node_modules/@capacitor/splash-screen/android')
|
||||
|
||||
|
|
|
@ -20,5 +20,4 @@ org.gradle.jvmargs=-Xmx1536m
|
|||
# Android operating system, and which are packaged with your app's APK
|
||||
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||
android.useAndroidX=true
|
||||
# Automatically convert third-party libraries to use AndroidX
|
||||
android.enableJetifier=true
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
ext {
|
||||
minSdkVersion = 23
|
||||
compileSdkVersion = 31
|
||||
targetSdkVersion = 31
|
||||
androidxActivityVersion = '1.2.0'
|
||||
androidxAppCompatVersion = '1.2.0'
|
||||
androidxCoordinatorLayoutVersion = '1.1.0'
|
||||
androidxCoreVersion = '1.3.2'
|
||||
androidxFragmentVersion = '1.3.0'
|
||||
junitVersion = '4.13.1'
|
||||
androidxJunitVersion = '1.1.2'
|
||||
androidxEspressoCoreVersion = '3.3.0'
|
||||
cordovaAndroidVersion = '7.0.0'
|
||||
minSdkVersion = 22
|
||||
compileSdkVersion = 33
|
||||
targetSdkVersion = 33
|
||||
androidxActivityVersion = '1.7.0'
|
||||
androidxAppCompatVersion = '1.6.1'
|
||||
androidxCoordinatorLayoutVersion = '1.2.0'
|
||||
androidxCoreVersion = '1.10.0'
|
||||
androidxFragmentVersion = '1.5.6'
|
||||
junitVersion = '4.13.2'
|
||||
androidxJunitVersion = '1.1.5'
|
||||
androidxEspressoCoreVersion = '3.5.1'
|
||||
cordovaAndroidVersion = '10.1.1'
|
||||
coreSplashScreenVersion = '1.0.0'
|
||||
androidxWebkitVersion = '1.6.1'
|
||||
}
|
||||
|
|
38
angular.json
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"defaultProject": "app",
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"app": {
|
||||
|
@ -31,7 +30,10 @@
|
|||
"output": "./svg"
|
||||
}
|
||||
],
|
||||
"styles": ["src/theme/variables.scss", "src/global.scss"],
|
||||
"styles": [
|
||||
"src/theme/variables.scss",
|
||||
"src/global.scss"
|
||||
],
|
||||
"scripts": [],
|
||||
"aot": false,
|
||||
"vendorChunk": true,
|
||||
|
@ -80,8 +82,7 @@
|
|||
"production": {
|
||||
"browserTarget": "app:build:production"
|
||||
},
|
||||
"ci": {
|
||||
}
|
||||
"ci": {}
|
||||
}
|
||||
},
|
||||
"extract-i18n": {
|
||||
|
@ -133,36 +134,15 @@
|
|||
"devServerTarget": "app:serve:ci"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ionic-cordova-build": {
|
||||
"builder": "@ionic/angular-toolkit:cordova-build",
|
||||
"options": {
|
||||
"browserTarget": "app:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "app:build:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ionic-cordova-serve": {
|
||||
"builder": "@ionic/angular-toolkit:cordova-serve",
|
||||
"options": {
|
||||
"cordovaBuildTarget": "app:ionic-cordova-build",
|
||||
"devServerTarget": "app:serve"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"cordovaBuildTarget": "app:ionic-cordova-build:production",
|
||||
"devServerTarget": "app:serve:production"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cli": {
|
||||
"defaultCollection": "@ionic/angular-toolkit"
|
||||
"schematicCollections": [
|
||||
"@ionic/angular-toolkit"
|
||||
],
|
||||
"analytics": false
|
||||
},
|
||||
"schematics": {
|
||||
"@ionic/angular-toolkit:component": {
|
||||
|
|
|
@ -1,18 +1,24 @@
|
|||
<i>Simple QR</i> ist eine FOSS-App, die die einfachste Möglichkeit zum Scannen, Erstellen und Speichern von QR-Codes bietet. Kein Back-End-Dienst verbunden. Keine Daten gesammelt. Keine Werbung.
|
||||
<i>Simple QR</i> ist eine FOSS-App zum Scannen, Erstellen und Speichern von QR-Codes mit einer einfachen Benutzeroberfläche und Erfahrung. Kein Back-End-Dienst verbunden. Keine Daten gesammelt. Keine Werbung.
|
||||
|
||||
Englisch, Französisch, Deutsch, traditionelles Chinesisch und vereinfachtes Chinesisch werden unterstützt.
|
||||
Englisch, Französisch, Deutsch, Italienisch, traditionelles Chinesisch und vereinfachtes Chinesisch werden unterstützt.
|
||||
|
||||
Mit der App ist das möglich
|
||||
|
||||
* QR-Code und andere Barcodes in Sekundenschnelle zu scannen, einschließlich UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode und GS1 DataBar.
|
||||
* Bilddateien zu importieren und den darauf befindlichen QR-Code zu scannen.
|
||||
* QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, E-Mail und WLAN enthalten, zu erstellen.
|
||||
* QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, Geolokalisierung, E-Mail und WLAN enthalten, zu erstellen.
|
||||
* Gescannte Ergebnissen, die gescannt wurden, erstellt oder erneut angezeigt wurden zu protokollieren. Diese protokollierten Aufzeichnungen können für schnellen Zugriff mit einem Lesezeichen versehen und auch gesichert werden.
|
||||
* Aufgaben auf dem Ergebnis mit einem Fingertipp zu erledigen, einschließlich, aber nicht beschränkt auf
|
||||
* Verwenden als Schlüsselwort für die Websuche.
|
||||
* Kopieren in die Zwischenablage.
|
||||
* base64-Codierung/Decodierung darauf ausführen.
|
||||
* Einen neuen teilbaren QR-Codegenerieren.
|
||||
* Direkt spezielle Aufgaben erledigen, wenn es sich um einen Link, einen vCard-Kontakt, eine Telefonnummer, eine Nachricht oder eine E-Mail handelt.
|
||||
* Den generierten QR-Code anzupassen, z.B. Fehlerkorrekturstufe und Bildschirmhelligkeit.
|
||||
* Führen Sie entsprechende Aufgaben aus, wenn es sich um a handelt
|
||||
* URL: Website durchsuchen
|
||||
* vCard-Kontakt: Kontakt hinzufügen
|
||||
* Telefonnummer: Telefonanruf, Kontakt hinzufügen
|
||||
* Nachricht: Nachricht senden, Kontakt hinzufügen
|
||||
* E-Mail: E-Mail senden
|
||||
* Geolokalisierung: Karte öffnen
|
||||
* Passen Sie den generierten QR-Code an, z. Fehlerkorrekturstufe, Farbe, Rand und Bildschirmhelligkeit.
|
||||
* Die App anzupassen, z.B. App-Startseite, Sprache und Farbthema etc.
|
||||
|
|
|
@ -1 +1 @@
|
|||
FOSS-App, die die einfachste Möglichkeit bietet, QR-Codes zu scannen, zu erstellen und zu speichern.
|
||||
QR-Codes mit einer einfachen Benutzeroberfläche scannen, erstellen und speichern
|
||||
|
|
5
fastlane/metadata/android/en-US/changelogs/2070000.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
* More QR code customization settings, including color, background color and margin.
|
||||
* Limit the maximum number of records that can be stored (30, 50, 100 or unlimited).
|
||||
* Support Itanlian language.
|
||||
* Update UI.
|
||||
* Improve performance and fix known bugs.
|
4
fastlane/metadata/android/en-US/changelogs/3000000.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
* Upgraded framework, improved performance and fixed known bugs.
|
||||
* Support quick access tile in the Quick Settings panel.
|
||||
* More customizable UI.
|
||||
* Removed Read/Write Contacts permission.
|
1
fastlane/metadata/android/en-US/changelogs/3000100.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Bug fix
|
3
fastlane/metadata/android/en-US/changelogs/3010000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support Ecosia
|
||||
* Support CSV export
|
||||
* Bug fix
|
2
fastlane/metadata/android/en-US/changelogs/3020000.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
* Support Open Food Facts
|
||||
* Bug fix
|
3
fastlane/metadata/android/en-US/changelogs/3030000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support Russian language
|
||||
* Allow user to manually save a record if auto logging is off
|
||||
* Minor update on UI
|
4
fastlane/metadata/android/en-US/changelogs/4000000.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
* Upgrade framework, improve performance and fix known bugs
|
||||
* Support Brave Search
|
||||
* Support open URL automatically
|
||||
* Allow user to further edit QR code content
|
1
fastlane/metadata/android/en-US/changelogs/4000100.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fix import image issue
|
3
fastlane/metadata/android/en-US/changelogs/4010000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support geolocation QR code
|
||||
* Support Portuguese (Brazil) language
|
||||
* Disable auto URL opening by default
|
|
@ -1,18 +1,24 @@
|
|||
<i>Simple QR</i> is a FOSS app providing the simplest way to scan, create and store QR code. No backend service connected. No data collected. No ads.
|
||||
<i>Simple QR</i> is an open-source app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
|
||||
English, French, German, Traditional Chinese and Simplified Chinese are supported.
|
||||
English, French, German, Itanlian, Russian, Traditional Chinese and Simplified Chinese are supported.
|
||||
|
||||
By using the app, you can:
|
||||
|
||||
* Scan QR Code and other barcodes in a second, including UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode and GS1 DataBar.
|
||||
* Import image files and scan the QR Code on it.
|
||||
* Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi.
|
||||
* Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email, Wi-Fi and Geolocation.
|
||||
* Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.
|
||||
* Do tasks on the result with a tap, including but not limited to
|
||||
* Use it as a keyword to do web search.
|
||||
* Quickly copy it to the clipboard.
|
||||
* Execute base64 encoding/decoding on it.
|
||||
* Generate a new shareable QR code by using it as the content.
|
||||
* Directly do special tasks, if it is a link, vCard contact, phone number, message or email.
|
||||
* Adjust the generated QR code, e.g. error correction level and screen brightness.
|
||||
* Do corresponding tasks if it is a
|
||||
* URL: Browse website / Open application
|
||||
* vCard contact: Add contact
|
||||
* Phone number: Phone call, add contact
|
||||
* Message: Send message, add contact
|
||||
* Email: Send email
|
||||
* Geolocation: Open map
|
||||
* Customize the generated QR code, e.g. error correction level, color, margin and screen brightness.
|
||||
* Customize the app, e.g. app initial page, language and color theme etc.
|
||||
|
|
|
@ -1 +1 @@
|
|||
FOSS app that provides the simplest way to scan, create and store QR code.
|
||||
Scan, create and store QR codes with a simple UI and experience
|
||||
|
|
1
fastlane/metadata/android/en-US/title.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Simple QR
|
2
ios/.gitignore
vendored
|
@ -1,9 +1,9 @@
|
|||
App/build
|
||||
App/Pods
|
||||
App/Podfile.lock
|
||||
App/App/public
|
||||
DerivedData
|
||||
xcuserdata
|
||||
|
||||
# Cordova plugins for Capacitor
|
||||
capacitor-cordova-ios-plugins
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1B75189429375EAB00800D38 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; };
|
||||
50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = "<group>"; };
|
||||
504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
|
@ -40,6 +41,9 @@
|
|||
D208D0BE281849AA006217ED /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
D208D0BF281849AD006217ED /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
D208D0C0281849AE006217ED /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
D26FE7F9283D1E6C002A61AE /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D26FE7FA283D1E76002A61AE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D29D2E2A2847C31D00566DFF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
|
@ -154,6 +158,10 @@
|
|||
"zh-HK",
|
||||
"zh-Hant",
|
||||
"zh-Hans",
|
||||
de,
|
||||
fr,
|
||||
it,
|
||||
ru,
|
||||
);
|
||||
mainGroup = 504EC2FB1FED79650016851F;
|
||||
productRefGroup = 504EC3051FED79650016851F /* Products */;
|
||||
|
@ -259,6 +267,10 @@
|
|||
D208D0BE281849AA006217ED /* zh-HK */,
|
||||
D208D0BF281849AD006217ED /* zh-Hant */,
|
||||
D208D0C0281849AE006217ED /* zh-Hans */,
|
||||
D26FE7F9283D1E6C002A61AE /* fr */,
|
||||
D26FE7FA283D1E76002A61AE /* de */,
|
||||
D29D2E2A2847C31D00566DFF /* it */,
|
||||
1B75189429375EAB00800D38 /* ru */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
|
@ -315,7 +327,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
|
@ -367,7 +379,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
|
@ -385,9 +397,9 @@
|
|||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = G23992CVBU;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 2.6.4;
|
||||
MARKETING_VERSION = 4.1.0;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -408,9 +420,9 @@
|
|||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = G23992CVBU;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 2.6.4;
|
||||
MARKETING_VERSION = 4.1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "Simple QR";
|
||||
|
|
|
@ -46,15 +46,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
|
||||
}
|
||||
|
||||
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
super.touchesBegan(touches, with: event)
|
||||
|
||||
let statusBarRect = UIApplication.shared.statusBarFrame
|
||||
guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return }
|
||||
|
||||
if statusBarRect.contains(touchPoint) {
|
||||
NotificationCenter.default.post(name: .capacitorStatusBarTapped, object: nil)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Before Width: | Height: | Size: 588 B |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 743 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 2.7 KiB |
|
@ -1,116 +1,14 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"scale" : "1x"
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
|
@ -22,11 +22,6 @@
|
|||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>Simple QR uses Camera to scan barcodes</string>
|
||||
<key>NSContactsUsageDescription</key>
|
||||
|
|
6
ios/App/App/it.lproj/InfoPlist.strings
Normal file
|
@ -0,0 +1,6 @@
|
|||
"CFBundleDisplayName" = "Simple QR";
|
||||
"CFBundleName" = "Simple QR";
|
||||
"NSCameraUsageDescription" = "Simple QR utilizza la fotocamera per scansionare codici QR e codici a barre";
|
||||
"NSContactsUsageDescription" = "Simple QR utilizza Contatti per aggiungere contatti";
|
||||
"NSPhotoLibraryAddUsageDescription" = "Simple QR utilizza Photo Library per salvare l'immagine del codice QR";
|
||||
"NSPhotoLibraryUsageDescription" = "Simple QR utilizza Photo Library per importare immagini e scansionare il codice QR";
|
6
ios/App/App/ru.lproj/InfoPlist.strings
Normal file
|
@ -0,0 +1,6 @@
|
|||
"CFBundleDisplayName" = "Simple QR";
|
||||
"CFBundleName" = "Simple QR";
|
||||
"NSCameraUsageDescription" = "Simple QR использует камеру для сканирования QR-кода и штрих-кодов";
|
||||
"NSContactsUsageDescription" = "Simple QR использует Контакты для добавления контакта";
|
||||
"NSPhotoLibraryAddUsageDescription" = "Simple QR использует библиотеку фотографий для сохранения изображения QR-кода";
|
||||
"NSPhotoLibraryUsageDescription" = "Simple QR использует библиотеку фотографий для импорта изображений и сканирования QR-кода.";
|
|
@ -1,4 +1,6 @@
|
|||
platform :ios, '12.0'
|
||||
require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
|
||||
|
||||
platform :ios, '13.0'
|
||||
use_frameworks!
|
||||
|
||||
# workaround to avoid Xcode caching of Pods that requires
|
||||
|
@ -19,6 +21,7 @@ def capacitor_pods
|
|||
pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem'
|
||||
pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
|
||||
pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
|
||||
pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences'
|
||||
pod 'CapacitorSplashScreen', :path => '../../node_modules/@capacitor/splash-screen'
|
||||
pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
|
||||
pod 'CapacitorToast', :path => '../../node_modules/@capacitor/toast'
|
||||
|
@ -29,3 +32,8 @@ target 'App' do
|
|||
capacitor_pods
|
||||
# Add your Pods here
|
||||
end
|
||||
|
||||
|
||||
post_install do |installer|
|
||||
assertDeploymentTarget(installer)
|
||||
end
|
||||
|
|
112
ios/App/Podfile.lock
Normal file
|
@ -0,0 +1,112 @@
|
|||
PODS:
|
||||
- Capacitor (5.7.4):
|
||||
- CapacitorCordova
|
||||
- CapacitorApp (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorCamera (5.0.9):
|
||||
- Capacitor
|
||||
- CapacitorClipboard (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorCommunityBarcodeScanner (4.0.1):
|
||||
- Capacitor
|
||||
- CapacitorCommunityContacts (5.0.5):
|
||||
- Capacitor
|
||||
- CapacitorCommunityScreenBrightness (5.0.0):
|
||||
- Capacitor
|
||||
- CapacitorCordova (5.7.4)
|
||||
- CapacitorDevice (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorFilesystem (5.2.1):
|
||||
- Capacitor
|
||||
- CapacitorHaptics (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorKeyboard (5.0.8):
|
||||
- Capacitor
|
||||
- CapacitorPreferences (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorSplashScreen (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorStatusBar (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorToast (5.0.7):
|
||||
- Capacitor
|
||||
- CordovaPlugins (5.7.4):
|
||||
- CapacitorCordova
|
||||
|
||||
DEPENDENCIES:
|
||||
- "Capacitor (from `../../node_modules/@capacitor/ios`)"
|
||||
- "CapacitorApp (from `../../node_modules/@capacitor/app`)"
|
||||
- "CapacitorCamera (from `../../node_modules/@capacitor/camera`)"
|
||||
- "CapacitorClipboard (from `../../node_modules/@capacitor/clipboard`)"
|
||||
- "CapacitorCommunityBarcodeScanner (from `../../node_modules/@capacitor-community/barcode-scanner`)"
|
||||
- "CapacitorCommunityContacts (from `../../node_modules/@capacitor-community/contacts`)"
|
||||
- "CapacitorCommunityScreenBrightness (from `../../node_modules/@capacitor-community/screen-brightness`)"
|
||||
- "CapacitorCordova (from `../../node_modules/@capacitor/ios`)"
|
||||
- "CapacitorDevice (from `../../node_modules/@capacitor/device`)"
|
||||
- "CapacitorFilesystem (from `../../node_modules/@capacitor/filesystem`)"
|
||||
- "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)"
|
||||
- "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)"
|
||||
- "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)"
|
||||
- "CapacitorSplashScreen (from `../../node_modules/@capacitor/splash-screen`)"
|
||||
- "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)"
|
||||
- "CapacitorToast (from `../../node_modules/@capacitor/toast`)"
|
||||
- CordovaPlugins (from `../capacitor-cordova-ios-plugins`)
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
Capacitor:
|
||||
:path: "../../node_modules/@capacitor/ios"
|
||||
CapacitorApp:
|
||||
:path: "../../node_modules/@capacitor/app"
|
||||
CapacitorCamera:
|
||||
:path: "../../node_modules/@capacitor/camera"
|
||||
CapacitorClipboard:
|
||||
:path: "../../node_modules/@capacitor/clipboard"
|
||||
CapacitorCommunityBarcodeScanner:
|
||||
:path: "../../node_modules/@capacitor-community/barcode-scanner"
|
||||
CapacitorCommunityContacts:
|
||||
:path: "../../node_modules/@capacitor-community/contacts"
|
||||
CapacitorCommunityScreenBrightness:
|
||||
:path: "../../node_modules/@capacitor-community/screen-brightness"
|
||||
CapacitorCordova:
|
||||
:path: "../../node_modules/@capacitor/ios"
|
||||
CapacitorDevice:
|
||||
:path: "../../node_modules/@capacitor/device"
|
||||
CapacitorFilesystem:
|
||||
:path: "../../node_modules/@capacitor/filesystem"
|
||||
CapacitorHaptics:
|
||||
:path: "../../node_modules/@capacitor/haptics"
|
||||
CapacitorKeyboard:
|
||||
:path: "../../node_modules/@capacitor/keyboard"
|
||||
CapacitorPreferences:
|
||||
:path: "../../node_modules/@capacitor/preferences"
|
||||
CapacitorSplashScreen:
|
||||
:path: "../../node_modules/@capacitor/splash-screen"
|
||||
CapacitorStatusBar:
|
||||
:path: "../../node_modules/@capacitor/status-bar"
|
||||
CapacitorToast:
|
||||
:path: "../../node_modules/@capacitor/toast"
|
||||
CordovaPlugins:
|
||||
:path: "../capacitor-cordova-ios-plugins"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Capacitor: 4fe9adf012caceb4c71ffea2f1f4d005cdcbeea7
|
||||
CapacitorApp: 17fecd0e6cb23feafac7eb0939417389038b0979
|
||||
CapacitorCamera: 4892c5c392f60039d853dde78bc50ba19fbd113e
|
||||
CapacitorClipboard: 45e5e25f2271f98712985d422776cdc5a779cca1
|
||||
CapacitorCommunityBarcodeScanner: 7feb206489c8555a8ca0c74c57ddf49ead774eb8
|
||||
CapacitorCommunityContacts: e8fbc4d669c9478a29f1e104818b4c16e158b2e0
|
||||
CapacitorCommunityScreenBrightness: b2d9c6fffee6b684994cd69f727f2090e2f05c6d
|
||||
CapacitorCordova: a6e87fccc0307dee7aec1560ec9398485f2b0ce7
|
||||
CapacitorDevice: fc91bdb484dc0e70755e9b621cd557afe642613a
|
||||
CapacitorFilesystem: 9f3e3c7fea2fff12f46dd5b07a2914f2103e4cfc
|
||||
CapacitorHaptics: 7c7c206f0c96a628fed073830c96d28c4b2e772e
|
||||
CapacitorKeyboard: aec619a578235c6ce279075009a2689c2cf5c42c
|
||||
CapacitorPreferences: 77ac427e98db83bace772455f8ba447430382c4c
|
||||
CapacitorSplashScreen: dd3de3f3644710fa2a697cfb91ec262eece4d242
|
||||
CapacitorStatusBar: f390fbb49b82ffb754ea4b3cf71dc8b048baf3e7
|
||||
CapacitorToast: c8bb89eeb59a23c1fc298f138cc06c8ff4d90ac1
|
||||
CordovaPlugins: 5495649167d6829fea7bc7eacd2034646aee5bd1
|
||||
|
||||
PODFILE CHECKSUM: dc80e3587547d0d302dad43090af30e2a96d6c5a
|
||||
|
||||
COCOAPODS: 1.11.3
|
24835
package-lock.json
generated
137
package.json
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "simple-qr",
|
||||
"version": "2.6.4",
|
||||
"version": "4.1.0",
|
||||
"author": "Tom Fong",
|
||||
"homepage": "https://tomfong.github.io",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"build:an": "ionic cap build android --prod",
|
||||
"build:ios": "ionic cap build ios --prod",
|
||||
"build:an": "ionic cap build android --prod --no-open",
|
||||
"build:ios": "ionic cap build ios --prod --no-open",
|
||||
"build": "ionic cap build android --prod --no-open && ionic cap build ios --prod --no-open",
|
||||
"sync": "ionic cap sync --prod --no-build",
|
||||
"copy:an": "ionic cap copy android --prod",
|
||||
"copy:ios": "ionic cap copy ios --prod",
|
||||
|
@ -16,91 +16,90 @@
|
|||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^13.3.5",
|
||||
"@angular/cdk": "^13.3.5",
|
||||
"@angular/common": "^13.3.5",
|
||||
"@angular/core": "^13.3.5",
|
||||
"@angular/forms": "^13.3.5",
|
||||
"@angular/localize": "^13.3.5",
|
||||
"@angular/material": "^13.3.5",
|
||||
"@angular/material-moment-adapter": "^13.3.5",
|
||||
"@angular/platform-browser": "^13.3.5",
|
||||
"@angular/platform-browser-dynamic": "^13.3.5",
|
||||
"@angular/router": "^13.3.5",
|
||||
"@awesome-cordova-plugins/aes-256": "^5.42.0",
|
||||
"@awesome-cordova-plugins/chooser": "^5.42.0",
|
||||
"@awesome-cordova-plugins/core": "^5.42.0",
|
||||
"@awesome-cordova-plugins/screen-orientation": "^5.42.0",
|
||||
"@awesome-cordova-plugins/sms": "^5.42.0",
|
||||
"@awesome-cordova-plugins/social-sharing": "^5.42.0",
|
||||
"@awesome-cordova-plugins/theme-detection": "^5.42.0",
|
||||
"@capacitor-community/barcode-scanner": "^2.1.1",
|
||||
"@capacitor-community/contacts": "^1.1.3",
|
||||
"@capacitor-community/screen-brightness": "^1.0.1",
|
||||
"@capacitor/android": "^3.5.1",
|
||||
"@capacitor/app": "^1.1.1",
|
||||
"@capacitor/camera": "^1.3.1",
|
||||
"@capacitor/clipboard": "^1.0.8",
|
||||
"@capacitor/core": "^3.4.3",
|
||||
"@capacitor/device": "^1.1.2",
|
||||
"@capacitor/filesystem": "^1.1.0",
|
||||
"@capacitor/haptics": "^1.1.4",
|
||||
"@capacitor/ios": "^3.5.1",
|
||||
"@capacitor/keyboard": "^1.2.2",
|
||||
"@capacitor/splash-screen": "^1.2.2",
|
||||
"@capacitor/status-bar": "^1.0.8",
|
||||
"@capacitor/toast": "^1.0.8",
|
||||
"@ionic/angular": "^6.1.6",
|
||||
"@ionic/storage": "^3.0.6",
|
||||
"@ionic/storage-angular": "^3.0.6",
|
||||
"@ng-bootstrap/ng-bootstrap": "^11.0.1",
|
||||
"@ngx-translate/core": "^13.0.0",
|
||||
"@ngx-translate/http-loader": "^6.0.0",
|
||||
"@techiediaries/ngx-qrcode": "^9.1.0",
|
||||
"bootstrap": "^4.6.1",
|
||||
"@angular/animations": "^16.1.3",
|
||||
"@angular/cdk": "^16.1.3",
|
||||
"@angular/common": "^16.1.3",
|
||||
"@angular/core": "^16.1.3",
|
||||
"@angular/forms": "^16.2.12",
|
||||
"@angular/localize": "^16.2.12",
|
||||
"@angular/material": "^16.1.3",
|
||||
"@angular/material-moment-adapter": "^16.2.14",
|
||||
"@angular/platform-browser": "^16.1.3",
|
||||
"@angular/platform-browser-dynamic": "^16.2.12",
|
||||
"@angular/router": "^16.2.12",
|
||||
"@awesome-cordova-plugins/aes-256": "^6.6.0",
|
||||
"@awesome-cordova-plugins/chooser": "^6.6.0",
|
||||
"@awesome-cordova-plugins/core": "^6.6.0",
|
||||
"@awesome-cordova-plugins/screen-orientation": "^6.6.0",
|
||||
"@awesome-cordova-plugins/sms": "^6.6.0",
|
||||
"@awesome-cordova-plugins/social-sharing": "^6.6.0",
|
||||
"@awesome-cordova-plugins/theme-detection": "^6.6.0",
|
||||
"@capacitor-community/barcode-scanner": "^4.0.1",
|
||||
"@capacitor-community/contacts": "^5.0.5",
|
||||
"@capacitor-community/screen-brightness": "^5.0.0",
|
||||
"@capacitor/android": "^5.7.4",
|
||||
"@capacitor/app": "^5.0.7",
|
||||
"@capacitor/camera": "^5.0.9",
|
||||
"@capacitor/clipboard": "^5.0.7",
|
||||
"@capacitor/core": "^5.7.4",
|
||||
"@capacitor/device": "^5.0.7",
|
||||
"@capacitor/filesystem": "^5.2.1",
|
||||
"@capacitor/haptics": "^5.0.7",
|
||||
"@capacitor/ios": "^5.7.4",
|
||||
"@capacitor/keyboard": "^5.0.8",
|
||||
"@capacitor/preferences": "^5.0.7",
|
||||
"@capacitor/splash-screen": "^5.0.7",
|
||||
"@capacitor/status-bar": "^5.0.7",
|
||||
"@capacitor/toast": "^5.0.7",
|
||||
"@ionic/angular": "^7.8.2",
|
||||
"@ionic/storage": "^4.0.0",
|
||||
"@ionic/storage-angular": "^4.0.0",
|
||||
"@ng-bootstrap/ng-bootstrap": "^15.1.2",
|
||||
"@ngx-translate/core": "^15.0.0",
|
||||
"@ngx-translate/http-loader": "^8.0.0",
|
||||
"angularx-qrcode": "^16.0.2",
|
||||
"bootstrap": "^5.3.3",
|
||||
"cordova-plugin-aes256-encryption": "^2.0.1",
|
||||
"cordova-plugin-chooser": "^1.3.2",
|
||||
"cordova-plugin-screen-orientation": "^3.0.2",
|
||||
"cordova-plugin-screen-orientation": "^3.0.4",
|
||||
"cordova-plugin-theme-detection": "^1.3.0",
|
||||
"cordova-plugin-x-socialsharing": "^6.0.3",
|
||||
"cordova-sms-plugin": "^1.0.2",
|
||||
"cordova-plugin-x-socialsharing": "^6.0.4",
|
||||
"cordova-sms-plugin": "^1.0.3",
|
||||
"date-fns": "2.29.3",
|
||||
"es6-promise-plugin": "^4.2.2",
|
||||
"human-signals": "^2.1.0",
|
||||
"jsqr": "^1.4.0",
|
||||
"material-design-icons": "^3.0.1",
|
||||
"moment": "^2.29.3",
|
||||
"osenv": "^0.1.5",
|
||||
"properties-parser": "^0.3.1",
|
||||
"rxjs": "^6.6.7",
|
||||
"rxjs": "^7.8.1",
|
||||
"strip-final-newline": "^2.0.0",
|
||||
"tslib": "^2.4.0",
|
||||
"tslib": "^2.6.2",
|
||||
"uuid": "^8.3.2",
|
||||
"zone.js": "^0.11.5"
|
||||
"zone.js": "^0.13.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^13.3.4",
|
||||
"@angular/cli": "^13.3.4",
|
||||
"@angular/compiler": "^13.3.5",
|
||||
"@angular/compiler-cli": "^13.3.5",
|
||||
"@angular/language-service": "^13.3.5",
|
||||
"@capacitor/cli": "^3.5.0",
|
||||
"@ionic/angular-toolkit": "^6.1.0",
|
||||
"@types/jasmine": "^3.10.6",
|
||||
"@types/jasminewd2": "^2.0.10",
|
||||
"@types/node": "^12.20.50",
|
||||
"@angular-devkit/build-angular": "^16.2.13",
|
||||
"@angular/cli": "^16.2.13",
|
||||
"@angular/compiler": "^16.1.3",
|
||||
"@angular/compiler-cli": "^16.1.3",
|
||||
"@angular/language-service": "^16.2.12",
|
||||
"@capacitor/cli": "^5.7.4",
|
||||
"@ionic/angular-toolkit": "^9.0.0",
|
||||
"@ionic/cli": "^7.2.0",
|
||||
"@types/jasmine": "^3.10.18",
|
||||
"@types/jasminewd2": "^2.0.13",
|
||||
"@types/node": "^12.20.55",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"codelyzer": "^6.0.2",
|
||||
"jasmine-core": "~3.8.0",
|
||||
"jasmine-spec-reporter": "~5.0.0",
|
||||
"karma": "^6.3.19",
|
||||
"karma-chrome-launcher": "^3.1.1",
|
||||
"karma": "^6.4.3",
|
||||
"karma-chrome-launcher": "^3.2.0",
|
||||
"karma-coverage": "~2.0.3",
|
||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||
"karma-jasmine": "^4.0.2",
|
||||
"karma-jasmine-html-reporter": "^1.7.0",
|
||||
"protractor": "~7.0.0",
|
||||
"ts-node": "~8.3.0",
|
||||
"tslint": "~6.1.0",
|
||||
"typescript": "~4.5.5"
|
||||
"typescript": "^5.1.6"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,17 +41,22 @@ const routes: Routes = [
|
|||
loadChildren: () => import('./pages/setting-orientation/setting-orientation.module').then(m => m.SettingOrientationPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-qr-ecl',
|
||||
loadChildren: () => import('./pages/setting-qr-ecl/setting-qr-ecl.module').then(m => m.SettingQrEclPageModule)
|
||||
path: 'setting-qr',
|
||||
loadChildren: () => import('./pages/setting-qr/setting-qr.module').then(m => m.SettingQrPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-auto-brightness',
|
||||
loadChildren: () => import('./pages/setting-auto-brightness/setting-auto-brightness.module').then(m => m.SettingAutoBrightnessPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-auto-open-url',
|
||||
loadChildren: () => import('./pages/setting-auto-open-url/setting-auto-open-url.module').then(m => m.SettingAutoOpenUrlPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-start-page',
|
||||
loadChildren: () => import('./pages/setting-start-page/setting-start-page.module').then(m => m.SettingStartPagePageModule)
|
||||
},
{
|
||||
},
|
||||
{
|
||||
path: 'setting-result',
|
||||
loadChildren: () => import('./pages/setting-result/setting-result.module').then( m => m.SettingResultPageModule)
|
||||
},
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { App } from '@capacitor/app';
|
||||
import { SplashScreen } from '@capacitor/splash-screen';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { EnvService } from './services/env.service';
|
||||
|
@ -17,5 +20,29 @@ export class AppComponent {
|
|||
) {
|
||||
translate.addLangs(this.env.languages);
|
||||
translate.setDefaultLang('en');
|
||||
if (this.platform.is('ios')) {
|
||||
App.addListener('appStateChange', async ({ isActive }) => {
|
||||
if (env.isDebugging) {
|
||||
this.presentToast(`App state changed. Is active?: ${isActive}`, "short", "bottom");
|
||||
}
|
||||
if (isActive) {
|
||||
setTimeout(async () => {
|
||||
await SplashScreen.hide();
|
||||
}, 300);
|
||||
} else {
|
||||
await SplashScreen.show({
|
||||
autoHide: false
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async presentToast(msg: string, duration: "short" | "long", pos: "top" | "center" | "bottom") {
|
||||
await Toast.show({
|
||||
text: msg,
|
||||
duration: duration,
|
||||
position: pos
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,14 +19,12 @@ import { ScreenOrientation } from '@awesome-cordova-plugins/screen-orientation/n
|
|||
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { HistoryTutorialPageModule } from './modals/history-tutorial/history-tutorial.module';
|
||||
import { DatePipe } from '@angular/common';
|
||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { EnvService } from './services/env.service';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { BookmarkTutorialPageModule } from './modals/bookmark-tutorial/bookmark-tutorial.module';
|
||||
import { QrCodePageModule } from './modals/qr-code/qr-code.module';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
|
@ -39,7 +37,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
],
|
||||
imports: [
|
||||
BrowserModule,
|
||||
IonicModule.forRoot(),
|
||||
IonicModule.forRoot({ innerHTMLTemplatesEnabled: true }),
|
||||
AppRoutingModule,
|
||||
HttpClientModule,
|
||||
FormsModule,
|
||||
|
@ -51,8 +49,6 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
}
|
||||
}),
|
||||
IonicStorageModule.forRoot(),
|
||||
HistoryTutorialPageModule,
|
||||
BookmarkTutorialPageModule,
|
||||
QrCodePageModule,
|
||||
BrowserAnimationsModule,
|
||||
MatFormFieldModule,
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
|
||||
import { IonicModule } from '@ionic/angular';
|
||||
|
||||
import { BookmarkTutorialPage } from './bookmark-tutorial.page';
|
||||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
}
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
MatFormFieldModule,
|
||||
MatIconModule,
|
||||
MatInputModule,
|
||||
MatSelectModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
useFactory: HttpLoaderFactory,
|
||||
deps: [HttpClient]
|
||||
}
|
||||
}),
|
||||
],
|
||||
declarations: [BookmarkTutorialPage]
|
||||
})
|
||||
export class BookmarkTutorialPageModule {}
|
|
@ -1,53 +0,0 @@
|
|||
<ion-content [color]="color" #content>
|
||||
|
||||
<ion-list-header class="mt-4 ml-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
|
||||
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
|
||||
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-left.svg"
|
||||
[color]="'primary'"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.TUTORIAL_SWIPE_LEFT' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
|
||||
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-right.svg"
|
||||
[color]="'primary'"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.BOOKMARK_TUTORIAL_SWIPE_RIGHT' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
</ion-content>
|
||||
|
||||
<ion-footer>
|
||||
|
||||
<ion-item lines="none" [color]="color" style="--ripple-color: transparent;">
|
||||
<ion-checkbox class="ion-margin-horizontal" [(ngModel)]="env.notShowBookmarkTutorial"
|
||||
[color]="'primary'" (ionChange)="saveBookmarkTutorialShowing()"></ion-checkbox>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.TUTORIAL_NOT_SHOW_AGAIN' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-toolbar [color]="color" style="border: none;">
|
||||
<ion-row class="d-flex align-items-center justify-content-end">
|
||||
<ion-button class="ion-margin-horizontal ion-margin-bottom" fill="clear" (click)="tapHaptic(); closeModal()" color="primary">
|
||||
{{ 'OK' | translate }}
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
</ion-toolbar>
|
||||
|
||||
</ion-footer>
|
|
@ -1,18 +0,0 @@
|
|||
mat-form-field {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.content-item {
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
ion-footer {
|
||||
&.footer-md::before {
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-ios ion-toolbar:first-of-type {
|
||||
--border-width: 0 !important;
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
import { Component, ViewChild } from '@angular/core';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { ModalController } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-bookmark-tutorial',
|
||||
templateUrl: './bookmark-tutorial.page.html',
|
||||
styleUrls: ['./bookmark-tutorial.page.scss'],
|
||||
})
|
||||
export class BookmarkTutorialPage {
|
||||
|
||||
@ViewChild('content') contentEl: HTMLIonContentElement;
|
||||
|
||||
constructor(
|
||||
public modalController: ModalController,
|
||||
public translate: TranslateService,
|
||||
public env: EnvService,
|
||||
) {
|
||||
setTimeout(
|
||||
() => {
|
||||
this.contentEl.scrollToBottom(500);
|
||||
}, 750
|
||||
);
|
||||
}
|
||||
|
||||
async saveBookmarkTutorialShowing() {
|
||||
if (this.env.notShowBookmarkTutorial === true) {
|
||||
await this.env.storageSet("not-show-bookmark-tutorial", 'yes');
|
||||
} else {
|
||||
await this.env.storageSet("not-show-bookmark-tutorial", 'no');
|
||||
}
|
||||
}
|
||||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
closeModal(): void {
|
||||
this.modalController.dismiss();
|
||||
}
|
||||
|
||||
get color() {
|
||||
switch (this.env.colorTheme) {
|
||||
case 'dark':
|
||||
return 'dark';
|
||||
case 'light':
|
||||
return 'white';
|
||||
case 'black':
|
||||
return 'black';
|
||||
default:
|
||||
return 'white';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
|
||||
import { IonicModule } from '@ionic/angular';
|
||||
|
||||
import { HistoryTutorialPage } from './history-tutorial.page';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
}
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
MatFormFieldModule,
|
||||
MatIconModule,
|
||||
MatInputModule,
|
||||
MatSelectModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
useFactory: HttpLoaderFactory,
|
||||
deps: [HttpClient]
|
||||
}
|
||||
}),
|
||||
],
|
||||
declarations: [HistoryTutorialPage]
|
||||
})
|
||||
export class HistoryTutorialPageModule {}
|
|
@ -1,53 +0,0 @@
|
|||
<ion-content [color]="color" #content>
|
||||
|
||||
<ion-list-header class="mt-4 ml-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
|
||||
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
|
||||
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-left.svg"
|
||||
[color]="'primary'"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.TUTORIAL_SWIPE_LEFT' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
|
||||
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-right.svg"
|
||||
[color]="'primary'"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.TUTORIAL_SWIPE_RIGHT' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
</ion-content>
|
||||
|
||||
<ion-footer>
|
||||
|
||||
<ion-item lines="none" [color]="color" style="--ripple-color: transparent;">
|
||||
<ion-checkbox class="ion-margin-horizontal" [(ngModel)]="env.notShowHistoryTutorial"
|
||||
[color]="'primary'" (ionChange)="saveHistoryTutorialShowing()"></ion-checkbox>
|
||||
<ion-label>
|
||||
<p class="ion-padding">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
{{ 'MSG.TUTORIAL_NOT_SHOW_AGAIN' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-toolbar [color]="color" style="border: none;">
|
||||
<ion-row class="d-flex align-items-center justify-content-end">
|
||||
<ion-button class="ion-margin-horizontal ion-margin-bottom" fill="clear" (click)="tapHaptic(); closeModal()" color="primary">
|
||||
{{ 'OK' | translate }}
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
</ion-toolbar>
|
||||
|
||||
</ion-footer>
|
|
@ -1,18 +0,0 @@
|
|||
mat-form-field {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.content-item {
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
ion-footer {
|
||||
&.footer-md::before {
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-ios ion-toolbar:first-of-type {
|
||||
--border-width: 0 !important;
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
import { Component, ViewChild } from '@angular/core';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { ModalController, ToastController } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-history-tutorial',
|
||||
templateUrl: './history-tutorial.page.html',
|
||||
styleUrls: ['./history-tutorial.page.scss'],
|
||||
})
|
||||
export class HistoryTutorialPage {
|
||||
|
||||
@ViewChild('content') contentEl: HTMLIonContentElement;
|
||||
|
||||
constructor(
|
||||
public modalController: ModalController,
|
||||
public translate: TranslateService,
|
||||
public env: EnvService,
|
||||
) {
|
||||
setTimeout(
|
||||
() => {
|
||||
this.contentEl.scrollToBottom(500);
|
||||
}, 750
|
||||
);
|
||||
}
|
||||
|
||||
async saveHistoryTutorialShowing() {
|
||||
if (this.env.notShowHistoryTutorial === true) {
|
||||
await this.env.storageSet("not-show-history-tutorial", 'yes');
|
||||
} else {
|
||||
await this.env.storageSet("not-show-history-tutorial", 'no');
|
||||
}
|
||||
}
|
||||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
closeModal(): void {
|
||||
this.modalController.dismiss();
|
||||
}
|
||||
|
||||
get color() {
|
||||
switch (this.env.colorTheme) {
|
||||
case 'dark':
|
||||
return 'dark';
|
||||
case 'light':
|
||||
return 'white';
|
||||
case 'black':
|
||||
return 'black';
|
||||
default:
|
||||
return 'white';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -8,11 +8,7 @@ import { QrCodePage } from './qr-code.page';
|
|||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { NgxQRCodeModule } from '@techiediaries/ngx-qrcode';
|
||||
import { QRCodeModule } from 'angularx-qrcode';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
|
@ -23,7 +19,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
NgxQRCodeModule,
|
||||
QRCodeModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
|
|
|
@ -11,10 +11,10 @@
|
|||
<div class="d-flex align-items-center justify-content-top flex-column" style="height: 100%;">
|
||||
<ion-row>
|
||||
<ion-col class="ion-text-center ion-padding" style="max-width: 100% !important;">
|
||||
<ngx-qrcode [elementType]="qrElementType" [value]="qrCodeContent" [width]="defaultWidth"
|
||||
<qrcode [elementType]="qrElementType" [qrdata]="qrCodeContent" [width]="defaultWidth"
|
||||
[errorCorrectionLevel]="errorCorrectionLevel" [colorDark]="qrColorDark" [colorLight]="qrColorLight"
|
||||
[margin]="qrMargin" #qrcode [hidden]="isSharing">
|
||||
</ngx-qrcode>
|
||||
[margin]="env.qrCodeMargin" #qrcode [hidden]="isSharing">
|
||||
</qrcode>
|
||||
<div class="d-flex flex-column align-items-center" *ngIf="isSharing">
|
||||
<ion-spinner class="my-3"></ion-spinner>
|
||||
</div>
|
||||
|
@ -86,8 +86,8 @@
|
|||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
<ion-button class="pt-2 ion-margin-bottom" fill="clear" (click)="goErrorCorrectionLevelSetting()" color="primary">
|
||||
{{ 'LEARN_MORE' | translate }}
|
||||
<ion-button class="pt-2 ion-margin-bottom" fill="clear" (click)="goQrSetting()" color="primary">
|
||||
{{ 'QR_CODE_STYLE' | translate }}
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
</div>
|
||||
|
|
|
@ -6,9 +6,11 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
|||
import { Toast } from '@capacitor/toast';
|
||||
import { LoadingController, ModalController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { NgxQrcodeElementTypes, NgxQrcodeErrorCorrectionLevels, QrcodeComponent } from '@techiediaries/ngx-qrcode';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { ScreenBrightness } from '@capacitor-community/screen-brightness';
|
||||
import { rgbToHex } from 'src/app/utils/helpers';
|
||||
import { Preferences } from '@capacitor/preferences';
|
||||
import { QRCodeComponent, QRCodeElementType } from 'angularx-qrcode';
|
||||
|
||||
@Component({
|
||||
selector: 'app-qr-code',
|
||||
|
@ -19,15 +21,14 @@ export class QrCodePage {
|
|||
|
||||
modal: HTMLIonModalElement;
|
||||
|
||||
@ViewChild('qrcode') qrcodeElement: QrcodeComponent;
|
||||
@ViewChild('qrcode') qrcodeElement: QRCodeComponent;
|
||||
|
||||
@Input() qrCodeContent: string;
|
||||
qrElementType: NgxQrcodeElementTypes = NgxQrcodeElementTypes.CANVAS;
|
||||
errorCorrectionLevel: NgxQrcodeErrorCorrectionLevels;
|
||||
qrElementType: QRCodeElementType = "canvas";
|
||||
errorCorrectionLevel: 'low' | 'medium' | 'quartile' | 'high' | 'L' | 'M' | 'Q' | 'H';
|
||||
scale: number = 0.8;
|
||||
readonly MAX_WIDTH = 350;
|
||||
defaultWidth: number = window.innerHeight * 0.32 > this.MAX_WIDTH ? this.MAX_WIDTH : window.innerHeight * 0.32;
|
||||
qrMargin: number = 3;
|
||||
|
||||
qrImageDataUrl: string;
|
||||
|
||||
|
@ -63,17 +64,16 @@ export class QrCodePage {
|
|||
if (this.qrcodeElement.width > this.MAX_WIDTH) {
|
||||
this.qrcodeElement.width = this.MAX_WIDTH;
|
||||
}
|
||||
this.qrcodeElement.createQRCode();
|
||||
}, 500)
|
||||
}
|
||||
}
|
||||
)
|
||||
await ScreenBrightness.getBrightness().then(
|
||||
value => {
|
||||
this.currentBrightness = value.brightness
|
||||
}
|
||||
)
|
||||
if (this.env.autoMaxBrightness === 'on') {
|
||||
await ScreenBrightness.getBrightness().then(
|
||||
value => {
|
||||
this.currentBrightness = value.brightness
|
||||
}
|
||||
)
|
||||
await ScreenBrightness.setBrightness({ brightness: 1.0 }).catch(
|
||||
err => {
|
||||
if (this.env.isDebugging) {
|
||||
|
@ -98,7 +98,6 @@ export class QrCodePage {
|
|||
if (this.qrcodeElement.width > this.MAX_WIDTH) {
|
||||
this.qrcodeElement.width = this.MAX_WIDTH;
|
||||
}
|
||||
this.qrcodeElement.createQRCode();
|
||||
}
|
||||
})
|
||||
this.modal.onDidDismiss().then(
|
||||
|
@ -131,40 +130,25 @@ export class QrCodePage {
|
|||
setErrorCorrectionLevel() {
|
||||
switch (this.env.errorCorrectionLevel) {
|
||||
case 'L':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.LOW;
|
||||
this.errorCorrectionLevel = 'low';
|
||||
break;
|
||||
case 'M':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
break;
|
||||
case 'Q':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.QUARTILE;
|
||||
this.errorCorrectionLevel = 'quartile';
|
||||
break;
|
||||
case 'H':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.HIGH;
|
||||
this.errorCorrectionLevel = 'high';
|
||||
break;
|
||||
default:
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
}
|
||||
}
|
||||
|
||||
async onErrorCorrectionLevelChange() {
|
||||
switch (this.env.errorCorrectionLevel) {
|
||||
case 'L':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.LOW;
|
||||
break;
|
||||
case 'M':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
break;
|
||||
case 'Q':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.QUARTILE;
|
||||
break;
|
||||
case 'H':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.HIGH;
|
||||
break;
|
||||
default:
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
}
|
||||
await this.env.storageSet("error-correction-level", this.env.errorCorrectionLevel);
|
||||
this.setErrorCorrectionLevel();
|
||||
await Preferences.set({ key: this.env.KEY_ERROR_CORRECTION_LEVEL, value: this.env.errorCorrectionLevel });
|
||||
if (this.qrcodeElement != null) {
|
||||
this.qrcodeElement.errorCorrectionLevel = this.errorCorrectionLevel;
|
||||
} else {
|
||||
|
@ -174,9 +158,9 @@ export class QrCodePage {
|
|||
}
|
||||
}
|
||||
|
||||
goErrorCorrectionLevelSetting() {
|
||||
goQrSetting() {
|
||||
this.modalController.dismiss();
|
||||
this.router.navigate(['setting-qr-ecl']);
|
||||
this.router.navigate(['setting-qr']);
|
||||
}
|
||||
|
||||
async shareQrCode(): Promise<void> {
|
||||
|
@ -184,7 +168,6 @@ export class QrCodePage {
|
|||
this.isSharing = true;
|
||||
const currentWidth = this.qrcodeElement.width;
|
||||
this.qrcodeElement.width = 1000;
|
||||
this.qrcodeElement.createQRCode();
|
||||
setTimeout(async () => {
|
||||
const canvases = document.querySelectorAll("canvas") as NodeListOf<HTMLCanvasElement>;
|
||||
const canvas = canvases[canvases.length - 1];
|
||||
|
@ -197,7 +180,6 @@ export class QrCodePage {
|
|||
await this.socialSharing.share(this.translate.instant('MSG.SHARE_QR'), this.translate.instant('SIMPLE_QR'), this.qrImageDataUrl, null).then(
|
||||
_ => {
|
||||
this.qrcodeElement.width = currentWidth;
|
||||
this.qrcodeElement.createQRCode();
|
||||
delete this.qrImageDataUrl;
|
||||
this.isSharing = false;
|
||||
loading2.dismiss();
|
||||
|
@ -208,7 +190,6 @@ export class QrCodePage {
|
|||
this.presentToast("Error when call SocialSharing.share: " + JSON.stringify(err), "long", "top");
|
||||
}
|
||||
this.qrcodeElement.width = currentWidth;
|
||||
this.qrcodeElement.createQRCode();
|
||||
delete this.qrImageDataUrl;
|
||||
this.isSharing = false;
|
||||
loading2.dismiss();
|
||||
|
@ -218,11 +199,11 @@ export class QrCodePage {
|
|||
}
|
||||
|
||||
get qrColorDark(): string {
|
||||
return "#222428";
|
||||
return rgbToHex(this.env.qrCodeDarkR, this.env.qrCodeDarkG, this.env.qrCodeDarkB);
|
||||
}
|
||||
|
||||
get qrColorLight(): string {
|
||||
return "#ffffff";
|
||||
return rgbToHex(this.env.qrCodeLightR, this.env.qrCodeLightG, this.env.qrCodeLightB);
|
||||
}
|
||||
|
||||
async presentLoading(msg: string): Promise<HTMLIonLoadingElement> {
|
||||
|
@ -256,7 +237,7 @@ export class QrCodePage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|