Compare commits

..

No commits in common. "main" and "v2.7.0-dev.20220527" have entirely different histories.

175 changed files with 18542 additions and 13334 deletions

1
.github/FUNDING.yml vendored
View file

@ -1 +0,0 @@

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

128
README.md
View file

@ -1,32 +1,28 @@
<img align="left" width="130" height="130" src="./resources/icon_round.png" alt="app icon">
# Simple QR # 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> Simple and lightweight app to scan, create and store QR codes.
<p align="center">
<strong>
Simple QR
</strong>
</p>
<p align="center">
Simple and lightweight app to scan, create and store QR codes
</p>
<br> <br>
<p align="center">
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_1.png"> <div>
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_2.png"> <img height="300" src="./screenshots/2.png">
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_3.png"> <img height="300" src="./screenshots/4.png">
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_4.png"> <img height="300" src="./screenshots/5.png">
<img height="300" src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/screenshot_5.png"> <img height="300" src="./screenshots/3.png">
</p> <img height="300" src="./screenshots/7.png">
</div>
## About ## About
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. Simple QR is a FOSS 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 now available on the following platforms. It's now available on the following platforms.
| Google Play | GitHub | IzzyOnDroid | | App Store | Google Play | GitHub | IzzyOnDroid |
|:-:|:-:|:-:| |:-:|:-:|:-:|:-:|
| [<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) | | [<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/github.png" height="50">](https://github.com/tomfong/simple-qr/releases) | [<img src="badges/IzzyOnDroid.png" height="50">](https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr) |
## Features ## Features
@ -36,7 +32,7 @@ By using the app, you can
2. Import image files and scan the QR Code on it. 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, Wi-Fi and Geolocation. 3. Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi.
4. Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable. 4. Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.
@ -46,50 +42,35 @@ By using the app, you can
* Execute base64 encoding/decoding on it. * Execute base64 encoding/decoding on it.
* Use it as a content to generate a new shareable QR code. * Use it as a content to generate a new shareable QR code.
* Do corresponding tasks if it is a * Do corresponding tasks if it is a
* URL: Browse website / Open application * URL: Browse website
* vCard contact: Add contact * vCard contact: Add contact
* Phone number: Phone call, add contact * Phone number: Phone call, add contact
* Message: Send message, add contact * Message: Send message, add contact
* Email: Send email * Email: Send email
* Geolocation: Open map
6. Customize the generated QR code, e.g. error correction level, color, margin and screen brightness. 6. Adjust the generated QR code, e.g. error correction level and screen brightness.
7. Customize the app, e.g. app initial page, language and color theme etc. 7. Customize the app, e.g. app initial page, language and color theme etc.
### Demo ### Demo
[![Simple QR Demo](https://img.youtube.com/vi/TIC6ZAkWoXY/0.jpg)](https://www.youtube.com/watch?v=TIC6ZAkWoXY) [![Simple QR Demo](https://img.youtube.com/vi/D57VveikN8U/0.jpg)](https://www.youtube.com/watch?v=D57VveikN8U)
### Languages Supported ### Languages Supported
* English (en) * English (en)
* Chinese (Hong Kong) 中文 (香港) (zh-HK) * Traditional Chinese 正體中文 (zh)
* Chinese (Simplified) 简体中文 (zh-CN) * Simplified Chinese 简体中文 (zh-CN)
* German Deutsch (de) * German Deutsch (de)
* French Français (fr) * French Français (fr)
* Italian Italiano (it)
* Portuguese (Brazil) (pt-BR)
* Russian Русский (ru)
You are welcomed to help translate the app into more languages (refer to this <a href="#how-to-help-translate">section</a>) You are welcomed to help translate the app into more languages (refer to this <a href="#how-to-help-translate">section</a>)
## Contribute ## Contribute
* Sponsor the project. * Star and <b>sponsor (<a href="https://github.com/tomfong">click here</a>)</b> the project.
[![GitHub Sponsor](https://img.shields.io/badge/sponsor-30363D?style=flat&logo=GitHub-Sponsors&logoColor=#white)](https://github.com/sponsors/tomfong?frequency=one-time)
[![Buy me a Coffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=flat&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/tomfong)
* Star the project.
[![Stars](https://img.shields.io/github/stars/tomfong/simple-qr?style=flat)](https://github.com/tomfong/simple-qr/stargazers)
* Open issues to report bugs or share any new ideas.
[![Issues](https://img.shields.io/github/issues/tomfong/simple-qr?style=flat)](https://github.com/tomfong/simple-qr/issues)
* Translate the app into different languages. * Translate the app into different languages.
* Open issues to report bugs or share any new ideas.
### How to help translate? ### How to help translate?
@ -104,10 +85,24 @@ You are welcomed to help translate the app into more languages (refer to this <a
* <b>DO NOT</b> change the order. * <b>DO NOT</b> change the order.
4. Email the JSON to me (tomfong.dev@gmail.com) after you finish. 4. Email the JSON to me (tomfong.dev@gmail.com) after you finish.
### Build the project ### Build the project (Android)
1. Run ```npm install``` to install all dependencies. 1. Run ```npm install``` to install all dependencies
2. Run ```npm run build``` 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
```java
final PendingIntent pendingIntent = PendingIntent.getBroadcast(cordova.getActivity().getApplicationContext(), 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);
```
5. In ```android/app/src/main/res/values/styles.xml```, change
```xml
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:background">#00a5aa</item>
</style>
```
### Contributors ### Contributors
@ -115,25 +110,28 @@ Thank you the following contributors who have made the app better!
| Name | GitHub | How? | | Name | GitHub | How? |
|:-:|:-:|:-:| |:-:|:-:|:-:|
| mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | German language translation | | mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | Translate the app into German |
| 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 ## Framework
```sh ```sh
Ionic CLI : 7.2.0 Ionic CLI : 6.19.0
Ionic Framework : @ionic/angular 7.8.2 Ionic Framework : @ionic/angular 6.1.6
@angular-devkit/build-angular : 16.2.13 @angular-devkit/build-angular : 13.3.6
@angular-devkit/schematics : 16.2.13 @angular-devkit/schematics : 13.3.6
@angular/cli : 16.2.13 @angular/cli : 13.3.6
@ionic/angular-toolkit : 9.0.0 @ionic/angular-toolkit : 6.1.0
Capacitor CLI : 5.7.4 Capacitor CLI : 3.5.1
@capacitor/android : 5.7.4 @capacitor/android : 3.5.1
@capacitor/core : 5.7.4 @capacitor/core : 3.5.1
@capacitor/ios : 5.7.4 @capacitor/ios : 3.5.1
Cordova CLI : 10.0.0
Android SDK Tools : 26.1.1
NodeJS : v16.15.4
npm : 8.8.0
``` ```
## Privacy Policy ## Privacy Policy
@ -142,4 +140,4 @@ Please read the [Privacy Policy](https://www.privacypolicies.com/live/771b1123-9
## License ## License
[![License](https://img.shields.io/github/license/tomfong/simple-qr?style=flat)](https://github.com/tomfong/simple-qr/blob/main/LICENSE) Please view the [LICENSE](LICENSE)

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" /> <bytecodeTargetLevel target="11" />
</component> </component>
</project> </project>

13
android/.idea/misc.xml generated
View file

@ -1,17 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DesignSurface"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<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" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View file

@ -1,14 +1,13 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
namespace "com.tomfong.simpleqr"
compileSdkVersion rootProject.ext.compileSdkVersion compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "com.tomfong.simpleqr" applicationId "com.tomfong.simpleqr"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 4010000 versionCode 2070000
versionName "4.1.0" versionName "2.7.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@ -31,8 +30,6 @@ repositories {
} }
dependencies { dependencies {
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation project(':capacitor-android') implementation project(':capacitor-android')

View file

@ -2,8 +2,8 @@
android { android {
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_1_8
} }
} }
@ -19,7 +19,6 @@ dependencies {
implementation project(':capacitor-filesystem') implementation project(':capacitor-filesystem')
implementation project(':capacitor-haptics') implementation project(':capacitor-haptics')
implementation project(':capacitor-keyboard') implementation project(':capacitor-keyboard')
implementation project(':capacitor-preferences')
implementation project(':capacitor-splash-screen') implementation project(':capacitor-splash-screen')
implementation project(':capacitor-status-bar') implementation project(':capacitor-status-bar')
implementation project(':capacitor-toast') implementation project(':capacitor-toast')

View file

@ -1,20 +0,0 @@
{
"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"
}

View file

@ -1,16 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" > <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.tomfong.simpleqr">
<application <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">
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"> <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">
@ -24,29 +15,13 @@
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <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> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider> </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> </application>
<!-- Permissions --> <!-- 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.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_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.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_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-sdk tools:overrideLibrary="com.google.zxing.client.android" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
</manifest> </manifest>

View file

@ -5,7 +5,7 @@
}, },
{ {
"pkg": "@capacitor-community/contacts", "pkg": "@capacitor-community/contacts",
"classpath": "getcapacitor.community.contacts.ContactsPlugin" "classpath": "ch.byrds.capacitor.contacts.Contacts"
}, },
{ {
"pkg": "@capacitor-community/screen-brightness", "pkg": "@capacitor-community/screen-brightness",
@ -39,10 +39,6 @@
"pkg": "@capacitor/keyboard", "pkg": "@capacitor/keyboard",
"classpath": "com.capacitorjs.plugins.keyboard.KeyboardPlugin" "classpath": "com.capacitorjs.plugins.keyboard.KeyboardPlugin"
}, },
{
"pkg": "@capacitor/preferences",
"classpath": "com.capacitorjs.plugins.preferences.PreferencesPlugin"
},
{ {
"pkg": "@capacitor/splash-screen", "pkg": "@capacitor/splash-screen",
"classpath": "com.capacitorjs.plugins.splashscreen.SplashScreenPlugin" "classpath": "com.capacitorjs.plugins.splashscreen.SplashScreenPlugin"

View file

@ -2,20 +2,4 @@ package com.tomfong.simpleqr;
import com.getcapacitor.BridgeActivity; 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;
}
}

View file

@ -1,63 +0,0 @@
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");
}
}

View file

@ -1,15 +0,0 @@
<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>

View file

@ -1,5 +0,0 @@
<?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>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -1,7 +0,0 @@
<?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>

View file

@ -1,22 +0,0 @@
<?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>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -9,14 +9,14 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:background">@null</item> <item name="android:background">@null</item>
</style> </style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash_background</item> <style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item> <item name="android:background">#00a5aa</item>
</style> </style>
</resources> </resources>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -9,14 +9,14 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:background">@null</item> <item name="android:background">@null</item>
</style> </style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash_background</item> <style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item> <item name="android:background">#00a5aa</item>
</style> </style>
</resources> </resources>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -9,14 +9,14 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:background">@null</item> <item name="android:background">@null</item>
</style> </style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash_background</item> <style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item> <item name="android:background">#00a5aa</item>
</style> </style>
</resources> </resources>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -9,14 +9,14 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:background">@null</item> <item name="android:background">@null</item>
</style> </style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash_background</item> <style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item> <item name="android:background">#00a5aa</item>
</style> </style>
</resources> </resources>

View file

@ -1,6 +0,0 @@
<?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>

View file

@ -9,14 +9,14 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:background">@null</item> <item name="android:background">@null</item>
</style> </style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash_background</item> <style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item> <item name="android:background">#00a5aa</item>
</style> </style>
</resources> </resources>

View file

@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
google() google()
mavenCentral() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.0.2' classpath 'com.android.tools.build:gradle:4.2.1'
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.gms:google-services:4.3.5'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@ -20,11 +20,10 @@ apply from: "variables.gradle"
allprojects { allprojects {
repositories { repositories {
google() google()
mavenCentral() jcenter()
} }
} }
task clean(type: Delete) { task clean(type: Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

View file

@ -32,9 +32,6 @@ project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/
include ':capacitor-keyboard' include ':capacitor-keyboard'
project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') 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' include ':capacitor-splash-screen'
project(':capacitor-splash-screen').projectDir = new File('../node_modules/@capacitor/splash-screen/android') project(':capacitor-splash-screen').projectDir = new File('../node_modules/@capacitor/splash-screen/android')

View file

@ -20,4 +20,5 @@ org.gradle.jvmargs=-Xmx1536m
# Android operating system, and which are packaged with your app's APK # Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn # https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View file

@ -1,16 +1,14 @@
ext { ext {
minSdkVersion = 22 minSdkVersion = 23
compileSdkVersion = 33 compileSdkVersion = 31
targetSdkVersion = 33 targetSdkVersion = 31
androidxActivityVersion = '1.7.0' androidxActivityVersion = '1.2.0'
androidxAppCompatVersion = '1.6.1' androidxAppCompatVersion = '1.2.0'
androidxCoordinatorLayoutVersion = '1.2.0' androidxCoordinatorLayoutVersion = '1.1.0'
androidxCoreVersion = '1.10.0' androidxCoreVersion = '1.3.2'
androidxFragmentVersion = '1.5.6' androidxFragmentVersion = '1.3.0'
junitVersion = '4.13.2' junitVersion = '4.13.1'
androidxJunitVersion = '1.1.5' androidxJunitVersion = '1.1.2'
androidxEspressoCoreVersion = '3.5.1' androidxEspressoCoreVersion = '3.3.0'
cordovaAndroidVersion = '10.1.1' cordovaAndroidVersion = '7.0.0'
coreSplashScreenVersion = '1.0.0'
androidxWebkitVersion = '1.6.1'
} }

View file

@ -1,6 +1,7 @@
{ {
"$schema": "./node_modules/@angular/cli/lib/config/schema.json", "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1, "version": 1,
"defaultProject": "app",
"newProjectRoot": "projects", "newProjectRoot": "projects",
"projects": { "projects": {
"app": { "app": {
@ -30,10 +31,7 @@
"output": "./svg" "output": "./svg"
} }
], ],
"styles": [ "styles": ["src/theme/variables.scss", "src/global.scss"],
"src/theme/variables.scss",
"src/global.scss"
],
"scripts": [], "scripts": [],
"aot": false, "aot": false,
"vendorChunk": true, "vendorChunk": true,
@ -82,7 +80,8 @@
"production": { "production": {
"browserTarget": "app:build:production" "browserTarget": "app:build:production"
}, },
"ci": {} "ci": {
}
} }
}, },
"extract-i18n": { "extract-i18n": {
@ -134,15 +133,36 @@
"devServerTarget": "app:serve:ci" "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": { "cli": {
"schematicCollections": [ "defaultCollection": "@ionic/angular-toolkit"
"@ionic/angular-toolkit"
],
"analytics": false
}, },
"schematics": { "schematics": {
"@ionic/angular-toolkit:component": { "@ionic/angular-toolkit:component": {
@ -152,4 +172,4 @@
"styleext": "scss" "styleext": "scss"
} }
} }
} }

View file

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

View file

@ -1,12 +1,12 @@
<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. <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, Italienisch, traditionelles Chinesisch und vereinfachtes Chinesisch werden unterstützt. Englisch, Französisch, Deutsch, traditionelles Chinesisch und vereinfachtes Chinesisch werden unterstützt.
Mit der App ist das möglich 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. * 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. * Bilddateien zu importieren und den darauf befindlichen QR-Code zu scannen.
* QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, Geolokalisierung, E-Mail und WLAN enthalten, zu erstellen. * QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, 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. * 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 * Aufgaben auf dem Ergebnis mit einem Fingertipp zu erledigen, einschließlich, aber nicht beschränkt auf
* Verwenden als Schlüsselwort für die Websuche. * Verwenden als Schlüsselwort für die Websuche.
@ -19,6 +19,5 @@ Mit der App ist das möglich
* Telefonnummer: Telefonanruf, Kontakt hinzufügen * Telefonnummer: Telefonanruf, Kontakt hinzufügen
* Nachricht: Nachricht senden, Kontakt hinzufügen * Nachricht: Nachricht senden, Kontakt hinzufügen
* E-Mail: E-Mail senden * E-Mail: E-Mail senden
* Geolokalisierung: Karte öffnen * Den generierten QR-Code anzupassen, z.B. Fehlerkorrekturstufe und Bildschirmhelligkeit.
* Passen Sie den generierten QR-Code an, z. Fehlerkorrekturstufe, Farbe, Rand und Bildschirmhelligkeit.
* Die App anzupassen, z.B. App-Startseite, Sprache und Farbthema etc. * Die App anzupassen, z.B. App-Startseite, Sprache und Farbthema etc.

View file

@ -1 +1 @@
QR-Codes mit einer einfachen Benutzeroberfläche scannen, erstellen und speichern Scannen, erstellen und speichern Sie QR-Codes mit einer einfachen Benutzeroberfläche und Erfahrung.

View file

@ -1,5 +0,0 @@
* 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.

View file

@ -1,4 +0,0 @@
* 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.

View file

@ -1 +0,0 @@
* Bug fix

View file

@ -1,3 +0,0 @@
* Support Ecosia
* Support CSV export
* Bug fix

View file

@ -1,2 +0,0 @@
* Support Open Food Facts
* Bug fix

View file

@ -1,3 +0,0 @@
* Support Russian language
* Allow user to manually save a record if auto logging is off
* Minor update on UI

View file

@ -1,4 +0,0 @@
* Upgrade framework, improve performance and fix known bugs
* Support Brave Search
* Support open URL automatically
* Allow user to further edit QR code content

View file

@ -1 +0,0 @@
* Fix import image issue

View file

@ -1,3 +0,0 @@
* Support geolocation QR code
* Support Portuguese (Brazil) language
* Disable auto URL opening by default

View file

@ -1,12 +1,12 @@
<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. <i>Simple QR</i> is a FOSS 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, Itanlian, Russian, Traditional Chinese and Simplified Chinese are supported. English, French, German, Traditional Chinese and Simplified Chinese are supported.
By using the app, you can: 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. * 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. * 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, Wi-Fi and Geolocation. * Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi.
* Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable. * 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 * Do tasks on the result with a tap, including but not limited to
* Use it as a keyword to do web search. * Use it as a keyword to do web search.
@ -14,11 +14,10 @@ By using the app, you can:
* Execute base64 encoding/decoding on it. * Execute base64 encoding/decoding on it.
* Generate a new shareable QR code by using it as the content. * Generate a new shareable QR code by using it as the content.
* Do corresponding tasks if it is a * Do corresponding tasks if it is a
* URL: Browse website / Open application * URL: Browse website
* vCard contact: Add contact * vCard contact: Add contact
* Phone number: Phone call, add contact * Phone number: Phone call, add contact
* Message: Send message, add contact * Message: Send message, add contact
* Email: Send email * Email: Send email
* Geolocation: Open map * Adjust the generated QR code, e.g. error correction level and screen brightness.
* 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. * Customize the app, e.g. app initial page, language and color theme etc.

View file

@ -1 +1 @@
Scan, create and store QR codes with a simple UI and experience Scan, create and store QR codes with a simple UI and experience.

View file

@ -1 +0,0 @@
Simple QR

2
ios/.gitignore vendored
View file

@ -1,9 +1,9 @@
App/build App/build
App/Pods App/Pods
App/Podfile.lock
App/App/public App/App/public
DerivedData DerivedData
xcuserdata xcuserdata
# Cordova plugins for Capacitor # Cordova plugins for Capacitor
capacitor-cordova-ios-plugins capacitor-cordova-ios-plugins

View file

@ -19,7 +19,6 @@
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference 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>"; }; 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>"; }; 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; }; 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -43,7 +42,6 @@
D208D0C0281849AE006217ED /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.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>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
@ -160,8 +158,6 @@
"zh-Hans", "zh-Hans",
de, de,
fr, fr,
it,
ru,
); );
mainGroup = 504EC2FB1FED79650016851F; mainGroup = 504EC2FB1FED79650016851F;
productRefGroup = 504EC3051FED79650016851F /* Products */; productRefGroup = 504EC3051FED79650016851F /* Products */;
@ -269,8 +265,6 @@
D208D0C0281849AE006217ED /* zh-Hans */, D208D0C0281849AE006217ED /* zh-Hans */,
D26FE7F9283D1E6C002A61AE /* fr */, D26FE7F9283D1E6C002A61AE /* fr */,
D26FE7FA283D1E76002A61AE /* de */, D26FE7FA283D1E76002A61AE /* de */,
D29D2E2A2847C31D00566DFF /* it */,
1B75189429375EAB00800D38 /* ru */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";
@ -327,7 +321,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -379,7 +373,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@ -397,9 +391,9 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = G23992CVBU; DEVELOPMENT_TEAM = G23992CVBU;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.1.0; MARKETING_VERSION = 2.7.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -420,9 +414,9 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = G23992CVBU; DEVELOPMENT_TEAM = G23992CVBU;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.1.0; MARKETING_VERSION = 2.7.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Simple QR"; PROVISIONING_PROFILE_SPECIFIER = "Simple QR";

View file

@ -46,6 +46,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) 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)
}
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -1,14 +1,116 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "AppIcon-512@2x.png", "size" : "20x20",
"idiom" : "universal", "idiom" : "iphone",
"platform" : "ios", "filename" : "AppIcon-20x20@2x.png",
"size" : "1024x1024" "scale" : "2x"
} },
], {
"info" : { "size" : "20x20",
"author" : "xcode", "idiom" : "iphone",
"version" : 1 "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"
} }
],
"info" : {
"version" : 1,
"author" : "xcode"
}
} }

