From b92ee30f62c6e47fabdf1553d209d5f929b016df Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 8 Mar 2024 14:33:36 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E6=88=90=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetDropDown.xml | 4 +- app/build.gradle | 44 ++++++++++++++++-- .../heeeeka/card/support/DefAnimListener.kt | 5 +- .../com/heeeeka/card/ui/bg/CardBgDialog.kt | 4 -- .../card/ui/display/CardDisplayDialog.kt | 32 +++++++++++-- .../main/java/com/heeeeka/card/utils/ILog.kt | 5 +- .../java/com/heeeeka/card/utils/ToastKtx.kt | 2 +- .../main/res/layout/card_display_dialog.xml | 32 ++++++++++--- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/values/themes.xml | 1 + card.jks | Bin 0 -> 2612 bytes 11 files changed, 101 insertions(+), 31 deletions(-) create mode 100644 card.jks diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 8801c3c..ee84893 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -10,12 +10,12 @@ - + - + diff --git a/app/build.gradle b/app/build.gradle index ad2d379..9c52909 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,12 +17,33 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - buildTypes { + signingConfigs { release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + storeFile file('../card.jks') + storePassword "card2024" + keyAlias "card" + keyPassword "card2024" + v2SigningEnabled true + v1SigningEnabled true } } + + buildTypes { + release { + minifyEnabled true + shrinkResources true // 开了混淆的时候才能开启 是否去除无效的资源文件 + zipAlignEnabled true // 开了混淆的时候才能开启 是否进行压缩并重排列 + crunchPngs true // 启用 PNG 压缩 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + debug{ + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -33,6 +54,23 @@ android { buildFeatures { viewBinding = true } + + android.applicationVariants.configureEach { variant -> + variant.outputs.configureEach { output -> + def date = new Date().format("MMddHHmm", TimeZone.getTimeZone("GMT+08")) + + def outputFile = output.outputFile + if (outputFile == null || !outputFile.name.endsWith('.apk')) { + return + } + + def abi = output.getFilter(com.android.build.OutputFile.ABI) + if (abi == null) { + abi = "universal" + } + outputFileName = "card_${buildType.name}_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${abi}_${date}.apk" + } + } } dependencies { diff --git a/app/src/main/java/com/heeeeka/card/support/DefAnimListener.kt b/app/src/main/java/com/heeeeka/card/support/DefAnimListener.kt index b595ac5..c355001 100644 --- a/app/src/main/java/com/heeeeka/card/support/DefAnimListener.kt +++ b/app/src/main/java/com/heeeeka/card/support/DefAnimListener.kt @@ -2,10 +2,7 @@ package com.heeeeka.card.support import android.animation.Animator -/** - * Created by Max on 2024/3/6 11:43 - * Desc: - **/ + interface DefAnimListener : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) { } diff --git a/app/src/main/java/com/heeeeka/card/ui/bg/CardBgDialog.kt b/app/src/main/java/com/heeeeka/card/ui/bg/CardBgDialog.kt index f46556c..f741975 100644 --- a/app/src/main/java/com/heeeeka/card/ui/bg/CardBgDialog.kt +++ b/app/src/main/java/com/heeeeka/card/ui/bg/CardBgDialog.kt @@ -12,10 +12,6 @@ import com.heeeeka.card.R import com.heeeeka.card.databinding.CardBgDialogBinding import com.heeeeka.card.utils.ILog -/** - * Created by Max on 2024/3/6 14:14 - * Desc: - **/ class CardBgDialog( context: Context, private val lifecycle: Lifecycle, diff --git a/app/src/main/java/com/heeeeka/card/ui/display/CardDisplayDialog.kt b/app/src/main/java/com/heeeeka/card/ui/display/CardDisplayDialog.kt index bb1a562..ee4a001 100644 --- a/app/src/main/java/com/heeeeka/card/ui/display/CardDisplayDialog.kt +++ b/app/src/main/java/com/heeeeka/card/ui/display/CardDisplayDialog.kt @@ -6,9 +6,9 @@ import android.graphics.Bitmap import android.os.Build import android.os.Bundle import android.view.ViewGroup +import androidx.activity.ComponentActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.drawToBitmap -import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner @@ -20,16 +20,24 @@ import com.heeeeka.card.support.CardEngine import com.heeeeka.card.utils.ILog import com.heeeeka.card.utils.UiUtils import com.heeeeka.card.utils.roundCorner +import com.heeeeka.card.utils.saveToAlbum import com.heeeeka.card.utils.toast +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CardDisplayDialog( - private val activity: FragmentActivity, + private val activity: ComponentActivity, private val cardInfo: CardInfo, private val launcherCompat: ActivityResultLauncherCompat, Map> ) : Dialog(activity, R.style.base_dialog), LifecycleEventObserver, ILog { private var binding: CardDisplayDialogBinding? = null private var cardEngine: CardEngine? = null + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -42,7 +50,6 @@ class CardDisplayDialog( binding.layoutCard.roundCorner(UiUtils.dip2px(context, 12f)) (binding.layoutCard.layoutParams as? ConstraintLayout.LayoutParams)?.let { it.dimensionRatio = "${cardInfo.width}:${cardInfo.height}" - logD("dimensionRatio:${it.dimensionRatio}") binding.layoutCard.layoutParams = it } binding.layoutCard.post { @@ -86,13 +93,28 @@ class CardDisplayDialog( } private fun saveImageImpl(bitmap: Bitmap) { - logD("saveImageImpl thread:${Thread.currentThread().name}") - logD("MAAAX", "saveImageImpl end") + binding?.tvSave?.isEnabled = false + binding?.progressbar?.animate()?.alpha(1f)?.start() + scope.launch(Dispatchers.IO) { + val fileName = "card_${System.currentTimeMillis()}.jpg" + bitmap.saveToAlbum( + context = context, + fileName = fileName, + relativePath = null, + quality = 100 + ) + withContext(Dispatchers.Main) { + binding?.progressbar?.animate()?.alpha(0f)?.start() + context.toast(R.string.save_successfully) + binding?.tvSave?.isEnabled = true + } + } } override fun dismiss() { super.dismiss() activity.lifecycle.removeObserver(this) + scope.cancel() } override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { diff --git a/app/src/main/java/com/heeeeka/card/utils/ILog.kt b/app/src/main/java/com/heeeeka/card/utils/ILog.kt index 8a4c594..1dd3878 100644 --- a/app/src/main/java/com/heeeeka/card/utils/ILog.kt +++ b/app/src/main/java/com/heeeeka/card/utils/ILog.kt @@ -2,10 +2,7 @@ package com.heeeeka.card.utils import android.util.Log -/** - * Created by Max on 2024/3/6 15:43 - * Desc: - **/ + interface ILog { fun logD(message: String) { Log.d(getLogTag(), message) diff --git a/app/src/main/java/com/heeeeka/card/utils/ToastKtx.kt b/app/src/main/java/com/heeeeka/card/utils/ToastKtx.kt index 2d613a0..7ccec08 100644 --- a/app/src/main/java/com/heeeeka/card/utils/ToastKtx.kt +++ b/app/src/main/java/com/heeeeka/card/utils/ToastKtx.kt @@ -5,7 +5,7 @@ import android.widget.Toast fun Context.toast(message: Int, isLong: Boolean = false) { - toast(getString(message)) + toast(getString(message), isLong) } fun Context.toast(message: CharSequence, isLong: Boolean = false) { diff --git a/app/src/main/res/layout/card_display_dialog.xml b/app/src/main/res/layout/card_display_dialog.xml index 7605f19..e3e5965 100644 --- a/app/src/main/res/layout/card_display_dialog.xml +++ b/app/src/main/res/layout/card_display_dialog.xml @@ -27,13 +27,15 @@ + app:layout_constraintTop_toBottomOf="@id/layout_card" + app:layout_constraintWidth_percent="0.372" /> + + + app:layout_constraintTop_toTopOf="@id/tv_save" + app:layout_constraintWidth_percent="0.372" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5c700ea..de9e5fe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,5 +11,6 @@ 保存相冊 選擇煙花類型 祝福語太長 - 存储权限被禁止,为了正常使用该功能,请前往系统设置页手动开启 + 存儲權限被禁止,為了正常使用該功能,請前往系統設置頁手動開啟 + 保存成功 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 6d4c0ff..c8fe92e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -14,6 +14,7 @@ true true + #9E3A30 diff --git a/card.jks b/card.jks new file mode 100644 index 0000000000000000000000000000000000000000..4e1c6a2a444d6bc75bd49ace906dbf21e0f28018 GIT binary patch literal 2612 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 x`_S&|;8>4Thx}I1R#