diff --git a/app/ImageTraceAR.jks b/app/ImageTraceAR.jks new file mode 100644 index 0000000..a6cefe7 Binary files /dev/null and b/app/ImageTraceAR.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2556f00..655512b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,13 @@ +import java.text.SimpleDateFormat +import java.util.Date + plugins { alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } - +val timestamp: String = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { namespace = "com.ar.imagetracear" compileSdk = 35 @@ -11,14 +17,18 @@ android { minSdk = 23 targetSdk = 35 versionCode = 1 - versionName = "1.0" - + versionName = "1.0.0" + setProperty("archivesBaseName", "ImageTrace AR_V" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + buildFeatures { + viewBinding = true + } + buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -29,6 +39,9 @@ android { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } + kotlinOptions { + jvmTarget = "11" + } } dependencies { @@ -37,7 +50,129 @@ dependencies { implementation(libs.material) implementation(libs.activity) implementation(libs.constraintlayout) + implementation(libs.core.ktx) testImplementation(libs.junit) androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) + + implementation("com.github.bumptech.glide:glide:4.16.0") + annotationProcessor("com.github.bumptech.glide:compiler:4.16.0") + + implementation ("androidx.room:room-runtime:2.7.0") + annotationProcessor ("androidx.room:room-compiler:2.7.0") + + implementation ("androidx.camera:camera-core:1.4.2") + implementation ("androidx.camera:camera-lifecycle:1.4.2") + implementation ("androidx.camera:camera-view:1.4.2") + implementation ("androidx.camera:camera-extensions:1.4.2") + implementation ("androidx.camera:camera-camera2:1.4.2") + + //获取gaid + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + implementation("com.google.android.gms:play-services-appset:16.0.1") + //开启协程 + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + + + implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + + // Import the BoM for the Firebase platform + implementation(platform("com.google.firebase:firebase-bom:33.1.1")) + + // Add the dependencies for the Crashlytics and Analytics libraries + // When using the BoM, you don't specify versions in Firebase library dependencies + implementation("com.google.firebase:firebase-crashlytics") + implementation("com.google.firebase:firebase-analytics") + implementation("com.google.firebase:firebase-config") + + //-----------------------------------------------TopOn(Mintegral、Pangle、UnitAds、Digital Turbine(Fyber)、Chartboost&Helium、Ironsource、Liftoff(Vungle)、Inmobi、Start.io、Appnext、Bigo) + + //Anythink (Necessary) + implementation("com.anythink.sdk:core-tpn:6.4.07") + implementation("com.anythink.sdk:nativead-tpn:6.4.07") + implementation("com.anythink.sdk:banner-tpn:6.4.07") + implementation("com.anythink.sdk:interstitial-tpn:6.4.07") + implementation("com.anythink.sdk:rewardedvideo-tpn:6.4.07") + implementation("com.anythink.sdk:splash-tpn:6.4.07") + + //Androidx (Necessary) + implementation("androidx.appcompat:appcompat:1.1.0") + implementation("androidx.browser:browser:1.4.0") + + //StartApp + implementation("com.anythink.sdk:adapter-tpn-startapp:6.4.07") + implementation("com.startapp:inapp-sdk:5.0.2") + + //Appnext + implementation("com.anythink.sdk:adapter-tpn-appnext:6.4.07") + implementation("com.appnext.sdk:ads:2.7.1.473") + implementation("com.appnext.sdk:banners:2.7.1.473") + implementation("com.appnext.sdk:native-ads2:2.7.1.473") + implementation("com.appnext.sdk:actions:2.4.6.472") + implementation("androidx.constraintlayout:constraintlayout:2.0.4") + + //Vungle + implementation("com.anythink.sdk:adapter-tpn-vungle:6.4.07") + implementation("com.vungle:vungle-ads:7.4.0") + implementation("com.google.android.gms:play-services-basement:18.1.0") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + + //UnityAds + implementation("com.anythink.sdk:adapter-tpn-unityads:6.4.07") + implementation("com.unity3d.ads:unity-ads:4.12.2") + + //Ironsource + implementation("com.anythink.sdk:adapter-tpn-ironsource:6.4.07") + implementation("com.ironsource.sdk:mediationsdk:8.2.1") + implementation("com.google.android.gms:play-services-appset:16.0.2") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + implementation("com.google.android.gms:play-services-basement:18.1.0") + + //Bigo + implementation("com.anythink.sdk:adapter-tpn-bigo:6.4.07") + implementation("com.bigossp:bigo-ads:4.9.0") + + //Pangle + implementation("com.anythink.sdk:adapter-tpn-pangle-nonchina:6.4.07") + implementation("com.pangle.global:ads-sdk:6.1.0.9") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + + //Inmobi + implementation("com.anythink.sdk:adapter-tpn-inmobi:6.4.07") + implementation("com.inmobi.monetization:inmobi-ads-kotlin:10.7.5") + + //Mintegral + implementation("com.anythink.sdk:adapter-tpn-mintegral-nonchina:6.4.07") + implementation("com.mbridge.msdk.oversea:reward:16.8.11") + implementation("com.mbridge.msdk.oversea:newinterstitial:16.8.11") + implementation("com.mbridge.msdk.oversea:mbnative:16.8.11") + implementation("com.mbridge.msdk.oversea:mbnativeadvanced:16.8.11") + implementation("com.mbridge.msdk.oversea:mbsplash:16.8.11") + implementation("com.mbridge.msdk.oversea:mbbanner:16.8.11") + implementation("com.mbridge.msdk.oversea:mbbid:16.8.11") + implementation("androidx.recyclerview:recyclerview:1.1.0") + + //Chartboost + implementation("com.anythink.sdk:adapter-tpn-chartboost:6.4.07") + implementation("com.chartboost:chartboost-sdk:9.7.0") + implementation("com.chartboost:chartboost-mediation-sdk:4.9.1") + implementation("com.chartboost:chartboost-mediation-adapter-chartboost:4.9.7.0.0") + implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.10.0") + implementation("com.squareup.okhttp3:okhttp:4.10.0") + implementation("com.squareup.retrofit2:converter-scalars:2.9.0") + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") + + //Fyber + implementation("com.anythink.sdk:adapter-tpn-fyber:6.4.07") + implementation("com.fyber:marketplace-sdk:8.3.0") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + + // Debugger UI Tools +// implementation ("com.anythink.sdk:debugger-ui:1.1.0") + + //----------------------------------------------TopOn } \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..590a505 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "173897872671", + "project_id": "imagetrace-ar", + "storage_bucket": "imagetrace-ar.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:173897872671:android:e84c1f71ad448394f26c2a", + "android_client_info": { + "package_name": "com.ar.imagetracear" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAprQDlciW_iBDUHiM2kiEnErQ6-tvE6zM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..a797eab 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,147 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keepclassmembers class com.ar.imagetracear.MyApplication { + public static final java.lang.String DATABASE_NAME; + public static final int DATABASE_VERSION; +} + +-keepclassmembers class * { + @androidx.room.Query ; +} + +-keep class com.ar.imagetracear.database.AppDatabase { *; } +-keep class com.ar.imagetracear.database.ImageTraceEntry { *; } +-keep class com.ar.imagetracear.database.ImageTraceEntryDao { *; } + + +#---------------------------------------------Topon + -keep class com.startapp.** { + *; + } + + -keep class com.truenet.** { + *; + } + + -keepattributes Exceptions, InnerClasses, Signature, Deprecated, SourceFile, + LineNumberTable, *Annotation*, EnclosingMethod + -dontwarn android.webkit.JavascriptInterface + -dontwarn com.startapp.** + + -dontwarn org.jetbrains.annotations.** + -keep class com.appnext.** { *; } + -dontwarn com.appnext.** + # Vungle + -dontwarn com.vungle.ads.** + -keepclassmembers class com.vungle.ads.** { + *; + } + -keep class com.vungle.ads.** + + + + # Google + -keep class com.google.android.gms.** { *; } + -dontwarn com.google.android.gms.** + + + + + # START OkHttp + Okio + # JSR 305 annotations are for embedding nullability information. + -dontwarn javax.annotation.** + + + # A resource is loaded with a relative path so the package of this class must be preserved. + -adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz + + + # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. + -dontwarn org.codehaus.mojo.animal_sniffer.* + + + # OkHttp platform used only on JVM and when Conscrypt and other security providers are available. + -dontwarn okhttp3.internal.platform.** + -dontwarn org.conscrypt.** + -dontwarn org.bouncycastle.** + -dontwarn org.openjsse.** + + + # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. + -dontwarn org.codehaus.mojo.animal_sniffer.* + + + # END OkHttp + Okio + + + # START Protobuf + -dontwarn com.google.protobuf.** + -keepclassmembers class com.google.protobuf.** { + *; + } + -keep class * extends com.google.protobuf.GeneratedMessageLite { *; } + + + # END Protobuf + -keepclassmembers class com.ironsource.sdk.controller.IronSourceWebView$JSInterface { + public *; + } + -keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; + } + -keep public class com.google.android.gms.ads.** { + public *; + } + -keep class com.ironsource.adapters.** { *; + } + -dontwarn com.ironsource.mediationsdk.** + -dontwarn com.ironsource.adapters.** + -keepattributes JavascriptInterface + -keepclassmembers class * { + @android.webkit.JavascriptInterface ; + } + -keep class com.bytedance.sdk.** { *; } + -keep class com.inmobi.** { *; } + -keep public class com.google.android.gms.** + -dontwarn com.google.android.gms.** + -dontwarn com.squareup.picasso.** + -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient{ + public *; + } + -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info{ + public *; + } + # skip the Picasso library classes + -keep class com.squareup.picasso.** {*;} + -dontwarn com.squareup.okhttp.** + # skip Moat classes + -keep class com.moat.** {*;} + -dontwarn com.moat.** + # skip IAB classes + -keep class com.iab.** {*;} + -dontwarn com.iab.** + -keepattributes Signature + -keepattributes *Annotation* + -keep class com.mbridge.** {*; } + -keep interface com.mbridge.** {*; } + -keep class android.support.v4.** { *; } + -dontwarn com.mbridge.** + -keep class **.R$* { public static final int mbridge*; } + -keep public class com.mbridge.* extends androidx.** { *; } + -keep public class androidx.viewpager.widget.PagerAdapter{ *; } + -keep public class androidx.viewpager.widget.ViewPager.OnPageChangeListener{ *; } + -keep interface androidx.annotation.IntDef{ *; } + -keep interface androidx.annotation.Nullable{ *; } + -keep interface androidx.annotation.CheckResult{ *; } + -keep interface androidx.annotation.NonNull{ *; } + -keep public class androidx.fragment.app.Fragment{ *; } + -keep public class androidx.core.content.FileProvider{ *; } + -keep public class androidx.core.app.NotificationCompat{ *; } + -keep public class androidx.appcompat.widget.AppCompatImageView { *; } + -keep public class androidx.recyclerview.*{ *; } + -keep class com.chartboost.** { *; } + + #---------------------------------------------Topon \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c3b1064..e52c893 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,18 +2,45 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/assets/png_Animals/1.jpg b/app/src/main/assets/png_Animals/1.jpg new file mode 100644 index 0000000..9488c65 Binary files /dev/null and b/app/src/main/assets/png_Animals/1.jpg differ diff --git a/app/src/main/assets/png_Animals/10.jpg b/app/src/main/assets/png_Animals/10.jpg new file mode 100644 index 0000000..78382a4 Binary files /dev/null and b/app/src/main/assets/png_Animals/10.jpg differ diff --git a/app/src/main/assets/png_Animals/11.jpg b/app/src/main/assets/png_Animals/11.jpg new file mode 100644 index 0000000..a4f7512 Binary files /dev/null and b/app/src/main/assets/png_Animals/11.jpg differ diff --git a/app/src/main/assets/png_Animals/12.jpg b/app/src/main/assets/png_Animals/12.jpg new file mode 100644 index 0000000..bab3cff Binary files /dev/null and b/app/src/main/assets/png_Animals/12.jpg differ diff --git a/app/src/main/assets/png_Animals/13.jpg b/app/src/main/assets/png_Animals/13.jpg new file mode 100644 index 0000000..5c3ef19 Binary files /dev/null and b/app/src/main/assets/png_Animals/13.jpg differ diff --git a/app/src/main/assets/png_Animals/14.jpg b/app/src/main/assets/png_Animals/14.jpg new file mode 100644 index 0000000..8b446f2 Binary files /dev/null and b/app/src/main/assets/png_Animals/14.jpg differ diff --git a/app/src/main/assets/png_Animals/15.jpg b/app/src/main/assets/png_Animals/15.jpg new file mode 100644 index 0000000..2f9dc4e Binary files /dev/null and b/app/src/main/assets/png_Animals/15.jpg differ diff --git a/app/src/main/assets/png_Animals/16.jpg b/app/src/main/assets/png_Animals/16.jpg new file mode 100644 index 0000000..aad9788 Binary files /dev/null and b/app/src/main/assets/png_Animals/16.jpg differ diff --git a/app/src/main/assets/png_Animals/17.jpg b/app/src/main/assets/png_Animals/17.jpg new file mode 100644 index 0000000..17c6f07 Binary files /dev/null and b/app/src/main/assets/png_Animals/17.jpg differ diff --git a/app/src/main/assets/png_Animals/18.jpg b/app/src/main/assets/png_Animals/18.jpg new file mode 100644 index 0000000..2ce93a7 Binary files /dev/null and b/app/src/main/assets/png_Animals/18.jpg differ diff --git a/app/src/main/assets/png_Animals/19.jpg b/app/src/main/assets/png_Animals/19.jpg new file mode 100644 index 0000000..2b24f31 Binary files /dev/null and b/app/src/main/assets/png_Animals/19.jpg differ diff --git a/app/src/main/assets/png_Animals/2.jpg b/app/src/main/assets/png_Animals/2.jpg new file mode 100644 index 0000000..0a0c2e7 Binary files /dev/null and b/app/src/main/assets/png_Animals/2.jpg differ diff --git a/app/src/main/assets/png_Animals/20.jpg b/app/src/main/assets/png_Animals/20.jpg new file mode 100644 index 0000000..347cddc Binary files /dev/null and b/app/src/main/assets/png_Animals/20.jpg differ diff --git a/app/src/main/assets/png_Animals/21.jpg b/app/src/main/assets/png_Animals/21.jpg new file mode 100644 index 0000000..5a04764 Binary files /dev/null and b/app/src/main/assets/png_Animals/21.jpg differ diff --git a/app/src/main/assets/png_Animals/22.jpg b/app/src/main/assets/png_Animals/22.jpg new file mode 100644 index 0000000..c18d8ad Binary files /dev/null and b/app/src/main/assets/png_Animals/22.jpg differ diff --git a/app/src/main/assets/png_Animals/23.jpg b/app/src/main/assets/png_Animals/23.jpg new file mode 100644 index 0000000..4270d19 Binary files /dev/null and b/app/src/main/assets/png_Animals/23.jpg differ diff --git a/app/src/main/assets/png_Animals/24.jpg b/app/src/main/assets/png_Animals/24.jpg new file mode 100644 index 0000000..355a944 Binary files /dev/null and b/app/src/main/assets/png_Animals/24.jpg differ diff --git a/app/src/main/assets/png_Animals/25.jpg b/app/src/main/assets/png_Animals/25.jpg new file mode 100644 index 0000000..c670943 Binary files /dev/null and b/app/src/main/assets/png_Animals/25.jpg differ diff --git a/app/src/main/assets/png_Animals/26.jpg b/app/src/main/assets/png_Animals/26.jpg new file mode 100644 index 0000000..4b95b01 Binary files /dev/null and b/app/src/main/assets/png_Animals/26.jpg differ diff --git a/app/src/main/assets/png_Animals/27.jpg b/app/src/main/assets/png_Animals/27.jpg new file mode 100644 index 0000000..87a8c12 Binary files /dev/null and b/app/src/main/assets/png_Animals/27.jpg differ diff --git a/app/src/main/assets/png_Animals/28.jpg b/app/src/main/assets/png_Animals/28.jpg new file mode 100644 index 0000000..770686a Binary files /dev/null and b/app/src/main/assets/png_Animals/28.jpg differ diff --git a/app/src/main/assets/png_Animals/29.jpg b/app/src/main/assets/png_Animals/29.jpg new file mode 100644 index 0000000..7127a11 Binary files /dev/null and b/app/src/main/assets/png_Animals/29.jpg differ diff --git a/app/src/main/assets/png_Animals/3.jpg b/app/src/main/assets/png_Animals/3.jpg new file mode 100644 index 0000000..4bf4897 Binary files /dev/null and b/app/src/main/assets/png_Animals/3.jpg differ diff --git a/app/src/main/assets/png_Animals/30.jpg b/app/src/main/assets/png_Animals/30.jpg new file mode 100644 index 0000000..f1d2047 Binary files /dev/null and b/app/src/main/assets/png_Animals/30.jpg differ diff --git a/app/src/main/assets/png_Animals/31.jpg b/app/src/main/assets/png_Animals/31.jpg new file mode 100644 index 0000000..0d08aa8 Binary files /dev/null and b/app/src/main/assets/png_Animals/31.jpg differ diff --git a/app/src/main/assets/png_Animals/4.jpg b/app/src/main/assets/png_Animals/4.jpg new file mode 100644 index 0000000..838c582 Binary files /dev/null and b/app/src/main/assets/png_Animals/4.jpg differ diff --git a/app/src/main/assets/png_Animals/5.jpg b/app/src/main/assets/png_Animals/5.jpg new file mode 100644 index 0000000..36bd2bf Binary files /dev/null and b/app/src/main/assets/png_Animals/5.jpg differ diff --git a/app/src/main/assets/png_Animals/6.jpg b/app/src/main/assets/png_Animals/6.jpg new file mode 100644 index 0000000..dceb49b Binary files /dev/null and b/app/src/main/assets/png_Animals/6.jpg differ diff --git a/app/src/main/assets/png_Animals/7.jpg b/app/src/main/assets/png_Animals/7.jpg new file mode 100644 index 0000000..ebd4694 Binary files /dev/null and b/app/src/main/assets/png_Animals/7.jpg differ diff --git a/app/src/main/assets/png_Animals/8.jpg b/app/src/main/assets/png_Animals/8.jpg new file mode 100644 index 0000000..e5e3c63 Binary files /dev/null and b/app/src/main/assets/png_Animals/8.jpg differ diff --git a/app/src/main/assets/png_Animals/9.jpg b/app/src/main/assets/png_Animals/9.jpg new file mode 100644 index 0000000..e7a1862 Binary files /dev/null and b/app/src/main/assets/png_Animals/9.jpg differ diff --git a/app/src/main/assets/png_Birds/1.jpg b/app/src/main/assets/png_Birds/1.jpg new file mode 100644 index 0000000..d235225 Binary files /dev/null and b/app/src/main/assets/png_Birds/1.jpg differ diff --git a/app/src/main/assets/png_Birds/10.jpg b/app/src/main/assets/png_Birds/10.jpg new file mode 100644 index 0000000..e348ffe Binary files /dev/null and b/app/src/main/assets/png_Birds/10.jpg differ diff --git a/app/src/main/assets/png_Birds/11.jpg b/app/src/main/assets/png_Birds/11.jpg new file mode 100644 index 0000000..921b5b9 Binary files /dev/null and b/app/src/main/assets/png_Birds/11.jpg differ diff --git a/app/src/main/assets/png_Birds/12.jpg b/app/src/main/assets/png_Birds/12.jpg new file mode 100644 index 0000000..7b4055b Binary files /dev/null and b/app/src/main/assets/png_Birds/12.jpg differ diff --git a/app/src/main/assets/png_Birds/13.jpg b/app/src/main/assets/png_Birds/13.jpg new file mode 100644 index 0000000..021b7a4 Binary files /dev/null and b/app/src/main/assets/png_Birds/13.jpg differ diff --git a/app/src/main/assets/png_Birds/14.jpg b/app/src/main/assets/png_Birds/14.jpg new file mode 100644 index 0000000..2074c6f Binary files /dev/null and b/app/src/main/assets/png_Birds/14.jpg differ diff --git a/app/src/main/assets/png_Birds/15.jpg b/app/src/main/assets/png_Birds/15.jpg new file mode 100644 index 0000000..59b0e47 Binary files /dev/null and b/app/src/main/assets/png_Birds/15.jpg differ diff --git a/app/src/main/assets/png_Birds/16.jpg b/app/src/main/assets/png_Birds/16.jpg new file mode 100644 index 0000000..fe950d1 Binary files /dev/null and b/app/src/main/assets/png_Birds/16.jpg differ diff --git a/app/src/main/assets/png_Birds/17.jpg b/app/src/main/assets/png_Birds/17.jpg new file mode 100644 index 0000000..484f39a Binary files /dev/null and b/app/src/main/assets/png_Birds/17.jpg differ diff --git a/app/src/main/assets/png_Birds/18.jpg b/app/src/main/assets/png_Birds/18.jpg new file mode 100644 index 0000000..2792ed1 Binary files /dev/null and b/app/src/main/assets/png_Birds/18.jpg differ diff --git a/app/src/main/assets/png_Birds/19.jpg b/app/src/main/assets/png_Birds/19.jpg new file mode 100644 index 0000000..9e9bb27 Binary files /dev/null and b/app/src/main/assets/png_Birds/19.jpg differ diff --git a/app/src/main/assets/png_Birds/2.jpg b/app/src/main/assets/png_Birds/2.jpg new file mode 100644 index 0000000..0929272 Binary files /dev/null and b/app/src/main/assets/png_Birds/2.jpg differ diff --git a/app/src/main/assets/png_Birds/3.jpg b/app/src/main/assets/png_Birds/3.jpg new file mode 100644 index 0000000..1376a50 Binary files /dev/null and b/app/src/main/assets/png_Birds/3.jpg differ diff --git a/app/src/main/assets/png_Birds/4.jpg b/app/src/main/assets/png_Birds/4.jpg new file mode 100644 index 0000000..1cd8f9c Binary files /dev/null and b/app/src/main/assets/png_Birds/4.jpg differ diff --git a/app/src/main/assets/png_Birds/5.jpg b/app/src/main/assets/png_Birds/5.jpg new file mode 100644 index 0000000..7637589 Binary files /dev/null and b/app/src/main/assets/png_Birds/5.jpg differ diff --git a/app/src/main/assets/png_Birds/6.jpg b/app/src/main/assets/png_Birds/6.jpg new file mode 100644 index 0000000..3bf16b6 Binary files /dev/null and b/app/src/main/assets/png_Birds/6.jpg differ diff --git a/app/src/main/assets/png_Birds/7.jpg b/app/src/main/assets/png_Birds/7.jpg new file mode 100644 index 0000000..076e51d Binary files /dev/null and b/app/src/main/assets/png_Birds/7.jpg differ diff --git a/app/src/main/assets/png_Birds/8.jpg b/app/src/main/assets/png_Birds/8.jpg new file mode 100644 index 0000000..71f5cf7 Binary files /dev/null and b/app/src/main/assets/png_Birds/8.jpg differ diff --git a/app/src/main/assets/png_Birds/9.jpg b/app/src/main/assets/png_Birds/9.jpg new file mode 100644 index 0000000..8767032 Binary files /dev/null and b/app/src/main/assets/png_Birds/9.jpg differ diff --git a/app/src/main/assets/png_Butterfly/1.jpg b/app/src/main/assets/png_Butterfly/1.jpg new file mode 100644 index 0000000..0d713b7 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/1.jpg differ diff --git a/app/src/main/assets/png_Butterfly/10.jpg b/app/src/main/assets/png_Butterfly/10.jpg new file mode 100644 index 0000000..ae497c8 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/10.jpg differ diff --git a/app/src/main/assets/png_Butterfly/11.jpg b/app/src/main/assets/png_Butterfly/11.jpg new file mode 100644 index 0000000..d2e39ef Binary files /dev/null and b/app/src/main/assets/png_Butterfly/11.jpg differ diff --git a/app/src/main/assets/png_Butterfly/12.jpg b/app/src/main/assets/png_Butterfly/12.jpg new file mode 100644 index 0000000..410af7c Binary files /dev/null and b/app/src/main/assets/png_Butterfly/12.jpg differ diff --git a/app/src/main/assets/png_Butterfly/13.jpg b/app/src/main/assets/png_Butterfly/13.jpg new file mode 100644 index 0000000..233a998 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/13.jpg differ diff --git a/app/src/main/assets/png_Butterfly/14.jpg b/app/src/main/assets/png_Butterfly/14.jpg new file mode 100644 index 0000000..9545c0f Binary files /dev/null and b/app/src/main/assets/png_Butterfly/14.jpg differ diff --git a/app/src/main/assets/png_Butterfly/15.jpg b/app/src/main/assets/png_Butterfly/15.jpg new file mode 100644 index 0000000..aa0da5b Binary files /dev/null and b/app/src/main/assets/png_Butterfly/15.jpg differ diff --git a/app/src/main/assets/png_Butterfly/16.jpg b/app/src/main/assets/png_Butterfly/16.jpg new file mode 100644 index 0000000..4b118cf Binary files /dev/null and b/app/src/main/assets/png_Butterfly/16.jpg differ diff --git a/app/src/main/assets/png_Butterfly/17.jpg b/app/src/main/assets/png_Butterfly/17.jpg new file mode 100644 index 0000000..ebfdc2e Binary files /dev/null and b/app/src/main/assets/png_Butterfly/17.jpg differ diff --git a/app/src/main/assets/png_Butterfly/18.jpg b/app/src/main/assets/png_Butterfly/18.jpg new file mode 100644 index 0000000..7b81ca1 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/18.jpg differ diff --git a/app/src/main/assets/png_Butterfly/19.jpg b/app/src/main/assets/png_Butterfly/19.jpg new file mode 100644 index 0000000..903fd82 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/19.jpg differ diff --git a/app/src/main/assets/png_Butterfly/2.jpg b/app/src/main/assets/png_Butterfly/2.jpg new file mode 100644 index 0000000..f92c438 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/2.jpg differ diff --git a/app/src/main/assets/png_Butterfly/20.jpg b/app/src/main/assets/png_Butterfly/20.jpg new file mode 100644 index 0000000..7d0dc2e Binary files /dev/null and b/app/src/main/assets/png_Butterfly/20.jpg differ diff --git a/app/src/main/assets/png_Butterfly/21.jpg b/app/src/main/assets/png_Butterfly/21.jpg new file mode 100644 index 0000000..ff82d93 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/21.jpg differ diff --git a/app/src/main/assets/png_Butterfly/3.jpg b/app/src/main/assets/png_Butterfly/3.jpg new file mode 100644 index 0000000..5251134 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/3.jpg differ diff --git a/app/src/main/assets/png_Butterfly/4.jpg b/app/src/main/assets/png_Butterfly/4.jpg new file mode 100644 index 0000000..01d5932 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/4.jpg differ diff --git a/app/src/main/assets/png_Butterfly/5.jpg b/app/src/main/assets/png_Butterfly/5.jpg new file mode 100644 index 0000000..cc99ed5 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/5.jpg differ diff --git a/app/src/main/assets/png_Butterfly/6.jpg b/app/src/main/assets/png_Butterfly/6.jpg new file mode 100644 index 0000000..6d02805 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/6.jpg differ diff --git a/app/src/main/assets/png_Butterfly/7.jpg b/app/src/main/assets/png_Butterfly/7.jpg new file mode 100644 index 0000000..dd52dbd Binary files /dev/null and b/app/src/main/assets/png_Butterfly/7.jpg differ diff --git a/app/src/main/assets/png_Butterfly/8.jpg b/app/src/main/assets/png_Butterfly/8.jpg new file mode 100644 index 0000000..d519ca7 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/8.jpg differ diff --git a/app/src/main/assets/png_Butterfly/9.jpg b/app/src/main/assets/png_Butterfly/9.jpg new file mode 100644 index 0000000..0cedb47 Binary files /dev/null and b/app/src/main/assets/png_Butterfly/9.jpg differ diff --git a/app/src/main/assets/png_Cafe/1.jpg b/app/src/main/assets/png_Cafe/1.jpg new file mode 100644 index 0000000..b347b44 Binary files /dev/null and b/app/src/main/assets/png_Cafe/1.jpg differ diff --git a/app/src/main/assets/png_Cafe/10.jpg b/app/src/main/assets/png_Cafe/10.jpg new file mode 100644 index 0000000..3728490 Binary files /dev/null and b/app/src/main/assets/png_Cafe/10.jpg differ diff --git a/app/src/main/assets/png_Cafe/11.jpg b/app/src/main/assets/png_Cafe/11.jpg new file mode 100644 index 0000000..bff21e1 Binary files /dev/null and b/app/src/main/assets/png_Cafe/11.jpg differ diff --git a/app/src/main/assets/png_Cafe/12.jpg b/app/src/main/assets/png_Cafe/12.jpg new file mode 100644 index 0000000..3966d4a Binary files /dev/null and b/app/src/main/assets/png_Cafe/12.jpg differ diff --git a/app/src/main/assets/png_Cafe/13.jpg b/app/src/main/assets/png_Cafe/13.jpg new file mode 100644 index 0000000..8200e12 Binary files /dev/null and b/app/src/main/assets/png_Cafe/13.jpg differ diff --git a/app/src/main/assets/png_Cafe/14.jpg b/app/src/main/assets/png_Cafe/14.jpg new file mode 100644 index 0000000..65ee383 Binary files /dev/null and b/app/src/main/assets/png_Cafe/14.jpg differ diff --git a/app/src/main/assets/png_Cafe/15.jpg b/app/src/main/assets/png_Cafe/15.jpg new file mode 100644 index 0000000..01df5e5 Binary files /dev/null and b/app/src/main/assets/png_Cafe/15.jpg differ diff --git a/app/src/main/assets/png_Cafe/16.jpg b/app/src/main/assets/png_Cafe/16.jpg new file mode 100644 index 0000000..ff679c1 Binary files /dev/null and b/app/src/main/assets/png_Cafe/16.jpg differ diff --git a/app/src/main/assets/png_Cafe/17.jpg b/app/src/main/assets/png_Cafe/17.jpg new file mode 100644 index 0000000..42fdf87 Binary files /dev/null and b/app/src/main/assets/png_Cafe/17.jpg differ diff --git a/app/src/main/assets/png_Cafe/18.jpg b/app/src/main/assets/png_Cafe/18.jpg new file mode 100644 index 0000000..06d300e Binary files /dev/null and b/app/src/main/assets/png_Cafe/18.jpg differ diff --git a/app/src/main/assets/png_Cafe/19.jpg b/app/src/main/assets/png_Cafe/19.jpg new file mode 100644 index 0000000..42aaa2c Binary files /dev/null and b/app/src/main/assets/png_Cafe/19.jpg differ diff --git a/app/src/main/assets/png_Cafe/2.jpg b/app/src/main/assets/png_Cafe/2.jpg new file mode 100644 index 0000000..14d9b25 Binary files /dev/null and b/app/src/main/assets/png_Cafe/2.jpg differ diff --git a/app/src/main/assets/png_Cafe/20.jpg b/app/src/main/assets/png_Cafe/20.jpg new file mode 100644 index 0000000..5dad84c Binary files /dev/null and b/app/src/main/assets/png_Cafe/20.jpg differ diff --git a/app/src/main/assets/png_Cafe/21.jpg b/app/src/main/assets/png_Cafe/21.jpg new file mode 100644 index 0000000..c019faa Binary files /dev/null and b/app/src/main/assets/png_Cafe/21.jpg differ diff --git a/app/src/main/assets/png_Cafe/22.jpg b/app/src/main/assets/png_Cafe/22.jpg new file mode 100644 index 0000000..28cdc4e Binary files /dev/null and b/app/src/main/assets/png_Cafe/22.jpg differ diff --git a/app/src/main/assets/png_Cafe/23.jpg b/app/src/main/assets/png_Cafe/23.jpg new file mode 100644 index 0000000..973a5c2 Binary files /dev/null and b/app/src/main/assets/png_Cafe/23.jpg differ diff --git a/app/src/main/assets/png_Cafe/24.jpg b/app/src/main/assets/png_Cafe/24.jpg new file mode 100644 index 0000000..3c36d8a Binary files /dev/null and b/app/src/main/assets/png_Cafe/24.jpg differ diff --git a/app/src/main/assets/png_Cafe/25.jpg b/app/src/main/assets/png_Cafe/25.jpg new file mode 100644 index 0000000..c7be496 Binary files /dev/null and b/app/src/main/assets/png_Cafe/25.jpg differ diff --git a/app/src/main/assets/png_Cafe/26.jpg b/app/src/main/assets/png_Cafe/26.jpg new file mode 100644 index 0000000..7229696 Binary files /dev/null and b/app/src/main/assets/png_Cafe/26.jpg differ diff --git a/app/src/main/assets/png_Cafe/27.jpg b/app/src/main/assets/png_Cafe/27.jpg new file mode 100644 index 0000000..f857542 Binary files /dev/null and b/app/src/main/assets/png_Cafe/27.jpg differ diff --git a/app/src/main/assets/png_Cafe/28.jpg b/app/src/main/assets/png_Cafe/28.jpg new file mode 100644 index 0000000..8cde6de Binary files /dev/null and b/app/src/main/assets/png_Cafe/28.jpg differ diff --git a/app/src/main/assets/png_Cafe/29.jpg b/app/src/main/assets/png_Cafe/29.jpg new file mode 100644 index 0000000..8affd30 Binary files /dev/null and b/app/src/main/assets/png_Cafe/29.jpg differ diff --git a/app/src/main/assets/png_Cafe/3.jpg b/app/src/main/assets/png_Cafe/3.jpg new file mode 100644 index 0000000..b1c3cfa Binary files /dev/null and b/app/src/main/assets/png_Cafe/3.jpg differ diff --git a/app/src/main/assets/png_Cafe/30.jpg b/app/src/main/assets/png_Cafe/30.jpg new file mode 100644 index 0000000..f71ce84 Binary files /dev/null and b/app/src/main/assets/png_Cafe/30.jpg differ diff --git a/app/src/main/assets/png_Cafe/31.jpg b/app/src/main/assets/png_Cafe/31.jpg new file mode 100644 index 0000000..a5d22ca Binary files /dev/null and b/app/src/main/assets/png_Cafe/31.jpg differ diff --git a/app/src/main/assets/png_Cafe/32.jpg b/app/src/main/assets/png_Cafe/32.jpg new file mode 100644 index 0000000..8513a5e Binary files /dev/null and b/app/src/main/assets/png_Cafe/32.jpg differ diff --git a/app/src/main/assets/png_Cafe/33.jpg b/app/src/main/assets/png_Cafe/33.jpg new file mode 100644 index 0000000..fcdcbcc Binary files /dev/null and b/app/src/main/assets/png_Cafe/33.jpg differ diff --git a/app/src/main/assets/png_Cafe/34.jpg b/app/src/main/assets/png_Cafe/34.jpg new file mode 100644 index 0000000..51bbf4b Binary files /dev/null and b/app/src/main/assets/png_Cafe/34.jpg differ diff --git a/app/src/main/assets/png_Cafe/35.jpg b/app/src/main/assets/png_Cafe/35.jpg new file mode 100644 index 0000000..e1067da Binary files /dev/null and b/app/src/main/assets/png_Cafe/35.jpg differ diff --git a/app/src/main/assets/png_Cafe/36.jpg b/app/src/main/assets/png_Cafe/36.jpg new file mode 100644 index 0000000..181a84a Binary files /dev/null and b/app/src/main/assets/png_Cafe/36.jpg differ diff --git a/app/src/main/assets/png_Cafe/37.jpg b/app/src/main/assets/png_Cafe/37.jpg new file mode 100644 index 0000000..d8ffb00 Binary files /dev/null and b/app/src/main/assets/png_Cafe/37.jpg differ diff --git a/app/src/main/assets/png_Cafe/38.jpg b/app/src/main/assets/png_Cafe/38.jpg new file mode 100644 index 0000000..abdba50 Binary files /dev/null and b/app/src/main/assets/png_Cafe/38.jpg differ diff --git a/app/src/main/assets/png_Cafe/4.jpg b/app/src/main/assets/png_Cafe/4.jpg new file mode 100644 index 0000000..8792f16 Binary files /dev/null and b/app/src/main/assets/png_Cafe/4.jpg differ diff --git a/app/src/main/assets/png_Cafe/5.jpg b/app/src/main/assets/png_Cafe/5.jpg new file mode 100644 index 0000000..89630aa Binary files /dev/null and b/app/src/main/assets/png_Cafe/5.jpg differ diff --git a/app/src/main/assets/png_Cafe/6.jpg b/app/src/main/assets/png_Cafe/6.jpg new file mode 100644 index 0000000..7e6832e Binary files /dev/null and b/app/src/main/assets/png_Cafe/6.jpg differ diff --git a/app/src/main/assets/png_Cafe/7.jpg b/app/src/main/assets/png_Cafe/7.jpg new file mode 100644 index 0000000..f4d2afb Binary files /dev/null and b/app/src/main/assets/png_Cafe/7.jpg differ diff --git a/app/src/main/assets/png_Cafe/8.jpg b/app/src/main/assets/png_Cafe/8.jpg new file mode 100644 index 0000000..78f5ccf Binary files /dev/null and b/app/src/main/assets/png_Cafe/8.jpg differ diff --git a/app/src/main/assets/png_Cafe/9.jpg b/app/src/main/assets/png_Cafe/9.jpg new file mode 100644 index 0000000..4038bb5 Binary files /dev/null and b/app/src/main/assets/png_Cafe/9.jpg differ diff --git a/app/src/main/assets/png_Cartoons/1.jpg b/app/src/main/assets/png_Cartoons/1.jpg new file mode 100644 index 0000000..74bf123 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/1.jpg differ diff --git a/app/src/main/assets/png_Cartoons/10.jpg b/app/src/main/assets/png_Cartoons/10.jpg new file mode 100644 index 0000000..450fa6e Binary files /dev/null and b/app/src/main/assets/png_Cartoons/10.jpg differ diff --git a/app/src/main/assets/png_Cartoons/11.jpg b/app/src/main/assets/png_Cartoons/11.jpg new file mode 100644 index 0000000..1f2a904 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/11.jpg differ diff --git a/app/src/main/assets/png_Cartoons/12.jpg b/app/src/main/assets/png_Cartoons/12.jpg new file mode 100644 index 0000000..86ef206 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/12.jpg differ diff --git a/app/src/main/assets/png_Cartoons/13.jpg b/app/src/main/assets/png_Cartoons/13.jpg new file mode 100644 index 0000000..92e1d75 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/13.jpg differ diff --git a/app/src/main/assets/png_Cartoons/14.jpg b/app/src/main/assets/png_Cartoons/14.jpg new file mode 100644 index 0000000..c82e897 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/14.jpg differ diff --git a/app/src/main/assets/png_Cartoons/15.jpg b/app/src/main/assets/png_Cartoons/15.jpg new file mode 100644 index 0000000..bcd8678 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/15.jpg differ diff --git a/app/src/main/assets/png_Cartoons/16.jpg b/app/src/main/assets/png_Cartoons/16.jpg new file mode 100644 index 0000000..18377bd Binary files /dev/null and b/app/src/main/assets/png_Cartoons/16.jpg differ diff --git a/app/src/main/assets/png_Cartoons/17.jpg b/app/src/main/assets/png_Cartoons/17.jpg new file mode 100644 index 0000000..45aafbb Binary files /dev/null and b/app/src/main/assets/png_Cartoons/17.jpg differ diff --git a/app/src/main/assets/png_Cartoons/18.jpg b/app/src/main/assets/png_Cartoons/18.jpg new file mode 100644 index 0000000..048d253 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/18.jpg differ diff --git a/app/src/main/assets/png_Cartoons/19.jpg b/app/src/main/assets/png_Cartoons/19.jpg new file mode 100644 index 0000000..c2501b2 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/19.jpg differ diff --git a/app/src/main/assets/png_Cartoons/2.jpg b/app/src/main/assets/png_Cartoons/2.jpg new file mode 100644 index 0000000..8baf95b Binary files /dev/null and b/app/src/main/assets/png_Cartoons/2.jpg differ diff --git a/app/src/main/assets/png_Cartoons/20.jpg b/app/src/main/assets/png_Cartoons/20.jpg new file mode 100644 index 0000000..fb7901c Binary files /dev/null and b/app/src/main/assets/png_Cartoons/20.jpg differ diff --git a/app/src/main/assets/png_Cartoons/21.jpg b/app/src/main/assets/png_Cartoons/21.jpg new file mode 100644 index 0000000..ed7104e Binary files /dev/null and b/app/src/main/assets/png_Cartoons/21.jpg differ diff --git a/app/src/main/assets/png_Cartoons/22.jpg b/app/src/main/assets/png_Cartoons/22.jpg new file mode 100644 index 0000000..cd003eb Binary files /dev/null and b/app/src/main/assets/png_Cartoons/22.jpg differ diff --git a/app/src/main/assets/png_Cartoons/23.jpg b/app/src/main/assets/png_Cartoons/23.jpg new file mode 100644 index 0000000..77b49a4 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/23.jpg differ diff --git a/app/src/main/assets/png_Cartoons/24.jpg b/app/src/main/assets/png_Cartoons/24.jpg new file mode 100644 index 0000000..1c7dc65 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/24.jpg differ diff --git a/app/src/main/assets/png_Cartoons/25.jpg b/app/src/main/assets/png_Cartoons/25.jpg new file mode 100644 index 0000000..442aec2 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/25.jpg differ diff --git a/app/src/main/assets/png_Cartoons/26.jpg b/app/src/main/assets/png_Cartoons/26.jpg new file mode 100644 index 0000000..ec4a2ff Binary files /dev/null and b/app/src/main/assets/png_Cartoons/26.jpg differ diff --git a/app/src/main/assets/png_Cartoons/3.jpg b/app/src/main/assets/png_Cartoons/3.jpg new file mode 100644 index 0000000..e099902 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/3.jpg differ diff --git a/app/src/main/assets/png_Cartoons/4.jpg b/app/src/main/assets/png_Cartoons/4.jpg new file mode 100644 index 0000000..a4c69ba Binary files /dev/null and b/app/src/main/assets/png_Cartoons/4.jpg differ diff --git a/app/src/main/assets/png_Cartoons/5.jpg b/app/src/main/assets/png_Cartoons/5.jpg new file mode 100644 index 0000000..b32485d Binary files /dev/null and b/app/src/main/assets/png_Cartoons/5.jpg differ diff --git a/app/src/main/assets/png_Cartoons/6.jpg b/app/src/main/assets/png_Cartoons/6.jpg new file mode 100644 index 0000000..0e0a7ef Binary files /dev/null and b/app/src/main/assets/png_Cartoons/6.jpg differ diff --git a/app/src/main/assets/png_Cartoons/7.jpg b/app/src/main/assets/png_Cartoons/7.jpg new file mode 100644 index 0000000..ecd8dc0 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/7.jpg differ diff --git a/app/src/main/assets/png_Cartoons/8.jpg b/app/src/main/assets/png_Cartoons/8.jpg new file mode 100644 index 0000000..f6ea587 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/8.jpg differ diff --git a/app/src/main/assets/png_Cartoons/9.jpg b/app/src/main/assets/png_Cartoons/9.jpg new file mode 100644 index 0000000..da4c151 Binary files /dev/null and b/app/src/main/assets/png_Cartoons/9.jpg differ diff --git a/app/src/main/assets/png_Christmas/1.jpg b/app/src/main/assets/png_Christmas/1.jpg new file mode 100644 index 0000000..cc1fafb Binary files /dev/null and b/app/src/main/assets/png_Christmas/1.jpg differ diff --git a/app/src/main/assets/png_Christmas/10.jpg b/app/src/main/assets/png_Christmas/10.jpg new file mode 100644 index 0000000..e5e63d6 Binary files /dev/null and b/app/src/main/assets/png_Christmas/10.jpg differ diff --git a/app/src/main/assets/png_Christmas/11.jpg b/app/src/main/assets/png_Christmas/11.jpg new file mode 100644 index 0000000..cae5d66 Binary files /dev/null and b/app/src/main/assets/png_Christmas/11.jpg differ diff --git a/app/src/main/assets/png_Christmas/12.jpg b/app/src/main/assets/png_Christmas/12.jpg new file mode 100644 index 0000000..13fd21f Binary files /dev/null and b/app/src/main/assets/png_Christmas/12.jpg differ diff --git a/app/src/main/assets/png_Christmas/13.jpg b/app/src/main/assets/png_Christmas/13.jpg new file mode 100644 index 0000000..1fa30fe Binary files /dev/null and b/app/src/main/assets/png_Christmas/13.jpg differ diff --git a/app/src/main/assets/png_Christmas/14.jpg b/app/src/main/assets/png_Christmas/14.jpg new file mode 100644 index 0000000..aec6dcf Binary files /dev/null and b/app/src/main/assets/png_Christmas/14.jpg differ diff --git a/app/src/main/assets/png_Christmas/15.jpg b/app/src/main/assets/png_Christmas/15.jpg new file mode 100644 index 0000000..647c8b6 Binary files /dev/null and b/app/src/main/assets/png_Christmas/15.jpg differ diff --git a/app/src/main/assets/png_Christmas/16.jpg b/app/src/main/assets/png_Christmas/16.jpg new file mode 100644 index 0000000..b36a79c Binary files /dev/null and b/app/src/main/assets/png_Christmas/16.jpg differ diff --git a/app/src/main/assets/png_Christmas/17.jpg b/app/src/main/assets/png_Christmas/17.jpg new file mode 100644 index 0000000..2655af2 Binary files /dev/null and b/app/src/main/assets/png_Christmas/17.jpg differ diff --git a/app/src/main/assets/png_Christmas/18.jpg b/app/src/main/assets/png_Christmas/18.jpg new file mode 100644 index 0000000..e784d64 Binary files /dev/null and b/app/src/main/assets/png_Christmas/18.jpg differ diff --git a/app/src/main/assets/png_Christmas/19.jpg b/app/src/main/assets/png_Christmas/19.jpg new file mode 100644 index 0000000..fcf2085 Binary files /dev/null and b/app/src/main/assets/png_Christmas/19.jpg differ diff --git a/app/src/main/assets/png_Christmas/2.jpg b/app/src/main/assets/png_Christmas/2.jpg new file mode 100644 index 0000000..326e86b Binary files /dev/null and b/app/src/main/assets/png_Christmas/2.jpg differ diff --git a/app/src/main/assets/png_Christmas/20.jpg b/app/src/main/assets/png_Christmas/20.jpg new file mode 100644 index 0000000..a9e3c89 Binary files /dev/null and b/app/src/main/assets/png_Christmas/20.jpg differ diff --git a/app/src/main/assets/png_Christmas/21.jpg b/app/src/main/assets/png_Christmas/21.jpg new file mode 100644 index 0000000..71b4150 Binary files /dev/null and b/app/src/main/assets/png_Christmas/21.jpg differ diff --git a/app/src/main/assets/png_Christmas/22.jpg b/app/src/main/assets/png_Christmas/22.jpg new file mode 100644 index 0000000..3c99d0d Binary files /dev/null and b/app/src/main/assets/png_Christmas/22.jpg differ diff --git a/app/src/main/assets/png_Christmas/23.jpg b/app/src/main/assets/png_Christmas/23.jpg new file mode 100644 index 0000000..32c3b03 Binary files /dev/null and b/app/src/main/assets/png_Christmas/23.jpg differ diff --git a/app/src/main/assets/png_Christmas/24.jpg b/app/src/main/assets/png_Christmas/24.jpg new file mode 100644 index 0000000..80fd836 Binary files /dev/null and b/app/src/main/assets/png_Christmas/24.jpg differ diff --git a/app/src/main/assets/png_Christmas/25.jpg b/app/src/main/assets/png_Christmas/25.jpg new file mode 100644 index 0000000..8e2bef6 Binary files /dev/null and b/app/src/main/assets/png_Christmas/25.jpg differ diff --git a/app/src/main/assets/png_Christmas/3.jpg b/app/src/main/assets/png_Christmas/3.jpg new file mode 100644 index 0000000..4c24cd2 Binary files /dev/null and b/app/src/main/assets/png_Christmas/3.jpg differ diff --git a/app/src/main/assets/png_Christmas/4.jpg b/app/src/main/assets/png_Christmas/4.jpg new file mode 100644 index 0000000..28fb1b0 Binary files /dev/null and b/app/src/main/assets/png_Christmas/4.jpg differ diff --git a/app/src/main/assets/png_Christmas/5.jpg b/app/src/main/assets/png_Christmas/5.jpg new file mode 100644 index 0000000..93ad555 Binary files /dev/null and b/app/src/main/assets/png_Christmas/5.jpg differ diff --git a/app/src/main/assets/png_Christmas/6.jpg b/app/src/main/assets/png_Christmas/6.jpg new file mode 100644 index 0000000..02fe302 Binary files /dev/null and b/app/src/main/assets/png_Christmas/6.jpg differ diff --git a/app/src/main/assets/png_Christmas/7.jpg b/app/src/main/assets/png_Christmas/7.jpg new file mode 100644 index 0000000..dc41982 Binary files /dev/null and b/app/src/main/assets/png_Christmas/7.jpg differ diff --git a/app/src/main/assets/png_Christmas/8.jpg b/app/src/main/assets/png_Christmas/8.jpg new file mode 100644 index 0000000..5f13019 Binary files /dev/null and b/app/src/main/assets/png_Christmas/8.jpg differ diff --git a/app/src/main/assets/png_Christmas/9.jpg b/app/src/main/assets/png_Christmas/9.jpg new file mode 100644 index 0000000..e556980 Binary files /dev/null and b/app/src/main/assets/png_Christmas/9.jpg differ diff --git a/app/src/main/assets/png_Festivals/1.jpg b/app/src/main/assets/png_Festivals/1.jpg new file mode 100644 index 0000000..125d632 Binary files /dev/null and b/app/src/main/assets/png_Festivals/1.jpg differ diff --git a/app/src/main/assets/png_Festivals/10.jpg b/app/src/main/assets/png_Festivals/10.jpg new file mode 100644 index 0000000..d17b9f1 Binary files /dev/null and b/app/src/main/assets/png_Festivals/10.jpg differ diff --git a/app/src/main/assets/png_Festivals/11.jpg b/app/src/main/assets/png_Festivals/11.jpg new file mode 100644 index 0000000..702f052 Binary files /dev/null and b/app/src/main/assets/png_Festivals/11.jpg differ diff --git a/app/src/main/assets/png_Festivals/12.jpg b/app/src/main/assets/png_Festivals/12.jpg new file mode 100644 index 0000000..6f231e1 Binary files /dev/null and b/app/src/main/assets/png_Festivals/12.jpg differ diff --git a/app/src/main/assets/png_Festivals/13.jpg b/app/src/main/assets/png_Festivals/13.jpg new file mode 100644 index 0000000..20556a1 Binary files /dev/null and b/app/src/main/assets/png_Festivals/13.jpg differ diff --git a/app/src/main/assets/png_Festivals/14.jpg b/app/src/main/assets/png_Festivals/14.jpg new file mode 100644 index 0000000..fb78127 Binary files /dev/null and b/app/src/main/assets/png_Festivals/14.jpg differ diff --git a/app/src/main/assets/png_Festivals/15.jpg b/app/src/main/assets/png_Festivals/15.jpg new file mode 100644 index 0000000..e74f47e Binary files /dev/null and b/app/src/main/assets/png_Festivals/15.jpg differ diff --git a/app/src/main/assets/png_Festivals/16.jpg b/app/src/main/assets/png_Festivals/16.jpg new file mode 100644 index 0000000..136f6e8 Binary files /dev/null and b/app/src/main/assets/png_Festivals/16.jpg differ diff --git a/app/src/main/assets/png_Festivals/17.jpg b/app/src/main/assets/png_Festivals/17.jpg new file mode 100644 index 0000000..fd50e67 Binary files /dev/null and b/app/src/main/assets/png_Festivals/17.jpg differ diff --git a/app/src/main/assets/png_Festivals/18.jpg b/app/src/main/assets/png_Festivals/18.jpg new file mode 100644 index 0000000..d3f7936 Binary files /dev/null and b/app/src/main/assets/png_Festivals/18.jpg differ diff --git a/app/src/main/assets/png_Festivals/19.jpg b/app/src/main/assets/png_Festivals/19.jpg new file mode 100644 index 0000000..9a4f1b8 Binary files /dev/null and b/app/src/main/assets/png_Festivals/19.jpg differ diff --git a/app/src/main/assets/png_Festivals/2.jpg b/app/src/main/assets/png_Festivals/2.jpg new file mode 100644 index 0000000..84aa31a Binary files /dev/null and b/app/src/main/assets/png_Festivals/2.jpg differ diff --git a/app/src/main/assets/png_Festivals/20.jpg b/app/src/main/assets/png_Festivals/20.jpg new file mode 100644 index 0000000..268c943 Binary files /dev/null and b/app/src/main/assets/png_Festivals/20.jpg differ diff --git a/app/src/main/assets/png_Festivals/21.jpg b/app/src/main/assets/png_Festivals/21.jpg new file mode 100644 index 0000000..614bffd Binary files /dev/null and b/app/src/main/assets/png_Festivals/21.jpg differ diff --git a/app/src/main/assets/png_Festivals/22.jpg b/app/src/main/assets/png_Festivals/22.jpg new file mode 100644 index 0000000..f81eb8d Binary files /dev/null and b/app/src/main/assets/png_Festivals/22.jpg differ diff --git a/app/src/main/assets/png_Festivals/3.jpg b/app/src/main/assets/png_Festivals/3.jpg new file mode 100644 index 0000000..5ca2b11 Binary files /dev/null and b/app/src/main/assets/png_Festivals/3.jpg differ diff --git a/app/src/main/assets/png_Festivals/4.jpg b/app/src/main/assets/png_Festivals/4.jpg new file mode 100644 index 0000000..1f8cc81 Binary files /dev/null and b/app/src/main/assets/png_Festivals/4.jpg differ diff --git a/app/src/main/assets/png_Festivals/5.jpg b/app/src/main/assets/png_Festivals/5.jpg new file mode 100644 index 0000000..7f1bd1a Binary files /dev/null and b/app/src/main/assets/png_Festivals/5.jpg differ diff --git a/app/src/main/assets/png_Festivals/6.jpg b/app/src/main/assets/png_Festivals/6.jpg new file mode 100644 index 0000000..9cf832a Binary files /dev/null and b/app/src/main/assets/png_Festivals/6.jpg differ diff --git a/app/src/main/assets/png_Festivals/7.jpg b/app/src/main/assets/png_Festivals/7.jpg new file mode 100644 index 0000000..dcd83f3 Binary files /dev/null and b/app/src/main/assets/png_Festivals/7.jpg differ diff --git a/app/src/main/assets/png_Festivals/8.jpg b/app/src/main/assets/png_Festivals/8.jpg new file mode 100644 index 0000000..1117f09 Binary files /dev/null and b/app/src/main/assets/png_Festivals/8.jpg differ diff --git a/app/src/main/assets/png_Festivals/9.jpg b/app/src/main/assets/png_Festivals/9.jpg new file mode 100644 index 0000000..39d8467 Binary files /dev/null and b/app/src/main/assets/png_Festivals/9.jpg differ diff --git a/app/src/main/assets/png_Flowers/1.jpg b/app/src/main/assets/png_Flowers/1.jpg new file mode 100644 index 0000000..217d9c8 Binary files /dev/null and b/app/src/main/assets/png_Flowers/1.jpg differ diff --git a/app/src/main/assets/png_Flowers/10.jpg b/app/src/main/assets/png_Flowers/10.jpg new file mode 100644 index 0000000..ba84e61 Binary files /dev/null and b/app/src/main/assets/png_Flowers/10.jpg differ diff --git a/app/src/main/assets/png_Flowers/11.jpg b/app/src/main/assets/png_Flowers/11.jpg new file mode 100644 index 0000000..e579753 Binary files /dev/null and b/app/src/main/assets/png_Flowers/11.jpg differ diff --git a/app/src/main/assets/png_Flowers/12.jpg b/app/src/main/assets/png_Flowers/12.jpg new file mode 100644 index 0000000..26092f9 Binary files /dev/null and b/app/src/main/assets/png_Flowers/12.jpg differ diff --git a/app/src/main/assets/png_Flowers/13.jpg b/app/src/main/assets/png_Flowers/13.jpg new file mode 100644 index 0000000..41d2df3 Binary files /dev/null and b/app/src/main/assets/png_Flowers/13.jpg differ diff --git a/app/src/main/assets/png_Flowers/14.jpg b/app/src/main/assets/png_Flowers/14.jpg new file mode 100644 index 0000000..c44df66 Binary files /dev/null and b/app/src/main/assets/png_Flowers/14.jpg differ diff --git a/app/src/main/assets/png_Flowers/15.jpg b/app/src/main/assets/png_Flowers/15.jpg new file mode 100644 index 0000000..ea34d36 Binary files /dev/null and b/app/src/main/assets/png_Flowers/15.jpg differ diff --git a/app/src/main/assets/png_Flowers/16.jpg b/app/src/main/assets/png_Flowers/16.jpg new file mode 100644 index 0000000..506beb1 Binary files /dev/null and b/app/src/main/assets/png_Flowers/16.jpg differ diff --git a/app/src/main/assets/png_Flowers/17.jpg b/app/src/main/assets/png_Flowers/17.jpg new file mode 100644 index 0000000..3764b21 Binary files /dev/null and b/app/src/main/assets/png_Flowers/17.jpg differ diff --git a/app/src/main/assets/png_Flowers/18.jpg b/app/src/main/assets/png_Flowers/18.jpg new file mode 100644 index 0000000..a759ab6 Binary files /dev/null and b/app/src/main/assets/png_Flowers/18.jpg differ diff --git a/app/src/main/assets/png_Flowers/19.jpg b/app/src/main/assets/png_Flowers/19.jpg new file mode 100644 index 0000000..e8c2a84 Binary files /dev/null and b/app/src/main/assets/png_Flowers/19.jpg differ diff --git a/app/src/main/assets/png_Flowers/2.jpg b/app/src/main/assets/png_Flowers/2.jpg new file mode 100644 index 0000000..fb7e56f Binary files /dev/null and b/app/src/main/assets/png_Flowers/2.jpg differ diff --git a/app/src/main/assets/png_Flowers/20.jpg b/app/src/main/assets/png_Flowers/20.jpg new file mode 100644 index 0000000..93e5408 Binary files /dev/null and b/app/src/main/assets/png_Flowers/20.jpg differ diff --git a/app/src/main/assets/png_Flowers/21.jpg b/app/src/main/assets/png_Flowers/21.jpg new file mode 100644 index 0000000..4fa3a77 Binary files /dev/null and b/app/src/main/assets/png_Flowers/21.jpg differ diff --git a/app/src/main/assets/png_Flowers/22.jpg b/app/src/main/assets/png_Flowers/22.jpg new file mode 100644 index 0000000..6f45df7 Binary files /dev/null and b/app/src/main/assets/png_Flowers/22.jpg differ diff --git a/app/src/main/assets/png_Flowers/23.jpg b/app/src/main/assets/png_Flowers/23.jpg new file mode 100644 index 0000000..46e806d Binary files /dev/null and b/app/src/main/assets/png_Flowers/23.jpg differ diff --git a/app/src/main/assets/png_Flowers/3.jpg b/app/src/main/assets/png_Flowers/3.jpg new file mode 100644 index 0000000..22a741c Binary files /dev/null and b/app/src/main/assets/png_Flowers/3.jpg differ diff --git a/app/src/main/assets/png_Flowers/4.jpg b/app/src/main/assets/png_Flowers/4.jpg new file mode 100644 index 0000000..dd0a30f Binary files /dev/null and b/app/src/main/assets/png_Flowers/4.jpg differ diff --git a/app/src/main/assets/png_Flowers/5.jpg b/app/src/main/assets/png_Flowers/5.jpg new file mode 100644 index 0000000..9dcb4f5 Binary files /dev/null and b/app/src/main/assets/png_Flowers/5.jpg differ diff --git a/app/src/main/assets/png_Flowers/6.jpg b/app/src/main/assets/png_Flowers/6.jpg new file mode 100644 index 0000000..cdf1f65 Binary files /dev/null and b/app/src/main/assets/png_Flowers/6.jpg differ diff --git a/app/src/main/assets/png_Flowers/7.jpg b/app/src/main/assets/png_Flowers/7.jpg new file mode 100644 index 0000000..caab990 Binary files /dev/null and b/app/src/main/assets/png_Flowers/7.jpg differ diff --git a/app/src/main/assets/png_Flowers/8.jpg b/app/src/main/assets/png_Flowers/8.jpg new file mode 100644 index 0000000..c43832b Binary files /dev/null and b/app/src/main/assets/png_Flowers/8.jpg differ diff --git a/app/src/main/assets/png_Flowers/9.jpg b/app/src/main/assets/png_Flowers/9.jpg new file mode 100644 index 0000000..5b78ee1 Binary files /dev/null and b/app/src/main/assets/png_Flowers/9.jpg differ diff --git a/app/src/main/assets/png_Fruits/1.jpg b/app/src/main/assets/png_Fruits/1.jpg new file mode 100644 index 0000000..767c0b4 Binary files /dev/null and b/app/src/main/assets/png_Fruits/1.jpg differ diff --git a/app/src/main/assets/png_Fruits/10.jpg b/app/src/main/assets/png_Fruits/10.jpg new file mode 100644 index 0000000..95bdbca Binary files /dev/null and b/app/src/main/assets/png_Fruits/10.jpg differ diff --git a/app/src/main/assets/png_Fruits/11.jpg b/app/src/main/assets/png_Fruits/11.jpg new file mode 100644 index 0000000..b0bb89a Binary files /dev/null and b/app/src/main/assets/png_Fruits/11.jpg differ diff --git a/app/src/main/assets/png_Fruits/12.jpg b/app/src/main/assets/png_Fruits/12.jpg new file mode 100644 index 0000000..c1d9bad Binary files /dev/null and b/app/src/main/assets/png_Fruits/12.jpg differ diff --git a/app/src/main/assets/png_Fruits/13.jpg b/app/src/main/assets/png_Fruits/13.jpg new file mode 100644 index 0000000..f44fb86 Binary files /dev/null and b/app/src/main/assets/png_Fruits/13.jpg differ diff --git a/app/src/main/assets/png_Fruits/14.jpg b/app/src/main/assets/png_Fruits/14.jpg new file mode 100644 index 0000000..459a60c Binary files /dev/null and b/app/src/main/assets/png_Fruits/14.jpg differ diff --git a/app/src/main/assets/png_Fruits/15.jpg b/app/src/main/assets/png_Fruits/15.jpg new file mode 100644 index 0000000..a4e4abe Binary files /dev/null and b/app/src/main/assets/png_Fruits/15.jpg differ diff --git a/app/src/main/assets/png_Fruits/16.jpg b/app/src/main/assets/png_Fruits/16.jpg new file mode 100644 index 0000000..33a7a9a Binary files /dev/null and b/app/src/main/assets/png_Fruits/16.jpg differ diff --git a/app/src/main/assets/png_Fruits/17.jpg b/app/src/main/assets/png_Fruits/17.jpg new file mode 100644 index 0000000..c193b1e Binary files /dev/null and b/app/src/main/assets/png_Fruits/17.jpg differ diff --git a/app/src/main/assets/png_Fruits/18.jpg b/app/src/main/assets/png_Fruits/18.jpg new file mode 100644 index 0000000..f0ca248 Binary files /dev/null and b/app/src/main/assets/png_Fruits/18.jpg differ diff --git a/app/src/main/assets/png_Fruits/19.jpg b/app/src/main/assets/png_Fruits/19.jpg new file mode 100644 index 0000000..d93dfde Binary files /dev/null and b/app/src/main/assets/png_Fruits/19.jpg differ diff --git a/app/src/main/assets/png_Fruits/2.jpg b/app/src/main/assets/png_Fruits/2.jpg new file mode 100644 index 0000000..b32f9f5 Binary files /dev/null and b/app/src/main/assets/png_Fruits/2.jpg differ diff --git a/app/src/main/assets/png_Fruits/20.jpg b/app/src/main/assets/png_Fruits/20.jpg new file mode 100644 index 0000000..cc3fe93 Binary files /dev/null and b/app/src/main/assets/png_Fruits/20.jpg differ diff --git a/app/src/main/assets/png_Fruits/21.jpg b/app/src/main/assets/png_Fruits/21.jpg new file mode 100644 index 0000000..c1813eb Binary files /dev/null and b/app/src/main/assets/png_Fruits/21.jpg differ diff --git a/app/src/main/assets/png_Fruits/22.jpg b/app/src/main/assets/png_Fruits/22.jpg new file mode 100644 index 0000000..47387e1 Binary files /dev/null and b/app/src/main/assets/png_Fruits/22.jpg differ diff --git a/app/src/main/assets/png_Fruits/23.jpg b/app/src/main/assets/png_Fruits/23.jpg new file mode 100644 index 0000000..7f173ec Binary files /dev/null and b/app/src/main/assets/png_Fruits/23.jpg differ diff --git a/app/src/main/assets/png_Fruits/24.jpg b/app/src/main/assets/png_Fruits/24.jpg new file mode 100644 index 0000000..a7ae235 Binary files /dev/null and b/app/src/main/assets/png_Fruits/24.jpg differ diff --git a/app/src/main/assets/png_Fruits/25.jpg b/app/src/main/assets/png_Fruits/25.jpg new file mode 100644 index 0000000..dd664bb Binary files /dev/null and b/app/src/main/assets/png_Fruits/25.jpg differ diff --git a/app/src/main/assets/png_Fruits/26.jpg b/app/src/main/assets/png_Fruits/26.jpg new file mode 100644 index 0000000..c8e4723 Binary files /dev/null and b/app/src/main/assets/png_Fruits/26.jpg differ diff --git a/app/src/main/assets/png_Fruits/27.jpg b/app/src/main/assets/png_Fruits/27.jpg new file mode 100644 index 0000000..816337d Binary files /dev/null and b/app/src/main/assets/png_Fruits/27.jpg differ diff --git a/app/src/main/assets/png_Fruits/28.jpg b/app/src/main/assets/png_Fruits/28.jpg new file mode 100644 index 0000000..29973d5 Binary files /dev/null and b/app/src/main/assets/png_Fruits/28.jpg differ diff --git a/app/src/main/assets/png_Fruits/29.jpg b/app/src/main/assets/png_Fruits/29.jpg new file mode 100644 index 0000000..4f0750f Binary files /dev/null and b/app/src/main/assets/png_Fruits/29.jpg differ diff --git a/app/src/main/assets/png_Fruits/3.jpg b/app/src/main/assets/png_Fruits/3.jpg new file mode 100644 index 0000000..f57893b Binary files /dev/null and b/app/src/main/assets/png_Fruits/3.jpg differ diff --git a/app/src/main/assets/png_Fruits/30.jpg b/app/src/main/assets/png_Fruits/30.jpg new file mode 100644 index 0000000..cfd117a Binary files /dev/null and b/app/src/main/assets/png_Fruits/30.jpg differ diff --git a/app/src/main/assets/png_Fruits/31.jpg b/app/src/main/assets/png_Fruits/31.jpg new file mode 100644 index 0000000..b59a7c5 Binary files /dev/null and b/app/src/main/assets/png_Fruits/31.jpg differ diff --git a/app/src/main/assets/png_Fruits/32.jpg b/app/src/main/assets/png_Fruits/32.jpg new file mode 100644 index 0000000..8f70790 Binary files /dev/null and b/app/src/main/assets/png_Fruits/32.jpg differ diff --git a/app/src/main/assets/png_Fruits/33.jpg b/app/src/main/assets/png_Fruits/33.jpg new file mode 100644 index 0000000..373b142 Binary files /dev/null and b/app/src/main/assets/png_Fruits/33.jpg differ diff --git a/app/src/main/assets/png_Fruits/34.jpg b/app/src/main/assets/png_Fruits/34.jpg new file mode 100644 index 0000000..c5beb91 Binary files /dev/null and b/app/src/main/assets/png_Fruits/34.jpg differ diff --git a/app/src/main/assets/png_Fruits/35.jpg b/app/src/main/assets/png_Fruits/35.jpg new file mode 100644 index 0000000..79cd667 Binary files /dev/null and b/app/src/main/assets/png_Fruits/35.jpg differ diff --git a/app/src/main/assets/png_Fruits/36.jpg b/app/src/main/assets/png_Fruits/36.jpg new file mode 100644 index 0000000..c0cb185 Binary files /dev/null and b/app/src/main/assets/png_Fruits/36.jpg differ diff --git a/app/src/main/assets/png_Fruits/37.jpg b/app/src/main/assets/png_Fruits/37.jpg new file mode 100644 index 0000000..ba1b245 Binary files /dev/null and b/app/src/main/assets/png_Fruits/37.jpg differ diff --git a/app/src/main/assets/png_Fruits/38.jpg b/app/src/main/assets/png_Fruits/38.jpg new file mode 100644 index 0000000..c7eccb8 Binary files /dev/null and b/app/src/main/assets/png_Fruits/38.jpg differ diff --git a/app/src/main/assets/png_Fruits/39.jpg b/app/src/main/assets/png_Fruits/39.jpg new file mode 100644 index 0000000..bc95aaa Binary files /dev/null and b/app/src/main/assets/png_Fruits/39.jpg differ diff --git a/app/src/main/assets/png_Fruits/4.jpg b/app/src/main/assets/png_Fruits/4.jpg new file mode 100644 index 0000000..2d7465d Binary files /dev/null and b/app/src/main/assets/png_Fruits/4.jpg differ diff --git a/app/src/main/assets/png_Fruits/5.jpg b/app/src/main/assets/png_Fruits/5.jpg new file mode 100644 index 0000000..8ed633f Binary files /dev/null and b/app/src/main/assets/png_Fruits/5.jpg differ diff --git a/app/src/main/assets/png_Fruits/6.jpg b/app/src/main/assets/png_Fruits/6.jpg new file mode 100644 index 0000000..06ce330 Binary files /dev/null and b/app/src/main/assets/png_Fruits/6.jpg differ diff --git a/app/src/main/assets/png_Fruits/7.jpg b/app/src/main/assets/png_Fruits/7.jpg new file mode 100644 index 0000000..6153618 Binary files /dev/null and b/app/src/main/assets/png_Fruits/7.jpg differ diff --git a/app/src/main/assets/png_Fruits/8.jpg b/app/src/main/assets/png_Fruits/8.jpg new file mode 100644 index 0000000..e333f0f Binary files /dev/null and b/app/src/main/assets/png_Fruits/8.jpg differ diff --git a/app/src/main/assets/png_Fruits/9.jpg b/app/src/main/assets/png_Fruits/9.jpg new file mode 100644 index 0000000..d549d15 Binary files /dev/null and b/app/src/main/assets/png_Fruits/9.jpg differ diff --git a/app/src/main/assets/png_General/1.jpg b/app/src/main/assets/png_General/1.jpg new file mode 100644 index 0000000..eb7c14b Binary files /dev/null and b/app/src/main/assets/png_General/1.jpg differ diff --git a/app/src/main/assets/png_General/10.jpg b/app/src/main/assets/png_General/10.jpg new file mode 100644 index 0000000..eacd298 Binary files /dev/null and b/app/src/main/assets/png_General/10.jpg differ diff --git a/app/src/main/assets/png_General/11.jpg b/app/src/main/assets/png_General/11.jpg new file mode 100644 index 0000000..273a876 Binary files /dev/null and b/app/src/main/assets/png_General/11.jpg differ diff --git a/app/src/main/assets/png_General/12.jpg b/app/src/main/assets/png_General/12.jpg new file mode 100644 index 0000000..5d786c5 Binary files /dev/null and b/app/src/main/assets/png_General/12.jpg differ diff --git a/app/src/main/assets/png_General/13.jpg b/app/src/main/assets/png_General/13.jpg new file mode 100644 index 0000000..486441a Binary files /dev/null and b/app/src/main/assets/png_General/13.jpg differ diff --git a/app/src/main/assets/png_General/14.jpg b/app/src/main/assets/png_General/14.jpg new file mode 100644 index 0000000..c36516b Binary files /dev/null and b/app/src/main/assets/png_General/14.jpg differ diff --git a/app/src/main/assets/png_General/15.jpg b/app/src/main/assets/png_General/15.jpg new file mode 100644 index 0000000..9d19fdf Binary files /dev/null and b/app/src/main/assets/png_General/15.jpg differ diff --git a/app/src/main/assets/png_General/2.jpg b/app/src/main/assets/png_General/2.jpg new file mode 100644 index 0000000..090d5d5 Binary files /dev/null and b/app/src/main/assets/png_General/2.jpg differ diff --git a/app/src/main/assets/png_General/3.jpg b/app/src/main/assets/png_General/3.jpg new file mode 100644 index 0000000..a17f1b2 Binary files /dev/null and b/app/src/main/assets/png_General/3.jpg differ diff --git a/app/src/main/assets/png_General/4.jpg b/app/src/main/assets/png_General/4.jpg new file mode 100644 index 0000000..2f4d8a2 Binary files /dev/null and b/app/src/main/assets/png_General/4.jpg differ diff --git a/app/src/main/assets/png_General/5.jpg b/app/src/main/assets/png_General/5.jpg new file mode 100644 index 0000000..8ac1cdb Binary files /dev/null and b/app/src/main/assets/png_General/5.jpg differ diff --git a/app/src/main/assets/png_General/6.jpg b/app/src/main/assets/png_General/6.jpg new file mode 100644 index 0000000..95cc582 Binary files /dev/null and b/app/src/main/assets/png_General/6.jpg differ diff --git a/app/src/main/assets/png_General/7.jpg b/app/src/main/assets/png_General/7.jpg new file mode 100644 index 0000000..91cbcfd Binary files /dev/null and b/app/src/main/assets/png_General/7.jpg differ diff --git a/app/src/main/assets/png_General/8.jpg b/app/src/main/assets/png_General/8.jpg new file mode 100644 index 0000000..af8da73 Binary files /dev/null and b/app/src/main/assets/png_General/8.jpg differ diff --git a/app/src/main/assets/png_General/9.jpg b/app/src/main/assets/png_General/9.jpg new file mode 100644 index 0000000..d5cfb72 Binary files /dev/null and b/app/src/main/assets/png_General/9.jpg differ diff --git a/app/src/main/assets/png_Mehndi/1.jpg b/app/src/main/assets/png_Mehndi/1.jpg new file mode 100644 index 0000000..8dd8843 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/1.jpg differ diff --git a/app/src/main/assets/png_Mehndi/10.jpg b/app/src/main/assets/png_Mehndi/10.jpg new file mode 100644 index 0000000..2432a79 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/10.jpg differ diff --git a/app/src/main/assets/png_Mehndi/11.jpg b/app/src/main/assets/png_Mehndi/11.jpg new file mode 100644 index 0000000..aba85bf Binary files /dev/null and b/app/src/main/assets/png_Mehndi/11.jpg differ diff --git a/app/src/main/assets/png_Mehndi/12.jpg b/app/src/main/assets/png_Mehndi/12.jpg new file mode 100644 index 0000000..f71ae22 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/12.jpg differ diff --git a/app/src/main/assets/png_Mehndi/2.jpg b/app/src/main/assets/png_Mehndi/2.jpg new file mode 100644 index 0000000..0f56bf7 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/2.jpg differ diff --git a/app/src/main/assets/png_Mehndi/3.jpg b/app/src/main/assets/png_Mehndi/3.jpg new file mode 100644 index 0000000..2bc7b69 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/3.jpg differ diff --git a/app/src/main/assets/png_Mehndi/4.jpg b/app/src/main/assets/png_Mehndi/4.jpg new file mode 100644 index 0000000..6fc3f70 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/4.jpg differ diff --git a/app/src/main/assets/png_Mehndi/5.jpg b/app/src/main/assets/png_Mehndi/5.jpg new file mode 100644 index 0000000..dccb5cf Binary files /dev/null and b/app/src/main/assets/png_Mehndi/5.jpg differ diff --git a/app/src/main/assets/png_Mehndi/6.jpg b/app/src/main/assets/png_Mehndi/6.jpg new file mode 100644 index 0000000..4e052dd Binary files /dev/null and b/app/src/main/assets/png_Mehndi/6.jpg differ diff --git a/app/src/main/assets/png_Mehndi/7.jpg b/app/src/main/assets/png_Mehndi/7.jpg new file mode 100644 index 0000000..021e789 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/7.jpg differ diff --git a/app/src/main/assets/png_Mehndi/8.jpg b/app/src/main/assets/png_Mehndi/8.jpg new file mode 100644 index 0000000..dd45b50 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/8.jpg differ diff --git a/app/src/main/assets/png_Mehndi/9.jpg b/app/src/main/assets/png_Mehndi/9.jpg new file mode 100644 index 0000000..6ff2300 Binary files /dev/null and b/app/src/main/assets/png_Mehndi/9.jpg differ diff --git a/app/src/main/assets/png_Nature/1.jpg b/app/src/main/assets/png_Nature/1.jpg new file mode 100644 index 0000000..22c00e3 Binary files /dev/null and b/app/src/main/assets/png_Nature/1.jpg differ diff --git a/app/src/main/assets/png_Nature/10.jpg b/app/src/main/assets/png_Nature/10.jpg new file mode 100644 index 0000000..65aab09 Binary files /dev/null and b/app/src/main/assets/png_Nature/10.jpg differ diff --git a/app/src/main/assets/png_Nature/11.jpg b/app/src/main/assets/png_Nature/11.jpg new file mode 100644 index 0000000..23c6653 Binary files /dev/null and b/app/src/main/assets/png_Nature/11.jpg differ diff --git a/app/src/main/assets/png_Nature/12.jpg b/app/src/main/assets/png_Nature/12.jpg new file mode 100644 index 0000000..36e1835 Binary files /dev/null and b/app/src/main/assets/png_Nature/12.jpg differ diff --git a/app/src/main/assets/png_Nature/13.jpg b/app/src/main/assets/png_Nature/13.jpg new file mode 100644 index 0000000..5816b61 Binary files /dev/null and b/app/src/main/assets/png_Nature/13.jpg differ diff --git a/app/src/main/assets/png_Nature/14.jpg b/app/src/main/assets/png_Nature/14.jpg new file mode 100644 index 0000000..b4e5dc6 Binary files /dev/null and b/app/src/main/assets/png_Nature/14.jpg differ diff --git a/app/src/main/assets/png_Nature/15.jpg b/app/src/main/assets/png_Nature/15.jpg new file mode 100644 index 0000000..5424ac4 Binary files /dev/null and b/app/src/main/assets/png_Nature/15.jpg differ diff --git a/app/src/main/assets/png_Nature/16.jpg b/app/src/main/assets/png_Nature/16.jpg new file mode 100644 index 0000000..fd00791 Binary files /dev/null and b/app/src/main/assets/png_Nature/16.jpg differ diff --git a/app/src/main/assets/png_Nature/17.jpg b/app/src/main/assets/png_Nature/17.jpg new file mode 100644 index 0000000..38410e8 Binary files /dev/null and b/app/src/main/assets/png_Nature/17.jpg differ diff --git a/app/src/main/assets/png_Nature/18.jpg b/app/src/main/assets/png_Nature/18.jpg new file mode 100644 index 0000000..5ae5028 Binary files /dev/null and b/app/src/main/assets/png_Nature/18.jpg differ diff --git a/app/src/main/assets/png_Nature/19.jpg b/app/src/main/assets/png_Nature/19.jpg new file mode 100644 index 0000000..e49b4f1 Binary files /dev/null and b/app/src/main/assets/png_Nature/19.jpg differ diff --git a/app/src/main/assets/png_Nature/2.jpg b/app/src/main/assets/png_Nature/2.jpg new file mode 100644 index 0000000..3b5ec4c Binary files /dev/null and b/app/src/main/assets/png_Nature/2.jpg differ diff --git a/app/src/main/assets/png_Nature/20.jpg b/app/src/main/assets/png_Nature/20.jpg new file mode 100644 index 0000000..cc94724 Binary files /dev/null and b/app/src/main/assets/png_Nature/20.jpg differ diff --git a/app/src/main/assets/png_Nature/21.jpg b/app/src/main/assets/png_Nature/21.jpg new file mode 100644 index 0000000..dfa6c09 Binary files /dev/null and b/app/src/main/assets/png_Nature/21.jpg differ diff --git a/app/src/main/assets/png_Nature/22.jpg b/app/src/main/assets/png_Nature/22.jpg new file mode 100644 index 0000000..c05e638 Binary files /dev/null and b/app/src/main/assets/png_Nature/22.jpg differ diff --git a/app/src/main/assets/png_Nature/23.jpg b/app/src/main/assets/png_Nature/23.jpg new file mode 100644 index 0000000..6f932ec Binary files /dev/null and b/app/src/main/assets/png_Nature/23.jpg differ diff --git a/app/src/main/assets/png_Nature/3.jpg b/app/src/main/assets/png_Nature/3.jpg new file mode 100644 index 0000000..1423546 Binary files /dev/null and b/app/src/main/assets/png_Nature/3.jpg differ diff --git a/app/src/main/assets/png_Nature/4.jpg b/app/src/main/assets/png_Nature/4.jpg new file mode 100644 index 0000000..5499510 Binary files /dev/null and b/app/src/main/assets/png_Nature/4.jpg differ diff --git a/app/src/main/assets/png_Nature/5.jpg b/app/src/main/assets/png_Nature/5.jpg new file mode 100644 index 0000000..434261a Binary files /dev/null and b/app/src/main/assets/png_Nature/5.jpg differ diff --git a/app/src/main/assets/png_Nature/6.jpg b/app/src/main/assets/png_Nature/6.jpg new file mode 100644 index 0000000..f50166b Binary files /dev/null and b/app/src/main/assets/png_Nature/6.jpg differ diff --git a/app/src/main/assets/png_Nature/7.jpg b/app/src/main/assets/png_Nature/7.jpg new file mode 100644 index 0000000..96e178c Binary files /dev/null and b/app/src/main/assets/png_Nature/7.jpg differ diff --git a/app/src/main/assets/png_Nature/8.jpg b/app/src/main/assets/png_Nature/8.jpg new file mode 100644 index 0000000..c68f4f1 Binary files /dev/null and b/app/src/main/assets/png_Nature/8.jpg differ diff --git a/app/src/main/assets/png_Nature/9.jpg b/app/src/main/assets/png_Nature/9.jpg new file mode 100644 index 0000000..6b8ccb4 Binary files /dev/null and b/app/src/main/assets/png_Nature/9.jpg differ diff --git a/app/src/main/assets/png_Properties/1.jpg b/app/src/main/assets/png_Properties/1.jpg new file mode 100644 index 0000000..3289a38 Binary files /dev/null and b/app/src/main/assets/png_Properties/1.jpg differ diff --git a/app/src/main/assets/png_Properties/10.jpg b/app/src/main/assets/png_Properties/10.jpg new file mode 100644 index 0000000..b065539 Binary files /dev/null and b/app/src/main/assets/png_Properties/10.jpg differ diff --git a/app/src/main/assets/png_Properties/11.jpg b/app/src/main/assets/png_Properties/11.jpg new file mode 100644 index 0000000..12d28b1 Binary files /dev/null and b/app/src/main/assets/png_Properties/11.jpg differ diff --git a/app/src/main/assets/png_Properties/12.jpg b/app/src/main/assets/png_Properties/12.jpg new file mode 100644 index 0000000..182879f Binary files /dev/null and b/app/src/main/assets/png_Properties/12.jpg differ diff --git a/app/src/main/assets/png_Properties/13.jpg b/app/src/main/assets/png_Properties/13.jpg new file mode 100644 index 0000000..4263530 Binary files /dev/null and b/app/src/main/assets/png_Properties/13.jpg differ diff --git a/app/src/main/assets/png_Properties/14.jpg b/app/src/main/assets/png_Properties/14.jpg new file mode 100644 index 0000000..42e4ab3 Binary files /dev/null and b/app/src/main/assets/png_Properties/14.jpg differ diff --git a/app/src/main/assets/png_Properties/15.jpg b/app/src/main/assets/png_Properties/15.jpg new file mode 100644 index 0000000..b529436 Binary files /dev/null and b/app/src/main/assets/png_Properties/15.jpg differ diff --git a/app/src/main/assets/png_Properties/16.jpg b/app/src/main/assets/png_Properties/16.jpg new file mode 100644 index 0000000..85caef0 Binary files /dev/null and b/app/src/main/assets/png_Properties/16.jpg differ diff --git a/app/src/main/assets/png_Properties/17.jpg b/app/src/main/assets/png_Properties/17.jpg new file mode 100644 index 0000000..6295f58 Binary files /dev/null and b/app/src/main/assets/png_Properties/17.jpg differ diff --git a/app/src/main/assets/png_Properties/18.jpg b/app/src/main/assets/png_Properties/18.jpg new file mode 100644 index 0000000..f8e4e87 Binary files /dev/null and b/app/src/main/assets/png_Properties/18.jpg differ diff --git a/app/src/main/assets/png_Properties/19.jpg b/app/src/main/assets/png_Properties/19.jpg new file mode 100644 index 0000000..c476493 Binary files /dev/null and b/app/src/main/assets/png_Properties/19.jpg differ diff --git a/app/src/main/assets/png_Properties/2.jpg b/app/src/main/assets/png_Properties/2.jpg new file mode 100644 index 0000000..084fa51 Binary files /dev/null and b/app/src/main/assets/png_Properties/2.jpg differ diff --git a/app/src/main/assets/png_Properties/3.jpg b/app/src/main/assets/png_Properties/3.jpg new file mode 100644 index 0000000..4ee71c4 Binary files /dev/null and b/app/src/main/assets/png_Properties/3.jpg differ diff --git a/app/src/main/assets/png_Properties/4.jpg b/app/src/main/assets/png_Properties/4.jpg new file mode 100644 index 0000000..25912f1 Binary files /dev/null and b/app/src/main/assets/png_Properties/4.jpg differ diff --git a/app/src/main/assets/png_Properties/5.jpg b/app/src/main/assets/png_Properties/5.jpg new file mode 100644 index 0000000..77c2aa8 Binary files /dev/null and b/app/src/main/assets/png_Properties/5.jpg differ diff --git a/app/src/main/assets/png_Properties/6.jpg b/app/src/main/assets/png_Properties/6.jpg new file mode 100644 index 0000000..75b1e32 Binary files /dev/null and b/app/src/main/assets/png_Properties/6.jpg differ diff --git a/app/src/main/assets/png_Properties/7.jpg b/app/src/main/assets/png_Properties/7.jpg new file mode 100644 index 0000000..f059989 Binary files /dev/null and b/app/src/main/assets/png_Properties/7.jpg differ diff --git a/app/src/main/assets/png_Properties/8.jpg b/app/src/main/assets/png_Properties/8.jpg new file mode 100644 index 0000000..6be97eb Binary files /dev/null and b/app/src/main/assets/png_Properties/8.jpg differ diff --git a/app/src/main/assets/png_Properties/9.jpg b/app/src/main/assets/png_Properties/9.jpg new file mode 100644 index 0000000..626cab9 Binary files /dev/null and b/app/src/main/assets/png_Properties/9.jpg differ diff --git a/app/src/main/assets/png_Rangoli/1.jpg b/app/src/main/assets/png_Rangoli/1.jpg new file mode 100644 index 0000000..e628714 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/1.jpg differ diff --git a/app/src/main/assets/png_Rangoli/10.jpg b/app/src/main/assets/png_Rangoli/10.jpg new file mode 100644 index 0000000..f6e9d09 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/10.jpg differ diff --git a/app/src/main/assets/png_Rangoli/13.jpg b/app/src/main/assets/png_Rangoli/13.jpg new file mode 100644 index 0000000..9741d57 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/13.jpg differ diff --git a/app/src/main/assets/png_Rangoli/14.jpg b/app/src/main/assets/png_Rangoli/14.jpg new file mode 100644 index 0000000..3ca4970 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/14.jpg differ diff --git a/app/src/main/assets/png_Rangoli/15.jpg b/app/src/main/assets/png_Rangoli/15.jpg new file mode 100644 index 0000000..98abac3 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/15.jpg differ diff --git a/app/src/main/assets/png_Rangoli/16.jpg b/app/src/main/assets/png_Rangoli/16.jpg new file mode 100644 index 0000000..150dfdc Binary files /dev/null and b/app/src/main/assets/png_Rangoli/16.jpg differ diff --git a/app/src/main/assets/png_Rangoli/17.jpg b/app/src/main/assets/png_Rangoli/17.jpg new file mode 100644 index 0000000..4127115 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/17.jpg differ diff --git a/app/src/main/assets/png_Rangoli/18.jpg b/app/src/main/assets/png_Rangoli/18.jpg new file mode 100644 index 0000000..6ae96e9 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/18.jpg differ diff --git a/app/src/main/assets/png_Rangoli/19.jpg b/app/src/main/assets/png_Rangoli/19.jpg new file mode 100644 index 0000000..ffcbd6a Binary files /dev/null and b/app/src/main/assets/png_Rangoli/19.jpg differ diff --git a/app/src/main/assets/png_Rangoli/2.jpg b/app/src/main/assets/png_Rangoli/2.jpg new file mode 100644 index 0000000..7329109 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/2.jpg differ diff --git a/app/src/main/assets/png_Rangoli/20.jpg b/app/src/main/assets/png_Rangoli/20.jpg new file mode 100644 index 0000000..b7be138 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/20.jpg differ diff --git a/app/src/main/assets/png_Rangoli/21.jpg b/app/src/main/assets/png_Rangoli/21.jpg new file mode 100644 index 0000000..eaa5fdf Binary files /dev/null and b/app/src/main/assets/png_Rangoli/21.jpg differ diff --git a/app/src/main/assets/png_Rangoli/22.jpg b/app/src/main/assets/png_Rangoli/22.jpg new file mode 100644 index 0000000..28aca48 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/22.jpg differ diff --git a/app/src/main/assets/png_Rangoli/23.jpg b/app/src/main/assets/png_Rangoli/23.jpg new file mode 100644 index 0000000..057d2d4 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/23.jpg differ diff --git a/app/src/main/assets/png_Rangoli/24.jpg b/app/src/main/assets/png_Rangoli/24.jpg new file mode 100644 index 0000000..e933061 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/24.jpg differ diff --git a/app/src/main/assets/png_Rangoli/25.jpg b/app/src/main/assets/png_Rangoli/25.jpg new file mode 100644 index 0000000..569a74c Binary files /dev/null and b/app/src/main/assets/png_Rangoli/25.jpg differ diff --git a/app/src/main/assets/png_Rangoli/26.jpg b/app/src/main/assets/png_Rangoli/26.jpg new file mode 100644 index 0000000..7c5d0de Binary files /dev/null and b/app/src/main/assets/png_Rangoli/26.jpg differ diff --git a/app/src/main/assets/png_Rangoli/3.jpg b/app/src/main/assets/png_Rangoli/3.jpg new file mode 100644 index 0000000..569342c Binary files /dev/null and b/app/src/main/assets/png_Rangoli/3.jpg differ diff --git a/app/src/main/assets/png_Rangoli/5.jpg b/app/src/main/assets/png_Rangoli/5.jpg new file mode 100644 index 0000000..5a3228f Binary files /dev/null and b/app/src/main/assets/png_Rangoli/5.jpg differ diff --git a/app/src/main/assets/png_Rangoli/6.jpg b/app/src/main/assets/png_Rangoli/6.jpg new file mode 100644 index 0000000..270f078 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/6.jpg differ diff --git a/app/src/main/assets/png_Rangoli/7.jpg b/app/src/main/assets/png_Rangoli/7.jpg new file mode 100644 index 0000000..241beac Binary files /dev/null and b/app/src/main/assets/png_Rangoli/7.jpg differ diff --git a/app/src/main/assets/png_Rangoli/8.jpg b/app/src/main/assets/png_Rangoli/8.jpg new file mode 100644 index 0000000..c62e0d7 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/8.jpg differ diff --git a/app/src/main/assets/png_Rangoli/9.jpg b/app/src/main/assets/png_Rangoli/9.jpg new file mode 100644 index 0000000..bcd14a7 Binary files /dev/null and b/app/src/main/assets/png_Rangoli/9.jpg differ diff --git a/app/src/main/assets/png_Sports/1.jpg b/app/src/main/assets/png_Sports/1.jpg new file mode 100644 index 0000000..cd1cb09 Binary files /dev/null and b/app/src/main/assets/png_Sports/1.jpg differ diff --git a/app/src/main/assets/png_Sports/10.jpg b/app/src/main/assets/png_Sports/10.jpg new file mode 100644 index 0000000..2ec81a5 Binary files /dev/null and b/app/src/main/assets/png_Sports/10.jpg differ diff --git a/app/src/main/assets/png_Sports/11.jpg b/app/src/main/assets/png_Sports/11.jpg new file mode 100644 index 0000000..f00ecb5 Binary files /dev/null and b/app/src/main/assets/png_Sports/11.jpg differ diff --git a/app/src/main/assets/png_Sports/12.jpg b/app/src/main/assets/png_Sports/12.jpg new file mode 100644 index 0000000..b004929 Binary files /dev/null and b/app/src/main/assets/png_Sports/12.jpg differ diff --git a/app/src/main/assets/png_Sports/13.jpg b/app/src/main/assets/png_Sports/13.jpg new file mode 100644 index 0000000..73fa886 Binary files /dev/null and b/app/src/main/assets/png_Sports/13.jpg differ diff --git a/app/src/main/assets/png_Sports/14.jpg b/app/src/main/assets/png_Sports/14.jpg new file mode 100644 index 0000000..3d9069e Binary files /dev/null and b/app/src/main/assets/png_Sports/14.jpg differ diff --git a/app/src/main/assets/png_Sports/15.jpg b/app/src/main/assets/png_Sports/15.jpg new file mode 100644 index 0000000..a090c83 Binary files /dev/null and b/app/src/main/assets/png_Sports/15.jpg differ diff --git a/app/src/main/assets/png_Sports/16.jpg b/app/src/main/assets/png_Sports/16.jpg new file mode 100644 index 0000000..185d6e3 Binary files /dev/null and b/app/src/main/assets/png_Sports/16.jpg differ diff --git a/app/src/main/assets/png_Sports/17.jpg b/app/src/main/assets/png_Sports/17.jpg new file mode 100644 index 0000000..b8193fa Binary files /dev/null and b/app/src/main/assets/png_Sports/17.jpg differ diff --git a/app/src/main/assets/png_Sports/18.jpg b/app/src/main/assets/png_Sports/18.jpg new file mode 100644 index 0000000..ba4fcea Binary files /dev/null and b/app/src/main/assets/png_Sports/18.jpg differ diff --git a/app/src/main/assets/png_Sports/19.jpg b/app/src/main/assets/png_Sports/19.jpg new file mode 100644 index 0000000..617c2af Binary files /dev/null and b/app/src/main/assets/png_Sports/19.jpg differ diff --git a/app/src/main/assets/png_Sports/2.jpg b/app/src/main/assets/png_Sports/2.jpg new file mode 100644 index 0000000..59890e5 Binary files /dev/null and b/app/src/main/assets/png_Sports/2.jpg differ diff --git a/app/src/main/assets/png_Sports/20.jpg b/app/src/main/assets/png_Sports/20.jpg new file mode 100644 index 0000000..4032ff4 Binary files /dev/null and b/app/src/main/assets/png_Sports/20.jpg differ diff --git a/app/src/main/assets/png_Sports/21.jpg b/app/src/main/assets/png_Sports/21.jpg new file mode 100644 index 0000000..23979ba Binary files /dev/null and b/app/src/main/assets/png_Sports/21.jpg differ diff --git a/app/src/main/assets/png_Sports/22.jpg b/app/src/main/assets/png_Sports/22.jpg new file mode 100644 index 0000000..c61e91e Binary files /dev/null and b/app/src/main/assets/png_Sports/22.jpg differ diff --git a/app/src/main/assets/png_Sports/23.jpg b/app/src/main/assets/png_Sports/23.jpg new file mode 100644 index 0000000..7bf0806 Binary files /dev/null and b/app/src/main/assets/png_Sports/23.jpg differ diff --git a/app/src/main/assets/png_Sports/24.jpg b/app/src/main/assets/png_Sports/24.jpg new file mode 100644 index 0000000..23cbc17 Binary files /dev/null and b/app/src/main/assets/png_Sports/24.jpg differ diff --git a/app/src/main/assets/png_Sports/25.jpg b/app/src/main/assets/png_Sports/25.jpg new file mode 100644 index 0000000..06d992e Binary files /dev/null and b/app/src/main/assets/png_Sports/25.jpg differ diff --git a/app/src/main/assets/png_Sports/26.jpg b/app/src/main/assets/png_Sports/26.jpg new file mode 100644 index 0000000..26af61e Binary files /dev/null and b/app/src/main/assets/png_Sports/26.jpg differ diff --git a/app/src/main/assets/png_Sports/27.jpg b/app/src/main/assets/png_Sports/27.jpg new file mode 100644 index 0000000..91bf104 Binary files /dev/null and b/app/src/main/assets/png_Sports/27.jpg differ diff --git a/app/src/main/assets/png_Sports/28.jpg b/app/src/main/assets/png_Sports/28.jpg new file mode 100644 index 0000000..8c790e7 Binary files /dev/null and b/app/src/main/assets/png_Sports/28.jpg differ diff --git a/app/src/main/assets/png_Sports/3.jpg b/app/src/main/assets/png_Sports/3.jpg new file mode 100644 index 0000000..8315af5 Binary files /dev/null and b/app/src/main/assets/png_Sports/3.jpg differ diff --git a/app/src/main/assets/png_Sports/4.jpg b/app/src/main/assets/png_Sports/4.jpg new file mode 100644 index 0000000..8070e68 Binary files /dev/null and b/app/src/main/assets/png_Sports/4.jpg differ diff --git a/app/src/main/assets/png_Sports/5.jpg b/app/src/main/assets/png_Sports/5.jpg new file mode 100644 index 0000000..5bcb837 Binary files /dev/null and b/app/src/main/assets/png_Sports/5.jpg differ diff --git a/app/src/main/assets/png_Sports/6.jpg b/app/src/main/assets/png_Sports/6.jpg new file mode 100644 index 0000000..038521f Binary files /dev/null and b/app/src/main/assets/png_Sports/6.jpg differ diff --git a/app/src/main/assets/png_Sports/7.jpg b/app/src/main/assets/png_Sports/7.jpg new file mode 100644 index 0000000..73bf0de Binary files /dev/null and b/app/src/main/assets/png_Sports/7.jpg differ diff --git a/app/src/main/assets/png_Sports/8.jpg b/app/src/main/assets/png_Sports/8.jpg new file mode 100644 index 0000000..6c565f8 Binary files /dev/null and b/app/src/main/assets/png_Sports/8.jpg differ diff --git a/app/src/main/assets/png_Sports/9.jpg b/app/src/main/assets/png_Sports/9.jpg new file mode 100644 index 0000000..130cd94 Binary files /dev/null and b/app/src/main/assets/png_Sports/9.jpg differ diff --git a/app/src/main/assets/png_Vehicles/1.jpg b/app/src/main/assets/png_Vehicles/1.jpg new file mode 100644 index 0000000..da449f7 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/1.jpg differ diff --git a/app/src/main/assets/png_Vehicles/10.jpg b/app/src/main/assets/png_Vehicles/10.jpg new file mode 100644 index 0000000..0084613 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/10.jpg differ diff --git a/app/src/main/assets/png_Vehicles/11.jpg b/app/src/main/assets/png_Vehicles/11.jpg new file mode 100644 index 0000000..ba5f4d4 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/11.jpg differ diff --git a/app/src/main/assets/png_Vehicles/12.jpg b/app/src/main/assets/png_Vehicles/12.jpg new file mode 100644 index 0000000..32c7908 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/12.jpg differ diff --git a/app/src/main/assets/png_Vehicles/13.jpg b/app/src/main/assets/png_Vehicles/13.jpg new file mode 100644 index 0000000..dd47e76 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/13.jpg differ diff --git a/app/src/main/assets/png_Vehicles/14.jpg b/app/src/main/assets/png_Vehicles/14.jpg new file mode 100644 index 0000000..8b886e6 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/14.jpg differ diff --git a/app/src/main/assets/png_Vehicles/15.jpg b/app/src/main/assets/png_Vehicles/15.jpg new file mode 100644 index 0000000..cf78752 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/15.jpg differ diff --git a/app/src/main/assets/png_Vehicles/16.jpg b/app/src/main/assets/png_Vehicles/16.jpg new file mode 100644 index 0000000..87f8a19 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/16.jpg differ diff --git a/app/src/main/assets/png_Vehicles/17.jpg b/app/src/main/assets/png_Vehicles/17.jpg new file mode 100644 index 0000000..011b53b Binary files /dev/null and b/app/src/main/assets/png_Vehicles/17.jpg differ diff --git a/app/src/main/assets/png_Vehicles/18.jpg b/app/src/main/assets/png_Vehicles/18.jpg new file mode 100644 index 0000000..c4433c8 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/18.jpg differ diff --git a/app/src/main/assets/png_Vehicles/19.jpg b/app/src/main/assets/png_Vehicles/19.jpg new file mode 100644 index 0000000..b9361f1 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/19.jpg differ diff --git a/app/src/main/assets/png_Vehicles/2.jpg b/app/src/main/assets/png_Vehicles/2.jpg new file mode 100644 index 0000000..ff06675 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/2.jpg differ diff --git a/app/src/main/assets/png_Vehicles/20.jpg b/app/src/main/assets/png_Vehicles/20.jpg new file mode 100644 index 0000000..3e22c5c Binary files /dev/null and b/app/src/main/assets/png_Vehicles/20.jpg differ diff --git a/app/src/main/assets/png_Vehicles/21.jpg b/app/src/main/assets/png_Vehicles/21.jpg new file mode 100644 index 0000000..f93b99a Binary files /dev/null and b/app/src/main/assets/png_Vehicles/21.jpg differ diff --git a/app/src/main/assets/png_Vehicles/22.jpg b/app/src/main/assets/png_Vehicles/22.jpg new file mode 100644 index 0000000..952afa9 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/22.jpg differ diff --git a/app/src/main/assets/png_Vehicles/23.jpg b/app/src/main/assets/png_Vehicles/23.jpg new file mode 100644 index 0000000..a6e1c25 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/23.jpg differ diff --git a/app/src/main/assets/png_Vehicles/24.jpg b/app/src/main/assets/png_Vehicles/24.jpg new file mode 100644 index 0000000..83c706a Binary files /dev/null and b/app/src/main/assets/png_Vehicles/24.jpg differ diff --git a/app/src/main/assets/png_Vehicles/25.jpg b/app/src/main/assets/png_Vehicles/25.jpg new file mode 100644 index 0000000..6ebdbf7 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/25.jpg differ diff --git a/app/src/main/assets/png_Vehicles/26.jpg b/app/src/main/assets/png_Vehicles/26.jpg new file mode 100644 index 0000000..3805357 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/26.jpg differ diff --git a/app/src/main/assets/png_Vehicles/27.jpg b/app/src/main/assets/png_Vehicles/27.jpg new file mode 100644 index 0000000..0849027 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/27.jpg differ diff --git a/app/src/main/assets/png_Vehicles/28.jpg b/app/src/main/assets/png_Vehicles/28.jpg new file mode 100644 index 0000000..019baa9 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/28.jpg differ diff --git a/app/src/main/assets/png_Vehicles/29.jpg b/app/src/main/assets/png_Vehicles/29.jpg new file mode 100644 index 0000000..c7e0d3a Binary files /dev/null and b/app/src/main/assets/png_Vehicles/29.jpg differ diff --git a/app/src/main/assets/png_Vehicles/3.jpg b/app/src/main/assets/png_Vehicles/3.jpg new file mode 100644 index 0000000..eb33365 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/3.jpg differ diff --git a/app/src/main/assets/png_Vehicles/30.jpg b/app/src/main/assets/png_Vehicles/30.jpg new file mode 100644 index 0000000..3820102 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/30.jpg differ diff --git a/app/src/main/assets/png_Vehicles/31.jpg b/app/src/main/assets/png_Vehicles/31.jpg new file mode 100644 index 0000000..bba9999 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/31.jpg differ diff --git a/app/src/main/assets/png_Vehicles/32.jpg b/app/src/main/assets/png_Vehicles/32.jpg new file mode 100644 index 0000000..6d64a3f Binary files /dev/null and b/app/src/main/assets/png_Vehicles/32.jpg differ diff --git a/app/src/main/assets/png_Vehicles/4.jpg b/app/src/main/assets/png_Vehicles/4.jpg new file mode 100644 index 0000000..968f0ad Binary files /dev/null and b/app/src/main/assets/png_Vehicles/4.jpg differ diff --git a/app/src/main/assets/png_Vehicles/5.jpg b/app/src/main/assets/png_Vehicles/5.jpg new file mode 100644 index 0000000..abdd96c Binary files /dev/null and b/app/src/main/assets/png_Vehicles/5.jpg differ diff --git a/app/src/main/assets/png_Vehicles/6.jpg b/app/src/main/assets/png_Vehicles/6.jpg new file mode 100644 index 0000000..7eeb870 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/6.jpg differ diff --git a/app/src/main/assets/png_Vehicles/7.jpg b/app/src/main/assets/png_Vehicles/7.jpg new file mode 100644 index 0000000..c5e6294 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/7.jpg differ diff --git a/app/src/main/assets/png_Vehicles/8.jpg b/app/src/main/assets/png_Vehicles/8.jpg new file mode 100644 index 0000000..6628782 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/8.jpg differ diff --git a/app/src/main/assets/png_Vehicles/9.jpg b/app/src/main/assets/png_Vehicles/9.jpg new file mode 100644 index 0000000..367b772 Binary files /dev/null and b/app/src/main/assets/png_Vehicles/9.jpg differ diff --git a/app/src/main/java/com/ar/imagetracear/MainActivity.java b/app/src/main/java/com/ar/imagetracear/MainActivity.java deleted file mode 100644 index f934612..0000000 --- a/app/src/main/java/com/ar/imagetracear/MainActivity.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.ar.imagetracear; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_main); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/MyApplication.java b/app/src/main/java/com/ar/imagetracear/MyApplication.java new file mode 100644 index 0000000..8dff2d8 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/MyApplication.java @@ -0,0 +1,113 @@ +package com.ar.imagetracear; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import com.anythink.core.api.ATSDK; +import com.anythink.core.api.NetTrafficeCallback; +import com.ar.imagetracear.topon.AdManager; +import com.ar.imagetracear.utils.ImageTraceRepository; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; + + +public class MyApplication extends Application { + + public static MyApplication application; + + public static final int DATABASE_VERSION = 1; + public static final String DATABASE_NAME = "ImageTrace"; + + private static final String SETTINGS_FILE = "app_preferences"; + private static final String FLAG_INITIALIZED = "has_initialized"; + + public static final String TAG = "--------------"; + + private static final String AppKey = "aa07b59fcedc6b4f854035de5415b97dc"; + private static final String APPId = "h6847dd0968d4f"; + private static final String debug_KEy = "62eed2fbebbb41fdc21186f66533e9d2904185ce"; + + @Override + public void onCreate() { + super.onCreate(); + + application = this; + + SharedPreferences prefs = getSharedPreferences(SETTINGS_FILE, MODE_PRIVATE); + boolean alreadyInit = prefs.getBoolean(FLAG_INITIALIZED, false); + + if (!alreadyInit) { + setupInitialDatabase(); + prefs.edit().putBoolean(FLAG_INITIALIZED, true).apply(); + } + + initSdk(); + } + + private void initSdk() { + + ATSDK.checkIsEuTraffic(this, new NetTrafficeCallback() { + + @Override + public void onResultCallback(boolean isEU) { + Log.e(TAG, "onResultCallback:" + isEU); + if (isEU && ATSDK.getGDPRDataLevel(MyApplication.this) == ATSDK.UNKNOWN) { + ATSDK.showGdprAuth(MyApplication.this); + } + + } + + @Override + public void onErrorCallback(String errorMsg) { + Log.e(TAG, "onErrorCallback:" + errorMsg); + } + }); + + ATSDK.init(this, APPId, AppKey); + AdManager.loadAllAd(); + //测试工具 +// ATDebuggerUITest.showDebuggerUI(this,debug_KEy); +// ATSDK.setNetworkLogDebug(true); + + } + + public static Context getContext() { + return application.getApplicationContext(); + } + + private void setupInitialDatabase() { + Executors.newSingleThreadExecutor().execute(() -> { + List assetImages = collectImagePathsFromAssets(); + ImageTraceRepository dbInitializer = new ImageTraceRepository(application); + dbInitializer.insertAllImages(assetImages); + }); + } + + private List collectImagePathsFromAssets() { + List resultList = new ArrayList<>(); + + try { + String[] assetDirs = application.getAssets().list(""); + if (assetDirs != null) { + for (String folderName : assetDirs) { + if (folderName.startsWith("png_")) { + String[] fileArray = application.getAssets().list(folderName); + if (fileArray != null) { + for (String fileName : fileArray) { + resultList.add(folderName + "/" + fileName); + } + } + } + } + } + } catch (IOException ignored) { + } + + return resultList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/activity/ImageTraceActivity.java b/app/src/main/java/com/ar/imagetracear/activity/ImageTraceActivity.java new file mode 100644 index 0000000..bcf851d --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/activity/ImageTraceActivity.java @@ -0,0 +1,251 @@ +package com.ar.imagetracear.activity; + +import android.annotation.SuppressLint; +import android.content.ContentValues; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.view.View; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +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.ImageCaptureException; +import androidx.camera.core.Preview; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + + +import com.ar.imagetracear.R; +import com.ar.imagetracear.databinding.ActivityImagetraceBinding; +import com.ar.imagetracear.topon.AdManager; +import com.ar.imagetracear.topon.onActionListener; +import com.ar.imagetracear.utils.DisplayUtils; +import com.ar.imagetracear.utils.ImageLoader; +import com.ar.imagetracear.utils.ImagePositioner; +import com.ar.imagetracear.utils.RequestUtils; +import com.ar.imagetracear.utils.TouchEventHandler; +import com.google.common.util.concurrent.ListenableFuture; + +public class ImageTraceActivity extends AppCompatActivity { + private ActivityImagetraceBinding viewBinding; + private ImageView imageView; + private Bitmap bitmap; + private Camera camera; + private ImageCapture capture; + private boolean isFlashOn = false; + private boolean isMirror = false; + + private static final int PERMISSION_CAMERA = 100; + private static final int PERMISSION_STORAGE = 101; + + private final ActivityResultLauncher imageChooserLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + outcome -> { + if (outcome.getResultCode() == RESULT_OK && outcome.getData() != null) { + Uri selectedImageUri = outcome.getData().getData(); + if (selectedImageUri != null) { + imageView.setImageURI(selectedImageUri); + } + } + }); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + EdgeToEdge.enable(this); + + bindView(); + + View mainLayout = findViewById(R.id.main); + ViewCompat.setOnApplyWindowInsetsListener(mainLayout, (view, windowInsets) -> { + Insets bars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + return windowInsets; + }); + + AdManager.loadAllAd(); + AdManager.showTopOn(this, new onActionListener() { + @Override + public void onAction() { + + } + }); + + configureTouchHandler(); + setupUiInteractions(); + checkIncomingIntent(); + checkAndInitCamera(); + } + + private void bindView() { + viewBinding = ActivityImagetraceBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + imageView = viewBinding.imageFull; + } + + @SuppressLint("ClickableViewAccessibility") + private void configureTouchHandler() { + imageView.setOnTouchListener((v, motionEvent) -> + TouchEventHandler.handleImageTouchEvent((ImageView) v, motionEvent) + ); + } + + private void setupUiInteractions() { + viewBinding.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + public void onProgressChanged(SeekBar bar, int value, boolean user) { + imageView.setAlpha((100 - value) / 100f); + } + + public void onStartTrackingTouch(SeekBar bar) { + } + + public void onStopTrackingTouch(SeekBar bar) { + } + }); + + viewBinding.importImage.setOnClickListener(v -> openImageChooser()); + viewBinding.light.setOnClickListener(v -> toggleFlash()); + viewBinding.back.setOnClickListener(v -> finish()); + viewBinding.reversal.setOnClickListener(v -> mirrorImage()); + viewBinding.fabCapture.setOnClickListener(v -> takeSnapshot()); + } + + private void checkIncomingIntent() { + String pathFromIntent = getIntent().getStringExtra("imagePath"); + if (pathFromIntent != null) { + displayImage(pathFromIntent); + } + } + + private void checkAndInitCamera() { + String[] perms = RequestUtils.getCameraPermissions(); + if (RequestUtils.hasRequests(this, perms)) { + prepareCamera(); + } else { + RequestUtils.requestPermissions(this, perms, PERMISSION_CAMERA); + } + } + + private void prepareCamera() { + ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(this); + cameraProviderFuture.addListener(() -> { + try { + ProcessCameraProvider provider = cameraProviderFuture.get(); + activateCamera(provider); + } catch (Exception ex) { + Toast.makeText(this, "Camera failed to start", Toast.LENGTH_SHORT).show(); + } + }, ContextCompat.getMainExecutor(this)); + } + + private void activateCamera(ProcessCameraProvider provider) { + Preview cameraPreview = new Preview.Builder().build(); + CameraSelector selector = CameraSelector.DEFAULT_BACK_CAMERA; + capture = new ImageCapture.Builder().build(); + + cameraPreview.setSurfaceProvider(viewBinding.preview.getSurfaceProvider()); + provider.unbindAll(); + camera = provider.bindToLifecycle(this, selector, cameraPreview, capture); + + if (bitmap != null) { + ImagePositioner.centerBitmapInImageView(imageView, bitmap, DisplayUtils.getDeviceScreenSize(this)); + } + } + + private void takeSnapshot() { + if (capture == null) { + Toast.makeText(this, "Camera not initialized", Toast.LENGTH_SHORT).show(); + return; + } + + ContentValues values = new ContentValues(); + values.put(MediaStore.MediaColumns.DISPLAY_NAME, "img_" + System.currentTimeMillis() + ".jpg"); + values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); + values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); + + ImageCapture.OutputFileOptions fileOptions = new ImageCapture.OutputFileOptions.Builder( + getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values).build(); + + capture.takePicture(fileOptions, ContextCompat.getMainExecutor(this), new ImageCapture.OnImageSavedCallback() { + public void onImageSaved(@NonNull ImageCapture.OutputFileResults result) { + Toast.makeText(ImageTraceActivity.this, "Photo saved", Toast.LENGTH_SHORT).show(); + } + + public void onError(@NonNull ImageCaptureException exception) { + Toast.makeText(ImageTraceActivity.this, "Error: " + exception.getMessage(), Toast.LENGTH_SHORT).show(); + } + }); + } + + private void toggleFlash() { + if (camera != null) { + isFlashOn = !isFlashOn; + camera.getCameraControl().enableTorch(isFlashOn); + viewBinding.light.setImageResource(isFlashOn ? R.drawable.flash_on : R.drawable.flash_off); + } + } + + private void mirrorImage() { + isMirror = !isMirror; + imageView.setScaleX(isMirror ? -1f : 1f); + viewBinding.reversal.setImageResource(isMirror ? R.drawable.reversal_on : R.drawable.reversal_off); + } + + private void openImageChooser() { + String[] permissions = RequestUtils.getCameraPermissions(); + if (RequestUtils.hasRequests(this, permissions)) { + Intent chooser = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + imageChooserLauncher.launch(chooser); + } else { + RequestUtils.requestPermissions(this, permissions, PERMISSION_STORAGE); + } + } + + private void displayImage(String filePath) { + bitmap = filePath.startsWith("/data/user/") + ? ImageLoader.loadBitmapFromFile(filePath) + : ImageLoader.loadBitmapFromAppAssets(this, filePath); + + if (bitmap != null) { + ImageLoader.displayBitmapInView(imageView, bitmap); + } else { + Toast.makeText(this, "Failed to load image", Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onRequestPermissionsResult(int code, @NonNull String[] perms, @NonNull int[] results) { + super.onRequestPermissionsResult(code, perms, results); + if (RequestUtils.handlePermissionsResult(results)) { + if (code == PERMISSION_CAMERA) { + prepareCamera(); + } else if (code == PERMISSION_STORAGE) { + openImageChooser(); + } + } else { + Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + viewBinding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/activity/MainActivity.java b/app/src/main/java/com/ar/imagetracear/activity/MainActivity.java new file mode 100644 index 0000000..8f1421d --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/activity/MainActivity.java @@ -0,0 +1,129 @@ +package com.ar.imagetracear.activity; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + + +import com.ar.imagetracear.topon.AdManager; +import com.ar.imagetracear.upload.Http; +import com.ar.imagetracear.upload.SaveUtils; +import com.ar.imagetracear.R; +import com.ar.imagetracear.databinding.ActivityMainBinding; +import com.ar.imagetracear.databinding.MainTabItemCustomBinding; +import com.ar.imagetracear.adapter.MainAdapter; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; + +public class MainActivity extends AppCompatActivity { + private ActivityMainBinding binding; + + @Override + protected void onCreate(Bundle state) { + super.onCreate(state); + + EdgeToEdge.enable(this); + + bindLayout(); + + View mainLayout = findViewById(R.id.main); + ViewCompat.setOnApplyWindowInsetsListener(mainLayout, (view, windowInsets) -> { + Insets bars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + return windowInsets; + }); + + AdManager.loadAllAd(); + + initPagerAdapter(); + initTabs(); + + upload(); + } + + private void bindLayout() { + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + } + + private void initPagerAdapter() { + MainAdapter adapter = new MainAdapter(this); + binding.mainViewpager.setAdapter(adapter); + } + + private void initTabs() { + bindTabIcons(); + addTabListener(); + } + + private void bindTabIcons() { + new TabLayoutMediator(binding.mainTablayout, binding.mainViewpager, (tab, idx) -> { + MainTabItemCustomBinding tabViewBinding = MainTabItemCustomBinding.inflate(LayoutInflater.from(this)); + tab.setCustomView(tabViewBinding.getRoot()); + decorateTab(tabViewBinding, idx); + }).attach(); + } + + private void decorateTab(MainTabItemCustomBinding tabBinding, int position) { + int iconId = R.drawable.home; + boolean dotVisible = false; + + if (position == 0) { + iconId = R.drawable.home; + dotVisible = true; + } else if (position == 1) { + iconId = R.drawable.import_image; + } else if (position == 2) { + iconId = R.drawable.collection; + } + + tabBinding.iconCustom.setImageResource(iconId); + tabBinding.dotView.setVisibility(dotVisible ? View.VISIBLE : View.GONE); + } + + private void addTabListener() { + binding.mainTablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + toggleDot(tab, true); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + toggleDot(tab, false); + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + // Optional: no action + } + + private void toggleDot(TabLayout.Tab tab, boolean visible) { + View dotView = tab.view.findViewById(R.id.dot_view); + if (dotView != null) { + dotView.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + }); + } + + private void upload() { + boolean post = SaveUtils.INSTANCE.isPost(); + if (!post) { + Http.INSTANCE.makeGetRequest(MainActivity.this); + SaveUtils.INSTANCE.setPost(true); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + binding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/activity/SplashActivity.java b/app/src/main/java/com/ar/imagetracear/activity/SplashActivity.java new file mode 100644 index 0000000..2fd99f0 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/activity/SplashActivity.java @@ -0,0 +1,78 @@ +package com.ar.imagetracear.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.ar.imagetracear.R; +import com.ar.imagetracear.databinding.ActivitySplashBinding; +import com.ar.imagetracear.topon.AdManager; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; + +public class SplashActivity extends AppCompatActivity { + private ActivitySplashBinding binding; + private static final long totalTime = 1000; + private CountDownTimer countDownTimer; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + EdgeToEdge.enable(this); + + binding = ActivitySplashBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + View mainLayout = findViewById(R.id.main); + ViewCompat.setOnApplyWindowInsetsListener(mainLayout, (view, windowInsets) -> { + Insets bars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + return windowInsets; + }); + + AdManager.loadAllAd(); + AdManager.setAlreadyShow(); + + Glide.with(this) + .load(R.mipmap.ic_launcher) + .transform(new CenterCrop(),new RoundedCorners(32)) + .placeholder(R.mipmap.placeholder) + .error(R.mipmap.placeholder) + .into(binding.splashImage); + + countDownTimer = AdManager.showWelcomeAd(this, totalTime, millisUntilFinished -> { + int percentage = (int) (100 - (float) millisUntilFinished / totalTime * 100); + binding.progressBar.setProgress(percentage); + }, + this::startToJump + ); + + countDownTimer.start(); + } + + private void startToJump() { + binding.progressBar.setProgress(100); + + Intent intent = new Intent(SplashActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (countDownTimer != null) { + countDownTimer.cancel(); + } + binding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/activity/SubListActivity.java b/app/src/main/java/com/ar/imagetracear/activity/SubListActivity.java new file mode 100644 index 0000000..d755ff5 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/activity/SubListActivity.java @@ -0,0 +1,114 @@ +package com.ar.imagetracear.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.GridLayoutManager; + + +import com.ar.imagetracear.R; +import com.ar.imagetracear.databinding.ActivitySublistBinding; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.adapter.SubListAdapter; +import com.ar.imagetracear.topon.AdManager; +import com.ar.imagetracear.topon.onActionListener; +import com.ar.imagetracear.utils.ItemDecoration; + +import java.util.ArrayList; +import java.util.List; + +public class SubListActivity extends AppCompatActivity { + private ActivitySublistBinding bindingRef; + private String categoryKey; + private String categoryTitle; + private SubListAdapter imageListAdapter; + + @Override + protected void onCreate(Bundle state) { + super.onCreate(state); + + EdgeToEdge.enable(this); + + bindingRef = ActivitySublistBinding.inflate(getLayoutInflater()); + setContentView(bindingRef.getRoot()); + + View mainLayout = findViewById(R.id.main); + ViewCompat.setOnApplyWindowInsetsListener(mainLayout, (view, windowInsets) -> { + Insets bars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + return windowInsets; + }); + + AdManager.loadAllAd(); + AdManager.showTopOn(this, new onActionListener() { + @Override + public void onAction() { + + } + }); + + readIntentData(); + initializeViews(); + prepareListView(); + loadCategoryImages(); + } + + private void readIntentData() { + Intent incoming = getIntent(); + categoryKey = incoming.getStringExtra("Original"); + categoryTitle = incoming.getStringExtra("Title"); + } + + private void initializeViews() { + setupHeaderTitle(); + bindActions(); + } + + private void setupHeaderTitle() { + bindingRef.title.setText(categoryTitle); + } + + private void bindActions() { + bindingRef.back.setOnClickListener(v -> { + AdManager.showTopOn(this, new onActionListener() { + @Override + public void onAction() { + finish(); + } + }); + }); + } + + private void prepareListView() { + bindingRef.recyclerview.setLayoutManager(new GridLayoutManager(this, 2)); + imageListAdapter = new SubListAdapter(this, new ArrayList<>()); + bindingRef.recyclerview.setAdapter(imageListAdapter); + bindingRef.recyclerview.addItemDecoration(new ItemDecoration(16, 19, 10)); + } + + private void loadCategoryImages() { + AppDatabase db = AppDatabase.getInstance(this); + db.imageTraceEntryDao().getFileByPath(categoryKey).observe(this, new Observer>() { + @Override + public void onChanged(List result) { + if (result != null) { + imageListAdapter.updateEntries(result); + } + } + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + bindingRef = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/adapter/HomeAdapter.java b/app/src/main/java/com/ar/imagetracear/adapter/HomeAdapter.java new file mode 100644 index 0000000..34a82c2 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/adapter/HomeAdapter.java @@ -0,0 +1,99 @@ +package com.ar.imagetracear.adapter; + +import android.app.Activity; +import android.content.Intent; +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.recyclerview.widget.RecyclerView; + + +import com.ar.imagetracear.R; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.activity.SubListActivity; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; + +import java.util.List; + +public class HomeAdapter extends RecyclerView.Adapter { + + private final Activity activityContext; + private List imageEntries; + private final List originalCategories; + private final List displayCategoryNames; + + public HomeAdapter(Activity activityContext, List imageEntries, + List originalCategories, List displayCategoryNames) { + this.activityContext = activityContext; + this.imageEntries = imageEntries; + this.originalCategories = originalCategories; + this.displayCategoryNames = displayCategoryNames; + } + + public void updateData(List newEntries) { + this.imageEntries = newEntries; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View layoutView = layoutInflater.inflate(R.layout.item_home, parent, false); + return new ItemHolder(layoutView); + } + + @Override + public void onBindViewHolder(@NonNull ItemHolder holder, int position) { + if (position < 0 || position >= imageEntries.size() + || position >= displayCategoryNames.size() + || position >= originalCategories.size()) { + return; + } + + ImageTraceEntry currentEntry = imageEntries.get(position); + String displayName = displayCategoryNames.get(position); + String originalName = originalCategories.get(position); + + holder.textView.setText(displayName); + + String imagePath = "file:///android_asset/" + currentEntry.getPath(); + + Glide.with(activityContext) + .load(imagePath) + .transform(new CenterCrop(), new RoundedCorners(32)) + .placeholder(R.mipmap.placeholder) + .error(R.mipmap.placeholder) + .into(holder.imageView); + + holder.imageView.setOnClickListener(v -> { + Intent intent = new Intent(activityContext, SubListActivity.class); + intent.putExtra("Original", originalName); + intent.putExtra("Title", displayName); + activityContext.startActivity(intent); + }); + } + + @Override + public int getItemCount() { + return imageEntries != null ? imageEntries.size() : 0; + } + + static class ItemHolder extends RecyclerView.ViewHolder { + + final ImageView imageView; + final TextView textView; + + public ItemHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.item_imageview); + textView = itemView.findViewById(R.id.item_textview); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/adapter/ImportAdapter.java b/app/src/main/java/com/ar/imagetracear/adapter/ImportAdapter.java new file mode 100644 index 0000000..97c9c85 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/adapter/ImportAdapter.java @@ -0,0 +1,140 @@ +package com.ar.imagetracear.adapter; + +import android.app.Activity; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + + +import com.ar.imagetracear.R; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.activity.ImageTraceActivity; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; + +import java.util.List; +import java.util.concurrent.Executors; + +public class ImportAdapter extends RecyclerView.Adapter { + + private static final int VIEW_TYPE_HEADER = 0; + private static final int VIEW_TYPE_CONTENT = 1; + + private List traceList; + private final Activity contextActivity; + private final OnHeaderClickListener headerCallback; + + public ImportAdapter(List traceList, Activity contextActivity, OnHeaderClickListener headerCallback) { + this.traceList = traceList; + this.contextActivity = contextActivity; + this.headerCallback = headerCallback; + } + + public interface OnHeaderClickListener { + void onHeaderClick(); + } + + @Override + public int getItemViewType(int index) { + return index == 0 ? VIEW_TYPE_HEADER : VIEW_TYPE_CONTENT; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup root, int type) { + LayoutInflater inflater = LayoutInflater.from(root.getContext()); + + if (type == VIEW_TYPE_HEADER) { + View headerView = inflater.inflate(R.layout.item_special_view, root, false); + return new HeaderViewHolder(headerView); + } else { + View entryView = inflater.inflate(R.layout.item_import, root, false); + return new ContentViewHolder(entryView); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (getItemViewType(position) == VIEW_TYPE_HEADER) { + HeaderViewHolder header = (HeaderViewHolder) holder; + header.itemView.setOnClickListener(view -> { + if (headerCallback != null) { + headerCallback.onHeaderClick(); + } + }); + } else { + ContentViewHolder contentHolder = (ContentViewHolder) holder; + ImageTraceEntry entry = traceList.get(position - 1); + contentHolder.populate(entry); + } + } + + @Override + public int getItemCount() { + return (traceList != null ? traceList.size() : 0) + 1; + } + + public void updateList(List newList) { + this.traceList = newList; + notifyDataSetChanged(); + } + + static class HeaderViewHolder extends RecyclerView.ViewHolder { + public HeaderViewHolder(@NonNull View itemView) { + super(itemView); + } + } + + class ContentViewHolder extends RecyclerView.ViewHolder { + ImageView imagePreviewView; + ImageView favoriteToggleView; + + public ContentViewHolder(@NonNull View itemView) { + super(itemView); + imagePreviewView = itemView.findViewById(R.id.image_view); + favoriteToggleView = itemView.findViewById(R.id.btn_favorite); + } + + void populate(ImageTraceEntry entryData) { + String filePath = entryData.getPath(); + + Glide.with(contextActivity) + .load(filePath) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .transform(new CenterCrop(), new RoundedCorners(32)) + .placeholder(R.mipmap.placeholder) + .error(R.mipmap.placeholder) + .into(imagePreviewView); + + favoriteToggleView.setImageResource(entryData.isFavorite() ? R.drawable.like : R.drawable.dislike); + + favoriteToggleView.setOnClickListener(click -> { + boolean newStatus = !entryData.isFavorite(); + entryData.setFavorite(newStatus); + + Executors.newSingleThreadExecutor().execute(() -> { + AppDatabase.getInstance(contextActivity).imageTraceEntryDao().update(entryData); + }); + + int adapterPos = getAdapterPosition(); + if (adapterPos != RecyclerView.NO_POSITION) { + notifyItemChanged(adapterPos); + } + }); + + imagePreviewView.setOnClickListener(click -> { + Intent previewIntent = new Intent(contextActivity, ImageTraceActivity.class); + previewIntent.putExtra("imagePath", entryData.getPath()); + contextActivity.startActivity(previewIntent); + }); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/adapter/MainAdapter.java b/app/src/main/java/com/ar/imagetracear/adapter/MainAdapter.java new file mode 100644 index 0000000..6c5c244 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/adapter/MainAdapter.java @@ -0,0 +1,37 @@ +package com.ar.imagetracear.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + + +import com.ar.imagetracear.fragment.HomeFragment; +import com.ar.imagetracear.fragment.CollectionFragment; +import com.ar.imagetracear.fragment.ImportFragment; + +import java.util.ArrayList; +import java.util.List; + +public class MainAdapter extends FragmentStateAdapter { + private final List fragmentList; + + public MainAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + fragmentList = new ArrayList<>(); + fragmentList.add(new HomeFragment()); + fragmentList.add(new ImportFragment()); + fragmentList.add(new CollectionFragment()); + } + + @NonNull + @Override + public Fragment createFragment(int position) { + return fragmentList.get(position); + } + + @Override + public int getItemCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/ar/imagetracear/adapter/SubListAdapter.java b/app/src/main/java/com/ar/imagetracear/adapter/SubListAdapter.java new file mode 100644 index 0000000..787b134 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/adapter/SubListAdapter.java @@ -0,0 +1,105 @@ +package com.ar.imagetracear.adapter; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.ar.imagetracear.R; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.activity.ImageTraceActivity; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; + +import java.util.List; +import java.util.concurrent.Executors; + +public class SubListAdapter extends RecyclerView.Adapter { + + private List entryList; + private final Context contextRef; + + public SubListAdapter(Context contextRef, List entryList) { + this.contextRef = contextRef; + this.entryList = entryList; + } + + public void updateEntries(List newList) { + this.entryList = newList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ItemHolder onCreateViewHolder(@NonNull ViewGroup parentGroup, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(contextRef); + View listItemView = layoutInflater.inflate(R.layout.item_import, parentGroup, false); + return new ItemHolder(listItemView); + } + + @Override + public void onBindViewHolder(@NonNull ItemHolder holder, int position) { + ImageTraceEntry trace = entryList.get(position); + holder.display(trace); + } + + @Override + public int getItemCount() { + return entryList != null ? entryList.size() : 0; + } + + class ItemHolder extends RecyclerView.ViewHolder { + + private final ImageView imageView; + private final ImageView favIcon; + + ItemHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.image_view); + favIcon = itemView.findViewById(R.id.btn_favorite); + } + + void display(ImageTraceEntry data) { + final String originalPath = data.getPath(); + final String displayPath = originalPath.startsWith("/data/user/") + ? originalPath + : "file:///android_asset/" + originalPath; + + Glide.with(contextRef) + .load(displayPath) + .transform(new CenterCrop(), new RoundedCorners(32)) + .placeholder(R.mipmap.placeholder) + .error(R.mipmap.placeholder) + .into(imageView); + + imageView.setOnClickListener(view -> { + Intent showIntent = new Intent(contextRef, ImageTraceActivity.class); + showIntent.putExtra("imagePath", originalPath); + contextRef.startActivity(showIntent); + }); + + favIcon.setImageResource(data.isFavorite() ? R.drawable.like : R.drawable.dislike); + + favIcon.setOnClickListener(view -> { + boolean toggledFavorite = !data.isFavorite(); + data.setFavorite(toggledFavorite); + + Executors.newSingleThreadExecutor().execute(() -> { + AppDatabase.getInstance(contextRef).imageTraceEntryDao().update(data); + }); + + int adapterPosition = getAdapterPosition(); + if (adapterPosition != RecyclerView.NO_POSITION) { + notifyItemChanged(adapterPosition); + } + }); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/database/AppDatabase.java b/app/src/main/java/com/ar/imagetracear/database/AppDatabase.java new file mode 100644 index 0000000..9688dce --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/database/AppDatabase.java @@ -0,0 +1,30 @@ +package com.ar.imagetracear.database; + +import android.content.Context; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import com.ar.imagetracear.MyApplication; + +@Database(entities = {ImageTraceEntry.class}, version = MyApplication.DATABASE_VERSION, exportSchema = false) +public abstract class AppDatabase extends RoomDatabase { + + public abstract ImageTraceEntryDao imageTraceEntryDao(); + + private static volatile AppDatabase INSTANCE; + + public static AppDatabase getInstance(Context context) { + if (INSTANCE == null) { + synchronized (AppDatabase.class) { + if (INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + AppDatabase.class, MyApplication.DATABASE_NAME) + .build(); + } + } + } + return INSTANCE; + } +} diff --git a/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntry.java b/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntry.java new file mode 100644 index 0000000..cbc4fd1 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntry.java @@ -0,0 +1,57 @@ +package com.ar.imagetracear.database; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import java.io.Serializable; + +@Entity(tableName = "imageTrace_entry") +public class ImageTraceEntry implements Serializable { + + @PrimaryKey(autoGenerate = true) + private int id; + + private String path; + + private boolean type; + + private boolean isFavorite; + + public ImageTraceEntry(boolean isFavorite, Boolean type, String path) { + this.isFavorite = isFavorite; + this.type = type; + this.path = path; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean isType() { + return type; + } + + public void setType(boolean type) { + this.type = type; + } + + public boolean isFavorite() { + return isFavorite; + } + + public void setFavorite(boolean favorite) { + isFavorite = favorite; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntryDao.java b/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntryDao.java new file mode 100644 index 0000000..b2b67ee --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/database/ImageTraceEntryDao.java @@ -0,0 +1,36 @@ +package com.ar.imagetracear.database; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; +import androidx.room.Update; + +import java.util.List; + +@Dao +public interface ImageTraceEntryDao { + @Insert + void insertAll(List imageTraceEntry); + + @Insert + void insert(ImageTraceEntry imageTraceEntry); + + @Update + void update(ImageTraceEntry imageTraceEntry); + + @Query("SELECT * FROM imageTrace_entry WHERE path LIKE :path || '/%' AND type = 0 ORDER BY id DESC") + LiveData> getFileByPath(String path); + + @Query("SELECT * FROM imageTrace_entry WHERE path LIKE :path || '/%' AND type = 0 ORDER BY id DESC LIMIT 1") + LiveData> getFileByPathLimitOne(String path); + + @Query("SELECT * FROM imageTrace_entry WHERE type = 1 ") + LiveData> getImportLive(); + + @Query("SELECT * FROM imageTrace_entry WHERE type = 1 ") + List getImport(); + + @Query("SELECT * FROM imageTrace_entry WHERE isFavorite = 1 ") + LiveData> getFavorite(); +} diff --git a/app/src/main/java/com/ar/imagetracear/fragment/CollectionFragment.java b/app/src/main/java/com/ar/imagetracear/fragment/CollectionFragment.java new file mode 100644 index 0000000..e327e10 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/fragment/CollectionFragment.java @@ -0,0 +1,69 @@ +package com.ar.imagetracear.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.GridLayoutManager; + + +import com.ar.imagetracear.databinding.FragmentCollectionBinding; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.adapter.SubListAdapter; +import com.ar.imagetracear.utils.ItemDecoration; + +import java.util.ArrayList; +import java.util.List; + +public class CollectionFragment extends Fragment { + private FragmentCollectionBinding viewBinding; + private SubListAdapter imageAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { + viewBinding = FragmentCollectionBinding.inflate(inflater, container, false); + + initGridList(); + retrieveFavorites(); + + return viewBinding.getRoot(); + } + + private void initGridList() { + Context context = requireContext(); + viewBinding.recyclerview.setLayoutManager(new GridLayoutManager(context, 2)); + + imageAdapter = new SubListAdapter(context, new ArrayList<>()); + viewBinding.recyclerview.setAdapter(imageAdapter); + + ItemDecoration spacing = new ItemDecoration(16, 19, 10); + viewBinding.recyclerview.addItemDecoration(spacing); + } + + private void retrieveFavorites() { + AppDatabase database = AppDatabase.getInstance(requireContext()); + database.imageTraceEntryDao().getFavorite().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(List resultList) { + updateEmptyHint(resultList); + imageAdapter.updateEntries(resultList); + } + }); + } + + private void updateEmptyHint(List items) { + boolean hasData = items != null && !items.isEmpty(); + viewBinding.backgroundText.setVisibility(hasData ? View.GONE : View.VISIBLE); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + viewBinding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/fragment/HomeFragment.java b/app/src/main/java/com/ar/imagetracear/fragment/HomeFragment.java new file mode 100644 index 0000000..421f402 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/fragment/HomeFragment.java @@ -0,0 +1,97 @@ +package com.ar.imagetracear.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; + + +import com.ar.imagetracear.databinding.FragmentHomeBinding; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.adapter.HomeAdapter; +import com.ar.imagetracear.utils.ItemDecoration; +import com.ar.imagetracear.utils.Names; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +public class HomeFragment extends Fragment { + private FragmentHomeBinding viewBinding; + private final List categoryNames = Names.getAllImage(); + private final List labelNames = new ArrayList<>(); + private HomeAdapter homeListAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + viewBinding = FragmentHomeBinding.inflate(inflater, container, false); + + prepareLabels(); + initializeGridList(); + fetchAllCategoryThumbnails(categoryNames); + + return viewBinding.getRoot(); + } + + private void prepareLabels() { + for (String item : categoryNames) { + if (item.length() > 4) { + labelNames.add(item.substring(4)); + } else { + labelNames.add(item); + } + } + } + + private void initializeGridList() { + viewBinding.recyclerview.setLayoutManager(new GridLayoutManager(getContext(), 1)); + homeListAdapter = new HomeAdapter(requireActivity(), new ArrayList<>(), categoryNames, labelNames); + viewBinding.recyclerview.setAdapter(homeListAdapter); + viewBinding.recyclerview.addItemDecoration(new ItemDecoration(16, 19, 10)); + } + + private void fetchAllCategoryThumbnails(List allCategories) { + int expectedSize = allCategories.size(); + Map> cacheMap = new HashMap<>(); + + for (int index = 0; index < expectedSize; index++) { + final int currentIndex = index; + String key = allCategories.get(currentIndex); + + AppDatabase.getInstance(requireContext()) + .imageTraceEntryDao() + .getFileByPathLimitOne(key) + .observe(getViewLifecycleOwner(), imageList -> { + cacheMap.put(currentIndex, imageList); + if (cacheMap.size() == expectedSize) { + aggregateAndDisplay(cacheMap, expectedSize); + } + }); + } + } + + private void aggregateAndDisplay(Map> resultData, int count) { + List mergedList = new CopyOnWriteArrayList<>(); + + for (int idx = 0; idx < count; idx++) { + List section = resultData.get(idx); + if (section != null && !section.isEmpty()) { + mergedList.addAll(section); + } + } + + homeListAdapter.updateData(mergedList); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + viewBinding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/fragment/ImportFragment.java b/app/src/main/java/com/ar/imagetracear/fragment/ImportFragment.java new file mode 100644 index 0000000..6fa535c --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/fragment/ImportFragment.java @@ -0,0 +1,171 @@ +package com.ar.imagetracear.fragment; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +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.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.LiveData; +import androidx.recyclerview.widget.GridLayoutManager; + + +import com.ar.imagetracear.databinding.FragmentImportBinding; +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.database.ImageTraceEntryDao; +import com.ar.imagetracear.adapter.ImportAdapter; +import com.ar.imagetracear.utils.ItemDecoration; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class ImportFragment extends Fragment implements ImportAdapter.OnHeaderClickListener { + private FragmentImportBinding binding; + private ImportAdapter adapter; + private ImageTraceEntryDao dbDao; + private final List pathCache = new ArrayList<>(); + private static final int IMAGE_SIZE_LIMIT = 5 * 1024 * 1024; + + private final ActivityResultLauncher pickerLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + Uri selected = result.getData().getData(); + if (selected != null) { + handlePickedImage(selected); + } + } + }); + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentImportBinding.inflate(inflater, container, false); + + initializeDatabase(); + prepareImageGrid(); + subscribeToImageUpdates(); + + return binding.getRoot(); + } + + private void initializeDatabase() { + dbDao = AppDatabase.getInstance(requireContext()).imageTraceEntryDao(); + } + + private void prepareImageGrid() { + binding.recyclerview.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + binding.recyclerview.addItemDecoration(new ItemDecoration(16, 19, 10)); + adapter = new ImportAdapter(new ArrayList<>(), requireActivity(), this); + binding.recyclerview.setAdapter(adapter); + } + + private void subscribeToImageUpdates() { + LiveData> liveImages = dbDao.getImportLive(); + liveImages.observe(getViewLifecycleOwner(), updated -> adapter.updateList(updated)); + } + + @Override + public void onResume() { + super.onResume(); + adapter.notifyDataSetChanged(); + } + + @Override + public void onHeaderClick() { + openImageChooser(); + } + + private void openImageChooser() { + Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + pickerLauncher.launch(intent); + } + + private void handlePickedImage(Uri uri) { + try { + if (checkImageSize(uri)) { + persistImage(uri); + } else { + Toast.makeText(requireContext(), "Image too large", Toast.LENGTH_SHORT).show(); + } + } catch (IOException ex) { + Toast.makeText(requireContext(), "Error reading image: " + ex.getMessage(), Toast.LENGTH_SHORT).show(); + } + } + + private boolean checkImageSize(Uri uri) throws IOException { + try (InputStream input = requireContext().getContentResolver().openInputStream(uri)) { + return input != null && input.available() <= IMAGE_SIZE_LIMIT; + } + } + + private void persistImage(Uri uri) { + try { + InputStream input = requireContext().getContentResolver().openInputStream(uri); + Bitmap bitmap = BitmapFactory.decodeStream(input); + if (bitmap == null) { + Toast.makeText(requireContext(), "Cannot decode image", Toast.LENGTH_SHORT).show(); + return; + } + + File targetFile = new File(requireContext().getFilesDir(), System.currentTimeMillis() + ".jpg"); + try (FileOutputStream out = new FileOutputStream(targetFile)) { + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + } + if (input != null) input.close(); + + saveToDb(targetFile.getAbsolutePath(), targetFile); + + } catch (IOException e) { + Toast.makeText(requireContext(), "Failed to save image: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + } + } + + private void saveToDb(String imagePath, File file) { + new Thread(() -> { + if (imageAlreadyExists(imagePath, file)) { + requireActivity().runOnUiThread(() -> + Toast.makeText(requireContext(), "Duplicate image", Toast.LENGTH_SHORT).show()); + file.delete(); + return; + } + pathCache.add(imagePath); + dbDao.insert(new ImageTraceEntry(false, true, imagePath)); + }).start(); + } + + private boolean imageAlreadyExists(String imagePath, File fileToCheck) { + for (String existing : pathCache) { + if (sameFileSize(new File(existing), fileToCheck)) return true; + } + List stored = dbDao.getImport(); + for (ImageTraceEntry item : stored) { + if (sameFileSize(new File(item.getPath()), fileToCheck)) return true; + } + return false; + } + + private boolean sameFileSize(File a, File b) { + return a.length() == b.length(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/topon/AdListener.java b/app/src/main/java/com/ar/imagetracear/topon/AdListener.java new file mode 100644 index 0000000..39cf061 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/AdListener.java @@ -0,0 +1,10 @@ +package com.ar.imagetracear.topon; + +public interface AdListener { + void loadFail(String placeId); + void showSuccess(); + + void showFail(); + + void showClose(); +} diff --git a/app/src/main/java/com/ar/imagetracear/topon/AdManager.java b/app/src/main/java/com/ar/imagetracear/topon/AdManager.java new file mode 100644 index 0000000..f306f2e --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/AdManager.java @@ -0,0 +1,250 @@ +package com.ar.imagetracear.topon; + +import android.app.Activity; +import android.os.CountDownTimer; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.anythink.core.api.ATAdInfo; +import com.anythink.core.api.AdError; +import com.anythink.interstitial.api.ATInterstitial; +import com.anythink.interstitial.api.ATInterstitialListener; +import com.ar.imagetracear.MyApplication; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class AdManager { + + private static final int type_no_cache = 0; + private static final int type_has_cache = 1; + private static final int type_show_success = 2; + private static final int type_show_close = 3; + private static final int type_show_fail = 4; + + /** + ImageTrace_INTER_3 + n6847dd761105c + ImageTrace_INTER_2 + n6847dd570a50d + ImageTrace_INTER_1 + n6847dd408d2e0 + */ + + private static final String place1Id = "n6847dd408d2e0"; + private static final String place2Id = "n6847dd570a50d"; + private static final String place3Id = "n6847dd761105c"; + + + private static boolean place1LoadFail = false; + private static boolean place2LoadFail = false; + private static boolean place3LoadFail = false; + + private static boolean alreadyShow = false; + + private static List list = new ArrayList<>(); + + + public static void loadAllAd() { + if (list.isEmpty()) { + ATInterstitial mInterstitialAd1 = new ATInterstitial(MyApplication.getContext(), place1Id); + ATInterstitial mInterstitialAd2 = new ATInterstitial(MyApplication.getContext(), place2Id); + ATInterstitial mInterstitialAd3 = new ATInterstitial(MyApplication.getContext(), place3Id); + list.add(mInterstitialAd1); + list.add(mInterstitialAd2); + list.add(mInterstitialAd3); + } + for (ATInterstitial ad : list) { + if (!ad.isAdReady()) { + setCallBack(ad, new AdListener() { + @Override + public void loadFail(@NonNull String placeId) { + if (placeId.equals(place1Id)) { + place1LoadFail = true; + } + if (placeId.equals(place2Id)) { + place2LoadFail = true; + } + if (placeId.equals(place3Id)) { + place3LoadFail = true; + } + } + + @Override + public void showSuccess() { + + } + + @Override + public void showFail() { + + } + + @Override + public void showClose() { + + } + }); + ad.load(); + } + } + + } + + private static ATInterstitial getReadyAd() { + Collections.shuffle(list); + for (ATInterstitial ad : list) { + if (ad.isAdReady()) { + Log.d(MyApplication.TAG, "-has Cache------------"); + return ad; + } + } + Log.d(MyApplication.TAG, "-No Cache------------"); + return null; + } + + private static void setCallBack(ATInterstitial ad, AdListener listener) { + ad.setAdListener(new ATInterstitialListener() { + + + @Override + public void onInterstitialAdLoaded() { + Log.d(MyApplication.TAG, "LoadLoaded " + ad.mPlacementId); + } + + @Override + public void onInterstitialAdLoadFail(AdError adError) { + listener.loadFail(ad.mPlacementId); + Log.d(MyApplication.TAG, "LoadFail:--" + ad.mPlacementId + "--" + adError.getCode() + "---" + adError.getDesc()); + } + + @Override + public void onInterstitialAdClicked(ATAdInfo atAdInfo) { + + } + + @Override + public void onInterstitialAdShow(ATAdInfo atAdInfo) { + Log.d(MyApplication.TAG, "AdShow " + atAdInfo.getShowId()); + listener.showSuccess(); + ad.load(); + } + + @Override + public void onInterstitialAdClose(ATAdInfo atAdInfo) { + listener.showClose(); + } + + @Override + public void onInterstitialAdVideoStart(ATAdInfo atAdInfo) { + + } + + @Override + public void onInterstitialAdVideoEnd(ATAdInfo atAdInfo) { + + } + + @Override + public void onInterstitialAdVideoError(AdError adError) { + + } + }); + } + + public static void setAlreadyShow() { + alreadyShow = false; + } + + + public static CountDownTimer showWelcomeAd( + Activity activity, + Long totalTim, + CountAction countAction, + GoMainAction goMain + ) { + + CountDownTimer timer = new CountDownTimer(totalTim, 100) { + @Override + public void onTick(long millisUntilFinished) { + countAction.onCount(millisUntilFinished); + if (!alreadyShow) { + showAD(activity, new AdStatusAction() { + @Override + public void onStatus(int adType) { + if (adType == type_has_cache) { + alreadyShow = true; + } + if (adType == type_show_close || adType == type_show_fail) { + goMain.onGo(); + } + + } + }); + } + } + + @Override + public void onFinish() { + if (!alreadyShow) { + showTopOn(activity, new onActionListener() { + @Override + public void onAction() { + goMain.onGo(); + } + }); + } + } + }; + + + return timer; + } + + private static void showAD(Activity activity, AdStatusAction action) { + ATInterstitial readyAd = getReadyAd(); + if (readyAd != null) { + action.onStatus(type_has_cache); + setCallBack(readyAd, new AdListener() { + @Override + public void loadFail(@NonNull String placeId) { + + } + + @Override + public void showSuccess() { + action.onStatus(type_show_success); + } + + @Override + public void showFail() { + action.onStatus(type_show_fail); + } + + @Override + public void showClose() { + action.onStatus(type_show_close); + } + }); + readyAd.show(activity); + } else { + action.onStatus(type_no_cache); + + } + } + + + public static void showTopOn(Activity activity, onActionListener listener) { + showAD(activity, new AdStatusAction() { + @Override + public void onStatus(int adType) { + if (adType == type_no_cache || adType == type_show_close || adType == type_show_fail) { + listener.onAction(); + } + } + }); + + } +} diff --git a/app/src/main/java/com/ar/imagetracear/topon/AdStatusAction.java b/app/src/main/java/com/ar/imagetracear/topon/AdStatusAction.java new file mode 100644 index 0000000..5a1eb42 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/AdStatusAction.java @@ -0,0 +1,5 @@ +package com.ar.imagetracear.topon; + +public interface AdStatusAction { + void onStatus(int adType); +} diff --git a/app/src/main/java/com/ar/imagetracear/topon/CountAction.java b/app/src/main/java/com/ar/imagetracear/topon/CountAction.java new file mode 100644 index 0000000..7fade87 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/CountAction.java @@ -0,0 +1,5 @@ +package com.ar.imagetracear.topon; + +public interface CountAction { + void onCount(long millisUntilFinished); +} diff --git a/app/src/main/java/com/ar/imagetracear/topon/GoMainAction.java b/app/src/main/java/com/ar/imagetracear/topon/GoMainAction.java new file mode 100644 index 0000000..d28a906 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/GoMainAction.java @@ -0,0 +1,5 @@ +package com.ar.imagetracear.topon; + +public interface GoMainAction { + void onGo(); +} diff --git a/app/src/main/java/com/ar/imagetracear/topon/onActionListener.java b/app/src/main/java/com/ar/imagetracear/topon/onActionListener.java new file mode 100644 index 0000000..e1159f4 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/topon/onActionListener.java @@ -0,0 +1,6 @@ +package com.ar.imagetracear.topon; + +public interface onActionListener { + + void onAction(); +} diff --git a/app/src/main/java/com/ar/imagetracear/upload/AESUtils.kt b/app/src/main/java/com/ar/imagetracear/upload/AESUtils.kt new file mode 100644 index 0000000..a5c02f9 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/upload/AESUtils.kt @@ -0,0 +1,105 @@ +package com.ar.imagetracear.upload + +import android.app.Activity +import android.util.Base64 +import java.security.SecureRandom +import javax.crypto.Cipher +import javax.crypto.KeyGenerator +import javax.crypto.SecretKey +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + + +object AESUtils { +// private const val AES_MODE = "AES/CBC/PKCS5Padding" + private const val AES_MODE = "AES" + private const val AES_ALGORITHM = "AES" + private const val AES_KEY_SIZE = 256 // 支持 128/192/256 + + /** + * 生成 AES 密钥 + */ + fun generateAESKey(): String { + val keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM) + keyGenerator.init(AES_KEY_SIZE, SecureRandom()) + val secretKey: SecretKey = keyGenerator.generateKey() + return Base64.encodeToString(secretKey.encoded, Base64.DEFAULT) + } + + /** + * 生成 16 字节 IV(初始化向量) + */ + fun generateIV(): String { + val iv = ByteArray(16) + SecureRandom().nextBytes(iv) + return Base64.encodeToString(iv, Base64.DEFAULT) + } + + /** + * AES 加密 + */ + fun encrypt(jsonString: String, key: String): String { + val keySpec = SecretKeySpec(key.toByteArray(Charsets.UTF_8), AES_ALGORITHM) + val ivSpec = IvParameterSpec(key.toByteArray(Charsets.UTF_8)) + + val cipher = Cipher.getInstance(AES_MODE) + cipher.init(Cipher.ENCRYPT_MODE, keySpec) + + val encryptedBytes = cipher.doFinal(jsonString.toByteArray(Charsets.UTF_8)) + return Base64.encodeToString(encryptedBytes, Base64.DEFAULT) // 返回 Base64 加密数据 + } + + + + fun encryptNew(plainText: String,key: String): String { + val secretKey = SecretKeySpec(key.toByteArray(), AES_MODE) + val cipher = Cipher.getInstance(AES_MODE) + cipher.init(Cipher.ENCRYPT_MODE, secretKey) + val encryptedBytes = cipher.doFinal(plainText.toByteArray()) + return Base64.encodeToString(encryptedBytes, Base64.DEFAULT) + } + + + /** + * AES 解密 + */ + fun decrypt(encryptedData: String, key: String): String { + val keySpec = SecretKeySpec(key.toByteArray(Charsets.UTF_8), AES_ALGORITHM) + val ivSpec = IvParameterSpec(key.toByteArray(Charsets.UTF_8)) + + val cipher = Cipher.getInstance(AES_MODE) + cipher.init(Cipher.DECRYPT_MODE, keySpec) + + val decryptedBytes = cipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT)) + return String(decryptedBytes, Charsets.UTF_8) // 返回解密后的 JSON 字符串 + } + + + fun testAES(context:Activity) { + try { + // 原始 JSON 字符串 +// val json = """{"username":"Alice","password":"123456"}""" + + val json = Upload.getData(context) + + // 生成 AES 密钥和 IV + val aesKey = "e67cbcee5e573d1b" + val aesIV = generateIV() + + println("AES 密钥: $aesKey") +// println("AES IV: $aesIV") + + // 加密 JSON + val encryptedData = encrypt(json, aesKey) + println("加密后: $encryptedData") + + // 解密 JSON + val decryptedData = decrypt(encryptedData, aesKey) + println("解密后: $decryptedData") + + } catch (e: Exception) { + e.printStackTrace() + } + } + +} diff --git a/app/src/main/java/com/ar/imagetracear/upload/Http.kt b/app/src/main/java/com/ar/imagetracear/upload/Http.kt new file mode 100644 index 0000000..c371215 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/upload/Http.kt @@ -0,0 +1,72 @@ +package com.ar.imagetracear.upload + +import android.app.Activity +import android.util.Log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import okhttp3.Call +import okhttp3.Callback +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import okhttp3.logging.HttpLoggingInterceptor +import org.json.JSONObject +import java.io.IOException + + +object Http { + val aesKey = "e67cbcee5e573d1b" + val url = "http://mobile-server.lux-ad.com:58077/api/mobile/save" + + + fun makeGetRequest(context: Activity) { + val logging = HttpLoggingInterceptor() + logging.setLevel(HttpLoggingInterceptor.Level.BODY) + + + + GlobalScope.launch(Dispatchers.IO) { + val data = Upload.getData(context) + + withContext(Dispatchers.Main){ + val encryptJson = AESUtils.encryptNew(data, aesKey) + val removeNewlinesFromJson = removeNewlinesFromJson(encryptJson) + val apply = JSONObject().apply { + put("encrypted", removeNewlinesFromJson) + } + val client: OkHttpClient = OkHttpClient.Builder() + .addInterceptor(logging) + .build() +// val client = OkHttpClient() + val requestBody: RequestBody = + apply.toString().toRequestBody("application/json; charset=utf-8".toMediaType()) + + val request: Request = Request.Builder() + .url(url) + .post(requestBody) + .build() + client.newCall(request).enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + Log.e("==================", "onFailure e=${e.message}") + } + + override fun onResponse(call: Call, response: Response) { + Log.e("==================", "response=${response.code} ${response.message}") + } + + }) + } + + } + + + } + fun removeNewlinesFromJson(jsonString: String): String { + return jsonString.replace("\n", "").replace("\r", "") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/upload/SaveUtils.kt b/app/src/main/java/com/ar/imagetracear/upload/SaveUtils.kt new file mode 100644 index 0000000..c413303 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/upload/SaveUtils.kt @@ -0,0 +1,47 @@ +package com.ar.imagetracear.upload + +import android.content.Context +import android.content.SharedPreferences +import com.ar.imagetracear.MyApplication + + +object SaveUtils { + + + val IS_POST = MyApplication.getContext().packageName+"is_post" + private var shared: SharedPreferences? = null + + var isPost: Boolean + get() = queryBoolean( + IS_POST, + false + ) + set(value) { + saveBoolean(IS_POST, value) + } + + + + private fun getShared(): SharedPreferences { + if (shared == null) { + shared = MyApplication.getContext().getSharedPreferences("Wallpaper", Context.MODE_PRIVATE) + } + return shared!! + + } + + + fun saveBoolean(key: String, value: Boolean) { + getShared().edit() + .putBoolean(key, value).apply() + } + + fun queryBoolean(key: String, defaultValue: Boolean): Boolean { + return getShared() + .getBoolean(key, defaultValue) + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/upload/Upload.kt b/app/src/main/java/com/ar/imagetracear/upload/Upload.kt new file mode 100644 index 0000000..305f095 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/upload/Upload.kt @@ -0,0 +1,353 @@ +package com.ar.imagetracear.upload + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.location.Location +import android.net.wifi.WifiInfo +import android.net.wifi.WifiManager +import android.os.BatteryManager +import android.os.Build +import android.os.SystemClock +import android.provider.Settings +import android.telephony.TelephonyManager +import android.text.format.Formatter +import android.util.Log +import android.webkit.WebView +import com.google.android.gms.ads.identifier.AdvertisingIdClient +import org.json.JSONObject +import java.io.File +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +object Upload { + + + fun getData(context: Activity): String { + + val jsonObject = JSONObject() + + val id = getDeviceId(context) + jsonObject.put("gaid", id) + + getWebViewPackageInfo(context)?.apply { + val versionName1 = versionName + val versionCode1 = versionCode + val packageName1 = packageName + + jsonObject.put("webVersionName", versionName) + jsonObject.put("webVersionCode", versionCode) + jsonObject.put("webPackageName", packageName) +// Log.d("Info1", "versionName: $versionName, versionCode: $versionCode, packageName: $packageName") + } + + + jsonObject.put("brand", Build.BRAND) + jsonObject.put("manufacturer", Build.MANUFACTURER) + jsonObject.put("model", Build.MODEL) + jsonObject.put("product", Build.PRODUCT) + jsonObject.put("device", Build.DEVICE) + jsonObject.put("board", Build.BOARD) + jsonObject.put("hardware", Build.HARDWARE) + jsonObject.put("fingerPrint", Build.FINGERPRINT) + jsonObject.put("buildId", Build.ID) + jsonObject.put("display", Build.DISPLAY) + jsonObject.put("type", Build.TYPE) + jsonObject.put("user", Build.USER) + jsonObject.put("host", Build.HOST) + jsonObject.put("tags", Build.TAGS) + jsonObject.put("serial", Build.SERIAL) + jsonObject.put("bootloader", Build.BOOTLOADER) + jsonObject.put("sdkInt", Build.VERSION.SDK_INT) + jsonObject.put("androidVersion", Build.VERSION.RELEASE) + jsonObject.put("baseOs", Build.VERSION.BASE_OS) + jsonObject.put("incremental", Build.VERSION.INCREMENTAL) + jsonObject.put("codename", Build.VERSION.CODENAME) + + + val androidID = getAndroidID(context) + jsonObject.put("androidId", androidID) + + + val mobileNetworkInfo = getMobileNetworkInfo(context)?.let { + //SIM卡的运营商名称 + it.networkOperatorName + //SIM卡的运营商代码 + it.simOperator + //国家代码 + it.simCountryIso + //SIM 卡状态 + it.simState + jsonObject.put("simOperator", it.simOperator) + jsonObject.put("simOperatorName", it.networkOperatorName) + jsonObject.put("simCountry", it.simCountryIso) + jsonObject.put("simState", it.simState) + +// if (ActivityCompat.checkSelfPermission( +// context, +// Manifest.permission.READ_PHONE_STATE +// ) != PackageManager.PERMISSION_GRANTED +// ) { +// //没有权限 +// Log.e("==================", "无法获取phone权限") +// return@let +// } else { +// //网络类型 +// val networkType = getNet(it.networkType) +// jsonObject.put("networkType",networkType) +// } + + + } + getWifiInfo(context).let { wifiInfo -> + val ssid = wifiInfo.ssid // WiFi 名称 + val bssid = wifiInfo.bssid // 路由器 MAC 地址 + val ip = wifiInfo.ipAddress + val ipAddress: String = Formatter.formatIpAddress(ip) // IP 地址 +// Log.d("WiFi Info", "SSID: $ssid, BSSID: $bssid, IP: $ipAddress") + + jsonObject.put("wifiSSID", ssid) + jsonObject.put("wifiBSSID", bssid) + + } + +// getLastLocation(context){location-> +// location?.let { +// val latitude: Double = location.latitude +// val longitude: Double = location.longitude +// val accuracy = location.accuracy // 获取精度(米) +// jsonObject.put("longitude",longitude) +// jsonObject.put("latitude",latitude) +//// jsonObject.put("randomOffset",latitude) +// Log.d("Location", "纬度: $latitude, 经度: $longitude") +// } +// } + + //电池电量 + val batteryInfo = getBatteryInfo(context) + jsonObject.put("batteryLevel", batteryInfo) + + //处理器核心数 + val coreCount = Runtime.getRuntime().availableProcessors() + jsonObject.put("availableProcessors", coreCount) + + //系统启动时长 +// val convertTimestampToDate = +// convertTimestampToDate(System.currentTimeMillis() - SystemClock.elapsedRealtime()) +// val systemUptime = getSystemUptime() + jsonObject.put("systemStarTime", SystemClock.elapsedRealtime()) + + //应用程序 APK 文件的最后修改时间 + val installTime = getInstallTime(context) + jsonObject.put("apkLastModified", installTime) + + //安装来源 + val installSource = getInstallSourceNew(context) + jsonObject.put("installerPkg", installSource) + + + Log.d("===================================", jsonObject.toString()) + return jsonObject.toString() + + } + + + fun getInstallSource(context: Context): String? { + val packageManager = context.packageManager + val installer = packageManager.getInstallerPackageName(context.packageName) + return installer ?: "未知" + } + + fun getInstallSourceNew(context: Context): String? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API 30+ + try { + val packageManager = context.packageManager + val installSourceInfo = packageManager.getInstallSourceInfo(context.packageName) + installSourceInfo.installingPackageName // 安装来源 + } catch (e: PackageManager.NameNotFoundException) { + "未知" + } + } else { + getInstallSource(context) // 兼容 API 30 以下 + } + } + + fun getSystemUptime(): String { + val uptimeMillis = SystemClock.elapsedRealtime() // 设备启动后的毫秒数 + val uptimeSeconds = uptimeMillis / 1000 + val hours = uptimeSeconds / 3600 + val minutes = uptimeSeconds % 3600 / 60 + val seconds = uptimeSeconds % 60 + val uptimeFormatted = "$hours 小时 $minutes 分钟 $seconds 秒" + Log.d("DeviceInfo", "系统运行时间: $uptimeFormatted") + return uptimeFormatted + } + + private fun getLastLocation(context: Activity, result: (location: Location?) -> Unit) { +// val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context) +// +// if (ActivityCompat.checkSelfPermission( +// context, +// Manifest.permission.ACCESS_FINE_LOCATION +// ) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( +// context, +// Manifest.permission.ACCESS_COARSE_LOCATION +// ) != PackageManager.PERMISSION_GRANTED +// ) { +// Log.e("==================", "无法获取位置权限") +// return +// } +// fusedLocationClient.lastLocation +// .addOnSuccessListener(context, object : OnSuccessListener { +// override fun onSuccess(location: Location?) { +// result.invoke(location) +// if (location != null) { +// } else { +// +// Log.e("Location", "无法获取位置") +// } +// } +// }) + } + + fun getInstallTime(context: Context): String { + val lastModified = File(context.applicationInfo.sourceDir).lastModified() + return convertTimestampToDate(lastModified) + } + +// fun getInstallSource(context: Context): String? { +// return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// context.packageManager.getInstallSourceInfo(context.applicationInfo.packageName).installingPackageName +// } else { +// context.packageManager.getInstallerPackageName(context.applicationInfo.packageName) +// } +// +// } + + fun getBatteryInfo(context: Context): Int { + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + val batteryLevel = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) // 获取电池电量(0-100%) + val isCharging = batteryManager.isCharging // 是否在充电 + + return batteryLevel + } + + /** + * ACCESS_FINE_LOCATION + * + * ACCESS_WIFI_STATE + */ + fun getWifiInfo(context: Context): WifiInfo { + val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager + return wifiManager.connectionInfo + + } + + + /** + * READ_PHONE_STATE + */ + fun getMobileNetworkInfo(context: Context): TelephonyManager? { + val telephonyManager = + context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager + val operatorName = telephonyManager.networkOperatorName // 运营商名称 + + + return telephonyManager + + +// Log.d("Mobile Network", "Operator: $operatorName, Type: $networkType") + } + + fun getNet(networkType: Int): String { + return when (networkType) { + TelephonyManager.NETWORK_TYPE_LTE -> "4G" + + TelephonyManager.NETWORK_TYPE_NR -> "5G(Android 11+)" + + TelephonyManager.NETWORK_TYPE_HSPA -> "3G" + + TelephonyManager.NETWORK_TYPE_GPRS -> "2G" + else -> "" + } + } + + fun getWebViewPackageInfo(context: Activity): PackageInfo? { + val packageManager: PackageManager = context.packageManager + + // 如果系统支持直接获取 WebView 包信息 (Android 7.0 及以上) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + return WebView.getCurrentWebViewPackage() + } + // 如果不支持,尝试通过常见的 WebView 包名来获取信息 + val webviewPackageNames = listOf( + "com.google.android.webview", + "com.android.webview", + "com.android.chrome" + ) + for (packageName in webviewPackageNames) { + try { + val packageInfo = packageManager.getPackageInfo(packageName, 0) + if (packageInfo != null) { + return packageInfo + } + } catch (e: PackageManager.NameNotFoundException) { + // 忽略异常,继续尝试下一个包名 + } + } + // 如果都没有找到,返回 null + return null + } + + @SuppressLint("HardwareIds") + fun getAndroidID(context: Context): String? { + return Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) + } + + + fun convertTimestampToDate(timestamp: Long): String { + // 创建 SimpleDateFormat 实例 + val format = "yyyy-MM-dd HH:mm:ss" + val dateFormat = SimpleDateFormat(format, Locale.getDefault()) + dateFormat.timeZone = TimeZone.getTimeZone("GMT") // 设置时区为 UTC,或者根据需要选择其他时区 + + // 将时间戳转换为 Date 对象 + val date = Date(timestamp) + + // 格式化 Date 对象为指定格式的字符串 + return dateFormat.format(date) + } + + + fun getDeviceId(context: Context): String? = + try { + // 优先尝试获取 GAID + val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context) + if (!adInfo.isLimitAdTrackingEnabled && !adInfo.id.isNullOrEmpty()) { + Log.d("DeviceIdHelper", "Using GAID: ${adInfo.id}") + adInfo.id + } else { + Log.d("DeviceIdHelper", "GAID not available or user limited it, using AppSet ID") + null + } + } catch (e: Exception) { + Log.e("DeviceIdHelper", "GAID fetch failed: ${e.message}") + null + } + + // ✅ 回退获取 App Set ID(Android 12+ 替代方案) +// return@withContext try { +// val appSetInfo: AppSetIdInfo = AppSet.getClient(context).appSetIdInfo.await() +// Log.d("DeviceIdHelper", "Using App Set ID: ${appSetInfo.id}") +// appSetInfo.id +// } catch (e: Exception) { +// Log.e("DeviceIdHelper", "App Set ID fetch failed: ${e.message}") +// null +// } + +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/utils/DisplayUtils.java b/app/src/main/java/com/ar/imagetracear/utils/DisplayUtils.java new file mode 100644 index 0000000..ac66cb2 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/DisplayUtils.java @@ -0,0 +1,18 @@ +package com.ar.imagetracear.utils; + +import android.content.Context; +import android.graphics.Point; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +public class DisplayUtils { + + public static Point getDeviceScreenSize(Context context) { + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (windowManager != null) { + windowManager.getDefaultDisplay().getMetrics(metrics); + } + return new Point(metrics.widthPixels, metrics.heightPixels); + } +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/ImageLoader.java b/app/src/main/java/com/ar/imagetracear/utils/ImageLoader.java new file mode 100644 index 0000000..7502960 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/ImageLoader.java @@ -0,0 +1,30 @@ +package com.ar.imagetracear.utils; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.widget.ImageView; +import java.io.IOException; +import java.io.InputStream; + +public class ImageLoader { + + public static Bitmap loadBitmapFromFile(String filePath) { + return BitmapFactory.decodeFile(filePath); + } + + public static Bitmap loadBitmapFromAppAssets(Context context, String assetPath) { + try (InputStream inputStream = context.getAssets().open(assetPath)) { + return BitmapFactory.decodeStream(inputStream); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static void displayBitmapInView(ImageView targetImageView, Bitmap imageBitmap) { + if (imageBitmap != null) { + targetImageView.setImageBitmap(imageBitmap); + } + } +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/ImagePositioner.java b/app/src/main/java/com/ar/imagetracear/utils/ImagePositioner.java new file mode 100644 index 0000000..a921751 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/ImagePositioner.java @@ -0,0 +1,23 @@ +package com.ar.imagetracear.utils; + +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.graphics.Point; +import android.widget.ImageView; + +public class ImagePositioner { + + public static void centerBitmapInImageView(ImageView imageView, Bitmap bitmap, Point containerSize) { + if (bitmap == null || containerSize == null) { + return; + } + + Matrix initialPositionMatrix = new Matrix(); + float newX = containerSize.x / 2f - bitmap.getWidth() / 2f; + float newY = containerSize.y / 2f - bitmap.getHeight() / 2f; + initialPositionMatrix.postTranslate(newX, newY); + imageView.setImageMatrix(initialPositionMatrix); + + TouchEventHandler.setInitialMatrix(initialPositionMatrix); + } +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/ImageTraceRepository.java b/app/src/main/java/com/ar/imagetracear/utils/ImageTraceRepository.java new file mode 100644 index 0000000..02e4e19 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/ImageTraceRepository.java @@ -0,0 +1,30 @@ +package com.ar.imagetracear.utils; + +import android.content.Context; + + +import com.ar.imagetracear.database.AppDatabase; +import com.ar.imagetracear.database.ImageTraceEntry; +import com.ar.imagetracear.database.ImageTraceEntryDao; + +import java.util.ArrayList; +import java.util.List; + +public class ImageTraceRepository { + + private final ImageTraceEntryDao imageTraceEntryDao; + + public ImageTraceRepository(Context context) { + AppDatabase db = AppDatabase.getInstance(context); + imageTraceEntryDao = db.imageTraceEntryDao(); + } + + public void insertAllImages(List imagePaths) { + List imageEntries = new ArrayList<>(); + for (String path : imagePaths) { + imageEntries.add(new ImageTraceEntry(false, false, path)); + } + + imageTraceEntryDao.insertAll(imageEntries); + } +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/ItemDecoration.java b/app/src/main/java/com/ar/imagetracear/utils/ItemDecoration.java new file mode 100644 index 0000000..f0d43cd --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/ItemDecoration.java @@ -0,0 +1,76 @@ +package com.ar.imagetracear.utils; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.ar.imagetracear.MyApplication; + + +public class ItemDecoration extends RecyclerView.ItemDecoration { + + private int v, h, ex; + + public ItemDecoration(int v, int h, int ex) { + this.v = Math.round(dpToPx(v)); + this.h = Math.round(dpToPx(h)); + this.ex = Math.round(dpToPx(ex)); + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + int spanCount = 1; + int spanSize = 1; + int spanIndex = 0; + + int childAdapterPosition = parent.getChildAdapterPosition(view); + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof StaggeredGridLayoutManager) { + StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; + StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); + spanCount = staggeredGridLayoutManager.getSpanCount(); + if (layoutParams.isFullSpan()) { + spanSize = spanCount; + } + spanIndex = layoutParams.getSpanIndex(); + } else if (layoutManager instanceof GridLayoutManager) { + GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams(); + spanCount = gridLayoutManager.getSpanCount(); + spanSize = gridLayoutManager.getSpanSizeLookup().getSpanSize(childAdapterPosition); + spanIndex = layoutParams.getSpanIndex(); + } else if (layoutManager instanceof LinearLayoutManager) { + outRect.left = v; + outRect.right = v; + outRect.bottom = h; + } + + if (spanSize == spanCount) { + outRect.left = v + ex; + outRect.right = v + ex; + outRect.bottom = h; + + } else { + int itemAllSpacing = (v * (spanCount + 1) + ex * 2) / spanCount; + int left = v * (spanIndex + 1) - itemAllSpacing * spanIndex + ex; + int right = itemAllSpacing - left; + outRect.left = left; + outRect.right = right; + outRect.bottom = h; + + } + + } + + + public static float dpToPx(float dpValue) { + float density = MyApplication.application.getResources().getDisplayMetrics().density; + return density * dpValue + 0.5f; + } +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/Names.java b/app/src/main/java/com/ar/imagetracear/utils/Names.java new file mode 100644 index 0000000..ffc110b --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/Names.java @@ -0,0 +1,47 @@ +package com.ar.imagetracear.utils; + +import java.util.ArrayList; +import java.util.List; + +public class Names { + + public static String Class_Animals = "png_Animals"; + public static String Class_birds = "png_Birds"; + public static String Class_butterfly = "png_Butterfly"; + public static String Class_cafe = "png_Cafe"; + public static String Class_cartoons = "png_Cartoons"; + public static String Class_christmas = "png_Christmas"; + public static String Class_festivals = "png_Festivals"; + public static String Class_flowers = "png_Flowers"; + public static String Class_fruits = "png_Fruits"; + public static String Class_general = "png_General"; + + public static String Class_mehndi = "png_Mehndi"; + public static String Class_nature = "png_Nature"; + public static String Class_properties = "png_Properties"; + public static String Class_rangoli = "png_Rangoli"; + public static String Class_sports = "png_Sports"; + public static String Class_vehicles = "png_Vehicles"; + + public static List getAllImage() { + 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; + } + +} diff --git a/app/src/main/java/com/ar/imagetracear/utils/RequestUtils.java b/app/src/main/java/com/ar/imagetracear/utils/RequestUtils.java new file mode 100644 index 0000000..6ac930f --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/RequestUtils.java @@ -0,0 +1,44 @@ +package com.ar.imagetracear.utils; + +import android.Manifest; +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +public class RequestUtils { + public static boolean hasRequests(Context context, String[] permissions) { + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + public static void requestPermissions(Activity activity, String[] permissions, int requestCode) { + ActivityCompat.requestPermissions(activity, permissions, requestCode); + } + + public static boolean handlePermissionsResult(int[] grantResults) { + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) return false; + } + return true; + } + + public static String[] getCameraPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + return new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_MEDIA_IMAGES}; + } else { + return new String[]{ + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + }; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ar/imagetracear/utils/TouchEventHandler.java b/app/src/main/java/com/ar/imagetracear/utils/TouchEventHandler.java new file mode 100644 index 0000000..dfe8754 --- /dev/null +++ b/app/src/main/java/com/ar/imagetracear/utils/TouchEventHandler.java @@ -0,0 +1,69 @@ +package com.ar.imagetracear.utils; + +import android.graphics.Matrix; +import android.graphics.PointF; +import android.view.MotionEvent; +import android.widget.ImageView; + +public class TouchEventHandler { + + private static final int TOUCH_NONE = 0; + private static final int TOUCH_DRAG = 1; + private static final int TOUCH_ZOOM = 2; + + private static float initialPointerDistance = 0f; + private static final Matrix currentMatrix = new Matrix(); + private static final Matrix savedTransformMatrix = new Matrix(); + private static final PointF lastTouchPoint = new PointF(); + private static int currentTouchMode = TOUCH_NONE; + + public static boolean handleImageTouchEvent(ImageView view, MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + savedTransformMatrix.set(currentMatrix); + lastTouchPoint.set(event.getX(), event.getY()); + currentTouchMode = TOUCH_DRAG; + break; + case MotionEvent.ACTION_POINTER_DOWN: + initialPointerDistance = calculatePointerDistance(event); + if (initialPointerDistance > 10f) { + savedTransformMatrix.set(currentMatrix); + currentTouchMode = TOUCH_ZOOM; + } + break; + case MotionEvent.ACTION_MOVE: + if (currentTouchMode == TOUCH_DRAG) { + currentMatrix.set(savedTransformMatrix); + currentMatrix.postTranslate(event.getX() - lastTouchPoint.x, event.getY() - lastTouchPoint.y); + } else if (currentTouchMode == TOUCH_ZOOM) { + float newDistance = calculatePointerDistance(event); + if (newDistance > 10f) { + float scaleFactor = newDistance / initialPointerDistance; + currentMatrix.set(savedTransformMatrix); + currentMatrix.postScale(scaleFactor, scaleFactor, view.getWidth() / 2f, view.getHeight() / 2f); + } + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + currentTouchMode = TOUCH_NONE; + break; + } + view.setImageMatrix(currentMatrix); + return true; + } + + private static float calculatePointerDistance(MotionEvent event) { + float deltaX = event.getX(1) - event.getX(0); + float deltaY = event.getY(1) - event.getY(0); + return (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY); + } + + public static Matrix getCurrentImageMatrix() { + return currentMatrix; + } + + public static void setInitialMatrix(Matrix matrix) { + currentMatrix.set(matrix); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/add.xml b/app/src/main/res/drawable/add.xml new file mode 100644 index 0000000..ff2cd80 --- /dev/null +++ b/app/src/main/res/drawable/add.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml new file mode 100644 index 0000000..1b83d19 --- /dev/null +++ b/app/src/main/res/drawable/back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/bg_gradient.xml b/app/src/main/res/drawable/bg_gradient.xml new file mode 100644 index 0000000..0d19971 --- /dev/null +++ b/app/src/main/res/drawable/bg_gradient.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/camera.xml b/app/src/main/res/drawable/camera.xml new file mode 100644 index 0000000..5041fc3 --- /dev/null +++ b/app/src/main/res/drawable/camera.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/collection.xml b/app/src/main/res/drawable/collection.xml new file mode 100644 index 0000000..0395a3a --- /dev/null +++ b/app/src/main/res/drawable/collection.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/dislike.xml b/app/src/main/res/drawable/dislike.xml new file mode 100644 index 0000000..1d1b093 --- /dev/null +++ b/app/src/main/res/drawable/dislike.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/dot.xml b/app/src/main/res/drawable/dot.xml new file mode 100644 index 0000000..d21e8c7 --- /dev/null +++ b/app/src/main/res/drawable/dot.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/flash_off.xml b/app/src/main/res/drawable/flash_off.xml new file mode 100644 index 0000000..f605820 --- /dev/null +++ b/app/src/main/res/drawable/flash_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/flash_on.xml b/app/src/main/res/drawable/flash_on.xml new file mode 100644 index 0000000..22a9409 --- /dev/null +++ b/app/src/main/res/drawable/flash_on.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/home.xml b/app/src/main/res/drawable/home.xml new file mode 100644 index 0000000..e0c9653 --- /dev/null +++ b/app/src/main/res/drawable/home.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/import_image.xml b/app/src/main/res/drawable/import_image.xml new file mode 100644 index 0000000..04dd36f --- /dev/null +++ b/app/src/main/res/drawable/import_image.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/like.xml b/app/src/main/res/drawable/like.xml new file mode 100644 index 0000000..f584fd4 --- /dev/null +++ b/app/src/main/res/drawable/like.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/like_background.xml b/app/src/main/res/drawable/like_background.xml new file mode 100644 index 0000000..2f62df4 --- /dev/null +++ b/app/src/main/res/drawable/like_background.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/photo.xml b/app/src/main/res/drawable/photo.xml new file mode 100644 index 0000000..8221d55 --- /dev/null +++ b/app/src/main/res/drawable/photo.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/reversal_off.xml b/app/src/main/res/drawable/reversal_off.xml new file mode 100644 index 0000000..7609fdf --- /dev/null +++ b/app/src/main/res/drawable/reversal_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/reversal_on.xml b/app/src/main/res/drawable/reversal_on.xml new file mode 100644 index 0000000..5597951 --- /dev/null +++ b/app/src/main/res/drawable/reversal_on.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/rounded_16.xml b/app/src/main/res/drawable/rounded_16.xml new file mode 100644 index 0000000..ee4ef0c --- /dev/null +++ b/app/src/main/res/drawable/rounded_16.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/rounded_40.xml b/app/src/main/res/drawable/rounded_40.xml new file mode 100644 index 0000000..127b9d6 --- /dev/null +++ b/app/src/main/res/drawable/rounded_40.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/rounded_transparent_background.xml b/app/src/main/res/drawable/rounded_transparent_background.xml new file mode 100644 index 0000000..a87244e --- /dev/null +++ b/app/src/main/res/drawable/rounded_transparent_background.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seek_bar_color.xml b/app/src/main/res/drawable/seek_bar_color.xml new file mode 100644 index 0000000..f8e5913 --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_color.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/seek_bar_color_white.xml b/app/src/main/res/drawable/seek_bar_color_white.xml new file mode 100644 index 0000000..9c7827d --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_color_white.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ 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..71213e0 --- /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/seekbar_thumb_white.xml b/app/src/main/res/drawable/seekbar_thumb_white.xml new file mode 100644 index 0000000..749191d --- /dev/null +++ b/app/src/main/res/drawable/seekbar_thumb_white.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/special_import.xml b/app/src/main/res/drawable/special_import.xml new file mode 100644 index 0000000..67d3e78 --- /dev/null +++ b/app/src/main/res/drawable/special_import.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/subtract.xml b/app/src/main/res/drawable/subtract.xml new file mode 100644 index 0000000..f123fd8 --- /dev/null +++ b/app/src/main/res/drawable/subtract.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_imagetrace.xml b/app/src/main/res/layout/activity_imagetrace.xml new file mode 100644 index 0000000..5208864 --- /dev/null +++ b/app/src/main/res/layout/activity_imagetrace.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 86a5d97..252b237 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,15 +5,23 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".activity.MainActivity"> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..50a198e --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,49 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_sublist.xml b/app/src/main/res/layout/activity_sublist.xml new file mode 100644 index 0000000..cbc976f --- /dev/null +++ b/app/src/main/res/layout/activity_sublist.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_collection.xml b/app/src/main/res/layout/fragment_collection.xml new file mode 100644 index 0000000..1665103 --- /dev/null +++ b/app/src/main/res/layout/fragment_collection.xml @@ -0,0 +1,45 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7bc37b3 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import.xml b/app/src/main/res/layout/fragment_import.xml new file mode 100644 index 0000000..ae0dce8 --- /dev/null +++ b/app/src/main/res/layout/fragment_import.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home.xml b/app/src/main/res/layout/item_home.xml new file mode 100644 index 0000000..c008f52 --- /dev/null +++ b/app/src/main/res/layout/item_home.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_import.xml b/app/src/main/res/layout/item_import.xml new file mode 100644 index 0000000..d7b3adc --- /dev/null +++ b/app/src/main/res/layout/item_import.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/item_special_view.xml b/app/src/main/res/layout/item_special_view.xml new file mode 100644 index 0000000..3884151 --- /dev/null +++ b/app/src/main/res/layout/item_special_view.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_tab_item_custom.xml b/app/src/main/res/layout/main_tab_item_custom.xml new file mode 100644 index 0000000..fa88963 --- /dev/null +++ b/app/src/main/res/layout/main_tab_item_custom.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 6f3b755..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..ee9132b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/placeholder.png b/app/src/main/res/mipmap-hdpi/placeholder.png new file mode 100644 index 0000000..b0f198f Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/placeholder.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..0186ea5 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d6..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..d789852 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a307..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..830b4b7 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..e96df67 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d642..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c8524cd..7a1bae7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,7 @@ #FF000000 #FFFFFFFF + #212121 + #6200EE + #5D5A5A \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d3b024f..8eb3b38 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -3,6 +3,7 @@