View file

@ -22,6 +22,11 @@
<string>$(CURRENT_PROJECT_VERSION)</string> <string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>Simple QR uses Camera to scan barcodes</string> <string>Simple QR uses Camera to scan barcodes</string>
<key>NSContactsUsageDescription</key> <key>NSContactsUsageDescription</key>

View file

@ -1,6 +0,0 @@
"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";

View file

@ -1,6 +0,0 @@
"CFBundleDisplayName" = "Simple QR";
"CFBundleName" = "Simple QR";
"NSCameraUsageDescription" = "Simple QR использует камеру для сканирования QR-кода и штрих-кодов";
"NSContactsUsageDescription" = "Simple QR использует Контакты для добавления контакта";
"NSPhotoLibraryAddUsageDescription" = "Simple QR использует библиотеку фотографий для сохранения изображения QR-кода";
"NSPhotoLibraryUsageDescription" = "Simple QR использует библиотеку фотографий для импорта изображений и сканирования QR-кода.";

View file

@ -1,6 +1,4 @@
require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' platform :ios, '12.0'
platform :ios, '13.0'
use_frameworks! use_frameworks!
# workaround to avoid Xcode caching of Pods that requires # workaround to avoid Xcode caching of Pods that requires
@ -21,7 +19,6 @@ def capacitor_pods
pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem' pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem'
pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences'
pod 'CapacitorSplashScreen', :path => '../../node_modules/@capacitor/splash-screen' pod 'CapacitorSplashScreen', :path => '../../node_modules/@capacitor/splash-screen'
pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
pod 'CapacitorToast', :path => '../../node_modules/@capacitor/toast' pod 'CapacitorToast', :path => '../../node_modules/@capacitor/toast'
@ -32,8 +29,3 @@ target 'App' do
capacitor_pods capacitor_pods
# Add your Pods here # Add your Pods here
end end
post_install do |installer|
assertDeploymentTarget(installer)
end

