From 890645da5ad806e1a784e471280fa1ba21dde042 Mon Sep 17 00:00:00 2001 From: litingting Date: Wed, 4 Sep 2024 14:58:05 +0800 Subject: [PATCH] =?UTF-8?q?V1.0.1=EF=BC=882=EF=BC=89=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=99=90=E5=88=B6=E6=9C=80=E5=A4=A75M?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 6 +- app/proguard-rules.pro | 149 ++---------------- .../paintingstool/myact/CarmelActivity.java | 23 ++- .../myact/ImporImageActivity.java | 81 ++++++---- .../paintingstool/myact/LoginActivity.java | 4 +- .../com/app/paintingstool/myuntils/Utils.java | 8 +- app/src/main/res/layout/activity_setting.xml | 2 +- app/src/main/res/values/strings.xml | 3 +- gradle/libs.versions.toml | 2 +- 9 files changed, 106 insertions(+), 172 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2c7051b..f31cdef 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,11 +14,11 @@ android { applicationId = "com.paintings.tool" minSdk = 23 targetSdk = 34 - versionCode = 1 - versionName = "1.0.0" + versionCode = 2 + versionName = "1.0.1" setProperty( "archivesBaseName", - "AR Drawing-Paintings Tool_V" + versionName + "(${versionCode})_$timestamp" + "AR Drawing_V" + versionName + "(${versionCode})_$timestamp" ) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 600cc24..6cf261b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,140 +19,19 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile --keepclassmembers class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} +# 保持 Room 的核心类不被混淆 +-keep class androidx.room.** { *; } +-keep class androidx.sqlite.db.** { *; } --keepclassmembers class com.app.paintingstool.myuntils.Keys { - public static final java.lang.String tatab; - public static final int ababa; -} +# 保持 Room 数据库类的基本结构 +-keep class * extends androidx.room.RoomDatabase { *; } --keepclassmembers class * { - @androidx.room.Query ; -} --keep class com.app.paintingstool.mydao.AppDatabase { *; } -#noinspection ShrinkerUnresolvedReference -#unity --keep class com.google.android.gms.ads.** {public *;} --keep class com.google.android.gms.appset.** { *; } --keep class com.google.android.gms.tasks.** { *; } -#adapters --keep class com.ironsource.adapters.** { *; } -#sdk --dontwarn com.ironsource.** --dontwarn com.ironsource.adapters.** --keepclassmembers class com.ironsource.** { public *; } --keep public class com.ironsource.** --keep class com.ironsource.adapters.** { *; -} -#omid --dontwarn com.iab.omid.** --keep class com.iab.omid.** {*;} -#javascript --keepattributes JavascriptInterface --keepclassmembers class * { @android.webkit.JavascriptInterface ; } -#For AmazonAps integration --keep class com.amazon.device.ads.DtbThreadService { - static *; -} --keep public interface com.amazon.device.ads** {*; } -#For AppLovin integration --keepclassmembers class com.applovin.sdk.AppLovinSdk { - static *; -} --keep public interface com.applovin.sdk** {*; } --keep public interface com.applovin.adview** {*; } --keep public interface com.applovin.mediation** {*; } --keep public interface com.applovin.communicator** {*; } -#For Bytedance integration --keep public interface com.bytedance.sdk.openadsdk** {*; } -#For Facebook integration --keepclassmembers class com.facebook.ads.internal.AdSdkVersion { - static *; -} --keepclassmembers class com.facebook.ads.internal.settings.AdSdkVersion { - static *; - } --keepclassmembers class com.facebook.ads.BuildConfig { - static *; - } --keep public interface com.facebook.ads** {*; } -#For Fairbid --keep public interface com.fyber.fairbid.ads.interstitial** {*; } --keep public interface com.fyber.fairbid.ads.rewarded** {*; } --keep class com.fyber.offerwall.* -#For Fivead --keep public interface com.five_corp.ad** {*; } -#For Fyber(Inneractive) integration --keep public interface com.fyber.inneractive.sdk.external** {*; } --keep public interface com.fyber.inneractive.sdk.activities** {*; } --keep public interface com.fyber.inneractive.sdk.ui** {*; } -#For HyprMX integration --keepclassmembers class com.hyprmx.android.sdk.utility.HyprMXProperties { - static *; -} --keepclassmembers class com.hyprmx.android.BuildConfig { - static *; -} --keep public interface com.hyprmx.android.sdk.activity** {*; } --keep public interface com.hyprmx.android.sdk.graphics** {*; } -# For Inmobi integration --keep class com.inmobi.* --keep public interface com.inmobi.ads.listeners** {*; } --keep public interface com.inmobi.ads.InMobiInterstitial** {*; } --keep public interface com.inmobi.ads.InMobiBanner** {*; } -# For ironSource integration --keep public interface com.ironsource.mediationsdk.sdk** {*; } --keep public interface com.ironsource.mediationsdk.impressionData.ImpressionDataListener {*; } -#For Maio integration --keep public interface jp.maio.sdk.android.MaioAdsListenerInterface {*; } -# For Mintergral integration --keep public interface com.mbridge.msdk.out** {*; } --keep public interface com.mbridge.msdk.videocommon.listener** {*; } --keep public interface com.mbridge.msdk.interstitialvideo.out** {*; } --keep public interface com.mintegral.msdk.out** {*; } --keep public interface com.mintegral.msdk.videocommon.listener** {*; } --keep public interface com.mintegral.msdk.interstitialvideo.out** {*; } -#For MyTarget integration --keep class com.my.target.** {*;} -#For Ogury integration --keep public interface io.presage.interstitial** {*; } --keep public interface io.presage.interstitial.PresageInterstitialCallback {*; } -#For Pubnative integration --keep public interface net.pubnative.lite.sdk.interstitial.HyBidInterstitialAd** {*; } --keep public interface net.pubnative.lite.sdk.rewarded.HyBidRewardedAd** {*; } --keep public interface net.pubnative.lite.sdk.views.HyBidAdView** {*; } -#For Smaato integration --keep public interface com.smaato.sdk.interstitial** {*; } --keep public interface com.smaato.sdk.video.vast** {*; } --keep public interface com.smaato.sdk.banner.widget** {*; } --keep public interface com.smaato.sdk.core.util** {*; } -# For Tapjoy integration --keep public interface com.tapjoy.** {*; } -# For Tencent integration --keep public interface com.qq.e.ads.interstitial2** {*; } --keep public interface com.qq.e.ads.interstitial3** {*; } --keep public interface com.qq.e.ads.rewardvideo** {*; } --keep public interface com.qq.e.ads.rewardvideo2** {*; } --keep public interface com.qq.e.ads.banner2** {*; } --keep public interface com.qq.e.comm.adevent** {*; } -#For Verizon integration --keepclassmembers class com.verizon.ads.edition.BuildConfig { - static *; -} --keep public interface com.verizon.ads.interstitialplacement** {*; } --keep public interface com.verizon.ads.inlineplacement** {*; } --keep public interface com.verizon.ads.vastcontroller** {*; } --keep public interface com.verizon.ads.webcontroller** {*; } -#For Vungle integration --keep public interface com.vungle.warren.PlayAdCallback {*; } --keep public interface com.vungle.warren.ui.contract** {*; } --keep public interface com.vungle.warren.ui.view** {*; } -#For AndroidX --keep class androidx.localbroadcastmanager.content.LocalBroadcastManager { *;} --keep class androidx.recyclerview.widget.RecyclerView { *;} --keep class androidx.recyclerview.widget.RecyclerView$OnScrollListener { *;} -#For Android --keep class * extends android.app.Activity -#-----------------------------------------------------ironSource SDK \ No newline at end of file +# 保持 Room DAO 接口 +-keep @androidx.room.Dao interface * { *; } +-keep @androidx.room.Dao class * { *; } + +# 保持 Room 实体类 +-keep @androidx.room.Entity class * { *; } + +# 保持 Room 的注解类 +-keep @androidx.room.Database class * { *; } \ No newline at end of file diff --git a/app/src/main/java/com/app/paintingstool/myact/CarmelActivity.java b/app/src/main/java/com/app/paintingstool/myact/CarmelActivity.java index 908f953..a0c3240 100644 --- a/app/src/main/java/com/app/paintingstool/myact/CarmelActivity.java +++ b/app/src/main/java/com/app/paintingstool/myact/CarmelActivity.java @@ -40,8 +40,10 @@ import androidx.core.view.WindowInsetsCompat; import com.app.paintingstool.R; import com.app.paintingstool.databinding.ActivityCarmelBinding; import com.app.paintingstool.myuntils.Keys; +import com.app.paintingstool.myuntils.Utils; import com.google.common.util.concurrent.ListenableFuture; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -79,7 +81,26 @@ public class CarmelActivity extends AppCompatActivity implements View.OnTouchLis intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { Uri imageUri = result.getData().getData(); - binding.image.setImageURI(imageUri); + if (imageUri == null) return; + new Thread(() -> { + InputStream putStream = null; + try { + putStream = getContentResolver().openInputStream(imageUri); + double v = Utils.convertBytesToMB(putStream.available()); + runOnUiThread(() -> { + if (v >= 5) { + Toast.makeText(CarmelActivity.this, getString(R.string.im_big), Toast.LENGTH_SHORT).show(); + } else { + binding.image.setImageURI(imageUri); + } + }); + putStream.close(); + } catch (IOException e) { + + } + }).start(); + + } }); diff --git a/app/src/main/java/com/app/paintingstool/myact/ImporImageActivity.java b/app/src/main/java/com/app/paintingstool/myact/ImporImageActivity.java index a82ae8d..c663dab 100644 --- a/app/src/main/java/com/app/paintingstool/myact/ImporImageActivity.java +++ b/app/src/main/java/com/app/paintingstool/myact/ImporImageActivity.java @@ -10,6 +10,7 @@ import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.webkit.MimeTypeMap; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.activity.result.ActivityResultLauncher; @@ -25,6 +26,7 @@ import com.app.paintingstool.databinding.ActivityImporImageBinding; import com.app.paintingstool.myadapter.ImageAdapter1; import com.app.paintingstool.myuntils.ImageItem; import com.app.paintingstool.myuntils.MyItemDecoration; +import com.app.paintingstool.myuntils.Utils; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; @@ -64,7 +66,7 @@ public class ImporImageActivity extends AppCompatActivity { finish(); }); imageList = new ArrayList<>(); - imageAdapter1 = new ImageAdapter1(imageList,this,this); + imageAdapter1 = new ImageAdapter1(imageList, this, this); importImage(); loadImageList(); RecyclerView recyclerView = findViewById(R.id.recycler_view_import); @@ -74,25 +76,48 @@ public class ImporImageActivity extends AppCompatActivity { } + + private void importImage() { intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { - Uri imageUri = result.getData().getData(); + Intent data = result.getData(); + Uri imageUri = data.getData(); + if (imageUri == null) return; new Thread(() -> { try { - assert imageUri != null; String mimeType = getContentResolver().getType(imageUri); fileExtension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); fileName = "image_" + System.currentTimeMillis() + "." + fileExtension; File outputFile = new File(getFilesDir(), fileName); - try (InputStream inputStream = getContentResolver().openInputStream(imageUri); - OutputStream outputStream = new FileOutputStream(outputFile)) { + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = getContentResolver().openInputStream(imageUri); + double v = Utils.convertBytesToMB(inputStream.available()); + Log.d("----------","-----------"+v); + if (v >= 5) { + runOnUiThread(() -> { + Toast.makeText(ImporImageActivity.this, getString(R.string.im_big), Toast.LENGTH_SHORT).show(); + }); + return; + } + + outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } } catch (Exception e) { + + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } } runOnUiThread(() -> { Glide.with(this).load(outputFile) @@ -104,6 +129,7 @@ public class ImporImageActivity extends AppCompatActivity { binding.reDef.setVisibility(View.GONE); saveImageList(); } + @Override public void onLoadCleared(@Nullable Drawable placeholder) { } @@ -123,7 +149,7 @@ public class ImporImageActivity extends AppCompatActivity { } private void saveImageList() { - if(imageList.isEmpty()){ + if (imageList.isEmpty()) { return; } try { @@ -146,29 +172,30 @@ public class ImporImageActivity extends AppCompatActivity { File file = new File(getFilesDir(), "image_list.json"); if (!file.exists()) { return; // 如果文件不存在,则不加载数据 - }else { - try { - FileInputStream fileInputStream = openFileInput("image_list.json"); - InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - StringBuilder stringBuilder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line); + } else { + try { + FileInputStream fileInputStream = openFileInput("image_list.json"); + InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); + } + binding.reDef.setVisibility(View.GONE); + bufferedReader.close(); + JSONArray jsonArray = new JSONArray(stringBuilder.toString()); + imageList.clear(); // 清空 imageList,避免重复添加 + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String imagePath = jsonObject.getString("imagePath"); + imageList.add(new ImageItem(imagePath)); + } + } catch (IOException | JSONException e) { + e.printStackTrace(); } - binding.reDef.setVisibility(View.GONE); - bufferedReader.close(); - JSONArray jsonArray = new JSONArray(stringBuilder.toString()); - imageList.clear(); // 清空 imageList,避免重复添加 - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); - String imagePath = jsonObject.getString("imagePath"); - imageList.add(new ImageItem(imagePath)); - } - } catch (IOException | JSONException e) { - e.printStackTrace(); } - }} + } @Override diff --git a/app/src/main/java/com/app/paintingstool/myact/LoginActivity.java b/app/src/main/java/com/app/paintingstool/myact/LoginActivity.java index 8b3c751..7f7e1fe 100644 --- a/app/src/main/java/com/app/paintingstool/myact/LoginActivity.java +++ b/app/src/main/java/com/app/paintingstool/myact/LoginActivity.java @@ -34,7 +34,7 @@ public class LoginActivity extends AppCompatActivity { public void run() { // 使用 ValueAnimator 创建进度条动画 ValueAnimator animation = ValueAnimator.ofInt(0, binding.progressBar.getMax()); - animation.setDuration(4000); // 动画时长 + animation.setDuration(2000); // 动画时长 animation.setInterpolator(new DecelerateInterpolator()); // 减速插值器 animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override @@ -61,6 +61,6 @@ public class LoginActivity extends AppCompatActivity { public void onAnimationRepeat(android.animation.Animator animation) {} }); } - }, 1500); + }, 500); } } \ No newline at end of file diff --git a/app/src/main/java/com/app/paintingstool/myuntils/Utils.java b/app/src/main/java/com/app/paintingstool/myuntils/Utils.java index 969b34a..7dc6fb5 100644 --- a/app/src/main/java/com/app/paintingstool/myuntils/Utils.java +++ b/app/src/main/java/com/app/paintingstool/myuntils/Utils.java @@ -1,2 +1,8 @@ -package com.app.paintingstool.myuntils;public class Utils { +package com.app.paintingstool.myuntils; + +public class Utils { + + public static double convertBytesToMB(long bytes) { + return bytes / (1024.0 * 1024.0); // 字节转换为兆 + } } diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index af3c1e8..666c68c 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -118,7 +118,7 @@ android:layout_height="match_parent" android:layout_marginHorizontal="12dp" android:elevation="0dp" - android:text="@string/tate_us" + android:text="@string/rate_us" android:textSize="14sp" app:chipBackgroundColor="#00000000" app:chipIcon="@mipmap/icon_rate" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9ef663..6bd4dbf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ My favorites No favorites have been added yet, please go to the homepage to check it out Share - Tate us + Rate us TODO + Please reselect an image no larger than 5M \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4796e41..a049dc3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.5.0" +agp = "8.1.0" junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1"