diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..c202b8c
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index a52dd60..ae388c2 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -7,7 +7,7 @@
-
+
@@ -16,6 +16,5 @@
-
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 9a55c2d..fdf8d99 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 95ac8b7..68076bd 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -179,10 +179,17 @@
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a268986..b1eef99 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
-# Version 3.0_r2:
-- Made minor under-the-hood improvements for a better overall app experience.
+# Version 3.1_r1:
+- Added a new support page to show appreciation and gratitude to the developer.
+- Fixed various bugs and improved readability, consistency, app performance, and responsiveness by optimizing and styling the outdated code.
+- Made various project structure enhancements for better readability and maintainability.
+- Made various under-the-hood improvements for a better overall app experience.
# Version 3.0_r1:
- Added a new startup screen for new users.
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 67ac3e7..0000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,99 +0,0 @@
-plugins {
- id 'com.android.application'
- id 'org.jetbrains.kotlin.android'
- id 'com.google.android.gms.oss-licenses-plugin'
- id 'com.google.gms.google-services'
- id 'com.google.firebase.crashlytics'
- id 'kotlin-kapt'
-}
-android {
- compileSdkVersion 33
- namespace 'com.d4rk.qrcodescanner.plus'
- defaultConfig {
- applicationId 'com.d4rk.qrcodescanner.plus'
- minSdk 26
- targetSdk 33
- versionCode 23
- versionName '3.0_r1'
- archivesBaseName = "${applicationId}-v${versionName}"
- testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
- resourceConfigurations += ['en', 'de', 'es', 'fr', 'hi', 'hu', 'in', 'it', 'ja', 'ro', 'ru', 'tr', 'sv', 'bg', 'pl', 'uk']
- }
- buildTypes {
- release {
- multiDexEnabled true
- minifyEnabled true
- shrinkResources true
- debuggable false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- debug {
- multiDexEnabled true
- minifyEnabled true
- shrinkResources true
- debuggable true
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- kotlinOptions {
- jvmTarget = '17'
- }
- buildFeatures {
- viewBinding = true
- buildConfig = true
- }
- bundle {
- storeArchive {
- enable = true
- }
- }
-}
-dependencies {
- implementation 'com.google.android.play:review-ktx:2.0.1'
- implementation 'com.google.android.play:app-update-ktx:2.1.0'
- implementation 'com.google.firebase:firebase-crashlytics-ktx:18.3.7'
- implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'
- implementation 'com.google.firebase:firebase-perf:20.3.3'
- implementation 'com.google.android.play:review-ktx:2.0.1'
- implementation 'com.googlecode.ez-vcard:ez-vcard:0.12.0'
- implementation 'com.google.android.material:material:1.9.0'
- implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1'
- implementation 'com.google.android.gms:play-services-ads:22.1.0'
- implementation 'androidx.core:core-ktx:1.10.1'
- implementation 'androidx.appcompat:appcompat:1.6.1'
- implementation 'androidx.core:core-splashscreen:1.0.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
- implementation 'androidx.navigation:navigation-fragment-ktx:2.6.0'
- implementation 'androidx.navigation:navigation-ui-ktx:2.6.0'
- implementation 'androidx.gridlayout:gridlayout:1.0.0'
- implementation 'androidx.preference:preference-ktx:1.2.0'
- implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
- implementation 'androidx.lifecycle:lifecycle-process:2.6.1'
- implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.1'
- implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
- implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
- implementation 'androidx.multidex:multidex:2.0.1'
- implementation 'androidx.room:room-runtime:2.5.2'
- implementation 'androidx.room:room-rxjava2:2.5.2'
- implementation 'android.arch.paging:runtime:1.0.1'
- implementation 'android.arch.paging:rxjava2:1.0.1'
- implementation 'com.github.yuriy-budiyev:code-scanner:2.3.2'
- implementation 'com.github.florent37:singledateandtimepicker:2.2.8'
- implementation 'com.airbnb.android:lottie:6.0.1'
- implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
- implementation 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7-kotlin:2.2.0'
- implementation 'com.isseiaoki:simplecropview:1.1.8'
- implementation 'commons-codec:commons-codec:1.15'
- implementation 'dev.turingcomplete:kotlin-onetimepassword:2.4.0'
- implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
- implementation 'me.zhanghai.android.fastscroll:library:1.2.0'
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
- testImplementation 'junit:junit:4.13.2'
- kapt 'androidx.room:room-compiler:2.5.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.5'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
-}
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 0000000..560984e
--- /dev/null
+++ b/app/build.gradle.kts
@@ -0,0 +1,101 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
+plugins {
+ id("com.android.application")
+ id("org.jetbrains.kotlin.android")
+ id("com.google.gms.google-services")
+ id("com.google.firebase.crashlytics")
+ id("com.google.android.gms.oss-licenses-plugin")
+ id("com.google.devtools.ksp")
+}
+android {
+ compileSdk = 34
+ namespace = "com.d4rk.qrcodescanner.plus"
+ defaultConfig {
+ applicationId = "com.d4rk.qrcodescanner.plus"
+ minSdk = 26
+ targetSdk = 34
+ versionCode = 30
+ versionName = "3.1_r1"
+ archivesName = "${applicationId}-v${versionName}"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ resourceConfigurations += listOf("en", "de", "es", "fr", "hi", "hu", "in", "it", "ja", "ro", "ru", "tr", "sv", "bg", "pl", "uk")
+ }
+ buildTypes {
+ getByName("release") {
+ multiDexEnabled = true
+ isMinifyEnabled = true
+ isShrinkResources = true
+ isDebuggable = false
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
+ }
+ getByName("debug") {
+ multiDexEnabled = true
+ isMinifyEnabled = true
+ isShrinkResources = true
+ isDebuggable = true
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ kotlinOptions {
+ jvmTarget = "17"
+ }
+ buildFeatures {
+ viewBinding = true
+ buildConfig = true
+ }
+ bundle {
+ storeArchive {
+ enable = true
+ }
+ }
+}
+dependencies {
+ implementation("com.google.android.play:review-ktx:2.0.1")
+ implementation("com.google.android.play:app-update-ktx:2.1.0")
+ implementation("com.google.firebase:firebase-crashlytics-ktx:18.4.0")
+ implementation("com.google.firebase:firebase-analytics-ktx:21.3.0")
+ implementation("com.google.firebase:firebase-perf:20.4.0")
+ implementation("com.google.android.play:review-ktx:2.0.1")
+ implementation("com.googlecode.ez-vcard:ez-vcard:0.12.0")
+ implementation("com.google.android.material:material:1.9.0")
+ implementation("com.google.android.gms:play-services-oss-licenses:17.0.1")
+ implementation("com.google.android.gms:play-services-ads:22.2.0")
+ implementation("com.android.billingclient:billing:6.0.1")
+ implementation("androidx.core:core-ktx:1.10.1")
+ implementation("androidx.appcompat:appcompat:1.6.1")
+ implementation("androidx.core:core-splashscreen:1.0.1")
+ implementation("androidx.constraintlayout:constraintlayout:2.1.4")
+ implementation("androidx.navigation:navigation-fragment-ktx:2.7.0")
+ implementation("androidx.navigation:navigation-ui-ktx:2.7.0")
+ implementation("androidx.gridlayout:gridlayout:1.0.0")
+ implementation("androidx.preference:preference-ktx:1.2.1")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-process:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-common-java8:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
+ implementation("androidx.multidex:multidex:2.0.1")
+ implementation("androidx.room:room-runtime:2.5.2")
+ implementation("androidx.room:room-rxjava2:2.5.2")
+ implementation("android.arch.paging:runtime:1.0.1")
+ implementation("android.arch.paging:rxjava2:1.0.1")
+ implementation("com.github.yuriy-budiyev:code-scanner:2.3.2")
+ implementation("com.github.florent37:singledateandtimepicker:2.2.8")
+ implementation("com.airbnb.android:lottie:6.1.0")
+ implementation("com.journeyapps:zxing-android-embedded:4.3.0")
+ implementation("com.jakewharton.rxbinding2:rxbinding-appcompat-v7-kotlin:2.2.0")
+ implementation("com.mayank:simplecropview:1.0.0")
+ implementation("commons-codec:commons-codec:1.16.0")
+ implementation("dev.turingcomplete:kotlin-onetimepassword:2.4.0")
+ implementation("io.reactivex.rxjava2:rxkotlin:2.4.0")
+ implementation("me.zhanghai.android.fastscroll:library:1.3.0")
+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")
+ testImplementation("junit:junit:4.13.2")
+ ksp("androidx.room:room-compiler:2.5.2")
+ androidTestImplementation("androidx.test.ext:junit:1.1.5")
+ androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7763d63..fc7ba2b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -26,7 +27,7 @@
+
R.drawable.ic_qr_code
+ BarcodeFormat.QR_CODE -> R.drawable.ic_qr_code_white
BarcodeFormat.DATA_MATRIX -> R.drawable.ic_data_matrix
BarcodeFormat.AZTEC -> R.drawable.ic_aztec
BarcodeFormat.PDF_417 -> R.drawable.ic_pdf417
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeActivity.kt
index 91b377a..1aa38fc 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeActivity.kt
@@ -9,6 +9,7 @@ import android.os.Bundle
import android.provider.CalendarContract
import android.provider.ContactsContract
import android.provider.Settings
+import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.print.PrintHelper
@@ -41,6 +42,8 @@ import com.d4rk.qrcodescanner.plus.model.SearchEngine
import com.d4rk.qrcodescanner.plus.model.schema.BarcodeSchema
import com.d4rk.qrcodescanner.plus.model.schema.OtpAuth
import com.d4rk.qrcodescanner.plus.usecase.save
+import com.google.android.gms.ads.AdRequest
+import com.google.android.gms.ads.MobileAds
import com.google.android.material.snackbar.Snackbar
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
@@ -91,6 +94,8 @@ class BarcodeActivity : BaseActivity(), DeleteConfirmationDialogFragment.Listene
showBarcode()
showOrHideButtons()
showButtonText()
+ MobileAds.initialize(this)
+ binding.adView.loadAd(AdRequest.Builder().build())
FastScrollerBuilder(binding.scrollView).useMd2Style().build()
}
override fun onDeleteConfirmed() {
@@ -556,7 +561,7 @@ class BarcodeActivity : BaseActivity(), DeleteConfirmationDialogFragment.Listene
binding.imageViewBarcode.setImageBitmap(bitmap)
binding.imageViewBarcode.setBackgroundColor(settings.barcodeBackgroundColor)
binding.layoutBarcodeImageBackground.setBackgroundColor(settings.barcodeBackgroundColor)
- if (settings.isDarkTheme.not() || settings.areBarcodeColorsInversed) {
+ if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO || settings.areBarcodeColorsInversed) {
binding.layoutBarcodeImageBackground.setPadding(0, 0, 0, 0)
}
} catch (ex: Exception) {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeImageActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeImageActivity.kt
index 7f192b5..687e5b8 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeImageActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/feature/barcode/BarcodeImageActivity.kt
@@ -2,6 +2,7 @@ package com.d4rk.qrcodescanner.plus.feature.barcode
import android.content.Context
import android.content.Intent
import android.os.Bundle
+import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.isVisible
import com.d4rk.qrcodescanner.plus.R
import com.d4rk.qrcodescanner.plus.databinding.ActivityBarcodeImageBinding
@@ -90,7 +91,7 @@ class BarcodeImageActivity : BaseActivity() {
binding.imageViewBarcode.setImageBitmap(bitmap)
binding.imageViewBarcode.setBackgroundColor(settings.barcodeBackgroundColor)
binding.layoutBarcodeImageBackground.setBackgroundColor(settings.barcodeBackgroundColor)
- if (settings.isDarkTheme.not() || settings.areBarcodeColorsInversed) {
+ if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO || settings.areBarcodeColorsInversed) {
binding.layoutBarcodeImageBackground.setPadding(0, 0, 0, 0)
}
} catch (ex: Exception) {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/model/schema/BoardingPass.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/model/schema/BoardingPass.kt
index cf990a8..02ba787 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/model/schema/BoardingPass.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/model/schema/BoardingPass.kt
@@ -13,11 +13,12 @@ class BoardingPass(
private val carrier: String? = null,
private val flight: String? = null,
val date: String? = null,
+ @Suppress("unused") val dateJ: Int = 0,
private val cabin: String? = null,
private val seat: String? = null,
private val seq: String? = null,
private val ticket: String? = null,
- private val select: String? = null,
+ private val selectee: String? = null,
private val ffAirline: String? = null,
private val ffNo: String? = null,
private val fasttrack: String? = null,
@@ -26,62 +27,73 @@ class BoardingPass(
companion object {
private val DATE_FORMATTER by unsafeLazy { SimpleDateFormat("d MMMM", Locale.ENGLISH) }
fun parse(text: String): BoardingPass? {
- if (text.startsWithIgnoreCase("M1").not()) {
- return null
- }
- if (text[22] != 'E') {
- return null
- }
- val fieldSize: Int = text.slice(58..59).toInt(16)
- if (fieldSize != 0 && text[60] != '>') {
- return null
- }
- if (text[60+fieldSize] != '^') {
- return null
- }
- val name: String = text.slice(2..21).trim()
- val pnr: String = text.slice(23..29).trim()
- val from: String = text.slice(30..32)
- val to: String = text.slice(33..35)
- val carrier: String = text.slice(36..38).trim()
- val flight: String = text.slice(39..43).trim()
- val dateJ: String = text.slice(44..46)
- val cabin: String = text.slice(47..47)
- val seat: String = text.slice(48..51).trim()
- val seq: String = text.slice(52..56).trim()
- val today = Calendar.getInstance()
- today.set(Calendar.DAY_OF_YEAR, dateJ.toInt())
- val date: String = DATE_FORMATTER.format(today.time)
- var select = ""
- var ticket = ""
- var ffAirline = ""
- var ffNo = ""
- var fasttrack = ""
- if (fieldSize != 0) {
- val size: Int = text.slice(62..63).toInt(16)
- if (size != 0 && size != 24) {
+ try {
+ if (text.length < 60) {
+ return null
+ }
+ if (text.startsWithIgnoreCase("M1").not()) {
+ return null
+ }
+ if (text[22] != 'E') {
+ return null
+ }
+ val fieldSize: Int = text.slice(58..59).toInt(16)
+ if (fieldSize != 0 && text[60] != '>') {
return null
}
- val size1: Int = text.slice(64+size..65+size).toInt(16)
- if (size1 != 0 && size1 != 41 && size1 != 42) {
+ if (text.length > 60 + fieldSize && text[60+fieldSize] != '^') {
return null
- } else {
- ticket = text.slice(66+size..78+size).trim()
- select = text.slice(79+size..79+size)
- ffAirline = text.slice(84+size..86+size).trim()
- ffNo = text.slice(87+size..102+size).trim()
- if (size1 == 42) {
- fasttrack = text.slice(107+size..107+size)
+ }
+ val name = text.slice(2..21).trim()
+ val pnr = text.slice(23..29).trim()
+ val from = text.slice(30..32)
+ val to = text.slice(33..35)
+ val carrier = text.slice(36..38).trim()
+ val flight = text.slice(39..43).trim()
+ val dateJ = text.slice(44..46).toInt()
+ val cabin = text.slice(47..47)
+ val seat = text.slice(48..51).trim()
+ val seq = text.slice(52..56)
+ val today = Calendar.getInstance()
+ today.set(Calendar.DAY_OF_YEAR, dateJ)
+ val date: String = DATE_FORMATTER.format(today.time)
+ var selectee : String? = null
+ var ticket : String? = null
+ var ffAirline : String? = null
+ var ffNo : String? = null
+ var fasttrack: String? = null
+ if (fieldSize != 0) {
+ @Suppress("UNUSED_VARIABLE")
+ val version: Int = text.slice(61..61).toInt()
+ val size: Int = text.slice(62..63).toInt(16)
+ if (size != 0 && size < 11) {
+ return null
+ }
+ val size1: Int = text.slice(64+size..65+size).toInt(16)
+ if (size1 != 0 && (size1 < 37 || size1 > 42)) {
+ return null
+ } else {
+ ticket = text.slice(66+size..78+size).trim()
+ selectee = text.slice(79+size..79+size)
+ ffAirline = text.slice(84+size..86+size).trim()
+ ffNo = text.slice(87+size..102+size).trim()
+ if (size1 == 42) {
+ fasttrack = text.slice(107+size..107+size)
+ }
}
}
+ return BoardingPass(name, pnr, from, to, carrier, flight, date,
+ dateJ, cabin, seat, seq, ticket, selectee,
+ ffAirline, ffNo, fasttrack,
+ text)
+ } catch(e: Exception) {
+ return null
}
- return BoardingPass(name, pnr, from, to, carrier, flight, date,
- cabin, seat, seq, ticket, select,
- ffAirline, ffNo, fasttrack,
- text)
}
}
override val schema = BarcodeSchema.BOARDINGPASS
- override fun toFormattedText(): String = listOf(name, pnr, "$from->$to", "$carrier$flight", date, cabin, seat, seq, ticket, select, "$ffAirline$ffNo", fasttrack).joinToStringNotNullOrBlankWithLineSeparator()
- override fun toBarcodeText(): String = "$blob"
+ override fun toFormattedText(): String = listOf(name, pnr, "$from->$to", "$carrier$flight", date, cabin, seat, seq, ticket, selectee, "$ffAirline$ffNo", fasttrack).joinToStringNotNullOrBlankWithLineSeparator()
+ override fun toBarcodeText(): String {
+ return blob ?: ""
+ }
}
\ No newline at end of file
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/MainActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/MainActivity.kt
index 0494b17..7e46281 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/MainActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/MainActivity.kt
@@ -1,6 +1,8 @@
package com.d4rk.qrcodescanner.plus.ui
import android.content.Intent
import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
@@ -15,10 +17,15 @@ import androidx.preference.PreferenceManager
import com.d4rk.qrcodescanner.plus.R
import com.d4rk.qrcodescanner.plus.databinding.ActivityMainBinding
import com.d4rk.qrcodescanner.plus.notifications.AppUpdateNotificationsManager
+import com.d4rk.qrcodescanner.plus.notifications.AppUsageNotificationsManager
import com.d4rk.qrcodescanner.plus.ui.settings.SettingsActivity
+import com.d4rk.qrcodescanner.plus.ui.settings.support.SupportActivity
import com.d4rk.qrcodescanner.plus.ui.startup.StartupActivity
+import com.google.android.gms.ads.AdRequest
+import com.google.android.gms.ads.MobileAds
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.navigation.NavigationBarView
+import com.google.android.material.snackbar.Snackbar
import com.google.android.play.core.appupdate.AppUpdateManager
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.install.model.ActivityResult
@@ -31,17 +38,22 @@ class MainActivity : AppCompatActivity() {
private lateinit var appUpdateManager: AppUpdateManager
private val requestUpdateCode = 1
private lateinit var appUpdateNotificationsManager: AppUpdateNotificationsManager
+ private val handler = Handler(Looper.getMainLooper())
+ private val snackbarInterval: Long = 60L * 24 * 60 * 60 * 1000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
installSplashScreen()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
+ MobileAds.initialize(this)
+ binding.adView.loadAd(AdRequest.Builder().build())
appUpdateManager = AppUpdateManagerFactory.create(this)
appUpdateManager = AppUpdateManagerFactory.create(this)
appUpdateNotificationsManager = AppUpdateNotificationsManager(this)
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
applyAppSettings()
+ handler.postDelayed(::showSnackbar, snackbarInterval)
}
private fun applyAppSettings() {
val themeValues = resources.getStringArray(R.array.preference_theme_values)
@@ -84,6 +96,15 @@ class MainActivity : AppCompatActivity() {
val appBarConfiguration = AppBarConfiguration(setOf(R.id.navigation_scan, R.id.navigation_create, R.id.navigation_history, R.id.navigation_about))
setupActionBarWithNavController(navController, appBarConfiguration)
}
+ private fun showSnackbar() {
+ Snackbar.make(binding.root, getString(R.string.snack_support), Snackbar.LENGTH_LONG)
+ .setAction(getString(android.R.string.ok)) {
+ val intent = Intent(this, SupportActivity::class.java)
+ startActivity(intent)
+ }
+ .show()
+ handler.postDelayed(::showSnackbar, snackbarInterval)
+ }
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
@@ -118,8 +139,10 @@ class MainActivity : AppCompatActivity() {
} else {
FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(true)
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)
-
}
+ val appUsageNotificationsManager = AppUsageNotificationsManager(this)
+ appUsageNotificationsManager.checkAndSendAppUsageNotification()
+ appUpdateNotificationsManager.checkAndSendUpdateNotification()
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
@Suppress("DEPRECATION")
@@ -137,7 +160,6 @@ class MainActivity : AppCompatActivity() {
}
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- @Suppress("DEPRECATION")
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == requestUpdateCode) {
when (resultCode) {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/CreateBarcodeActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/CreateBarcodeActivity.kt
index 245aaa0..5ab4252 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/CreateBarcodeActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/CreateBarcodeActivity.kt
@@ -95,7 +95,6 @@ class CreateBarcodeActivity : BaseActivity(), AppAdapter.Listener {
}
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- @Suppress("DEPRECATION")
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) {
return
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/qr/CreateQrCodeAppFragment.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/qr/CreateQrCodeAppFragment.kt
index 3b882a6..e759841 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/qr/CreateQrCodeAppFragment.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/create/qr/CreateQrCodeAppFragment.kt
@@ -65,7 +65,6 @@ class CreateQrCodeAppFragment : BaseCreateBarcodeFragment() {
val mainIntent = Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
}
- @Suppress("DEPRECATION")
return requireContext().packageManager.queryIntentActivities(mainIntent, 0).filter { it.activityInfo?.packageName != null }
}
private fun showLoading(isLoading: Boolean) {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/history/BarcodeHistoryFragment.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/history/BarcodeHistoryFragment.kt
index 72812e8..1bf90c2 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/history/BarcodeHistoryFragment.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/history/BarcodeHistoryFragment.kt
@@ -9,8 +9,6 @@ import com.d4rk.qrcodescanner.plus.di.barcodeDatabase
import com.d4rk.qrcodescanner.plus.extension.showError
import com.d4rk.qrcodescanner.plus.ui.dialogs.DeleteConfirmationDialogFragment
import com.d4rk.qrcodescanner.plus.ui.history.export.ExportHistoryActivity
-import com.google.android.gms.ads.AdRequest
-import com.google.android.gms.ads.MobileAds
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
@@ -21,8 +19,6 @@ class BarcodeHistoryFragment : Fragment(), DeleteConfirmationDialogFragment.List
private val disposable = CompositeDisposable()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentBarcodeHistoryBinding.inflate(inflater, container, false)
- MobileAds.initialize(requireContext())
- binding.adView.loadAd(AdRequest.Builder().build())
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/MyCropImageView.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/MyCropImageView.kt
deleted file mode 100644
index 2a72fba..0000000
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/MyCropImageView.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.d4rk.qrcodescanner.plus.ui.scan.file
-import android.content.Context
-import android.util.AttributeSet
-import android.view.MotionEvent
-import com.isseiaoki.simplecropview.CropImageView
-import io.reactivex.Observable
-import io.reactivex.subjects.PublishSubject
-class MyCropImageView : CropImageView {
- private val touches = PublishSubject.create()
- constructor(context: Context?) : super(context)
- constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
- constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle)
- override fun onTouchEvent(event: MotionEvent?): Boolean {
- event?.let {
- when (it.action) {
- MotionEvent.ACTION_DOWN -> {
- performClick()
- touches.onNext(it)
- }
- MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> touches.onNext(it)
- }
- }
- return super.onTouchEvent(event)
- }
- override fun performClick(): Boolean {
- super.performClick()
- return true
- }
- override fun rotateImage(degrees: RotateDegrees?) {
- if (drawable != null) {
- super.rotateImage(degrees)
- }
- }
- fun touches(): Observable {
- return touches
- }
-}
\ No newline at end of file
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/ScanBarcodeFromFileActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/ScanBarcodeFromFileActivity.kt
index 5453622..d2c51d7 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/ScanBarcodeFromFileActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/scan/file/ScanBarcodeFromFileActivity.kt
@@ -1,34 +1,36 @@
package com.d4rk.qrcodescanner.plus.ui.scan.file
import android.Manifest
+import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
-import android.net.Uri
import android.os.Build
import android.os.Bundle
-import android.os.Parcelable
+import android.os.ext.SdkExtensions
import android.provider.MediaStore
import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent.ACTION_UP
+import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
-import androidx.core.view.isInvisible
-import androidx.core.view.isVisible
import com.d4rk.qrcodescanner.plus.R
import com.d4rk.qrcodescanner.plus.databinding.ActivityScanBarcodeFromFileBinding
-import com.d4rk.qrcodescanner.plus.di.settings
+import com.d4rk.qrcodescanner.plus.di.barcodeDatabase
+import com.d4rk.qrcodescanner.plus.di.barcodeImageScanner
import com.d4rk.qrcodescanner.plus.di.barcodeParser
import com.d4rk.qrcodescanner.plus.di.permissionsHelper
-import com.d4rk.qrcodescanner.plus.di.barcodeImageScanner
-import com.d4rk.qrcodescanner.plus.di.barcodeDatabase
+import com.d4rk.qrcodescanner.plus.di.settings
import com.d4rk.qrcodescanner.plus.extension.applySystemWindowInsets
import com.d4rk.qrcodescanner.plus.extension.showError
import com.d4rk.qrcodescanner.plus.feature.BaseActivity
import com.d4rk.qrcodescanner.plus.feature.barcode.BarcodeActivity
import com.d4rk.qrcodescanner.plus.model.Barcode
import com.d4rk.qrcodescanner.plus.usecase.save
+import com.google.android.material.snackbar.Snackbar
import com.google.zxing.Result
-import com.isseiaoki.simplecropview.CropImageView
+import com.jakewharton.rxbinding2.view.touches
+import com.mayank.simplecropview.CropImageView
+import com.mayank.simplecropview.callback.LoadCallback
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
@@ -36,9 +38,9 @@ import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
class ScanBarcodeFromFileActivity : BaseActivity() {
private lateinit var binding: ActivityScanBarcodeFromFileBinding
+ private lateinit var pickMediaLauncher: ActivityResultLauncher
companion object {
private const val CHOOSE_FILE_REQUEST_CODE = 12
- private const val CHOOSE_FILE_AGAIN_REQUEST_CODE = 13
private const val PERMISSIONS_REQUEST_CODE = 14
private val PERMISSIONS = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
fun start(context: Context) {
@@ -46,7 +48,6 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
context.startActivity(intent)
}
}
- private var imageUri: Uri? = null
private var lastScanResult: Result? = null
private val disposable = CompositeDisposable()
private val scanDisposable = CompositeDisposable()
@@ -54,35 +55,10 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
super.onCreate(savedInstanceState)
binding = ActivityScanBarcodeFromFileBinding.inflate(layoutInflater)
setContentView(binding.root)
+ selectImage()
supportEdgeToEdge()
handleImageCropAreaChanged()
handleScanButtonClicked()
- if (showImageFromIntent().not()) {
- startChooseImageActivity(savedInstanceState)
- }
- if (showImageFromIntent().not()) {
- startChooseImageActivity(savedInstanceState)
- }
- }
- @Deprecated("Deprecated in Java")
- @Suppress("DEPRECATION")
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- if ((requestCode == CHOOSE_FILE_REQUEST_CODE || requestCode == CHOOSE_FILE_AGAIN_REQUEST_CODE) && resultCode == RESULT_OK) {
- data?.data?.apply(::showImage)
- return
- }
- if (requestCode == CHOOSE_FILE_REQUEST_CODE) {
- finish()
- }
- }
- override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults)
- if (requestCode == PERMISSIONS_REQUEST_CODE && permissionsHelper.areAllPermissionsGranted(grantResults)) {
- imageUri?.apply(::showImage)
- } else {
- finish()
- }
}
override fun onDestroy() {
super.onDestroy()
@@ -92,54 +68,47 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
private fun supportEdgeToEdge() {
binding.rootView.applySystemWindowInsets(applyTop = true, applyBottom = true)
}
- private fun showImageFromIntent(): Boolean {
- var uri: Uri? = null
- if (intent?.action == Intent.ACTION_SEND && intent.type.orEmpty().startsWith("image/")) {
- @Suppress("DEPRECATION")
- uri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as? Uri
- }
- if (intent?.action == Intent.ACTION_VIEW && intent.type.orEmpty().startsWith("image/")) {
- uri = intent.data
- }
- if (uri == null) {
- return false
+ private fun showErrorOrRequestPermissions(error: Throwable) {
+ when (error) {
+ is SecurityException -> permissionsHelper.requestPermissions(this, PERMISSIONS, PERMISSIONS_REQUEST_CODE)
+ else -> showError(error)
}
- showImage(uri)
- return true
}
- private fun startChooseImageActivity(savedInstanceState: Bundle?) {
- startChooseImageActivity(CHOOSE_FILE_REQUEST_CODE, savedInstanceState)
- }
- private fun startChooseImageActivity(requestCode: Int, savedInstanceState: Bundle?) {
- if (savedInstanceState != null) {
- return
- }
- val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
- } else {
- Intent(Intent.ACTION_PICK).setType("image/*")
- }
- if (intent.resolveActivity(packageManager) != null) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- val pickImageLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
- if (result.resultCode == RESULT_OK) {
- result.data?.let {
- result.data?.data?.apply(::showImage)
- }
- } else {
- finish()
+ private fun selectImage() {
+ pickMediaLauncher =
+ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+ if (it.resultCode != Activity.RESULT_OK) {
+ Snackbar.make(binding.root, "Failed to retrieve media.", Snackbar.LENGTH_SHORT).show()
+ } else {
+ val uri = it.data?.data
+ if (uri != null) {
+ binding.cropImageView.load(uri)
+ .execute(object : LoadCallback {
+ override fun onSuccess() {
+ scanCroppedImage()
+ binding.cropImageView.invalidate()
+ }
+ override fun onError(e: Throwable) {
+ showErrorOrRequestPermissions(e)
+ }
+ })
}
}
- pickImageLauncher.launch(intent)
- } else {
- @Suppress("DEPRECATION")
- startActivityForResult(intent, requestCode)
}
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) {
+ pickMediaLauncher.launch(
+ Intent(MediaStore.ACTION_PICK_IMAGES)
+ .apply {
+ type = "image/*"
+ }
+ )
+ } else {
+ val intent = Intent(Intent.ACTION_PICK)
+ intent.type = "image/*"
+ @Suppress("DEPRECATION")
+ startActivityForResult(intent, CHOOSE_FILE_REQUEST_CODE)
}
}
- private fun startChooseImageActivityAgain() {
- startChooseImageActivity(CHOOSE_FILE_AGAIN_REQUEST_CODE, null)
- }
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_scan_barcode_from_image, menu)
return true
@@ -155,7 +124,7 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
true
}
R.id.item_change_image -> {
- startChooseImageActivityAgain()
+ selectImage()
true
}
else -> super.onOptionsItemSelected(item)
@@ -166,45 +135,23 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
.filter { it.action == ACTION_UP }
.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
- .subscribe { scanCroppedImage() }
- .addTo(disposable)
- }
- private fun handleScanButtonClicked() {
- binding.buttonScan.setOnClickListener {
- saveScanResult()
- }
- }
- private fun showImage(imageUri: Uri) {
- this.imageUri = imageUri
- val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION
- applicationContext.contentResolver.takePersistableUriPermission(imageUri, takeFlags)
- binding.cropImageView
- .load(imageUri)
- .executeAsCompletable()
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ scanCroppedImage() },
- ::showErrorOrRequestPermissions
+ { error -> showError(error) }
)
.addTo(disposable)
}
- private fun showErrorOrRequestPermissions(error: Throwable) {
- when (error) {
- is SecurityException -> permissionsHelper.requestPermissions(this, PERMISSIONS, PERMISSIONS_REQUEST_CODE)
- else -> showError(error)
+ private fun handleScanButtonClicked() {
+ binding.buttonScan.setOnClickListener {
+ if (lastScanResult != null) {
+ saveScanResult()
+ }
}
}
private fun scanCroppedImage() {
- showLoading(true)
- showScanButtonEnabled(false)
scanDisposable.clear()
lastScanResult = null
- binding.cropImageView
- .cropAsSingle()
- .subscribeOn(Schedulers.io())
- .subscribe(::scanCroppedImage, ::showError)
- .addTo(scanDisposable)
+ scanCroppedImage(binding.cropImageView.croppedBitmap)
}
private fun scanCroppedImage(image: Bitmap) {
barcodeImageScanner
@@ -213,10 +160,8 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
.subscribe(
{ scanResult ->
lastScanResult = scanResult
- showScanButtonEnabled(true)
- showLoading(false)
},
- { showLoading(false) }
+ { error -> showError(error) }
)
.addTo(scanDisposable)
}
@@ -226,7 +171,6 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
navigateToBarcodeScreen(barcode)
return
}
- showLoading(true)
barcodeDatabase.save(barcode, settings.doNotSaveDuplicates)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
@@ -235,19 +179,11 @@ class ScanBarcodeFromFileActivity : BaseActivity() {
navigateToBarcodeScreen(barcode.copy(id = id))
},
{ error ->
- showLoading(false)
showError(error)
}
)
.addTo(disposable)
}
- private fun showLoading(isLoading: Boolean) {
- binding.progressBarLoading.isVisible = isLoading
- binding.buttonScan.isInvisible = isLoading
- }
- private fun showScanButtonEnabled(isEnabled: Boolean) {
- binding.buttonScan.isEnabled = isEnabled
- }
private fun navigateToBarcodeScreen(barcode: Barcode) {
BarcodeActivity.start(this, barcode)
finish()
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/settings/support/SupportActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/settings/support/SupportActivity.kt
new file mode 100644
index 0000000..d13004a
--- /dev/null
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/settings/support/SupportActivity.kt
@@ -0,0 +1,124 @@
+@file:Suppress("DEPRECATION")
+package com.d4rk.qrcodescanner.plus.ui.settings.support
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.android.billingclient.api.BillingClient
+import com.android.billingclient.api.BillingClientStateListener
+import com.android.billingclient.api.BillingFlowParams
+import com.android.billingclient.api.BillingResult
+import com.android.billingclient.api.SkuDetails
+import com.android.billingclient.api.SkuDetailsParams
+import com.d4rk.qrcodescanner.plus.databinding.ActivitySupportBinding
+import com.google.android.gms.ads.AdError
+import com.google.android.gms.ads.AdRequest
+import com.google.android.gms.ads.FullScreenContentCallback
+import com.google.android.gms.ads.LoadAdError
+import com.google.android.gms.ads.MobileAds
+import com.google.android.gms.ads.rewarded.RewardedAd
+import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback
+import me.zhanghai.android.fastscroll.FastScrollerBuilder
+class SupportActivity : AppCompatActivity() {
+ private val adUnitId = "ca-app-pub-5294151573817700/1497912017"
+ private var isLoading = false
+ private var rewardedAd: RewardedAd? = null
+ private lateinit var binding: ActivitySupportBinding
+ private lateinit var billingClient: BillingClient
+ private val skuDetailsMap = mutableMapOf()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivitySupportBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ FastScrollerBuilder(binding.scrollView).useMd2Style().build()
+ binding.buttonWebAd.setOnClickListener {
+ startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://bit.ly/3p8bpjj")))
+ }
+ MobileAds.initialize(this)
+ loadRewardedAd()
+ binding.buttonWatchAd.setOnClickListener { showRewardedVideo() }
+ billingClient = BillingClient.newBuilder(this)
+ .setListener { _, _ ->
+ }
+ .enablePendingPurchases()
+ .build()
+ billingClient.startConnection(object : BillingClientStateListener {
+ override fun onBillingSetupFinished(billingResult: BillingResult) {
+ if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
+ querySkuDetails()
+ }
+ }
+ override fun onBillingServiceDisconnected() {
+ }
+ })
+ binding.buttonLowDonation.setOnClickListener { initiatePurchase("low_donation") }
+ binding.buttonNormalDonation.setOnClickListener { initiatePurchase("normal_donation") }
+ binding.buttonHighDonation.setOnClickListener { initiatePurchase("high_donation") }
+ binding.buttonExtremeDonation.setOnClickListener { initiatePurchase("extreme_donation") }
+ }
+ private fun loadRewardedAd() {
+ if (rewardedAd == null) {
+ isLoading = true
+ val adRequest = AdRequest.Builder().build()
+ RewardedAd.load(
+ this,
+ adUnitId,
+ adRequest,
+ object : RewardedAdLoadCallback() {
+ override fun onAdFailedToLoad(adError: LoadAdError) {
+ rewardedAd = null
+ isLoading = false
+ }
+ override fun onAdLoaded(ad: RewardedAd) {
+ rewardedAd = ad
+ isLoading = false
+ }
+ })
+ }
+ }
+ private fun showRewardedVideo() {
+ if (rewardedAd == null) {
+ return
+ }
+ rewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
+ override fun onAdShowedFullScreenContent() {}
+ override fun onAdFailedToShowFullScreenContent(adError: AdError) {
+ rewardedAd = null
+ }
+ override fun onAdDismissedFullScreenContent() {
+ rewardedAd = null
+ loadRewardedAd()
+ }
+ }
+ rewardedAd?.show(this) {}
+ }
+ private fun querySkuDetails() {
+ val skuList = listOf("low_donation", "normal_donation", "high_donation", "extreme_donation")
+ val params = SkuDetailsParams.newBuilder()
+ .setSkusList(skuList)
+ .setType(BillingClient.SkuType.INAPP)
+ .build()
+ billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList ->
+ if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
+ for (skuDetails in skuDetailsList) {
+ skuDetailsMap[skuDetails.sku] = skuDetails
+ when (skuDetails.sku) {
+ "low_donation" -> binding.buttonLowDonation.text = skuDetails.price
+ "normal_donation" -> binding.buttonNormalDonation.text = skuDetails.price
+ "high_donation" -> binding.buttonHighDonation.text = skuDetails.price
+ "extreme_donation" -> binding.buttonExtremeDonation.text = skuDetails.price
+ }
+ }
+ }
+ }
+ }
+ private fun initiatePurchase(sku: String) {
+ val skuDetails = skuDetailsMap[sku]
+ if (skuDetails != null) {
+ val flowParams = BillingFlowParams.newBuilder()
+ .setSkuDetails(skuDetails)
+ .build()
+ billingClient.launchBillingFlow(this, flowParams)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/startup/StartupActivity.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/startup/StartupActivity.kt
index 8c704f8..54e5e08 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/startup/StartupActivity.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/ui/startup/StartupActivity.kt
@@ -1,7 +1,6 @@
package com.d4rk.qrcodescanner.plus.ui.startup
import android.Manifest
import android.content.Intent
-import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
@@ -40,15 +39,7 @@ class StartupActivity : AppCompatActivity() {
startActivity(Intent(this, MainActivity::class.java))
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS, Manifest.permission.READ_MEDIA_IMAGES), 1)
- } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- val isReadPhoneStateGranted = checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
- if (!isReadPhoneStateGranted) {
- requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), 1)
- return
- }
- } else {
- requestPermissions(arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,), 1)
+ requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1)
}
}
private fun loadForm() {
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/BarcodeImageScanner.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/BarcodeImageScanner.kt
index ae29bf3..c527d79 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/BarcodeImageScanner.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/BarcodeImageScanner.kt
@@ -32,7 +32,7 @@ object BarcodeImageScanner {
if (size > bitmapBuffer?.size.orZero()) {
bitmapBuffer = IntArray(size)
}
- image.getPixels(bitmapBuffer, 0, width, 0, 0, width, height)
+ bitmapBuffer?.let { image.getPixels(it, 0, width, 0, 0, width, height) }
val source = RGBLuminanceSource(width, height, bitmapBuffer)
val bitmap = BinaryBitmap(HybridBinarizer(source))
val reader = MultiFormatReader()
diff --git a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/Settings.kt b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/Settings.kt
index 97b4063..2dc3b55 100644
--- a/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/Settings.kt
+++ b/app/src/main/kotlin/com/d4rk/qrcodescanner/plus/usecase/Settings.kt
@@ -1,17 +1,12 @@
package com.d4rk.qrcodescanner.plus.usecase
import android.content.Context
-import android.content.res.Configuration
import android.graphics.Color
-import android.os.Build
import androidx.appcompat.app.AppCompatDelegate
import com.d4rk.qrcodescanner.plus.extension.unsafeLazy
import com.d4rk.qrcodescanner.plus.model.SearchEngine
import com.google.zxing.BarcodeFormat
class Settings(private val context: Context) {
companion object {
- const val THEME_SYSTEM = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
- const val THEME_LIGHT = AppCompatDelegate.MODE_NIGHT_NO
- const val THEME_DARK = AppCompatDelegate.MODE_NIGHT_YES
private const val SHARED_PREFERENCES_NAME = "SHARED_PREFERENCES_NAME"
private var INSTANCE: Settings? = null
fun getInstance(context: Context): Settings {
@@ -19,27 +14,22 @@ class Settings(private val context: Context) {
}
}
private enum class Key {
- THEME, INVERSE_BARCODE_COLORS, OPEN_LINKS_AUTOMATICALLY, COPY_TO_CLIPBOARD, SIMPLE_AUTO_FOCUS, FLASHLIGHT, VIBRATE, CONTINUOUS_SCANNING, CONFIRM_SCANS_MANUALLY, IS_BACK_CAMERA, SAVE_SCANNED_BARCODES_TO_HISTORY, SAVE_CREATED_BARCODES_TO_HISTORY, DO_NOT_SAVE_DUPLICATES, SEARCH_ENGINE,
+ INVERSE_BARCODE_COLORS, OPEN_LINKS_AUTOMATICALLY, COPY_TO_CLIPBOARD, SIMPLE_AUTO_FOCUS, FLASHLIGHT, VIBRATE, CONTINUOUS_SCANNING, CONFIRM_SCANS_MANUALLY, IS_BACK_CAMERA, SAVE_SCANNED_BARCODES_TO_HISTORY, SAVE_CREATED_BARCODES_TO_HISTORY, DO_NOT_SAVE_DUPLICATES, SEARCH_ENGINE,
}
private val sharedPreferences by unsafeLazy {
context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)
}
- var theme: Int
- get() = get(Key.THEME, THEME_SYSTEM)
- set(value) {
- set(Key.THEME, value)
- applyTheme(value)
- }
- val isDarkTheme: Boolean get() = theme == THEME_DARK || (theme == THEME_SYSTEM && isSystemDarkModeEnabled())
var areBarcodeColorsInversed: Boolean get() = get(Key.INVERSE_BARCODE_COLORS, false)
set(value) = set(Key.INVERSE_BARCODE_COLORS, value)
- val barcodeContentColor: Int get() = when {
- isDarkTheme && areBarcodeColorsInversed -> Color.WHITE
+ val barcodeContentColor: Int
+ get() = when {
+ AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES && areBarcodeColorsInversed -> Color.WHITE
else -> Color.BLACK
}
+
val barcodeBackgroundColor: Int
get() = when {
- isDarkTheme && areBarcodeColorsInversed.not() -> Color.WHITE
+ AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES && areBarcodeColorsInversed.not() -> Color.WHITE
else -> Color.TRANSPARENT
}
var openLinksAutomatically: Boolean get() = get(Key.OPEN_LINKS_AUTOMATICALLY, false)
@@ -72,15 +62,6 @@ class Settings(private val context: Context) {
fun setFormatSelected(format: BarcodeFormat, isSelected: Boolean) {
sharedPreferences.edit().putBoolean(format.name, isSelected).apply()
}
- fun reapplyTheme() {
- applyTheme(theme)
- }
- private fun get(key: Key, default: Int): Int {
- return sharedPreferences.getInt(key.name, default)
- }
- private fun set(key: Key, value: Int) {
- return sharedPreferences.edit().putInt(key.name, value).apply()
- }
private fun get(key: Key, default: Boolean = false): Boolean {
return sharedPreferences.getBoolean(key.name, default)
}
@@ -94,22 +75,4 @@ class Settings(private val context: Context) {
private fun set(key: Key, value: SearchEngine) {
sharedPreferences.edit().putString(key.name, value.name).apply()
}
- private fun applyTheme(theme: Int) {
- when (theme) {
- AppCompatDelegate.MODE_NIGHT_NO, AppCompatDelegate.MODE_NIGHT_YES -> {
- AppCompatDelegate.setDefaultNightMode(theme)
- }
- else -> {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
- } else {
- AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY)
- }
- }
- }
- }
- private fun isSystemDarkModeEnabled(): Boolean {
- val mode = context.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)
- return mode == Configuration.UI_MODE_NIGHT_YES
- }
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-anydpi/ic_paid.xml b/app/src/main/res/drawable-anydpi/ic_paid.xml
new file mode 100644
index 0000000..e4885de
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_paid.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-anydpi/ic_play.xml b/app/src/main/res/drawable-anydpi/ic_play.xml
new file mode 100644
index 0000000..bb1f38f
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_play.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_barcode.xml b/app/src/main/res/layout/activity_barcode.xml
index 537510f..d252f0e 100644
--- a/app/src/main/res/layout/activity_barcode.xml
+++ b/app/src/main/res/layout/activity_barcode.xml
@@ -2,6 +2,7 @@
android:id="@+id/root_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -344,7 +345,7 @@
android:layout_height="wrap_content"
app:icon="@drawable/ic_download"
app:iconBackground="?attr/colorPrimary"
- app:text="@string/save_as_text"/>
+ app:text="@string/tooltip_save_as_text"/>
+ app:text="@string/tooltip_save_as_image"/>
+
+
+
@@ -14,11 +15,18 @@
android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="0dp"
app:defaultNavHost="true"
- android:layout_marginBottom="80dp"
- android:layout_marginTop="64dp"
- app:navGraph="@navigation/mobile_navigation"/>
+ app:navGraph="@navigation/mobile_navigation"
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintBottom_toTopOf="@id/ad_view"/>
+
-
+ android:layout_margin="24dp"
+ app:cardCornerRadius="24dp"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@id/button_scan">
+
+
-
+ android:paddingHorizontal="@dimen/default_margin_very_large"
+ tools:ignore="VisualLintButtonSize"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_support.xml b/app/src/main/res/layout/activity_support.xml
new file mode 100644
index 0000000..205696c
--- /dev/null
+++ b/app/src/main/res/layout/activity_support.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_barcode_history.xml b/app/src/main/res/layout/fragment_barcode_history.xml
index 1e17949..0c1f3c6 100644
--- a/app/src/main/res/layout/fragment_barcode_history.xml
+++ b/app/src/main/res/layout/fragment_barcode_history.xml
@@ -1,7 +1,6 @@
@@ -32,22 +31,7 @@
android:layout_margin="24dp"
android:src="@drawable/ic_import_export"
android:tooltipText="@string/tooltip_export"
- app:layout_constraintBottom_toTopOf="@id/card_view_ad"
+ app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:importantForAccessibility="no"/>
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/raw-night/anim_about.lottie b/app/src/main/res/raw-night/anim_about.lottie
index e69de29..b26b1bc 100644
Binary files a/app/src/main/res/raw-night/anim_about.lottie and b/app/src/main/res/raw-night/anim_about.lottie differ
diff --git a/app/src/main/res/raw/anim_about.lottie b/app/src/main/res/raw/anim_about.lottie
index e69de29..4f244f4 100644
Binary files a/app/src/main/res/raw/anim_about.lottie and b/app/src/main/res/raw/anim_about.lottie differ
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 1901a69..f66b046 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -101,7 +101,12 @@
Още
Сподели
Още приложения…
- Подкрепете ме
+ Подкрепете разработчика
+ Подкрепете Нас
+ Платена поддръжка
+ Безплатна поддръжка
+ Уеб реклама
+ Гледайте реклама
Информация
Информация за устройството
Версия на приложението: Официална\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Вибрация [VIBRATE]
Достъп до мрежово състояние [ACCESS_NETWORK_STATE]
Достъп до политика за известия [ACCESS_NOTIFICATION_POLICY]
+ Плащане [BILLING]
Камера [CAMERA]
Проверка на лиценз [CHECK_LICENSE]
Фонова услуга [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Избягване на дубликати в хронологията.
Това ни позволява да събираме информация за производителността на приложението и записи за сривове чрез Firebase Crashlytics и Firebase Analytics.
Изберете търсачка за уеб търсения.
- Щракнете тук, ако искате да ме подкрепите без да плащате пари. Просто отделете време, за да видите реклама.
+ Дарете и подкрепете разработката на нашето приложение. Също така можете да ни подкрепите безплатно, като посетите нашия уебсайт или гледате видеореклама.
Позволява на приложението да извлече и използва идентификатора за рекламиране, свързан с устройството на потребителя, за предоставяне на персонализирани реклами, измерване на ефективността на рекламата и показване на реклами на устройства с Android 13 или по-нови версии.
Позволява на приложението да се свързва с Wi-Fi мрежи чрез сканиране на QR кодове.
Позволява на приложението да установи интернет връзка, за да изпраща грешкови доклади или да проверява наличие на актуализации.
@@ -221,6 +227,7 @@
Позволява на приложението да вибрира, когато се сканира QR код.
Позволява на приложението да проверява свързаността с мрежата и да получава информация за Wi-Fi, включително статуса на връзката и имената на свързаните Wi-Fi устройства.
Позволява на приложението да получава достъп до политиката за известия на устройството и да я променя, контролирайки начина и времето на показване на известията на потребителя и предоставяйки функции за персонализирано управление на известията.
+ Позволява на приложението да използва библиотеката Google Play Billing за управление на вътрешни покупки и дарения.
Позволява на приложението да сканира QR кодове и баркодове от камерата.
Позволява на приложението да проверява съответствието си с лицензионното споразумение и да се придържа към условията за лицензиране, за да защити интелектуалната собственост.
Позволява на приложението да създава и използва услуги, които работят в преден план, като им предоставя приоритет пред други фонови процеси и подобрява производителността и надеждността.
@@ -231,6 +238,7 @@
Прочетете и се съгласете с нашите Условия за ползване и Политика за поверителност, за да продължите.
За да влязат в сила, моля рестартирайте приложението!
Сигурни ли сте, че искате да излезете?
+ Без значение колко дарявате, ще ни помогнете да поддържаме нашето приложение и да подобряваме функциите му. Оценяваме вашата щедрост и доброта!
Искате ли да изтриете историята?
- Отворете приложението за браузър\n- Заредете уебсайт\n- Щракнете върху "Споделяне" от менюто\n- Изберете това приложение.
- Отворете приложението за контакти\n- Отворете съществуващ контакт или създайте нов\n- Щракнете върху "Споделяне" от менюто\n- Изберете това приложение
@@ -242,6 +250,7 @@
Запазено в Галерията
Не е открито приложение за това действие
Благодарим ви за оценката! ❤️
+ Искате ли да подкрепите нашето приложение? ❤️
Приемете условията и правилата.
Износ на историята.
Отвори ме 🌐
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index de82425..0b58f99 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -100,7 +100,12 @@
Mehr
Teilen
Weitere Apps…
- Unterstütze mich
+ Unterstütze den Entwickler
+ Unterstütze uns
+ Bezahlte Unterstützung
+ Unbezahlte Unterstützung
+ Web-Anzeige
+ Anzeige ansehen
Info
Geräteinfo
App-Version: Release\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
Vibration [VIBRATE]
Netzwerkstatus abrufen [ACCESS_NETWORK_STATE]
Benachrichtigungsrichtlinie abrufen [ACCESS_NOTIFICATION_POLICY]
+ Abrechnung [BILLING]
Kamera [CAMERA]
Lizenz überprüfen [CHECK_LICENSE]
Vordergrunddienst [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
Duplikate in der Historie vermeiden.
Hiermit können wir Informationen zur Leistung der App und zu Absturzprotokollen sammeln.
Suchmaschine für Websuchen auswählen.
- Klicken Sie hier, wenn Sie mich unterstützen möchten, ohne Geld zu bezahlen. Nehmen Sie sich einfach etwas Zeit, um eine Anzeige anzusehen.
+ Unterstütze unsere App-Entwicklung durch Spenden. Du kannst uns auch kostenlos unterstützen, indem du unsere Website besuchst oder ein Werbevideo ansiehst.
Ermöglicht der App, die mit dem Gerät des Benutzers verknüpfte Werbe-ID abzurufen und zu verwenden, um personalisierte Werbung bereitzustellen, die Wirksamkeit von Werbung zu messen und auf Geräten mit Android 13 oder höher Anzeigen anzuzeigen.
Ermöglicht der App, sich über das Scannen von QR-Codes mit WLAN-Netzwerken zu verbinden.
Ermöglicht der App, eine Internetverbindung herzustellen, um Fehlerberichte zu senden oder nach Updates zu suchen.
@@ -220,6 +226,7 @@
Ermöglicht der App, bei Scan eines QR-Codes zu vibrieren.
Ermöglicht der App, die Netzwerkverbindung zu überprüfen und Informationen zum WLAN abzurufen, einschließlich des Aktivierungsstatus und der Namen der verbundenen WLAN-Geräte.
Ermöglicht der App, auf die Benachrichtigungsrichtlinie des Geräts zuzugreifen und diese zu ändern, um zu steuern, wie und wann Benachrichtigungen für den Benutzer angezeigt werden, und benutzerdefinierte Funktionen für die Benachrichtigungsverwaltung bereitzustellen.
+ Ermöglicht der App die Verwendung der Google Play Billing Library zur Abwicklung von In-App-Käufen und Spenden.
Ermöglicht der App, QR-Codes und Barcodes von der Kamera zu scannen.
Ermöglicht der App, die Einhaltung der Lizenzvereinbarung zu überprüfen und Lizenzbedingungen durchzusetzen, um geistiges Eigentum zu schützen.
Ermöglicht der App, Dienste zu erstellen und zu verwenden, die im Vordergrund ausgeführt werden und Priorität vor anderen Hintergrundprozessen haben, um die Leistung und Zuverlässigkeit zu verbessern.
@@ -230,6 +237,7 @@
Lesen Sie unsere Nutzungsbedingungen und Datenschutzrichtlinien und stimmen Sie ihnen zu, um fortzufahren.
Um wirksam zu werden, starten Sie bitte die App neu!
Sind Sie sicher, dass Sie beenden möchten?
+ Unabhängig von der Höhe Ihrer Spende helfen Sie uns, unsere App am Laufen zu halten und unsere Funktionen zu verbessern. Wir schätzen Ihre Großzügigkeit und Freundlichkeit!
Verlauf löschen?
- Öffnen Sie Ihre Browser-App\n- Laden Sie eine Website\n- Klicken Sie auf "Teilen" im Menü\n- Wählen Sie diese App aus.
- Öffnen Sie Ihre Kontakte-App\n- Öffnen Sie einen vorhandenen Kontakt oder erstellen Sie einen neuen\n- Klicken Sie auf "Teilen" im Menü\n- Wählen Sie diese App aus
@@ -241,6 +249,7 @@
In der Galerie gespeichert
Keine App für diese Aktion gefunden
Vielen Dank für Ihre Bewertung! ❤️
+ Möchten Sie unsere App unterstützen? ❤️
Nehmen Sie die Nutzungsbedingungen an.
Exportieren Sie Ihren Verlauf.
Öffnen Sie mich 🌐
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index c4b063b..33c963a 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -101,7 +101,12 @@
Más
Compartir
Más aplicaciones…
- Apóyame
+ Apoya al desarrollador
+ Apóyanos
+ Soporte Pagado
+ Soporte No Pagado
+ Publicidad en Web
+ Ver anuncio
Información
Información del dispositivo
Versión de la aplicación: Lanzamiento\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Vibrar [VIBRATE]
Acceder al estado de red [ACCESS_NETWORK_STATE]
Acceder a la política de notificaciones [ACCESS_NOTIFICATION_POLICY]
+ Facturación [FACTURACION]
Cámara [CAMERA]
Verificar licencia [CHECK_LICENSE]
Servicio en primer plano [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Evitar duplicados en el historial.
Esto nos permite recopilar información sobre el rendimiento de la aplicación y registros de errores.
Elige un motor de búsqueda para búsquedas en la web.
- Haz clic aquí si quieres apoyarme sin pagar dinero. Solo necesitas un poco de tiempo para ver un anuncio.
+ Dona y apoya el desarrollo de nuestra aplicación. También puedes apoyarnos de forma gratuita visitando nuestro sitio web o viendo un anuncio en video.
Permite que la aplicación recupere y utilice el identificador de publicidad asociado al dispositivo del usuario para proporcionar anuncios personalizados, medir la eficacia de los anuncios y mostrar anuncios en dispositivos con Android 13 o versiones posteriores.
Permite que la aplicación se conecte a redes Wi-Fi escaneando códigos QR.
Permite que la aplicación establezca una conexión a Internet para enviar informes de errores o verificar actualizaciones.
@@ -221,6 +227,7 @@
Permite que la aplicación vibre cuando se escanea un código QR.
Permite que la aplicación verifique la conectividad de red y recupere información sobre Wi-Fi, incluido el estado activado y los nombres de dispositivos Wi-Fi conectados.
Permite que la aplicación acceda y modifique la política de notificaciones del dispositivo, controlando cómo y cuándo se muestran las notificaciones al usuario y proporcionando funciones personalizadas de gestión de notificaciones.
+ Permite que la aplicación utilice la Biblioteca de facturación de Google Play para gestionar compras y donaciones dentro de la aplicación.
Permite que la aplicación escanee códigos QR y códigos de barras desde la cámara.
Permite que la aplicación verifique el cumplimiento del acuerdo de licencia y aplique los términos de licencia para proteger la propiedad intelectual.
Permite que la aplicación cree y utilice servicios que se ejecutan en primer plano, dándoles prioridad sobre otros procesos en segundo plano y mejorando el rendimiento y la fiabilidad.
@@ -231,6 +238,7 @@
Lee y acepta nuestros Términos de servicio y Política de privacidad para continuar.
¡Para que los cambios surtan efecto, reinicia la aplicación!
¿Estás seguro de que deseas salir?
+ No importa cuánto dones, nos ayudarás a mantener nuestra aplicación en funcionamiento y mejorar nuestras funciones. ¡Apreciamos tu generosidad y amabilidad!
¿Borrar historial?
- Abre tu aplicación de navegador\n- Carga un sitio web\n- Haz clic en "Compartir" en el menú\n- Selecciona esta aplicación.
- Abre tu aplicación de contactos\n- Abre un contacto existente o crea uno nuevo\n- Haz clic en "Compartir" en el menú\n- Selecciona esta aplicación.
@@ -242,6 +250,7 @@
Guardado en la galería
No se encontró ninguna aplicación para esta acción
¡Gracias por valorarnos! ❤️
+ ¿Te gustaría apoyar nuestra aplicación? ❤️
Acepta los términos y condiciones.
Exporta tu historial.
Ábreme 🌐
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 6369117..ef275f3 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -44,7 +44,7 @@
Musique
Version %1s
© Droits d\'auteur %1s réalisé par D4rK!
- Créé avec ❤ en Roumanie !
+ Créé avec ❤ en Roumanie!
Paramètres
Apparence
Thème
@@ -100,7 +100,12 @@
Plus
Partager
Plus d\'applications…
- Me soutenir
+ Soutenir le développeur
+ Soutenez-nous
+ Assistance payante
+ Assistance gratuite
+ Publicité Web
+ Regarder la publicité
Info
Infos sur l\'appareil
Version de l\'application : Release\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -110,8 +115,8 @@
Niveau API :
Notifications d\'utilisation de l\'application
Notifications de mise à jour
- Ça fait un moment !
- Une nouvelle mise à jour est disponible !
+ Ça fait un moment!
+ Une nouvelle mise à jour est disponible!
Créer un code-barres
Supprimer
Titre
@@ -122,7 +127,7 @@
Créer un code QR
Erreur
Quelque chose s\'est mal passé
- Supprimer ?
+ Supprimer?
Modifier le nom
Rotation vers la gauche
Rotation vers la droite
@@ -164,9 +169,9 @@
Temps restant : %s:%s
Actualiser
URL YouTube
- Essayez-le dès maintenant !!!
+ Essayez-le dès maintenant!!!
Partager via…
- Redémarrage nécessaire !
+ Redémarrage nécessaire!
Billet d\'embarquement
Identifiant de l\'annonce [AD_ID]
Internet [INTERNET]
@@ -175,6 +180,7 @@
Vibration [VIBRATE]
Accéder à l\'état du réseau [ACCESS_NETWORK_STATE]
Accéder à la politique de notification [ACCESS_NOTIFICATION_POLICY]
+ Facturation [BILLING]
Caméra [CAMERA]
Vérifier la licence [CHECK_LICENSE]
Service en premier plan [FOREGROUND_SERVICE]
@@ -182,15 +188,15 @@
Lire le stockage [READ_EXTERNAL_STORAGE]
Lire les images [READ_IMAGES]
Écrire dans le stockage [WRITE_EXTERNAL_STORAGE]
- Qu\'est-ce que QR & Bar Code Scanner Plus ?
- Quels sont les avantages d\'utiliser QR & Bar Code Scanner Plus ?
- Quelles sont les exigences système pour QR & Bar Code Scanner Plus ?
- Comment scanner un code QR avec QR & Bar Code Scanner Plus ?
- Comment créer un code QR avec QR & Bar Code Scanner Plus ?
- Comment changer le thème de QR & Bar Code Scanner Plus ?
- Comment signaler un bug ?
- Est-ce que QR & Bar Code Scanner Plus est sécurisé ?
- Comment contacter le développeur de l\'application ?
+ Qu\'est-ce que QR & Bar Code Scanner Plus?
+ Quels sont les avantages d\'utiliser QR & Bar Code Scanner Plus?
+ Quelles sont les exigences système pour QR & Bar Code Scanner Plus?
+ Comment scanner un code QR avec QR & Bar Code Scanner Plus?
+ Comment créer un code QR avec QR & Bar Code Scanner Plus?
+ Comment changer le thème de QR & Bar Code Scanner Plus?
+ Comment signaler un bug?
+ Est-ce que QR & Bar Code Scanner Plus est sécurisé?
+ Comment contacter le développeur de l\'application?
QR & Bar Code Scanner Plus est une application gratuite qui vous permet de scanner et de générer des codes QR. Elle peut scanner tous les formats de codes-barres courants, y compris QR, Data Matrix, Aztec, UPC, EAN, et bien d\'autres.
QR & Bar Code Scanner Plus est une application puissante, polyvalente et gratuite qui peut scanner tous les formats de codes-barres courants, utiliser une lampe de poche pour scanner dans l\'obscurité, zoomer pour lire les codes-barres à distance, se connecter au Wi-Fi, générer des codes QR à partir de textes, contacts, applications, favoris et presse-papiers, et dispose d\'une interface simple et intuitive.
QR & Bar Code Scanner Plus est compatible avec tous les appareils Android fonctionnant sous Android 8.0 (Oreo) ou version ultérieure.
@@ -212,7 +218,7 @@
Éviter les doublons dans l\'historique.
Cela nous permet de collecter des informations sur les performances de l\'application et les journaux d\'erreurs.
Choisir un moteur de recherche pour les recherches sur le Web.
- Cliquez ici si vous souhaitez me soutenir sans payer d\'argent. Juste un peu de temps pour regarder une publicité.
+ Faites un don et soutenez le développement de notre application. Vous pouvez également nous soutenir gratuitement en visitant notre site web ou en regardant une publicité vidéo.
Permet à l\'application de récupérer et d\'utiliser l\'identifiant publicitaire associé à l\'appareil de l\'utilisateur, de fournir des publicités personnalisées, de mesurer l\'efficacité des publicités et d\'afficher des publicités sur les appareils Android 13 ou ultérieurs.
Permet à l\'application de se connecter aux réseaux Wi-Fi en scannant des codes QR.
Permet à l\'application d\'établir une connexion Internet pour envoyer des rapports d\'erreur ou vérifier les mises à jour.
@@ -220,6 +226,7 @@
Permet à l\'application de vibrer lorsqu\'un code QR est scanné.
Permet à l\'application de vérifier la connectivité réseau et de récupérer des informations sur le Wi-Fi, y compris l\'état activé et les noms des appareils Wi-Fi connectés.
Permet à l\'application d\'accéder et de modifier la stratégie de notification de l\'appareil, de contrôler comment et quand les notifications sont affichées à l\'utilisateur et de fournir des fonctionnalités de gestion des notifications personnalisées.
+ Autorise l\'application à utiliser la bibliothèque de facturation Google Play pour gérer les achats intégrés et les dons.
Permet à l\'application de scanner des codes QR et des codes-barres à partir de l\'appareil photo.
Permet à l\'application de vérifier sa conformité avec l\'accord de licence et d\'appliquer les conditions de licence pour protéger la propriété intellectuelle.
Permet à l\'application de créer et d\'utiliser des services qui s\'exécutent en premier plan, leur accordant la priorité sur les autres processus en arrière-plan et améliorant les performances et la fiabilité.
@@ -228,12 +235,13 @@
Permet à l\'application de lire des images de votre appareil afin que vous puissiez les scanner pour les codes QR et les codes-barres sur les appareils exécutant Android 13 ou une version ultérieure.
Permet à l\'application d\'écrire sur votre stockage afin que vous puissiez enregistrer des fichiers, tels que des photos, des vidéos et des documents.
Lisez et acceptez nos conditions d\'utilisation et notre politique de confidentialité pour continuer.
- Pour prendre effet, veuillez redémarrer l\'application !
- Êtes-vous sûr de vouloir quitter ?
- Supprimer l\'historique ?
+ Pour prendre effet, veuillez redémarrer l\'application!
+ Êtes-vous sûr de vouloir quitter?
+ Peu importe le montant que vous donnez, vous nous aiderez à maintenir notre application en marche et à améliorer nos fonctionnalités. Nous apprécions votre générosité et votre gentillesse!
+ Supprimer l\'historique?
- Ouvrez votre application de navigateur\n- Chargez un site Web\n- Cliquez sur "Partager" dans le menu\n- Sélectionnez cette application.
- Ouvrez votre application de contacts\n- Ouvrez un contact existant ou créez-en un nouveau\n- Cliquez sur "Partager" dans le menu\n- Sélectionnez cette application
- Ne laissez pas vos compétences de développement Android prendre la poussière ! Revenez à l\'apprentissage et à l\'amélioration avec Android Studio Tutorials: Kotlin Edition dès aujourd\'hui. Notre application a quelque chose pour tout le monde, des débutants aux développeurs expérimentés.
+ Ne laissez pas vos compétences de développement Android prendre la poussière! Revenez à l\'apprentissage et à l\'amélioration avec Android Studio Tutorials: Kotlin Edition dès aujourd\'hui. Notre application a quelque chose pour tout le monde, des débutants aux développeurs expérimentés.
Une nouvelle version de l\'application est disponible. Cliquez ici pour mettre à jour.
Impossible d\'ouvrir Google Play Store.
Copié dans le presse-papiers! 📋
@@ -241,6 +249,7 @@
Enregistré dans la galerie
Aucune application trouvée pour cette action
Merci de nous évaluer! ❤️
+ Souhaitez-vous soutenir notre application? ❤️
Accepter les conditions générales.
Exporter votre historique.
Ouvrez-moi 🌐
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 45fdcdc..2bdba77 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -44,7 +44,7 @@
के बारे में
संगीत
संस्करण %1s
- © कॉपीराइट %1s, निर्माण %1s D4rK!
+ © कॉपीराइट %1s का निर्माण D4rK! द्वारा किया गया है।
बनाने में ❤ रोमानिया से!
सेटिंग्स
दिखावट
@@ -101,7 +101,12 @@
अधिक
साझा करें
और ऐप्स…
- मेरा समर्थन करें
+ डेवलपर का समर्थन करें
+ हमें समर्थन दें
+ पैड समर्थन
+ नॉन-पैड समर्थन
+ वेब विज्ञापन
+ विज्ञापन देखें
जानकारी
डिवाइस जानकारी
ऐप बिल्ड: रिलीज\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
हलचल [VIBRATE]
नेटवर्क स्थिति तक पहुंच [ACCESS_NETWORK_STATE]
सूचना नीति तक पहुंच [ACCESS_NOTIFICATION_POLICY]
+ बिलिंग [BILLING]
कैमरा [CAMERA]
लाइसेंस जांचें [CHECK_LICENSE]
प्रमुख सेवा [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
इतिहास में डुप्लिकेट बचाएँ।
यह हमें ऐप के प्रदर्शन और क्रैश लॉग के बारे में जानकारी इकट्ठा करने देता है।
वेब खोज के लिए एक खोज इंजन चुनें।
- यदि आप मेरा समर्थन करना चाहते हैं बिना कोई पैसे दें, तो यहां क्लिक करें। कुछ समय केवल एक विज्ञापन देखने के लिए।
+ हमारे ऐप विकास का योगदान दें और समर्थन करें। आप हमें हमारी वेबसाइट पर जाकर या एक वीडियो विज्ञापन देखकर मुफ्त में समर्थन देने के लिए भी समर्थन कर सकते हैं।
ऐप को उपयोगकर्ता के डिवाइस से जुड़े विज्ञापन पहचानकर्ता को प्राप्त और उपयोग करने की अनुमति देता है, व्यक्तिगत विज्ञापन प्रदान करना, विज्ञापन प्रभावीता का मापन करना और Android 13 या उसके बाद के उपकरणों पर विज्ञापन दिखाना।
ऐप को QR कोड स्कैन करके Wi-Fi नेटवर्कों से कनेक्ट होने की अनुमति देता है।
ऐप को त्रुटि रिपोर्ट भेजने या अपडेट की जांच करने के लिए इंटरनेट कनेक्शन स्थापित करने की अनुमति देता है।
@@ -221,6 +227,7 @@
जब QR कोड स्कैन किया जाता है, तो ऐप को हिलाने की अनुमति देता है।
ऐप को नेटवर्क कनेक्टिविटी की जांच करने और Wi-Fi के बारे में जानकारी प्राप्त करने, सक्षम स्थिति और कनेक्ट हुए Wi-Fi डिवाइस के नाम जैसे जानकारी प्राप्त करने की अनुमति देता है।
ऐप को उपयोगकर्ता के अधिसूचना नीति तक पहुंच और उसे संशोधित करने की अनुमति देता है, जिससे उपयोगकर्ता को अधिसूचनाएँ कब और कैसे प्रदर्शित होती हैं, और अनुकूलित अधिसूचना प्रबंधन सुविधाएँ प्रदान की जाती हैं।
+ ऐप को Google Play बिलिंग पुस्तकालय का उपयोग ऐप की खरीदारी और दान को संभालने के लिए करने की अनुमति देता है।
ऐप को कैमरे से QR कोड और बारकोड स्कैन करने की अनुमति देता है।
ऐप को लाइसेंस समझौते की अपनी पालना की पुष्टि करने और बौद्धिक संपदा संरक्षण के लाइसेंसिंग नियमों को प्रभारित करने की अनुमति देता है।
ऐप को पहल के अन्य पृष्ठभूमि प्रक्रियाओं के प्रति प्राथमिकता देता है और उन्हें उच्चतम प्रदर्शन और विश्वसनीयता प्रदान करने के लिए पहल सेवाएं बनाने और उपयोग करने की अनुमति देता हैं।
@@ -231,6 +238,7 @@
आगे बढ़ने के लिए हमारे सेवा की शर्तें और गोपनीयता नीति पढ़ें और स्वीकार करें।
प्रभावी होने के लिए कृपया ऐप को पुनः आरंभ करें!
क्या आप वाकई बाहर निकलना चाहते हैं?
+ चाहे आप जितनी भी दान करें, आप हमें अपने ऐप को चलाए रखने और हमारी सुविधाओं को सुधारने में मदद करेंगे। हम आपकी उदारता और दयालुता की कदर करते हैं!
इतिहास हटाएँ?
- अपना ब्राउज़र ऐप खोलें\n- एक वेबसाइट लोड करें\n- मेनू से "शेयर" क्लिक करें\n- इस ऐप का चयन करें।
- अपना संपर्क ऐप खोलें\n- मौजूदा संपर्क खोलें या एक नया बनाएं\n- मेनू से "शेयर" क्लिक करें\n- इस ऐप का चयन करें।
@@ -242,6 +250,7 @@
गैलरी में सहेजा गया
इस कार्रवाई के लिए कोई ऐप नहीं मिला
हमें रेटिंग देने के लिए धन्यवाद! ❤️
+ क्या आप हमारे ऐप का समर्थन करना चाहेंगे? ❤️
नियम और शर्तें स्वीकार करें।
अपना इतिहास निर्यात करें।
मुझे खोलें 🌐
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index cee97ea..d47093b 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -100,7 +100,12 @@
Továbbiak
Megosztás
További alkalmazások…
- Támogass engem
+ Támogasd a fejlesztőt
+ Támogatás
+ Fizetett támogatás
+ Díjmentes támogatás
+ Web hirdetés
+ Hirdetés megnézése
Információ
Eszközinformáció
Alkalmazás verziója: Kiadás\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
Rezgés [VIBRATE]
Hálózati állapot hozzáférés [ACCESS_NETWORK_STATE]
Értesítési szabályzat hozzáférés [ACCESS_NOTIFICATION_POLICY]
+ Számlázás [BILLING]
Kamera [CAMERA]
Licenc ellenőrzése [CHECK_LICENSE]
Előtérszolgáltatás [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
Kettőzött elemek elkerülése a történetben.
Lehetővé teszi az alkalmazás teljesítményével és összeomlási naplóival kapcsolatos információk gyűjtését.
Válasszon keresőmotort a webes keresésekhez.
- Kattintson ide, ha támogatni szeretne fizetés nélkül. Csak néhány pillanat azért, hogy megnézze a hirdetést.
+ Támogasd az alkalmazás fejlesztését adományozással. Ingyenesen is támogathatod minket weboldalunk látogatásával vagy egy videó hirdetés megtekintésével.
Lehetővé teszi az alkalmazás számára a felhasználó eszközéhez társított reklámazonosító lekérését és használatát, személyre szabott hirdetések biztosítására, a hirdetések hatékonyságának mérésére és a 13-as vagy újabb verziójú Android eszközökön történő hirdetések megjelenítésére.
Lehetővé teszi az alkalmazás számára, hogy QR-kódok beolvasásával csatlakozzon Wi-Fi-hálózatokhoz.
Lehetővé teszi az alkalmazás számára az internetkapcsolat létesítését hibajelentések küldéséhez vagy frissítések ellenőrzéséhez.
@@ -220,6 +226,7 @@
Engedélyezi az alkalmazás számára, hogy rezgessen, amikor QR-kódot olvasnak be.
Engedélyezi az alkalmazás számára a hálózati kapcsolat ellenőrzését és a Wi-Fi-hálózat információinak lekérését, ideértve az engedélyezett állapotot és a csatlakoztatott Wi-Fi-készülék nevét.
Engedélyezi az alkalmazás számára a készülék értesítési irányelveinek elérését és módosítását, a felhasználó számára történő testreszabott értesítéskezelési funkciók biztosítását és az értesítések megjelenítésének és időzítésének irányítását.
+ Engedélyezi az alkalmazás számára a Google Play Billing könyvtár használatát a vásárlások és adományok kezeléséhez.
Engedélyezi az alkalmazás számára a QR-kódok és vonalkódok beolvasását a kamera segítségével.
Engedélyezi az alkalmazás számára, hogy ellenőrizze a licencszerződés betartását és az intellektuális tulajdon védelme érdekében a licencfeltételek érvényesítését.
Engedélyezi az alkalmazás számára a háttérben futó folyamatoknál prioritást élvező szolgáltatások létrehozását és használatát, ezzel javítva a teljesítményt és a megbízhatóságot.
@@ -230,6 +237,7 @@
Az Általános Szerződési Feltételek és Adatvédelmi Szabályzatunk elolvasása és elfogadása szükséges a folytatáshoz.
Az érvényesítés érdekében indítsa újra az alkalmazást!
Biztosan kilép?
+ Nem számít, hogy mennyit adományozol, segítesz fenntartani az alkalmazásunkat és fejleszteni a funkcióinkat. Nagyrabecsüljük a nagylelkűséged és a kedvességed!
Törölje a előzményeket?
- Nyissa meg a böngészőalkalmazást\n- Töltse be a webhelyet\n- Kattintson az „Ossza meg” lehetőségre a menüben\n- Válassza ki ezt az alkalmazást.
- Nyissa meg a kapcsolatai alkalmazást\n- Nyisson meg egy meglévő kapcsolatot, vagy hozzon létre egy újat\n- Kattintson az „Ossza meg” lehetőségre a menüben\n- Válassza ki ezt az alkalmazást.
@@ -241,6 +249,7 @@
Elmentve a Galériába
Nincs alkalmazás ehhez a művelethez
Köszönjük az értékelést! ❤️
+ Szeretnéd támogatni az alkalmazásunkat? ❤️
Elfogadom a feltételeket és az adatvédelmi szabályzatot.
Előzmények exportálása.
Nyiss meg 🌐
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 2d05a83..664b38c 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -101,7 +101,12 @@
Lainnya
Bagikan
Aplikasi lainnya…
- Dukung saya
+ Dukung pengembang
+ Dukung Kami
+ Dukungan Berbayar
+ Dukungan Tanpa Bayaran
+ Iklan Web
+ Tonton Iklan
Info
Informasi Perangkat
Build Aplikasi: Rilis\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Getar [VIBRATE]
Akses status jaringan [ACCESS_NETWORK_STATE]
Akses kebijakan notifikasi [ACCESS_NOTIFICATION_POLICY]
+ Penagihan [BILLING]
Kamera [CAMERA]
Periksa lisensi [CHECK_LICENSE]
Layanan latar depan [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Hindari duplikat dalam riwayat.
Ini memungkinkan kami mengumpulkan informasi tentang kinerja aplikasi dan catatan crash.
Pilih mesin pencari untuk pencarian web.
- Klik di sini jika Anda ingin mendukung saya tanpa membayar uang. Hanya butuh beberapa waktu untuk melihat iklan.
+ Donasikan dan dukung pengembangan aplikasi kami. Anda juga dapat mendukung kami secara gratis dengan mengunjungi situs web kami atau menonton iklan video.
Memungkinkan aplikasi untuk mengambil dan menggunakan pengenal iklan yang terkait dengan perangkat pengguna, menyediakan iklan personalisasi, mengukur efektivitas iklan, dan menampilkan iklan di perangkat Android 13 atau yang lebih baru.
Memungkinkan aplikasi untuk terhubung ke jaringan Wi-Fi dengan memindai kode QR.
Memungkinkan aplikasi untuk melakukan koneksi internet untuk mengirim laporan kesalahan atau memeriksa pembaruan.
@@ -221,6 +227,7 @@
Memungkinkan aplikasi untuk bergetar saat kode QR dipindai.
Memungkinkan aplikasi untuk memeriksa konektivitas jaringan dan mengambil informasi tentang Wi-Fi, termasuk status diaktifkan dan nama perangkat Wi-Fi yang terhubung.
Memungkinkan aplikasi untuk mengakses dan memodifikasi kebijakan notifikasi perangkat, mengontrol bagaimana dan kapan notifikasi ditampilkan kepada pengguna, dan menyediakan fitur pengelolaan notifikasi kustom.
+ Memungkinkan aplikasi untuk menggunakan Pustaka Penagihan Google Play untuk menangani pembelian dalam aplikasi dan sumbangan.
Memungkinkan aplikasi untuk memindai kode QR dan kode batang dari kamera.
Memungkinkan aplikasi untuk memverifikasi kepatuhannya dengan perjanjian lisensi dan menegakkan syarat-syarat lisensi untuk melindungi kekayaan intelektual.
Memungkinkan aplikasi untuk membuat dan menggunakan layanan yang berjalan di latar depan, memberi mereka prioritas di atas proses latar belakang lainnya, serta meningkatkan kinerja dan keandalan.
@@ -231,6 +238,7 @@
Baca dan setujui Ketentuan Layanan dan Kebijakan Privasi kami untuk melanjutkan.
Untuk berlaku, harap restart aplikasi!
Apakah Anda yakin ingin keluar?
+ Tidak peduli seberapa besar sumbangan Anda, Anda akan membantu kami menjalankan aplikasi kami dan meningkatkan fitur kami. Kami menghargai kedermawanan dan kebaikan Anda!
Hapus riwayat?
- Buka aplikasi browser Anda\n- Muat situs web\n- Klik "Bagikan" dari menu\n- Pilih aplikasi ini.
- Buka aplikasi kontak Anda\n- Buka kontak yang ada atau buat yang baru\n- Klik "Bagikan" dari menu\n- Pilih aplikasi ini
@@ -242,6 +250,7 @@
Disimpan ke Galeri
Tidak ada aplikasi yang ditemukan untuk tindakan ini
Terima kasih atas penilaian Anda! ❤️
+ Apakah Anda ingin mendukung aplikasi kami? ❤️
Setujui syarat dan ketentuan.
Ekspor riwayat Anda.
Buka saya 🌐
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index bebcc50..38c2f63 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -101,7 +101,12 @@
Altro
Condividi
Altre app…
- Supportami
+ Supporta lo sviluppatore
+ Supportaci
+ Supporto a pagamento
+ Supporto gratuito
+ Annuncio web
+ Guarda annuncio
Informazioni
Informazioni dispositivo
Build app: Release\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Vibrazione [VIBRATE]
Accesso stato rete [ACCESS_NETWORK_STATE]
Accesso alle politiche di notifica [ACCESS_NOTIFICATION_POLICY]
+ Fatturazione [BILLING]
Fotocamera [CAMERA]
Verifica licenza [CHECK_LICENSE]
Servizio in primo piano [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Evita duplicati nella cronologia.
Ci permette di raccogliere informazioni sulle prestazioni dell\'app e i log degli errori.
Scegli un motore di ricerca per le ricerche web.
- Clicca qui se vuoi supportarmi senza pagare. Basta un po\' di tempo per visualizzare un annuncio.
+ Dona e supporta lo sviluppo della nostra app. Puoi anche supportarci gratuitamente visitando il nostro sito web o guardando un annuncio video.
Consente all\'app di recuperare e utilizzare l\'ID pubblicitario associato al dispositivo dell\'utente, fornendo annunci personalizzati, misurando l\'efficacia degli annunci e mostrando annunci sui dispositivi Android 13 o successivi.
Consente all\'app di connettersi a reti Wi-Fi scansionando codici QR.
Consente all\'app di stabilire una connessione Internet per inviare segnalazioni di errori o verificare gli aggiornamenti.
@@ -221,6 +227,7 @@
Consente all\'app di vibrare quando viene scansionato un codice QR.
Consente all\'app di verificare la connettività di rete e recuperare informazioni sul Wi-Fi, inclusi lo stato abilitato e i nomi dei dispositivi Wi-Fi connessi.
Consente all\'app di accedere e modificare la politica di notifica del dispositivo, controllando come e quando vengono visualizzate le notifiche per l\'utente e fornendo funzionalità personalizzate di gestione delle notifiche.
+ Consente all\'app di utilizzare la libreria di fatturazione di Google Play per gestire acquisti in-app e donazioni.
Consente all\'app di scansionare codici QR e codici a barre dalla fotocamera.
Consente all\'app di verificare la conformità all\'accordo di licenza e applicare i termini di licenza per proteggere la proprietà intellettuale.
Consente all\'app di creare e utilizzare servizi che funzionano in primo piano, dandogli la priorità rispetto ad altri processi in background e migliorando le prestazioni e l\'affidabilità.
@@ -231,6 +238,7 @@
Leggi e accetta i nostri Termini di servizio e Informativa sulla privacy per continuare.
Per rendere effettive le modifiche, riavvia l\'app!
Sei sicuro di voler uscire?
+ Non importa quanto doni, ci aiuterai a mantenere in funzione la nostra app e migliorare le nostre funzionalità. Apprezziamo la tua generosità e gentilezza!
Eliminare la cronologia?
- Apri l\'app del browser\n- Carica un sito web\n- Fai clic su "Condividi" dal menu\n- Seleziona questa app.
- Apri l\'app dei contatti\n- Apri un contatto esistente o crea un nuovo contatto\n- Fai clic su "Condividi" dal menu\n- Seleziona questa app.
@@ -242,6 +250,7 @@
Salvato in Galleria
Nessuna app trovata per questa azione
Grazie per averci valutato! ❤️
+ Ti piacerebbe supportare la nostra app? ❤️
Accetta i termini e le condizioni.
Esporta la tua cronologia.
Aprimi 🌐
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index e56a09a..a3ca461 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -100,7 +100,12 @@
その他
共有
他のアプリ…
- サポートする
+ 開発者のサポート
+ サポートする
+ 有料サポート
+ 無料サポート
+ ウェブ広告
+ 広告を視聴
情報
デバイス情報
アプリビルド:リリース\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
バイブレーション [VIBRATE]
ネットワーク状態にアクセス [ACCESS_NETWORK_STATE]
通知ポリシーにアクセス [ACCESS_NOTIFICATION_POLICY]
+ 課金 [BILLING]
カメラ [CAMERA]
ライセンスをチェック [CHECK_LICENSE]
フォアグラウンドサービス [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
履歴に重複を保存しません
アプリのパフォーマンスとクラッシュログに関する情報を収集できます
Web検索に使用する検索エンジンを選択します
- お金を払わずに私をサポートしたい場合は、ここをクリックしてください。広告を表示するだけで十分です。
+ アプリの開発を寄付でサポートしてください。ウェブサイトの訪問やビデオ広告の視聴によって無償でサポートすることもできます。
ユーザーの端末に関連付けられた広告識別子(IDFA)を取得して使用します。これにより、パーソナライズされた広告を表示したり、広告の効果を測定したり、Android 13以降を搭載した端末で広告を表示したりできます。
QRコードをスキャンしてWi-Fiネットワークに接続できるようにします
エラーレポートを送信したり、更新をチェックしたりするために、インターネット接続を確立できるようにします
@@ -220,6 +226,7 @@
QRコードをスキャンしたときに端末を振動できるようにします
ネットワーク接続の可用性とWi-Fiに関する情報(有効な状態と接続されているWi-Fiデバイス名など)を取得できるようにします
端末の通知ポリシーにアクセスして変更できるようにします。これにより、通知の表示方法と表示タイミングを制御し、カスタム通知管理機能を提供できます。
+ アプリ内の購入や寄付を処理するために Google Play Billing Library を使用する許可です。
QRコードとバーコードをカメラからスキャンできるようにします
ライセンス契約に準拠していることを検証し、知的財産を保護するためにライセンス条件を適用できるようにします
端末で常に動作するサービスを作成および使用できるようにします。これにより、他のバックグラウンドプロセスよりも優先され、パフォーマンスと信頼性が向上します。
@@ -230,6 +237,7 @@
続行するには、利用規約とプライバシーポリシーを読み、同意してください
有効にするには、アプリを再起動してください!
終了してもよろしいですか?
+ 寄付の額に関わらず、私たちのアプリの運営や機能の改善にご協力いただければ幸いです。ご好意に感謝申し上げます!
履歴を削除しますか?
- ブラウザアプリを開く\n- ウェブサイトを開く\n- メニューから「共有」をクリック\n- このアプリを選択してください。
- 連絡先アプリを開く\n- 既存の連絡先を開くか、新しい連絡先を作成\n- メニューから「共有」をクリック\n- このアプリを選択してください。
@@ -241,6 +249,7 @@
ギャラリーに保存されました
この操作に適したアプリが見つかりません
評価ありがとうございます! ❤️
+ アプリをサポートしていただけますか? ❤️
利用規約に同意します。
履歴をエクスポートします。
開きます 🌐
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 5be3359..b7e75d4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -100,7 +100,12 @@
Więcej
Udostępnij
Więcej aplikacji…
- Wesprzyj mnie
+ Wsparcie dla dewelopera
+ Wspieraj nas
+ Wsparcie płatne
+ Wsparcie nieodpłatne
+ Reklama internetowa
+ Obejrzyj reklamę
Informacje
Informacje o urządzeniu
Budowa aplikacji: Wydanie\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
Wibracja [VIBRATE]
Dostęp do stanu sieci [ACCESS_NETWORK_STATE]
Dostęp do polityki powiadomień [ACCESS_NOTIFICATION_POLICY]
+ Płatności [BILLING]
Kamera [CAMERA]
Sprawdzanie licencji [CHECK_LICENSE]
Usługa w tle [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
Unikaj duplikatów w historii.
Pozwala na zbieranie informacji o wydajności aplikacji i dziennikach błędów.
Wybierz silnik wyszukiwania dla wyszukiwania w sieci.
- Kliknij tutaj, jeśli chcesz wesprzeć mnie bez płacenia. Poświęć trochę czasu na obejrzenie reklamy.
+ Wspomóż rozwój naszej aplikacji. Możesz nas również wesprzeć za darmo, odwiedzając naszą stronę internetową lub oglądając reklamy wideo.
Umożliwia aplikacji pobieranie i korzystanie z identyfikatora reklamowego powiązanego z urządzeniem użytkownika, dostarczanie spersonalizowanych reklam, mierzenie skuteczności reklam i wyświetlanie reklam na urządzeniach z systemem Android 13 lub nowszym.
Umożliwia aplikacji łączenie się z sieciami Wi-Fi poprzez skanowanie kodów QR.
Umożliwia aplikacji nawiązanie połączenia internetowego w celu wysyłania raportów o błędach lub sprawdzania aktualizacji.
@@ -220,6 +226,7 @@
Umożliwia aplikacji wibrację podczas skanowania kodu QR.
Umożliwia aplikacji sprawdzanie połączenia z siecią i pobieranie informacji o sieci Wi-Fi, w tym o jej statusie i podłączonych urządzeniach Wi-Fi.
Umożliwia aplikacji dostęp i modyfikację polityki powiadomień urządzenia, kontrolowanie sposobu i czasu wyświetlania powiadomień użytkownikowi oraz dostarczanie funkcji niestandardowego zarządzania powiadomieniami.
+ Pozwala aplikacji korzystać z biblioteki Google Play Billing do obsługi zakupów w aplikacji i darowizn.
Umożliwia aplikacji skanowanie kodów QR i kodów kreskowych za pomocą aparatu.
Umożliwia aplikacji sprawdzenie zgodności z umową licencyjną i egzekwowanie warunków licencjonowania w celu ochrony praw własności intelektualnej.
Umożliwia aplikacji tworzenie i korzystanie z usług działających w trybie pierwszego planu, dając im pierwszeństwo przed innymi procesami w tle, co poprawia wydajność i niezawodność.
@@ -230,6 +237,7 @@
Zapoznaj się i zaakceptuj nasze Warunki korzystania i Politykę prywatności, aby kontynuować.
Aby wprowadzić zmiany, zrestartuj aplikację!
Czy na pewno chcesz wyjść?
+ Nie ma znaczenia, ile darowizny przekażesz, pomożesz nam utrzymać działanie naszej aplikacji i ulepszyć nasze funkcje. Doceniamy twoją hojność i życzliwość!
Usunąć historię?
- Otwórz aplikację przeglądarki\n- Załaduj stronę internetową\n- Kliknij przycisk „Udostępnij” w menu\n- Wybierz tę aplikację.
- Otwórz aplikację Kontakty\n- Otwórz istniejący kontakt lub utwórz nowy\n- Kliknij przycisk „Udostępnij” w menu\n- Wybierz tę aplikację.
@@ -241,6 +249,7 @@
Zapisano w galerii
Nie znaleziono aplikacji dla tej akcji
Dziękujemy za ocenę! ❤️
+ Czy chciałbyś wesprzeć naszą aplikację? ❤️
Zaakceptuj warunki i zasady.
Eksportuj historię.
Otwórz mnie 🌐
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 5aed1ff..650f6e5 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -101,7 +101,12 @@
Mai mult
Partajează
Mai multe aplicații…
- Suportă-mă
+ Susține dezvoltatorul
+ Susține-ne
+ Suport Plătit
+ Suport Necalificat
+ Reclamă Web
+ Vizualizează Reclamă
Informații
Informații despre dispozitiv
Versiunea aplicației: Versiune de lansare\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Vibrează [VIBRATE]
Accesează starea rețelei [ACCESS_NETWORK_STATE]
Accesează politica de notificare [ACCESS_NOTIFICATION_POLICY]
+ Facturare [BILLING]
Cameră [CAMERA]
Verifică licența [CHECK_LICENSE]
Serviciu în prim plan [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Evită duplicatele în istoric.
Acest lucru ne permite să colectăm informații despre performanța aplicației și jurnalele de erori.
Alegeți un motor de căutare pentru căutările pe web.
- Faceți clic aici dacă doriți să mă susțineți fără să plătiți bani. Doar ceva timp pentru vizualizarea unui anunț.
+ Donează și susține dezvoltarea aplicației noastre. De asemenea, ne puteți susține gratuit vizitând site-ul nostru web sau vizionând un anunț video.
Permite aplicației să preia și să utilizeze identificatorul de publicitate asociat dispozitivului utilizatorului, oferind anunțuri personalizate, măsurând eficacitatea anunțurilor și afișând anunțuri pe dispozitivele Android 13 sau mai noi.
Permite aplicației să se conecteze la rețele Wi-Fi prin scanarea codurilor QR.
Permite aplicației să stabilească o conexiune la internet pentru a trimite rapoarte de erori sau a verifica actualizările.
@@ -221,6 +227,7 @@
Permite aplicației să vibreze atunci când este scanat un cod QR.
Permite aplicației să verifice conectivitatea la rețea și să preia informații despre Wi-Fi, inclusiv starea activată și numele dispozitivelor Wi-Fi conectate.
Permite aplicației să acceseze și să modifice politica de notificare a dispozitivului, controlând modul și momentul în care notificările sunt afișate utilizatorului și oferind funcții personalizate de gestionare a notificărilor.
+ Permite aplicației să utilizeze Biblioteca Google Play Billing pentru a gestiona achizițiile în aplicație și donațiile.
Permite aplicației să scaneze coduri QR și coduri de bare de la camera foto.
Permite aplicației să verifice conformitatea cu acordul de licență și să impună termenii de licențiere pentru a proteja proprietatea intelectuală.
Permite aplicației să creeze și să utilizeze servicii care rulează în prim-plan, oferindu-le prioritate față de alte procese în fundal și îmbunătățind performanța și fiabilitatea.
@@ -231,6 +238,7 @@
Citiți și acceptați Termenii și condițiile noastre de utilizare și Politica de confidențialitate pentru a continua.
Pentru a avea efect, vă rugăm să reporniți aplicația!
Sunteți sigur că doriți să închideți?
+ Indiferent cât de mult donezi, ne vei ajuta să menținem funcționarea aplicației noastre și să îmbunătățim funcționalitățile noastre. Apreciem generozitatea și amabilitatea ta!
Ștergeți istoricul?
- Deschideți aplicația dvs. de browser\n- Încărcați un site web\n- Faceți clic pe \"Partajează\" din meniu\n- Selectați această aplicație.
- Deschideți aplicația dvs. de contacte\n- Deschideți un contact existent sau creați unul nou\n- Faceți clic pe \"Partajează\" din meniu\n- Selectați această aplicație
@@ -242,6 +250,7 @@
Salvat în Galerie
Nu s-a găsit nicio aplicație pentru această acțiune
Mulțumim pentru evaluarea noastră! ❤️
+ Dorești să susții aplicația noastră? ❤️
Acceptați termenii și condițiile.
Exportați istoricul dvs.
Deschide-mă 🌐
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 3def82b..ae2bc0e 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -101,7 +101,12 @@
Еще
Поделиться
Больше приложений…
- Поддержать меня
+ Поддержите разработчика
+ Поддержите нас
+ Платная поддержка
+ Бесплатная поддержка
+ Веб-объявление
+ Посмотреть рекламу
Информация
Информация об устройстве
Сборка приложения: Релиз\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -176,6 +181,7 @@
Вибрация [VIBRATE]
Доступ к состоянию сети [ACCESS_NETWORK_STATE]
Доступ к политике уведомлений [ACCESS_NOTIFICATION_POLICY]
+ Выставление счетов [BILLING]
Камера [CAMERA]
Проверить лицензию [CHECK_LICENSE]
Служба в фоновом режиме [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Избегать дубликатов в истории.
Позволяет нам собирать информацию о производительности приложения и журналы ошибок.
Выберите поисковую систему для поиска в Интернете.
- Нажмите здесь, если вы хотите поддержать меня без оплаты. Просто посмотрите рекламу.
+ Пожертвуйте и поддержите разработку нашего приложения. Вы также можете поддержать нас бесплатно, посетив наш веб-сайт или просмотрев видеорекламу.
Позволяет приложению получать и использовать идентификатор рекламы, связанный с устройством пользователя, для предоставления персонализированных объявлений, измерения эффективности рекламы и показа объявлений на устройствах Android 13 или более поздних версий.
Позволяет приложению подключаться к сетям Wi-Fi путем сканирования QR-кодов.
Позволяет приложению устанавливать интернет-соединение для отправки отчетов об ошибках или проверки наличия обновлений.
@@ -221,6 +227,7 @@
Позволяет приложению выполнять вибрацию при сканировании QR-кода.
Позволяет приложению проверять сетевое подключение и получать информацию о Wi-Fi, включая статус имен и подключенных устройств Wi-Fi.
Позволяет приложению получать доступ к политике уведомлений устройства и изменять ее, управляя способом и временем отображения уведомлений пользователю и предоставляя функции настройки уведомлений.
+ Разрешает приложению использовать библиотеку Google Play Billing для обработки платежей внутри приложения и пожертвований.
Позволяет приложению сканировать QR-коды и штрих-коды с камеры.
Позволяет приложению проверить свою совместимость с лицензионным соглашением и применять условия лицензирования для защиты интеллектуальной собственности.
Позволяет приложению создавать и использовать службы, работающие в фоновом режиме, предоставляя им приоритет перед другими фоновыми процессами и улучшая производительность и надежность.
@@ -231,6 +238,7 @@
Прочтите и согласитесь с нашими условиями использования и политикой конфиденциальности, чтобы продолжить.
Для вступления в силу необходимо перезапустить приложение!
Вы уверены, что хотите выйти?
+ Независимо от того, сколько вы пожертвуете, вы поможете нам поддерживать работу нашего приложения и улучшать его функциональность. Мы ценим вашу щедрость и доброту!
Удалить историю?
- Откройте приложение браузера\n- Загрузите веб-сайт\n- Нажмите «Поделиться» в меню\n- Выберите это приложение.
- Откройте приложение контактов\n- Откройте существующий контакт или создайте новый\n- Нажмите «Поделиться» в меню\n- Выберите это приложение
@@ -242,6 +250,7 @@
Сохранено в Галерею
Приложение для этого действия не найдено
Спасибо за оценку! ❤️
+ Вы бы хотели поддержать наше приложение? ❤️
Принять условия и положения.
Экспортировать историю.
Откройте меня 🌐
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index d2ebac7..1f7a016 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -100,7 +100,12 @@
Mer
Dela
Fler appar…
- Stöd mig
+ Stöd utvecklaren
+ Stöd oss
+ Betalt stöd
+ Icke-betalt stöd
+ Webbad
+ Titta på annons
Info
Enhetsinfo
Appversion: Släpp\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
Vibration [VIBRATE]
Åtkomst till nätverksstatus [ACCESS_NETWORK_STATE]
Åtkomst till aviseringars inställningar [ACCESS_NOTIFICATION_POLICY]
+ Fakturering [BILLING]
Kamera [CAMERA]
Kontrollera licens [CHECK_LICENSE]
Förgrundstjänst [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
Undvik dupliceringar i historiken.
Det här gör att vi kan samla information om appens prestanda och felloggar.
Välj en sökmotor för webbsökningar.
- Klicka här om du vill stödja mig utan att betala pengar. Bara lite tid för att titta på en annons.
+ Donera och stöd vår apputveckling. Du kan även stödja oss gratis genom att besöka vår webbplats eller titta på en videoannons.
Tillåter appen att hämta och använda reklamidentifieraren associerad med användarens enhet, för att tillhandahålla anpassade annonser, mäta annonseffektivitet och visa annonser på Android 13 eller senare enheter.
Tillåter appen att ansluta till Wi-Fi-nätverk genom att skanna QR-koder.
Tillåter appen att upprätta en internetanslutning för att skicka felrapporter eller kontrollera uppdateringar.
@@ -220,6 +226,7 @@
Tillåter appen att vibrera när en QR-kod skannas.
Tillåter appen att kontrollera nätverksanslutning och hämta information om Wi-Fi, inklusive aktiveringsstatus och anslutna Wi-Fi-enhetsnamn.
Tillåter appen att få åtkomst till och ändra enhetens meddelandepolicy, kontrollera hur och när meddelanden visas för användaren och tillhandahålla anpassade funktioner för hantering av meddelanden.
+ Tillåter appen att använda Google Play Billing Library för att hantera in-app-köp och donationer.
Tillåter appen att skanna QR-koder och streckkoder från kameran.
Tillåter appen att verifiera sin överensstämmelse med licensavtalet och verkställa licensvillkor för att skydda immateriell egendom.
Tillåter appen att skapa och använda tjänster som körs i förgrunden och ger dem företräde framför andra bakgrundsprocesser samt förbättrar prestanda och tillförlitlighet.
@@ -230,6 +237,7 @@
Läs och godkänn våra användarvillkor och integritetspolicy för att fortsätta.
För att ändringarna ska träda i kraft, starta om appen!
Är du säker på att du vill avsluta?
+ Oavsett hur mycket du donerar, kommer du att hjälpa oss hålla vår app igång och förbättra våra funktioner. Vi uppskattar din generositet och vänlighet!
Radera historiken?
- Öppna din webbläsarapp\n- Ladda en webbplats\n- Klicka på "Dela" i menyn\n- Välj den här appen.
- Öppna din kontaktsapp\n- Öppna en befintlig kontakt eller skapa en ny\n- Klicka på "Dela" i menyn\n- Välj den här appen.
@@ -241,6 +249,7 @@
Sparat i Galleri
Ingen app hittades för denna åtgärd
Tack för att du betygsätter oss! ❤️
+ Vill du stödja vår app? ❤️
Acceptera villkor och bestämmelser.
Exportera din historik.
Öppna mig 🌐
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 86f77a0..8351a0e 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -101,7 +101,12 @@
Daha Fazla
Paylaş
Daha fazla uygulama…
- Beni Destekle
+ Geliştiriciyi Destekle
+ Bize Destek Ol
+ Ücretli Destek
+ Ücretsiz Destek
+ Web Reklamı
+ Reklam İzle
Bilgi
Cihaz Bilgileri
Uygulama Sürümü: Yayın\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -169,13 +174,14 @@
Paylaşma yöntemi…
Yeniden başlatma gerekiyor!
Biniş Kartı
- Reklam kimliği [REKLAM_KİMLİĞİ]
- İnternet [İNTERNET]
+ Reklam kimliği [AD_ID]
+ İnternet [INTERNET]
Wi-Fi [CHANGE_WIFI_STATE]
Bildirimleri gönder [POST_NOTIFICATIONS]
Titreşim [VIBRATE]
Ağ durumuna eriş [ACCESS_NETWORK_STATE]
Bildirim politikasına eriş [ACCESS_NOTIFICATION_POLICY]
+ Fatura [BILLING]
Kamera [CAMERA]
Lisansı kontrol et [CHECK_LICENSE]
Ön plan hizmeti [FOREGROUND_SERVICE]
@@ -213,7 +219,7 @@
Geçmişte yinelenenleri önle.
Bu, uygulama performansı ve çökme kayıtları hakkında bilgi toplamamızı sağlar.
Web aramaları için bir arama motoru seçin.
- Buraya tıklayarak ücretsiz olarak bana destek olabilirsiniz. Sadece bir reklamı görüntülemek için biraz zaman harcayın.
+ Uygulama geliştiricilerimize bağış yaparak ve destek olarak uygulama gelişimimize katkıda bulunabilirsiniz. Ayrıca web sitemizi ziyaret edebilir veya bir video reklamı izleyerek bize ücretsiz destek sağlayabilirsiniz.
Uygulamanın kullanıcının cihazıyla ilişkilendirilmiş reklam kimliğini almasına ve kullanmasına izin verir, kişiselleştirilmiş reklamlar sağlar, reklam etkinliğini ölçer ve Android 13 veya daha yeni cihazlarda reklamları gösterir.
Uygulamanın QR kodlarını tarayarak Wi-Fi ağlarına bağlanmasına izin verir.
Uygulamanın hata raporları göndermek veya güncellemeleri kontrol etmek için bir internet bağlantısı kurmasına izin verir.
@@ -221,6 +227,7 @@
QR kodu tarandığında uygulamanın titreşmesine izin verir.
Uygulamanın ağ bağlantısını kontrol etmesine ve etkin durumunu ve bağlı Wi-Fi cihazı adlarını içeren Wi-Fi hakkında bilgi almasına izin verir.
Uygulamanın cihazın bildirim politikasına erişmesine ve değiştirmesine izin verir, bildirimlerin nasıl ve ne zaman kullanıcıya gösterildiğini kontrol eder ve özel bildirim yönetimi özellikleri sağlar.
+ Uygulamanın Google Play Billing Kütüphanesini kullanarak uygulama içi satın alımları ve bağışları işlemesine izin verir.
Uygulamanın kamera aracılığıyla QR kodlarını ve barkodlarını taramasına izin verir.
Uygulamanın lisans sözleşmesine uygunluğunu doğrulamasına ve fikri mülkiyeti korumak için lisanslama koşullarını uygulamasına izin verir.
Uygulamanın arka plandaki diğer işlemlerin üstünde önceliğe sahip olacak şekilde çalışan hizmetler oluşturmasına ve kullanmasına izin verir, performansı ve güvenilirliği artırır.
@@ -231,6 +238,7 @@
Devam etmek için Hizmet Şartları ve Gizlilik Politikamızı okuyun ve kabul edin.
Yürürlüğe girmesi için lütfen uygulamayı yeniden başlatın!
Çıkmak istediğinizden emin misiniz?
+ Ne kadar bağış yaparsanız yapın, uygulamamızın çalışmasına ve özelliklerimizin geliştirilmesine yardımcı olacaksınız. Cömertliğinize ve nazikliğinize teşekkür ediyoruz!
Geçmişi silmek istiyor musunuz?
- Tarayıcı uygulamanızı açın\n- Bir web sitesi yükleyin\n- Menüden "Paylaş"ı tıklayın\n- Bu uygulamayı seçin.
- İletişim uygulamanızı açın\n- Mevcut bir kişiyi açın veya yeni bir kişi oluşturun\n- Menüden "Paylaş"ı tıklayın\n- Bu uygulamayı seçin.
@@ -242,6 +250,7 @@
Galeriye kaydedildi
Bu eylem için uygulama bulunamadı
Bize puan verdiğiniz için teşekkür ederiz! ❤️
+ Uygulamamızı desteklemek ister misiniz? ❤️
Şartları ve koşulları kabul edin.
Geçmişinizi dışa aktarın.
Beni aç 🌐
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 720879e..cc21c34 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -100,7 +100,12 @@
Додатково
Поділитися
Більше додатків…
- Підтримайте мене
+ Підтримайте розробника
+ Підтримати нас
+ Платна підтримка
+ Безкоштовна підтримка
+ Веб-реклама
+ Переглянути рекламу
Інформація
Інформація про пристрій
Збірка додатку: Версія\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -153,10 +158,8 @@
Відкрити в іншому додатку
Показати пароль
Поділитися як текст
- Зберегти як текст
Пошук в Інтернеті
- Поділитися як зображення
- Зберегти як зображення
+ Поділитися як зображенням
Друк
Підключення…
Збільшити яскравість
@@ -177,6 +180,7 @@
Вібрація [VIBRATE]
Доступ до стану мережі [ACCESS_NETWORK_STATE]
Доступ до політики повідомлень [ACCESS_NOTIFICATION_POLICY]
+ Оплата [BILLING]
Камера [CAMERA]
Перевірка ліцензії [CHECK_LICENSE]
Служба у передньому плані [FOREGROUND_SERVICE]
@@ -214,7 +218,7 @@
Уникнути дублікатів в історії.
Дозволяє нам збирати інформацію про продуктивність додатка та журнали помилок.
Виберіть пошуковий двигун для веб-пошуку.
- Натисніть тут, якщо ви хочете підтримати мене безкоштовно. Просто дайте деякий час для перегляду реклами.
+ Пожертвуйте та підтримайте розробку нашого додатку. Ви також можете підтримати нас безкоштовно, відвідавши наш вебсайт або переглянувши відеооголошення.
Дозволяє додатку отримувати та використовувати ідентифікатор реклами, пов\'язаний з пристроєм користувача, для надання персоналізованої реклами, вимірювання ефективності реклами та відображення реклами на пристроях з Android 13 або новішою версією.
Дозволяє додатку підключатися до бездротових мереж за допомогою сканування QR-кодів.
Дозволяє додатку встановлювати з\'єднання з Інтернетом для відправки звітів про помилки або перевірки наявності оновлень.
@@ -222,6 +226,7 @@
Дозволяє додатку вібрувати при скануванні QR-коду.
Дозволяє додатку перевіряти підключення до мережі та отримувати інформацію про Wi-Fi, включаючи статус і підключені імена пристроїв Wi-Fi.
Дозволяє додатку отримувати доступ до політики сповіщень пристрою, управляти тим, як і коли відображаються сповіщення користувачу, і надавати власні функції управління сповіщеннями.
+ Дозволяє додатку використовувати бібліотеку Google Play Billing для обробки покупок в додатку та пожертвувань.
Дозволяє додатку сканувати QR-коди та штрих-коди з камери.
Дозволяє додатку перевіряти відповідність ліцензійній угоді та забезпечувати дотримання умов ліцензування для захисту інтелектуальної власності.
Дозволяє додатку створювати та використовувати служби, що працюють на передньому плані, надаючи їм пріоритет перед іншими фоновими процесами та покращуючи продуктивність та надійність.
@@ -232,6 +237,7 @@
Ознайомтесь та погодьтеся з нашими Умовами надання послуг та Політикою конфіденційності, щоб продовжити.
Для вступу в силу, будь ласка, перезапустіть додаток!
Ви впевнені, що хочете вийти?
+ Без значення, скільки ви пожертвуєте, ви допоможете нам підтримувати роботу нашого додатка та покращувати його функціональність. Ми цінуємо вашу щедрість та доброту!
Видалити історію?
- Відкрийте свій веб-браузер\n- Завантажте веб-сайт\n- Натисніть "Поділитися" в меню\n- Виберіть цей додаток.
- Відкрийте свій додаток з контактами\n- Відкрийте існуючий контакт або створіть новий\n- Натисніть "Поділитися" в меню\n- Виберіть цей додаток
@@ -243,6 +249,7 @@
Збережено в Галереї
Додаток не знайдено для цієї дії
Дякуємо за вашу оцінку! ❤️
+ Чи бажаєте підтримати наше додаток? ❤️
Прийняти умови та положення.
Експортувати вашу історію.
Відкрийте мене 🌐
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 60125a5..87d8a47 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -100,7 +100,12 @@
More
Share
More apps…
- Support me
+ Support the developer
+ Support Us
+ Paid Support
+ Non-Paid Support
+ Web Ad
+ Watch Ad
Info
Device Info
App Build: Release\n%1$s\n%2$s\n%3$s\n%4$s\n%5$s
@@ -175,6 +180,7 @@
Vibrate [VIBRATE]
Access network state [ACCESS_NETWORK_STATE]
Access notification policy [ACCESS_NOTIFICATION_POLICY]
+ Billing [BILLING]
Camera [CAMERA]
Check license [CHECK_LICENSE]
Foreground service [FOREGROUND_SERVICE]
@@ -212,7 +218,7 @@
Avoid duplicates in history.
This let us collect information about app performance and crash logs.
Choose a search engine for web searches.
- Click here if you want to support me without paying money. Just some time for viewing an ad.
+ Donate and support our app development. You can also support us for free by visiting our website or watching a video ad.
Allows the app to retrieve and use the advertising identifier associated with the user\'s device, providing personalized ads, measuring ad effectiveness, and showing ads on Android 13 or later devices.
Allows the app to connect to Wi-Fi networks by scanning QR codes.
Allows the app to establish an internet connection to send error reports or check for updates.
@@ -220,6 +226,7 @@
Allows the app to vibrate when a QR code is scanned.
Allows the app to check network connectivity and retrieve information about Wi-Fi, including enabled status and connected Wi-Fi device names.
Allows the app to access and modify the device\'s notification policy, controlling how and when notifications are displayed to the user and providing custom notification management features.
+ Allows the app to use the Google Play Billing Library to handle in-app purchases and donations.
Allows the app to scan QR codes and barcodes from the camera.
Allows the app to verify its compliance with the license agreement and enforce licensing terms to protect intellectual property.
Allows the app to create and use services that run in the foreground, giving them priority over other background processes and improving performance and reliability.
@@ -230,6 +237,7 @@
Read and agree to our Terms of Service and Privacy Policy to continue.
To take effect please restart the app!
Are you sure you want to exit?
+ No matter how much you donate, you will help us keep our app running and improve our features. We appreciate your generosity and kindness!
Delete history?
- Open your browser app\n- Load a website\n- Click \"Share\" from the menu\n- Select this app.
- Open your contacts app\n- Open an existing contact or create a new one\n- Click \"Share\" from the menu\n- Select this app
@@ -241,6 +249,7 @@
Saved to Gallery
No app found for this action
Thanks for rating us! ❤️
+ Would you like to support our app? ❤️
Accept the terms and conditions.
Export your history.
Open me 🌐
diff --git a/app/src/main/res/values/untranslatable_strings.xml b/app/src/main/res/values/untranslatable_strings.xml
index 8d52310..1ebef81 100644
--- a/app/src/main/res/values/untranslatable_strings.xml
+++ b/app/src/main/res/values/untranslatable_strings.xml
@@ -47,23 +47,7 @@
Send mail using:
Changelog - Version %1s
\n
- • Added a new startup screen for new users.\n\n
- • Added a new GDPR message to comply with Google Play policy.\n\n
- • Added a new help center, with more comprehensive documentation and support options.\n\n
- • Added language support for Bulgarian, French, German, Hindi, Italian, Polish, Spanish, Swedish, Turkish and Ukrainian.\n\n
- • Added snack bars instead of toasts for all notifications.\n\n
- • Added tooltips to help users understand what is happening in the app.\n\n
- • Added an exit dialog to confirm the user\'s intention to leave the app.\n\n
- • Added in-app updates to allow users to easily update the app without going through the Google Play Store.\n\n
- • Added the ability to disable Firebase Analytics and Crashlytics from the app settings.\n\n
- • Added the ability to change the style of the navigation bar labels from the app settings.\n\n
- • Added the ability to change the startup screen from the app settings.\n\n
- • Added the ability to access notification settings from the app settings.\n\n
- • Added update notifications to inform users of new content and features.\n\n
- • Added welcome back notifications to greet returning users.\n\n
- • Reworked, improved and refreshed the user interface.\n\n
- • Reworked and improved animations.\n\n
- • Reworked language system, making it more accurate and user-friendly.\n\n
+ • Added a new support page to show appreciation and gratitude to the developer.\n\n
• Fixed various bugs and improved readability, consistency, app performance, and responsiveness by optimizing and styling the outdated code.\n\n
• Made various project structure enhancements for better readability and maintainability.\n\n
• Made various under-the-hood improvements for a better overall app experience.
diff --git a/app/src/main/res/xml/preferences_permissions.xml b/app/src/main/res/xml/preferences_permissions.xml
index 3ab3b71..075c9ec 100644
--- a/app/src/main/res/xml/preferences_permissions.xml
+++ b/app/src/main/res/xml/preferences_permissions.xml
@@ -39,6 +39,10 @@
app:title="@string/access_notification_policy"
app:summary="@string/summary_preference_permissions_access_notification_policy"
app:iconSpaceReserved="false"/>
+
+ app:title="@string/support_the_developer"
+ app:summary="@string/summary_preference_settings_support_developer">
+ android:targetPackage="com.d4rk.qrcodescanner.plus"
+ android:targetClass="com.d4rk.qrcodescanner.plus.ui.settings.support.SupportActivity"/>
\(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
+ PRG="$link";
else
PRG=`dirname "$PRG"`"/$link"
fi
@@ -68,16 +68,16 @@ nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
- ;;
+ ;
Darwin* )
darwin=true
- ;;
+ ;
MINGW* )
msys=true
- ;;
+ ;
NONSTOP* )
nonstop=true
- ;;
+ ;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -159,16 +159,16 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
i=`expr $i + 1`
done
case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ 0) set -- ;
+ 1) set -- "$args0" ;
+ 2) set -- "$args0" "$args1" ;
+ 3) set -- "$args0" "$args1" "$args2" ;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;
esac
fi
diff --git a/settings.gradle b/settings.gradle.kts
similarity index 66%
rename from settings.gradle
rename to settings.gradle.kts
index 6e45a0a..a10bd30 100644
--- a/settings.gradle
+++ b/settings.gradle.kts
@@ -1,13 +1,17 @@
+@file:Suppress("UnstableApiUsage")
+
pluginManagement {
repositories {
gradlePluginPortal()
google()
+ //noinspection JcenterRepositoryObsolete
+ jcenter()
+ maven(url = "https://jitpack.io")
mavenCentral()
- maven { url 'https://jitpack.io' }
}
resolutionStrategy {
eachPlugin {
- if (requested.id.id == 'com.google.android.gms.oss-licenses-plugin') {
+ if (requested.id.id == "com.google.android.gms.oss-licenses-plugin") {
useModule("com.google.android.gms:oss-licenses-plugin:${requested.version}")
}
}
@@ -19,9 +23,9 @@ dependencyResolutionManagement {
google()
//noinspection JcenterRepositoryObsolete
jcenter()
+ maven(url = "https://jitpack.io")
mavenCentral()
- maven { url 'https://jitpack.io' }
}
}
rootProject.name = "QR & Bar Code Scanner Plus"
-include ':app'
\ No newline at end of file
+include(":app")
\ No newline at end of file