View file

@ -1,112 +0,0 @@
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

24747
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,12 +1,12 @@
{ {
"name": "simple-qr", "name": "simple-qr",
"version": "4.1.0", "version": "2.7.0",
"author": "Tom Fong", "author": "Tom Fong",
"homepage": "https://tomfong.github.io",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"build:an": "ionic cap build android --prod --no-open", "build:an": "ionic cap build android --prod",
"build:ios": "ionic cap build ios --prod --no-open", "build:ios": "ionic cap build ios --prod",
"build": "ionic cap build android --prod --no-open && ionic cap build ios --prod --no-open",
"sync": "ionic cap sync --prod --no-build", "sync": "ionic cap sync --prod --no-build",
"copy:an": "ionic cap copy android --prod", "copy:an": "ionic cap copy android --prod",
"copy:ios": "ionic cap copy ios --prod", "copy:ios": "ionic cap copy ios --prod",
@ -16,90 +16,91 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^16.1.3", "@angular/animations": "^13.3.5",
"@angular/cdk": "^16.1.3", "@angular/cdk": "^13.3.5",
"@angular/common": "^16.1.3", "@angular/common": "^13.3.5",
"@angular/core": "^16.1.3", "@angular/core": "^13.3.5",
"@angular/forms": "^16.2.12", "@angular/forms": "^13.3.10",
"@angular/localize": "^16.2.12", "@angular/localize": "^13.3.10",
"@angular/material": "^16.1.3", "@angular/material": "^13.3.5",
"@angular/material-moment-adapter": "^16.2.14", "@angular/material-moment-adapter": "^13.3.8",
"@angular/platform-browser": "^16.1.3", "@angular/platform-browser": "^13.3.5",
"@angular/platform-browser-dynamic": "^16.2.12", "@angular/platform-browser-dynamic": "^13.3.10",
"@angular/router": "^16.2.12", "@angular/router": "^13.3.10",
"@awesome-cordova-plugins/aes-256": "^6.6.0", "@awesome-cordova-plugins/aes-256": "^5.43.0",
"@awesome-cordova-plugins/chooser": "^6.6.0", "@awesome-cordova-plugins/chooser": "^5.43.0",
"@awesome-cordova-plugins/core": "^6.6.0", "@awesome-cordova-plugins/core": "^5.43.0",
"@awesome-cordova-plugins/screen-orientation": "^6.6.0", "@awesome-cordova-plugins/screen-orientation": "^5.43.0",
"@awesome-cordova-plugins/sms": "^6.6.0", "@awesome-cordova-plugins/sms": "^5.43.0",
"@awesome-cordova-plugins/social-sharing": "^6.6.0", "@awesome-cordova-plugins/social-sharing": "^5.43.0",
"@awesome-cordova-plugins/theme-detection": "^6.6.0", "@awesome-cordova-plugins/theme-detection": "^5.43.0",
"@capacitor-community/barcode-scanner": "^4.0.1", "@capacitor-community/barcode-scanner": "^2.1.1",
"@capacitor-community/contacts": "^5.0.5", "@capacitor-community/contacts": "^1.1.3",
"@capacitor-community/screen-brightness": "^5.0.0", "@capacitor-community/screen-brightness": "^1.0.1",
"@capacitor/android": "^5.7.4", "@capacitor/android": "^3.5.1",
"@capacitor/app": "^5.0.7", "@capacitor/app": "^1.1.1",
"@capacitor/camera": "^5.0.9", "@capacitor/camera": "^1.3.1",
"@capacitor/clipboard": "^5.0.7", "@capacitor/clipboard": "^1.0.8",
"@capacitor/core": "^5.7.4", "@capacitor/core": "^3.5.1",
"@capacitor/device": "^5.0.7", "@capacitor/device": "^1.1.2",
"@capacitor/filesystem": "^5.2.1", "@capacitor/filesystem": "^1.1.0",
"@capacitor/haptics": "^5.0.7", "@capacitor/haptics": "^1.1.4",
"@capacitor/ios": "^5.7.4", "@capacitor/ios": "^3.5.1",
"@capacitor/keyboard": "^5.0.8", "@capacitor/keyboard": "^1.2.2",
"@capacitor/preferences": "^5.0.7", "@capacitor/splash-screen": "^1.2.2",
"@capacitor/splash-screen": "^5.0.7", "@capacitor/status-bar": "^1.0.8",
"@capacitor/status-bar": "^5.0.7", "@capacitor/toast": "^1.0.8",
"@capacitor/toast": "^5.0.7", "@ionic/angular": "^6.1.7",
"@ionic/angular": "^7.8.2", "@ionic/storage": "^3.0.6",
"@ionic/storage": "^4.0.0", "@ionic/storage-angular": "^3.0.6",
"@ionic/storage-angular": "^4.0.0", "@ng-bootstrap/ng-bootstrap": "^11.0.1",
"@ng-bootstrap/ng-bootstrap": "^15.1.2", "@ngx-translate/core": "^13.0.0",
"@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^6.0.0",
"@ngx-translate/http-loader": "^8.0.0", "@techiediaries/ngx-qrcode": "^9.1.0",
"angularx-qrcode": "^16.0.2", "bootstrap": "^4.6.1",
"bootstrap": "^5.3.3",
"cordova-plugin-aes256-encryption": "^2.0.1", "cordova-plugin-aes256-encryption": "^2.0.1",
"cordova-plugin-chooser": "^1.3.2", "cordova-plugin-chooser": "^1.3.2",
"cordova-plugin-screen-orientation": "^3.0.4", "cordova-plugin-screen-orientation": "^3.0.2",
"cordova-plugin-theme-detection": "^1.3.0", "cordova-plugin-theme-detection": "^1.3.0",
"cordova-plugin-x-socialsharing": "^6.0.4", "cordova-plugin-x-socialsharing": "^6.0.3",
"cordova-sms-plugin": "^1.0.3", "cordova-sms-plugin": "^1.0.2",
"date-fns": "2.29.3",
"es6-promise-plugin": "^4.2.2", "es6-promise-plugin": "^4.2.2",
"human-signals": "^2.1.0", "human-signals": "^2.1.0",
"jsqr": "^1.4.0", "jsqr": "^1.4.0",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"moment": "^2.29.3",
"osenv": "^0.1.5", "osenv": "^0.1.5",
"properties-parser": "^0.3.1", "properties-parser": "^0.3.1",
"rxjs": "^7.8.1", "rxjs": "^6.6.7",
"strip-final-newline": "^2.0.0", "strip-final-newline": "^2.0.0",
"tslib": "^2.6.2", "tslib": "^2.4.0",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"zone.js": "^0.13.3" "zone.js": "^0.11.5"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^16.2.13", "@angular-devkit/build-angular": "^13.3.7",
"@angular/cli": "^16.2.13", "@angular/cli": "^13.3.7",
"@angular/compiler": "^16.1.3", "@angular/compiler": "^13.3.5",
"@angular/compiler-cli": "^16.1.3", "@angular/compiler-cli": "^13.3.5",
"@angular/language-service": "^16.2.12", "@angular/language-service": "^13.3.10",
"@capacitor/cli": "^5.7.4", "@capacitor/cli": "^3.5.1",
"@ionic/angular-toolkit": "^9.0.0", "@ionic/angular-toolkit": "^6.1.0",
"@ionic/cli": "^7.2.0", "@types/jasmine": "^3.10.6",
"@types/jasmine": "^3.10.18", "@types/jasminewd2": "^2.0.10",
"@types/jasminewd2": "^2.0.13", "@types/node": "^12.20.52",
"@types/node": "^12.20.55",
"@types/uuid": "^8.3.4", "@types/uuid": "^8.3.4",
"codelyzer": "^6.0.2",
"jasmine-core": "~3.8.0", "jasmine-core": "~3.8.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"karma": "^6.4.3", "karma": "^6.3.20",
"karma-chrome-launcher": "^3.2.0", "karma-chrome-launcher": "^3.1.1",
"karma-coverage": "~2.0.3", "karma-coverage": "~2.0.3",
"karma-coverage-istanbul-reporter": "~3.0.2", "karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "^4.0.2", "karma-jasmine": "^4.0.2",
"karma-jasmine-html-reporter": "^1.7.0", "karma-jasmine-html-reporter": "^1.7.0",
"protractor": "~7.0.0",
"ts-node": "~8.3.0", "ts-node": "~8.3.0",
"typescript": "^5.1.6" "tslint": "~6.1.0",
"typescript": "~4.5.5"
} }
} }

