mirror of
https://github.com/tomfong/simple-qr.git
synced 2025-06-29 04:30:03 +00:00
commit
07b99da79c
43 changed files with 3948 additions and 3424 deletions
26
README.md
26
README.md
|
@ -105,15 +105,9 @@ You are welcomed to help translate the app into more languages (refer to this <a
|
|||
|
||||
### Build the project (Android)
|
||||
|
||||
1. Run ```npm install``` to install all dependencies
|
||||
2. Run ```npm run sync``` and ```npm run copy:an```
|
||||
3. 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>
|
||||
```
|
||||
1. Run ```npm install``` to install all dependencies.
|
||||
2. Run ```npm run build:an``` or ```npm run build:ios``` (for first time).
|
||||
3. Run ```npm run sync``` and ```npm run copy:an``` or ```npm run copy:ios```.
|
||||
|
||||
### Contributors
|
||||
|
||||
|
@ -128,16 +122,16 @@ Thank you the following contributors who have made the app better!
|
|||
|
||||
```sh
|
||||
Ionic CLI : 6.20.1
|
||||
Ionic Framework : @ionic/angular 6.2.7
|
||||
@angular-devkit/build-angular : 13.3.9
|
||||
Ionic Framework : @ionic/angular 6.2.8
|
||||
@angular-devkit/build-angular : 14.2.3
|
||||
@angular-devkit/schematics : 13.3.9
|
||||
@angular/cli : 13.3.9
|
||||
@angular/cli : 14.2.3
|
||||
@ionic/angular-toolkit : 6.1.0
|
||||
|
||||
Capacitor CLI : 3.8.0
|
||||
@capacitor/android : 3.8.0
|
||||
@capacitor/core : 3.8.0
|
||||
@capacitor/ios : 3.8.0
|
||||
Capacitor CLI : 4.3.0
|
||||
@capacitor/android : 4.3.0
|
||||
@capacitor/core : 4.3.0
|
||||
@capacitor/ios : 4.3.0
|
||||
|
||||
NodeJS : v16.15.1
|
||||
npm : 8.11.0
|
||||
|
|
7
android/.idea/misc.xml
generated
7
android/.idea/misc.xml
generated
|
@ -1,5 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DesignSurface">
|
||||
<option name="filePathToZoomLevelMap">
|
||||
<map>
|
||||
<entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.2485" />
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
|
|
|
@ -6,8 +6,8 @@ android {
|
|||
applicationId "com.tomfong.simpleqr"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2080000
|
||||
versionName "2.8.0"
|
||||
versionCode 3000000
|
||||
versionName "3.0.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 +30,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_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,13 +15,23 @@
|
|||
<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_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-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||
</manifest>
|
||||
|
|
|
@ -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,61 @@
|
|||
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 {
|
||||
|
||||
// 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
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>
|
|
@ -9,14 +9,13 @@
|
|||
<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</item>
|
||||
</style>
|
||||
</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</item>
|
||||
</style>
|
||||
</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</item>
|
||||
</style>
|
||||
</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</item>
|
||||
</style>
|
||||
</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</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:7.2.1'
|
||||
classpath 'com.google.gms:google-services:4.3.13'
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
|
|
|
@ -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-7.4.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 = 32
|
||||
targetSdkVersion = 32
|
||||
androidxActivityVersion = '1.4.0'
|
||||
androidxAppCompatVersion = '1.4.2'
|
||||
androidxCoordinatorLayoutVersion = '1.2.0'
|
||||
androidxCoreVersion = '1.8.0'
|
||||
androidxFragmentVersion = '1.4.1'
|
||||
junitVersion = '4.13.2'
|
||||
androidxJunitVersion = '1.1.3'
|
||||
androidxEspressoCoreVersion = '3.4.0'
|
||||
cordovaAndroidVersion = '10.1.1'
|
||||
coreSplashScreenVersion = '1.0.0-rc01'
|
||||
androidxWebkitVersion = '1.4.0'
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"defaultProject": "app",
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"app": {
|
||||
|
@ -162,7 +161,10 @@
|
|||
}
|
||||
},
|
||||
"cli": {
|
||||
"defaultCollection": "@ionic/angular-toolkit"
|
||||
"schematicCollections": [
|
||||
"@ionic/angular-toolkit"
|
||||
],
|
||||
"analytics": false
|
||||
},
|
||||
"schematics": {
|
||||
"@ionic/angular-toolkit:component": {
|
||||
|
|
4
fastlane/metadata/android/en-US/changelogs/3000000.txt
Normal file
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.
|
|
@ -324,7 +324,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;
|
||||
|
@ -376,7 +376,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";
|
||||
|
@ -394,9 +394,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.8.0;
|
||||
MARKETING_VERSION = 3.0.0;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -417,9 +417,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.8.0;
|
||||
MARKETING_VERSION = 3.0.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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
@ -29,3 +31,8 @@ target 'App' do
|
|||
capacitor_pods
|
||||
# Add your Pods here
|
||||
end
|
||||
|
||||
|
||||
post_install do |installer|
|
||||
assertDeploymentTarget(installer)
|
||||
end
|
||||
|
|
6659
package-lock.json
generated
6659
package-lock.json
generated
File diff suppressed because it is too large
Load diff
74
package.json
74
package.json
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "simple-qr",
|
||||
"version": "2.8.0",
|
||||
"version": "3.0.0",
|
||||
"author": "Tom Fong",
|
||||
"homepage": "https://tomfong.github.io",
|
||||
"scripts": {
|
||||
|
@ -16,17 +16,17 @@
|
|||
},
|
||||
"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.11",
|
||||
"@angular/localize": "^13.3.11",
|
||||
"@angular/material": "^13.3.5",
|
||||
"@angular/material-moment-adapter": "^13.3.9",
|
||||
"@angular/platform-browser": "^13.3.5",
|
||||
"@angular/platform-browser-dynamic": "^13.3.11",
|
||||
"@angular/router": "^13.3.11",
|
||||
"@angular/animations": "^14.2.3",
|
||||
"@angular/cdk": "^14.2.2",
|
||||
"@angular/common": "^14.2.3",
|
||||
"@angular/core": "^14.2.3",
|
||||
"@angular/forms": "^14.2.3",
|
||||
"@angular/localize": "^14.2.3",
|
||||
"@angular/material": "^14.2.2",
|
||||
"@angular/material-moment-adapter": "^14.2.2",
|
||||
"@angular/platform-browser": "^14.2.3",
|
||||
"@angular/platform-browser-dynamic": "^14.2.3",
|
||||
"@angular/router": "^14.2.3",
|
||||
"@awesome-cordova-plugins/aes-256": "^5.45.0",
|
||||
"@awesome-cordova-plugins/chooser": "^5.45.0",
|
||||
"@awesome-cordova-plugins/core": "^5.45.0",
|
||||
|
@ -34,23 +34,23 @@
|
|||
"@awesome-cordova-plugins/sms": "^5.45.0",
|
||||
"@awesome-cordova-plugins/social-sharing": "^5.45.0",
|
||||
"@awesome-cordova-plugins/theme-detection": "^5.45.0",
|
||||
"@capacitor-community/barcode-scanner": "^2.1.1",
|
||||
"@capacitor-community/contacts": "^1.1.3",
|
||||
"@capacitor-community/screen-brightness": "^1.0.1",
|
||||
"@capacitor/android": "^3.8.0",
|
||||
"@capacitor/app": "^1.1.1",
|
||||
"@capacitor/camera": "^1.3.1",
|
||||
"@capacitor/clipboard": "^1.0.8",
|
||||
"@capacitor/core": "^3.8.0",
|
||||
"@capacitor/device": "^1.1.2",
|
||||
"@capacitor/filesystem": "^1.1.0",
|
||||
"@capacitor/haptics": "^1.1.4",
|
||||
"@capacitor/ios": "^3.8.0",
|
||||
"@capacitor/keyboard": "^1.2.3",
|
||||
"@capacitor/splash-screen": "^1.2.2",
|
||||
"@capacitor/status-bar": "^1.0.8",
|
||||
"@capacitor/toast": "^1.0.8",
|
||||
"@ionic/angular": "^6.2.7",
|
||||
"@capacitor-community/barcode-scanner": "^3.0.0",
|
||||
"@capacitor-community/contacts": "^2.0.0-0",
|
||||
"@capacitor-community/screen-brightness": "^2.0.0-0",
|
||||
"@capacitor/android": "^4.3.0",
|
||||
"@capacitor/app": "^4.0.1",
|
||||
"@capacitor/camera": "^4.1.1",
|
||||
"@capacitor/clipboard": "^4.0.1",
|
||||
"@capacitor/core": "^4.3.0",
|
||||
"@capacitor/device": "^4.0.1",
|
||||
"@capacitor/filesystem": "^4.1.1",
|
||||
"@capacitor/haptics": "^4.0.1",
|
||||
"@capacitor/ios": "^4.3.0",
|
||||
"@capacitor/keyboard": "^4.0.1",
|
||||
"@capacitor/splash-screen": "^4.0.1",
|
||||
"@capacitor/status-bar": "^4.0.1",
|
||||
"@capacitor/toast": "^4.0.1",
|
||||
"@ionic/angular": "^6.2.8",
|
||||
"@ionic/storage": "^3.0.6",
|
||||
"@ionic/storage-angular": "^3.0.6",
|
||||
"@ng-bootstrap/ng-bootstrap": "^11.0.1",
|
||||
|
@ -78,12 +78,12 @@
|
|||
"zone.js": "^0.11.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^13.3.9",
|
||||
"@angular/cli": "^13.3.9",
|
||||
"@angular/compiler": "^13.3.5",
|
||||
"@angular/compiler-cli": "^13.3.5",
|
||||
"@angular/language-service": "^13.3.11",
|
||||
"@capacitor/cli": "^3.8.0",
|
||||
"@angular-devkit/build-angular": "^14.2.3",
|
||||
"@angular/cli": "^14.2.3",
|
||||
"@angular/compiler": "^14.2.3",
|
||||
"@angular/compiler-cli": "^14.2.3",
|
||||
"@angular/language-service": "^14.2.3",
|
||||
"@capacitor/cli": "^4.3.0",
|
||||
"@ionic/angular-toolkit": "^6.1.0",
|
||||
"@types/jasmine": "^3.10.6",
|
||||
"@types/jasminewd2": "^2.0.10",
|
||||
|
@ -92,7 +92,7 @@
|
|||
"codelyzer": "^6.0.2",
|
||||
"jasmine-core": "~3.8.0",
|
||||
"jasmine-spec-reporter": "~5.0.0",
|
||||
"karma": "^6.4.0",
|
||||
"karma": "^6.4.1",
|
||||
"karma-chrome-launcher": "^3.1.1",
|
||||
"karma-coverage": "~2.0.3",
|
||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||
|
@ -101,6 +101,6 @@
|
|||
"protractor": "~7.0.0",
|
||||
"ts-node": "~8.3.0",
|
||||
"tslint": "~6.1.0",
|
||||
"typescript": "~4.5.5"
|
||||
"typescript": "~4.8.3"
|
||||
}
|
||||
}
|
|
@ -1,3 +1,7 @@
|
|||
<ion-header class="ion-no-border">
|
||||
<ion-toolbar [color]="color">
|
||||
</ion-toolbar>
|
||||
</ion-header>
|
||||
<ion-content [color]="color" #content>
|
||||
|
||||
<ion-list-header class="mt-4 ml-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
<ion-header class="ion-no-border">
|
||||
<ion-toolbar [color]="color">
|
||||
</ion-toolbar>
|
||||
</ion-header>
|
||||
<ion-content [color]="color" #content>
|
||||
|
||||
<ion-list-header class="mt-4 ml-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
|
|
|
@ -96,7 +96,7 @@
|
|||
<ng-container
|
||||
*ngIf="segmentModel === 'history' && env.viewingScanRecords && env.viewingScanRecords.length > 0 && !isLoading">
|
||||
<ion-list>
|
||||
<ion-list-header class="ion-padding-horizontal" lines="full">
|
||||
<ion-list-header class="ion-padding-horizontal" lines="none" *ngIf="env.showNumberOfRecords == 'on'">
|
||||
<div class="ion-padding-horizontal" *ngIf="env.recordsLimit !== -1">
|
||||
{{ 'NUMBER_OF_RECORDS' | translate }}: {{ env.scanRecords.length }} / {{ denominator }}
|
||||
</div>
|
||||
|
|
|
@ -258,27 +258,11 @@ export class ResultPage {
|
|||
} as NewContact;
|
||||
}
|
||||
if (newContact != null) {
|
||||
if (this.platform.is('ios')) {
|
||||
await Contacts.getPermissions().then(
|
||||
async permission => {
|
||||
if (permission.granted) {
|
||||
await Contacts.saveContact(newContact).then(
|
||||
_ => {
|
||||
if (this.isIOS) {
|
||||
this.presentToast(this.translate.instant('MSG.SAVED_CONTACT'), "short", "bottom");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
}
|
||||
)
|
||||
.catch(
|
||||
err => {
|
||||
if (this.env.isDebugging) {
|
||||
this.presentToast("Error when call Contacts.saveContact: " + JSON.stringify(err), "long", "top");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.FAILED_SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
}
|
||||
)
|
||||
await this.saveContact(newContact);
|
||||
} else {
|
||||
const alert = await this.alertController.create({
|
||||
header: this.translate.instant("PERMISSION_REQUIRED"),
|
||||
|
@ -304,8 +288,31 @@ export class ResultPage {
|
|||
}
|
||||
}
|
||||
);
|
||||
} else { // Android doesn't need to get permission
|
||||
await this.saveContact(newContact);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async saveContact(newContact: any) {
|
||||
await Contacts.saveContact(newContact).then(
|
||||
_ => {
|
||||
if (this.isIOS) {
|
||||
this.presentToast(this.translate.instant('MSG.SAVED_CONTACT'), "short", "bottom");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
}
|
||||
).catch(
|
||||
err => {
|
||||
if (this.env.isDebugging) {
|
||||
this.presentToast("Error when call Contacts.saveContact: " + JSON.stringify(err), "long", "top");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.FAILED_SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async callPhone(): Promise<void> {
|
||||
window.open(this.qrCodeContent);
|
||||
|
|
|
@ -21,29 +21,17 @@
|
|||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-radio-group [(ngModel)]="env.autoMaxBrightness" (ionChange)="saveAutoMaxBrightness()">
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_ON' | translate }}
|
||||
{{ (env.autoMaxBrightness == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'on'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.autoMaxBrightness == 'on'? true : false"
|
||||
(ngModelChange)="onAutoMaxBrightnessChange($event)">
|
||||
</ion-toggle>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_OFF' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'off'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
|
||||
</ion-content>
|
|
@ -1,5 +1,6 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
|
||||
@Component({
|
||||
|
@ -17,4 +18,20 @@ export class SettingAutoBrightnessPage {
|
|||
await this.env.storageSet("auto-max-brightness", this.env.autoMaxBrightness);
|
||||
}
|
||||
|
||||
async onAutoMaxBrightnessChange(ev: any) {
|
||||
this.env.autoMaxBrightness = ev ? 'on' : 'off';
|
||||
await this.env.storageSet("auto-max-brightness", this.env.autoMaxBrightness);
|
||||
await this.tapHaptic();
|
||||
}
|
||||
|
||||
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" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,30 +53,18 @@
|
|||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-radio-group [(ngModel)]="env.scanRecordLogging" (ionChange)="saveScanRecord()">
|
||||
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding-horizontal pre-line">
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_ON' | translate }}
|
||||
{{ (env.scanRecordLogging == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'on'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.scanRecordLogging == 'on'? true : false"
|
||||
(ngModelChange)="onScanRecordLoggingChange($event)">
|
||||
</ion-toggle>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding-horizontal pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_OFF' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'off'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
</div>
|
||||
|
||||
<div class="ion-padding-vertical">
|
||||
|
@ -136,6 +124,18 @@
|
|||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
<ion-item class="ion-no-padding ripple-parent py-1 pt-2" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding-horizontal pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'SHOW_NUMBER_OR_RECORDS' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.showNumberOfRecords == 'on'? true : false"
|
||||
(ngModelChange)="onShowNumberOfRecordsChange($event)">
|
||||
</ion-toggle>
|
||||
</ion-item>
|
||||
</div>
|
||||
|
||||
<div class="ion-padding-vertical mb-2">
|
||||
|
|
|
@ -11,6 +11,7 @@ import { Chooser, ChooserResult } from '@awesome-cordova-plugins/chooser/ngx';
|
|||
import { ScanRecord } from 'src/app/models/scan-record';
|
||||
import { Bookmark } from 'src/app/models/bookmark';
|
||||
import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
|
||||
@Component({
|
||||
selector: 'app-setting-record',
|
||||
|
@ -44,8 +45,10 @@ export class SettingRecordPage {
|
|||
await this.env.storageSet("history-page-start-segment", this.env.historyPageStartSegment);
|
||||
}
|
||||
|
||||
async saveScanRecord() {
|
||||
async onScanRecordLoggingChange(ev: any) {
|
||||
this.env.scanRecordLogging = ev ? 'on' : 'off';
|
||||
await this.env.storageSet("scan-record-logging", this.env.scanRecordLogging);
|
||||
await this.tapHaptic();
|
||||
}
|
||||
|
||||
async saveRecordsLimit() {
|
||||
|
@ -55,6 +58,12 @@ export class SettingRecordPage {
|
|||
}
|
||||
}
|
||||
|
||||
async onShowNumberOfRecordsChange(ev: any) {
|
||||
this.env.showNumberOfRecords = ev ? 'on' : 'off';
|
||||
await this.env.storageSet("showNumberOfRecords", this.env.showNumberOfRecords);
|
||||
await this.tapHaptic();
|
||||
}
|
||||
|
||||
async onBackup() {
|
||||
const loading1 = await this.presentLoading(this.translate.instant("ENCRYPTING"));
|
||||
const backup = {
|
||||
|
@ -302,6 +311,17 @@ export class SettingRecordPage {
|
|||
return loading;
|
||||
}
|
||||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
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" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
get isIOS() {
|
||||
return this.platform.is('ios');
|
||||
}
|
||||
|
|
|
@ -110,28 +110,17 @@
|
|||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-radio-group [(ngModel)]="env.startPageHeader" (ionChange)="saveStartPageHeader()">
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_ON' | translate }}
|
||||
{{ (env.startPageHeader == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'on'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.startPageHeader == 'on'? true : false"
|
||||
(ngModelChange)="onStartPageHeaderChange($event)">
|
||||
</ion-toggle>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'TURN_OFF' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'off'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
|
||||
</ion-content>
|
|
@ -1,4 +1,6 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { fadeIn } from 'src/app/utils/animations';
|
||||
|
||||
|
@ -18,7 +20,21 @@ export class SettingStartPagePage {
|
|||
await this.env.storageSet("start-page", this.env.startPage);
|
||||
}
|
||||
|
||||
async saveStartPageHeader() {
|
||||
async onStartPageHeaderChange(ev: any) {
|
||||
this.env.startPageHeader = ev ? 'on' : 'off';
|
||||
await this.env.storageSet("start-page-header", this.env.startPageHeader);
|
||||
await this.tapHaptic();
|
||||
}
|
||||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
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" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { SplashScreen } from '@capacitor/splash-screen';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { AlertController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -59,10 +60,11 @@ export class TabsPage {
|
|||
}
|
||||
|
||||
async ionViewDidEnter() {
|
||||
await SplashScreen.hide()
|
||||
if (this.env.firstAppLoad) {
|
||||
this.env.firstAppLoad = false;
|
||||
await this.loadPatchNote();
|
||||
await this.router.navigate([this.env.startPage], { replaceUrl: true });
|
||||
await this.loadPatchNote();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,6 +81,8 @@ export class TabsPage {
|
|||
if (this.env.notShowUpdateNotes === false) {
|
||||
this.env.notShowUpdateNotes = true;
|
||||
await this.showUpdateNotes();
|
||||
const versionWording = this.translate.instant("VERSION_VERSION") as string;
|
||||
await this.presentToast(versionWording.replace("{version}", this.env.appVersionNumber), "short", 'bottom');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
@ -20,7 +20,7 @@ export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'zh-CN' | 'zh-HK'
|
|||
})
|
||||
export class EnvService {
|
||||
|
||||
public appVersionNumber: string = '2.8.0';
|
||||
public appVersionNumber: string = '3.0.0';
|
||||
|
||||
public startPage: "/tabs/scan" | "/tabs/generate" | "/tabs/import-image" | "/tabs/history" | "/tabs/setting" = "/tabs/scan";
|
||||
public historyPageStartSegment: 'history' | 'bookmarks' = 'history';
|
||||
|
@ -32,6 +32,7 @@ export class EnvService {
|
|||
public selectedColorTheme: 'default' | 'light' | 'dark' | 'black' = 'default';
|
||||
public scanRecordLogging: 'on' | 'off' = 'on';
|
||||
public recordsLimit: 30 | 50 | 100 | -1 = -1;
|
||||
public showNumberOfRecords: 'on' | 'off' = 'on';
|
||||
public autoMaxBrightness: 'on' | 'off' = 'on';
|
||||
public errorCorrectionLevel: 'L' | 'M' | 'Q' | 'H' = 'M';
|
||||
public qrCodeLightR: number = 255;
|
||||
|
@ -78,10 +79,10 @@ export class EnvService {
|
|||
public readonly APP_STORE_URL: string = "https://apps.apple.com/us/app/simple-qr-by-tom-fong/id1621121553";
|
||||
public readonly GITHUB_RELEASE_URL: string = "https://github.com/tomfong/simple-qr/releases";
|
||||
public readonly PRIVACY_POLICY: string = "https://www.privacypolicies.com/live/771b1123-99bb-4bfe-815e-1046c0437a0f";
|
||||
public readonly AN_PREV_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20700";
|
||||
public readonly IOS_PREV_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20700";
|
||||
public readonly AN_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20800";
|
||||
public readonly IOS_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20800";
|
||||
public readonly AN_PREV_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20800";
|
||||
public readonly IOS_PREV_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v20800";
|
||||
public readonly AN_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v30000";
|
||||
public readonly IOS_PATCH_NOTE_STORAGE_KEY = "not-show-update-notes-v30000";
|
||||
|
||||
private _storage: Storage | null = null;
|
||||
private _scannedData: string = '';
|
||||
|
@ -267,6 +268,15 @@ export class EnvService {
|
|||
}
|
||||
}
|
||||
);
|
||||
this._storage.get("showNumberOfRecords").then(
|
||||
value => {
|
||||
if (value !== null && value !== undefined) {
|
||||
this.showNumberOfRecords = value;
|
||||
} else {
|
||||
this.showNumberOfRecords = 'on';
|
||||
}
|
||||
}
|
||||
);
|
||||
this._storage.get("vibration").then(
|
||||
value => {
|
||||
if (value !== null && value !== undefined) {
|
||||
|
@ -562,6 +572,7 @@ export class EnvService {
|
|||
await this.toggleColorTheme();
|
||||
this.scanRecordLogging = 'on';
|
||||
this.recordsLimit = -1;
|
||||
this.showNumberOfRecords = 'on';
|
||||
this.autoMaxBrightness = 'on';
|
||||
this.errorCorrectionLevel = 'M';
|
||||
this.qrCodeLightR = 255;
|
||||
|
@ -630,6 +641,9 @@ export class EnvService {
|
|||
this.recordsLimit = -1;
|
||||
await this.storageSet("recordsLimit", this.recordsLimit);
|
||||
|
||||
this.showNumberOfRecords = 'on';
|
||||
await this.storageSet("showNumberOfRecords", this.showNumberOfRecords);
|
||||
|
||||
this.autoMaxBrightness = 'on';
|
||||
await this.storageSet("auto-max-brightness", this.autoMaxBrightness);
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@
|
|||
"NOT_PROVIDED": "Nicht vorgesehen",
|
||||
"NOT_TO_DISCLOSE": "Nicht bekannt geben",
|
||||
"NO_LIMIT": "Keine Begrenzung",
|
||||
"NUMBER_OF_RECORDS": "Anzahl der Aufzeichnungen",
|
||||
"NUMBER_OF_RECORDS": "Anzahl der Datensätze",
|
||||
"OK": "OK",
|
||||
"ONLY_DELETE_DATA": "Nur Daten löschen",
|
||||
"ONLY_RESET_SETTING": "Nur Einstellung zurücksetzen",
|
||||
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "Teile",
|
||||
"SHARING": "Teilen",
|
||||
"SHOW": "Zeige",
|
||||
"SHOW_NUMBER_OR_RECORDS": "Zeige die Anzahl der Datensätze an",
|
||||
"SHOW_QR_CODE": "Zeige QR Code",
|
||||
"SIMPLE_QR": "Simple QR",
|
||||
"STATE": "Staat",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "Aufgaben-Schaltflächen-Layout",
|
||||
"TURN_OFF": "Ausschalten",
|
||||
"TURN_ON": "Anschalten",
|
||||
"TURNED_OFF": "Ausgeschaltet",
|
||||
"TURNED_ON": "Angeschaltet",
|
||||
"TUTORIAL": "Anleitung",
|
||||
"UNDO": "Rückgängig",
|
||||
"UNKNOWN": "Unbekannt",
|
||||
"UPDATE_SUCCESSFULLY": "Erfolgreich aktualisiert",
|
||||
"URL": "URL",
|
||||
"VCARD_CONTACT": "vCard Kontakt",
|
||||
"VERSION_VERSION": "Version {version}",
|
||||
"VIBRATION": "Vibration",
|
||||
"VIEWED": "Gesehen",
|
||||
"VIEW_BOOKMARK": "Lesezeichen ansehen",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "Universeller Produktcode "
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "Diese Version bringt Ihnen mehrere Updates und neue Funktionen. Bitte überprüfen Sie GitHub für Details.",
|
||||
"UPDATE_NOTES_ANDROID": "<p>Diese Version bringt Ihnen mehrere Updates und neue Funktionen. Bitte überprüfen Sie GitHub für Details.</p><p>Android-Benutzer können jetzt die Kachel Simple QR im Bereich Schnelleinstellungen für einen schnellen Zugriff aktivieren.</p>",
|
||||
"UPDATE_NOTES_IOS": "Diese Version bringt Ihnen mehrere Updates und neue Funktionen. Bitte überprüfen Sie GitHub für Details."
|
||||
}
|
||||
}
|
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "Share",
|
||||
"SHARING": "Sharing",
|
||||
"SHOW": "Show",
|
||||
"SHOW_NUMBER_OR_RECORDS": "Show Number of Records",
|
||||
"SHOW_QR_CODE": "Show QR Code",
|
||||
"SIMPLE_QR": "Simple QR",
|
||||
"STATE": "State",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "Task Button Layout",
|
||||
"TURN_OFF": "Turn Off",
|
||||
"TURN_ON": "Turn On",
|
||||
"TURNED_OFF": "Turned Off",
|
||||
"TURNED_ON": "Turned On",
|
||||
"TUTORIAL": "Tutorial",
|
||||
"UNDO": "Undo",
|
||||
"UNKNOWN": "Unknown",
|
||||
"UPDATE_SUCCESSFULLY": "Update Successfully",
|
||||
"URL": "URL",
|
||||
"VCARD_CONTACT": "vCard Contact",
|
||||
"VERSION_VERSION": "Version {version}",
|
||||
"VIBRATION": "Vibration",
|
||||
"VIEWED": "Viewed",
|
||||
"VIEW_BOOKMARK": "View Bookmark",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "Universal Product Code "
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "This release brings you several updates and new features. Please check GitHub for details.",
|
||||
"UPDATE_NOTES_ANDROID": "<p>This release brings you several updates and new features. Please check GitHub for details.</p><p>Android users can now enable the Simple QR tile in the Quick Settings panel for quick access.</p>",
|
||||
"UPDATE_NOTES_IOS": "This release brings you several updates and new features. Please check GitHub for details."
|
||||
}
|
||||
}
|
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "Partager",
|
||||
"SHARING": "Partager",
|
||||
"SHOW": "Afficher",
|
||||
"SHOW_NUMBER_OR_RECORDS": "Afficher le nombre d'enregistrements",
|
||||
"SHOW_QR_CODE": "Afficher le code QR",
|
||||
"SIMPLE_QR": "Simple QR",
|
||||
"STATE": "Etat",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "Disposition des boutons de tâche",
|
||||
"TURN_OFF": "Éteindre",
|
||||
"TURN_ON": "Allumer",
|
||||
"TURNED_OFF": "Désactivé",
|
||||
"TURNED_ON": "Activée",
|
||||
"TUTORIAL": "Didacticiel",
|
||||
"UNDO": "Annuler",
|
||||
"UNKNOWN": "Inconnu",
|
||||
"UPDATE_SUCCESSFULLY": "Mise à jour réussie",
|
||||
"URL": "URL",
|
||||
"VCARD_CONTACT": "Contact vCard",
|
||||
"VERSION_VERSION": "Version {version}",
|
||||
"VIBRATION": "Vibration",
|
||||
"VIEWED": "Vu",
|
||||
"VIEW_BOOKMARK": "Afficher le signet",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "Code produit universel"
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "Cette version vous apporte plusieurs mises à jour et nouvelles fonctionnalités. Veuillez consulter GitHub pour plus de détails.",
|
||||
"UPDATE_NOTES_ANDROID": "<p>Cette version vous apporte plusieurs mises à jour et nouvelles fonctionnalités. Veuillez consulter GitHub pour plus de détails.</p><p>Les utilisateurs d'Android peuvent désormais activer la vignette Simple QR dans le panneau Paramètres rapides pour un accès rapide.</p>",
|
||||
"UPDATE_NOTES_IOS": "Cette version vous apporte plusieurs mises à jour et nouvelles fonctionnalités. Veuillez consulter GitHub pour plus de détails."
|
||||
}
|
||||
}
|
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "Condividi",
|
||||
"SHARING": "Condividendo",
|
||||
"SHOW": "Mostra",
|
||||
"SHOW_NUMBER_OR_RECORDS": "Mostra il numero di record",
|
||||
"SHOW_QR_CODE": "Mostra il Codice QR",
|
||||
"SIMPLE_QR": "Simple QR",
|
||||
"STATE": "Stato",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "Disposizione Pulsante Operazione",
|
||||
"TURN_OFF": "Spegni",
|
||||
"TURN_ON": "Accendi",
|
||||
"TURNED_OFF": "Spento",
|
||||
"TURNED_ON": "Acceso",
|
||||
"TUTORIAL": "Guida",
|
||||
"UNDO": "Annulla",
|
||||
"UNKNOWN": "Sconosciuto",
|
||||
"UPDATE_SUCCESSFULLY": "Aggiornamento completato con successo",
|
||||
"URL": "URL",
|
||||
"VCARD_CONTACT": "Contatto vCard",
|
||||
"VERSION_VERSION": "Versione {version}",
|
||||
"VIBRATION": "Vibrazione",
|
||||
"VIEWED": "Visualizzati",
|
||||
"VIEW_BOOKMARK": "Visualizza segnalibri",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "Codice Prodotto Universale "
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "Questa versione offre numerosi aggiornamenti e nuove funzionalità. Si prega di controllare GitHub per i dettagli.",
|
||||
"UPDATE_NOTES_ANDROID": "<p>Questa versione offre numerosi aggiornamenti e nuove funzionalità. Si prega di controllare GitHub per i dettagli.</p><p>Gli utenti Android possono ora abilitare il riquadro Simple QR nel pannello Impostazioni rapide per un rapido accesso.</p>",
|
||||
"UPDATE_NOTES_IOS": "Questa versione offre numerosi aggiornamenti e nuove funzionalità. Si prega di controllare GitHub per i dettagli."
|
||||
}
|
||||
}
|
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "分享",
|
||||
"SHARING": "正在分享",
|
||||
"SHOW": "显示",
|
||||
"SHOW_NUMBER_OR_RECORDS": "显示记录数量",
|
||||
"SHOW_QR_CODE": "显示 QR 码",
|
||||
"SIMPLE_QR": "简易QR",
|
||||
"STATE": "州",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "行动按键布局",
|
||||
"TURN_OFF": "关闭",
|
||||
"TURN_ON": "开启",
|
||||
"TURNED_OFF": "已关闭",
|
||||
"TURNED_ON": "已开启",
|
||||
"TUTORIAL": "教学",
|
||||
"UNDO": "复原",
|
||||
"UNKNOWN": "未知",
|
||||
"UPDATE_SUCCESSFULLY": "更新成功",
|
||||
"URL": "网址",
|
||||
"VCARD_CONTACT": "vCard 联络人",
|
||||
"VERSION_VERSION": "版本 {version}",
|
||||
"VIBRATION": "震动效果",
|
||||
"VIEWED": "查看",
|
||||
"VIEW_BOOKMARK": "查看书签",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "通用产品代码"
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "此版本为您带来多项更新和新功能,详情请查看 GitHub。",
|
||||
"UPDATE_NOTES_ANDROID": "<p>此版本为您带来多项更新和新功能,详情请查看 GitHub。</p><p>Android 用户现在可以在快速设定面板中加入简易 QR 按键以进行快速启动。</p>",
|
||||
"UPDATE_NOTES_IOS": "此版本为您带来多项更新和新功能,详情请查看 GitHub。"
|
||||
}
|
||||
}
|
|
@ -172,6 +172,7 @@
|
|||
"SHARE": "分享",
|
||||
"SHARING": "正在分享",
|
||||
"SHOW": "顯示",
|
||||
"SHOW_NUMBER_OR_RECORDS": "顯示記錄數量",
|
||||
"SHOW_QR_CODE": "顯示 QR 碼",
|
||||
"SIMPLE_QR": "簡易QR",
|
||||
"STATE": "州",
|
||||
|
@ -184,12 +185,15 @@
|
|||
"TASK_BUTTON_LAYOUT": "行動按鍵佈局",
|
||||
"TURN_OFF": "關閉",
|
||||
"TURN_ON": "開啟",
|
||||
"TURNED_OFF": "已關閉",
|
||||
"TURNED_ON": "已開啟",
|
||||
"TUTORIAL": "教學",
|
||||
"UNDO": "還原",
|
||||
"UNKNOWN": "未知",
|
||||
"UPDATE_SUCCESSFULLY": "更新成功",
|
||||
"URL": "網址",
|
||||
"VCARD_CONTACT": "vCard 聯絡人",
|
||||
"VERSION_VERSION": "版本 {version}",
|
||||
"VIBRATION": "震動效果",
|
||||
"VIEWED": "查看",
|
||||
"VIEW_BOOKMARK": "查看書籤",
|
||||
|
@ -291,7 +295,7 @@
|
|||
"UPC": "通用產品代碼"
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "此版本為您帶來多項更新和新功能,詳情請查看 GitHub。",
|
||||
"UPDATE_NOTES_ANDROID": "<p>此版本為您帶來多項更新和新功能,詳情請查看 GitHub。</p><p>Android 用戶現在可以在快速設定面板中加入簡易 QR 按鍵以進行快速啟動。</p>",
|
||||
"UPDATE_NOTES_IOS": "此版本為您帶來多項更新和新功能,詳情請查看 GitHub。"
|
||||
}
|
||||
}
|
|
@ -10,7 +10,7 @@
|
|||
"experimentalDecorators": true,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
"target": "es5",
|
||||
"target": "es2020",
|
||||
"module": "es2020",
|
||||
"lib": ["es2018", "dom"]
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue