commit 0a33e7c869946c88b8af6e887ee125334957cf14 Author: ocean <503259349@qq.com> Date: Mon Dec 29 13:50:35 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d96e43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties + +# Keystore files +*.jks +*.keystore +keystore.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..eaf91e2 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..d58d49b --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..8b3f102 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000..0a53a4a --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..0d46093 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..81c3e56 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..22d9498 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..2a5f53f --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..48052b2 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b2c751a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..5bd6771 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..91e5a7c --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,139 @@ + +import java.util.Date +import java.text.SimpleDateFormat +import java.util.Properties +import java.io.FileInputStream + +plugins { + id("com.android.application") + id ("org.jetbrains.kotlin.android") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") +} + +// 加载 keystore 配置 +val keystorePropertiesFile = rootProject.file("keystore.properties") +val keystoreProperties = Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +android { + namespace = "com.draw.painting.canvas" + compileSdk = 36 + + defaultConfig { + //com.draw.painting.helper + applicationId = "com.draw.painting.canvas" + minSdk = 24 + targetSdk = 36 + versionCode = 2 + versionName = "1.1" + setProperty("archivesBaseName", "Ar Canvas_V" + versionName + "(${versionCode})_$timestamp") + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + create("release") { + if (keystorePropertiesFile.exists()) { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["storePassword"] as String + } + } + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures{ + viewBinding = true + } +} + +dependencies { + + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("com.google.android.material:material:1.13.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.activity:activity-ktx:1.9.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + + val camerax_version = "1.5.1" + implementation ("androidx.camera:camera-core:${camerax_version}") + implementation ("androidx.camera:camera-camera2:${camerax_version}") + implementation ("androidx.camera:camera-lifecycle:${camerax_version}") + implementation ("androidx.camera:camera-view:${camerax_version}") + implementation ("androidx.camera:camera-extensions:${camerax_version}") + + + + + + implementation(files("libs/UpLoadLibrary_12_03_15_13-release.aar")) + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + implementation("com.google.android.gms:play-services-location:21.0.1") + implementation("com.google.android.gms:play-services-appset:16.0.1") + // Import the Firebase BoM + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) + implementation("com.google.firebase:firebase-crashlytics-ndk") + implementation("com.google.firebase:firebase-analytics") + // okhttp + implementation ("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + + // TradPlus + implementation("com.tradplusad:tradplus:15.1.10.1") +//noinspection GradleCompatible + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.appcompat:appcompat:1.3.0-alpha02") +// Ironsource + implementation("com.ironsource.sdk:mediationsdk:9.0.0") + implementation("com.tradplusad:tradplus-ironsource:10.15.1.10.1") +// Pangle + implementation("com.tradplusad:tradplus-pangle:19.15.1.10.1") + implementation("com.pangle.global:pag-sdk:7.7.0.2") +// UnityAds + implementation("com.tradplusad:tradplus-unity:5.15.1.10.1") + implementation("com.unity3d.ads:unity-ads:4.16.3") +//optional dependency for better targeting + implementation("androidx.browser:browser:1.8.0") + implementation("com.squareup.picasso:picasso:2.8") + implementation("androidx.viewpager:viewpager:1.0.0") + implementation("androidx.recyclerview:recyclerview:1.2.1") +// Mintegral + implementation("com.tradplusad:tradplus-mintegralx_overseas:18.15.1.10.1") + implementation("androidx.recyclerview:recyclerview:1.1.0") + implementation("com.mbridge.msdk.oversea:mbridge_android_sdk:16.10.11") +// Liftoff + implementation("com.tradplusad:tradplus-vunglex:7.15.1.10.1") + implementation("com.vungle:vungle-ads:7.6.0") +// Cross Promotion + implementation("com.tradplusad:tradplus-crosspromotion:27.15.1.10.1") +// TP Exchange +// 请注意保持与主包版本同步更新 + implementation("com.google.code.gson:gson:2.8.6") + implementation("com.tradplusad:tp_exchange:40.15.1.10.1") + + + +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..3b6d7fe --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "533619012034", + "project_id": "arcanvas-4bea4", + "storage_bucket": "arcanvas-4bea4.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:533619012034:android:7084a0670e57a4b9b3665b", + "android_client_info": { + "package_name": "com.draw.painting.canvas" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyC2-oE_EdcbH_Q2bKnOiXxQWj6tngIT-tw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/UpLoadLibrary_12_03_15_13-release.aar b/app/libs/UpLoadLibrary_12_03_15_13-release.aar new file mode 100644 index 0000000..a3e30aa Binary files /dev/null and b/app/libs/UpLoadLibrary_12_03_15_13-release.aar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..3e82a73 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,24 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +-keep public class com.tradplus.** { *; } +-keep class com.tradplus.ads.** { *; } \ No newline at end of file diff --git a/app/src/androidTest/java/com/draw/painting/canvas/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/draw/painting/canvas/ExampleInstrumentedTest.java new file mode 100644 index 0000000..ad9f610 --- /dev/null +++ b/app/src/androidTest/java/com/draw/painting/canvas/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.draw.painting.canvas; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.draw.painting.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7a7a83a --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/sketches_animals/1.jpg b/app/src/main/assets/sketches_animals/1.jpg new file mode 100644 index 0000000..9488c65 Binary files /dev/null and b/app/src/main/assets/sketches_animals/1.jpg differ diff --git a/app/src/main/assets/sketches_animals/10.jpg b/app/src/main/assets/sketches_animals/10.jpg new file mode 100644 index 0000000..78382a4 Binary files /dev/null and b/app/src/main/assets/sketches_animals/10.jpg differ diff --git a/app/src/main/assets/sketches_animals/11.jpg b/app/src/main/assets/sketches_animals/11.jpg new file mode 100644 index 0000000..a4f7512 Binary files /dev/null and b/app/src/main/assets/sketches_animals/11.jpg differ diff --git a/app/src/main/assets/sketches_animals/12.jpg b/app/src/main/assets/sketches_animals/12.jpg new file mode 100644 index 0000000..bab3cff Binary files /dev/null and b/app/src/main/assets/sketches_animals/12.jpg differ diff --git a/app/src/main/assets/sketches_animals/13.jpg b/app/src/main/assets/sketches_animals/13.jpg new file mode 100644 index 0000000..5c3ef19 Binary files /dev/null and b/app/src/main/assets/sketches_animals/13.jpg differ diff --git a/app/src/main/assets/sketches_animals/14.jpg b/app/src/main/assets/sketches_animals/14.jpg new file mode 100644 index 0000000..8b446f2 Binary files /dev/null and b/app/src/main/assets/sketches_animals/14.jpg differ diff --git a/app/src/main/assets/sketches_animals/15.jpg b/app/src/main/assets/sketches_animals/15.jpg new file mode 100644 index 0000000..2f9dc4e Binary files /dev/null and b/app/src/main/assets/sketches_animals/15.jpg differ diff --git a/app/src/main/assets/sketches_animals/16.jpg b/app/src/main/assets/sketches_animals/16.jpg new file mode 100644 index 0000000..aad9788 Binary files /dev/null and b/app/src/main/assets/sketches_animals/16.jpg differ diff --git a/app/src/main/assets/sketches_animals/17.jpg b/app/src/main/assets/sketches_animals/17.jpg new file mode 100644 index 0000000..17c6f07 Binary files /dev/null and b/app/src/main/assets/sketches_animals/17.jpg differ diff --git a/app/src/main/assets/sketches_animals/18.jpg b/app/src/main/assets/sketches_animals/18.jpg new file mode 100644 index 0000000..2ce93a7 Binary files /dev/null and b/app/src/main/assets/sketches_animals/18.jpg differ diff --git a/app/src/main/assets/sketches_animals/19.jpg b/app/src/main/assets/sketches_animals/19.jpg new file mode 100644 index 0000000..2b24f31 Binary files /dev/null and b/app/src/main/assets/sketches_animals/19.jpg differ diff --git a/app/src/main/assets/sketches_animals/2.jpg b/app/src/main/assets/sketches_animals/2.jpg new file mode 100644 index 0000000..0a0c2e7 Binary files /dev/null and b/app/src/main/assets/sketches_animals/2.jpg differ diff --git a/app/src/main/assets/sketches_animals/20.jpg b/app/src/main/assets/sketches_animals/20.jpg new file mode 100644 index 0000000..347cddc Binary files /dev/null and b/app/src/main/assets/sketches_animals/20.jpg differ diff --git a/app/src/main/assets/sketches_animals/21.jpg b/app/src/main/assets/sketches_animals/21.jpg new file mode 100644 index 0000000..5a04764 Binary files /dev/null and b/app/src/main/assets/sketches_animals/21.jpg differ diff --git a/app/src/main/assets/sketches_animals/22.jpg b/app/src/main/assets/sketches_animals/22.jpg new file mode 100644 index 0000000..c18d8ad Binary files /dev/null and b/app/src/main/assets/sketches_animals/22.jpg differ diff --git a/app/src/main/assets/sketches_animals/23.jpg b/app/src/main/assets/sketches_animals/23.jpg new file mode 100644 index 0000000..4270d19 Binary files /dev/null and b/app/src/main/assets/sketches_animals/23.jpg differ diff --git a/app/src/main/assets/sketches_animals/24.jpg b/app/src/main/assets/sketches_animals/24.jpg new file mode 100644 index 0000000..355a944 Binary files /dev/null and b/app/src/main/assets/sketches_animals/24.jpg differ diff --git a/app/src/main/assets/sketches_animals/25.jpg b/app/src/main/assets/sketches_animals/25.jpg new file mode 100644 index 0000000..c670943 Binary files /dev/null and b/app/src/main/assets/sketches_animals/25.jpg differ diff --git a/app/src/main/assets/sketches_animals/26.jpg b/app/src/main/assets/sketches_animals/26.jpg new file mode 100644 index 0000000..4b95b01 Binary files /dev/null and b/app/src/main/assets/sketches_animals/26.jpg differ diff --git a/app/src/main/assets/sketches_animals/27.jpg b/app/src/main/assets/sketches_animals/27.jpg new file mode 100644 index 0000000..87a8c12 Binary files /dev/null and b/app/src/main/assets/sketches_animals/27.jpg differ diff --git a/app/src/main/assets/sketches_animals/28.jpg b/app/src/main/assets/sketches_animals/28.jpg new file mode 100644 index 0000000..770686a Binary files /dev/null and b/app/src/main/assets/sketches_animals/28.jpg differ diff --git a/app/src/main/assets/sketches_animals/29.jpg b/app/src/main/assets/sketches_animals/29.jpg new file mode 100644 index 0000000..7127a11 Binary files /dev/null and b/app/src/main/assets/sketches_animals/29.jpg differ diff --git a/app/src/main/assets/sketches_animals/3.jpg b/app/src/main/assets/sketches_animals/3.jpg new file mode 100644 index 0000000..4bf4897 Binary files /dev/null and b/app/src/main/assets/sketches_animals/3.jpg differ diff --git a/app/src/main/assets/sketches_animals/30.jpg b/app/src/main/assets/sketches_animals/30.jpg new file mode 100644 index 0000000..f1d2047 Binary files /dev/null and b/app/src/main/assets/sketches_animals/30.jpg differ diff --git a/app/src/main/assets/sketches_animals/31.jpg b/app/src/main/assets/sketches_animals/31.jpg new file mode 100644 index 0000000..0d08aa8 Binary files /dev/null and b/app/src/main/assets/sketches_animals/31.jpg differ diff --git a/app/src/main/assets/sketches_animals/4.jpg b/app/src/main/assets/sketches_animals/4.jpg new file mode 100644 index 0000000..838c582 Binary files /dev/null and b/app/src/main/assets/sketches_animals/4.jpg differ diff --git a/app/src/main/assets/sketches_animals/5.jpg b/app/src/main/assets/sketches_animals/5.jpg new file mode 100644 index 0000000..36bd2bf Binary files /dev/null and b/app/src/main/assets/sketches_animals/5.jpg differ diff --git a/app/src/main/assets/sketches_animals/6.jpg b/app/src/main/assets/sketches_animals/6.jpg new file mode 100644 index 0000000..dceb49b Binary files /dev/null and b/app/src/main/assets/sketches_animals/6.jpg differ diff --git a/app/src/main/assets/sketches_animals/7.jpg b/app/src/main/assets/sketches_animals/7.jpg new file mode 100644 index 0000000..ebd4694 Binary files /dev/null and b/app/src/main/assets/sketches_animals/7.jpg differ diff --git a/app/src/main/assets/sketches_animals/8.jpg b/app/src/main/assets/sketches_animals/8.jpg new file mode 100644 index 0000000..e5e3c63 Binary files /dev/null and b/app/src/main/assets/sketches_animals/8.jpg differ diff --git a/app/src/main/assets/sketches_animals/9.jpg b/app/src/main/assets/sketches_animals/9.jpg new file mode 100644 index 0000000..e7a1862 Binary files /dev/null and b/app/src/main/assets/sketches_animals/9.jpg differ diff --git a/app/src/main/assets/sketches_birds/1.jpg b/app/src/main/assets/sketches_birds/1.jpg new file mode 100644 index 0000000..d235225 Binary files /dev/null and b/app/src/main/assets/sketches_birds/1.jpg differ diff --git a/app/src/main/assets/sketches_birds/10.jpg b/app/src/main/assets/sketches_birds/10.jpg new file mode 100644 index 0000000..e348ffe Binary files /dev/null and b/app/src/main/assets/sketches_birds/10.jpg differ diff --git a/app/src/main/assets/sketches_birds/11.jpg b/app/src/main/assets/sketches_birds/11.jpg new file mode 100644 index 0000000..921b5b9 Binary files /dev/null and b/app/src/main/assets/sketches_birds/11.jpg differ diff --git a/app/src/main/assets/sketches_birds/12.jpg b/app/src/main/assets/sketches_birds/12.jpg new file mode 100644 index 0000000..7b4055b Binary files /dev/null and b/app/src/main/assets/sketches_birds/12.jpg differ diff --git a/app/src/main/assets/sketches_birds/13.jpg b/app/src/main/assets/sketches_birds/13.jpg new file mode 100644 index 0000000..021b7a4 Binary files /dev/null and b/app/src/main/assets/sketches_birds/13.jpg differ diff --git a/app/src/main/assets/sketches_birds/14.jpg b/app/src/main/assets/sketches_birds/14.jpg new file mode 100644 index 0000000..2074c6f Binary files /dev/null and b/app/src/main/assets/sketches_birds/14.jpg differ diff --git a/app/src/main/assets/sketches_birds/15.jpg b/app/src/main/assets/sketches_birds/15.jpg new file mode 100644 index 0000000..59b0e47 Binary files /dev/null and b/app/src/main/assets/sketches_birds/15.jpg differ diff --git a/app/src/main/assets/sketches_birds/16.jpg b/app/src/main/assets/sketches_birds/16.jpg new file mode 100644 index 0000000..fe950d1 Binary files /dev/null and b/app/src/main/assets/sketches_birds/16.jpg differ diff --git a/app/src/main/assets/sketches_birds/17.jpg b/app/src/main/assets/sketches_birds/17.jpg new file mode 100644 index 0000000..484f39a Binary files /dev/null and b/app/src/main/assets/sketches_birds/17.jpg differ diff --git a/app/src/main/assets/sketches_birds/18.jpg b/app/src/main/assets/sketches_birds/18.jpg new file mode 100644 index 0000000..2792ed1 Binary files /dev/null and b/app/src/main/assets/sketches_birds/18.jpg differ diff --git a/app/src/main/assets/sketches_birds/19.jpg b/app/src/main/assets/sketches_birds/19.jpg new file mode 100644 index 0000000..9e9bb27 Binary files /dev/null and b/app/src/main/assets/sketches_birds/19.jpg differ diff --git a/app/src/main/assets/sketches_birds/2.jpg b/app/src/main/assets/sketches_birds/2.jpg new file mode 100644 index 0000000..0929272 Binary files /dev/null and b/app/src/main/assets/sketches_birds/2.jpg differ diff --git a/app/src/main/assets/sketches_birds/3.jpg b/app/src/main/assets/sketches_birds/3.jpg new file mode 100644 index 0000000..1376a50 Binary files /dev/null and b/app/src/main/assets/sketches_birds/3.jpg differ diff --git a/app/src/main/assets/sketches_birds/4.jpg b/app/src/main/assets/sketches_birds/4.jpg new file mode 100644 index 0000000..1cd8f9c Binary files /dev/null and b/app/src/main/assets/sketches_birds/4.jpg differ diff --git a/app/src/main/assets/sketches_birds/5.jpg b/app/src/main/assets/sketches_birds/5.jpg new file mode 100644 index 0000000..7637589 Binary files /dev/null and b/app/src/main/assets/sketches_birds/5.jpg differ diff --git a/app/src/main/assets/sketches_birds/6.jpg b/app/src/main/assets/sketches_birds/6.jpg new file mode 100644 index 0000000..3bf16b6 Binary files /dev/null and b/app/src/main/assets/sketches_birds/6.jpg differ diff --git a/app/src/main/assets/sketches_birds/7.jpg b/app/src/main/assets/sketches_birds/7.jpg new file mode 100644 index 0000000..076e51d Binary files /dev/null and b/app/src/main/assets/sketches_birds/7.jpg differ diff --git a/app/src/main/assets/sketches_birds/8.jpg b/app/src/main/assets/sketches_birds/8.jpg new file mode 100644 index 0000000..71f5cf7 Binary files /dev/null and b/app/src/main/assets/sketches_birds/8.jpg differ diff --git a/app/src/main/assets/sketches_birds/9.jpg b/app/src/main/assets/sketches_birds/9.jpg new file mode 100644 index 0000000..8767032 Binary files /dev/null and b/app/src/main/assets/sketches_birds/9.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/1.jpg b/app/src/main/assets/sketches_butterfly/1.jpg new file mode 100644 index 0000000..0d713b7 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/1.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/10.jpg b/app/src/main/assets/sketches_butterfly/10.jpg new file mode 100644 index 0000000..ae497c8 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/10.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/11.jpg b/app/src/main/assets/sketches_butterfly/11.jpg new file mode 100644 index 0000000..d2e39ef Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/11.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/12.jpg b/app/src/main/assets/sketches_butterfly/12.jpg new file mode 100644 index 0000000..410af7c Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/12.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/13.jpg b/app/src/main/assets/sketches_butterfly/13.jpg new file mode 100644 index 0000000..233a998 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/13.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/14.jpg b/app/src/main/assets/sketches_butterfly/14.jpg new file mode 100644 index 0000000..9545c0f Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/14.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/15.jpg b/app/src/main/assets/sketches_butterfly/15.jpg new file mode 100644 index 0000000..aa0da5b Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/15.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/16.jpg b/app/src/main/assets/sketches_butterfly/16.jpg new file mode 100644 index 0000000..4b118cf Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/16.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/17.jpg b/app/src/main/assets/sketches_butterfly/17.jpg new file mode 100644 index 0000000..ebfdc2e Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/17.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/18.jpg b/app/src/main/assets/sketches_butterfly/18.jpg new file mode 100644 index 0000000..7b81ca1 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/18.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/19.jpg b/app/src/main/assets/sketches_butterfly/19.jpg new file mode 100644 index 0000000..903fd82 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/19.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/2.jpg b/app/src/main/assets/sketches_butterfly/2.jpg new file mode 100644 index 0000000..f92c438 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/2.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/20.jpg b/app/src/main/assets/sketches_butterfly/20.jpg new file mode 100644 index 0000000..7d0dc2e Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/20.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/21.jpg b/app/src/main/assets/sketches_butterfly/21.jpg new file mode 100644 index 0000000..ff82d93 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/21.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/3.jpg b/app/src/main/assets/sketches_butterfly/3.jpg new file mode 100644 index 0000000..5251134 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/3.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/4.jpg b/app/src/main/assets/sketches_butterfly/4.jpg new file mode 100644 index 0000000..01d5932 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/4.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/5.jpg b/app/src/main/assets/sketches_butterfly/5.jpg new file mode 100644 index 0000000..cc99ed5 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/5.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/6.jpg b/app/src/main/assets/sketches_butterfly/6.jpg new file mode 100644 index 0000000..6d02805 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/6.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/7.jpg b/app/src/main/assets/sketches_butterfly/7.jpg new file mode 100644 index 0000000..dd52dbd Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/7.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/8.jpg b/app/src/main/assets/sketches_butterfly/8.jpg new file mode 100644 index 0000000..d519ca7 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/8.jpg differ diff --git a/app/src/main/assets/sketches_butterfly/9.jpg b/app/src/main/assets/sketches_butterfly/9.jpg new file mode 100644 index 0000000..0cedb47 Binary files /dev/null and b/app/src/main/assets/sketches_butterfly/9.jpg differ diff --git a/app/src/main/assets/sketches_cafe/1.jpg b/app/src/main/assets/sketches_cafe/1.jpg new file mode 100644 index 0000000..b347b44 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/1.jpg differ diff --git a/app/src/main/assets/sketches_cafe/10.jpg b/app/src/main/assets/sketches_cafe/10.jpg new file mode 100644 index 0000000..3728490 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/10.jpg differ diff --git a/app/src/main/assets/sketches_cafe/11.jpg b/app/src/main/assets/sketches_cafe/11.jpg new file mode 100644 index 0000000..bff21e1 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/11.jpg differ diff --git a/app/src/main/assets/sketches_cafe/12.jpg b/app/src/main/assets/sketches_cafe/12.jpg new file mode 100644 index 0000000..3966d4a Binary files /dev/null and b/app/src/main/assets/sketches_cafe/12.jpg differ diff --git a/app/src/main/assets/sketches_cafe/13.jpg b/app/src/main/assets/sketches_cafe/13.jpg new file mode 100644 index 0000000..8200e12 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/13.jpg differ diff --git a/app/src/main/assets/sketches_cafe/14.jpg b/app/src/main/assets/sketches_cafe/14.jpg new file mode 100644 index 0000000..65ee383 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/14.jpg differ diff --git a/app/src/main/assets/sketches_cafe/15.jpg b/app/src/main/assets/sketches_cafe/15.jpg new file mode 100644 index 0000000..01df5e5 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/15.jpg differ diff --git a/app/src/main/assets/sketches_cafe/16.jpg b/app/src/main/assets/sketches_cafe/16.jpg new file mode 100644 index 0000000..ff679c1 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/16.jpg differ diff --git a/app/src/main/assets/sketches_cafe/17.jpg b/app/src/main/assets/sketches_cafe/17.jpg new file mode 100644 index 0000000..42fdf87 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/17.jpg differ diff --git a/app/src/main/assets/sketches_cafe/18.jpg b/app/src/main/assets/sketches_cafe/18.jpg new file mode 100644 index 0000000..06d300e Binary files /dev/null and b/app/src/main/assets/sketches_cafe/18.jpg differ diff --git a/app/src/main/assets/sketches_cafe/19.jpg b/app/src/main/assets/sketches_cafe/19.jpg new file mode 100644 index 0000000..42aaa2c Binary files /dev/null and b/app/src/main/assets/sketches_cafe/19.jpg differ diff --git a/app/src/main/assets/sketches_cafe/2.jpg b/app/src/main/assets/sketches_cafe/2.jpg new file mode 100644 index 0000000..14d9b25 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/2.jpg differ diff --git a/app/src/main/assets/sketches_cafe/20.jpg b/app/src/main/assets/sketches_cafe/20.jpg new file mode 100644 index 0000000..5dad84c Binary files /dev/null and b/app/src/main/assets/sketches_cafe/20.jpg differ diff --git a/app/src/main/assets/sketches_cafe/21.jpg b/app/src/main/assets/sketches_cafe/21.jpg new file mode 100644 index 0000000..c019faa Binary files /dev/null and b/app/src/main/assets/sketches_cafe/21.jpg differ diff --git a/app/src/main/assets/sketches_cafe/22.jpg b/app/src/main/assets/sketches_cafe/22.jpg new file mode 100644 index 0000000..28cdc4e Binary files /dev/null and b/app/src/main/assets/sketches_cafe/22.jpg differ diff --git a/app/src/main/assets/sketches_cafe/23.jpg b/app/src/main/assets/sketches_cafe/23.jpg new file mode 100644 index 0000000..973a5c2 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/23.jpg differ diff --git a/app/src/main/assets/sketches_cafe/24.jpg b/app/src/main/assets/sketches_cafe/24.jpg new file mode 100644 index 0000000..3c36d8a Binary files /dev/null and b/app/src/main/assets/sketches_cafe/24.jpg differ diff --git a/app/src/main/assets/sketches_cafe/25.jpg b/app/src/main/assets/sketches_cafe/25.jpg new file mode 100644 index 0000000..c7be496 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/25.jpg differ diff --git a/app/src/main/assets/sketches_cafe/26.jpg b/app/src/main/assets/sketches_cafe/26.jpg new file mode 100644 index 0000000..7229696 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/26.jpg differ diff --git a/app/src/main/assets/sketches_cafe/27.jpg b/app/src/main/assets/sketches_cafe/27.jpg new file mode 100644 index 0000000..f857542 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/27.jpg differ diff --git a/app/src/main/assets/sketches_cafe/28.jpg b/app/src/main/assets/sketches_cafe/28.jpg new file mode 100644 index 0000000..8cde6de Binary files /dev/null and b/app/src/main/assets/sketches_cafe/28.jpg differ diff --git a/app/src/main/assets/sketches_cafe/29.jpg b/app/src/main/assets/sketches_cafe/29.jpg new file mode 100644 index 0000000..8affd30 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/29.jpg differ diff --git a/app/src/main/assets/sketches_cafe/3.jpg b/app/src/main/assets/sketches_cafe/3.jpg new file mode 100644 index 0000000..b1c3cfa Binary files /dev/null and b/app/src/main/assets/sketches_cafe/3.jpg differ diff --git a/app/src/main/assets/sketches_cafe/30.jpg b/app/src/main/assets/sketches_cafe/30.jpg new file mode 100644 index 0000000..f71ce84 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/30.jpg differ diff --git a/app/src/main/assets/sketches_cafe/31.jpg b/app/src/main/assets/sketches_cafe/31.jpg new file mode 100644 index 0000000..a5d22ca Binary files /dev/null and b/app/src/main/assets/sketches_cafe/31.jpg differ diff --git a/app/src/main/assets/sketches_cafe/32.jpg b/app/src/main/assets/sketches_cafe/32.jpg new file mode 100644 index 0000000..8513a5e Binary files /dev/null and b/app/src/main/assets/sketches_cafe/32.jpg differ diff --git a/app/src/main/assets/sketches_cafe/33.jpg b/app/src/main/assets/sketches_cafe/33.jpg new file mode 100644 index 0000000..fcdcbcc Binary files /dev/null and b/app/src/main/assets/sketches_cafe/33.jpg differ diff --git a/app/src/main/assets/sketches_cafe/34.jpg b/app/src/main/assets/sketches_cafe/34.jpg new file mode 100644 index 0000000..51bbf4b Binary files /dev/null and b/app/src/main/assets/sketches_cafe/34.jpg differ diff --git a/app/src/main/assets/sketches_cafe/35.jpg b/app/src/main/assets/sketches_cafe/35.jpg new file mode 100644 index 0000000..e1067da Binary files /dev/null and b/app/src/main/assets/sketches_cafe/35.jpg differ diff --git a/app/src/main/assets/sketches_cafe/36.jpg b/app/src/main/assets/sketches_cafe/36.jpg new file mode 100644 index 0000000..181a84a Binary files /dev/null and b/app/src/main/assets/sketches_cafe/36.jpg differ diff --git a/app/src/main/assets/sketches_cafe/37.jpg b/app/src/main/assets/sketches_cafe/37.jpg new file mode 100644 index 0000000..d8ffb00 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/37.jpg differ diff --git a/app/src/main/assets/sketches_cafe/38.jpg b/app/src/main/assets/sketches_cafe/38.jpg new file mode 100644 index 0000000..abdba50 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/38.jpg differ diff --git a/app/src/main/assets/sketches_cafe/4.jpg b/app/src/main/assets/sketches_cafe/4.jpg new file mode 100644 index 0000000..8792f16 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/4.jpg differ diff --git a/app/src/main/assets/sketches_cafe/5.jpg b/app/src/main/assets/sketches_cafe/5.jpg new file mode 100644 index 0000000..89630aa Binary files /dev/null and b/app/src/main/assets/sketches_cafe/5.jpg differ diff --git a/app/src/main/assets/sketches_cafe/6.jpg b/app/src/main/assets/sketches_cafe/6.jpg new file mode 100644 index 0000000..7e6832e Binary files /dev/null and b/app/src/main/assets/sketches_cafe/6.jpg differ diff --git a/app/src/main/assets/sketches_cafe/7.jpg b/app/src/main/assets/sketches_cafe/7.jpg new file mode 100644 index 0000000..f4d2afb Binary files /dev/null and b/app/src/main/assets/sketches_cafe/7.jpg differ diff --git a/app/src/main/assets/sketches_cafe/8.jpg b/app/src/main/assets/sketches_cafe/8.jpg new file mode 100644 index 0000000..78f5ccf Binary files /dev/null and b/app/src/main/assets/sketches_cafe/8.jpg differ diff --git a/app/src/main/assets/sketches_cafe/9.jpg b/app/src/main/assets/sketches_cafe/9.jpg new file mode 100644 index 0000000..4038bb5 Binary files /dev/null and b/app/src/main/assets/sketches_cafe/9.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/1.jpg b/app/src/main/assets/sketches_cartoons/1.jpg new file mode 100644 index 0000000..74bf123 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/1.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/10.jpg b/app/src/main/assets/sketches_cartoons/10.jpg new file mode 100644 index 0000000..450fa6e Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/10.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/11.jpg b/app/src/main/assets/sketches_cartoons/11.jpg new file mode 100644 index 0000000..1f2a904 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/11.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/12.jpg b/app/src/main/assets/sketches_cartoons/12.jpg new file mode 100644 index 0000000..86ef206 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/12.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/13.jpg b/app/src/main/assets/sketches_cartoons/13.jpg new file mode 100644 index 0000000..92e1d75 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/13.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/14.jpg b/app/src/main/assets/sketches_cartoons/14.jpg new file mode 100644 index 0000000..c82e897 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/14.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/15.jpg b/app/src/main/assets/sketches_cartoons/15.jpg new file mode 100644 index 0000000..bcd8678 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/15.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/16.jpg b/app/src/main/assets/sketches_cartoons/16.jpg new file mode 100644 index 0000000..18377bd Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/16.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/17.jpg b/app/src/main/assets/sketches_cartoons/17.jpg new file mode 100644 index 0000000..45aafbb Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/17.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/18.jpg b/app/src/main/assets/sketches_cartoons/18.jpg new file mode 100644 index 0000000..048d253 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/18.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/19.jpg b/app/src/main/assets/sketches_cartoons/19.jpg new file mode 100644 index 0000000..c2501b2 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/19.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/2.jpg b/app/src/main/assets/sketches_cartoons/2.jpg new file mode 100644 index 0000000..8baf95b Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/2.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/20.jpg b/app/src/main/assets/sketches_cartoons/20.jpg new file mode 100644 index 0000000..fb7901c Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/20.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/21.jpg b/app/src/main/assets/sketches_cartoons/21.jpg new file mode 100644 index 0000000..ed7104e Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/21.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/22.jpg b/app/src/main/assets/sketches_cartoons/22.jpg new file mode 100644 index 0000000..cd003eb Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/22.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/23.jpg b/app/src/main/assets/sketches_cartoons/23.jpg new file mode 100644 index 0000000..77b49a4 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/23.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/24.jpg b/app/src/main/assets/sketches_cartoons/24.jpg new file mode 100644 index 0000000..1c7dc65 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/24.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/25.jpg b/app/src/main/assets/sketches_cartoons/25.jpg new file mode 100644 index 0000000..442aec2 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/25.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/26.jpg b/app/src/main/assets/sketches_cartoons/26.jpg new file mode 100644 index 0000000..ec4a2ff Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/26.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/3.jpg b/app/src/main/assets/sketches_cartoons/3.jpg new file mode 100644 index 0000000..e099902 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/3.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/4.jpg b/app/src/main/assets/sketches_cartoons/4.jpg new file mode 100644 index 0000000..a4c69ba Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/4.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/5.jpg b/app/src/main/assets/sketches_cartoons/5.jpg new file mode 100644 index 0000000..b32485d Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/5.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/6.jpg b/app/src/main/assets/sketches_cartoons/6.jpg new file mode 100644 index 0000000..0e0a7ef Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/6.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/7.jpg b/app/src/main/assets/sketches_cartoons/7.jpg new file mode 100644 index 0000000..ecd8dc0 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/7.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/8.jpg b/app/src/main/assets/sketches_cartoons/8.jpg new file mode 100644 index 0000000..f6ea587 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/8.jpg differ diff --git a/app/src/main/assets/sketches_cartoons/9.jpg b/app/src/main/assets/sketches_cartoons/9.jpg new file mode 100644 index 0000000..da4c151 Binary files /dev/null and b/app/src/main/assets/sketches_cartoons/9.jpg differ diff --git a/app/src/main/assets/sketches_christmas/1.jpg b/app/src/main/assets/sketches_christmas/1.jpg new file mode 100644 index 0000000..cc1fafb Binary files /dev/null and b/app/src/main/assets/sketches_christmas/1.jpg differ diff --git a/app/src/main/assets/sketches_christmas/10.jpg b/app/src/main/assets/sketches_christmas/10.jpg new file mode 100644 index 0000000..e5e63d6 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/10.jpg differ diff --git a/app/src/main/assets/sketches_christmas/11.jpg b/app/src/main/assets/sketches_christmas/11.jpg new file mode 100644 index 0000000..cae5d66 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/11.jpg differ diff --git a/app/src/main/assets/sketches_christmas/12.jpg b/app/src/main/assets/sketches_christmas/12.jpg new file mode 100644 index 0000000..13fd21f Binary files /dev/null and b/app/src/main/assets/sketches_christmas/12.jpg differ diff --git a/app/src/main/assets/sketches_christmas/13.jpg b/app/src/main/assets/sketches_christmas/13.jpg new file mode 100644 index 0000000..1fa30fe Binary files /dev/null and b/app/src/main/assets/sketches_christmas/13.jpg differ diff --git a/app/src/main/assets/sketches_christmas/14.jpg b/app/src/main/assets/sketches_christmas/14.jpg new file mode 100644 index 0000000..aec6dcf Binary files /dev/null and b/app/src/main/assets/sketches_christmas/14.jpg differ diff --git a/app/src/main/assets/sketches_christmas/15.jpg b/app/src/main/assets/sketches_christmas/15.jpg new file mode 100644 index 0000000..647c8b6 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/15.jpg differ diff --git a/app/src/main/assets/sketches_christmas/16.jpg b/app/src/main/assets/sketches_christmas/16.jpg new file mode 100644 index 0000000..b36a79c Binary files /dev/null and b/app/src/main/assets/sketches_christmas/16.jpg differ diff --git a/app/src/main/assets/sketches_christmas/17.jpg b/app/src/main/assets/sketches_christmas/17.jpg new file mode 100644 index 0000000..2655af2 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/17.jpg differ diff --git a/app/src/main/assets/sketches_christmas/18.jpg b/app/src/main/assets/sketches_christmas/18.jpg new file mode 100644 index 0000000..e784d64 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/18.jpg differ diff --git a/app/src/main/assets/sketches_christmas/19.jpg b/app/src/main/assets/sketches_christmas/19.jpg new file mode 100644 index 0000000..fcf2085 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/19.jpg differ diff --git a/app/src/main/assets/sketches_christmas/2.jpg b/app/src/main/assets/sketches_christmas/2.jpg new file mode 100644 index 0000000..326e86b Binary files /dev/null and b/app/src/main/assets/sketches_christmas/2.jpg differ diff --git a/app/src/main/assets/sketches_christmas/20.jpg b/app/src/main/assets/sketches_christmas/20.jpg new file mode 100644 index 0000000..a9e3c89 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/20.jpg differ diff --git a/app/src/main/assets/sketches_christmas/21.jpg b/app/src/main/assets/sketches_christmas/21.jpg new file mode 100644 index 0000000..71b4150 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/21.jpg differ diff --git a/app/src/main/assets/sketches_christmas/22.jpg b/app/src/main/assets/sketches_christmas/22.jpg new file mode 100644 index 0000000..3c99d0d Binary files /dev/null and b/app/src/main/assets/sketches_christmas/22.jpg differ diff --git a/app/src/main/assets/sketches_christmas/23.jpg b/app/src/main/assets/sketches_christmas/23.jpg new file mode 100644 index 0000000..32c3b03 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/23.jpg differ diff --git a/app/src/main/assets/sketches_christmas/24.jpg b/app/src/main/assets/sketches_christmas/24.jpg new file mode 100644 index 0000000..80fd836 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/24.jpg differ diff --git a/app/src/main/assets/sketches_christmas/25.jpg b/app/src/main/assets/sketches_christmas/25.jpg new file mode 100644 index 0000000..8e2bef6 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/25.jpg differ diff --git a/app/src/main/assets/sketches_christmas/3.jpg b/app/src/main/assets/sketches_christmas/3.jpg new file mode 100644 index 0000000..4c24cd2 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/3.jpg differ diff --git a/app/src/main/assets/sketches_christmas/4.jpg b/app/src/main/assets/sketches_christmas/4.jpg new file mode 100644 index 0000000..28fb1b0 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/4.jpg differ diff --git a/app/src/main/assets/sketches_christmas/5.jpg b/app/src/main/assets/sketches_christmas/5.jpg new file mode 100644 index 0000000..93ad555 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/5.jpg differ diff --git a/app/src/main/assets/sketches_christmas/6.jpg b/app/src/main/assets/sketches_christmas/6.jpg new file mode 100644 index 0000000..02fe302 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/6.jpg differ diff --git a/app/src/main/assets/sketches_christmas/7.jpg b/app/src/main/assets/sketches_christmas/7.jpg new file mode 100644 index 0000000..dc41982 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/7.jpg differ diff --git a/app/src/main/assets/sketches_christmas/8.jpg b/app/src/main/assets/sketches_christmas/8.jpg new file mode 100644 index 0000000..5f13019 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/8.jpg differ diff --git a/app/src/main/assets/sketches_christmas/9.jpg b/app/src/main/assets/sketches_christmas/9.jpg new file mode 100644 index 0000000..e556980 Binary files /dev/null and b/app/src/main/assets/sketches_christmas/9.jpg differ diff --git a/app/src/main/assets/sketches_festivals/1.jpg b/app/src/main/assets/sketches_festivals/1.jpg new file mode 100644 index 0000000..125d632 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/1.jpg differ diff --git a/app/src/main/assets/sketches_festivals/10.jpg b/app/src/main/assets/sketches_festivals/10.jpg new file mode 100644 index 0000000..d17b9f1 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/10.jpg differ diff --git a/app/src/main/assets/sketches_festivals/11.jpg b/app/src/main/assets/sketches_festivals/11.jpg new file mode 100644 index 0000000..702f052 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/11.jpg differ diff --git a/app/src/main/assets/sketches_festivals/12.jpg b/app/src/main/assets/sketches_festivals/12.jpg new file mode 100644 index 0000000..6f231e1 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/12.jpg differ diff --git a/app/src/main/assets/sketches_festivals/13.jpg b/app/src/main/assets/sketches_festivals/13.jpg new file mode 100644 index 0000000..20556a1 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/13.jpg differ diff --git a/app/src/main/assets/sketches_festivals/14.jpg b/app/src/main/assets/sketches_festivals/14.jpg new file mode 100644 index 0000000..fb78127 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/14.jpg differ diff --git a/app/src/main/assets/sketches_festivals/15.jpg b/app/src/main/assets/sketches_festivals/15.jpg new file mode 100644 index 0000000..e74f47e Binary files /dev/null and b/app/src/main/assets/sketches_festivals/15.jpg differ diff --git a/app/src/main/assets/sketches_festivals/16.jpg b/app/src/main/assets/sketches_festivals/16.jpg new file mode 100644 index 0000000..136f6e8 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/16.jpg differ diff --git a/app/src/main/assets/sketches_festivals/17.jpg b/app/src/main/assets/sketches_festivals/17.jpg new file mode 100644 index 0000000..fd50e67 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/17.jpg differ diff --git a/app/src/main/assets/sketches_festivals/18.jpg b/app/src/main/assets/sketches_festivals/18.jpg new file mode 100644 index 0000000..d3f7936 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/18.jpg differ diff --git a/app/src/main/assets/sketches_festivals/19.jpg b/app/src/main/assets/sketches_festivals/19.jpg new file mode 100644 index 0000000..9a4f1b8 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/19.jpg differ diff --git a/app/src/main/assets/sketches_festivals/2.jpg b/app/src/main/assets/sketches_festivals/2.jpg new file mode 100644 index 0000000..84aa31a Binary files /dev/null and b/app/src/main/assets/sketches_festivals/2.jpg differ diff --git a/app/src/main/assets/sketches_festivals/20.jpg b/app/src/main/assets/sketches_festivals/20.jpg new file mode 100644 index 0000000..268c943 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/20.jpg differ diff --git a/app/src/main/assets/sketches_festivals/21.jpg b/app/src/main/assets/sketches_festivals/21.jpg new file mode 100644 index 0000000..614bffd Binary files /dev/null and b/app/src/main/assets/sketches_festivals/21.jpg differ diff --git a/app/src/main/assets/sketches_festivals/22.jpg b/app/src/main/assets/sketches_festivals/22.jpg new file mode 100644 index 0000000..f81eb8d Binary files /dev/null and b/app/src/main/assets/sketches_festivals/22.jpg differ diff --git a/app/src/main/assets/sketches_festivals/3.jpg b/app/src/main/assets/sketches_festivals/3.jpg new file mode 100644 index 0000000..5ca2b11 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/3.jpg differ diff --git a/app/src/main/assets/sketches_festivals/4.jpg b/app/src/main/assets/sketches_festivals/4.jpg new file mode 100644 index 0000000..1f8cc81 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/4.jpg differ diff --git a/app/src/main/assets/sketches_festivals/5.jpg b/app/src/main/assets/sketches_festivals/5.jpg new file mode 100644 index 0000000..7f1bd1a Binary files /dev/null and b/app/src/main/assets/sketches_festivals/5.jpg differ diff --git a/app/src/main/assets/sketches_festivals/6.jpg b/app/src/main/assets/sketches_festivals/6.jpg new file mode 100644 index 0000000..9cf832a Binary files /dev/null and b/app/src/main/assets/sketches_festivals/6.jpg differ diff --git a/app/src/main/assets/sketches_festivals/7.jpg b/app/src/main/assets/sketches_festivals/7.jpg new file mode 100644 index 0000000..dcd83f3 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/7.jpg differ diff --git a/app/src/main/assets/sketches_festivals/8.jpg b/app/src/main/assets/sketches_festivals/8.jpg new file mode 100644 index 0000000..1117f09 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/8.jpg differ diff --git a/app/src/main/assets/sketches_festivals/9.jpg b/app/src/main/assets/sketches_festivals/9.jpg new file mode 100644 index 0000000..39d8467 Binary files /dev/null and b/app/src/main/assets/sketches_festivals/9.jpg differ diff --git a/app/src/main/assets/sketches_flowers/1.jpg b/app/src/main/assets/sketches_flowers/1.jpg new file mode 100644 index 0000000..217d9c8 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/1.jpg differ diff --git a/app/src/main/assets/sketches_flowers/10.jpg b/app/src/main/assets/sketches_flowers/10.jpg new file mode 100644 index 0000000..ba84e61 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/10.jpg differ diff --git a/app/src/main/assets/sketches_flowers/11.jpg b/app/src/main/assets/sketches_flowers/11.jpg new file mode 100644 index 0000000..e579753 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/11.jpg differ diff --git a/app/src/main/assets/sketches_flowers/12.jpg b/app/src/main/assets/sketches_flowers/12.jpg new file mode 100644 index 0000000..26092f9 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/12.jpg differ diff --git a/app/src/main/assets/sketches_flowers/13.jpg b/app/src/main/assets/sketches_flowers/13.jpg new file mode 100644 index 0000000..41d2df3 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/13.jpg differ diff --git a/app/src/main/assets/sketches_flowers/14.jpg b/app/src/main/assets/sketches_flowers/14.jpg new file mode 100644 index 0000000..c44df66 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/14.jpg differ diff --git a/app/src/main/assets/sketches_flowers/15.jpg b/app/src/main/assets/sketches_flowers/15.jpg new file mode 100644 index 0000000..ea34d36 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/15.jpg differ diff --git a/app/src/main/assets/sketches_flowers/16.jpg b/app/src/main/assets/sketches_flowers/16.jpg new file mode 100644 index 0000000..506beb1 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/16.jpg differ diff --git a/app/src/main/assets/sketches_flowers/17.jpg b/app/src/main/assets/sketches_flowers/17.jpg new file mode 100644 index 0000000..3764b21 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/17.jpg differ diff --git a/app/src/main/assets/sketches_flowers/18.jpg b/app/src/main/assets/sketches_flowers/18.jpg new file mode 100644 index 0000000..a759ab6 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/18.jpg differ diff --git a/app/src/main/assets/sketches_flowers/19.jpg b/app/src/main/assets/sketches_flowers/19.jpg new file mode 100644 index 0000000..e8c2a84 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/19.jpg differ diff --git a/app/src/main/assets/sketches_flowers/2.jpg b/app/src/main/assets/sketches_flowers/2.jpg new file mode 100644 index 0000000..fb7e56f Binary files /dev/null and b/app/src/main/assets/sketches_flowers/2.jpg differ diff --git a/app/src/main/assets/sketches_flowers/20.jpg b/app/src/main/assets/sketches_flowers/20.jpg new file mode 100644 index 0000000..93e5408 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/20.jpg differ diff --git a/app/src/main/assets/sketches_flowers/21.jpg b/app/src/main/assets/sketches_flowers/21.jpg new file mode 100644 index 0000000..4fa3a77 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/21.jpg differ diff --git a/app/src/main/assets/sketches_flowers/22.jpg b/app/src/main/assets/sketches_flowers/22.jpg new file mode 100644 index 0000000..6f45df7 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/22.jpg differ diff --git a/app/src/main/assets/sketches_flowers/23.jpg b/app/src/main/assets/sketches_flowers/23.jpg new file mode 100644 index 0000000..46e806d Binary files /dev/null and b/app/src/main/assets/sketches_flowers/23.jpg differ diff --git a/app/src/main/assets/sketches_flowers/3.jpg b/app/src/main/assets/sketches_flowers/3.jpg new file mode 100644 index 0000000..22a741c Binary files /dev/null and b/app/src/main/assets/sketches_flowers/3.jpg differ diff --git a/app/src/main/assets/sketches_flowers/4.jpg b/app/src/main/assets/sketches_flowers/4.jpg new file mode 100644 index 0000000..dd0a30f Binary files /dev/null and b/app/src/main/assets/sketches_flowers/4.jpg differ diff --git a/app/src/main/assets/sketches_flowers/5.jpg b/app/src/main/assets/sketches_flowers/5.jpg new file mode 100644 index 0000000..9dcb4f5 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/5.jpg differ diff --git a/app/src/main/assets/sketches_flowers/6.jpg b/app/src/main/assets/sketches_flowers/6.jpg new file mode 100644 index 0000000..cdf1f65 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/6.jpg differ diff --git a/app/src/main/assets/sketches_flowers/7.jpg b/app/src/main/assets/sketches_flowers/7.jpg new file mode 100644 index 0000000..caab990 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/7.jpg differ diff --git a/app/src/main/assets/sketches_flowers/8.jpg b/app/src/main/assets/sketches_flowers/8.jpg new file mode 100644 index 0000000..c43832b Binary files /dev/null and b/app/src/main/assets/sketches_flowers/8.jpg differ diff --git a/app/src/main/assets/sketches_flowers/9.jpg b/app/src/main/assets/sketches_flowers/9.jpg new file mode 100644 index 0000000..5b78ee1 Binary files /dev/null and b/app/src/main/assets/sketches_flowers/9.jpg differ diff --git a/app/src/main/assets/sketches_fruits/1.jpg b/app/src/main/assets/sketches_fruits/1.jpg new file mode 100644 index 0000000..767c0b4 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/1.jpg differ diff --git a/app/src/main/assets/sketches_fruits/10.jpg b/app/src/main/assets/sketches_fruits/10.jpg new file mode 100644 index 0000000..95bdbca Binary files /dev/null and b/app/src/main/assets/sketches_fruits/10.jpg differ diff --git a/app/src/main/assets/sketches_fruits/11.jpg b/app/src/main/assets/sketches_fruits/11.jpg new file mode 100644 index 0000000..b0bb89a Binary files /dev/null and b/app/src/main/assets/sketches_fruits/11.jpg differ diff --git a/app/src/main/assets/sketches_fruits/12.jpg b/app/src/main/assets/sketches_fruits/12.jpg new file mode 100644 index 0000000..c1d9bad Binary files /dev/null and b/app/src/main/assets/sketches_fruits/12.jpg differ diff --git a/app/src/main/assets/sketches_fruits/13.jpg b/app/src/main/assets/sketches_fruits/13.jpg new file mode 100644 index 0000000..f44fb86 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/13.jpg differ diff --git a/app/src/main/assets/sketches_fruits/14.jpg b/app/src/main/assets/sketches_fruits/14.jpg new file mode 100644 index 0000000..459a60c Binary files /dev/null and b/app/src/main/assets/sketches_fruits/14.jpg differ diff --git a/app/src/main/assets/sketches_fruits/15.jpg b/app/src/main/assets/sketches_fruits/15.jpg new file mode 100644 index 0000000..a4e4abe Binary files /dev/null and b/app/src/main/assets/sketches_fruits/15.jpg differ diff --git a/app/src/main/assets/sketches_fruits/16.jpg b/app/src/main/assets/sketches_fruits/16.jpg new file mode 100644 index 0000000..33a7a9a Binary files /dev/null and b/app/src/main/assets/sketches_fruits/16.jpg differ diff --git a/app/src/main/assets/sketches_fruits/17.jpg b/app/src/main/assets/sketches_fruits/17.jpg new file mode 100644 index 0000000..c193b1e Binary files /dev/null and b/app/src/main/assets/sketches_fruits/17.jpg differ diff --git a/app/src/main/assets/sketches_fruits/18.jpg b/app/src/main/assets/sketches_fruits/18.jpg new file mode 100644 index 0000000..f0ca248 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/18.jpg differ diff --git a/app/src/main/assets/sketches_fruits/19.jpg b/app/src/main/assets/sketches_fruits/19.jpg new file mode 100644 index 0000000..d93dfde Binary files /dev/null and b/app/src/main/assets/sketches_fruits/19.jpg differ diff --git a/app/src/main/assets/sketches_fruits/2.jpg b/app/src/main/assets/sketches_fruits/2.jpg new file mode 100644 index 0000000..b32f9f5 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/2.jpg differ diff --git a/app/src/main/assets/sketches_fruits/20.jpg b/app/src/main/assets/sketches_fruits/20.jpg new file mode 100644 index 0000000..cc3fe93 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/20.jpg differ diff --git a/app/src/main/assets/sketches_fruits/21.jpg b/app/src/main/assets/sketches_fruits/21.jpg new file mode 100644 index 0000000..c1813eb Binary files /dev/null and b/app/src/main/assets/sketches_fruits/21.jpg differ diff --git a/app/src/main/assets/sketches_fruits/22.jpg b/app/src/main/assets/sketches_fruits/22.jpg new file mode 100644 index 0000000..47387e1 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/22.jpg differ diff --git a/app/src/main/assets/sketches_fruits/23.jpg b/app/src/main/assets/sketches_fruits/23.jpg new file mode 100644 index 0000000..7f173ec Binary files /dev/null and b/app/src/main/assets/sketches_fruits/23.jpg differ diff --git a/app/src/main/assets/sketches_fruits/24.jpg b/app/src/main/assets/sketches_fruits/24.jpg new file mode 100644 index 0000000..a7ae235 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/24.jpg differ diff --git a/app/src/main/assets/sketches_fruits/25.jpg b/app/src/main/assets/sketches_fruits/25.jpg new file mode 100644 index 0000000..dd664bb Binary files /dev/null and b/app/src/main/assets/sketches_fruits/25.jpg differ diff --git a/app/src/main/assets/sketches_fruits/26.jpg b/app/src/main/assets/sketches_fruits/26.jpg new file mode 100644 index 0000000..c8e4723 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/26.jpg differ diff --git a/app/src/main/assets/sketches_fruits/27.jpg b/app/src/main/assets/sketches_fruits/27.jpg new file mode 100644 index 0000000..816337d Binary files /dev/null and b/app/src/main/assets/sketches_fruits/27.jpg differ diff --git a/app/src/main/assets/sketches_fruits/28.jpg b/app/src/main/assets/sketches_fruits/28.jpg new file mode 100644 index 0000000..29973d5 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/28.jpg differ diff --git a/app/src/main/assets/sketches_fruits/29.jpg b/app/src/main/assets/sketches_fruits/29.jpg new file mode 100644 index 0000000..4f0750f Binary files /dev/null and b/app/src/main/assets/sketches_fruits/29.jpg differ diff --git a/app/src/main/assets/sketches_fruits/3.jpg b/app/src/main/assets/sketches_fruits/3.jpg new file mode 100644 index 0000000..f57893b Binary files /dev/null and b/app/src/main/assets/sketches_fruits/3.jpg differ diff --git a/app/src/main/assets/sketches_fruits/30.jpg b/app/src/main/assets/sketches_fruits/30.jpg new file mode 100644 index 0000000..cfd117a Binary files /dev/null and b/app/src/main/assets/sketches_fruits/30.jpg differ diff --git a/app/src/main/assets/sketches_fruits/31.jpg b/app/src/main/assets/sketches_fruits/31.jpg new file mode 100644 index 0000000..b59a7c5 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/31.jpg differ diff --git a/app/src/main/assets/sketches_fruits/32.jpg b/app/src/main/assets/sketches_fruits/32.jpg new file mode 100644 index 0000000..8f70790 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/32.jpg differ diff --git a/app/src/main/assets/sketches_fruits/33.jpg b/app/src/main/assets/sketches_fruits/33.jpg new file mode 100644 index 0000000..373b142 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/33.jpg differ diff --git a/app/src/main/assets/sketches_fruits/34.jpg b/app/src/main/assets/sketches_fruits/34.jpg new file mode 100644 index 0000000..c5beb91 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/34.jpg differ diff --git a/app/src/main/assets/sketches_fruits/35.jpg b/app/src/main/assets/sketches_fruits/35.jpg new file mode 100644 index 0000000..79cd667 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/35.jpg differ diff --git a/app/src/main/assets/sketches_fruits/36.jpg b/app/src/main/assets/sketches_fruits/36.jpg new file mode 100644 index 0000000..c0cb185 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/36.jpg differ diff --git a/app/src/main/assets/sketches_fruits/37.jpg b/app/src/main/assets/sketches_fruits/37.jpg new file mode 100644 index 0000000..ba1b245 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/37.jpg differ diff --git a/app/src/main/assets/sketches_fruits/38.jpg b/app/src/main/assets/sketches_fruits/38.jpg new file mode 100644 index 0000000..c7eccb8 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/38.jpg differ diff --git a/app/src/main/assets/sketches_fruits/39.jpg b/app/src/main/assets/sketches_fruits/39.jpg new file mode 100644 index 0000000..bc95aaa Binary files /dev/null and b/app/src/main/assets/sketches_fruits/39.jpg differ diff --git a/app/src/main/assets/sketches_fruits/4.jpg b/app/src/main/assets/sketches_fruits/4.jpg new file mode 100644 index 0000000..2d7465d Binary files /dev/null and b/app/src/main/assets/sketches_fruits/4.jpg differ diff --git a/app/src/main/assets/sketches_fruits/5.jpg b/app/src/main/assets/sketches_fruits/5.jpg new file mode 100644 index 0000000..8ed633f Binary files /dev/null and b/app/src/main/assets/sketches_fruits/5.jpg differ diff --git a/app/src/main/assets/sketches_fruits/6.jpg b/app/src/main/assets/sketches_fruits/6.jpg new file mode 100644 index 0000000..06ce330 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/6.jpg differ diff --git a/app/src/main/assets/sketches_fruits/7.jpg b/app/src/main/assets/sketches_fruits/7.jpg new file mode 100644 index 0000000..6153618 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/7.jpg differ diff --git a/app/src/main/assets/sketches_fruits/8.jpg b/app/src/main/assets/sketches_fruits/8.jpg new file mode 100644 index 0000000..e333f0f Binary files /dev/null and b/app/src/main/assets/sketches_fruits/8.jpg differ diff --git a/app/src/main/assets/sketches_fruits/9.jpg b/app/src/main/assets/sketches_fruits/9.jpg new file mode 100644 index 0000000..d549d15 Binary files /dev/null and b/app/src/main/assets/sketches_fruits/9.jpg differ diff --git a/app/src/main/assets/sketches_general/1.jpg b/app/src/main/assets/sketches_general/1.jpg new file mode 100644 index 0000000..eb7c14b Binary files /dev/null and b/app/src/main/assets/sketches_general/1.jpg differ diff --git a/app/src/main/assets/sketches_general/10.jpg b/app/src/main/assets/sketches_general/10.jpg new file mode 100644 index 0000000..eacd298 Binary files /dev/null and b/app/src/main/assets/sketches_general/10.jpg differ diff --git a/app/src/main/assets/sketches_general/11.jpg b/app/src/main/assets/sketches_general/11.jpg new file mode 100644 index 0000000..273a876 Binary files /dev/null and b/app/src/main/assets/sketches_general/11.jpg differ diff --git a/app/src/main/assets/sketches_general/12.jpg b/app/src/main/assets/sketches_general/12.jpg new file mode 100644 index 0000000..5d786c5 Binary files /dev/null and b/app/src/main/assets/sketches_general/12.jpg differ diff --git a/app/src/main/assets/sketches_general/13.jpg b/app/src/main/assets/sketches_general/13.jpg new file mode 100644 index 0000000..486441a Binary files /dev/null and b/app/src/main/assets/sketches_general/13.jpg differ diff --git a/app/src/main/assets/sketches_general/14.jpg b/app/src/main/assets/sketches_general/14.jpg new file mode 100644 index 0000000..c36516b Binary files /dev/null and b/app/src/main/assets/sketches_general/14.jpg differ diff --git a/app/src/main/assets/sketches_general/15.jpg b/app/src/main/assets/sketches_general/15.jpg new file mode 100644 index 0000000..9d19fdf Binary files /dev/null and b/app/src/main/assets/sketches_general/15.jpg differ diff --git a/app/src/main/assets/sketches_general/2.jpg b/app/src/main/assets/sketches_general/2.jpg new file mode 100644 index 0000000..090d5d5 Binary files /dev/null and b/app/src/main/assets/sketches_general/2.jpg differ diff --git a/app/src/main/assets/sketches_general/3.jpg b/app/src/main/assets/sketches_general/3.jpg new file mode 100644 index 0000000..a17f1b2 Binary files /dev/null and b/app/src/main/assets/sketches_general/3.jpg differ diff --git a/app/src/main/assets/sketches_general/4.jpg b/app/src/main/assets/sketches_general/4.jpg new file mode 100644 index 0000000..2f4d8a2 Binary files /dev/null and b/app/src/main/assets/sketches_general/4.jpg differ diff --git a/app/src/main/assets/sketches_general/5.jpg b/app/src/main/assets/sketches_general/5.jpg new file mode 100644 index 0000000..8ac1cdb Binary files /dev/null and b/app/src/main/assets/sketches_general/5.jpg differ diff --git a/app/src/main/assets/sketches_general/6.jpg b/app/src/main/assets/sketches_general/6.jpg new file mode 100644 index 0000000..95cc582 Binary files /dev/null and b/app/src/main/assets/sketches_general/6.jpg differ diff --git a/app/src/main/assets/sketches_general/7.jpg b/app/src/main/assets/sketches_general/7.jpg new file mode 100644 index 0000000..91cbcfd Binary files /dev/null and b/app/src/main/assets/sketches_general/7.jpg differ diff --git a/app/src/main/assets/sketches_general/8.jpg b/app/src/main/assets/sketches_general/8.jpg new file mode 100644 index 0000000..af8da73 Binary files /dev/null and b/app/src/main/assets/sketches_general/8.jpg differ diff --git a/app/src/main/assets/sketches_general/9.jpg b/app/src/main/assets/sketches_general/9.jpg new file mode 100644 index 0000000..d5cfb72 Binary files /dev/null and b/app/src/main/assets/sketches_general/9.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/1.jpg b/app/src/main/assets/sketches_mehndi/1.jpg new file mode 100644 index 0000000..8dd8843 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/1.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/10.jpg b/app/src/main/assets/sketches_mehndi/10.jpg new file mode 100644 index 0000000..2432a79 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/10.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/11.jpg b/app/src/main/assets/sketches_mehndi/11.jpg new file mode 100644 index 0000000..aba85bf Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/11.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/12.jpg b/app/src/main/assets/sketches_mehndi/12.jpg new file mode 100644 index 0000000..f71ae22 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/12.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/2.jpg b/app/src/main/assets/sketches_mehndi/2.jpg new file mode 100644 index 0000000..0f56bf7 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/2.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/3.jpg b/app/src/main/assets/sketches_mehndi/3.jpg new file mode 100644 index 0000000..2bc7b69 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/3.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/4.jpg b/app/src/main/assets/sketches_mehndi/4.jpg new file mode 100644 index 0000000..6fc3f70 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/4.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/5.jpg b/app/src/main/assets/sketches_mehndi/5.jpg new file mode 100644 index 0000000..dccb5cf Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/5.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/6.jpg b/app/src/main/assets/sketches_mehndi/6.jpg new file mode 100644 index 0000000..4e052dd Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/6.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/7.jpg b/app/src/main/assets/sketches_mehndi/7.jpg new file mode 100644 index 0000000..021e789 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/7.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/8.jpg b/app/src/main/assets/sketches_mehndi/8.jpg new file mode 100644 index 0000000..dd45b50 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/8.jpg differ diff --git a/app/src/main/assets/sketches_mehndi/9.jpg b/app/src/main/assets/sketches_mehndi/9.jpg new file mode 100644 index 0000000..6ff2300 Binary files /dev/null and b/app/src/main/assets/sketches_mehndi/9.jpg differ diff --git a/app/src/main/assets/sketches_nature/1.jpg b/app/src/main/assets/sketches_nature/1.jpg new file mode 100644 index 0000000..22c00e3 Binary files /dev/null and b/app/src/main/assets/sketches_nature/1.jpg differ diff --git a/app/src/main/assets/sketches_nature/10.jpg b/app/src/main/assets/sketches_nature/10.jpg new file mode 100644 index 0000000..65aab09 Binary files /dev/null and b/app/src/main/assets/sketches_nature/10.jpg differ diff --git a/app/src/main/assets/sketches_nature/11.jpg b/app/src/main/assets/sketches_nature/11.jpg new file mode 100644 index 0000000..23c6653 Binary files /dev/null and b/app/src/main/assets/sketches_nature/11.jpg differ diff --git a/app/src/main/assets/sketches_nature/12.jpg b/app/src/main/assets/sketches_nature/12.jpg new file mode 100644 index 0000000..36e1835 Binary files /dev/null and b/app/src/main/assets/sketches_nature/12.jpg differ diff --git a/app/src/main/assets/sketches_nature/13.jpg b/app/src/main/assets/sketches_nature/13.jpg new file mode 100644 index 0000000..5816b61 Binary files /dev/null and b/app/src/main/assets/sketches_nature/13.jpg differ diff --git a/app/src/main/assets/sketches_nature/14.jpg b/app/src/main/assets/sketches_nature/14.jpg new file mode 100644 index 0000000..b4e5dc6 Binary files /dev/null and b/app/src/main/assets/sketches_nature/14.jpg differ diff --git a/app/src/main/assets/sketches_nature/15.jpg b/app/src/main/assets/sketches_nature/15.jpg new file mode 100644 index 0000000..5424ac4 Binary files /dev/null and b/app/src/main/assets/sketches_nature/15.jpg differ diff --git a/app/src/main/assets/sketches_nature/16.jpg b/app/src/main/assets/sketches_nature/16.jpg new file mode 100644 index 0000000..fd00791 Binary files /dev/null and b/app/src/main/assets/sketches_nature/16.jpg differ diff --git a/app/src/main/assets/sketches_nature/17.jpg b/app/src/main/assets/sketches_nature/17.jpg new file mode 100644 index 0000000..38410e8 Binary files /dev/null and b/app/src/main/assets/sketches_nature/17.jpg differ diff --git a/app/src/main/assets/sketches_nature/18.jpg b/app/src/main/assets/sketches_nature/18.jpg new file mode 100644 index 0000000..5ae5028 Binary files /dev/null and b/app/src/main/assets/sketches_nature/18.jpg differ diff --git a/app/src/main/assets/sketches_nature/19.jpg b/app/src/main/assets/sketches_nature/19.jpg new file mode 100644 index 0000000..e49b4f1 Binary files /dev/null and b/app/src/main/assets/sketches_nature/19.jpg differ diff --git a/app/src/main/assets/sketches_nature/2.jpg b/app/src/main/assets/sketches_nature/2.jpg new file mode 100644 index 0000000..3b5ec4c Binary files /dev/null and b/app/src/main/assets/sketches_nature/2.jpg differ diff --git a/app/src/main/assets/sketches_nature/20.jpg b/app/src/main/assets/sketches_nature/20.jpg new file mode 100644 index 0000000..cc94724 Binary files /dev/null and b/app/src/main/assets/sketches_nature/20.jpg differ diff --git a/app/src/main/assets/sketches_nature/21.jpg b/app/src/main/assets/sketches_nature/21.jpg new file mode 100644 index 0000000..dfa6c09 Binary files /dev/null and b/app/src/main/assets/sketches_nature/21.jpg differ diff --git a/app/src/main/assets/sketches_nature/22.jpg b/app/src/main/assets/sketches_nature/22.jpg new file mode 100644 index 0000000..c05e638 Binary files /dev/null and b/app/src/main/assets/sketches_nature/22.jpg differ diff --git a/app/src/main/assets/sketches_nature/23.jpg b/app/src/main/assets/sketches_nature/23.jpg new file mode 100644 index 0000000..6f932ec Binary files /dev/null and b/app/src/main/assets/sketches_nature/23.jpg differ diff --git a/app/src/main/assets/sketches_nature/3.jpg b/app/src/main/assets/sketches_nature/3.jpg new file mode 100644 index 0000000..1423546 Binary files /dev/null and b/app/src/main/assets/sketches_nature/3.jpg differ diff --git a/app/src/main/assets/sketches_nature/4.jpg b/app/src/main/assets/sketches_nature/4.jpg new file mode 100644 index 0000000..5499510 Binary files /dev/null and b/app/src/main/assets/sketches_nature/4.jpg differ diff --git a/app/src/main/assets/sketches_nature/5.jpg b/app/src/main/assets/sketches_nature/5.jpg new file mode 100644 index 0000000..434261a Binary files /dev/null and b/app/src/main/assets/sketches_nature/5.jpg differ diff --git a/app/src/main/assets/sketches_nature/6.jpg b/app/src/main/assets/sketches_nature/6.jpg new file mode 100644 index 0000000..f50166b Binary files /dev/null and b/app/src/main/assets/sketches_nature/6.jpg differ diff --git a/app/src/main/assets/sketches_nature/7.jpg b/app/src/main/assets/sketches_nature/7.jpg new file mode 100644 index 0000000..96e178c Binary files /dev/null and b/app/src/main/assets/sketches_nature/7.jpg differ diff --git a/app/src/main/assets/sketches_nature/8.jpg b/app/src/main/assets/sketches_nature/8.jpg new file mode 100644 index 0000000..c68f4f1 Binary files /dev/null and b/app/src/main/assets/sketches_nature/8.jpg differ diff --git a/app/src/main/assets/sketches_nature/9.jpg b/app/src/main/assets/sketches_nature/9.jpg new file mode 100644 index 0000000..6b8ccb4 Binary files /dev/null and b/app/src/main/assets/sketches_nature/9.jpg differ diff --git a/app/src/main/assets/sketches_properties/1.jpg b/app/src/main/assets/sketches_properties/1.jpg new file mode 100644 index 0000000..3289a38 Binary files /dev/null and b/app/src/main/assets/sketches_properties/1.jpg differ diff --git a/app/src/main/assets/sketches_properties/10.jpg b/app/src/main/assets/sketches_properties/10.jpg new file mode 100644 index 0000000..b065539 Binary files /dev/null and b/app/src/main/assets/sketches_properties/10.jpg differ diff --git a/app/src/main/assets/sketches_properties/11.jpg b/app/src/main/assets/sketches_properties/11.jpg new file mode 100644 index 0000000..12d28b1 Binary files /dev/null and b/app/src/main/assets/sketches_properties/11.jpg differ diff --git a/app/src/main/assets/sketches_properties/12.jpg b/app/src/main/assets/sketches_properties/12.jpg new file mode 100644 index 0000000..182879f Binary files /dev/null and b/app/src/main/assets/sketches_properties/12.jpg differ diff --git a/app/src/main/assets/sketches_properties/13.jpg b/app/src/main/assets/sketches_properties/13.jpg new file mode 100644 index 0000000..4263530 Binary files /dev/null and b/app/src/main/assets/sketches_properties/13.jpg differ diff --git a/app/src/main/assets/sketches_properties/14.jpg b/app/src/main/assets/sketches_properties/14.jpg new file mode 100644 index 0000000..42e4ab3 Binary files /dev/null and b/app/src/main/assets/sketches_properties/14.jpg differ diff --git a/app/src/main/assets/sketches_properties/15.jpg b/app/src/main/assets/sketches_properties/15.jpg new file mode 100644 index 0000000..b529436 Binary files /dev/null and b/app/src/main/assets/sketches_properties/15.jpg differ diff --git a/app/src/main/assets/sketches_properties/16.jpg b/app/src/main/assets/sketches_properties/16.jpg new file mode 100644 index 0000000..85caef0 Binary files /dev/null and b/app/src/main/assets/sketches_properties/16.jpg differ diff --git a/app/src/main/assets/sketches_properties/17.jpg b/app/src/main/assets/sketches_properties/17.jpg new file mode 100644 index 0000000..6295f58 Binary files /dev/null and b/app/src/main/assets/sketches_properties/17.jpg differ diff --git a/app/src/main/assets/sketches_properties/18.jpg b/app/src/main/assets/sketches_properties/18.jpg new file mode 100644 index 0000000..f8e4e87 Binary files /dev/null and b/app/src/main/assets/sketches_properties/18.jpg differ diff --git a/app/src/main/assets/sketches_properties/19.jpg b/app/src/main/assets/sketches_properties/19.jpg new file mode 100644 index 0000000..c476493 Binary files /dev/null and b/app/src/main/assets/sketches_properties/19.jpg differ diff --git a/app/src/main/assets/sketches_properties/2.jpg b/app/src/main/assets/sketches_properties/2.jpg new file mode 100644 index 0000000..084fa51 Binary files /dev/null and b/app/src/main/assets/sketches_properties/2.jpg differ diff --git a/app/src/main/assets/sketches_properties/3.jpg b/app/src/main/assets/sketches_properties/3.jpg new file mode 100644 index 0000000..4ee71c4 Binary files /dev/null and b/app/src/main/assets/sketches_properties/3.jpg differ diff --git a/app/src/main/assets/sketches_properties/4.jpg b/app/src/main/assets/sketches_properties/4.jpg new file mode 100644 index 0000000..25912f1 Binary files /dev/null and b/app/src/main/assets/sketches_properties/4.jpg differ diff --git a/app/src/main/assets/sketches_properties/5.jpg b/app/src/main/assets/sketches_properties/5.jpg new file mode 100644 index 0000000..77c2aa8 Binary files /dev/null and b/app/src/main/assets/sketches_properties/5.jpg differ diff --git a/app/src/main/assets/sketches_properties/6.jpg b/app/src/main/assets/sketches_properties/6.jpg new file mode 100644 index 0000000..75b1e32 Binary files /dev/null and b/app/src/main/assets/sketches_properties/6.jpg differ diff --git a/app/src/main/assets/sketches_properties/7.jpg b/app/src/main/assets/sketches_properties/7.jpg new file mode 100644 index 0000000..f059989 Binary files /dev/null and b/app/src/main/assets/sketches_properties/7.jpg differ diff --git a/app/src/main/assets/sketches_properties/8.jpg b/app/src/main/assets/sketches_properties/8.jpg new file mode 100644 index 0000000..6be97eb Binary files /dev/null and b/app/src/main/assets/sketches_properties/8.jpg differ diff --git a/app/src/main/assets/sketches_properties/9.jpg b/app/src/main/assets/sketches_properties/9.jpg new file mode 100644 index 0000000..626cab9 Binary files /dev/null and b/app/src/main/assets/sketches_properties/9.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/1.jpg b/app/src/main/assets/sketches_rangoli/1.jpg new file mode 100644 index 0000000..e628714 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/1.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/10.jpg b/app/src/main/assets/sketches_rangoli/10.jpg new file mode 100644 index 0000000..f6e9d09 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/10.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/13.jpg b/app/src/main/assets/sketches_rangoli/13.jpg new file mode 100644 index 0000000..9741d57 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/13.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/14.jpg b/app/src/main/assets/sketches_rangoli/14.jpg new file mode 100644 index 0000000..3ca4970 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/14.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/15.jpg b/app/src/main/assets/sketches_rangoli/15.jpg new file mode 100644 index 0000000..98abac3 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/15.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/16.jpg b/app/src/main/assets/sketches_rangoli/16.jpg new file mode 100644 index 0000000..150dfdc Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/16.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/17.jpg b/app/src/main/assets/sketches_rangoli/17.jpg new file mode 100644 index 0000000..4127115 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/17.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/18.jpg b/app/src/main/assets/sketches_rangoli/18.jpg new file mode 100644 index 0000000..6ae96e9 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/18.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/19.jpg b/app/src/main/assets/sketches_rangoli/19.jpg new file mode 100644 index 0000000..ffcbd6a Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/19.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/2.jpg b/app/src/main/assets/sketches_rangoli/2.jpg new file mode 100644 index 0000000..7329109 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/2.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/20.jpg b/app/src/main/assets/sketches_rangoli/20.jpg new file mode 100644 index 0000000..b7be138 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/20.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/21.jpg b/app/src/main/assets/sketches_rangoli/21.jpg new file mode 100644 index 0000000..eaa5fdf Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/21.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/22.jpg b/app/src/main/assets/sketches_rangoli/22.jpg new file mode 100644 index 0000000..28aca48 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/22.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/23.jpg b/app/src/main/assets/sketches_rangoli/23.jpg new file mode 100644 index 0000000..057d2d4 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/23.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/24.jpg b/app/src/main/assets/sketches_rangoli/24.jpg new file mode 100644 index 0000000..e933061 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/24.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/25.jpg b/app/src/main/assets/sketches_rangoli/25.jpg new file mode 100644 index 0000000..569a74c Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/25.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/3.jpg b/app/src/main/assets/sketches_rangoli/3.jpg new file mode 100644 index 0000000..569342c Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/3.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/4.jpg b/app/src/main/assets/sketches_rangoli/4.jpg new file mode 100644 index 0000000..7c5d0de Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/4.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/5.jpg b/app/src/main/assets/sketches_rangoli/5.jpg new file mode 100644 index 0000000..5a3228f Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/5.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/6.jpg b/app/src/main/assets/sketches_rangoli/6.jpg new file mode 100644 index 0000000..270f078 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/6.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/7.jpg b/app/src/main/assets/sketches_rangoli/7.jpg new file mode 100644 index 0000000..241beac Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/7.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/8.jpg b/app/src/main/assets/sketches_rangoli/8.jpg new file mode 100644 index 0000000..c62e0d7 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/8.jpg differ diff --git a/app/src/main/assets/sketches_rangoli/9.jpg b/app/src/main/assets/sketches_rangoli/9.jpg new file mode 100644 index 0000000..bcd14a7 Binary files /dev/null and b/app/src/main/assets/sketches_rangoli/9.jpg differ diff --git a/app/src/main/assets/sketches_sports/1.jpg b/app/src/main/assets/sketches_sports/1.jpg new file mode 100644 index 0000000..cd1cb09 Binary files /dev/null and b/app/src/main/assets/sketches_sports/1.jpg differ diff --git a/app/src/main/assets/sketches_sports/10.jpg b/app/src/main/assets/sketches_sports/10.jpg new file mode 100644 index 0000000..2ec81a5 Binary files /dev/null and b/app/src/main/assets/sketches_sports/10.jpg differ diff --git a/app/src/main/assets/sketches_sports/11.jpg b/app/src/main/assets/sketches_sports/11.jpg new file mode 100644 index 0000000..f00ecb5 Binary files /dev/null and b/app/src/main/assets/sketches_sports/11.jpg differ diff --git a/app/src/main/assets/sketches_sports/12.jpg b/app/src/main/assets/sketches_sports/12.jpg new file mode 100644 index 0000000..b004929 Binary files /dev/null and b/app/src/main/assets/sketches_sports/12.jpg differ diff --git a/app/src/main/assets/sketches_sports/13.jpg b/app/src/main/assets/sketches_sports/13.jpg new file mode 100644 index 0000000..73fa886 Binary files /dev/null and b/app/src/main/assets/sketches_sports/13.jpg differ diff --git a/app/src/main/assets/sketches_sports/14.jpg b/app/src/main/assets/sketches_sports/14.jpg new file mode 100644 index 0000000..3d9069e Binary files /dev/null and b/app/src/main/assets/sketches_sports/14.jpg differ diff --git a/app/src/main/assets/sketches_sports/15.jpg b/app/src/main/assets/sketches_sports/15.jpg new file mode 100644 index 0000000..a090c83 Binary files /dev/null and b/app/src/main/assets/sketches_sports/15.jpg differ diff --git a/app/src/main/assets/sketches_sports/16.jpg b/app/src/main/assets/sketches_sports/16.jpg new file mode 100644 index 0000000..185d6e3 Binary files /dev/null and b/app/src/main/assets/sketches_sports/16.jpg differ diff --git a/app/src/main/assets/sketches_sports/17.jpg b/app/src/main/assets/sketches_sports/17.jpg new file mode 100644 index 0000000..b8193fa Binary files /dev/null and b/app/src/main/assets/sketches_sports/17.jpg differ diff --git a/app/src/main/assets/sketches_sports/18.jpg b/app/src/main/assets/sketches_sports/18.jpg new file mode 100644 index 0000000..ba4fcea Binary files /dev/null and b/app/src/main/assets/sketches_sports/18.jpg differ diff --git a/app/src/main/assets/sketches_sports/19.jpg b/app/src/main/assets/sketches_sports/19.jpg new file mode 100644 index 0000000..617c2af Binary files /dev/null and b/app/src/main/assets/sketches_sports/19.jpg differ diff --git a/app/src/main/assets/sketches_sports/2.jpg b/app/src/main/assets/sketches_sports/2.jpg new file mode 100644 index 0000000..59890e5 Binary files /dev/null and b/app/src/main/assets/sketches_sports/2.jpg differ diff --git a/app/src/main/assets/sketches_sports/20.jpg b/app/src/main/assets/sketches_sports/20.jpg new file mode 100644 index 0000000..4032ff4 Binary files /dev/null and b/app/src/main/assets/sketches_sports/20.jpg differ diff --git a/app/src/main/assets/sketches_sports/21.jpg b/app/src/main/assets/sketches_sports/21.jpg new file mode 100644 index 0000000..23979ba Binary files /dev/null and b/app/src/main/assets/sketches_sports/21.jpg differ diff --git a/app/src/main/assets/sketches_sports/22.jpg b/app/src/main/assets/sketches_sports/22.jpg new file mode 100644 index 0000000..c61e91e Binary files /dev/null and b/app/src/main/assets/sketches_sports/22.jpg differ diff --git a/app/src/main/assets/sketches_sports/23.jpg b/app/src/main/assets/sketches_sports/23.jpg new file mode 100644 index 0000000..7bf0806 Binary files /dev/null and b/app/src/main/assets/sketches_sports/23.jpg differ diff --git a/app/src/main/assets/sketches_sports/24.jpg b/app/src/main/assets/sketches_sports/24.jpg new file mode 100644 index 0000000..23cbc17 Binary files /dev/null and b/app/src/main/assets/sketches_sports/24.jpg differ diff --git a/app/src/main/assets/sketches_sports/25.jpg b/app/src/main/assets/sketches_sports/25.jpg new file mode 100644 index 0000000..06d992e Binary files /dev/null and b/app/src/main/assets/sketches_sports/25.jpg differ diff --git a/app/src/main/assets/sketches_sports/26.jpg b/app/src/main/assets/sketches_sports/26.jpg new file mode 100644 index 0000000..26af61e Binary files /dev/null and b/app/src/main/assets/sketches_sports/26.jpg differ diff --git a/app/src/main/assets/sketches_sports/27.jpg b/app/src/main/assets/sketches_sports/27.jpg new file mode 100644 index 0000000..91bf104 Binary files /dev/null and b/app/src/main/assets/sketches_sports/27.jpg differ diff --git a/app/src/main/assets/sketches_sports/28.jpg b/app/src/main/assets/sketches_sports/28.jpg new file mode 100644 index 0000000..8c790e7 Binary files /dev/null and b/app/src/main/assets/sketches_sports/28.jpg differ diff --git a/app/src/main/assets/sketches_sports/3.jpg b/app/src/main/assets/sketches_sports/3.jpg new file mode 100644 index 0000000..8315af5 Binary files /dev/null and b/app/src/main/assets/sketches_sports/3.jpg differ diff --git a/app/src/main/assets/sketches_sports/4.jpg b/app/src/main/assets/sketches_sports/4.jpg new file mode 100644 index 0000000..8070e68 Binary files /dev/null and b/app/src/main/assets/sketches_sports/4.jpg differ diff --git a/app/src/main/assets/sketches_sports/5.jpg b/app/src/main/assets/sketches_sports/5.jpg new file mode 100644 index 0000000..5bcb837 Binary files /dev/null and b/app/src/main/assets/sketches_sports/5.jpg differ diff --git a/app/src/main/assets/sketches_sports/6.jpg b/app/src/main/assets/sketches_sports/6.jpg new file mode 100644 index 0000000..038521f Binary files /dev/null and b/app/src/main/assets/sketches_sports/6.jpg differ diff --git a/app/src/main/assets/sketches_sports/7.jpg b/app/src/main/assets/sketches_sports/7.jpg new file mode 100644 index 0000000..73bf0de Binary files /dev/null and b/app/src/main/assets/sketches_sports/7.jpg differ diff --git a/app/src/main/assets/sketches_sports/8.jpg b/app/src/main/assets/sketches_sports/8.jpg new file mode 100644 index 0000000..6c565f8 Binary files /dev/null and b/app/src/main/assets/sketches_sports/8.jpg differ diff --git a/app/src/main/assets/sketches_sports/9.jpg b/app/src/main/assets/sketches_sports/9.jpg new file mode 100644 index 0000000..130cd94 Binary files /dev/null and b/app/src/main/assets/sketches_sports/9.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/1.jpg b/app/src/main/assets/sketches_vehicles/1.jpg new file mode 100644 index 0000000..da449f7 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/1.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/10.jpg b/app/src/main/assets/sketches_vehicles/10.jpg new file mode 100644 index 0000000..0084613 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/10.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/11.jpg b/app/src/main/assets/sketches_vehicles/11.jpg new file mode 100644 index 0000000..ba5f4d4 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/11.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/12.jpg b/app/src/main/assets/sketches_vehicles/12.jpg new file mode 100644 index 0000000..32c7908 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/12.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/13.jpg b/app/src/main/assets/sketches_vehicles/13.jpg new file mode 100644 index 0000000..dd47e76 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/13.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/14.jpg b/app/src/main/assets/sketches_vehicles/14.jpg new file mode 100644 index 0000000..8b886e6 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/14.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/15.jpg b/app/src/main/assets/sketches_vehicles/15.jpg new file mode 100644 index 0000000..cf78752 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/15.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/16.jpg b/app/src/main/assets/sketches_vehicles/16.jpg new file mode 100644 index 0000000..87f8a19 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/16.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/17.jpg b/app/src/main/assets/sketches_vehicles/17.jpg new file mode 100644 index 0000000..011b53b Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/17.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/18.jpg b/app/src/main/assets/sketches_vehicles/18.jpg new file mode 100644 index 0000000..c4433c8 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/18.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/19.jpg b/app/src/main/assets/sketches_vehicles/19.jpg new file mode 100644 index 0000000..b9361f1 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/19.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/2.jpg b/app/src/main/assets/sketches_vehicles/2.jpg new file mode 100644 index 0000000..ff06675 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/2.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/20.jpg b/app/src/main/assets/sketches_vehicles/20.jpg new file mode 100644 index 0000000..3e22c5c Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/20.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/21.jpg b/app/src/main/assets/sketches_vehicles/21.jpg new file mode 100644 index 0000000..f93b99a Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/21.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/22.jpg b/app/src/main/assets/sketches_vehicles/22.jpg new file mode 100644 index 0000000..952afa9 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/22.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/23.jpg b/app/src/main/assets/sketches_vehicles/23.jpg new file mode 100644 index 0000000..a6e1c25 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/23.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/24.jpg b/app/src/main/assets/sketches_vehicles/24.jpg new file mode 100644 index 0000000..83c706a Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/24.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/25.jpg b/app/src/main/assets/sketches_vehicles/25.jpg new file mode 100644 index 0000000..6ebdbf7 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/25.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/26.jpg b/app/src/main/assets/sketches_vehicles/26.jpg new file mode 100644 index 0000000..3805357 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/26.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/27.jpg b/app/src/main/assets/sketches_vehicles/27.jpg new file mode 100644 index 0000000..0849027 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/27.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/28.jpg b/app/src/main/assets/sketches_vehicles/28.jpg new file mode 100644 index 0000000..019baa9 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/28.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/29.jpg b/app/src/main/assets/sketches_vehicles/29.jpg new file mode 100644 index 0000000..c7e0d3a Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/29.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/3.jpg b/app/src/main/assets/sketches_vehicles/3.jpg new file mode 100644 index 0000000..eb33365 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/3.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/30.jpg b/app/src/main/assets/sketches_vehicles/30.jpg new file mode 100644 index 0000000..3820102 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/30.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/31.jpg b/app/src/main/assets/sketches_vehicles/31.jpg new file mode 100644 index 0000000..bba9999 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/31.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/32.jpg b/app/src/main/assets/sketches_vehicles/32.jpg new file mode 100644 index 0000000..6d64a3f Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/32.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/4.jpg b/app/src/main/assets/sketches_vehicles/4.jpg new file mode 100644 index 0000000..968f0ad Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/4.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/5.jpg b/app/src/main/assets/sketches_vehicles/5.jpg new file mode 100644 index 0000000..abdd96c Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/5.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/6.jpg b/app/src/main/assets/sketches_vehicles/6.jpg new file mode 100644 index 0000000..7eeb870 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/6.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/7.jpg b/app/src/main/assets/sketches_vehicles/7.jpg new file mode 100644 index 0000000..c5e6294 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/7.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/8.jpg b/app/src/main/assets/sketches_vehicles/8.jpg new file mode 100644 index 0000000..6628782 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/8.jpg differ diff --git a/app/src/main/assets/sketches_vehicles/9.jpg b/app/src/main/assets/sketches_vehicles/9.jpg new file mode 100644 index 0000000..367b772 Binary files /dev/null and b/app/src/main/assets/sketches_vehicles/9.jpg differ diff --git a/app/src/main/java/com/draw/painting/canvas/CanvasApp.java b/app/src/main/java/com/draw/painting/canvas/CanvasApp.java new file mode 100644 index 0000000..e1e2b96 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/CanvasApp.java @@ -0,0 +1,29 @@ +package com.draw.painting.canvas; + +import android.app.Application; + +import com.tradplus.ads.open.TradPlusSdk; +import com.up.uploadlibrary.UpLoadManager; + +public class CanvasApp extends Application { + + public static String Key_ViewDir = "pre_dir"; + + public static String Key_Camera = "camera_data"; + + + + + + @Override + public void onCreate() { + super.onCreate(); + + UpLoadManager.INSTANCE.init(this, "ocean", (s, s2) -> null); + TradPlusSdk.initSdk(this, "8BA3F51C9EE695E577BB7EF666407211"); + } + + + + +} diff --git a/app/src/main/java/com/draw/painting/canvas/ad/AdInstLoad.kt b/app/src/main/java/com/draw/painting/canvas/ad/AdInstLoad.kt new file mode 100644 index 0000000..bec1508 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/AdInstLoad.kt @@ -0,0 +1,95 @@ +package com.draw.painting.canvas.ad + +import android.app.Activity +import android.util.Log +import com.mbridge.msdk.interstitial.signalcommon.interstitial +import com.tradplus.ads.base.bean.TPAdError +import com.tradplus.ads.base.bean.TPAdInfo +import com.tradplus.ads.open.interstitial.InterstitialAdListener +import com.tradplus.ads.open.interstitial.TPInterstitial + +class AdInstLoad { + private var mPlace: String + private var adLoadListener: LoadListener? = null + private var activity: Activity? = null + + constructor(activity: Activity, place: String, listener: LoadListener?) { + this.mPlace = place + this.adLoadListener = listener + this.activity = activity + init() + } + + constructor(place: String, listener: LoadListener?) { + this.mPlace = place + this.adLoadListener = listener + init() + } + + private fun init() { + val interstitialAd = InstAdCacheManager.instance.getAdCache(mPlace) + if (interstitialAd != null && interstitialAd.isReady) { + Log.d("ocean", "$mPlace 有缓存不进行load") + adLoadListener?.loadFailed("有缓存不进行load") + return + } + + val tpInterstitial = TPInterstitial(activity, mPlace) + tpInterstitial.setAdListener(object : InterstitialAdListener { + //广告加载完成 首个广告源加载成功时回调 一次加载流程只会回调一次 + override fun onAdLoaded(tpAdInfo: TPAdInfo?) { + if (tpAdInfo != null) { + Log.d("ocean", "$mPlace 广告load成功,tpAdInfo有值") + InstAdCacheManager.Companion.instance.setAdCache(mPlace, tpInterstitial) + adLoadListener?.loaded(tpAdInfo) + } else { + adLoadListener?.loadFailed("tpAdInfo没有值") + Log.d("ocean", "$mPlace tpAdInfo没有值") + } + } + + // 广告被点击 + override fun onAdClicked(tpAdInfo: TPAdInfo?) { + Log.d("ocean", "$mPlace tradplus onAdClicked") + } + + // 广告成功展示在页面上 + override fun onAdImpression(tpAdInfo: TPAdInfo?) { + Log.d("ocean", "$mPlace tradplus onAdImpression") + } + + // 广告加载失败 + override fun onAdFailed(error: TPAdError?) { + adLoadListener?.loadFailed("code->${error?.errorCode}message->${error?.errorMsg}") + Log.d( + "ocean", + "$mPlace load ad onError->code->${error?.errorCode}message->${error?.errorMsg}" + ) + } + + // 广告被关闭 + override fun onAdClosed(tpAdInfo: TPAdInfo?) { + Log.d("ocean", "$mPlace tradplus onAdClosed") + } + + // 视频播放开始(部分广告源支持) + override fun onAdVideoStart(tpAdInfo: TPAdInfo?) { + Log.d("ocean", "$mPlace tradplus onAdVideoStart") + } + + //视频播放结束(部分广告源支持) + override fun onAdVideoEnd(tpAdInfo: TPAdInfo?) { + Log.d("ocean", "$mPlace tradplus onAdVideoEnd") + } + + //视频播放失败(部分广告源支持) + override fun onAdVideoError(tpAdInfo: TPAdInfo?, error: TPAdError?) { + Log.d( + "ocean", + "$mPlace onAdVideoError code->${error?.errorCode}message->${error?.errorMsg}" + ) + } + }) + tpInterstitial.loadAd() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/AdInstShower.kt b/app/src/main/java/com/draw/painting/canvas/ad/AdInstShower.kt new file mode 100644 index 0000000..f7d1972 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/AdInstShower.kt @@ -0,0 +1,69 @@ +package com.draw.painting.canvas.ad + +import android.app.Activity +import android.util.Log +import com.tradplus.ads.base.bean.TPAdError +import com.tradplus.ads.base.bean.TPAdInfo +import com.tradplus.ads.open.interstitial.InterstitialAdListener + +class AdInstShower { + private var mPlace: String + private var showListener: ShowListener? = null + private var activity: Activity? = null + + constructor(activity: Activity, place: String, showListener: ShowListener?) { + this.mPlace = place + this.showListener = showListener + this.activity = activity + init() + } + + constructor(place: String, showListener: ShowListener?) { + this.mPlace = place + this.showListener = showListener + init() + } + + private fun init() { + val interstitialAd = InstAdCacheManager.Companion.instance.getAdCache(mPlace) + interstitialAd?.setAdListener(object : InterstitialAdListener { + //广告加载完成 首个广告源加载成功时回调 一次加载流程只会回调一次 + override fun onAdLoaded(tpAdInfo: TPAdInfo?) {} + + // 广告被点击 + override fun onAdClicked(tpAdInfo: TPAdInfo?) { + showListener?.onAdClicked() + Log.d("ocean", "AdInstShower 广告点击回调") + } + + // 广告成功展示在页面上 + override fun onAdImpression(tpAdInfo: TPAdInfo?) { + showListener?.onAdShown(tpAdInfo) + Log.d("ocean", "AdInstShower 广告展示回调") + } + + // 广告加载失败 + override fun onAdFailed(error: TPAdError?) {} + + // 广告被关闭 + override fun onAdClosed(tpAdInfo: TPAdInfo?) { + showListener?.onAdClosed() + Log.d("ocean", "AdInstShower 广告关闭回调") + } + + // 视频播放开始(部分广告源支持) + override fun onAdVideoStart(tpAdInfo: TPAdInfo?) {} + + //视频播放结束(部分广告源支持) + override fun onAdVideoEnd(tpAdInfo: TPAdInfo?) {} + + //视频播放失败(部分广告源支持) + override fun onAdVideoError(tpAdInfo: TPAdInfo?, error: TPAdError?) { + Log.d("ocean", "AdInstShower 视频广告播放失败回调->${error}") + showListener?.onAdShowFailed(AdShowFailed(error?.errorMsg.toString())) + } + }) + interstitialAd?.showAd(activity!!, mPlace) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/AdShowFailed.kt b/app/src/main/java/com/draw/painting/canvas/ad/AdShowFailed.kt new file mode 100644 index 0000000..d79ba29 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/AdShowFailed.kt @@ -0,0 +1,5 @@ +package com.draw.painting.canvas.ad + +data class AdShowFailed( + val msg: String = "", +) \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/AdsInsUtil.kt b/app/src/main/java/com/draw/painting/canvas/ad/AdsInsUtil.kt new file mode 100644 index 0000000..5addeb3 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/AdsInsUtil.kt @@ -0,0 +1,28 @@ +package com.draw.painting.canvas.ad + +import android.app.Activity + +object AdsInsUtil { + + object Placement { + const val TOP_ON_AD_ONE = "862C9D825012E57C75E7545525E19712" + const val TOP_ON_AD_TOW = "B091136BD3D9BF7375DAF416288EB012" + const val TOP_ON_AD_THREE = "C3BDB36A12B4A21C6C5D05DACF823712" + } + + fun loadAd( + act: Activity, + adID: String, + loadListener: LoadListener? + ): AdInstLoad { + return AdInstLoad(act, adID, loadListener) + } + + fun showAd( + act: Activity, + adID: String, + listener: ShowListener + ): AdInstShower { + return AdInstShower(act, adID, listener) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/InstAdCacheManager.kt b/app/src/main/java/com/draw/painting/canvas/ad/InstAdCacheManager.kt new file mode 100644 index 0000000..4bf7cd9 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/InstAdCacheManager.kt @@ -0,0 +1,35 @@ +package com.draw.painting.canvas.ad + +import com.tradplus.ads.open.interstitial.TPInterstitial + +class InstAdCacheManager { + private val mAdCacheDict: MutableMap = mutableMapOf() + + companion object { + val instance: InstAdCacheManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + InstAdCacheManager() + } + } + + fun setAdCache(place: String, adCache: TPInterstitial) { + mAdCacheDict[place] = adCache + } + + fun getAdCache(place: String): TPInterstitial? { + return mAdCacheDict[place] + } + + fun getLoadedInstCount(): Int { + var count = 0 + try { + mAdCacheDict.forEach { (key, value) -> + if (value.isReady) { + count += 1 + } + } + } catch (_: Exception) { + + } + return count + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/LoadListener.kt b/app/src/main/java/com/draw/painting/canvas/ad/LoadListener.kt new file mode 100644 index 0000000..059bf96 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/LoadListener.kt @@ -0,0 +1,8 @@ +package com.draw.painting.canvas.ad + +import com.tradplus.ads.base.bean.TPAdInfo + +interface LoadListener { + fun loadFailed(error: String) {} + fun loaded(ad: TPAdInfo) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/ad/ShowListener.kt b/app/src/main/java/com/draw/painting/canvas/ad/ShowListener.kt new file mode 100644 index 0000000..8bd2efa --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/ad/ShowListener.kt @@ -0,0 +1,10 @@ +package com.draw.painting.canvas.ad + +import com.tradplus.ads.base.bean.TPAdInfo + +interface ShowListener { + fun onAdShown(ad: TPAdInfo?) {} + fun onAdShowFailed(error: AdShowFailed?) {} + fun onAdClosed() {} + fun onAdClicked() {} +} diff --git a/app/src/main/java/com/draw/painting/canvas/adapters/FeaturedSketchAdapter.java b/app/src/main/java/com/draw/painting/canvas/adapters/FeaturedSketchAdapter.java new file mode 100644 index 0000000..8e83401 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/adapters/FeaturedSketchAdapter.java @@ -0,0 +1,84 @@ +package com.draw.painting.canvas.adapters; + +import android.content.Context; +import android.graphics.Bitmap; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SystemHelper; +import com.draw.painting.canvas.onClickListener; + +import java.util.List; + +public class FeaturedSketchAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List featuredList; + private onClickListener listener; + + public FeaturedSketchAdapter(Context context, List featuredList) { + this.mContext = context; + this.featuredList = featuredList; + } + + public void setListener(onClickListener listener) { + this.listener = listener; + } + + @NonNull + @Override + public FeaturedVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_featured, parent, false); + + // 动态设置卡片宽度为屏幕宽度的 85% + int screenWidth = SystemHelper.getScreen(mContext).x; + int cardWidth = (int) (screenWidth * 0.85); + + CardView cardView = view.findViewById(R.id.card_featured); + ViewGroup.LayoutParams params = cardView.getLayoutParams(); + params.width = cardWidth; + cardView.setLayoutParams(params); + + return new FeaturedVH(view); + } + + @Override + public void onBindViewHolder(@NonNull FeaturedVH holder, int position) { + String filePath = featuredList.get(position); + Bitmap bitmap = SystemHelper.loadImageFromAssets(mContext, filePath); + holder.imFeatured.setImageBitmap(bitmap); + + holder.cardFeatured.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.onClickItem(false, filePath); + } + } + }); + } + + @Override + public int getItemCount() { + return featuredList.size(); + } + + public static class FeaturedVH extends RecyclerView.ViewHolder { + private ImageView imFeatured; + private CardView cardFeatured; + + public FeaturedVH(@NonNull View itemView) { + super(itemView); + imFeatured = itemView.findViewById(R.id.im_featured); + cardFeatured = itemView.findViewById(R.id.card_featured); + } + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/adapters/SketchCategoryAdapter.java b/app/src/main/java/com/draw/painting/canvas/adapters/SketchCategoryAdapter.java new file mode 100644 index 0000000..4c9a0bc --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/adapters/SketchCategoryAdapter.java @@ -0,0 +1,146 @@ +package com.draw.painting.canvas.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SystemHelper; +import com.draw.painting.canvas.onClickListener; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SketchCategoryAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List categoryList; + private onClickListener listener; + private Map iconMap; + private Map colorMap; + + public SketchCategoryAdapter(Context context, List categoryList) { + this.mContext = context; + this.categoryList = categoryList; + initIconMap(); + initColorMap(); + } + + public void setListener(onClickListener listener) { + this.listener = listener; + } + + private void initIconMap() { + iconMap = new HashMap<>(); + // 为各分类设置简洁线条图标 + iconMap.put("Animals", R.drawable.ic_category_animals); + iconMap.put("Birds", R.drawable.ic_category_birds); + iconMap.put("Butterfly", R.drawable.ic_category_butterfly); + iconMap.put("Cafe", R.drawable.ic_category_cafe); + iconMap.put("Cartoons", R.drawable.ic_category_cartoons); + iconMap.put("Christmas", R.drawable.ic_category_christmas); + iconMap.put("Festivals", R.drawable.ic_category_festivals); + iconMap.put("Flowers", R.drawable.ic_category_flowers); + iconMap.put("Fruits", R.drawable.ic_category_fruits); + iconMap.put("General", R.drawable.ic_category_general); + iconMap.put("Mehndi", R.drawable.ic_category_mehndi); + iconMap.put("Nature", R.drawable.ic_category_nature); + iconMap.put("Properties", R.drawable.ic_category_properties); + iconMap.put("Rangoli", R.drawable.ic_category_rangoli); + iconMap.put("Sports", R.drawable.ic_category_sports); + iconMap.put("Vehicles", R.drawable.ic_category_vehicles); + } + + private void initColorMap() { + colorMap = new HashMap<>(); + // 🎨 为不同分类设置差异性更强的颜色(增强识别度) + colorMap.put("Animals", R.color.accent_deep_blue); // 深蓝 - 动物(更具差异性) + colorMap.put("Birds", R.color.accent_green); // 绿色 - 鸟类 + colorMap.put("Butterfly", R.color.accent_purple); // 紫色 - 蝴蝶(更具差异性) + colorMap.put("Flowers", R.color.accent_coral); // 珊瑚粉 - 花卉 + colorMap.put("Fruits", R.color.primary_warm_yellow); // 温暖黄 - 水果 + colorMap.put("Nature", R.color.accent_green); // 绿色 - 自然 + colorMap.put("Cartoons", R.color.accent_yellow); // 黄色 - 卡通 + colorMap.put("Christmas", R.color.accent_coral); // 珊瑚粉 - 圣诞 + colorMap.put("Festivals", R.color.accent_purple); // 紫色 - 节日 + colorMap.put("Cafe", R.color.accent_dark); // 深蓝 - 咖啡厅 + colorMap.put("Sports", R.color.accent_deep_blue); // 深蓝 - 运动 + colorMap.put("Vehicles", R.color.accent_dark); // 深蓝 - 车辆 + colorMap.put("Mehndi", R.color.accent_coral); // 珊瑚粉 - 曼海蒂 + colorMap.put("Rangoli", R.color.primary_warm_yellow); // 黄色 - 彩绘 + colorMap.put("Properties", R.color.accent_dark); // 深蓝 - 属性 + colorMap.put("General", R.color.accent_deep_blue); // 深蓝 - 通用 + } + + @NonNull + @Override + public CategoryVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sketch_category, parent, false); + return new CategoryVH(view); + } + + @Override + public void onBindViewHolder(@NonNull CategoryVH holder, int position) { + String dir = categoryList.get(position); + String categoryName = dir.substring(dir.lastIndexOf("_") + 1); + holder.tvCategoryName.setText(categoryName); + + // 设置线条图标 + Integer iconRes = iconMap.get(categoryName); + if (iconRes != null) { + holder.ivCategoryIcon.setImageResource(iconRes); + } else { + holder.ivCategoryIcon.setImageResource(R.drawable.ic_category_general); + } + + // 🎨 设置图标颜色(Logo风格多彩配色) + Integer colorRes = colorMap.get(categoryName); + if (colorRes != null) { + holder.ivCategoryIcon.setColorFilter(ContextCompat.getColor(mContext, colorRes)); + } else { + holder.ivCategoryIcon.setColorFilter(ContextCompat.getColor(mContext, R.color.primary_soft_blue)); + } + + // 显示 sketch 数量 + List files = SystemHelper.fileExistsInAssets(mContext, dir); + int count = files.size(); + String countText = count + (count == 1 ? " sketch" : " sketches"); + holder.tvSketchCount.setText(countText); + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.onClickItem(true, dir); + } + } + }); + } + + @Override + public int getItemCount() { + return categoryList.size(); + } + + public static class CategoryVH extends RecyclerView.ViewHolder { + private TextView tvCategoryName; + private TextView tvSketchCount; + private ImageView ivCategoryIcon; + + public CategoryVH(@NonNull View itemView) { + super(itemView); + tvCategoryName = itemView.findViewById(R.id.tv_category_name); + tvSketchCount = itemView.findViewById(R.id.tv_sketch_count); + ivCategoryIcon = itemView.findViewById(R.id.iv_category_icon); + } + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/adapters/SketchGalleryAdapter.java b/app/src/main/java/com/draw/painting/canvas/adapters/SketchGalleryAdapter.java new file mode 100644 index 0000000..5c94b8a --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/adapters/SketchGalleryAdapter.java @@ -0,0 +1,91 @@ +package com.draw.painting.canvas.adapters; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SketchRepository; +import com.draw.painting.canvas.onClickListener; + +import java.util.List; + +public class SketchGalleryAdapter extends RecyclerView.Adapter { + + private List nameList = SketchRepository.getAllDir(); + private onClickListener listener; + + private Context mCon; + + + public void setListener(onClickListener listener) { + this.listener = listener; + } + + public SketchGalleryAdapter(Context mCon) { + this.mCon = mCon; + } + + @NonNull + @Override + public HomeVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sketch_gallery, parent, false); + return new HomeVH(view); + } + + @Override + public void onBindViewHolder(@NonNull HomeVH holder, int position) { + String dir = nameList.get(position); + Log.d("-------------tt", "------------dir=" + dir); + holder.tvName.setText(dir.substring(dir.lastIndexOf("_") + 1)); + + + LinearLayoutManager linearLayoutcore = new LinearLayoutManager(mCon); + linearLayoutcore.setOrientation(RecyclerView.HORIZONTAL); + holder.preRecycler.setLayoutManager(linearLayoutcore); + SketchItemAdapter sketchItemAdapter = new SketchItemAdapter(mCon, dir); + sketchItemAdapter.setListener(listener); + holder.preRecycler.setAdapter(sketchItemAdapter); + + + holder.seeAll.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.onClickItem(true,dir); + } + + + } + }); + } + + @Override + public int getItemCount() { + return nameList.size(); + } + + public static class HomeVH extends RecyclerView.ViewHolder { + private TextView tvName; + + private RecyclerView preRecycler; + private TextView seeAll; + + public HomeVH(@NonNull View itemView) { + super(itemView); + tvName = itemView.findViewById(R.id.tv_name); + preRecycler = itemView.findViewById(R.id.pre_recycler); + seeAll = itemView.findViewById(R.id.tv_seeAll); + } + + + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/adapters/SketchItemAdapter.java b/app/src/main/java/com/draw/painting/canvas/adapters/SketchItemAdapter.java new file mode 100644 index 0000000..b5daea8 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/adapters/SketchItemAdapter.java @@ -0,0 +1,81 @@ +package com.draw.painting.canvas.adapters; + +import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SystemHelper; +import com.draw.painting.canvas.onClickListener; + +public class SketchItemAdapter extends RecyclerView.Adapter { + + + private Context mCon; + private String dir; + + private int count = 4; + private onClickListener listener; + public SketchItemAdapter(Context mCon, String dirStr) { + this.mCon = mCon; + dir = dirStr; + } + + public void setListener(onClickListener listener) { + this.listener = listener; + } + + @NonNull + @Override + public HomeVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sketch, parent, false); + return new HomeVH(view); + } + + @Override + public void onBindViewHolder(@NonNull HomeVH holder, int position) { + String filePath = dir + "/" + (position+1) + ".jpg"; + + Log.d("---------tt","---------filePath="+filePath); + Bitmap bitmap = SystemHelper.loadImageFromAssets(mCon, filePath); + holder.previewIm.setImageBitmap(bitmap); + holder.cardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(listener!= null){ + listener.onClickItem(false,filePath); + } + + } + }); + + + } + + @Override + public int getItemCount() { + return count; + } + + public static class HomeVH extends RecyclerView.ViewHolder { + private ImageView previewIm; + private CardView cardView; + + public HomeVH(@NonNull View itemView) { + super(itemView); + previewIm = itemView.findViewById(R.id.imPreview); + cardView = itemView.findViewById(R.id.card); + } + + + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/adapters/SketchPreviewAdapter.java b/app/src/main/java/com/draw/painting/canvas/adapters/SketchPreviewAdapter.java new file mode 100644 index 0000000..cce9051 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/adapters/SketchPreviewAdapter.java @@ -0,0 +1,76 @@ +package com.draw.painting.canvas.adapters; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.draw.painting.canvas.CanvasApp; +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SystemHelper; +import com.draw.painting.canvas.presentation.ARCameraActivity; + +import java.util.List; + +public class SketchPreviewAdapter extends RecyclerView.Adapter { + + private Context mCon; + private List data; + + public SketchPreviewAdapter(Context mCon, List bitmapList) { + this.mCon = mCon; + data = bitmapList; + } + + @NonNull + @Override + public HomeVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sketch_preview, parent, false); + return new HomeVH(view); + } + + @Override + public void onBindViewHolder(@NonNull HomeVH holder, int position) { + String name = data.get(position); + Log.d("---------tt", "---------name=" + name); + + // 加载图片 + Bitmap bitmap = SystemHelper.loadImageFromAssets(mCon, name); + holder.previewIm.setImageBitmap(bitmap); + + // 点击事件 - 直接进入AR + holder.cardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mCon, ARCameraActivity.class); + intent.putExtra(CanvasApp.Key_Camera, name); + mCon.startActivity(intent); + } + }); + } + + @Override + public int getItemCount() { + return data.size(); + } + + public static class HomeVH extends RecyclerView.ViewHolder { + private ImageView previewIm; + private CardView cardView; + + public HomeVH(@NonNull View itemView) { + super(itemView); + previewIm = itemView.findViewById(R.id.imPreview); + cardView = itemView.findViewById(R.id.card_view); + } + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/core/ImageGestureController.java b/app/src/main/java/com/draw/painting/canvas/core/ImageGestureController.java new file mode 100644 index 0000000..3d68f69 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/core/ImageGestureController.java @@ -0,0 +1,79 @@ +package com.draw.painting.canvas.core; + +import android.graphics.Matrix; +import android.graphics.PointF; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; + +/* loaded from: classes.dex */ +public class ImageGestureController implements View.OnTouchListener { + private static final int DRAG = 1; + private static final int NONE = 0; + private static final int ZOOM = 2; + private float k; + ImageView view; + float[] lastEvent = null; + float d = 1.0f; + float newRot = 0.0f; + private Matrix matrix = new Matrix(); + private Matrix savedMatrix = new Matrix(); + private PointF start = new PointF(); + private PointF mid = new PointF(); + float oldDist = 1.0f; + private int mode = 0; + + public ImageGestureController(ImageView imageview, float ScaleW, float ScaleH, float x, float y) { + this.view = imageview; + Log.e("Pos..........", String.valueOf(x) + "..............." + String.valueOf(y)); + this.matrix.postScale(ScaleW, ScaleH, this.mid.x, this.mid.y); + this.matrix.postTranslate(x, y); + this.view.setImageMatrix(this.matrix); + } + + private float a(MotionEvent paramMotionEvent) { + float x = paramMotionEvent.getX(0) - paramMotionEvent.getX(1); + float y = paramMotionEvent.getY(0) - paramMotionEvent.getY(1); + return (float) Math.sqrt((x * x) + (y * y)); + } + + private void a(PointF paramPointF, MotionEvent paramMotionEvent) { + paramPointF.set((paramMotionEvent.getX(0) + paramMotionEvent.getX(1)) / 2.0f, (paramMotionEvent.getY(0) + paramMotionEvent.getY(1)) / 2.0f); + } + + private float b(MotionEvent paramMotionEvent) { + return (float) Math.toDegrees(Math.atan2(paramMotionEvent.getY(0) - paramMotionEvent.getY(1), paramMotionEvent.getX(0) - paramMotionEvent.getX(1))); + } + + /* JADX WARN: Code restructure failed: missing block: B:11:0x0016, code lost: + if (r7 != 6) goto L11; + */ + @Override // android.view.View.OnTouchListener + /* + Code decompiled incorrectly, please refer to instructions dump. + To view partially-correct code enable 'Show inconsistent code' option in preferences + */ + public boolean onTouch(View r7, MotionEvent r8) { + /* + Method dump skipped, instructions count: 240 + To view this dump change 'Code comments level' option to 'DEBUG' + */ + throw new UnsupportedOperationException("Method not decompiled: com.draw.painting.canvas.core.ImageGestureController.onTouch(android.view.View, android.view.MotionEvent):boolean"); + } + + private float rotation(MotionEvent event) { + return (float) Math.toDegrees(Math.atan2(event.getY(0) - event.getY(1), event.getX(0) - event.getX(1))); + } + + private float spacing(MotionEvent event) { + float x = event.getX(0) - event.getX(1); + float y = event.getY(0) - event.getY(1); + return (float) Math.sqrt((x * x) + (y * y)); + } + + private void midPoint(PointF point, MotionEvent event) { + point.set((event.getX(0) + event.getX(1)) / 2.0f, (event.getY(0) + event.getY(1)) / 2.0f); + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/core/SketchRepository.java b/app/src/main/java/com/draw/painting/canvas/core/SketchRepository.java new file mode 100644 index 0000000..1bf3fea --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/core/SketchRepository.java @@ -0,0 +1,108 @@ +package com.draw.painting.canvas.core; + +import java.util.ArrayList; +import java.util.List; + +public class SketchRepository { + + public static String Class_Animals = "sketches_animals"; + public static String Class_birds = "sketches_birds"; + public static String Class_butterfly = "sketches_butterfly"; + public static String Class_cafe = "sketches_cafe"; + public static String Class_cartoons = "sketches_cartoons"; + public static String Class_christmas = "sketches_christmas"; + public static String Class_festivals = "sketches_festivals"; + public static String Class_flowers = "sketches_flowers"; + public static String Class_fruits = "sketches_fruits"; + public static String Class_general = "sketches_general"; + + public static String Class_mehndi = "sketches_mehndi"; + public static String Class_nature = "sketches_nature"; + public static String Class_properties = "sketches_properties"; + public static String Class_rangoli = "sketches_rangoli"; + public static String Class_sports = "sketches_sports"; + public static String Class_vehicles = "sketches_vehicles"; + + public static List getAllDir() { + ArrayList list = new ArrayList<>(); + list.add(Class_Animals); + list.add(Class_birds); + list.add(Class_butterfly); + list.add(Class_cafe); + list.add(Class_cartoons); + list.add(Class_christmas); + list.add(Class_festivals); + list.add(Class_flowers); + list.add(Class_fruits); + list.add(Class_general); + list.add(Class_mehndi); + list.add(Class_nature); + list.add(Class_properties); + list.add(Class_rangoli); + list.add(Class_sports); + list.add(Class_vehicles); + return list; + } + + /** + * 获取推荐图片列表(精选) + * 从各个分类中精选出最受欢迎的图片 + */ + public static List getFeaturedSketches() { + ArrayList list = new ArrayList<>(); + // 从不同分类中选择精选图片 + list.add(Class_Animals + "/1.jpg"); + list.add(Class_birds + "/1.jpg"); + list.add(Class_butterfly + "/1.jpg"); + list.add(Class_flowers + "/1.jpg"); + list.add(Class_cartoons + "/1.jpg"); + list.add(Class_fruits + "/1.jpg"); + list.add(Class_nature + "/1.jpg"); + list.add(Class_vehicles + "/1.jpg"); + return list; + } + + /** + * 获取分类说明文案 + */ + public static String getCategoryDescription(String categoryDir) { + String categoryName = categoryDir.substring(categoryDir.lastIndexOf("_") + 1); + switch (categoryName) { + case "animals": + return "Simple animal outlines. Good for beginners."; + case "birds": + return "Beautiful bird sketches. Perfect for nature lovers."; + case "butterfly": + return "Delicate butterfly patterns. Great for detailed work."; + case "cafe": + return "Coffee and cafe-themed designs. Cozy and warm."; + case "cartoons": + return "Fun cartoon characters. Kids will love these."; + case "christmas": + return "Festive holiday designs. Celebrate the season."; + case "festivals": + return "Festival celebration patterns. Joyful and colorful."; + case "flowers": + return "Elegant floral designs. Classic and beautiful."; + case "fruits": + return "Fresh fruit illustrations. Bright and cheerful."; + case "general": + return "Various everyday objects. Something for everyone."; + case "mehndi": + return "Traditional mehndi patterns. Intricate and artistic."; + case "nature": + return "Natural landscapes and scenery. Peaceful and serene."; + case "properties": + return "Buildings and structures. Architectural beauty."; + case "rangoli": + return "Traditional rangoli designs. Vibrant and symbolic."; + case "sports": + return "Sports and activities. Active and dynamic."; + case "vehicles": + return "Cars, bikes, and more. Perfect for vehicle enthusiasts."; + default: + return "Explore and trace beautiful sketches."; + } + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/core/SystemHelper.java b/app/src/main/java/com/draw/painting/canvas/core/SystemHelper.java new file mode 100644 index 0000000..53e3d68 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/core/SystemHelper.java @@ -0,0 +1,456 @@ +package com.draw.painting.canvas.core; + +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Point; +import android.graphics.drawable.ColorDrawable; +import android.util.DisplayMetrics; +import android.util.Range; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.activity.ComponentActivity; +import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; +import androidx.camera.core.Camera; +import androidx.core.app.ActivityCompat; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class SystemHelper { + + public static int getRange(Camera camera) { + Range exposureCompensationRange = camera.getCameraInfo().getExposureState().getExposureCompensationRange(); + Integer upper = exposureCompensationRange.getUpper(); + Integer lower = exposureCompensationRange.getLower(); + return upper; + } + + /** + * 设置状态栏和导航栏的图标颜色 + * @param activity Activity实例 + * @param lightStatusBar 状态栏是否使用深色图标(浅色背景) + * @param lightNavigationBar 导航栏是否使用深色图标(浅色背景) + */ + public static void setSystemBarsLight(Activity activity, boolean lightStatusBar, boolean lightNavigationBar) { + View decor = activity.getWindow().getDecorView(); + + // 获取当前的 flags + int flags = decor.getSystemUiVisibility(); + + // 设置状态栏图标颜色 + if (lightStatusBar) { + flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + + // 设置导航栏图标颜色(API 26+) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + if (lightNavigationBar) { + flags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + } else { + flags &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + } + } + + decor.setSystemUiVisibility(flags); + } + + /** + * 旧方法,保持向后兼容 + */ + public static void setStatusBarTextColor(Activity activity, boolean dark) { + setSystemBarsLight(activity, dark, false); + } + + /** + * 设置系统导航栏颜色 + * @param activity Activity实例 + * @param color 导航栏背景色 + */ + public static void setNavigationBarColor(Activity activity, int color) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setNavigationBarColor(color); + } + } + + /** + * 强制设置白色导航栏 + 深色图标(用于故障排查) + */ + public static void forceWhiteNavigationBar(Activity activity) { + // 设置白色背景 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setNavigationBarColor(0xFFFFFFFF); + } + + // 强制设置深色图标 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + View decor = activity.getWindow().getDecorView(); + int visibility = decor.getSystemUiVisibility(); + visibility |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + decor.setSystemUiVisibility(visibility); + + // 再次确认(强制刷新) + decor.post(() -> { + int vis = decor.getSystemUiVisibility(); + vis |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + decor.setSystemUiVisibility(vis); + }); + } + } + + /** + * 启用边缘到边缘显示(EdgeToEdge) + * @param activity ComponentActivity + */ + public static void enableEdgeToEdge(ComponentActivity activity) { + EdgeToEdge.enable(activity); + Window window = activity.getWindow(); + // 状态栏透明 + window.setStatusBarColor(Color.TRANSPARENT); + // 导航栏不透明,使用白色背景 + window.setNavigationBarColor(Color.WHITE); + } + + /** + * 为根视图设置 WindowInsets 监听器,自动处理系统栏间距(只处理顶部和左右) + * @param rootView 根视图 + */ + public static void setupWindowInsetsListener(View rootView) { + ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, 0); + return insets; + } + }); + } + + /** + * 为底部导航栏设置 WindowInsets 监听器,处理底部系统栏间距 + * @param bottomNav 底部导航栏视图 + */ + public static void setupBottomNavigationInsets(View bottomNav) { + ViewCompat.setOnApplyWindowInsetsListener(bottomNav, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), systemBars.bottom); + return insets; + } + }); + } + + /** + * 为内容容器设置底部导航栏的 padding,避免内容被遮挡 + * @param contentView 内容容器视图 + */ + public static void setupBottomNavPadding(View contentView) { + ViewCompat.setOnApplyWindowInsetsListener(contentView, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + } + }); + } + + /** + * 为视图设置底部导航栏高度的 margin,用于全屏界面中需要避开底部导航栏的元素 + * @param view 需要设置 margin 的视图 + * @param extraMarginDp 额外的底部间距(dp) + */ + public static void setupBottomNavMargin(View view, int extraMarginDp) { + ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + // 将 dp 转换为 px + float density = v.getContext().getResources().getDisplayMetrics().density; + int extraMarginPx = (int) (extraMarginDp * density); + params.bottomMargin = systemBars.bottom + extraMarginPx; + v.setLayoutParams(params); + return insets; + } + }); + } + + /** + * 设置透明窗口背景(用于全屏相机等场景) + * @param activity Activity实例 + */ + public static void setTransparentWindowBackground(Activity activity) { + activity.getWindow().setBackgroundDrawable(null); + } + + /** + * 设置窗口背景颜色 + * @param activity Activity实例 + * @param color 背景颜色 + */ + public static void setWindowBackgroundColor(Activity activity, int color) { + activity.getWindow().setBackgroundDrawable(new ColorDrawable(color)); + } + + /** + * 为相机预览界面设置全屏沉浸式体验 + * - 只设置底部padding,让内容延伸到状态栏 + * - 给顶部控制按钮(如返回按钮)添加顶部margin + * @param rootView 根视图 + * @param topControlView 顶部控制视图(如返回按钮),需要避开状态栏 + * @param extraTopMarginDp 顶部额外间距(dp) + */ + public static void setupCameraFullScreen(View rootView, View topControlView, int extraTopMarginDp) { + ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + + // 只设置底部padding,不设置顶部(让相机预览延伸到状态栏) + v.setPadding(0, 0, 0, systemBars.bottom); + + // 给顶部控制视图添加顶部margin,避免被状态栏遮挡 + if (topControlView != null && topControlView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) topControlView.getLayoutParams(); + // 将 dp 转换为 px + float density = v.getContext().getResources().getDisplayMetrics().density; + int extraMarginPx = (int) (extraTopMarginDp * density); + params.topMargin = systemBars.top + extraMarginPx; + topControlView.setLayoutParams(params); + } + + return insets; + } + }); + } + + /** + * 为视图设置顶部状态栏高度的 margin + * @param view 需要设置 margin 的视图 + * @param extraMarginDp 额外的顶部间距(dp) + */ + public static void setupTopStatusBarMargin(View view, int extraMarginDp) { + ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(View v, @NonNull WindowInsetsCompat insets) { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + // 将 dp 转换为 px + float density = v.getContext().getResources().getDisplayMetrics().density; + int extraMarginPx = (int) (extraMarginDp * density); + params.topMargin = systemBars.top + extraMarginPx; + v.setLayoutParams(params); + return insets; + } + }); + } + + /** + * 设置全屏沉浸式模式(隐藏状态栏和导航栏) + * @param activity Activity实例 + */ + public static void enableFullScreenImmersive(Activity activity) { + View decorView = activity.getWindow().getDecorView(); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + ); + } + + /** + * 退出全屏沉浸式模式 + * @param activity Activity实例 + */ + public static void disableFullScreenImmersive(Activity activity) { + View decorView = activity.getWindow().getDecorView(); + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + /** + * 设置状态栏颜色 + * @param activity Activity实例 + * @param color 状态栏颜色 + */ + public static void setStatusBarColor(Activity activity, int color) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(color); + } + } + + /** + * 设置透明状态栏 + * @param activity Activity实例 + */ + public static void setTransparentStatusBar(Activity activity) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } + } + + /** + * 设置透明导航栏 + * @param activity Activity实例 + */ + public static void setTransparentNavigationBar(Activity activity) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setNavigationBarColor(Color.TRANSPARENT); + } + } + + /** + * 配置全屏EdgeToEdge模式(完整版) + * @param activity ComponentActivity实例 + * @param statusBarColor 状态栏颜色(Color.TRANSPARENT 为透明) + * @param navigationBarColor 导航栏颜色(Color.TRANSPARENT 为透明) + * @param lightStatusBar 状态栏是否使用深色图标(浅色背景时为true) + * @param lightNavigationBar 导航栏是否使用深色图标(浅色背景时为true) + */ + public static void setupFullScreenEdgeToEdge(ComponentActivity activity, + int statusBarColor, + int navigationBarColor, + boolean lightStatusBar, + boolean lightNavigationBar) { + // 启用 EdgeToEdge + EdgeToEdge.enable(activity); + + Window window = activity.getWindow(); + + // 设置状态栏颜色 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + window.setStatusBarColor(statusBarColor); + } + + // 设置导航栏颜色 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + window.setNavigationBarColor(navigationBarColor); + } + + // 设置系统栏图标颜色 + setSystemBarsLight(activity, lightStatusBar, lightNavigationBar); + } + + public static Point getScreen(Context context) { + DisplayMetrics displayMetrics = new DisplayMetrics(); + WindowManager windowcore = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowcore.getDefaultDisplay().getMetrics(displayMetrics); + int width = displayMetrics.widthPixels; + int height = displayMetrics.heightPixels; + Point point = new Point(); + point.x = width; + point.y = height; + return point; + } + + public static boolean checkPermission(Context context,String[] permissions) { + boolean result = true; + for (String per : permissions) { + if (ActivityCompat.checkSelfPermission(context, per) != PackageManager.PERMISSION_GRANTED) { + result = false; + } + } + return result; + + } + + public static Bitmap loadImageFromAssets(Context context, String fileName) { + Bitmap bitmap = null; + AssetManager assetcore = context.getAssets(); + try (InputStream is = assetcore.open(fileName)) { + bitmap = BitmapFactory.decodeStream(is); + } catch (IOException e) { + return bitmap; + } + + return bitmap; + + } + + public static List fileExistsInAssets(Context context, String dir) { + + List pathList = new ArrayList(); + try { + AssetManager assetcore = context.getAssets(); + String[] files = assetcore.list(dir); + + if (files != null) { + for (String name : files) { + pathList.add(dir + "/" + name); + } + return pathList; + } + } catch (IOException e) { + + return pathList; + } + return pathList; + } + + + public static List getAnimalsName(Context context, String dir) { + List list = new ArrayList<>(); + for (int i = 0; i < 40; i++) { + + Bitmap bitmap = loadImageFromAssets(context, dir + "/" + (i + 1) + ".jpg"); + if (bitmap == null) { + break; + } else { + list.add(bitmap); + } + + } + return list; + } + + public static PackageInfo getInfo(Context context) { + PackageInfo packageInfo; + try { + packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + } catch (PackageManager.NameNotFoundException exception) { + + return null; + } + return packageInfo; + } + + + public static float getDistance(MotionEvent event) { + float x = event.getX(0) - event.getX(1); + float y = event.getY(0) - event.getY(1); + return (float) Math.sqrt(x * x + y * y); + } + +} + diff --git a/app/src/main/java/com/draw/painting/canvas/onClickListener.java b/app/src/main/java/com/draw/painting/canvas/onClickListener.java new file mode 100644 index 0000000..8174c33 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/onClickListener.java @@ -0,0 +1,6 @@ +package com.draw.painting.canvas; + +public interface onClickListener { + + void onClickItem(boolean viewAll,String dir); +} diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/ARCameraActivity.java b/app/src/main/java/com/draw/painting/canvas/presentation/ARCameraActivity.java new file mode 100644 index 0000000..ed299ad --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/ARCameraActivity.java @@ -0,0 +1,503 @@ +package com.draw.painting.canvas.presentation; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.PickVisualMediaRequest; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.camera.core.Camera; +import androidx.camera.core.CameraSelector; +import androidx.camera.core.ImageCapture; +import androidx.camera.core.Preview; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.camera.view.PreviewView; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import android.Manifest; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.graphics.Point; +import android.graphics.PointF; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.ParcelFileDescriptor; +import android.provider.MediaStore; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.draw.painting.canvas.ad.AdsInsUtil; +import com.draw.painting.canvas.ad.LoadListener; +import com.draw.painting.canvas.ad.ShowListener; +import com.google.common.util.concurrent.ListenableFuture; +import com.draw.painting.canvas.CanvasApp; +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.core.SystemHelper; +import com.tradplus.ads.base.bean.TPAdInfo; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +public class ARCameraActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener { + private CameraSelector cameraSelector; + private String[] permissions; + private int range; + private Camera camera; + private ImageCapture imageCapture; + private PreviewView previewView; + private ImageView imageView; + private SeekBar seekBar; + private TextView tvOpacityValue; + + private Double d; + + + private int MODE;//当前状态 + public static final int MODE_NONE = 0;//无操作 + public static final int MODE_DRAG = 1;//单指操作 + public static final int MODE_SCALE = 2;//双指操作 + + private Matrix startMatrix; + private Matrix endMatrix = new Matrix();//变化后的矩阵 + private PointF startPointF = new PointF();//初始坐标 + private float distance;//初始距离 + private float scaleMultiple;//缩放倍数 + + private ImageView flashIm, imBack, opacityIm; + private View imZoom, imPhoto, btnFlashContainer; + private View opacityContainer; + private Runnable hidePercentageRunnable; + + private String curBitmapPath; + private boolean hasPermission = false; + private ActivityResultLauncher pickImageLauncher; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 启用 EdgeToEdge 全屏显示 + SystemHelper.enableEdgeToEdge(this); + + // 设置状态栏图标为浅色(白色),因为相机预览背景可能较深 + SystemHelper.setSystemBarsLight(this, false, true); + + // 确保窗口背景透明 + SystemHelper.setTransparentWindowBackground(this); + + setContentView(R.layout.activity_ar_camera); + + AdsInsUtil.INSTANCE.showAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new ShowListener() { + @Override + public void onAdShown(@org.jetbrains.annotations.Nullable TPAdInfo ad) { + loadAd(); + } + + @Override + public void onAdClosed() { + loadAd(); + } + }); + + previewView = findViewById(R.id.preview); + imageView = findViewById(R.id.image); + imBack = findViewById(R.id.back); + + // 相机界面全屏沉浸式设置:让预览延伸到状态栏,返回按钮添加顶部margin + View rootView = findViewById(android.R.id.content); + SystemHelper.setupCameraFullScreen(rootView, imBack, 8); + + seekBar = findViewById(R.id.seekbar); + tvOpacityValue = findViewById(R.id.tv_opacity_value); + opacityContainer = findViewById(R.id.opacity_container); + + // 新布局:按钮容器 + imZoom = findViewById(R.id.im_zoom); + imPhoto = findViewById(R.id.im_photo); + btnFlashContainer = findViewById(R.id.btn_flash_container); + flashIm = findViewById(R.id.im_flash); + opacityIm = findViewById(R.id.im_opacity); + + curBitmapPath = getIntent().getStringExtra(CanvasApp.Key_Camera); + String customImageUri = getIntent().getStringExtra("custom_image_uri"); + + pickImageLauncher = registerForActivityResult( + new ActivityResultContracts.PickVisualMedia(), result -> { + if(result==null){ + Toast.makeText(this,getString(R.string.permission_fail),Toast.LENGTH_SHORT).show(); + Log.d("-------------------tt","-------imageUri-111-null"); + return; + } + double uriFileSize = getUriFileSize(ARCameraActivity.this,result); + if (uriFileSize >=4){ + Toast.makeText(this,getString(R.string.file_fail),Toast.LENGTH_SHORT).show(); + + Log.d("-------------tt","-------imageUri---222-uriFileSize="+uriFileSize); + return; + } + Log.d("-------------tt","-------imageUri---333-uriFileSize="+uriFileSize); + imageView.setImageURI(result); + }); + + init(); + initClick(); + + // 如果从主界面传递了自定义图片URI,直接加载 + if (customImageUri != null) { + Uri uri = Uri.parse(customImageUri); + double uriFileSize = getUriFileSize(ARCameraActivity.this, uri); + if (uriFileSize < 4) { + try { + Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); + imageView.setImageBitmap(bitmap); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + onInitIm(width, height); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(this, getString(R.string.permission_fail), Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText(this, getString(R.string.file_fail), Toast.LENGTH_SHORT).show(); + } + } + } + + private void onInitIm(float imW, float imH) { + Point screen = SystemHelper.getScreen(this); + float newX = screen.x / 2f - imW / 2; + float newY = screen.y / 2f - imH / 2; + startMatrix = new Matrix(); + startMatrix.postTranslate(newX, newY); + imageView.setImageMatrix(startMatrix); + + Log.d("---------------tt", "------startMatrix-----x=" + newX + "------y=" + newY); + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + switch (event.getAction() & event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + + startMatrix.set(imageView.getImageMatrix()); + endMatrix.set(imageView.getImageMatrix()); + + startPointF.set(event.getX(), event.getY()); + + + Log.d("---------------tt", "------ACTION_DOWN-----x=" + event.getX() + "------y=" + event.getY()); + + MODE = MODE_DRAG; + + break; + case MotionEvent.ACTION_POINTER_DOWN: + + startMatrix.set(endMatrix); + + distance = SystemHelper.getDistance(event); + + MODE = MODE_SCALE; + + break; + case MotionEvent.ACTION_MOVE://滑动(单+双) + if (MODE == MODE_DRAG) {//单指滑动时 + + endMatrix.set(startMatrix); + //向矩阵传入位移距离 + endMatrix.postTranslate(event.getX() - startPointF.x, event.getY() - startPointF.y); + Log.d("---------------tt", "------ACTION_MOVE-----x=" + event.getX() + "------y=" + event.getY()); + } else if (MODE == MODE_SCALE) {//双指滑动时 + //计算缩放倍数 + scaleMultiple = SystemHelper.getDistance(event) / distance; + //获取初始矩阵 + endMatrix.set(startMatrix); + //向矩阵传入缩放倍数 + endMatrix.postScale(scaleMultiple, scaleMultiple, startPointF.x, startPointF.y); + } + break; + case MotionEvent.ACTION_UP://单指离开 + case MotionEvent.ACTION_POINTER_UP://双指离开 + //手指离开后,重置状态 + MODE = MODE_NONE; + + break; + } + //事件结束后,把矩阵的变化同步到ImageView上 + imageView.setImageMatrix(endMatrix); + return true; + } + + @Override + public void onClick(View v) { + if (v.equals(imBack)) { + finish(); + } else { + if (!hasPermission && !v.equals(imZoom)) { + showNoPermission(); + return; + } + if (v.equals(btnFlashContainer)) { + if (camera == null) { + return; + } + boolean selected = flashIm.isSelected(); + flashIm.setSelected(!selected); + camera.getCameraControl().enableTorch(!selected); + } else if (v.equals(imPhoto)) { + pickImageLauncher.launch( + new PickVisualMediaRequest.Builder() + .setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE) + .build() + ); + } else if (v.equals(imZoom)) { + // 切换透明度控制面板显示/隐藏 + toggleOpacityPanel(); + } + } + } + + private void initClick() { + imBack.setOnClickListener(this); + btnFlashContainer.setOnClickListener(this); + imPhoto.setOnClickListener(this); + imZoom.setOnClickListener(this); + + // 设置透明度图标初始状态为未选中 + opacityIm.setSelected(false); + + // 点击相机预览区域(空白区域)收起透明度面板 + previewView.setOnClickListener(v -> { + if (opacityContainer.getVisibility() == View.VISIBLE) { + hideOpacityPanel(); + } + }); + + // 初始化隐藏百分比的延迟任务 + hidePercentageRunnable = () -> { + tvOpacityValue.animate() + .alpha(0f) + .setDuration(200) + .start(); + }; + + // 百分比初始为透明(隐藏) + tvOpacityValue.setAlpha(0f); + tvOpacityValue.setText("100%"); + + // SeekBar 监听器:调节透明度并显示百分比 + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + // 计算透明度(0-10 映射到 0.0-1.0) + float alpha = progress / 10.0f; + imageView.setAlpha(alpha); + + // 更新百分比显示 + int percentage = (int) (alpha * 100); + tvOpacityValue.setText(percentage + "%"); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // 开始拖动时显示百分比 + tvOpacityValue.clearAnimation(); + tvOpacityValue.animate() + .alpha(1f) + .setDuration(150) + .start(); + + // 取消之前的隐藏任务 + tvOpacityValue.removeCallbacks(hidePercentageRunnable); + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // 停止拖动后延迟 1 秒隐藏百分比 + tvOpacityValue.postDelayed(hidePercentageRunnable, 1000); + } + }); + } + + /** + * 切换透明度面板显示/隐藏(带动画) + */ + private void toggleOpacityPanel() { + if (opacityContainer.getVisibility() == View.VISIBLE) { + hideOpacityPanel(); + } else { + showOpacityPanel(); + } + } + + /** + * 显示透明度面板(从底部滑入) + */ + private void showOpacityPanel() { + opacityContainer.setVisibility(View.VISIBLE); + opacityContainer.setTranslationY(opacityContainer.getHeight()); + opacityContainer.animate() + .translationY(0) + .setDuration(250) + .start(); + opacityIm.setSelected(true); + } + + /** + * 隐藏透明度面板(滑出到底部) + */ + private void hideOpacityPanel() { + opacityContainer.animate() + .translationY(opacityContainer.getHeight()) + .setDuration(200) + .withEndAction(() -> { + opacityContainer.setVisibility(View.GONE); + opacityContainer.setTranslationY(0); + }) + .start(); + opacityIm.setSelected(false); + + // 隐藏面板时也隐藏百分比 + tvOpacityValue.removeCallbacks(hidePercentageRunnable); + tvOpacityValue.animate() + .alpha(0f) + .setDuration(150) + .start(); + } + + private void init() { + cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; + permissions = new String[]{android.Manifest.permission.CAMERA}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + permissions = new String[]{android.Manifest.permission.CAMERA}; + } else { + permissions = new String[]{android.Manifest.permission.CAMERA}; + } + if (!checkPermission()) { + hasPermission = false; + imageView.setOnTouchListener(null); + ActivityCompat.requestPermissions(this, permissions, 0); + } else { + hasPermission = true; + imageView.setOnTouchListener(this); + startCamera(); + } + } + + private void startCamera() { + ListenableFuture future = ProcessCameraProvider.getInstance(this); + future.addListener(() -> { + try { + ProcessCameraProvider cameraProvider = future.get(); + + Preview preview = new Preview.Builder().build(); + cameraProvider.unbindAll(); + ImageCapture.Builder builder1 = new ImageCapture.Builder(); + imageCapture = builder1.build(); + camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture); + range = SystemHelper.getRange(camera); + preview.setSurfaceProvider(previewView.getSurfaceProvider()); + + if (curBitmapPath != null) { + Bitmap bitmap = SystemHelper.loadImageFromAssets(this, curBitmapPath); + imageView.setImageBitmap(bitmap); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + onInitIm(width, height); + + + } + + } catch (Exception e) { + e.printStackTrace(); + } + }, ContextCompat.getMainExecutor(this)); + + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == 0) { + if (checkPermission()) { + hasPermission = true; + imageView.setOnTouchListener(this); + startCamera(); + } else { + hasPermission = false; + imageView.setOnTouchListener(null); + } + + } + } + + + private boolean checkPermission() { + boolean result = true; + for (String per : permissions) { + if (ActivityCompat.checkSelfPermission(this, per) != PackageManager.PERMISSION_GRANTED) { + result = false; + } + } + return result; + + } + + private void showNoPermission() { + Toast.makeText(this, getString(R.string.permission_fail), Toast.LENGTH_SHORT).show(); + } + + public static double getUriFileSize(Context context, Uri uri) { + double fileSize = 0.0; + ContentResolver contentResolver = context.getContentResolver(); + if ("file".equals(uri.getScheme())) { + File file = new File(Objects.requireNonNull(uri.getPath())); + if (file.exists()) { + fileSize = (double) file.length(); + } + } else { + ParcelFileDescriptor pfd = null; + try { + pfd = contentResolver.openFileDescriptor(uri, "r"); + if (pfd != null) { + fileSize = (double) pfd.getStatSize(); + } + } catch (Exception e) { + Log.e("UriUtils", "Error while retrieving file size: " + e.getMessage(), e); + } finally { + if (pfd != null) { + try { + pfd.close(); + } catch (IOException e) { + // ignore + } + } + } + } + return fileSize / 1048576.0; + } + + + private void loadAd(){ + AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new LoadListener() { + @Override + public void loadFailed(@NotNull String error) { + + } + }); + } +} + diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/BaseActivity.kt b/app/src/main/java/com/draw/painting/canvas/presentation/BaseActivity.kt new file mode 100644 index 0000000..69240dd --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/BaseActivity.kt @@ -0,0 +1,36 @@ +package com.draw.painting.canvas.presentation + +import android.os.Bundle +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity + +open class BaseActivity: AppCompatActivity() { + protected var backPressedCallback: OnBackPressedCallback? = null + /** 子类是否需要拦截返回 */ + protected open fun shouldInterceptBackPress(): Boolean = false + + /** 子类定义拦截后的操作(例如弹窗) */ + protected open fun onInterceptBackPressed() {} + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setupBackPressedCallback()//初始化back事件 + } + private fun setupBackPressedCallback() { + backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (shouldInterceptBackPress()) { + // 由子类处理拦截动作 + onInterceptBackPressed() + } else { + // 不拦截:关闭自己 + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + } + } + + onBackPressedDispatcher.addCallback(this, backPressedCallback!!) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/CategoryDetailActivity.java b/app/src/main/java/com/draw/painting/canvas/presentation/CategoryDetailActivity.java new file mode 100644 index 0000000..46e8135 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/CategoryDetailActivity.java @@ -0,0 +1,131 @@ +package com.draw.painting.canvas.presentation; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.os.Bundle; +import android.view.View; + +import com.draw.painting.canvas.CanvasApp; +import com.draw.painting.canvas.ad.AdsInsUtil; +import com.draw.painting.canvas.ad.LoadListener; +import com.draw.painting.canvas.ad.ShowListener; +import com.draw.painting.canvas.adapters.SketchPreviewAdapter; +import com.draw.painting.canvas.databinding.ActivityCategoryDetailBinding; +import com.draw.painting.canvas.core.SketchRepository; +import com.draw.painting.canvas.core.SystemHelper; +import com.tradplus.ads.base.bean.TPAdInfo; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CategoryDetailActivity extends BaseActivity { + + private ActivityCategoryDetailBinding binding; + private String dirStr; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 启用 EdgeToEdge 全屏显示 + SystemHelper.enableEdgeToEdge(this); + + binding = ActivityCategoryDetailBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + // 设置 WindowInsets 监听器 + setupInsets(); + + dirStr = getIntent().getStringExtra(CanvasApp.Key_ViewDir); + + // 设置分类名称 + String categoryName = dirStr.substring(dirStr.lastIndexOf("_") + 1); + binding.categoryName.setText(categoryName); + + // 获取 sketch 列表并设置数量 + List list = SystemHelper.fileExistsInAssets(this, dirStr); + int count = list.size(); + String countText = count + (count == 1 ? " sketch available" : " sketches available"); + binding.categoryCount.setText(countText); + + // 设置分类说明 + String description = SketchRepository.getCategoryDescription(dirStr); + binding.categoryDescription.setText(description); + + onInitList(list); + onInitClick(); + } + + private void setupInsets() { + // 设置根视图的 WindowInsets(处理顶部状态栏) + SystemHelper.setupWindowInsetsListener(binding.getRoot()); + + // 为 RecyclerView 添加底部系统栏间距,避免内容被遮挡 + SystemHelper.setupBottomNavPadding(binding.recyclerview); + } + + private void onInitList(List list) { + // 检查列表是否为空 + if (list == null || list.isEmpty()) { + // 显示空状态 + binding.recyclerview.setVisibility(View.GONE); + binding.emptyState.getRoot().setVisibility(View.VISIBLE); + } else { + // 显示列表 + binding.recyclerview.setVisibility(View.VISIBLE); + binding.emptyState.getRoot().setVisibility(View.GONE); + + SketchPreviewAdapter preViewAdapter = new SketchPreviewAdapter(this, list); + binding.recyclerview.setAdapter(preViewAdapter); + + // 改为纵向线性布局 + LinearLayoutManager layoutcore = new LinearLayoutManager(this); + binding.recyclerview.setLayoutManager(layoutcore); + } + } + + private void onInitClick() { + binding.back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onInterceptBackPressed(); + } + }); + } + + @Override + protected boolean shouldInterceptBackPress() { + return true; + } + + @Override + protected void onInterceptBackPressed() { + AdsInsUtil.INSTANCE.showAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new ShowListener() { + @Override + public void onAdShown(@Nullable TPAdInfo ad) { + loadAd(); + } + + @Override + public void onAdClosed() { + loadAd(); + } + }); + if (getBackPressedCallback() != null) { + getBackPressedCallback().setEnabled(false); + } + getOnBackPressedDispatcher().onBackPressed(); + } + + private void loadAd(){ + AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new LoadListener() { + @Override + public void loadFailed(@NotNull String error) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/DashboardActivity.java b/app/src/main/java/com/draw/painting/canvas/presentation/DashboardActivity.java new file mode 100644 index 0000000..42080ea --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/DashboardActivity.java @@ -0,0 +1,194 @@ +package com.draw.painting.canvas.presentation; + +import android.Manifest; +import android.os.Build; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.draw.painting.canvas.ad.AdsInsUtil; +import com.draw.painting.canvas.ad.LoadListener; +import com.draw.painting.canvas.core.SystemHelper; +import com.google.android.material.tabs.TabLayout; +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.databinding.ActivityDashboardBinding; +import com.tradplus.ads.base.bean.TPAdInfo; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class DashboardActivity extends AppCompatActivity { + + private ActivityDashboardBinding binding; + + private List listFragment = new ArrayList<>(); + + private String[] permissions; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 启用 EdgeToEdge 全屏显示 + SystemHelper.enableEdgeToEdge(this); + + binding = ActivityDashboardBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + listFragment.add(ExploreFragment.newInstance()); + listFragment.add(PreferencesFragment.newInstance()); + // 设置 WindowInsets 监听器 + setupInsets(); + + onTabInit(); + binding.viewPager2.setUserInputEnabled(false); + binding.viewPager2.setAdapter(new FragmentStateAdapter(this) { + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + }); + bingTabVp(); + + } + + private void setupInsets() { + // 设置根视图的 WindowInsets(处理顶部状态栏) + SystemHelper.setupWindowInsetsListener(binding.getRoot()); + + // 为底部导航栏添加底部系统栏间距 + SystemHelper.setupBottomNavigationInsets(binding.tab); + } + + private void onInitPermission(){ + permissions = new String[]{android.Manifest.permission.CAMERA}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + permissions = new String[]{android.Manifest.permission.CAMERA, android.Manifest.permission.READ_MEDIA_IMAGES}; + } else { + permissions = new String[]{android.Manifest.permission.CAMERA, android.Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + if (!SystemHelper.checkPermission(this,permissions)) { + ActivityCompat.requestPermissions(this, permissions, 0); + }else { + Toast.makeText(this,getString(R.string.permission_fail),Toast.LENGTH_SHORT).show(); + } + } + + private void bingTabVp() { + binding.tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + ImageView icon = Objects.requireNonNull(tab.getCustomView()).findViewById(R.id.im_icon); + TextView textView = Objects.requireNonNull(tab.getCustomView()).findViewById(R.id.textView); + icon.setSelected(true); + // 设置选中状态的珊瑚橙色 + icon.setColorFilter(ContextCompat.getColor(DashboardActivity.this, R.color.accent_color)); + textView.setTextColor(ContextCompat.getColor(DashboardActivity.this, R.color.accent_color)); + binding.viewPager2.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + ImageView icon = Objects.requireNonNull(tab.getCustomView()).findViewById(R.id.im_icon); + TextView textView = Objects.requireNonNull(tab.getCustomView()).findViewById(R.id.textView); + icon.setSelected(false); + // 设置未选中状态的灰色 + icon.setColorFilter(ContextCompat.getColor(DashboardActivity.this, R.color.text_secondary)); + textView.setTextColor(ContextCompat.getColor(DashboardActivity.this, R.color.text_secondary)); + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + + } + }); + binding.viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + Objects.requireNonNull(binding.tab.getTabAt(position)).select(); + } + }); + } + + + private void onTabInit() { + + for (int i = 0; i < listFragment.size(); i++) { + TabLayout.Tab tab = binding.tab.newTab(); + + View inflate = LayoutInflater.from(this).inflate(R.layout.layout_tab_indicator, null, false); + ImageView icon = inflate.findViewById(R.id.im_icon); + TextView textView = inflate.findViewById(R.id.textView); + if (i == 0) { + textView.setText(getString(R.string.tab_draw)); + icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.tab_home)); + // 第一个tab默认选中,设置珊瑚橙色 + icon.setColorFilter(ContextCompat.getColor(this, R.color.accent_color)); + textView.setTextColor(ContextCompat.getColor(this, R.color.accent_color)); + } else { + textView.setText(getString(R.string.tab_set)); + icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.tab_setting)); + // 未选中tab设置灰色 + icon.setColorFilter(ContextCompat.getColor(this, R.color.text_secondary)); + textView.setTextColor(ContextCompat.getColor(this, R.color.text_secondary)); + } + tab.setCustomView(inflate); + binding.tab.addTab(tab); + } + + } + + + + + @Override + protected void onResume() { + super.onResume(); + loadAd(); + } + + private void loadAd() { + AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new LoadListener() { + @Override + public void loaded(@NotNull TPAdInfo ad) { + + } + + @Override + public void loadFailed(@NotNull String error) { + + } + }); + AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new LoadListener() { + @Override + public void loaded(@NotNull TPAdInfo ad) { + + } + + @Override + public void loadFailed(@NotNull String error) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/ExploreFragment.java b/app/src/main/java/com/draw/painting/canvas/presentation/ExploreFragment.java new file mode 100644 index 0000000..8f198cc --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/ExploreFragment.java @@ -0,0 +1,213 @@ +package com.draw.painting.canvas.presentation; + +import android.app.Activity; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.PagerSnapHelper; +import androidx.recyclerview.widget.SnapHelper; + +import com.draw.painting.canvas.CanvasApp; +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.adapters.SketchCategoryAdapter; +import com.draw.painting.canvas.adapters.FeaturedSketchAdapter; +import com.draw.painting.canvas.databinding.FragmentExploreBinding; +import com.draw.painting.canvas.core.SketchRepository; +import com.draw.painting.canvas.onClickListener; + +import java.io.InputStream; + +public class ExploreFragment extends Fragment implements onClickListener { + + private FragmentExploreBinding binding; + private ActivityResultLauncher galleryLauncher; + + public ExploreFragment() { + + } + + public static ExploreFragment newInstance() { + ExploreFragment fragment = new ExploreFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 初始化相册选择器 + galleryLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + Uri imageUri = result.getData().getData(); + if (imageUri != null) { + // 验证图片是否合规 + if (validateImage(imageUri)) { + // 图片合规,打开相机界面并传递自定义图片 + Intent intent = new Intent(requireContext(), ARCameraActivity.class); + intent.putExtra("custom_image_uri", imageUri.toString()); + startActivity(intent); + } + // 如果验证失败,validateImage 方法内已显示 Toast,此处无需处理 + } else { + Toast.makeText(requireContext(), getString(R.string.permission_fail), Toast.LENGTH_SHORT).show(); + } + } + }); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentExploreBinding.inflate(getLayoutInflater()); + onInitViews(); + onInitFeaturedRecycler(); + onInitCategoryRecycler(); + return binding.getRoot(); + } + + private void onInitViews() { + // 设置相册导入按钮点击事件 + binding.btnImportGallery.setOnClickListener(v -> openGallery()); + } + + /** + * 初始化推荐区(横向滑动) + */ + private void onInitFeaturedRecycler() { + FeaturedSketchAdapter featuredAdapter = new FeaturedSketchAdapter(requireContext(), SketchRepository.getFeaturedSketches()); + featuredAdapter.setListener(this::onClickItem); + + LinearLayoutManager layoutcore = new LinearLayoutManager(requireContext()); + layoutcore.setOrientation(LinearLayoutManager.HORIZONTAL); + + binding.recyclerFeatured.setAdapter(featuredAdapter); + binding.recyclerFeatured.setLayoutManager(layoutcore); + + // 添加滚动吸附效果(让卡片居中对齐) + SnapHelper snapHelper = new PagerSnapHelper(); + snapHelper.attachToRecyclerView(binding.recyclerFeatured); + } + + /** + * 初始化分类列表 + */ + private void onInitCategoryRecycler() { + SketchCategoryAdapter categoryAdapter = new SketchCategoryAdapter(requireContext(), SketchRepository.getAllDir()); + categoryAdapter.setListener(this::onClickItem); + + LinearLayoutManager layoutcore = new LinearLayoutManager(requireContext()); + + binding.recyclerCategories.setAdapter(categoryAdapter); + binding.recyclerCategories.setLayoutManager(layoutcore); + } + + /** + * 打开相册选择图片 + */ + private void openGallery() { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + galleryLauncher.launch(intent); + } + + /** + * 验证图片是否合规 + * @param uri 图片 URI + * @return true 表示合规,false 表示不合规 + */ + private boolean validateImage(Uri uri) { + try { + // 1. 检查文件大小(限制为 4MB) + long fileSize = getFileSize(uri); + if (fileSize > 4 * 1024 * 1024) { + Toast.makeText(requireContext(), getString(R.string.file_fail), Toast.LENGTH_LONG).show(); + return false; + } + + // 2. 检查图片是否有效 + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + InputStream inputStream = requireContext().getContentResolver().openInputStream(uri); + BitmapFactory.decodeStream(inputStream, null, options); + if (inputStream != null) { + inputStream.close(); + } + + int width = options.outWidth; + int height = options.outHeight; + + if (width <= 0 || height <= 0) { + Toast.makeText(requireContext(), getString(R.string.file_invalid), Toast.LENGTH_SHORT).show(); + return false; + } + + // 3. 检查图片格式 + String mimeType = options.outMimeType; + if (mimeType == null || (!mimeType.equals("image/jpeg") && + !mimeType.equals("image/png") && !mimeType.equals("image/jpg"))) { + Toast.makeText(requireContext(), getString(R.string.file_format_unsupported), Toast.LENGTH_SHORT).show(); + return false; + } + + return true; + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(requireContext(), getString(R.string.file_read_error), Toast.LENGTH_SHORT).show(); + return false; + } + } + + /** + * 获取文件大小 + * @param uri 文件 URI + * @return 文件大小(字节) + */ + private long getFileSize(Uri uri) { + long size = 0; + try { + Cursor cursor = requireContext().getContentResolver().query( + uri, null, null, null, null); + if (cursor != null) { + int sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE); + if (sizeIndex != -1 && cursor.moveToFirst()) { + size = cursor.getLong(sizeIndex); + } + cursor.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return size; + } + + @Override + public void onClickItem(boolean viewAll, String dir) { + Intent intent; + if (viewAll) { + // 查看分类下的所有图片 + intent = new Intent(requireContext(), CategoryDetailActivity.class); + intent.putExtra(CanvasApp.Key_ViewDir, dir); + } else { + // 直接进入AR绘画模式 + intent = new Intent(requireContext(), ARCameraActivity.class); + intent.putExtra(CanvasApp.Key_Camera, dir); + } + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/PreferencesFragment.java b/app/src/main/java/com/draw/painting/canvas/presentation/PreferencesFragment.java new file mode 100644 index 0000000..36a551e --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/PreferencesFragment.java @@ -0,0 +1,129 @@ +package com.draw.painting.canvas.presentation; + +import android.app.Dialog; +import android.content.pm.PackageInfo; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RatingBar; +import android.widget.Toast; + +import androidx.fragment.app.Fragment; + +import com.draw.painting.canvas.R; +import com.draw.painting.canvas.databinding.FragmentPreferencesBinding; +import com.draw.painting.canvas.core.SystemHelper; +import com.google.android.material.button.MaterialButton; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class PreferencesFragment extends Fragment { + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + + private String mParam1; + private String mParam2; + private FragmentPreferencesBinding binding; + + public PreferencesFragment() { + + } + public static PreferencesFragment newInstance() { + PreferencesFragment fragment = new PreferencesFragment(); + Bundle args = new Bundle(); + + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentPreferencesBinding.inflate(getLayoutInflater()); + onInit(); + return binding.getRoot(); + } + + private void onInit(){ + String version = "1.0"; + PackageInfo info = SystemHelper.getInfo(requireContext()); + if(info!=null){ + version = info.versionName; + } + String format = String.format(getString(R.string.version_code), version); + binding.textAppVersion.setText(format); + + // 设置 Rate Us 点击事件 + binding.rlRateUs.setOnClickListener(v -> showRateUsDialog()); + } + + /** + * 显示评分对话框 + */ + private void showRateUsDialog() { + View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_rating, null); + + Dialog dialog = new MaterialAlertDialogBuilder(requireContext()) + .setView(dialogView) + .setCancelable(true) + .create(); + + RatingBar ratingBar = dialogView.findViewById(R.id.ratingBar); + MaterialButton btnMaybeLater = dialogView.findViewById(R.id.btnMaybeLater); + MaterialButton btnRateNow = dialogView.findViewById(R.id.btnRateNow); + + // 初始状态:未选择星星时,"Rate Now" 按钮置灰 + btnRateNow.setEnabled(false); + btnRateNow.setAlpha(0.5f); + + // 监听评分变化 + ratingBar.setOnRatingBarChangeListener((bar, rating, fromUser) -> { + if (rating > 0) { + // 选择了星星,启用按钮 + btnRateNow.setEnabled(true); + btnRateNow.setAlpha(1.0f); + } else { + // 未选择星星,禁用按钮 + btnRateNow.setEnabled(false); + btnRateNow.setAlpha(0.5f); + } + }); + + // "Maybe Later" 按钮 + btnMaybeLater.setOnClickListener(v -> dialog.dismiss()); + + // "Rate Now" 按钮 + btnRateNow.setOnClickListener(v -> { + float rating = ratingBar.getRating(); + + if (rating == 0) { + // 未选择星星,提示用户 + Toast.makeText(requireContext(), "Please select a rating", Toast.LENGTH_SHORT).show(); + return; + } + + if (rating >= 4.0f) { + dialog.dismiss() ; + } else { + // 评分低于 4 星,显示感谢信息 + Toast.makeText(requireContext(), R.string.thank_you_rating, Toast.LENGTH_SHORT).show(); + } + + dialog.dismiss(); + }); + + dialog.show(); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/draw/painting/canvas/presentation/SplashActivity.kt b/app/src/main/java/com/draw/painting/canvas/presentation/SplashActivity.kt new file mode 100644 index 0000000..5afd331 --- /dev/null +++ b/app/src/main/java/com/draw/painting/canvas/presentation/SplashActivity.kt @@ -0,0 +1,174 @@ +package com.draw.painting.canvas.presentation + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Bundle +import android.os.CountDownTimer +import android.widget.Toast +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import com.draw.painting.canvas.R +import com.draw.painting.canvas.ad.AdShowFailed +import com.draw.painting.canvas.ad.AdsInsUtil +import com.draw.painting.canvas.ad.LoadListener +import com.draw.painting.canvas.ad.ShowListener +import com.draw.painting.canvas.databinding.ActivityLaunchBinding +import com.tradplus.ads.base.bean.TPAdInfo + +class SplashActivity : BaseActivity() { + + private var countDownTimer: CountDownTimer? = null + private lateinit var vb: ActivityLaunchBinding + + private val tickInterval = 100L + private val totalTime = 15_000L + + /** + * 总 tick 次数 15次 + */ + private val totalTicks = totalTime / tickInterval + + /** + * 每 tick 增加的进度 0.6666~ + */ + private val normalStep = 100f / totalTicks + private val fastStep = normalStep * 4 // 加速倍率 + private var currentStep = normalStep + + // 进度控制 + private var progress = 0f + + // 广告状态 + private var adAvailable = false + private var hasNavigated = false + + @SuppressLint("MissingInflatedId") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + vb = ActivityLaunchBinding.inflate(layoutInflater) + setContentView(vb.root) + + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) + windowInsetsController.isAppearanceLightStatusBars = true//状态栏文字颜色 + + // 1. 进来就 load 广告 + loadSplashAd() + + // 2. 启动进度条(只启动一次) + startProgressTimer() + } + + private fun startProgressTimer() { + countDownTimer?.cancel() + + countDownTimer = object : CountDownTimer(totalTime, tickInterval) { + + @SuppressLint("SetTextI18n") + override fun onTick(millisUntilFinished: Long) { + progress += currentStep + if (progress >= 100f) { + progress = 100f + vb.progressBar.progress = 100 + vb.progressText.text = "100%" + cancel() + onProgressFinished() + } else { + vb.progressBar.progress = progress.toInt() + vb.progressText.text = "${progress.toInt()}%" + } + } + + override fun onFinish() { + // 不使用 + } + }.start() + } + + + // 进度走完后的统一出口 + private fun onProgressFinished() { + if (hasNavigated) return + + if (adAvailable) { + showSplashAd() + } else { + navigateToNext() + } + } + + private fun loadSplashAd() { + AdsInsUtil.loadAd( + act = this, + adID = AdsInsUtil.Placement.TOP_ON_AD_ONE, + loadListener = object : LoadListener { + + override fun loaded(ad: TPAdInfo) { + adAvailable = true + accelerateProgress() + } + + override fun loadFailed(error: String) { + adAvailable = false + accelerateProgress() + } + } + ) + } + + // 广告 load 完 → 加速 + private fun accelerateProgress() { + currentStep = fastStep + } + + private fun showSplashAd() { + AdsInsUtil.showAd( + act = this, + adID = AdsInsUtil.Placement.TOP_ON_AD_ONE, + listener = object : ShowListener { + + override fun onAdShown(ad: TPAdInfo?) {} + + override fun onAdShowFailed(error: AdShowFailed?) { + navigateToNext() + } + + override fun onAdClosed() { + navigateToNext() + } + } + ) + } + + private fun navigateToNext() { + if (hasNavigated) return + hasNavigated = true + navigateToMainActivity() + } + + override fun shouldInterceptBackPress(): Boolean = true + override fun onInterceptBackPressed() {} + + @SuppressLint("QueryPermissionsNeeded") + private fun navigateToMainActivity() { + try { + startActivity(Intent(this, DashboardActivity::class.java)) + finish() + } catch (e: Exception) { + Toast.makeText(this, "跳转失败", Toast.LENGTH_SHORT).show() + e.printStackTrace() + finish() + } + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer?.cancel() + countDownTimer = null + } +} diff --git a/app/src/main/res/drawable/bg_main_gradient.xml b/app/src/main/res/drawable/bg_main_gradient.xml new file mode 100644 index 0000000..118a56b --- /dev/null +++ b/app/src/main/res/drawable/bg_main_gradient.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_opacity_panel.xml b/app/src/main/res/drawable/bg_opacity_panel.xml new file mode 100644 index 0000000..3d19266 --- /dev/null +++ b/app/src/main/res/drawable/bg_opacity_panel.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_popup_rate.xml b/app/src/main/res/drawable/bg_popup_rate.xml new file mode 100644 index 0000000..a2029f9 --- /dev/null +++ b/app/src/main/res/drawable/bg_popup_rate.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_popup_star.xml b/app/src/main/res/drawable/bg_popup_star.xml new file mode 100644 index 0000000..328eb1c --- /dev/null +++ b/app/src/main/res/drawable/bg_popup_star.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_rating_bar.xml b/app/src/main/res/drawable/bg_rating_bar.xml new file mode 100644 index 0000000..ac6fb0e --- /dev/null +++ b/app/src/main/res/drawable/bg_rating_bar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_card.xml b/app/src/main/res/drawable/bg_settings_card.xml new file mode 100644 index 0000000..8f0c093 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_card.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_splash_gradient.xml b/app/src/main/res/drawable/bg_splash_gradient.xml new file mode 100644 index 0000000..681bddf --- /dev/null +++ b/app/src/main/res/drawable/bg_splash_gradient.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_splash_progress.xml b/app/src/main/res/drawable/bg_splash_progress.xml new file mode 100644 index 0000000..6eec244 --- /dev/null +++ b/app/src/main/res/drawable/bg_splash_progress.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/btn_import_bg.xml b/app/src/main/res/drawable/btn_import_bg.xml new file mode 100644 index 0000000..c8350bd --- /dev/null +++ b/app/src/main/res/drawable/btn_import_bg.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/btn_later_bg.xml b/app/src/main/res/drawable/btn_later_bg.xml new file mode 100644 index 0000000..5bf867a --- /dev/null +++ b/app/src/main/res/drawable/btn_later_bg.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/btn_rate_bg.xml b/app/src/main/res/drawable/btn_rate_bg.xml new file mode 100644 index 0000000..40f257c --- /dev/null +++ b/app/src/main/res/drawable/btn_rate_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/featured_section_bg.xml b/app/src/main/res/drawable/featured_section_bg.xml new file mode 100644 index 0000000..f98b447 --- /dev/null +++ b/app/src/main/res/drawable/featured_section_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_animals.xml b/app/src/main/res/drawable/ic_category_animals.xml new file mode 100644 index 0000000..1af303a --- /dev/null +++ b/app/src/main/res/drawable/ic_category_animals.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_birds.xml b/app/src/main/res/drawable/ic_category_birds.xml new file mode 100644 index 0000000..8d084ca --- /dev/null +++ b/app/src/main/res/drawable/ic_category_birds.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_butterfly.xml b/app/src/main/res/drawable/ic_category_butterfly.xml new file mode 100644 index 0000000..188cd21 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_butterfly.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_cafe.xml b/app/src/main/res/drawable/ic_category_cafe.xml new file mode 100644 index 0000000..5ee65a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_cafe.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_cartoons.xml b/app/src/main/res/drawable/ic_category_cartoons.xml new file mode 100644 index 0000000..ae381f7 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_cartoons.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_christmas.xml b/app/src/main/res/drawable/ic_category_christmas.xml new file mode 100644 index 0000000..c1bbc0c --- /dev/null +++ b/app/src/main/res/drawable/ic_category_christmas.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_festivals.xml b/app/src/main/res/drawable/ic_category_festivals.xml new file mode 100644 index 0000000..ac0caaa --- /dev/null +++ b/app/src/main/res/drawable/ic_category_festivals.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_flowers.xml b/app/src/main/res/drawable/ic_category_flowers.xml new file mode 100644 index 0000000..8bc5c12 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_flowers.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_fruits.xml b/app/src/main/res/drawable/ic_category_fruits.xml new file mode 100644 index 0000000..420e820 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_fruits.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_general.xml b/app/src/main/res/drawable/ic_category_general.xml new file mode 100644 index 0000000..7768d99 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_general.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_mehndi.xml b/app/src/main/res/drawable/ic_category_mehndi.xml new file mode 100644 index 0000000..744cbdb --- /dev/null +++ b/app/src/main/res/drawable/ic_category_mehndi.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_nature.xml b/app/src/main/res/drawable/ic_category_nature.xml new file mode 100644 index 0000000..ec0aeb4 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_nature.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_properties.xml b/app/src/main/res/drawable/ic_category_properties.xml new file mode 100644 index 0000000..42af490 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_properties.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_rangoli.xml b/app/src/main/res/drawable/ic_category_rangoli.xml new file mode 100644 index 0000000..021a3c9 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_rangoli.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_sports.xml b/app/src/main/res/drawable/ic_category_sports.xml new file mode 100644 index 0000000..050c2d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_category_sports.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_category_vehicles.xml b/app/src/main/res/drawable/ic_category_vehicles.xml new file mode 100644 index 0000000..9ac580c --- /dev/null +++ b/app/src/main/res/drawable/ic_category_vehicles.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/icon_opacity_off.xml b/app/src/main/res/drawable/icon_opacity_off.xml new file mode 100644 index 0000000..6797c3c --- /dev/null +++ b/app/src/main/res/drawable/icon_opacity_off.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/icon_opacity_on.xml b/app/src/main/res/drawable/icon_opacity_on.xml new file mode 100644 index 0000000..d4d56ef --- /dev/null +++ b/app/src/main/res/drawable/icon_opacity_on.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/progress_splash_gradient.xml b/app/src/main/res/drawable/progress_splash_gradient.xml new file mode 100644 index 0000000..d5df1ff --- /dev/null +++ b/app/src/main/res/drawable/progress_splash_gradient.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/seekbar_progress.xml b/app/src/main/res/drawable/seekbar_progress.xml new file mode 100644 index 0000000..a6e501f --- /dev/null +++ b/app/src/main/res/drawable/seekbar_progress.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml new file mode 100644 index 0000000..216b1ce --- /dev/null +++ b/app/src/main/res/drawable/seekbar_thumb.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_category_circle.xml b/app/src/main/res/drawable/shape_category_circle.xml new file mode 100644 index 0000000..bd7417c --- /dev/null +++ b/app/src/main/res/drawable/shape_category_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_settings_circle.xml b/app/src/main/res/drawable/shape_settings_circle.xml new file mode 100644 index 0000000..838cd03 --- /dev/null +++ b/app/src/main/res/drawable/shape_settings_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/state_flash.xml b/app/src/main/res/drawable/state_flash.xml new file mode 100644 index 0000000..289e6b5 --- /dev/null +++ b/app/src/main/res/drawable/state_flash.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/state_opacity.xml b/app/src/main/res/drawable/state_opacity.xml new file mode 100644 index 0000000..5e6cfa1 --- /dev/null +++ b/app/src/main/res/drawable/state_opacity.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/tab_home.xml b/app/src/main/res/drawable/tab_home.xml new file mode 100644 index 0000000..087d6b1 --- /dev/null +++ b/app/src/main/res/drawable/tab_home.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_setting.xml b/app/src/main/res/drawable/tab_setting.xml new file mode 100644 index 0000000..7bea1ed --- /dev/null +++ b/app/src/main/res/drawable/tab_setting.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tool_bar_shape.xml b/app/src/main/res/drawable/tool_bar_shape.xml new file mode 100644 index 0000000..5820ada --- /dev/null +++ b/app/src/main/res/drawable/tool_bar_shape.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ar_camera.xml b/app/src/main/res/layout/activity_ar_camera.xml new file mode 100644 index 0000000..b7e4bee --- /dev/null +++ b/app/src/main/res/layout/activity_ar_camera.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_category_detail.xml b/app/src/main/res/layout/activity_category_detail.xml new file mode 100644 index 0000000..b890504 --- /dev/null +++ b/app/src/main/res/layout/activity_category_detail.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml new file mode 100644 index 0000000..dc7e870 --- /dev/null +++ b/app/src/main/res/layout/activity_dashboard.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml new file mode 100644 index 0000000..791f1e0 --- /dev/null +++ b/app/src/main/res/layout/activity_launch.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_rating.xml b/app/src/main/res/layout/dialog_rating.xml new file mode 100644 index 0000000..f44e93e --- /dev/null +++ b/app/src/main/res/layout/dialog_rating.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_explore.xml b/app/src/main/res/layout/fragment_explore.xml new file mode 100644 index 0000000..8e1a61a --- /dev/null +++ b/app/src/main/res/layout/fragment_explore.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_preferences.xml b/app/src/main/res/layout/fragment_preferences.xml new file mode 100644 index 0000000..0ec8891 --- /dev/null +++ b/app/src/main/res/layout/fragment_preferences.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_featured.xml b/app/src/main/res/layout/item_featured.xml new file mode 100644 index 0000000..b547418 --- /dev/null +++ b/app/src/main/res/layout/item_featured.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_sketch.xml b/app/src/main/res/layout/item_sketch.xml new file mode 100644 index 0000000..5ec3882 --- /dev/null +++ b/app/src/main/res/layout/item_sketch.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_sketch_category.xml b/app/src/main/res/layout/item_sketch_category.xml new file mode 100644 index 0000000..3796c42 --- /dev/null +++ b/app/src/main/res/layout/item_sketch_category.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_sketch_gallery.xml b/app/src/main/res/layout/item_sketch_gallery.xml new file mode 100644 index 0000000..cd80df0 --- /dev/null +++ b/app/src/main/res/layout/item_sketch_gallery.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_sketch_preview.xml b/app/src/main/res/layout/item_sketch_preview.xml new file mode 100644 index 0000000..f74fefc --- /dev/null +++ b/app/src/main/res/layout/item_sketch_preview.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_empty_state.xml b/app/src/main/res/layout/layout_empty_state.xml new file mode 100644 index 0000000..387d165 --- /dev/null +++ b/app/src/main/res/layout/layout_empty_state.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_tab_indicator.xml b/app/src/main/res/layout/layout_tab_indicator.xml new file mode 100644 index 0000000..e270253 --- /dev/null +++ b/app/src/main/res/layout/layout_tab_indicator.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/logo4.png b/app/src/main/res/mipmap-hdpi/logo4.png new file mode 100644 index 0000000..408a657 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/logo4.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/arrow_lef.png b/app/src/main/res/mipmap-xxxhdpi/arrow_lef.png new file mode 100644 index 0000000..99593a4 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/arrow_lef.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/arrow_left_white.png b/app/src/main/res/mipmap-xxxhdpi/arrow_left_white.png new file mode 100644 index 0000000..01d12db Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/arrow_left_white.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/flash_off.png b/app/src/main/res/mipmap-xxxhdpi/flash_off.png new file mode 100644 index 0000000..a066c18 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/flash_off.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/flash_on.png b/app/src/main/res/mipmap-xxxhdpi/flash_on.png new file mode 100644 index 0000000..991926b Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/flash_on.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_about.png b/app/src/main/res/mipmap-xxxhdpi/icon_about.png new file mode 100644 index 0000000..80c1d52 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_about.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_photo.png b/app/src/main/res/mipmap-xxxhdpi/icon_photo.png new file mode 100644 index 0000000..b68a4d1 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_photo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_set_off1.png b/app/src/main/res/mipmap-xxxhdpi/icon_set_off1.png new file mode 100644 index 0000000..511571d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_set_off1.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_set_on.png b/app/src/main/res/mipmap-xxxhdpi/icon_set_on.png new file mode 100644 index 0000000..2491f94 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_set_on.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_off1.png b/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_off1.png new file mode 100644 index 0000000..fc22345 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_off1.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_on.png b/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_on.png new file mode 100644 index 0000000..ab8c320 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_trace_draw_on.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/right.png b/app/src/main/res/mipmap-xxxhdpi/right.png new file mode 100644 index 0000000..880a44d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/right.png differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..b5e8761 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..13cfda1 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,58 @@ + + + + #FFFFFFFF + + + + #90CAF9 + #FFB3D9 + #FFE082 + + + #E8F4FF + #FFE5F0 + #FFF5E1 + #FAFBFF + + + #90CAF9 + + #64B5F6 + #FFB3D9 + + + #D9F0FC + #D0E8F7 + #5BAEE8 + + + #81C784 + #FFD54F + #FF8A80 + #AB47BC + #42A5F5 + + + #1A1A1A + #555555 + + + + + + + #303030 + + + + + + + #2C2C2C + #2C2C2C + #B3E5FC + #90CAF9 + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..e5584f2 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,38 @@ + + Ar Canvas + + See All + Sketch + Settings + + Settings + + Version + V%s + Please grant the relevant permissions and try again. + + The file must not exceed 4 MB, please try again. + Invalid image file, please try again. + Unsupported image format. Please select JPG or PNG. + Failed to read image, please try again. + + + Sketch + Trace in your space + Import Image + Featured + Categories + + + No Sketches Available + This category is currently empty.\nCheck back later for new content. + + + Rate Us + Rate Our App + If you enjoy using our app, please take a moment to rate us. It really helps! + Rate + Later + + Thank you for your feedback! + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..a9cc346 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,56 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/net.xml b/app/src/main/res/xml/net.xml new file mode 100644 index 0000000..69cc842 --- /dev/null +++ b/app/src/main/res/xml/net.xml @@ -0,0 +1,6 @@ + + + + mobile-server.lux-ad.com + + diff --git a/app/src/test/java/com/draw/painting/canvas/ExampleUnitTest.java b/app/src/test/java/com/draw/painting/canvas/ExampleUnitTest.java new file mode 100644 index 0000000..e377619 --- /dev/null +++ b/app/src/test/java/com/draw/painting/canvas/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.draw.painting.canvas; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..e2857c9 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,7 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("com.android.application") version "8.11.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.21" apply false + id("com.google.gms.google-services") version "4.4.4" apply false + id("com.google.firebase.crashlytics") version "3.0.6" apply false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..3e927b1 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b0bb7bc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 15 10:39:56 CST 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +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 + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + 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" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..dfa70ad --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,33 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + flatDir { + dirs("libs") + } + maven("https://jitpack.io") + // TradPlus + mavenCentral() + // Ironsource + maven("https://android-sdk.is.com/") + // Pangle + maven("https://artifact.bytedance.com/repository/pangle") + // Mintegral + //Launch GP market application, Android X Version + //If you fail to pull the code using gradle, add the maven warehouse configuration to the project root build.gradle file + maven("https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea") + + } +} + +rootProject.name = "ArCanvas" +include(":app") + \ No newline at end of file