View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 586 KiB

After

Width:  |  Height:  |  Size: 586 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 647 KiB

After

Width:  |  Height:  |  Size: 647 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 655 KiB

After

Width:  |  Height:  |  Size: 655 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 634 KiB

After

Width:  |  Height:  |  Size: 634 KiB

Before After
Before After

BIN
screenshots/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 KiB

View file

Before

Width:  |  Height:  |  Size: 734 KiB

After

Width:  |  Height:  |  Size: 734 KiB

Before After
Before After

BIN
screenshots/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

View file

@ -1,62 +1,57 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { NoPreloading, RouterModule, Routes } from '@angular/router'; import { NoPreloading, RouterModule, Routes } from '@angular/router';
import { CustomPreloadingStrategyService } from './services/custom-preloading-strategy.service'; import { CustomPreloadingStrategyService } from './services/custom-preloading-strategy.service';
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
data: { preload: true }, data: { preload: true },
loadChildren: () => import('./pages/tabs/tabs.module').then(m => m.TabsPageModule) loadChildren: () => import('./pages/tabs/tabs.module').then(m => m.TabsPageModule)
}, },
{ {
path: 'setting-language', path: 'setting-language',
loadChildren: () => import('./pages/setting-language/setting-language.module').then(m => m.SettingLanguagePageModule) loadChildren: () => import('./pages/setting-language/setting-language.module').then(m => m.SettingLanguagePageModule)
}, },
{ {
path: 'setting-color', path: 'setting-color',
loadChildren: () => import('./pages/setting-color/setting-color.module').then(m => m.SettingColorPageModule) loadChildren: () => import('./pages/setting-color/setting-color.module').then(m => m.SettingColorPageModule)
}, },
{ {
path: 'setting-record', path: 'setting-record',
loadChildren: () => import('./pages/setting-record/setting-record.module').then(m => m.SettingRecordPageModule) loadChildren: () => import('./pages/setting-record/setting-record.module').then(m => m.SettingRecordPageModule)
}, },
{ {
path: 'setting-search-engine', path: 'setting-search-engine',
loadChildren: () => import('./pages/setting-search-engine/setting-search-engine.module').then(m => m.SettingSearchEnginePageModule) loadChildren: () => import('./pages/setting-search-engine/setting-search-engine.module').then(m => m.SettingSearchEnginePageModule)
}, },
{ {
path: 'about', path: 'about',
loadChildren: () => import('./pages/about/about.module').then(m => m.AboutPageModule) loadChildren: () => import('./pages/about/about.module').then(m => m.AboutPageModule)
}, },
{ {
path: 'setting-vibration', path: 'setting-vibration',
loadChildren: () => import('./pages/setting-vibration/setting-vibration.module').then(m => m.SettingVibrationPageModule) loadChildren: () => import('./pages/setting-vibration/setting-vibration.module').then(m => m.SettingVibrationPageModule)
}, },
{ {
path: 'setting-debug', path: 'setting-debug',
loadChildren: () => import('./pages/setting-debug/setting-debug.module').then(m => m.SettingDebugPageModule) loadChildren: () => import('./pages/setting-debug/setting-debug.module').then(m => m.SettingDebugPageModule)
}, },
{ {
path: 'setting-orientation', path: 'setting-orientation',
loadChildren: () => import('./pages/setting-orientation/setting-orientation.module').then(m => m.SettingOrientationPageModule) loadChildren: () => import('./pages/setting-orientation/setting-orientation.module').then(m => m.SettingOrientationPageModule)
}, },
{ {
path: 'setting-qr', path: 'setting-qr-ecl',
loadChildren: () => import('./pages/setting-qr/setting-qr.module').then(m => m.SettingQrPageModule) loadChildren: () => import('./pages/setting-qr-ecl/setting-qr-ecl.module').then(m => m.SettingQrEclPageModule)
}, },
{ {
path: 'setting-auto-brightness', path: 'setting-auto-brightness',
loadChildren: () => import('./pages/setting-auto-brightness/setting-auto-brightness.module').then(m => m.SettingAutoBrightnessPageModule) loadChildren: () => import('./pages/setting-auto-brightness/setting-auto-brightness.module').then(m => m.SettingAutoBrightnessPageModule)
}, },
{ {
path: 'setting-auto-open-url', path: 'setting-start-page',
loadChildren: () => import('./pages/setting-auto-open-url/setting-auto-open-url.module').then(m => m.SettingAutoOpenUrlPageModule) loadChildren: () => import('./pages/setting-start-page/setting-start-page.module').then(m => m.SettingStartPagePageModule)
}, }, {
{
path: 'setting-start-page',
loadChildren: () => import('./pages/setting-start-page/setting-start-page.module').then(m => m.SettingStartPagePageModule)
},
{
path: 'setting-result', path: 'setting-result',
loadChildren: () => import('./pages/setting-result/setting-result.module').then( m => m.SettingResultPageModule) loadChildren: () => import('./pages/setting-result/setting-result.module').then( m => m.SettingResultPageModule)
}, },
@ -73,12 +68,12 @@ const routes: Routes = [
loadChildren: () => import('./pages/setting-auto-exit/setting-auto-exit.module').then( m => m.SettingAutoExitPageModule) loadChildren: () => import('./pages/setting-auto-exit/setting-auto-exit.module').then( m => m.SettingAutoExitPageModule)
}, },
]; ];
@NgModule({ @NgModule({
imports: [ imports: [
RouterModule.forRoot(routes, { preloadingStrategy: CustomPreloadingStrategyService }) RouterModule.forRoot(routes, { preloadingStrategy: CustomPreloadingStrategyService })
], ],
exports: [RouterModule] exports: [RouterModule]
}) })
export class AppRoutingModule { } export class AppRoutingModule { }

