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