From 166778ea539f4e54d53e5a175ced25117af60392 Mon Sep 17 00:00:00 2001 From: beasonxu Date: Fri, 30 Aug 2024 09:11:53 +0800 Subject: [PATCH 1/2] add qr scanner --- app/build.gradle.kts | 2 ++ app/src/main/AndroidManifest.xml | 4 ++++ .../java/com/github/kr328/clash/NewProfileActivity.kt | 6 +++++- .../github/kr328/clash/design/model/ProfileProvider.kt | 8 ++++++++ .../src/main/res/drawable/baseline_qr_code_scanner.xml | 9 +++++++++ design/src/main/res/values-ja-rJP/strings.xml | 1 + design/src/main/res/values-ko-rKR/strings.xml | 1 + design/src/main/res/values-ru/strings.xml | 1 + design/src/main/res/values-zh-rHK/strings.xml | 1 + design/src/main/res/values-zh-rTW/strings.xml | 1 + design/src/main/res/values-zh/strings.xml | 1 + design/src/main/res/values/strings.xml | 2 ++ 12 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 design/src/main/res/drawable/baseline_qr_code_scanner.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 20f61121b..ce333553f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -24,6 +24,8 @@ dependencies { implementation(libs.androidx.coordinator) implementation(libs.androidx.recyclerview) implementation(libs.google.material) + implementation("com.google.android.gms:play-services-code-scanner:16.1.0") + } tasks.getByName("clean", type = Delete::class) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cbb763a67..2291a8cc3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -193,5 +193,9 @@ + + diff --git a/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt b/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt index 8df167d12..0b9654f9d 100644 --- a/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt @@ -46,6 +46,10 @@ class NewProfileActivity : BaseActivity() { create(Profile.Type.File, name) is ProfileProvider.Url -> create(Profile.Type.Url, name) + is ProfileProvider.QR -> { + val url = "https://sub1.smallstrawberry.com/api/v1/client/subscribe?token=30d90424070ef1159ed206b3481ecc88" + create(Profile.Type.Url, name,url) + } is ProfileProvider.External -> { val data = p.get() @@ -137,7 +141,7 @@ class NewProfileActivity : BaseActivity() { ProfileProvider.External(name.toString(), summary.toString(), icon, intent) } - listOf(ProfileProvider.File(self), ProfileProvider.Url(self)) + providers + listOf(ProfileProvider.File(self), ProfileProvider.Url(self),ProfileProvider.QR(self)) + providers } } } diff --git a/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt b/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt index 7b09c22bd..0c40cf1db 100644 --- a/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt +++ b/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt @@ -25,6 +25,14 @@ sealed class ProfileProvider { get() = context.getDrawableCompat(R.drawable.ic_baseline_cloud_download) } + class QR(private val context: Context) : ProfileProvider() { + override val name: String + get() = context.getString(R.string.qr) + override val summary: String + get() = context.getString(R.string.import_from_qr) + override val icon: Drawable? + get() = context.getDrawableCompat(R.drawable.baseline_qr_code_scanner) + } class External( override val name: String, override val summary: String, diff --git a/design/src/main/res/drawable/baseline_qr_code_scanner.xml b/design/src/main/res/drawable/baseline_qr_code_scanner.xml new file mode 100644 index 000000000..0c3341938 --- /dev/null +++ b/design/src/main/res/drawable/baseline_qr_code_scanner.xml @@ -0,0 +1,9 @@ + + + + diff --git a/design/src/main/res/values-ja-rJP/strings.xml b/design/src/main/res/values-ja-rJP/strings.xml index 65f2ed9fa..fc9d7b5cc 100644 --- a/design/src/main/res/values-ja-rJP/strings.xml +++ b/design/src/main/res/values-ja-rJP/strings.xml @@ -32,6 +32,7 @@ ファイルからインポート URL URLからインポート + QRコードからインポート 外部入力 %s (未保存) アプリが破損しています diff --git a/design/src/main/res/values-ko-rKR/strings.xml b/design/src/main/res/values-ko-rKR/strings.xml index f09bd825d..42bc18b8d 100644 --- a/design/src/main/res/values-ko-rKR/strings.xml +++ b/design/src/main/res/values-ko-rKR/strings.xml @@ -33,6 +33,7 @@ URL URL에서 가져오기 외부 + QR코드에서 가져오기 %s (저장되지 않음) 앱 오류 앱 중지 diff --git a/design/src/main/res/values-ru/strings.xml b/design/src/main/res/values-ru/strings.xml index a1e42712f..a8652d336 100644 --- a/design/src/main/res/values-ru/strings.xml +++ b/design/src/main/res/values-ru/strings.xml @@ -41,6 +41,7 @@ URL Импорт из URL Внешний + Импорт из QR-кода %s (не сохранён) Приложение сломано diff --git a/design/src/main/res/values-zh-rHK/strings.xml b/design/src/main/res/values-zh-rHK/strings.xml index 28fe01529..ea71598a8 100644 --- a/design/src/main/res/values-zh-rHK/strings.xml +++ b/design/src/main/res/values-zh-rHK/strings.xml @@ -42,6 +42,7 @@ 從文件導入 從 URL 導入 界面 + 從二維碼導入 無效的 URL Clash Meta Logcat diff --git a/design/src/main/res/values-zh-rTW/strings.xml b/design/src/main/res/values-zh-rTW/strings.xml index 42bf15cc7..6ad965df7 100644 --- a/design/src/main/res/values-zh-rTW/strings.xml +++ b/design/src/main/res/values-zh-rTW/strings.xml @@ -41,6 +41,7 @@ 歷史 從檔案匯入 從 URL 匯入 + 從二維碼導入 介面 無效 URL Clash Meta diff --git a/design/src/main/res/values-zh/strings.xml b/design/src/main/res/values-zh/strings.xml index dc92cdac7..8d402fa22 100644 --- a/design/src/main/res/values-zh/strings.xml +++ b/design/src/main/res/values-zh/strings.xml @@ -41,6 +41,7 @@ 历史 从文件导入 从 URL 导入 + 从二维码导入 界面 无效的 URL Clash Meta diff --git a/design/src/main/res/values/strings.xml b/design/src/main/res/values/strings.xml index a6c87acda..4f3f45aa0 100644 --- a/design/src/main/res/values/strings.xml +++ b/design/src/main/res/values/strings.xml @@ -39,7 +39,9 @@ File Import from File URL + QR Import from URL + Import from QR External %s (Unsaved) From 63751957632d59c835345418d542c22c3a59b03c Mon Sep 17 00:00:00 2001 From: beasonxu Date: Fri, 30 Aug 2024 09:11:53 +0800 Subject: [PATCH 2/2] add qr scanner function --- app/build.gradle.kts | 2 ++ app/src/main/AndroidManifest.xml | 4 +++ .../github/kr328/clash/NewProfileActivity.kt | 10 ++++++- design/build.gradle.kts | 1 + .../kr328/clash/design/NewProfileDesign.kt | 29 ++++++++++++++++++- .../clash/design/model/ProfileProvider.kt | 11 +++++++ .../res/drawable/baseline_qr_code_scanner.xml | 9 ++++++ design/src/main/res/values-ja-rJP/strings.xml | 1 + design/src/main/res/values-ko-rKR/strings.xml | 1 + design/src/main/res/values-ru/strings.xml | 1 + design/src/main/res/values-zh-rHK/strings.xml | 1 + design/src/main/res/values-zh-rTW/strings.xml | 1 + design/src/main/res/values-zh/strings.xml | 1 + design/src/main/res/values/strings.xml | 2 ++ 14 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 design/src/main/res/drawable/baseline_qr_code_scanner.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 20f61121b..c38b51e56 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -24,6 +24,8 @@ dependencies { implementation(libs.androidx.coordinator) implementation(libs.androidx.recyclerview) implementation(libs.google.material) + + } tasks.getByName("clean", type = Delete::class) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cbb763a67..2291a8cc3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -193,5 +193,9 @@ + + diff --git a/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt b/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt index 8df167d12..4ab79cb30 100644 --- a/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/NewProfileActivity.kt @@ -46,6 +46,14 @@ class NewProfileActivity : BaseActivity() { create(Profile.Type.File, name) is ProfileProvider.Url -> create(Profile.Type.Url, name) + is ProfileProvider.QR -> { + val provider = it.provider as ProfileProvider.QR + if (provider.url!=null){ + create(Profile.Type.Url, name, provider.url!!) + }else{ + null + } + } is ProfileProvider.External -> { val data = p.get() @@ -137,7 +145,7 @@ class NewProfileActivity : BaseActivity() { ProfileProvider.External(name.toString(), summary.toString(), icon, intent) } - listOf(ProfileProvider.File(self), ProfileProvider.Url(self)) + providers + listOf(ProfileProvider.File(self), ProfileProvider.Url(self),ProfileProvider.QR(self)) + providers } } } diff --git a/design/build.gradle.kts b/design/build.gradle.kts index 6e4421e65..74fd10e3a 100644 --- a/design/build.gradle.kts +++ b/design/build.gradle.kts @@ -18,4 +18,5 @@ dependencies { implementation(libs.androidx.fragment) implementation(libs.androidx.viewpager) implementation(libs.google.material) + implementation("com.google.android.gms:play-services-code-scanner:16.1.0") } diff --git a/design/src/main/java/com/github/kr328/clash/design/NewProfileDesign.kt b/design/src/main/java/com/github/kr328/clash/design/NewProfileDesign.kt index e38d01e79..ee59f874a 100644 --- a/design/src/main/java/com/github/kr328/clash/design/NewProfileDesign.kt +++ b/design/src/main/java/com/github/kr328/clash/design/NewProfileDesign.kt @@ -6,6 +6,9 @@ import com.github.kr328.clash.design.adapter.ProfileProviderAdapter import com.github.kr328.clash.design.databinding.DesignNewProfileBinding import com.github.kr328.clash.design.model.ProfileProvider import com.github.kr328.clash.design.util.* +import com.google.mlkit.vision.barcode.common.Barcode +import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions +import com.google.mlkit.vision.codescanner.GmsBarcodeScanning class NewProfileDesign(context: Context) : Design(context) { sealed class Request { @@ -38,7 +41,31 @@ class NewProfileDesign(context: Context) : Design(cont } private fun requestCreate(provider: ProfileProvider) { - requests.trySend(Request.Create(provider)) + if (provider is ProfileProvider.QR){ + val options = GmsBarcodeScannerOptions.Builder() + .setBarcodeFormats( + Barcode.FORMAT_QR_CODE, + Barcode.FORMAT_AZTEC) + .enableAutoZoom() // available on 16.1.0 and higher + .build() + val scanner = GmsBarcodeScanning.getClient(context,options) + scanner.startScan() + .addOnSuccessListener { barcode -> + // Task completed successfully + provider.url = barcode.rawValue + requests.trySend(Request.Create(provider)) + } + .addOnCanceledListener { + // Task canceled + } + .addOnFailureListener { e -> + // Task failed with an exception + } + + }else{ + requests.trySend(Request.Create(provider)) + } + } private fun requestDetail(provider: ProfileProvider): Boolean { diff --git a/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt b/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt index 7b09c22bd..7df22ebb3 100644 --- a/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt +++ b/design/src/main/java/com/github/kr328/clash/design/model/ProfileProvider.kt @@ -14,6 +14,8 @@ sealed class ProfileProvider { get() = context.getString(R.string.import_from_file) override val icon: Drawable? get() = context.getDrawableCompat(R.drawable.ic_baseline_attach_file) + + } class Url(private val context: Context) : ProfileProvider() { @@ -25,6 +27,15 @@ sealed class ProfileProvider { get() = context.getDrawableCompat(R.drawable.ic_baseline_cloud_download) } + class QR(private val context: Context) : ProfileProvider() { + override val name: String + get() = context.getString(R.string.qr) + override val summary: String + get() = context.getString(R.string.import_from_qr) + override val icon: Drawable? + get() = context.getDrawableCompat(R.drawable.baseline_qr_code_scanner) + var url:String? =null + } class External( override val name: String, override val summary: String, diff --git a/design/src/main/res/drawable/baseline_qr_code_scanner.xml b/design/src/main/res/drawable/baseline_qr_code_scanner.xml new file mode 100644 index 000000000..0c3341938 --- /dev/null +++ b/design/src/main/res/drawable/baseline_qr_code_scanner.xml @@ -0,0 +1,9 @@ + + + + diff --git a/design/src/main/res/values-ja-rJP/strings.xml b/design/src/main/res/values-ja-rJP/strings.xml index 65f2ed9fa..fc9d7b5cc 100644 --- a/design/src/main/res/values-ja-rJP/strings.xml +++ b/design/src/main/res/values-ja-rJP/strings.xml @@ -32,6 +32,7 @@ ファイルからインポート URL URLからインポート + QRコードからインポート 外部入力 %s (未保存) アプリが破損しています diff --git a/design/src/main/res/values-ko-rKR/strings.xml b/design/src/main/res/values-ko-rKR/strings.xml index f09bd825d..42bc18b8d 100644 --- a/design/src/main/res/values-ko-rKR/strings.xml +++ b/design/src/main/res/values-ko-rKR/strings.xml @@ -33,6 +33,7 @@ URL URL에서 가져오기 외부 + QR코드에서 가져오기 %s (저장되지 않음) 앱 오류 앱 중지 diff --git a/design/src/main/res/values-ru/strings.xml b/design/src/main/res/values-ru/strings.xml index a1e42712f..a8652d336 100644 --- a/design/src/main/res/values-ru/strings.xml +++ b/design/src/main/res/values-ru/strings.xml @@ -41,6 +41,7 @@ URL Импорт из URL Внешний + Импорт из QR-кода %s (не сохранён) Приложение сломано diff --git a/design/src/main/res/values-zh-rHK/strings.xml b/design/src/main/res/values-zh-rHK/strings.xml index 28fe01529..ea71598a8 100644 --- a/design/src/main/res/values-zh-rHK/strings.xml +++ b/design/src/main/res/values-zh-rHK/strings.xml @@ -42,6 +42,7 @@ 從文件導入 從 URL 導入 界面 + 從二維碼導入 無效的 URL Clash Meta Logcat diff --git a/design/src/main/res/values-zh-rTW/strings.xml b/design/src/main/res/values-zh-rTW/strings.xml index 42bf15cc7..6ad965df7 100644 --- a/design/src/main/res/values-zh-rTW/strings.xml +++ b/design/src/main/res/values-zh-rTW/strings.xml @@ -41,6 +41,7 @@ 歷史 從檔案匯入 從 URL 匯入 + 從二維碼導入 介面 無效 URL Clash Meta diff --git a/design/src/main/res/values-zh/strings.xml b/design/src/main/res/values-zh/strings.xml index dc92cdac7..8d402fa22 100644 --- a/design/src/main/res/values-zh/strings.xml +++ b/design/src/main/res/values-zh/strings.xml @@ -41,6 +41,7 @@ 历史 从文件导入 从 URL 导入 + 从二维码导入 界面 无效的 URL Clash Meta diff --git a/design/src/main/res/values/strings.xml b/design/src/main/res/values/strings.xml index a6c87acda..4f3f45aa0 100644 --- a/design/src/main/res/values/strings.xml +++ b/design/src/main/res/values/strings.xml @@ -39,7 +39,9 @@ File Import from File URL + QR Import from URL + Import from QR External %s (Unsaved)