View file

@ -1,7 +1,4 @@
import { Component } from '@angular/core'; 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 { Platform } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { EnvService } from './services/env.service'; import { EnvService } from './services/env.service';
@ -20,29 +17,5 @@ export class AppComponent {
) { ) {
translate.addLangs(this.env.languages); translate.addLangs(this.env.languages);
translate.setDefaultLang('en'); 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
});
} }
} }

View file

@ -19,12 +19,14 @@ import { ScreenOrientation } from '@awesome-cordova-plugins/screen-orientation/n
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { HistoryTutorialPageModule } from './modals/history-tutorial/history-tutorial.module';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { EnvService } from './services/env.service'; import { EnvService } from './services/env.service';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { BookmarkTutorialPageModule } from './modals/bookmark-tutorial/bookmark-tutorial.module';
import { QrCodePageModule } from './modals/qr-code/qr-code.module'; import { QrCodePageModule } from './modals/qr-code/qr-code.module';
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
@ -37,7 +39,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
], ],
imports: [ imports: [
BrowserModule, BrowserModule,
IonicModule.forRoot({ innerHTMLTemplatesEnabled: true }), IonicModule.forRoot(),
AppRoutingModule, AppRoutingModule,
HttpClientModule, HttpClientModule,
FormsModule, FormsModule,
@ -49,6 +51,8 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
} }
}), }),
IonicStorageModule.forRoot(), IonicStorageModule.forRoot(),
HistoryTutorialPageModule,
BookmarkTutorialPageModule,
QrCodePageModule, QrCodePageModule,
BrowserAnimationsModule, BrowserAnimationsModule,
MatFormFieldModule, MatFormFieldModule,

View file

@ -0,0 +1,40 @@
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 {}

View file

@ -0,0 +1,53 @@
<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>

View file

@ -0,0 +1,18 @@
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;
}

View file

@ -0,0 +1,65 @@
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';
}
}
}

View file

@ -0,0 +1,39 @@
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 {}

View file

@ -0,0 +1,53 @@
<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>

View file

@ -0,0 +1,18 @@
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;
}

View file

@ -0,0 +1,65 @@
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';
}
}
}

View file

@ -8,7 +8,11 @@ import { QrCodePage } from './qr-code.page';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader'; import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { QRCodeModule } from 'angularx-qrcode'; 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';
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, './assets/i18n/', '.json'); return new TranslateHttpLoader(http, './assets/i18n/', '.json');
@ -19,7 +23,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
CommonModule, CommonModule,
FormsModule, FormsModule,
IonicModule, IonicModule,
QRCodeModule, NgxQRCodeModule,
TranslateModule.forChild({ TranslateModule.forChild({
loader: { loader: {
provide: TranslateLoader, provide: TranslateLoader,

Some files were not shown because too many files have changed in this diff Show more