commit 151c7ceea8ddc97d9dd7658f8b61e03078ff28c9 Author: litingting Date: Thu Jul 4 10:11:47 2024 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/ArtWallpaper.jks b/app/ArtWallpaper.jks new file mode 100644 index 0000000..5470b5f Binary files /dev/null and b/app/ArtWallpaper.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..f9a0de3 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,93 @@ +import java.util.Date +import java.text.SimpleDateFormat + +plugins { + alias(libs.plugins.androidApplication) + alias(libs.plugins.jetbrainsKotlinAndroid) + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") + id("applovin-quality-service") +} +applovin{ + apiKey = "y87o4e7vb5bbqzuGVTFyOIfZiyBG0Nf0Ksq8S3m2MJOHf_A5BcWGJnKuQqoxwxVvtdQdiTC4O3MPzFwy8rJ9Cc" +} +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +android { + namespace = "com.cute.girl.hd.pink.img.wallpaper" + compileSdk = 34 + + defaultConfig { + //com.wallart.art.wallpapers.hd + applicationId = "com.wallart.art.wallpapers.hd" + minSdk = 23 + targetSdk = 34 + versionCode = 2 + versionName = "1.0.1" + setProperty("archivesBaseName", "Art Wallpaper_V" + versionName + "(${versionCode})_$timestamp") + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + + buildFeatures { + viewBinding = true + buildConfig = true + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + //tabLayout + implementation("io.github.h07000223:flycoTabLayout:3.0.0") + //下拉刷新上拉加载 +// implementation("io.github.scwang90:refresh-layout-kernel:2.0.5") //核心必须依赖 +// implementation("io.github.scwang90:refresh-header-classics:2.0.5") //经典刷新头 + //okhttp + implementation("com.squareup.okhttp3:okhttp:4.9.2") + implementation("commons-codec:commons-codec:1.11") + + implementation("com.github.bumptech.glide:glide:4.15.1") + annotationProcessor("com.github.bumptech.glide:compiler:4.11.0") + +// implementation("com.squareup.retrofit2:retrofit:2.9.0") +// implementation("com.squareup.retrofit2:converter-gson:2.9.0") + + implementation("com.squareup.okhttp3:logging-interceptor:4.7.2") + implementation("pub.devrel:easypermissions:3.0.0") + implementation("com.liulishuo.filedownloader:library:1.7.7") + + implementation ("com.google.code.gson:gson:2.10.1") + + + + + implementation("com.applovin:applovin-sdk:+") + implementation("com.applovin.mediation:vungle-adapter:+") + implementation("com.applovin.mediation:bytedance-adapter:+") + implementation("com.applovin.mediation:mintegral-adapter:+") + + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + implementation("com.google.firebase:firebase-analytics-ktx") + implementation ("com.google.firebase:firebase-crashlytics-ktx") +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..9f426ef --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "32220085177", + "project_id": "art-wallpaper---wallpape-acddd", + "storage_bucket": "art-wallpaper---wallpape-acddd.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:32220085177:android:30846e4694936a9d6f1468", + "android_client_info": { + "package_name": "com.wallart.art.wallpapers.hd" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCjN36LqkvcimX5OEsnMyYYmWElQRM_-js" + } + ], + "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 new file mode 100644 index 0000000..f73aaf7 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,34 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + + -keep class com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData { *; } + -keep class com.cute.girl.hd.pink.img.wallpaper.entity.Data { *; } + + -dontwarn org.bouncycastle.jsse.BCSSLParameters + -dontwarn org.bouncycastle.jsse.BCSSLSocket + -dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider + -dontwarn org.conscrypt.Conscrypt$Version + -dontwarn org.conscrypt.Conscrypt + -dontwarn org.conscrypt.ConscryptHostnameVerifier + -dontwarn org.openjsse.javax.net.ssl.SSLParameters + -dontwarn org.openjsse.javax.net.ssl.SSLSocket + -dontwarn org.openjsse.net.ssl.OpenJSSE \ No newline at end of file diff --git a/app/src/androidTest/java/com/cute/girl/hd/pink/img/wallpaper/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/cute/girl/hd/pink/img/wallpaper/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..d9f8f7d --- /dev/null +++ b/app/src/androidTest/java/com/cute/girl/hd/pink/img/wallpaper/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.cute.girl.hd.pink.img.wallpaper + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.cute.girl.hd.pink.img.wallpaper", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a7af385 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/test_new.json b/app/src/main/assets/test_new.json new file mode 100644 index 0000000..b86455f --- /dev/null +++ b/app/src/main/assets/test_new.json @@ -0,0 +1,2251 @@ +[ + { + "name": "feature", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0778d29d9df3135981fa983db6447d4c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d799900c0ed4448a858fabe9a97adb74.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/272d39eb140f03699f83bbda9349c459.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ac3e89c29f60f667f5e660afdf52b56.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1020c6c57366c85cd8b4b54e93f86b97.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1c262081e6674c7de6a054a101003010.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1bbcf0d4423449788cbc823441a3639a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0bf796c657ed4d6f71a87506f78d5810.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2424f1aa727ae9998ae1896fea634fde.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6bd0da2bb67ec66df6561b99da4fe673.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae4f3823580d67ab9d463e05210632c5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4f15ec61b970ad24aa43ac8d99dbfc0f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/867581cd8ec5402839879c70a86d5166.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/58150630175fc68e38afe28ebf58688c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/148499404d85516a86eeb5c2c30fafbd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c29589dcf6ba78637c76d85e1e1db531.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8358b0d4f247220a75f9131ca89df811.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/985eda6fe511752a4ec54f66e8e26dd0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ec66c00d9a660921829c0d4fd3e917d3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/599361f146a794b01489fcefa1cbb16f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/989ccbceb5d165cc4b44ced23af4d5fb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3bddefab997f67cfec336f798eb925fe.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b168d2f6250ef71dbf83d18d02df1f92.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1e7e5b04a7eda5b49eaa0a2dd5fcf2c7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e668bf697bd9da5e701254835b4b8a03.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0309bd16868cd842263f21ff87637d8c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d6826260e5e7a32f2db53404e409db44.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/77685bf7b59906eb1890967a7d78c0bf.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b655bc8400774e2dc940b5a8291e2ca5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d99334875d0273aad4beab313723af81.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5542893618e601a7db59c526a067c6ff.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7814197400d16b8e9ca06a6875ceaec8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3829f608614d5e9d137db8ee5297f3c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/debff43be7b79def16d495317b9b162f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe49725650ad74103700769b9fc07a8f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d225f44145583267ae3d1a8e901a6e68.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b5bbb4b172e7ae28a052f4224af6274d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/650bd8e37f13c1eaa8a1d1ca243ffa01.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d59cc6ba4993bcf62c3869127a3c2941.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/85be37b1adb78db46d6966b85cd5189e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3b508cc58811b2724545896cbfcd66ac.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a96d12131ce5b9d173c5aea321c8b673.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5f26ebb7007c731156c4403ea27669a8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e1218d89013e8d9abf06eac0499ff773.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0c24b7c474b8e1a7faec82c8b371652f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/43adb1e59c4f757682af55d4f0eb7408.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2e02d2a00372e65792c82b7e35a0a86e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae39c963c68945c5e069c6f82a27370f.jpeg" + } + ] + }, + { + "name": "recent", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e3e9cfd7ecb0f9291a40577ccd5a6041.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35b096446e9a5d5f48ceb0200a8f998a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3302cc89be481f9e8be2b774d343bf70.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6731cfb0425ed903dd67f628b5f5ced3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/55d37297cc7df4da112af4c0cbee8f2e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c74de3ce566ef40635140c5691c30ee0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3d9089bab7ae0ab40de9bbc277a08102.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/01951bbd70547362a3a2d2a579f1fca1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d86f07746d129601913d2bf09599f6e8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/29c711336f36473a3cacd4d9661f953a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c189c2a257a0591c3ff5060c235c7342.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2d414e582fa323d82be316c3c5265458.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/34b31bde41c0dd74259b980c5574ae7d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0ad74fb14620bfd31b92844a776838e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/918df6433d6270c8fbb76a15b76de80c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/504a42911500aacde17bb218207b3531.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/24281fc765fce9da4c3d9d86e1e9ccf3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6af1ac41c0bda2023d5b8268b7e1295b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4bbb47d8bff5055f0e37eeba14c8d54d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5cccc2952253bbc0f2db3ebfeba29e86.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/11011f8b92d505d3f837afe073439ca1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/be9d97e50fa5c89937e387da6649e3b7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cee1c646c05356637b33824c062af74f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2ae06375abbba1052b00f9a2fb88e91a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b226912c3d378bab354b54d936d1750.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0b2ca838271879067167fb1e1008253.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cd179543db4aec47c8f7f77535dcb65d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7cf87093c5f2ec0a387101b2bd232548.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7e73c464a7b8e9f2cffbb4d0eab7b853.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/89ef11e052582cf67c8e6c176dccc0af.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/be89338c4809aaf5dcf3cc468432998e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe3b2513bcfb731520bc4dcd979e5193.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3324c4475f6a4f1f64f069645548e452.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/372858e338cfdd52fe4a163031801de4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f16d889afe61d0ca3f2d0ac01c5567c6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/366370cfb9d839055295c07b80ccd3bc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67311a260e3c5e11a55cb79f02309b3d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35c14f8ae14b38fa7cae5a1aa488cc0b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/972225d59df46a33b68af9e58f40c909.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9cd75c731b123ce5f9ae92302e0d87c6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bf0ea47cb17bef915b374b1c40c41f73.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6a9c235c9ba3b42943506fc45ad5c340.jpeg" + } + ] + }, + { + "name": "popular", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cb1e57d9a8a8b74bd9da3a59d048b5f5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/450cfe73f9504835f27f7e86dff24d7f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/81ae1e4670fb3719e5149a3cdf31c6ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/51beb1bca04103db52e4cde6ca12db42.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/78f2465fbc4b4b16e56e277b637f624f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f2957601d332beb1c0818e558954677e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dbdf62f151e267ba7802a97963880aa2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7901ff103a96ad19ddb27f3ed9954d16.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/289e1219ab8467f96c5c347c30292256.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/eb969501fdbf447733185cf031756673.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae68d5364057f54c4b23053ae905ef8f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c71e0bd1bbef6f57aba91d4021d2dfe1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8340b18893dc7e581c7711b7f021696e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9610d175c7297c23b2674bdc2ba9f028.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ea63e7a22d6d2496808afc0a17fa3cd1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/edabc252391faab49916d2395f505e31.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/42d801957f9d055d3f4f60999f481468.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3fdcdfbb606f595acb4cba594c9823b6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b2f935524830f3794ed9eb61f159a077.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/21f1ae5d466213bc80cd0252f3c7500e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0fa1ddf9b0d7f9dbce03c2b49c89a031.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/82b9f33f8ddb023c2c73c2e09bd3baa4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7f5d11d128e59c04e4d1131a318ec896.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0826bdb695449da604e3d25ded709279.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a009573cdab9a4850445d5d698bb22da.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/10e8fc4ca6804fe916703c206261c1a1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0cd6f33c960555cb30762fff3a1a6f4d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fa1741c49fb23d1e637c535e42cd3362.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a80f6d5a542033cd6a24f2d38eb3c49e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3e2fbd850eaa5474dc781acbc4c87703.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2ea3d1518f8638dfbff7b964d9892016.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/177321414002c6c067cd405796f96c62.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7223d7220b8f4efd273ad003a11f6208.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a4ffaeb15e4d4b3a177c3a834ed76d45.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1e28cc9646b74982c4cec3bce7acc42a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7f0918eb3f9952a596e2adf5d5a651a9.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bdc268b8397278fa0628fe61f132df64.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7a57a628d003214321a7409d960d2851.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8e12c5e967878d797e5c725e814976b5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ccd577df5c7eeadb88e58b8cf47389d6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4982759d3ea2405e951424a91297b040.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a39cf4fdb28e0043e6105ef0dbc559ca.jpeg" + } + ] + }, + { + "name": "anime", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/78a53756b869919dea40478e803165fe.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4dedaccf8e3cdec4bab521ba2714735d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4dd0d2e4064d4af51bb6e549acf0e501.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/602390b4d293d0cdad5da081c13022fc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/df23c4c23b0925dede1db7e356283018.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b3965a3626d46538f4a0b11daae6a3e1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9bf9b79cebaa4b52c37fee1f955ac402.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1c2ed514290a4cfda6bc4e98d5b8a5f7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7b45001ef70ee19976d32cf8700a69f0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2b4f7512223f83bdb017c9a5d970cce9.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0ef461ff981673439ac38b940bd0f074.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/07ad3e82b58c6d36d88c9c99b37679f5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b36fe9cc5d414cac38151c0b0c65bf20.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2ee74b808098313b403e34c2a6eb491c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/69b5e49a24c369469489504a9d9681a1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e68fbb1af288ce35966b7c0f4bdd04eb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b85c20a2c96eea953ed23f726a98c0c4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b560d9e78414ac96252a8e04e20566a9.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e736ce9da0035a817b842133021eb4b8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9d90a6d43d192e5635feff690427a150.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/db40bb1805b2254b5fbe68fe1823188f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6828f927c1d96becfdde853947bd5d90.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a1c69f392b70126f542e141975d314a3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c4894eb33963529eae0438d8a44acbc9.jpeg" + } + ] + }, + { + "name": "unicorn", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f394722f00db0df931ea62d8e0f1f273.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/66e51fb0c777083a33c87169ff431c27.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ff25d42e887bfbfa61a5eff4b36d9d06.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3720df372357721e3186d0f025958030.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dc416b31766e700005b3b0df4450d6a1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0c95535f5c0fada4c4593c5f1a0be14f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/79411da09cb235ede0b2ab924e6e2d06.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b5ef56ab8d5990c2a930d317ee96ee36.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1422cb5eb8b0bb96a97c96e63343f3bd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/18c3f3530da6e190ff5e846ac69b9b64.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3302cc89be481f9e8be2b774d343bf70.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6731cfb0425ed903dd67f628b5f5ced3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3d9089bab7ae0ab40de9bbc277a08102.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/01951bbd70547362a3a2d2a579f1fca1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/918df6433d6270c8fbb76a15b76de80c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/504a42911500aacde17bb218207b3531.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f16d889afe61d0ca3f2d0ac01c5567c6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/366370cfb9d839055295c07b80ccd3bc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5ee5a0fa74677e71bd0725fbe45cb366.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4bb474acc1ec0e4aff17aa4af4b6d4bb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0ec424dc828fd2853048f18928e0a7c2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/251834a8101d69114ab0784723f8e1cd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9e60ffa21331c941eb650abf0c37a5ba.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3aec495a951c17fde82b3f5c4e01f2d0.jpeg" + } + ] + }, + { + "name": "kitty", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0b52fe7cc5b2cf2d11cda94cf6dd77a9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/77b08753cd065bd8e60873b1c119538d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6f597bb789e69b5099a9b162402d01ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/56a10bb51d1cfba6130267eaae6cb04a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/272d39eb140f03699f83bbda9349c459.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ac3e89c29f60f667f5e660afdf52b56.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae4f3823580d67ab9d463e05210632c5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4f15ec61b970ad24aa43ac8d99dbfc0f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/867581cd8ec5402839879c70a86d5166.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/58150630175fc68e38afe28ebf58688c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ec66c00d9a660921829c0d4fd3e917d3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/599361f146a794b01489fcefa1cbb16f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e668bf697bd9da5e701254835b4b8a03.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0309bd16868cd842263f21ff87637d8c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/beaca60353062f6c1e9a36957544bdba.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a7eb342b2a9d0346a496c6d9cb120c01.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4d895490519264d13e299f4fd28919a9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6afc0f5710de7fda93ab55648409980d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2609dde32e4f0051a6f66f4b12826b4d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/478cd1c814900b9dd701b4bca1e54947.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cc1035518da3dc3729539e67d9468438.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67618a0e1eea172dac6c703e35855855.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c84cadf74e82489d4393ea2a87fca733.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0019ce6a88fee8f46f49bb41be2b6441.jpeg" + } + ] + }, + { + "name": "puppies", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d86f07746d129601913d2bf09599f6e8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/29c711336f36473a3cacd4d9661f953a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c720292e6ea423293bb091bc480c6ad9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ff93949342ba0e426c817bbc5fce12ad.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/98014a9710bece6882888ddceb23dc32.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7bba897872dc9faed84a1acb3327d5fa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/62fb7f25795e2d724d555148cb30a451.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/72740366db66e229b6c40c191f817432.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9b98a18fc98e5fa3a1487db0434bb7d6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3106a24bcae3c124d665fd44fba845f5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dd240b9fd1605c52c8863199fd70e831.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7f3ce5f13125e69448ad53980ddd4fdb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0d1effad93377d18abe6fc22a138c69b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fa5dbf215afefd0ae9f596fce08f38fa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b7fd0e5add46a012d9a6046206cd9e16.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7de53bb7a75291e06fcef8d9ac1ddc56.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e3659d15d752e31538a9734ddd20fe29.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/faa543a594e77ba804280b43d4570e50.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2765e0596a7812d27f3a458a0a8ed7a2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8454af8507862961ddbec63df4fc77fd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe6eccc7de59c72cc10b84e8d8b51122.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/94c2adf3f30aa2cc60cb6ae3cd8893fd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3191053cec0c972447e04a290b36da35.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/adc5c0404bf29146ab3fad4d94716695.jpeg" + } + ] + }, + { + "name": "flowers", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2a05f339aa023822a6b07c843910241d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c7a1784fb016359f7a62a882333cc83b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/88ef144fa47bcfa667f5cf8b393f15ef.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/80fbbe4db60cee5a851552309d2a27ab.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/474eb2d318fe9bfa401853fb453e2f67.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/de801fce754539f923b3780b499a4b7b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a4d6778694fd960e4313f40ac5cbecab.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f19573e9f1e0be8280bbce83da13d933.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0d5331f838ca904c1cbb519c776905a7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/99bee1bc7a1bc9d44696904142209414.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0240d8aaa69a5c630de599d5d4429bde.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d382d58c793cf7d3ca832066a3827d38.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c77b66a3c34a2c0105cca3053873c1a8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b648ee0784da5e81ec5a59c9af08de16.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/121f1331fca3bd3a6e6135490c89938e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b42e5db9694f6f33e1c760710250998.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3ecfbfc0a45a8c031f6545bd0d280e06.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5a154380a7c6b21d9da29332e81f5d89.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0cebbb0341983039f6d670a26b18e25e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/df515f3f6d988bb65d4c7e7cb28aefcc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4bbb47d8bff5055f0e37eeba14c8d54d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5cccc2952253bbc0f2db3ebfeba29e86.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cee1c646c05356637b33824c062af74f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2ae06375abbba1052b00f9a2fb88e91a.jpeg" + } + ] + }, + { + "name": "eiffel tower", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d7ea774c7936847034e7d47c6a4c3621.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b6cde087dab857fdb24b0f0abd2385fa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b05d98248da1854f0d001bd31cebd50b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/64f877e613f049e7df32c7b9414f2986.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1c5fdc499db061366c8656ef36f4e3be.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/575e8ac5ae86f5a71babe3f0d2e39c75.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/942ba18550e178e99b2b5fe9c948d922.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c71782bae143242c0074e74c878133d0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ef357333eed8615bf5284267f74bf2fe.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/06c69621517662ff720a79b17b1dabf0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/49916fd9085dda6a71b00fd3a457c0f5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f44233ad373660d4ad249729756e09c8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0778d29d9df3135981fa983db6447d4c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d799900c0ed4448a858fabe9a97adb74.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2424f1aa727ae9998ae1896fea634fde.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6bd0da2bb67ec66df6561b99da4fe673.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b655bc8400774e2dc940b5a8291e2ca5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d99334875d0273aad4beab313723af81.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/83754be173a128765774ab3a7fd8c06a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2aae7ca7704008b14bec39265bfb52bf.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3f10efadf6c5a9d36d9939f57b5d1ec6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/63e1919d03e3d76b73721d03c104d84f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/33b3eca75cb6fa3e5fd59d500a9b5e98.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9e5de7535d8e8cc5f6c8d4eae55126a0.jpeg" + } + ] + }, + { + "name": "dreamy", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/078a2934e9bd4e91691040427e42c1cf.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b66b86b24e7d5998b3ea5a6536929fa6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b863a36001829c01eb171176397497f0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c051996948ac224e19503e3d465742a7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/57755c4ea1bb81e508da774cedfb24e9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bcdd01e3664006072f8ddcdc85e3b5b0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d4cca417535f5bb86b74e7c8750b5f2a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e841a09e1457a0e4b238ffee72f398dd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2906bd996dbcfba67ad9f896a6711446.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c6bf40fde3ebbe5c41f7ce0738a468c8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/811fa5797c92e0de20dc2132c291afbe.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4505f7034a3c5f78f21d80167f841907.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4d0f72c74b8beeebea65063c65d13af6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2f36ef1fcbd0d5e5efb7a3be5f2fac2b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/95ef79cf7f81d6939ac82dcbf931864c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5cb63c0e9ca2cb2f1e992a8a245128aa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/caf42023af67eee943621b568b9162ac.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ff723d610b9d1b5523434576d2ce9101.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c86ba2f342308fe2a38b1d4b7ed4eb1a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/46f3be40c9b3889e7224e8cb56319250.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4f45c624dd0901130541594a848163be.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f4ebd02e92d77f3dbf24166defbdd138.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/42c6a6c39534182eef8f116e71d195c0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4b7da710445e2fd3b2f0a7324c2bde86.jpeg" + } + ] + }, + { + "name": "animals", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/10a20226dda3cf01850566e1cfe2e57b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ad04501013a619c9b579dc2d9e593bf2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c4d6e38cc92cde5aea884c9903225ea0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/203ae96d3b0763a7b0eb7e6d79cd5dc6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6860012997011bb06dec0a49116de185.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/36f7575ba012f8cb6bed9d1b9722e641.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c37d2250a6b9c8c2a5aeb6fded4e7674.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a6ec47edb79b4fac2e29a36995e43c91.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e3e9cfd7ecb0f9291a40577ccd5a6041.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35b096446e9a5d5f48ceb0200a8f998a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c189c2a257a0591c3ff5060c235c7342.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2d414e582fa323d82be316c3c5265458.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b168d2f6250ef71dbf83d18d02df1f92.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1e7e5b04a7eda5b49eaa0a2dd5fcf2c7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d6826260e5e7a32f2db53404e409db44.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/77685bf7b59906eb1890967a7d78c0bf.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5e48ade076bf1b4666be781a3f60a364.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/51d60a01780b82e442d7455da61ab4bd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ec08144b3a106eb6ecdd916767be8846.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/443479fa063df85622caefed1f272af2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/859c9b58b3ed1c0c2992cc8cb06eac68.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b2dc1214b7b4e83bcc41a97469957831.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/578f979da129c8982239fc1c055d7be5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aaf9d9ef5f9f8399f43af626aef4eeb3.jpeg" + } + ] + }, + { + "name": "nature", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0a0068552c7716f4e62b52389be2e7aa.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aeaf0a95791d5064adf22a0dffc59692.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bfaa2acb7046d6937dcfb46242c5a202.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/89791fbf31f2da53a81fb1c39e33da87.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ba3a3d8e2a3fe678059d336209e27701.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/71963582a1f4ee889921cc7200c26e5e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/095d0022318d6bcf03f27cf0ab25f22a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a2ef86f9dc2917e54557ad506ef1367f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d033305ce11a4c25d9e1d0522f2d0a93.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5d119c5c88b9e44955e83f3d3a0928b3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/15132506d53f73a734acb50beb849545.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8db8e4798e05c61a0417ba4e327ecf00.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/080a1110ddb3fa6a5f6f4bcc9aeffe49.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cf726d392b71b1f8cddf643211f7af61.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a5f34b87339fd4ab81acbe341ef8c0d0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/188f4a1bfb8c25d8751092d6718f12ad.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aa21124ef9606a1b0e0e42ef753e4d50.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e55d82f968397ae6dcd18d6a7a30dd9a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f699e3ede507b1a95c837e599c32b22f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe8ef87ce0f9151dd2c0fe481ec4e5c2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1ecd1bed38f70bed2add2a2eb317773d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8d3d8f4e415ce64cd89047c0428bfd3c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2e42b89b829991d004e5e060599484ce.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/76e3bb52aee44228dd554a7334c6d192.jpeg" + } + ] + }, + { + "name": "cute", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6a53bf315f64477d85ceb46298475b8d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7a5e9212400d93fd5f5d6c1848b3d76e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/faca01a3f8f50e688c415ce07618afc1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/60964777dd2e91bd861003491672df01.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/55d37297cc7df4da112af4c0cbee8f2e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c74de3ce566ef40635140c5691c30ee0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/34b31bde41c0dd74259b980c5574ae7d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0ad74fb14620bfd31b92844a776838e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bf0ea47cb17bef915b374b1c40c41f73.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6a9c235c9ba3b42943506fc45ad5c340.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b75d67fc3ad3d42e15d0b4649d8d441a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/62d6ffc99089529d2b1c467ca03666d6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cb1bb4486e126723a2c843c905aa3b42.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/035c6e43e25cad1cb4279aff04bee5a7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/693f3467d3bf6de2da34b0c22fedf2ad.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/724df23f2bb16727e55244d81561edb0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4c0df0ba0870937fe64587fc0b8ac063.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a6b3bd73747b3fb5b178e6912c3be861.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9c9ae9ac1d94a4f5a61bf18f3d684530.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/97b0432b9b9f09c559744bfdb911a17d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67598f5f32668b6ef71a99ee0f050aa0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7c3f81d287bc3c1395719402dea36d8e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d40e843f1fa10744440f0eaec29e7229.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d05352377021cc5e405fe88821480370.jpeg" + } + ] + }, + { + "name": "cute", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/24281fc765fce9da4c3d9d86e1e9ccf3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6af1ac41c0bda2023d5b8268b7e1295b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b226912c3d378bab354b54d936d1750.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0b2ca838271879067167fb1e1008253.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c5f5f6bb19c8f2544b16257faa89b5ce.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e4b5929651e8c3e6e93b4ce1ced7038c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/da8a06281bc51b91973f27f70e44fe07.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/24e865884c6a4c6de18da2ba437604ef.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/820dbda148cb9fa49bfad17ac2d97c83.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1014b0d7339fa900038831b0e7eeba2d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d0099cf6e53cb3856a7853892d633b84.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cd34b1d80f68ea8d551a46b00b859643.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b2906c0930d922b0dfbd2f0016f4a1ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0232278e0c136a9742c41ca66ce54bbe.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4e7a1b1ed3bcf5953a7d69b6c8b4d1b4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b47b25e43ff2d010c9a030351387558.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cc012cb9ac44034c9435a6ee391712d3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/98546f85441661c87ff8b0d21293f73c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/88e64d9c2ee5f11771b65623d2947065.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1b10a1b75057cda81f26654161d5ae1c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8cad4b00392cc69f8436083ac4687551.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/758a4af001554c71cf4d63e70c8878a7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d5d39cc3011fc72b50bb6222c17974f3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f131c7e334156fb1135ad92027de754d.jpeg" + } + ] + }, + { + "name": "beautiful", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a2e09a56793fbf9e8104833a199cf332.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0045a8e120149c1088dcc90669b4e08c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cd179543db4aec47c8f7f77535dcb65d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7cf87093c5f2ec0a387101b2bd232548.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5f26ebb7007c731156c4403ea27669a8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e1218d89013e8d9abf06eac0499ff773.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67aa353cca55c1f24e58ef45e3a5c6e5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d2519f822e57c6aff440cd4332af7f4f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0694fbdefd7db30ee4333ce44ab2a714.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e9bdabc1b3ba7a403e171546082493a7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/09cefec8744f0519b4aa53a03ee96eb2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/39069a1ba9f5f562ad9be1e90a3523e0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/426c845a56fccf9bdf3c44d00a59752c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/684de08213628b07807220c38178738f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cac87875aabdf876822ab2516cb5de59.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6db71ec61388d168ad2783e99db6b609.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/480f2e01bf1a96e8b90a9113d13b62b7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5eabc418e04a5a30a0fbe499e1efcac8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5e045e28cd394835269b56db2ab6e802.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e74092825564916b21361112850f480c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f4b9b08157677c6810af55fd5cf83da1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ab2b4d493687e922ebe45f59762f02e4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/deda1a7c162a65ec39fdc40c61948ca1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b93df15ac5a817fe8f6e8a0554bf0fa8.jpeg" + } + ] + }, + { + "name": "love", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/93d96dd6956db5e77d25d83b9f46624c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7929459c12e04cfdc0613518a620b44b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/51037b9c0935a2c86396465a1de1f52c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/179aad0c6e8aa2ae39968fb7f5032b8b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ed0d1f8a494b2c06d794950020b2a749.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4b6ee5717edd896ec043cf3334ecb34d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a8b304c4b10d1eb6e801bffb5523a172.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5e05b76527a6419da4c49e7a7c5384c0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b0cb65c664af3ff0da7128a04e225f50.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/45ee864553aba2ec2afbd716d3e52c31.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1310f244a991fdb069160761f8de158a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ede74b0bb28389cb84ab07d73769eb1f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4b8d810f46ae48d41365785e23ec4323.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9a9b8f5d923e89cfb62a7a0ffec3f960.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/13cd7ff65ba2bcaac5d6f22366c58202.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/776f1fbcb7d725ab06a97f150031b7f7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3d3b1ecdbfb3d16e1436e8bd534a4c2f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7f51dc4f7d3c5afd2f79dde65d05d06e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/057a57e2faf946c072036415e87388d1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4e374a92eeab672b4c9f3fc1c5ea656f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e217fb318f662b3ae2ad809d4c7fd4ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/37b6f39d7af382b776d3ce5e6538b2ac.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/912f9ee70a291ee29f8b41ff37a89a47.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ce81187ea521f83f620504211691d73f.jpeg" + } + ] + }, + { + "name": "quotes", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ffdee201ab115879fd038a7f529d7d2c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3deec3b8eaeff16459a684cef5224b9b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/087bcabb11186877ed51153251452811.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b5e16400a1374c454205bc7ca4608755.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ed717aa6c0e717092e06aab549ddc46e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d660026484e39cc9ef8da58eebd9fcd0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b938904303b0d74b1a89b36f9100e443.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f859acceb653463a5d9f078eda7677fa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/08338ff92c3404ae6359b5e841dd84e1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7cc7dbfa76593d16ebaff1d0c1995d9e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/877798c6dba982df8abe9e0c24d85554.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d9e0886ab6d82cc9edaba2f3bf29b45c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5a169595dfe60147918f274b5948f8ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/051543e0172b6a65a5a97ac4f745864c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6064a6c9c3d4995dc8540bad7ca388e7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/45249e3ba3cea2622081a776e8401be5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1359974cb4104bfae720e689606e41c7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5104e818b965bbd76c857576ded2995e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c24b5eeb7ed4b024a2344bf97b64ec74.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3c5edd88e066ebe850ad70c7f693b4ba.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aaac63a5fc32c88cf009a3957efccadf.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/47bd8da3f04ee58223a9b5cf1340ecf5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bcdaf95a07aaa42e25a6255c9315c163.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/26ea478a38e8f2928dbc5c2f93613b78.jpeg" + } + ] + }, + { + "name": "kawaii", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/de00f68d508f814beb905cd2fcb105b6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/59eecae04d88aafdfc27dbdbed3f7206.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b7add655c7ad129e7450d854a0341650.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e6586942bcbcf272455f955dab228758.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/78fc2b822fc1a02e3583d7063eed2f42.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/51031999d7d436985551cd19524cce39.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0648300ae38fcf09b0c3300a5e449b68.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c0d0a8288565b29075544088820b9196.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e69aace3e80d2d71cf76be55a84ebf43.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a17b655882dc9019556634041e3e54da.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8838852f7f5c55ea50bf8c40395e7f1b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/08ae5cc9a44ab440a176c337f31db1b3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0dbf4bef14fcea43de65e98db86b1762.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5d6c2c5ac1f65e58a62563c2798ba285.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c8ea3a5375cc689bf4b090278fcced39.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a2c978ae492d3cc9e13c6d129b6b13b2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a17e0fd585efa8294dbcb79e65e3e461.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/348636ce36c77a6d43dca03f96c5b4c2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/04ad0f6fbad1a9f3a10ee9f0869c4f3e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4b60fdedab1f57d3138e37fa83487750.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ce89d0109e3478b933f4703da1bde5ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3e7139fb80bcc35494089b7f758ea196.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cc50f8a9fabda92ec8a7c35d296df81b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aa33283ac8c8fbbee4a1108093a89cd8.jpeg" + } + ] + }, + { + "name": "butterflies", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/14bec2138e0dbbb8269fcd823373ec81.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2be531772db23680710b0ae0f6bbd6b1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8dd1d28b5f19d212233e4f75d65cdca6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/87d643a67dc0871e3e1ad8acb2b3f724.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6144a94883258aed87fb9081bbde0a85.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1015aaf11c417698c54b0dbdd2507533.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/369cd1449d89059d62604705e2dc19d8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9a85fb68e67b7ab16005a28d4c45424e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/159dd4cf025079e2b74b2aba1f314c44.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/492151fa770793fe78525ec147302d2f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/989ccbceb5d165cc4b44ced23af4d5fb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3bddefab997f67cfec336f798eb925fe.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5a3ed58b628e39741823c75510447418.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5eaee4c2cfb09a49bae3118fc322f74a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/47a0c3f8480c6a26097e4a14b85c79b9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/11097c38b1eb9bbfab9efad792ac199a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4501359f8f47768f7c2367a46bddc234.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a2c77e8179234381002c83ae14bdbd48.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/08a1c3f034284f1a493a6f187bb85c0c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f56209ad01c3d8c4d8d570c78b2d321f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/080f21125226515b4183aaad249bab0c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e3f9b89e0a25a4a2495d5ad929c9a8a4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c246da9b3a6fce305f59857ba29b6ca9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/30a65880137fcd20402d8f44fee72a04.jpeg" + } + ] + }, + { + "name": "ice-cream", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1bbcf0d4423449788cbc823441a3639a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0bf796c657ed4d6f71a87506f78d5810.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8358b0d4f247220a75f9131ca89df811.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/985eda6fe511752a4ec54f66e8e26dd0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e60779bcac97c31e5f130e4607e30b1a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c8227946e82f8c43f9107f29d4326472.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/72306be102fb449d09c2f00190f333fd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/14a353980ccf8e144edd511bdfb9799a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e6ce9107ee6b132fda1e001f8b2e0e8f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/25ec4e031b8f3bfbcdcd81827e71f825.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4b0e7d38bb0836de4740dc922939d2ec.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6c69e1301b8393af85d61975349c4e20.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c5b5aa7d87bc73fcdee4da3d278bed94.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e3bb6d6572b6ff014c96a80a90892ce5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3e93e7cf84e728ab4dcf86fc01ab361.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/db897544aa8015654df9a0cd9b009778.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a23f6c91d445fc7a32a4a6fd1cf12a75.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a952d9915b1b949d90476bb006d6c0a2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0b1104aef0f0dd0521e5da2f7993d5f7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/44ba5f78bd0b3e990940502309abadf5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e13b63c99f9a6e82b7c0980cc94da4fa.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f32eae2014ba84d2b15b0d41379bba9b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/90841637e3f0cce0538e4426c68a6943.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7d40d8b4e91953b74f9c266ff9fc68cd.jpeg" + } + ] + }, + { + "name": "birds", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d027d5c75d46118a8ff86257f87a7818.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/eb8cff06bba7da5f3bdc7171815f30b0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8d4d9ae904e7a71209b10016bfec4bd1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/828ff8fc1ed118e468421e5ed95a2a35.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/be89338c4809aaf5dcf3cc468432998e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe3b2513bcfb731520bc4dcd979e5193.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5542893618e601a7db59c526a067c6ff.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7814197400d16b8e9ca06a6875ceaec8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3829f608614d5e9d137db8ee5297f3c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/debff43be7b79def16d495317b9b162f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d59cc6ba4993bcf62c3869127a3c2941.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/85be37b1adb78db46d6966b85cd5189e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0c24b7c474b8e1a7faec82c8b371652f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/43adb1e59c4f757682af55d4f0eb7408.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2e02d2a00372e65792c82b7e35a0a86e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae39c963c68945c5e069c6f82a27370f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/894b85fa369566d7e2adb08262ed5ff1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ca49e82a5023d37b4688ccf83efe4498.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/706208a5352e89a17885d147d6af3c09.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/edc67a8b37dd34ce6718b1df35825ffb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/044937e0563345d553840b90d0e61be4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/71628f9256f7f1ab27872acf6477f697.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/328abe84ad5f964b94ff0d7b128786d2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d8a80f5ddadeac8e549369a33c79597d.jpeg" + } + ] + }, + { + "name": "candy", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d0522722bb51d48e79670f07e4ec94ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e249865fcb0a40a9e64fbb125b467643.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7df5fa01d881b56217af64f6087659d4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/022ab40bf75c2776f1a572aa0ac5df1d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c1c89540c0984a8ba945491cd5c6b7c5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4269ba8af3a09f1eb7508a8c683ee95e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/faae25973297f58826e3dbbd6dedad01.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3a850e4d137838c44ecf7bf8076c26aa.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8d6ed2580036c383d616cf91d49e0de4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/841e3504782891d665afe31f7bfbe978.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/db2cce3d9886840acc73fe04a4866616.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/14276e9295ce0546bdeb49e4eb3306a2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3aaeeb8ba9ae4185ff0d26964a5db981.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c69415f2ec008bb7fbe539e30dfcb9de.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/78b0c5abef0124866da1737390c67d48.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/380fb2476aa8b349823b6e0322eddd23.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/95278ef7f3d338ea46c30b1888978d9e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/042e0a31ada56ebda3f5442e8eb34ef9.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a6cabf09b53438313c6b0946d2f89482.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/369d8e92d8e657a35dd155de50596d4b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ad431bd7fd80af02e5df091d2e120637.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0312324215018a0c977a0f112c943e11.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1377058581145493d9197e7c1a748b92.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6b859cbfb8e5a0e2707a968529c578b9.jpeg" + } + ] + }, + { + "name": "illustration", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/741a4f4e3c11a30f5f250eabb255f3d5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0bd89baff334793eac9ea18c651d43b5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/81702ed7640a6daeab89fd4b0c98c2d6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/03b4dbbbdb7aebfe12bdc83b24c7aca1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/92917715228fe766a637a656292bfbc4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2a33be25f5b8814ed2c8851a689af012.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e9157866f994b85102cd97bc54612259.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/15c3470351ef15d4b70ac27163436fec.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/17daa8c07a3f781442edd568402deb82.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cb7e6acc06046411f4e38d9b55e0caf5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3e3fa690356c5001bafb8c8305ffff2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/db0ca82d6c484a62c108e8adb59be9f7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8a2e145771139c9e991db7c956c38841.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/17698bc166342dae3d26689fae4a1bc4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6e7aa9b6e4095bfb4648f01e2139e9c3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bfcc8cee57bd706e4bbb617f4364b5a5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fc8df50b6f78190fe5e7c35ea6eeb1ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4dfafb09122ae33d4265a94e0dd1828b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c39330313f2d91d61925f2d6c6c11bbb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fd6534f02987b5013d02af06248a59cf.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9ebcd0acaaee434fa2c0e74ffd215b6a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b7ac0f961b92d435edbe7c889dc1a42e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7f418c2d149b613ba571389ef6f3451d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1d5ef3ee8ba83245c8217a30b83c094a.jpeg" + } + ] + }, + { + "name": "colorful", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/668845fe70cd30c376a78f566e4b89c6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2af2a4d4e9ab05a8ed888fb4a704ee07.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4d6d2a80e17b46f459aea4ea31471688.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/454f45d1b513cbae0c4e7351e8057d09.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7d01634d7be19062a291c2eaa66f0a37.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/82a495cba8b841b470d60b0d8857c3b7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/06ed05b4e42fe36a3ecf26c3425139b0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/efb448e490c879c51b375a0f9abb920e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cf6f68211e4bc3a1c1115cb32a0bd6a6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0e1f8bf73ecaef233849432e3082c89.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/148499404d85516a86eeb5c2c30fafbd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c29589dcf6ba78637c76d85e1e1db531.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe49725650ad74103700769b9fc07a8f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d225f44145583267ae3d1a8e901a6e68.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3edba426a028daaa7ae362c1055632ac.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/44b748e4dae8df99c456db5aa4604045.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6b7550a3ff14a128e9a02ada2b572b40.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/07a96f1f7ebb02460216deafae5bcf88.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/19124bb0d51f3f5ea5cb2431d0919560.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/60cf1643be379cc8ccc80c56efce5c57.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d8c484f95fc7351a6543b39817a18b53.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b11b5feaf6323a144ac13712f190263e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/502f49c26a43a476417831fcdaf650ba.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a7d15918016792d6890ff7166cc9a90e.jpeg" + } + ] + }, + { + "name": "pattern", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b570d932db8d172bb9c1aca58972d4d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9e75b52e8e3fee0ad35f4145935c2cb2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1f124d5bf89f413c949793f4b591a9e1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/349336135eba300962ae430776ae6d4c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/06ebb4a1f5827ae8273e369e2a82459f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/56bcea9c32c4530147b08a1c1cfd9d54.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0c1c1c6e7f2eae50a86d07a36d5fa456.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9d87dd39a721b4c8174be3679d0281bd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5864be060552a76cfa1f04895c6c2c44.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/366b452a51da9516d27582ed9b5803d6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/11011f8b92d505d3f837afe073439ca1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/be9d97e50fa5c89937e387da6649e3b7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67311a260e3c5e11a55cb79f02309b3d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35c14f8ae14b38fa7cae5a1aa488cc0b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35627b141d46bd0fbb70487d7dc5dc29.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b7fe31e18aa622380b3fee4fa40fc43d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/99de9d5fde1d8fc483f63f06df86aee5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/15b39d3aae2b66b7c704e58b89c883af.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/880abdcadb53b481895d12edc442db52.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b1b5314cf76b80346abb27aac02a4dc7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1a5b7adf5708439b8af308a695099bb9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/751b6a2c6c7f062f063bea6c2be0a16b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2fe8b8c170d118590d0f829dabd5fc19.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fb202786278612845f98c13bf0392023.jpeg" + } + ] + }, + { + "name": "floral", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ae5e4942ebe89d59e9cdc92b2805ccb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2831602ba02537da94d995723ccf7267.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/972225d59df46a33b68af9e58f40c909.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9cd75c731b123ce5f9ae92302e0d87c6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/70eed4bbdd63ea47beb432b9a5580f87.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/85816e5c08c19d9716853fd321d62033.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0bdf89c9dda92361b5d8593cc6c7efdd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d8df828b0499ab638241f42c50b4ddb6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ffd4604630a16fc82d6885ddf73aa678.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b519b193e3cbb2b7d844a2af3e8d0119.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3ab2c34127f56d39bfac35a2bb3e37b2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5a39160d0276c27416e1d55fe16f8d71.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/41b710ad68114f57b9d786081d36c74b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/492e2ca90e94c9f08081d7a7819a8796.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/29ea32d16853c15fc3584fa9ec55f4a6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/588c792796e4e9cfb038beac7b1a2205.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9a654f2ed1f968b350899e815595ffa7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0af12a60416b57a0edda36b3a15e2e33.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2031dedf742e62423f72ee33685e1e7e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dad9d1660061c20a2f9331857373dc59.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a2097b54e4ee60f5ab4aefcc71a4fb06.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/15c5c9e62c0c2f5edffcba51c8d9453a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35b9e04f3967dc7fda571bad1e916d52.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/011f7c8a9d6a2b688a76b739245ecdd3.jpeg" + } + ] + }, + { + "name": "cakes", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/96e101029fa82cad3fba032e4d907874.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b18657ce8505fca699060de13b37ce03.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/26cec2e801132dd006e2eeb616e49488.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/af9edb791dc4e7e696c038a0b728ddb1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3b508cc58811b2724545896cbfcd66ac.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a96d12131ce5b9d173c5aea321c8b673.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f8fc8c470a4d38611af80dda3b67af80.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a6126323a125eead9a7b87c6bf20a3e5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4f690139a370c9372f4b59ae1317ed21.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3058121881c0bbe88ed9151907e08236.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d73a4cfb457dfa090a1e55457e6a02ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/22cb42c726a887bfd28b2d9a56ea72bb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8a0c1d6dcc22729a3bad6dcbe88ca3de.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/44dcbec510b2b32f3bef48535aa4f35e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bb404658207cba9b636245076d955009.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/256fe82058bfff15544c3b1e29daaabf.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ed6b488d0f6630515b90b336fbfc93a6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2d489bb38c9e4254a2e577d9e51d0a02.jpeg" + } + ] + }, + { + "name": "abstract", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4bff588558b80ede14e99fdeeef127ad.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/043429d95275d9ac3b571751507632d1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8c156a284f762e466be8c7a3469a1461.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/99eb62cdb5f7db79ede4e1aa2c12979f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/69903fe737df33067cc642d5a4f75fb3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ce21cbbb02bf8d98e37688c2a588e8e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7e73c464a7b8e9f2cffbb4d0eab7b853.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/89ef11e052582cf67c8e6c176dccc0af.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3c91baa017029ea7654388f9ca4fb132.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/42fc7091a4fb931f35d534f380230c25.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c5625601fbb5280e66edaf93601249b6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3c37c0c08b43967de7624692c61b2ba.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/274b0875b37f08fa52f1136fc63ce83d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/656831af2ce91d41df5dc4f331a4250f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/90435a57cd452e49ce063493c7994a57.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1dd3091afe56a8416a22e58d20898b59.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/243dcc839750c1472bfe3f12f7aa46a3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0f829b2f4456e03b823e2d74ef4a046.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e26ef60fd0b02bc93b722b657f9f3239.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a1a345e131831953e639758aaf8d6554.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/59318f224e30d7374e3d17b7d2bd860a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/73e5e71634d275c080d598fe9e7b5108.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/008f8b051b01448f9953a6eec12dcc92.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4039008218129f463115f00b552568cd.jpeg" + } + ] + }, + { + "name": "amoled", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/13362a433eeb77a8fddc8c5a75291d57.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c7e353bebb4b98ecd4cd3d5311fcc84d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3096f65b83a3a37f386c7da992856c75.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/333ab55bb6638bb28b2162eec57041f5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f9d722b01b2933ed1753e727bb62ad9e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0818bafa796b124c5c3539dc6991ce37.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/48e38483bba126b8310a88aacd7ef9e4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/081636c9da2c2d4cc3c728988a990b34.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f934f0167eb4273df69238bf304f33d9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/32cdefa9ed352a6c798761c4d74cae8e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7a94c6ddfdd2fcf1a818497e8a50670b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f2a0a9de6f52cc20879785fc57c18305.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1e4dfbffc7865715d0fb9301605321ca.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7a9b83f8f8898506e5ee4ceab7711c9a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4523c7f2f1609341dd2134a0c78c92c1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/60d51242fb2d1382cd5ab761c190b115.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/11260788c3aa47f5581e00e6d5e59b54.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/803bb4c662d1f7199e4ec1d2fb6c67a6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5f565659c3931f06e1b455147e62d786.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/76ac62587a180390bfc30e52ec356dad.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0733351cc13e3d1ca5881a8baf75825f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b7c3d3de4707b972c2325c73e17fd9ff.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/35d70b9e34ca62853a545cd250020c38.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1a99a940a6ee0025f28a2d5f7cdb1055.jpeg" + } + ] + }, + { + "name": "vintage", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a4e335102bf1bd6e2b9a305afff7c9b0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0d7fe05abaa5a041d26b3c0541533f88.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6ff06037f4d076b12755165b6a7d6193.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ef9f0d6e4b10a03dac177cbb523a604f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9d128c185ec7dad48edaa7c4cf7fb454.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4aec8547c98af34ebc57d67b493ac0d2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5e94b6540e298b449f353ed3b87d8a3e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/db1e866c16710fbc440508d4bcea17de.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/627cb249b3d7242137cce2d784b8910e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/33ee8a5d07512b9b69b43f1dcd7cc399.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c3a53d3835e57f7d53ac9c6d6e7f5a20.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d167bab1cc3576e191cbb3d21e232545.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4c552903b0b3f24b99972ba3b5d0467f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ffea8aee4ddcacb5c2c12b0714de0064.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7bd3651534505865768a41186fd43edb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/47c2398a9bb3db21d576d175d630d7fe.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aeae50ccc5706f393474377ec2b42ae9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1b9c9b757cbdeb393123e1b75266cffe.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/82eb738f141e96d0e3e1884a70be1ca8.png", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ccc963d3b9f3300e2e56416315d32ab6.png" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/61f819aae816fa17d62d42d37682253d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cc5d59a4a497ca7f11250323bb769238.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b5ab2d84b63b8c764948baccd1e0015b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/feba604471df0dc5848111a2545a076b.jpeg" + } + ] + }, + { + "name": "cool", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/de36a2eae65bb24a433f22d2de2adf2f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0d183f9e2cc4ad2626d58bf60ef423e6.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a20e94ca11bb25ebc503cceec6d0c5e7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/88ecb69e2550ebf777a88abf01de1f2e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ddcf276287ac75721da30e8c24461c3c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2ea3abfc5c9baa37f378ab1fdfab799f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/88f924da6824864c1156dd97bacf7c35.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ee5004db5978f9d7059dd3681cf99a56.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5391baec5bd947645769fdbcef1128ec.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/51d7ff7c4da20514db539948a4a6b504.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/baacd8f8dff00ec758cace5162849cda.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f639c30d0f8b49877f28b2856a12a6dd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/216eb2ad5c7318059d059b6b284c6256.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/87b276d277f0a0801a7a73115b8f8339.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3769a8d85bf2a44b3e33a151fba6e7cd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9d6172a42751e8e7ed4aa93d1d2b9ec3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9cd4fe339962adbd585d58720d4de887.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a66eefb8551a921992f2bd0ed913019a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c89a66f600f4d5e071307c3c3f22a3c4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6d231ce5bfdbb27c3a9c8500c508dd42.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/46b2930bb250e6d7303ab228bd81bcf2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/94516cde7ff28a78c5a62d4bf90b9384.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1f1a981b7ed89583b4cb33e71a871f7d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/57a7b96592ac4680e64c710ab2d217a6.jpeg" + } + ] + }, + { + "name": "variety", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3a5965c4291dba859c4b7f0b196f99c2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe57f912ce3eedf20716b20335b92a7a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7093c9ea05fbb9bb4fd8be87a8af041b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2445c1787df6f1a51d19e26a3570e436.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/908c7860823095f08247c4158ba011aa.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e218f76794541caffa8027b733bf3676.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fa731cf59f18302d6bdb189a26031119.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5274fcd6fc0ef50beeeaf0fb4e8e78ea.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/895b89bc421d1514df6dcbda0da4f4a6.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c80f7ba5ab767c7459ffa7a0c388aee8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b90aaaac8051a9320ea2b8fd07fe9cf.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bba3c29c5ab6be1194cb507f0a94b5ab.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c279e2829627f782e339e009ca5b84a0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a79227e004068089ca5045956aa2088d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c195c51c3b96f33ac051f70d326e6f0c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7c777e7505e8acb396b99d58a99c0983.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c3839e6ff72616b892bc5bcc10147978.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cdcf780e77064eda1639bf7eb2112474.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e010bdec2284a4f87ba6c877bb5d6895.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/52edba408b78347b8d69643c757e3ba2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/640d8efb9ce80054ac4f845f7475e502.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/75f60f1d9d20cd0ed1c3e0ba3e6dc99a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/87e895e7a19b8199772d84b132b76ea3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2f02ba03cefac28c9c789269e96aa7ea.jpeg" + } + ] + }, + { + "name": "funny", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1bd4c32c2eb2045a19c4cf7afb8201d4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b2e70fdc63bcefd5846f136da3975f9c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a6e1d83a81c9fb4b6d097e1043a6a4f5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/be7eb4106be52e5b730e4bff290bae5e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b9750ff29195ca1dd4ef7ceb38d5b56b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/73b3495c68855ea21391c277ef22e312.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/76cbdf98de9f34378403e6f17618f263.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/61a5f6c9f67c1f8d3bf4d9caffbed733.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/84f04ce55831a3eb890fb46025358ab1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aa8e48bd3c60698d0182478a1ea3047a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1311486df5ef8bdacbf46ef0640d1f39.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3114deb49156e265456d5de847f29888.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bb29f1548a8d91b3c8a2e082b7811b2b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0e19eb84464f916efb6a2923aa59b670.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/00a4b802065bf46110b1f00b75d80c80.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0ac0ce978c0fdcea940ada487b2f1471.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8fbde61dfc1f2e4774692c3e61bb7a7c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/53f171e7ee0e7034a9dc64f86d61ae8d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9162aa7142cfaa0c071290a0bbd33332.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ca19cc252008b9b05c520622e518d180.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7ee58abfa954b1f994be248ff395748f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/688d4d91e6e549cce42ebad2531554c5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/906c48ba4f4c1cc38e6d09b1d62c5db4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6a3f2a2e0d292e1032b448b7b2e70f80.jpeg" + } + ] + }, + { + "name": "food", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3a49c824f553e1b8f2ce743cb89e1b6c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d04ee07feb44c02fcf92a7c3094370fb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e179a42603816c94881758eb6cc90a0e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/729bb3e1426112a67bc0d2dae72a93db.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/60ff000d48098f62835d1358952bf6e9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/700c76c6e567389530c6fa0cf774da9a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4fd7d9fcf1ab0b6411a49846692818fd.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0f26e2098bf875385374c2c55fd14d4f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5249da171aa91da5baae3721bfc822d1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/69ae743f1d5a74e02fb7eb3ee9e8d057.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a1534580d5711ec78e7a683cc35b4e1f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ec3e8179ff5302a0e0d375ecbcc8b7ea.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/74f39c37bf335669fcdd29ac89415d47.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/29362f69099ba10814b62117ff258b7d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8cee4aab3b689ed2d443c94e9122ea92.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3e7c4dc9209bd160631e86a7a1a87286.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ce6ce9abe8f5b8c7618de82134d693c9.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5045c152e13740dd89eafd6ec274c27a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/38ea2efbeb2c443a93e0131744153296.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3e08c528e6161ad4d154298c873d1d4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/67dbb27ea7084211565bc7b3b63bcf34.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/09d937e5c4ff029f12a2cf7dc6eb434e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ebdf88d758aba67587da3376314deb6d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/41e74000704cac41ee522c7a80ea0775.jpeg" + } + ] + }, + { + "name": "fashion", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f90e441b77b209c856bb2441ba11bac4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d9fb7a20ef94b3c8379eeabd2f085211.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f0dd50d0798e263d823aba83273bba98.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5d75ca250acd762ca2d89eb1ed6cb487.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e56ed858a1161f4b9874b902e29eae37.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e0119cea3b136e70f4ccdd681ea0e223.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4972ade2f6db7be9bf95f7348cf03da4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cb81b09ab2e4bdf3750e4058c7b0af27.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b9f6670d29d24ba4762ebc372370f335.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/17fe24b464ddc35fea4ef9c025e6a69e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2cdfce4e3e9fe240526a6ad730f5d071.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e6221778a9c25540ef8f3382ee12807b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a9d3c14f1e5740cc94e77b552e62df34.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/036cdc5d2cf39de637ebf9d44ef5bfd5.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b77e1f397318a4fd87ad6a4a3c6e4597.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f138506cebe6eb23bde3ecb370490b9c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a85152d6da2f97f19e8af2681ceafb8e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d3dd0ee3efd4f5eda92bf9e16552cfd2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/aba4d5d2d042a1a4ce13186191259064.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a898aa764cb00904fcf931457f311c74.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/012d6514e4fbe9c4f8adb09c1c8217cf.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/20da7c9ff6bac4a0507730ab085d0276.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1e543ee1d00a131313c643d7829ae409.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/61d6607f1ef469f0e16f2e669c99f1c0.jpeg" + } + ] + }, + { + "name": "sad", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c59007c4e8b3befb96dbecb3ec326cc1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3670282caa3a1b93913827c103476de4.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e7f63cd08f8423e5a5a3c61792b07edc.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bdebd3e30c241102b934bb234ff4d92f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/42b952b7430e53357e45e6cb2979ac13.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d6490b20fc2cfb9ade732bb102d3cb51.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fa62119a8e04bcebd9421f17b90aa59b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0611515911379560822c9e6d9e787a64.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e405f89382e18a796bab87e814443eee.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4998f833da2e6a0293011b8f805f020e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/36abff7c2a2e9f4ed262dcee0da8c09b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/592ca47d7613a9b1400c97a92eb703f2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e92c7a3b497c7d8ce19d6199d31d9759.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cd1f86273839039caa5e6f9f707a02fd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b0458b2d5c5653ff80c91d54ae57b2e3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0d3ad7ebeaf33889f3f6d8280c8a9afb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ffb3bd29fa36658369099394e167097.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/faf97d8da37fbfc15b1992cbb008aac0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/83f0e93536f1784c59707c0a6ba3ed1f.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6bfbf1691de50e9fc73391e3ec396310.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/36e2cb743fc120c4a75dee03698d801e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1716f146e51f29199c0f770148cc00cc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/04c475032316832603bd1f38a2363cdf.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ea8afeb57997af979381e37d5e9be0c1.jpeg" + } + ] + }, + { + "name": "music", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d5f3a2230952dab694ff0a80825e0a9d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ba895bdb432d5ae1315777e89f07b2de.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4e00c5c27d654d387eb0404cb8575d73.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/5f678a5d03d3014bd1969644a5156510.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8964cb7c75335a8a90f6041956bc94ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/98083dfbb3738a921edbc63196563f5a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7da01d53569bb1f729bc855dd8d14404.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8b2788065e441b40a9ccc1e2e41d4492.jpeg" + } + ] + }, + { + "name": "fruit", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e0f64bd789ef513368865c9f42adfaab.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/25defad4df6676943fee66672cd9c469.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e1ae912e5e0030affd65c583c4321998.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ff08fd34f805d05f9776ddb4fa2a7ad8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ae98d28e4ac9824cfe0d671040d194d7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b98cb3d2ade3616c2532bf9459bfaf99.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b12bd41dd726de691b16443ba3f06d82.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0017adb2d38e5f159bd0350f877ea3a0.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6540e511e91f0093f05b610409601be4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/eb955cf15c609e5bb57e8ed662348c3c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bc03252924ae3a4c1cc794df936cd77d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0631abdeb23092407d411c8e0834c196.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/6378ec9bd2d1e70396d9a44db7008d54.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fe881a47d03c1cb53c5874ba6c94285f.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4ab4f8a6bb0a56dcc76e0e53b48b911b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/25eb55daab8bd1f5c1b14446fe5be06a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2781497ed0195127a47cc5b8b34668c3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c0532f5abab55cc1610255df734a2a78.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/85e26ed88c6d18dce4872769e80796f7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e09e0f24a54316d3344e42780300d614.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4aaef12d9c74531eb2ec62ab56bc37eb.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2482e85608716f9853f663082c75dedb.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2d8aaaca5f4caf78161030a0ca4274ed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dd17f7ab449f794a80401f3155fe6fae.jpeg" + } + ] + }, + { + "name": "doll", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8adbcdd5abe61cc2210d8d5bdc7343e8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/cf99a915f6e25f8a84edb0297ae5d5a7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e2ed2dbcfab07dca994c5cf3217e7f8c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ddb711992c372d50034b82a6f0f067d2.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fffa33301cb2db2b3ab7eccc676daeed.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9e11895bab250df96dcb5e7fa474958b.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/09b0f2f877b920d9c1501c9ef7c495b3.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f1072c137a3fc430e727e32669328682.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/24cab25985e1436c0670dbed297f81ac.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4decc3c640f58b7c32032c5ed0645efd.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/82b784b2233efc41d3bb8810e7e0e4ea.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/c92e3bf720cba63a6a79a35284e36503.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7b528247d7100c4cb519449649061ce2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f6301e84a178fbb9c14cd845ae792f80.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4f8040373d107d763be6b12e919238ba.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2fa9a6ccb3d4da84a33ea7b94a483383.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/fc5e2c714ad8aa63e481ca7f0cb37ab8.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0bbb81043954c46c29b18997cb639d91.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/297b9e0dc7de746b8672a98e82b1699e.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/3f04dfa84f0540398ad67207049cfb86.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/a4337c6bc9797cb0faa5a1730ff74b99.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/58a3b4f474808498b686513246f4e3f1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/80113c33ebc64ecba64ef7cca29c2f42.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/38c41e972460a95a86dc04c91623b41e.jpeg" + } + ] + }, + { + "name": "teddy", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/03b962f4e3ff5cc220544c6589a49482.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0cd0f61b1feaaca0be9d35baecfa9fb3.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/880e2d05ba1385f2de52f7a92719c557.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/de1ef1d5e10ff0d4039dacb557a21406.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/687a9886a5007d029012ac65afc54b6c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/f4d9a30b2f2b2a4cf0c831dff44fd3a8.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/01ce70893e7947731369ef22ff20a9ab.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9d824cc7622e39e0eb9b44ae9514c8db.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/0a294e1fe43d84eb8b4b3663dc1c06f7.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e5a191f3207eb6276f01845a68a4f47c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/498b2956356743dd61bcf43c5e2bdfe5.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/44f01787f33c354865ef2e0235a52bb7.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8739a1033149540124a0c9bf2dca71b2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/dd3608457a2915a29de559f59927babc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/30448f7b2fe2bcdf037fc3d1fc971751.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/998df3180fbf701806e8fcdff50880fc.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2db8de8bbe2acc13e0f7b7452a31833d.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/465ed2353065dbc9098bf64823262a1e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8ed6ea3550e3d3d7adca4328f506381b.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/93ecd796e16f464e869745f440f7839c.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/00512009f5e53b7ffac175a4b7b0618c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/4cce389659d496e6ab2fd1f466ce3e76.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/480c91421eda56398ed556d28272114a.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/24e0c9ac9ff4583da5e351d5cd1b0daf.jpeg" + } + ] + }, + { + "name": "winter", + "list": [ + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/028622eed6c6083a721b5c6af19053d1.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/8497b431b92946723d7acbd1c9836bde.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1eec46be4f654c35ed397b2568bbf410.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1d07ac78611b1db85b8826c9967574d1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d916afda03ba32585ffe6d7f897fd661.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d766b69fd8c55aaaec08b1ca02c2c17d.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/9a6134a89dfac42a68926d4e3d9c70b2.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/48cd11897f62379515372db56a6a7762.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/1da4fbbe758c19cb206595e393394c1c.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/d30a0ccf42310927ad69b5a5c20cdf93.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/bdd777b683f7ea3a509266f857f97785.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ea5ec14e13fa770ae4b8168dd16fc0ea.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/992dceec08dde4d52738bd31845a49f4.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/e4c6d7987095324dbc8c09eab7e5951a.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2716b330d331e70f2bd680346657d613.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/b24128631722adf1254656b55e7ac00e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/2add050d3ae6eb6554c32249b3827201.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/29578210653139b4c79e1b52588c36e1.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/07f63ca35a1b68cbfbc1e4c7515fb3ce.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/ff4bb7c4731acbe4272428b962328b4e.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/81624255e2178f2dcd5c337ed49ce491.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/7a747ec73145e5c3e55d8c3725db8640.jpeg" + }, + { + "sourceUrl": "https://resource-sg-public.lux-ad.com/wallpaper/95cd62290787005d255eb4bdd832f4b0.jpeg", + "preUrl": "https://resource-sg-public.lux-ad.com/wallpaper/312c2c3b0f4d9c1f15a0ba27b8554a39.jpeg" + } + ] + } +] \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/MyApp.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/MyApp.kt new file mode 100644 index 0000000..5530234 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/MyApp.kt @@ -0,0 +1,126 @@ +package com.cute.girl.hd.pink.img.wallpaper + +import android.app.Application +import android.content.Intent +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.applovin.sdk.AppLovinMediationProvider +import com.applovin.sdk.AppLovinSdk +import com.applovin.sdk.AppLovinSdkInitializationConfiguration +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.liulishuo.filedownloader.FileDownloader +import org.json.JSONArray +import java.io.BufferedReader +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.InputStream +import java.io.InputStreamReader +import java.io.StringWriter +import java.nio.charset.StandardCharsets + +class MyApp : Application() { + companion object { + lateinit var app: MyApp + lateinit var myData: List + + const val MAX_SDK = "3cUMfTcsZKzlJevxK4IkNysgDAeQA4B5w332p3g8B9ZAgC54WQNZLVxuxnCx4sCHA5StLJnDTAFa68mFTi8rd8" + const val AD_INIT_ACTION = "on_success_action" + var initSDK = false + } + + override fun onCreate() { + super.onCreate() + app = this + initSDK() + FileDownloader.setup(this) + readJson() + } + + private fun readJson() { + val openFd = assets.open("test_new.json") + val pathDe = cacheDir.path + "/res.json" + if (File(pathDe).exists()) { + myData = fileToData(pathDe) + return + } + if (writeFile(openFd, pathDe)) { + myData = fileToData(pathDe) + } + + + } + + private fun fileToData(path: String): List { + val jsonStr = getJsonStr(path) + var data = mutableListOf() + val array = JSONArray(jsonStr) + for (i in 0 until array.length()) { + val any = array.getJSONObject(i) + val title = any.getString("name") + val jsonArray = any.getJSONArray("list") + var data1 = mutableListOf() + for (k in 0 until jsonArray.length()) { + val jsonObject = jsonArray.getJSONObject(k) + val source = jsonObject.getString("sourceUrl") + val preview = jsonObject.getString("preUrl") + data1.add(Data(preview, source)) + } + data.add(CategoryData(title, data1)) + } + + return data + } + + + fun writeFile(input: InputStream, filePath: String): Boolean { + + val byte = ByteArray(4096) + val output = ByteArrayOutputStream() + var l: Int + while (input.read(byte).also { l = it } != -1) { + output.write(byte, 0, l) + } + val fileDe = File(filePath) + if (!fileDe.exists()) { + fileDe.createNewFile() + } + val fileOutputStream = FileOutputStream(filePath) + + fileOutputStream.write(output.toByteArray()) + output.close() + fileOutputStream.close() + return true + + } + + fun getJsonStr(resPath: String): String { + val stringWriter = StringWriter() + val input = FileInputStream(resPath) + val charArray = CharArray(input.available()) + var l = 0; + val bufReader = BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)) + while (bufReader.read(charArray).also { + l = it + } != -1) { + stringWriter.write(charArray, 0, l) + } + return stringWriter.toString() + + } + + + private fun initSDK() { + val initConfig = + AppLovinSdkInitializationConfiguration.builder(MAX_SDK, this) + .setMediationProvider(AppLovinMediationProvider.MAX) + .build() + AppLovinSdk.getInstance(this).initialize(initConfig) { + initSDK = true + LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(AD_INIT_ACTION)) + } + AppLovinSdk.getInstance(this).settings.setVerboseLogging(true) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryAdapter.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryAdapter.kt new file mode 100644 index 0000000..0e200f4 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryAdapter.kt @@ -0,0 +1,98 @@ +package com.cute.girl.hd.pink.img.wallpaper.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.target.Target +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.cute.girl.hd.pink.img.wallpaper.databinding.ItemCategoryBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategory +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show + +class CategoryAdapter(private val ctx: Context, private val list: List) : + RecyclerView.Adapter() { + + private var mListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + return VH(ItemCategoryBinding.inflate(LayoutInflater.from(ctx), parent, false)) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + if (list.isEmpty()) { + return + } + if (position >= list.size) { + return + } + val bean = list[position] + holder.getRoot()?.let { + it.setOnClickListener { mListener?.onItemClick(bean) } + } + + holder.mItemBinding?.tvTitle?.text = bean.title + holder.mItemBinding?.ivPlaceholder?.show() + holder.mItemBinding?.ivWallpaper?.let { + Glide.with(ctx) + .load(bean.data[0].previewURl) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.show() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.hide() + return false + } + }) + .into(it) + } + } + + override fun getItemCount(): Int { + return list.size + } + + fun setOnItemClickListener(listener: OnItemClickListener) { + mListener = listener + } + + interface OnItemClickListener { + fun onItemClick(categoryData: CategoryData) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var mItemBinding: ItemCategoryBinding? = null + + constructor(binding: ItemCategoryBinding) : this(binding.root) { + this.mItemBinding = binding + } + + fun getRoot(): View? { + return mItemBinding?.root + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryDetailAdapter.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryDetailAdapter.kt new file mode 100644 index 0000000..1f09ad4 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryDetailAdapter.kt @@ -0,0 +1,108 @@ +package com.cute.girl.hd.pink.img.wallpaper.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.target.Target +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.cute.girl.hd.pink.img.wallpaper.databinding.ItemImageBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategoryDetail +import com.cute.girl.hd.pink.img.wallpaper.utils.DeviceUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.dp2PxInt +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show + +class CategoryDetailAdapter(private val ctx: Context, private val list: List) : + RecyclerView.Adapter() { + + private var mListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + return VH(ItemImageBinding.inflate(LayoutInflater.from(ctx), parent, false)) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + if (list.isEmpty()) { + return + } + if (position >= list.size) { + return + } + val bean = list[position] + holder.getRoot()?.let { + it.setOnClickListener { mListener?.onItemClick(bean) } + val params = it.layoutParams + val itemWidth = (DeviceUtil.getScreenWidth(ctx) - 8.dp2PxInt()) / 3f + params.width = itemWidth.toInt() + val itemHeight = + ((itemWidth * DeviceUtil.getScreenHeight(ctx) / DeviceUtil.getScreenWidth( + ctx + ) * 1f)).toInt() + params.height = itemHeight + it.layoutParams = params + } + + holder.mItemBinding?.ivPlaceholder?.show() + holder.mItemBinding?.ivWallpaper?.let { + Glide.with(ctx) + .load(bean.previewURl) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.show() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.hide() + return false + } + }) + .into(it) + } + } + + override fun getItemCount(): Int { + return list.size + } + + fun setOnItemClickListener(listener: OnItemClickListener) { + mListener = listener + } + + interface OnItemClickListener { + fun onItemClick(pos: Data) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var mItemBinding: ItemImageBinding? = null + + constructor(binding: ItemImageBinding) : this(binding.root) { + this.mItemBinding = binding + } + + fun getRoot(): View? { + return mItemBinding?.root + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryPagerAdapter.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryPagerAdapter.kt new file mode 100644 index 0000000..6cf39b1 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/CategoryPagerAdapter.kt @@ -0,0 +1,107 @@ +package com.cute.girl.hd.pink.img.wallpaper.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.cute.girl.hd.pink.img.wallpaper.databinding.ItemPreviewBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategoryDetail +import com.cute.girl.hd.pink.img.wallpaper.utils.DownloadUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show + +class CategoryPagerAdapter(private val ctx: Context, private val list: MutableList) : + RecyclerView.Adapter() { + + private var mListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + return VH(ItemPreviewBinding.inflate(LayoutInflater.from(ctx), parent, false)) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + if (list.isEmpty()) { + return + } + if (position >= list.size) { + return + } + val bean = list[position] + holder.mItemBinding?.ivPlaceholder?.show() + + + val url = if (DownloadUtil.isExist(bean.sourceURl, bean.getTag())) { + DownloadUtil.getFilePath(bean.sourceURl, bean.getTag()) + } else { + bean.previewURl + } + +// val url =bean.previewURl + + holder.mItemBinding?.ivWallpaper?.let { + Glide.with(ctx) + .load(url) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.show() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.hide() + return false + } + }) + .into(it) + } + holder.getRoot()?.let { + it.setOnClickListener { mListener?.onItemClick(position) } + } + } + + override fun getItemCount(): Int { + return list.size + } + + fun setOnItemClickListener(listener: OnItemClickListener) { + mListener = listener + } + + interface OnItemClickListener { + fun onItemClick(pos: Int) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var mItemBinding: ItemPreviewBinding? = null + + constructor(binding: ItemPreviewBinding) : this(binding.root) { + this.mItemBinding = binding + } + + fun getRoot(): View? { + return mItemBinding?.root + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImageGridAdapter.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImageGridAdapter.kt new file mode 100644 index 0000000..1dcaa5f --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImageGridAdapter.kt @@ -0,0 +1,114 @@ +package com.cute.girl.hd.pink.img.wallpaper.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.target.Target +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.cute.girl.hd.pink.img.wallpaper.databinding.ItemImageBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GImage +import com.cute.girl.hd.pink.img.wallpaper.utils.DeviceUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.dp2PxInt +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show + +class ImageGridAdapter(private val ctx: Context, private var list: List) : + RecyclerView.Adapter() { + + private var mListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + return VH(ItemImageBinding.inflate(LayoutInflater.from(ctx), parent, false)) + } + + fun refresh(data: List) { + list = data + notifyDataSetChanged() + } + + override fun onBindViewHolder(holder: VH, position: Int) { + if (list.isEmpty()) { + return + } + if (position >= list.size) { + return + } + val bean = list[position] + holder.getRoot()?.let { + it.setOnClickListener { mListener?.onItemClick(bean) } + val params = it.layoutParams + val itemWidth = (DeviceUtil.getScreenWidth(ctx) - 8.dp2PxInt()) / 3f + params.width = itemWidth.toInt() + val itemHeight = + ((itemWidth * DeviceUtil.getScreenHeight(ctx) / DeviceUtil.getScreenWidth( + ctx + ) * 1f)).toInt() + params.height = itemHeight + it.layoutParams = params + } + + holder.mItemBinding?.ivPlaceholder?.show() + holder.mItemBinding?.ivWallpaper?.let { + Glide.with(ctx) + .load(bean.previewURl) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.show() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.hide() + return false + } + }) + .into(it) + } + } + + override fun getItemCount(): Int { + return list.size + } + + fun setOnItemClickListener(listener: OnItemClickListener) { + mListener = listener + } + + interface OnItemClickListener { + fun onItemClick(posData: Data) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var mItemBinding: ItemImageBinding? = null + + constructor(binding: ItemImageBinding) : this(binding.root) { + this.mItemBinding = binding + } + + fun getRoot(): View? { + return mItemBinding?.root + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImagePagerAdapter.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImagePagerAdapter.kt new file mode 100644 index 0000000..ddbe179 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/adapter/ImagePagerAdapter.kt @@ -0,0 +1,106 @@ +package com.cute.girl.hd.pink.img.wallpaper.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.cute.girl.hd.pink.img.wallpaper.databinding.ItemPreviewBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GImage +import com.cute.girl.hd.pink.img.wallpaper.utils.DownloadUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show + +class ImagePagerAdapter(private val ctx: Context, private val list: MutableList) : + RecyclerView.Adapter() { + + private var mListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + return VH(ItemPreviewBinding.inflate(LayoutInflater.from(ctx), parent, false)) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + if (list.isEmpty()) { + return + } + if (position >= list.size) { + return + } + val bean = list[position] + holder.mItemBinding?.ivPlaceholder?.show() + + + val url = if (DownloadUtil.isExist(bean.sourceURl, bean.getTag())) { + DownloadUtil.getFilePath(bean.sourceURl, bean.getTag()) + } else { + bean.previewURl + } + + + holder.mItemBinding?.ivWallpaper?.let { + Glide.with(ctx) + .load(url) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.show() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + holder.mItemBinding?.ivPlaceholder?.hide() + return false + } + }) + .into(it) + } + holder.getRoot()?.let { + it.setOnClickListener { mListener?.onItemClick(position) } + } + } + + override fun getItemCount(): Int { + return list.size + } + + fun setOnItemClickListener(listener: OnItemClickListener) { + mListener = listener + } + + interface OnItemClickListener { + fun onItemClick(pos: Int) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var mItemBinding: ItemPreviewBinding? = null + + constructor(binding: ItemPreviewBinding) : this(binding.root) { + this.mItemBinding = binding + } + + fun getRoot(): View? { + return mItemBinding?.root + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryData.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryData.kt new file mode 100644 index 0000000..8f1c0f9 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryData.kt @@ -0,0 +1,5 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import java.io.Serializable + +class CategoryData(var title:String,var data:List):Serializable \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryPreviewBean.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryPreviewBean.kt new file mode 100644 index 0000000..8d493e0 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/CategoryPreviewBean.kt @@ -0,0 +1,7 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import java.io.Serializable + +class CategoryPreviewBean : Serializable { + var list: MutableList = mutableListOf() +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/Data.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/Data.kt new file mode 100644 index 0000000..d8fc56c --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/Data.kt @@ -0,0 +1,22 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import android.util.Log +import java.io.Serializable + +class Data(var previewURl: String, var sourceURl: String) : Serializable { + + fun getTag(): String { + val lastIndex1 = sourceURl.lastIndexOf("/") + + val lastIndex2 = sourceURl.lastIndexOf(".") + + val substring = sourceURl.substring(lastIndex1, lastIndex2) + Log.d("-----------","----------$substring") + + return substring + + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategory.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategory.kt new file mode 100644 index 0000000..27cdb77 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategory.kt @@ -0,0 +1,19 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import com.cute.girl.hd.pink.img.wallpaper.utils.des.DES +import java.io.Serializable + +class GCategory( + val cid: String, + val category_name: String, + val category_image: String, + val order_no: String +) : Serializable { + fun getPreviewUrl(): String { + return "http://${DES.decrypt("J ¯ñ\u001C\u008C\u0084Ûü\u0005nÖS\u000F\u0098\u001DD ¾;>ÅEðÃIH\u0096ð{Rl·4Æß&ÿ¦Vú#\u001EÅ/\u0082`;")}$category_image" + } + + fun getTag(): String { + return "$cid" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategoryDetail.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategoryDetail.kt new file mode 100644 index 0000000..a8c8ad5 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GCategoryDetail.kt @@ -0,0 +1,23 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import com.cute.girl.hd.pink.img.wallpaper.utils.des.DES +import java.io.Serializable + +class GCategoryDetail( + val cid: String, + val images: String, + val is_premium: String, + val cat_name: String +) : Serializable { + fun getPreviewUrl(): String { + return "http://${DES.decrypt("J ¯ñ\u001C\u008C\u0084Ûü\u0005nÖS\u000F\u0098\u001DD ¾;>ÅEðÃIH\u0096ð{Rlþ\u0002£\"uJE\u001EPÒÀÁËz`\u0018")}$images" + } + + fun getSUrl(): String { + return "http://${DES.decrypt("J ¯ñ\u001C\u008C\u0084Ûü\u0005nÖS\u000F\u0098\u001DD ¾;>ÅEðÃIH\u0096ð{Rl\u0089i²aÙc\u001CA")}$images" + } + + fun getTag(): String { + return "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GImage.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GImage.kt new file mode 100644 index 0000000..0a8011e --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/GImage.kt @@ -0,0 +1,45 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import com.cute.girl.hd.pink.img.wallpaper.utils.des.DES +import java.io.Serializable + +/** + * + * "cid": "30", + * "category_name": "puppies", + * "category_image": "3873-2017-11-18.jpg", + * "order_no": "20", + * "id": "7322", + * "cat_id": "30", + * "color_id": "0", + * "image_date": null, + * "image": "681581_1691845871.jpeg", + * "is_popular": "0", + * "is_featured": "0", + * "is_premium": "0" + */ +class GImage( + val cid: String, + val category_name: String, + val category_image: String, + val order_no: String, + val id: String, + val cat_id: String, + val color_id: String, + val image: String, + val is_popular: String, + val is_featured: String, + val is_premium: String, +) : Serializable { + fun getPreviewUrl(): String { + return "http://${DES.decrypt("J ¯ñ\u001C\u008C\u0084Ûü\u0005nÖS\u000F\u0098\u001DD ¾;>ÅEðÃIH\u0096ð{Rlþ\u0002£\"uJE\u001EPÒÀÁËz`\u0018")}$image" + } + +// fun sourceURl: String { +// return "http://${DES.decrypt("J ¯ñ\u001C\u008C\u0084Ûü\u0005nÖS\u000F\u0098\u001DD ¾;>ÅEðÃIH\u0096ð{Rl\u0089i²aÙc\u001CA")}$image" +// } + + fun getTag(): String { + return "$id" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/IntentConstants.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/IntentConstants.kt new file mode 100644 index 0000000..b34e1e2 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/IntentConstants.kt @@ -0,0 +1,12 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +object IntentConstants { + const val KEY_STRING = "key_string" + const val KEY_STRING2 = "key_string2" + const val KEY_BOOLEAN = "key_boolean" + const val KEY_LIST = "key_list" + const val KEY_POS = "key_pos" + const val KEY_FROM = "key_from" + const val KEY_BEAN = "key_bean" + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/PreviewBean.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/PreviewBean.kt new file mode 100644 index 0000000..54eb00c --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/entity/PreviewBean.kt @@ -0,0 +1,7 @@ +package com.cute.girl.hd.pink.img.wallpaper.entity + +import java.io.Serializable + +class PreviewBean : Serializable { + var list: MutableList = mutableListOf() +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxCallBack.java b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxCallBack.java new file mode 100644 index 0000000..100616b --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxCallBack.java @@ -0,0 +1,8 @@ +package com.cute.girl.hd.pink.img.wallpaper.mymax; + +import com.applovin.mediation.MaxAd; + +public interface MaxCallBack { + void onShowFail(MaxAd ad); + void onAdHidden( ); +} diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxUtils.java b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxUtils.java new file mode 100644 index 0000000..3076a8d --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/mymax/MaxUtils.java @@ -0,0 +1,92 @@ +package com.cute.girl.hd.pink.img.wallpaper.mymax; + +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxAdListener; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.cute.girl.hd.pink.img.wallpaper.MyApp; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class MaxUtils { + + private static final String one_AD = "3580a29f73375939"; + private static final String two_Ad = "255b8d8daf7ef9d9"; + private static final String three_ad = "fe989ddbb91ecdf6"; + + private static ArrayList adArrayList; + + public static MaxInterstitialAd onCache(List list) { + Collections.shuffle(list); + for (MaxInterstitialAd ad : list) { + if (ad.isReady()) { + return ad; + } + } + return null; + } + public static List getAllAd() { + if(adArrayList == null){ + Log.d("-----","--------getAllAd"); + adArrayList = new ArrayList<>(); + MaxInterstitialAd AdT = new MaxInterstitialAd(two_Ad, MyApp.app); + MaxInterstitialAd AdOne = new MaxInterstitialAd(one_AD, MyApp.app); + MaxInterstitialAd AdThree = new MaxInterstitialAd(three_ad, MyApp.app); + AdOne.loadAd(); + AdT.loadAd(); + AdThree.loadAd(); + adArrayList.add(AdOne); + adArrayList.add(AdT); + adArrayList.add(AdThree); + } + for(MaxInterstitialAd ad:adArrayList){ + if(!ad.isReady()){ + Log.d("-----","--------loadAd="+ad.getAdUnitId()); + ad.loadAd(); + } + } + return adArrayList; + } + public static void setMAXCAllBack(MaxInterstitialAd ad, MaxCallBack maxCallBack) { + ad.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + maxCallBack.onAdHidden(); + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + maxCallBack.onShowFail(maxAd); + } + }); + + } + + + +} diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryAbility.kt new file mode 100644 index 0000000..2ee87c5 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryAbility.kt @@ -0,0 +1,216 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.text.TextUtils +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.GridLayoutManager +import com.cute.girl.hd.pink.img.wallpaper.adapter.CategoryDetailAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityCategoryBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryPreviewBean +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategoryDetail +import com.cute.girl.hd.pink.img.wallpaper.entity.IntentConstants +//import com.cute.girl.hd.pink.img.wallpaper.net.base.BaseListener +//import com.cute.girl.hd.pink.img.wallpaper.net.base.ServiceImage +//import com.cute.girl.hd.pink.img.wallpaper.net.response.ResponseCategoryDetail +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.onMain +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.view.CustomItemDecoration +import java.util.concurrent.atomic.AtomicBoolean + +class CategoryAbility : AppCompatActivity() { + private lateinit var binding: AbilityCategoryBinding + private var mList: MutableList = mutableListOf() + private var mAdapter: CategoryDetailAdapter? = null +// private var mService: ServiceImage? = null + private var isLoading = AtomicBoolean(false) + private var mPage = 1 + private lateinit var mCid :CategoryData + private var mCName = "" + + companion object { + fun start(context: Context, categoryData: CategoryData) { + val intent = Intent(context, CategoryAbility::class.java) + intent.putExtra(IntentConstants.KEY_STRING, categoryData) +// intent.putExtra(IntentConstants.KEY_STRING2, cName) + context.startActivity(intent) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityCategoryBinding.inflate(layoutInflater) + setContentView(binding.root) + setupViews() + binding.ivBack.setOnClickListener { + finish() + } + } + + private fun setupViews() { + if (intent.hasExtra(IntentConstants.KEY_STRING)) { + if (intent.getSerializableExtra(IntentConstants.KEY_STRING) != null) { + mCid = intent.getSerializableExtra(IntentConstants.KEY_STRING) as CategoryData + } + } +// if (intent.hasExtra(IntentConstants.KEY_STRING2)) { +// if (intent.getStringExtra(IntentConstants.KEY_STRING2) != null) { +// mCName = intent.getStringExtra(IntentConstants.KEY_STRING2)!! +// } +// } +// if (TextUtils.isEmpty(mCid)) { +// finish() +// return +// } + + binding.tvTitle.text = mCid.title + mAdapter = CategoryDetailAdapter(this, mCid.data) + mAdapter?.setOnItemClickListener(object : + CategoryDetailAdapter.OnItemClickListener { + override fun onItemClick(pos: Data) { + + toPreview(pos) + } + }) + binding.rv.layoutManager = GridLayoutManager(this, 3) + binding.rv.addItemDecoration( + CustomItemDecoration(1, 2) + ) + binding.rv.adapter = mAdapter!! + +// //下拉刷新 +// binding.refreshLayout.setOnRefreshListener { +// if (isLoading.get()) { +// return@setOnRefreshListener +// } +// refresh() +// } +// +// //上拉加载 +// binding.refreshLayout.setOnLoadMoreListener { +// if (isLoading.get()) { +// return@setOnLoadMoreListener +// } +//// loadMore() +// } + + refresh() + } + private fun refresh(){ + + } +// private fun refresh() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// mPage = 1 +// mService?.let { service -> +// val call = service.mApi.getImageByCId(mCid, 1) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseCategoryDetail?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.clear() +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } +// } + + private fun loadMore() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// val newPage = mPage + 1 +// mService?.let { service -> +// val call = service.mApi.getImageByCId(mCid, 1) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseCategoryDetail?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// mPage = newPage +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } + } + + fun updateView() { +// binding.refreshLayout.finishRefresh() +// binding.refreshLayout.finishLoadMore() + if (mList.isNotEmpty()) { + binding.tvEmpty.hide() + } else { + binding.tvEmpty.show() + } + } + + + fun toPreview(pos: Data) { +// if (pos < 0 || pos >= mList.size) { +// return +// } + val listBean = CategoryPreviewBean() + listBean.list = mList + CategoryPreviewAbility.start(this, pos) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPage.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPage.kt new file mode 100644 index 0000000..f6ac69d --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPage.kt @@ -0,0 +1,136 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +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.cute.girl.hd.pink.img.wallpaper.MyApp +import com.cute.girl.hd.pink.img.wallpaper.adapter.CategoryAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.PageRecentBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryData +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategory +//import com.cute.girl.hd.pink.img.wallpaper.net.base.BaseListener +//import com.cute.girl.hd.pink.img.wallpaper.net.base.ServiceImage +//import com.cute.girl.hd.pink.img.wallpaper.net.response.ResponseCategory +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.onMain +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.view.CustomItemDecoration +import java.util.concurrent.atomic.AtomicBoolean + +class CategoryPage : Fragment() { + private lateinit var binding: PageRecentBinding + private var mList: MutableList = mutableListOf() + private var mAdapter: CategoryAdapter? = null +// private var mService: ServiceImage? = null + private var isLoading = AtomicBoolean(false) + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = PageRecentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupViews() + } + + private fun setupViews() { + + val subList = MyApp.myData.subList(3, MyApp.myData.size) + + mAdapter = CategoryAdapter(requireActivity(), subList) + mAdapter?.setOnItemClickListener(object : + CategoryAdapter.OnItemClickListener { + override fun onItemClick(pos: CategoryData) { + toDetail(pos) + } + }) + binding.rv.layoutManager = GridLayoutManager(requireContext(), 2) + binding.rv.addItemDecoration( + CustomItemDecoration(1, 2) + ) + binding.rv.adapter = mAdapter!! + + //下拉刷新 +// binding.refreshLayout.setOnRefreshListener { +// if (isLoading.get()) { +// return@setOnRefreshListener +// } +// refresh() +// } + + refresh() + } + + private fun refresh() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// mService?.let { service -> +// val call = service.mApi.getCategory() +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseCategory?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.clear() +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } + } + + fun updateView() { +// binding.refreshLayout.finishRefresh() +// binding.refreshLayout.finishLoadMore() + if (mList.isNotEmpty()) { + binding.tvEmpty.hide() + } else { + binding.tvEmpty.show() + } + } + + + fun toDetail(pos: CategoryData) { +// if (pos < 0 || pos >= mList.size) { +// return +// } + if (activity != null) { + CategoryAbility.start(requireActivity(), pos) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPreviewAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPreviewAbility.kt new file mode 100644 index 0000000..925d687 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/CategoryPreviewAbility.kt @@ -0,0 +1,346 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.app.WallpaperManager +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.widget.ViewPager2 +import com.cute.girl.hd.pink.img.wallpaper.R +import com.cute.girl.hd.pink.img.wallpaper.adapter.CategoryPagerAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityPreviewBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.CategoryPreviewBean +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GCategoryDetail +import com.cute.girl.hd.pink.img.wallpaper.entity.IntentConstants +import com.cute.girl.hd.pink.img.wallpaper.utils.DownloadUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.getString +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.onMain +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.utils.MediaUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.PermissionUtil +import com.cute.girl.hd.pink.img.wallpaper.view.SetAsDialog +import com.liulishuo.filedownloader.BaseDownloadTask +import com.liulishuo.filedownloader.FileDownloadListener +import com.liulishuo.filedownloader.FileDownloader +import kotlinx.coroutines.launch +import pub.devrel.easypermissions.EasyPermissions +import java.io.File + +class CategoryPreviewAbility : AppCompatActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var binding: AbilityPreviewBinding + private var mList: MutableList = mutableListOf() + private var mCurPos: Int = 0 + private var mImagePagerAdapter: CategoryPagerAdapter? = null + private var mSetAsDialog: SetAsDialog? = null + private var mAction = 0//0设置壁纸 1下载壁纸 + + companion object { + fun start(context: Context,bean: Data) { + val intent = Intent(context, CategoryPreviewAbility::class.java) + intent.putExtra(IntentConstants.KEY_LIST, bean) +// intent.putExtra(IntentConstants.KEY_POS, pos) + context.startActivity(intent) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityPreviewBinding.inflate(layoutInflater) + setContentView(binding.root) + setupViews() + } + + private fun setupViews() { + //隐藏状态栏和底部导航栏 + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN + + initData() + setUpView() + } + + private fun initData() { + var listBean: Data? = null + if (intent.hasExtra(IntentConstants.KEY_LIST)) { + listBean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(IntentConstants.KEY_LIST, Data::class.java) + } else { + intent.getSerializableExtra(IntentConstants.KEY_LIST) as Data? + } + } + if (listBean == null) { + finish() + return + } + mList.clear() + mList.add(listBean) + + if (mList.size == 0) { + finish() + return + } + + mCurPos = intent.getIntExtra(IntentConstants.KEY_POS, 0) + + if (mCurPos < 0 || mCurPos >= mList.size) { + finish() + return + } + } + + private fun setUpView() { + mImagePagerAdapter = CategoryPagerAdapter(this, mList) + mImagePagerAdapter?.setOnItemClickListener(object : + CategoryPagerAdapter.OnItemClickListener { + override fun onItemClick(pos: Int) { + + } + }) + binding.viewPager.adapter = mImagePagerAdapter!! + binding.viewPager.setCurrentItem(mCurPos, false) + binding.viewPager.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + mCurPos = position + } + + }) + + binding.ivBack.setOnClickListener { + onBackPressed() + } + + binding.tvSet.setOnClickListener { + mAction = 0 + if (isExist()) { + set4KWallpaper() + } else { + startDownload() + } + } + + binding.tvDownload.setOnClickListener { + doSave() + } + } + + + override fun onDestroy() { + super.onDestroy() + mSetAsDialog?.dismiss() + } + + private fun isExist(): Boolean { + return DownloadUtil.isExist( + mList[mCurPos].sourceURl, + mList[mCurPos].getTag() + ) + } + + private fun set4KWallpaper() { + val image = mList[mCurPos] + val path = + DownloadUtil.getFilePath( + image.sourceURl, + image.getTag() + ) + val file = File(path) + if (!file.exists()) { + return + } + val wallpaperManager = WallpaperManager.getInstance(this) + if (mSetAsDialog == null) { + mSetAsDialog = SetAsDialog(this) { + onClickHomeScreen = { + lifecycleScope.launch { + wallpaperManager.setStream( + file.inputStream(), + null, + true, + WallpaperManager.FLAG_SYSTEM + ) + onMain { + Toast.makeText( + this@CategoryPreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + + onClickLockScreen = { + lifecycleScope.launch { + wallpaperManager.setStream( + file.inputStream(), + null, + true, + WallpaperManager.FLAG_LOCK + ) + onMain { + Toast.makeText( + this@CategoryPreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + + onClickBoth = { + lifecycleScope.launch { + wallpaperManager.setStream(file.inputStream())//FLAG_SYSTEM | FLAG_LOCK) + onMain { + Toast.makeText( + this@CategoryPreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + } + } + mSetAsDialog?.show() + } + + private fun doSave() { + if (!PermissionUtil.hasStoragePermission(this)) { + PermissionUtil.requestStoragePermission(this) + return + } + clickSave() + } + + private fun clickSave() { + mAction = 1 + if (isExist()) { + saveWallpaper() + } else { + startDownload() + } + } + + private fun startDownload() { + if (isFinishing) { + return + } + binding.flDownload.show() + FileDownloader.getImpl().create(mList[mCurPos].sourceURl) + .setPath(DownloadUtil.getFilePath(mList[mCurPos].sourceURl, mList[mCurPos].getTag())) + .setCallbackProgressTimes(300) + .setMinIntervalUpdateSpeed(400) + .setListener(object : FileDownloadListener() { + override fun pending(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + + } + + override fun progress(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + if (!isFinishing) { + binding.pbb.show() + } + } + + override fun completed(task: BaseDownloadTask?) { + if (!isFinishing) { + binding.flDownload.hide() + mImagePagerAdapter?.notifyItemChanged(mCurPos) + if (mAction == 0) { + set4KWallpaper() + } else { + saveWallpaper() + } + } + } + + override fun paused(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@CategoryPreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + override fun error(task: BaseDownloadTask?, e: Throwable?) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@CategoryPreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + override fun warn(task: BaseDownloadTask?) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@CategoryPreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + }).start() + } + + private fun saveWallpaper() { + val image = mList[mCurPos] + val path = + DownloadUtil.getFilePath( + image.sourceURl, + image.getTag() + ) + val saved = MediaUtil.saveImageToSystemAlbum(path, this@CategoryPreviewAbility) + if (!isFinishing) { + if (saved) { + Toast.makeText( + this@CategoryPreviewAbility, + R.string.saved_to_album, + Toast.LENGTH_SHORT + ).show() + } else { + Toast.makeText( + this@CategoryPreviewAbility, + R.string.save_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + } + + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (requestCode == PermissionUtil.REQUEST_CODE_PERMISSION_STORAGE) { + doSave() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + if (requestCode == PermissionUtil.REQUEST_CODE_PERMISSION_STORAGE) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/FeaturePage.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/FeaturePage.kt new file mode 100644 index 0000000..891b9a7 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/FeaturePage.kt @@ -0,0 +1,102 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +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.cute.girl.hd.pink.img.wallpaper.MyApp +import com.cute.girl.hd.pink.img.wallpaper.adapter.ImageGridAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.PageRecentBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GImage +import com.cute.girl.hd.pink.img.wallpaper.entity.PreviewBean +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.view.CustomItemDecoration +import java.util.concurrent.atomic.AtomicBoolean + +class FeaturePage : Fragment() { + private lateinit var binding: PageRecentBinding + private var mList: MutableList = mutableListOf() + private var mAdapter: ImageGridAdapter? = null +// private var mService: ServiceImage? = null + private var isLoading = AtomicBoolean(false) + private var mPage = 1 + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = PageRecentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupViews() + } + + private fun setupViews() { + + mAdapter = ImageGridAdapter(requireActivity(), MyApp.myData[0].data) + mAdapter?.setOnItemClickListener(object : + ImageGridAdapter.OnItemClickListener { + override fun onItemClick(pos: Data) { + + toPreview(pos) + } + }) + binding.rv.layoutManager = GridLayoutManager(requireActivity(), 3) + binding.rv.addItemDecoration( + CustomItemDecoration(1, 2) + ) + binding.rv.adapter = mAdapter!! + +// //下拉刷新 +// binding.refreshLayout.setOnRefreshListener { +// if (isLoading.get()) { +// return@setOnRefreshListener +// } +// refresh() +// } +// +// //上拉加载 +// binding.refreshLayout.setOnLoadMoreListener { +// if (isLoading.get()) { +// return@setOnLoadMoreListener +// } +// loadMore() +// } + + + } + + + + fun updateView() { +// binding.refreshLayout.finishRefresh() +// binding.refreshLayout.finishLoadMore() + if (mList.isNotEmpty()) { + binding.tvEmpty.hide() + } else { + binding.tvEmpty.show() + } + } + + + fun toPreview(pos: Data) { +// if (pos < 0 || pos >= mList.size) { +// return +// } + if (activity != null) { + val listBean = PreviewBean() + listBean.list = mList + PreviewAbility.start(requireActivity(), pos) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/MainAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/MainAbility.kt new file mode 100644 index 0000000..afdcf4e --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/MainAbility.kt @@ -0,0 +1,111 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.GravityCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import com.cute.girl.hd.pink.img.wallpaper.R +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityMainBinding + +class MainAbility : AppCompatActivity() { + private lateinit var binding: AbilityMainBinding + private var mFragments: ArrayList = ArrayList() + private val mTitles: MutableList = mutableListOf() + private var mAdapter: MyPagerAdapter? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + setupViews() + } + + private fun setupViews() { + binding.tvVersion.text = "v${getAppVersionName()}" + mTitles.add("Recent") + mTitles.add("Popular") + mTitles.add("Feature") + mTitles.add("Category") + mFragments.add(RecentPage()) + mFragments.add(PopularPage()) + mFragments.add(FeaturePage()) + mFragments.add(CategoryPage()) + + mAdapter = MyPagerAdapter(supportFragmentManager) + binding.viewPager.adapter = mAdapter!! + + mAdapter?.notifyDataSetChanged()//必须在viewpager初始化之前先更新mAdapter,否则会报错 + binding.stlTab.setViewPager(binding.viewPager, mTitles.toTypedArray(), this, mFragments) + binding.viewPager.currentItem = 0 + binding.viewPager.offscreenPageLimit = 4 + + binding.ivMenu.setOnClickListener { + binding.drawer.openDrawer(GravityCompat.START) + } + + binding.rlShare.setOnClickListener { + try { + val intentShare = Intent() + intentShare.action = Intent.ACTION_SEND + intentShare.type = "text/plain" + intentShare.putExtra( + Intent.EXTRA_TEXT, + getString( + R.string.share_text, + "http://play.google.com/store/apps/details?id=${this.packageName}" + ) + ) + startActivity(intentShare) + } catch (ignore: Exception) { + } + } + + binding.rlRate.setOnClickListener { + try { + val intent = Intent( + Intent.ACTION_VIEW, + Uri.parse("http://play.google.com/store/apps/details?id=${this.packageName}") + ) + startActivity(intent) + } catch (e: Exception) { + e.printStackTrace() + } + } + + binding.rlPrivacy.setOnClickListener { + PrivacyAbility.start(this) + } + } + + private fun getAppVersionName(): String { + return try { + val pm: PackageManager = this.packageManager + val pi = pm.getPackageInfo(this.packageName, 0) + if (pi == null) "" else pi.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + "" + } + } + + inner class MyPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { + override fun getCount(): Int { + return mFragments.size + } + + override fun getPageTitle(position: Int): CharSequence { + return mTitles[position] + } + + override fun getItem(position: Int): Fragment { + return mFragments.get(position) + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PopularPage.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PopularPage.kt new file mode 100644 index 0000000..d0ff30b --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PopularPage.kt @@ -0,0 +1,188 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +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.cute.girl.hd.pink.img.wallpaper.MyApp +import com.cute.girl.hd.pink.img.wallpaper.adapter.ImageGridAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.PageRecentBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.view.CustomItemDecoration +import java.util.concurrent.atomic.AtomicBoolean + +class PopularPage : Fragment() { + private lateinit var binding: PageRecentBinding + private lateinit var mList: List + private var mAdapter: ImageGridAdapter? = null +// private var mService: ServiceImage? = null + private var isLoading = AtomicBoolean(false) + private var mPage = 1 + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = PageRecentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mList = MyApp.myData[2].data + setupViews() + } + + + private fun setupViews() { + mAdapter = ImageGridAdapter(requireActivity(), mList) + mAdapter?.setOnItemClickListener(object : + ImageGridAdapter.OnItemClickListener { + override fun onItemClick(pos: Data) { + + toPreview(pos) + } + }) + binding.rv.layoutManager = GridLayoutManager(requireActivity(), 3) + binding.rv.addItemDecoration( + CustomItemDecoration(1, 2) + ) + binding.rv.adapter = mAdapter!! + +// //下拉刷新 +// binding.refreshLayout.setOnRefreshListener { +// if (isLoading.get()) { +// return@setOnRefreshListener +// } +// refresh() +// } +// +// //上拉加载 +// binding.refreshLayout.setOnLoadMoreListener { +// if (isLoading.get()) { +// return@setOnLoadMoreListener +// } +// loadMore() +// } + + refresh() + } + + private fun refresh() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// mPage = 1 +// mService?.let { service -> +// val call = service.mApi.getPopular(1) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseImage?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.clear() +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } + } + + private fun loadMore() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// val newPage = mPage + 1 +// mService?.let { service -> +// val call = service.mApi.getPopular(newPage) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseImage?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// mPage = newPage +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } + } + + fun updateView() { +// binding.refreshLayout.finishRefresh() +// binding.refreshLayout.finishLoadMore() + if (mList.isNotEmpty()) { + binding.tvEmpty.hide() + } else { + binding.tvEmpty.show() + } + } + + + fun toPreview(pos: Data) { +// if (pos < 0 || pos >= mList.size) { +// return +// } + if (activity != null) { +// val listBean = PreviewBean() +// listBean.list = mList + PreviewAbility.start(requireActivity(), pos) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PreviewAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PreviewAbility.kt new file mode 100644 index 0000000..747cc19 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PreviewAbility.kt @@ -0,0 +1,404 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.app.WallpaperManager +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.util.Log +import android.view.View +import android.view.WindowManager +import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.widget.ViewPager2 +import com.applovin.mediation.MaxAd +import com.applovin.mediation.ads.MaxInterstitialAd +import com.cute.girl.hd.pink.img.wallpaper.R +import com.cute.girl.hd.pink.img.wallpaper.adapter.ImagePagerAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityPreviewBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.entity.GImage +import com.cute.girl.hd.pink.img.wallpaper.entity.IntentConstants +import com.cute.girl.hd.pink.img.wallpaper.utils.DownloadUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.getString +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.onMain +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.utils.MediaUtil +import com.cute.girl.hd.pink.img.wallpaper.utils.PermissionUtil +import com.cute.girl.hd.pink.img.wallpaper.view.SetAsDialog +import com.cute.girl.hd.pink.img.wallpaper.entity.PreviewBean +import com.cute.girl.hd.pink.img.wallpaper.mymax.MaxCallBack +import com.cute.girl.hd.pink.img.wallpaper.mymax.MaxUtils +import com.liulishuo.filedownloader.BaseDownloadTask +import com.liulishuo.filedownloader.FileDownloadListener +import com.liulishuo.filedownloader.FileDownloader +import kotlinx.coroutines.launch +import pub.devrel.easypermissions.EasyPermissions +import java.io.File + +class PreviewAbility : AppCompatActivity(), EasyPermissions.PermissionCallbacks { + private lateinit var binding: AbilityPreviewBinding + private var mList: MutableList = mutableListOf() + private var mCurPos: Int = 0 + private var mImagePagerAdapter: ImagePagerAdapter? = null + private var mSetAsDialog: SetAsDialog? = null + private var mAction = 0//0设置壁纸 1下载壁纸 + + private lateinit var adList: List + + companion object { + fun start(context: Context, bean: Data) { + val intent = Intent(context, PreviewAbility::class.java) + intent.putExtra(IntentConstants.KEY_LIST, bean) +// intent.putExtra(IntentConstants.KEY_POS, pos) + context.startActivity(intent) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityPreviewBinding.inflate(layoutInflater) + setContentView(binding.root) + adList = MaxUtils.getAllAd() + setupViews() + } + + private fun showMyMAx(action: () -> Unit) { + val onCache = MaxUtils.onCache(adList) + if (onCache != null) { + MaxUtils.setMAXCAllBack(onCache, object : MaxCallBack { + override fun onShowFail(ad: MaxAd?) { + action.invoke() + } + + override fun onAdHidden() { + action.invoke() + adList = MaxUtils.getAllAd() + } + + }) + onCache.showAd(this) + } else { + action.invoke() + } + } + + private fun setupViews() { + //隐藏状态栏和底部导航栏 + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN + + initData() + setUpView() + } + + private fun initData() { + var listBean: Data? = null + if (intent.hasExtra(IntentConstants.KEY_LIST)) { + listBean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(IntentConstants.KEY_LIST, Data::class.java) + } else { + intent.getSerializableExtra(IntentConstants.KEY_LIST) as Data? + } + } + if (listBean == null) { + finish() + return + } + mList.clear() + mList.add(listBean) + + if (mList.size == 0) { + finish() + return + } + + mCurPos = intent.getIntExtra(IntentConstants.KEY_POS, 0) + + if (mCurPos < 0 || mCurPos >= mList.size) { + finish() + return + } + } + + private fun setUpView() { + mImagePagerAdapter = ImagePagerAdapter(this, mList) + mImagePagerAdapter?.setOnItemClickListener(object : + ImagePagerAdapter.OnItemClickListener { + override fun onItemClick(pos: Int) { + + } + }) + binding.viewPager.adapter = mImagePagerAdapter!! + binding.viewPager.setCurrentItem(mCurPos, false) + binding.viewPager.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + mCurPos = position + } + + }) + + binding.ivBack.setOnClickListener { + finish() + } + + binding.tvSet.setOnClickListener { + mAction = 0 + if (isExist()) { + set4KWallpaper() + } else { + startDownload() + } + } + + binding.tvDownload.setOnClickListener { + showMyMAx { + doSave() + } + + } + } + + + override fun onDestroy() { + super.onDestroy() + mSetAsDialog?.dismiss() + } + + private fun isExist(): Boolean { + return DownloadUtil.isExist( + mList[mCurPos].sourceURl, + mList[mCurPos].getTag() + ) + } + + + private fun set4KWallpaper() { + val image = mList[mCurPos] + val path = + DownloadUtil.getFilePath( + image.sourceURl, + image.getTag() + ) + val file = File(path) + if (!file.exists()) { + return + } + val wallpaperManager = WallpaperManager.getInstance(this) + if (mSetAsDialog == null) { + mSetAsDialog = SetAsDialog(this) { + onClickHomeScreen = { + + showMyMAx { + lifecycleScope.launch { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + wallpaperManager.setStream(file.inputStream()) + } else { + wallpaperManager.setStream( + file.inputStream(), + null, + true, + WallpaperManager.FLAG_SYSTEM + ) + } + onMain { + Toast.makeText( + this@PreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + + } + + onClickLockScreen = { + + showMyMAx { + lifecycleScope.launch { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + wallpaperManager.setStream(file.inputStream()) + } else { + wallpaperManager.setStream( + file.inputStream(), + null, + true, + WallpaperManager.FLAG_LOCK + ) + } + onMain { + Toast.makeText( + this@PreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + + } + + onClickBoth = { + showMyMAx { + lifecycleScope.launch { + wallpaperManager.setStream(file.inputStream())//FLAG_SYSTEM | FLAG_LOCK) + onMain { + Toast.makeText( + this@PreviewAbility, + R.string.set_success.getString(), + Toast.LENGTH_SHORT + ).show() + } + } + } + + } + } + } + mSetAsDialog?.show() + } + + private fun doSave() { + if (!PermissionUtil.hasStoragePermission(this)) { + PermissionUtil.requestStoragePermission(this) + return + } + clickSave() + } + + private fun clickSave() { + mAction = 1 + if (isExist()) { + saveWallpaper() + } else { + startDownload() + } + } + + private fun startDownload() { + if (isFinishing) { + return + } + val filePath = DownloadUtil.getFilePath(mList[mCurPos].sourceURl, mList[mCurPos].getTag()) + Log.d( + "-----------", + "---------startDownload-${mList[mCurPos].sourceURl} filePath=${filePath}" + ) + binding.flDownload.show() + FileDownloader.getImpl().create(mList[mCurPos].sourceURl) + .setPath(filePath) + .setCallbackProgressTimes(300) + .setMinIntervalUpdateSpeed(400) + .setListener(object : FileDownloadListener() { + override fun pending(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + + } + + override fun progress(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + if (!isFinishing) { + binding.pbb.show() + } + } + + override fun completed(task: BaseDownloadTask?) { + Log.d("-----------", "---------completed") + if (!isFinishing) { + binding.flDownload.hide() + mImagePagerAdapter?.notifyItemChanged(mCurPos) + if (mAction == 0) { + set4KWallpaper() + } else { + saveWallpaper() + } + } + } + + override fun paused(task: BaseDownloadTask?, soFarBytes: Int, totalBytes: Int) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@PreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + override fun error(task: BaseDownloadTask?, e: Throwable?) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@PreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + override fun warn(task: BaseDownloadTask?) { + if (!isFinishing) { + binding.flDownload.hide() + Toast.makeText( + this@PreviewAbility, + R.string.download_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + }).start() + } + + private fun saveWallpaper() { + val image = mList[mCurPos] + val path = + DownloadUtil.getFilePath( + image.sourceURl, + image.getTag() + ) + val saved = MediaUtil.saveImageToSystemAlbum(path, this@PreviewAbility) + if (!isFinishing) { + if (saved) { + Toast.makeText( + this@PreviewAbility, + R.string.saved_to_album, + Toast.LENGTH_SHORT + ).show() + } else { + Toast.makeText( + this@PreviewAbility, + R.string.save_failed, + Toast.LENGTH_SHORT + ).show() + } + } + + } + + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (requestCode == PermissionUtil.REQUEST_CODE_PERMISSION_STORAGE) { + doSave() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + if (requestCode == PermissionUtil.REQUEST_CODE_PERMISSION_STORAGE) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PrivacyAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PrivacyAbility.kt new file mode 100644 index 0000000..ab0a8fa --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/PrivacyAbility.kt @@ -0,0 +1,68 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.appcompat.app.AppCompatActivity +import com.cute.girl.hd.pink.img.wallpaper.R +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityPrivacyBinding +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.getString + +class PrivacyAbility : AppCompatActivity() { + private lateinit var binding: AbilityPrivacyBinding + + companion object { + const val URL_PRIVACY: String = "https://artwallpaper.bitbucket.io/privacy.html" + + fun start(context: Context) { + context.startActivity(Intent(context, PrivacyAbility::class.java)) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityPrivacyBinding.inflate(layoutInflater) + setContentView(binding.root) + setupViews() + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setupViews() { + binding.tvTitle.text = R.string.privacy_policy.getString() + + val webSettings: WebSettings = binding.webView.settings + webSettings.javaScriptEnabled = true // enable javascript + webSettings.javaScriptCanOpenWindowsAutomatically = true + binding.webView.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + if (url.startsWith("http:") || url.startsWith("https:")) { + return false + } + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(intent) + return true + } + + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { + } + } + + binding.webView.loadUrl(URL_PRIVACY) + binding.ivBack.visibility = View.VISIBLE + + binding.ivBack.setOnClickListener { + onBackPressed() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/RecentPage.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/RecentPage.kt new file mode 100644 index 0000000..bd89685 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/RecentPage.kt @@ -0,0 +1,193 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +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.cute.girl.hd.pink.img.wallpaper.MyApp +import com.cute.girl.hd.pink.img.wallpaper.adapter.ImageGridAdapter +import com.cute.girl.hd.pink.img.wallpaper.databinding.PageRecentBinding +import com.cute.girl.hd.pink.img.wallpaper.entity.Data +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.hide +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.show +import com.cute.girl.hd.pink.img.wallpaper.view.CustomItemDecoration +import java.util.concurrent.atomic.AtomicBoolean + +class RecentPage : Fragment() { + private lateinit var binding: PageRecentBinding + private lateinit var mList: List + private var mAdapter: ImageGridAdapter? = null +// private var mService: ServiceImage? = null + private var isLoading = AtomicBoolean(false) + private var mPage = 1 + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = PageRecentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mList = MyApp.myData[1].data + setupViews() + } + + private fun setupViews() { + mAdapter = ImageGridAdapter(requireActivity(), mList) + mAdapter?.setOnItemClickListener(object : + ImageGridAdapter.OnItemClickListener { + override fun onItemClick(pos: Data) { + + toPreview(pos) + } + }) + binding.rv.layoutManager = GridLayoutManager(requireActivity(), 3) + binding.rv.addItemDecoration( + CustomItemDecoration(1, 2) + ) + binding.rv.adapter = mAdapter!! + +// //下拉刷新 +// binding.refreshLayout.setOnRefreshListener { +// if (isLoading.get()) { +// return@setOnRefreshListener +// } +// refresh() +// } +// +// //上拉加载 +// binding.refreshLayout.setOnLoadMoreListener { +// if (isLoading.get()) { +// return@setOnLoadMoreListener +// } +// loadMore() +// } + +// refresh() + } + private fun refresh(){ + val shuffled = mList.shuffled() + mAdapter?.refresh(shuffled) + + } +// private fun refresh() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// mPage = 1 +// mService?.let { service -> +// val call = service.mApi.getRecent(1) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseImage?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.clear() +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } +// } + + private fun loadMore(){ + + } + +// private fun loadMore() { +// if (mService == null) { +// mService = ServiceImage() +// } +// if (isLoading.get()) { +// return +// } +// isLoading.set(true) +// val newPage = mPage + 1 +// mService?.let { service -> +// val call = service.mApi.getRecent(newPage) +// service.callEnqueue(call, object : BaseListener { +// override fun onResponse(t: ResponseImage?) { +// if (t != null) { +// if (t.MaterialWallpaper != null && t.MaterialWallpaper.isNotEmpty()) { +// mList.addAll(t.MaterialWallpaper.toMutableList()) +// isLoading.set(false) +// mPage = newPage +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } else { +// onMain { +// updateView() +// } +// } +// } else { +// onMain { +// updateView() +// } +// } +// } +// +// override fun onFail(e: String?) { +// isLoading.set(false) +// onMain { +// mAdapter?.notifyDataSetChanged() +// updateView() +// } +// } +// }) +// } +// } + + fun updateView() { +// binding.refreshLayout.finishRefresh() +// binding.refreshLayout.finishLoadMore() + if (mList.isNotEmpty()) { + binding.tvEmpty.hide() + } else { + binding.tvEmpty.show() + } + } + + + fun toPreview(data: Data) { + if (activity != null) { +// val listBean = PreviewBean() +// listBean.list = mList + PreviewAbility.start(requireActivity(), data) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/StartAbility.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/StartAbility.kt new file mode 100644 index 0000000..8b5a79e --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/page/StartAbility.kt @@ -0,0 +1,94 @@ +package com.cute.girl.hd.pink.img.wallpaper.page + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.os.CountDownTimer +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.applovin.mediation.MaxAd +import com.applovin.mediation.ads.MaxInterstitialAd +import com.cute.girl.hd.pink.img.wallpaper.MyApp +import com.cute.girl.hd.pink.img.wallpaper.databinding.AbilityStartBinding +import com.cute.girl.hd.pink.img.wallpaper.mymax.MaxCallBack +import com.cute.girl.hd.pink.img.wallpaper.mymax.MaxUtils + +class StartAbility : AppCompatActivity() { + private lateinit var binding: AbilityStartBinding + + private var time =10000L + private var needShow = true + + private lateinit var countDownTimer: CountDownTimer + private lateinit var lists:List + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = AbilityStartBinding.inflate(layoutInflater) + setContentView(binding.root) + + countDownTimer = object : CountDownTimer(time,100){ + override fun onTick(millisUntilFinished: Long) { + if (needShow) { + ShowAd {} + } + } + + override fun onFinish() { + if (needShow) { + ShowAd { + setupViews() + } + } + } + + } + startAd() + } + private fun startAd() { + if (!MyApp.initSDK) { + LocalBroadcastManager.getInstance(this).registerReceiver(object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + loadAdGo() + Log.d("------------","------------1sucess") + } + }, IntentFilter(MyApp.AD_INIT_ACTION)) + } else { + loadAdGo() + Log.d("------------","------------2sucess") + } + } + + private fun loadAdGo() { + lists = MaxUtils.getAllAd() + countDownTimer.start() + } + + private fun setupViews() { + startActivity(Intent(this@StartAbility, MainAbility::class.java)) + finish() + } + + private fun ShowAd(action: () -> Unit) { + val checkCacheAd = MaxUtils.onCache(lists) + if (checkCacheAd == null) { + action.invoke() + } else { + needShow = false + MaxUtils.setMAXCAllBack(checkCacheAd, object : MaxCallBack { + override fun onShowFail(ad: MaxAd?) { + setupViews() + } + + override fun onAdHidden() { + setupViews() + } + }) + checkCacheAd.showAd() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DeviceUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DeviceUtil.kt new file mode 100644 index 0000000..e3f9867 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DeviceUtil.kt @@ -0,0 +1,28 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.content.Context +import com.cute.girl.hd.pink.img.wallpaper.MyApp + + +object DeviceUtil { + + fun dp2Px(dp: Int): Int { + val scale: Float = MyApp.app.resources.displayMetrics.density + return (dp * scale + 0.5f).toInt() + } + + fun dp2Px(dp: Float): Float { + val scale: Float = MyApp.app.resources.displayMetrics.density + return dp * scale + 0.5f + } + + + fun getScreenHeight(context: Context): Int { + return context.resources.displayMetrics.heightPixels + } + + + fun getScreenWidth(context: Context): Int { + return context.resources.displayMetrics.widthPixels + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DownloadUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DownloadUtil.kt new file mode 100644 index 0000000..1509844 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/DownloadUtil.kt @@ -0,0 +1,49 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.net.Uri +import android.text.TextUtils +import android.util.Log +import java.io.File + +object DownloadUtil { + + + /** + * https://3dparallax.online/3DParallax/assets/4D/186/img.jpg + * 获取下载文件的名称 + 后缀名 + * tag是用来区分当文件名称一样的情况 + */ + fun getFileName(url: String, tag: String?): String { + return if (TextUtils.isEmpty(tag)) { + url.substring(url.lastIndexOf("/") + 1) + } else { + tag + url.substring(url.lastIndexOf("/") + 1) + } + } + + /** + * 获取文件下载路径 + * path:/storage/emulated/0/Android/data/com.lux.sound.pranks.hilarious.effects/X4D/download/hairclipper_4.jpg + */ + fun getFilePath(url: String, tag: String?): String { + + val s = FileUtil.getDownloadDirectory() + File.separator + tag + Log.d("--------","----getFilePath--$s") + return s + } + + fun getFile(url: String, tag: String?): File { + return File(getFilePath(url, tag)) + } + + fun getFileUri(url: String, tag: String?): Uri { + return Uri.fromFile(File(getFilePath(url, tag))) + } + + /** + * @param url 文件网络地址http://dadaad.png + */ + fun isExist(url: String, tag: String?): Boolean { + return File(getFilePath(url, tag)).exists() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/FileUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/FileUtil.kt new file mode 100644 index 0000000..3885a82 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/FileUtil.kt @@ -0,0 +1,219 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.content.ContentResolver +import android.content.ContentUris +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import com.cute.girl.hd.pink.img.wallpaper.MyApp +import java.io.File +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream + + +object FileUtil { + private const val DIR_FILE_NAME = "PrankSound" + private const val DIR_DOWNLOAD = "download" + private const val DIR_CREATE = "create" + + /** + * 文件下载路径 + */ + private fun getDefaultDirectory(): String { + var dirName = "" + if (MyApp.app.getExternalFilesDir(DIR_FILE_NAME) != null) {//外部存储可用 + if (Build.VERSION.SDK_INT >= 29) { + dirName = MyApp.app.getExternalFilesDir(DIR_FILE_NAME)!!.path + } else if (Build.VERSION.SDK_INT < 29) { + dirName = MyApp.app.getExternalFilesDir(DIR_FILE_NAME)!!.absolutePath + } + } else {//外部存储不可用 + dirName = MyApp.app.filesDir.absolutePath + } + return dirName + } + + /** + * /storage/emulated/0/Android/data/com.prank.sounds.funny.toy.fart.haircut/cache/download + */ + fun getDownloadDirectory(): String { + return getDefaultDirectory() + File.separator + DIR_DOWNLOAD + } + + /** + * /storage/emulated/0/Android/data/com.prank.sounds.funny.toy.fart.haircut/cache/tape + */ + fun getCreateDirectory(): String { + return getDefaultDirectory() + File.separator + DIR_CREATE + } + + /** + * @param path 文件绝对路径 + */ + fun isExists(path: String): Boolean { + return File(path).exists() + } + + /** + * 获取下载文件的名称 + 后缀名 + */ + fun getFileNameAndSuffix(path: String): String { + return path.substring(path.lastIndexOf("/") + 1) + } + + fun getFileName(path: String): String? { + val start = path.lastIndexOf("/") + val end = path.lastIndexOf(".") + return if (start != -1 && end != -1) { + path.substring(start + 1, end) + } else { + null + } + } + + /** + * 1.URI 为 content://com.android.providers.media.documents/document/image%3A235700 + * 因为在 Android 4.4 及以上的机型,使用了 DocumentUri 来代表获取到文件的 URI + * 要对于 DocumentUri 进行适配 + * 2.URI 为 content://media/extenral/images/media/17766 而我们需要得到对应的文件路径。 + * 参考:https://blog.csdn.net/rjc_lihui/article/details/127020909 + */ + fun getFilePathByUri(context: Context, uri: Uri): String? { + var path: String? = null + // 以 file:// 开头的 + if (ContentResolver.SCHEME_FILE == uri.scheme) { + path = uri.path + return path + } + // 以 content:// 开头的,比如 content://media/extenral/images/media/17766 + if (ContentResolver.SCHEME_CONTENT == uri.scheme && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + val cursor = context.contentResolver.query( + uri, + arrayOf(MediaStore.Images.Media.DATA), + null, + null, + null + ) + if (cursor != null) { + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + if (columnIndex > -1) { + path = cursor.getString(columnIndex) + } + } + cursor.close() + } + return path + } + // 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700 + if (ContentResolver.SCHEME_CONTENT == uri.scheme && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (DocumentsContract.isDocumentUri(context, uri)) { + if (isExternalStorageDocument(uri)) { + // ExternalStorageProvider + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() } + .toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + path = Environment.getExternalStorageDirectory().toString() + "/" + split[1] + return path + } + } else if (isDownloadsDocument(uri)) { + // DownloadsProvider + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + ) + path = getDataColumn(context, contentUri, null, null) + return path + } else if (isMediaDocument(uri)) { + // MediaProvider + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() } + .toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = arrayOf(split[1]) + path = getDataColumn(context, contentUri, selection, selectionArgs) + return path + } + } + } + return null + } + + private fun getDataColumn( + context: Context, + uri: Uri?, + selection: String?, + selectionArgs: Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = + context.contentResolver.query(uri!!, projection, selection, selectionArgs, null) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + fun getFileName(contentResolver: ContentResolver, uri: Uri): String? { + val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME) + contentResolver.query(uri, projection, null, null, null)?.use { + if (it.moveToFirst()) { + return it.getString(0) + + } + } + return null + } + + fun getFileInputStream(fileUri: Uri): InputStream? = + try { + MyApp.app.contentResolver.openInputStream(fileUri) + } catch (e: IOException) { + e.printStackTrace() + null + } + + fun getFileOutStream(fileName: String): OutputStream? = + try { + MyApp.app.openFileOutput(fileName, Context.MODE_PRIVATE) + } catch (e: IOException) { + e.printStackTrace() + null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/GlobalExt.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/GlobalExt.kt new file mode 100644 index 0000000..856f189 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/GlobalExt.kt @@ -0,0 +1,27 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.graphics.drawable.Drawable +import android.os.Handler +import android.os.Looper +import android.view.View + +object GlobalExt { + fun onMain(operation: () -> Unit) = Handler(Looper.getMainLooper()).post(operation) + + fun Int.getString(): String = ResourceUtil.getString(this) + fun Int.getColor(): Int = ResourceUtil.getColor(this) + fun Int.getDrawable(): Drawable? = ResourceUtil.getDrawable(this) + + fun Int.dp2PxInt(): Int = ResourceUtil.dp2Px(this) + fun Int.dp2PxFloat(): Float = ResourceUtil.dp2Px(this).toFloat() + + fun View.show() { + this.visibility = View.VISIBLE + } + fun View.hide() { + this.visibility = View.GONE + } + fun View.invisible() { + this.visibility = View.INVISIBLE + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/MediaUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/MediaUtil.kt new file mode 100644 index 0000000..d429974 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/MediaUtil.kt @@ -0,0 +1,205 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.content.ContentValues +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import java.io.File +import java.io.FileInputStream +import java.io.InputStream +import java.io.OutputStream + + +/** + * 从 Android 10 开始向共享存储中添加文件不需要任何权限。 + * Android 10+ 在没有"android.permission.MANAGE_EXTERNAL_STORAGE"权限的情况下只能使用 MediaStore API方式来存储图片和文件 + * 如果你的 App 只在共享存储中添加文件,你可以停止在 Android 10+ 上申请任何权限。 + * 在 Android 13 上废弃了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限 + */ +object MediaUtil { + + private fun getSavePath(): String { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + // android 10 以下版本 + "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath}${File.separator}PinkWallpaper" + } else { + "${Environment.DIRECTORY_PICTURES}${File.separator}PinkWallpaper" + } + } + + fun saveImageToSystemAlbum(imagePath: String, context: Context): Boolean { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + saveImage(imagePath, context) + } else { + saveImageQ(imagePath, context) + } + } + + fun saveVideoToSystemAlbum(imagePath: String, context: Context): Boolean { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + saveVideo(imagePath, context) + } else { + saveVideoQ(imagePath, context) + } + } + + /** + * 将图片保存到系统图库 + * + * @param imagePath + * @param context + */ + private fun saveImageQ(imagePath: String, context: Context): Boolean { + return try { + val contentResolver = context.contentResolver + val contentValues = + getImageContentValues(File(imagePath)) + val localUri = contentResolver.insert( + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + contentValues + ) + // 拷贝到指定uri,如果没有这步操作,android11不会在相册显示 + val out = context.contentResolver.openOutputStream(localUri!!) + copyFile(imagePath, out) + + contentValues.clear(); + contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0); + contentValues.putNull(MediaStore.MediaColumns.DATE_EXPIRES); + contentResolver.update(localUri, contentValues, null, null); + true + } catch (e: Exception) { + e.printStackTrace() + false + } + } + + private fun saveImage(imagePath: String, context: Context): Boolean { + return try { + val path = getSavePath() + File.separator + File(imagePath).name + val newFile = File(path) + if (!newFile!!.parentFile.exists()) { + newFile!!.parentFile.mkdirs() + } + val out = newFile.outputStream() + copyFile(imagePath, out) + + val uri = Uri.fromFile(newFile) + context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)) + out.close() + true + } catch (e: Exception) { + e.printStackTrace() + false + } + } + + + private fun getImageContentValues(paramFile: File): ContentValues { + val time = System.currentTimeMillis() + val localContentValues = ContentValues() + localContentValues.put(MediaStore.Images.Media.TITLE, paramFile.name) + localContentValues.put(MediaStore.Images.Media.DISPLAY_NAME, paramFile.name) + localContentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") + localContentValues.put(MediaStore.Images.Media.RELATIVE_PATH, getSavePath()) +// localContentValues.put(MediaStore.Images.Media.DATE_MODIFIED, time / 1000) +// localContentValues.put(MediaStore.Images.Media.DATE_ADDED, time / 1000) + return localContentValues + } + + + /** + * 将视频保存到系统图库 + * + * @param videoPath + * @param context + */ + private fun saveVideoQ(videoPath: String, context: Context): Boolean { + return try { + val contentResolver = context.contentResolver + val contentValues = + getVideoContentValues(File(videoPath)) + val localUri = contentResolver.insert( + MediaStore.Video.Media.EXTERNAL_CONTENT_URI, + contentValues + ) + // 拷贝到指定uri,如果没有这步操作,android11不会在相册显示 + val out = context.contentResolver.openOutputStream(localUri!!) + copyFile(videoPath, out) + context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri)) + //将该文件扫描到相册 + //MediaScannerConnection.scanFile(context, new String[] { videoFile }, null, null); + true + } catch (e: java.lang.Exception) { + e.printStackTrace() + false + } + } + + private fun saveVideo(videoPath: String, context: Context): Boolean { + return try { + val path = getSavePath() + File.separator + File(videoPath).name + val newFile = File(path) + if (!newFile!!.parentFile.exists()) { + newFile!!.parentFile.mkdirs() + } + val out = newFile.outputStream() + copyFile(videoPath, out) + + val uri = Uri.fromFile(newFile) + context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)) + out.close() + true + } catch (e: java.lang.Exception) { + e.printStackTrace() + false + } + } + + + private fun getVideoContentValues(paramFile: File): ContentValues { + val time = System.currentTimeMillis() + val localContentValues = ContentValues() + localContentValues.put(MediaStore.Images.Media.TITLE, paramFile.name) + localContentValues.put(MediaStore.Images.Media.DISPLAY_NAME, paramFile.name) + localContentValues.put(MediaStore.Images.Media.MIME_TYPE, "video/mp4") + localContentValues.put(MediaStore.Images.Media.RELATIVE_PATH, getSavePath()) +// localContentValues.put(MediaStore.Images.Media.DATE_MODIFIED, time / 1000) +// localContentValues.put(MediaStore.Images.Media.DATE_ADDED, time / 1000) + return localContentValues + } + + /** + * 拷贝文件 + * @param oldPath + * @param out + * @return + */ + private fun copyFile(oldPath: String, out: OutputStream?): Boolean { + try { + var bytesum = 0 + var byteread = 0 + val oldFile = File(oldPath) + if (oldFile.exists()) { + // 读入原文件 + val inStream: InputStream = FileInputStream(oldPath) + val buffer = ByteArray(1444) + while (inStream.read(buffer).also { byteread = it } != -1) { + bytesum += byteread //字节数 文件大小 + println(bytesum) + out!!.write(buffer, 0, byteread) + } + inStream.close() + out!!.close() + return true + } else { + } + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return false + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/PermissionUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/PermissionUtil.kt new file mode 100644 index 0000000..c44cc41 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/PermissionUtil.kt @@ -0,0 +1,104 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.Manifest +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.os.PowerManager +import android.provider.Settings +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationManagerCompat +import pub.devrel.easypermissions.EasyPermissions + + +object PermissionUtil { + const val REQUEST_CODE_PERMISSION_STORAGE = 12 + const val REQUEST_CODE_PERMISSION_NOTIFICATION = 14 + + fun hasStoragePermission(context: Context): Boolean { + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + val perms = arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + EasyPermissions.hasPermissions(context, *perms) + } else { + true + } + } + + /** + * 30以上区分权限 + * @param ctx + */ + fun requestStoragePermission(ctx: Activity) { + val perms = arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + EasyPermissions.requestPermissions( + ctx, + "PinkWallpaper need permission", + REQUEST_CODE_PERMISSION_STORAGE, + *perms + ) + } + + /** + * android 30 以上管理全文件权限 + * 是否有权限 + * @param ctx + * @return + */ + @RequiresApi(api = Build.VERSION_CODES.R) + private fun hasFileMangePermission(ctx: Context): Boolean { + return Environment.isExternalStorageManager() + } + + fun hasAlertWindowPermission(context: Context): Boolean { + return Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || Settings.canDrawOverlays(context) + } + + fun requestAlertWindowPermission(context: Context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && !Settings.canDrawOverlays(context)) { + val intent = Intent( + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + context.packageName) + ) + context.startActivity(intent) + } + } + + fun hasIgnoringBatteryOptimizations(context: Context): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + var isIgnoring = false + val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager? + if (powerManager != null) { + isIgnoring = powerManager.isIgnoringBatteryOptimizations(context.packageName) + } + isIgnoring + } else { + true + } + } + + fun requestIgnoreBatteryOptimizations(context: Context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + intent.setData(Uri.parse("package:" + context.packageName)) + context.startActivity(intent) + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/ResourceUtil.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/ResourceUtil.kt new file mode 100644 index 0000000..c4c89c4 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/ResourceUtil.kt @@ -0,0 +1,50 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils + +import android.graphics.drawable.Drawable +import androidx.appcompat.content.res.AppCompatResources +import com.cute.girl.hd.pink.img.wallpaper.MyApp + +object ResourceUtil { + fun getString(resId: Int): String { + return MyApp.app.getString(resId) + } + + fun getString(resId: Int, vararg args: Any?): String { + return String.format(MyApp.app.getString(resId), args) + } + + fun getString(str: String, vararg args: Any?): String { + return String.format(str, args) + } + + fun getColor(colorId: Int): Int { + return MyApp.app.resources.getColor(colorId) + } + + fun getDrawable(drawableId: Int): Drawable? { + var drawable: Drawable? = null + try { + drawable = AppCompatResources.getDrawable(MyApp.app, drawableId) + } catch (e: Exception) { + } + return drawable + } + + fun getStringArray(arrayId: Int): Array { + return MyApp.app.resources.getStringArray(arrayId) + } + + fun dp2Px(dp: Int): Int { + val scale: Float = MyApp.app.resources.displayMetrics.density + return (dp * scale + 0.5f).toInt() + } + + fun dp2Px(dp: Float): Float { + val scale: Float = MyApp.app.resources.displayMetrics.density + return dp * scale + 0.5f + } + + fun dimens2Px(id: Int): Int { + return MyApp.app.resources.getDimensionPixelSize(id) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/Base64.java b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/Base64.java new file mode 100644 index 0000000..544a18c --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/Base64.java @@ -0,0 +1,297 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils.des; + +import java.util.Arrays; + +/** + * Created on 2022/3/2 10:29 + * + * @author Gong Youqiang + */ +public class Base64 { + private static final char[] CA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); + private static final int[] IA = new int[256]; + static { + Arrays.fill(IA, -1); + for (int i = 0, iS = CA.length; i < iS; i++) + IA[CA[i]] = i; + IA['='] = 0; + } + private static final byte[] encodingTable = { (byte) 'A', (byte) 'B', + (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G', + (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', + (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', + (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', + (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a', + (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', + (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', + (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', + (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', + (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z', + (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', + (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', + (byte) '+', (byte) '/' }; + private static final byte[] decodingTable; + static { + decodingTable = new byte[128]; + for (int i = 0; i < 128; i++) { + decodingTable[i] = (byte) -1; + } + for (int i = 'A'; i <= 'Z'; i++) { + decodingTable[i] = (byte) (i - 'A'); + } + for (int i = 'a'; i <= 'z'; i++) { + decodingTable[i] = (byte) (i - 'a' + 26); + } + for (int i = '0'; i <= '9'; i++) { + decodingTable[i] = (byte) (i - '0' + 52); + } + decodingTable['+'] = 62; + decodingTable['/'] = 63; + } + + public static byte[] encode(byte[] data) { + byte[] bytes; + int modulus = data.length % 3; + if (modulus == 0) { + bytes = new byte[(4 * data.length) / 3]; + } else { + bytes = new byte[4 * ((data.length / 3) + 1)]; + } + int dataLength = (data.length - modulus); + int a1; + int a2; + int a3; + for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) { + a1 = data[i] & 0xff; + a2 = data[i + 1] & 0xff; + a3 = data[i + 2] & 0xff; + bytes[j] = encodingTable[(a1 >>> 2) & 0x3f]; + bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]; + bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]; + bytes[j + 3] = encodingTable[a3 & 0x3f]; + } + int b1; + int b2; + int b3; + int d1; + int d2; + switch (modulus) { + case 0: /* nothing left to do */ + break; + case 1: + d1 = data[data.length - 1] & 0xff; + b1 = (d1 >>> 2) & 0x3f; + b2 = (d1 << 4) & 0x3f; + bytes[bytes.length - 4] = encodingTable[b1]; + bytes[bytes.length - 3] = encodingTable[b2]; + bytes[bytes.length - 2] = (byte) '='; + bytes[bytes.length - 1] = (byte) '='; + break; + case 2: + d1 = data[data.length - 2] & 0xff; + d2 = data[data.length - 1] & 0xff; + b1 = (d1 >>> 2) & 0x3f; + b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f; + b3 = (d2 << 2) & 0x3f; + bytes[bytes.length - 4] = encodingTable[b1]; + bytes[bytes.length - 3] = encodingTable[b2]; + bytes[bytes.length - 2] = encodingTable[b3]; + bytes[bytes.length - 1] = (byte) '='; + break; + } + return bytes; + } + + public static byte[] decode(byte[] data) { + byte[] bytes; + byte b1; + byte b2; + byte b3; + byte b4; + data = discardNonBase64Bytes(data); + if (data[data.length - 2] == '=') { + bytes = new byte[(((data.length / 4) - 1) * 3) + 1]; + } else if (data[data.length - 1] == '=') { + bytes = new byte[(((data.length / 4) - 1) * 3) + 2]; + } else { + bytes = new byte[((data.length / 4) * 3)]; + } + for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) { + b1 = decodingTable[data[i]]; + b2 = decodingTable[data[i + 1]]; + b3 = decodingTable[data[i + 2]]; + b4 = decodingTable[data[i + 3]]; + bytes[j] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2)); + bytes[j + 2] = (byte) ((b3 << 6) | b4); + } + if (data[data.length - 2] == '=') { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)); + } else if (data[data.length - 1] == '=') { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + b3 = decodingTable[data[data.length - 2]]; + bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)); + } else { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + b3 = decodingTable[data[data.length - 2]]; + b4 = decodingTable[data[data.length - 1]]; + bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)); + bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4); + } + return bytes; + } + + public static byte[] decode(String data) { + byte[] bytes; + byte b1; + byte b2; + byte b3; + byte b4; + data = discardNonBase64Chars(data); + if (data.charAt(data.length() - 2) == '=') { + bytes = new byte[(((data.length() / 4) - 1) * 3) + 1]; + } else if (data.charAt(data.length() - 1) == '=') { + bytes = new byte[(((data.length() / 4) - 1) * 3) + 2]; + } else { + bytes = new byte[((data.length() / 4) * 3)]; + } + for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) { + b1 = decodingTable[data.charAt(i)]; + b2 = decodingTable[data.charAt(i + 1)]; + b3 = decodingTable[data.charAt(i + 2)]; + b4 = decodingTable[data.charAt(i + 3)]; + bytes[j] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2)); + bytes[j + 2] = (byte) ((b3 << 6) | b4); + } + if (data.charAt(data.length() - 2) == '=') { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4)); + } else if (data.charAt(data.length() - 1) == '=') { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + b3 = decodingTable[data.charAt(data.length() - 2)]; + bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2)); + } else { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + b3 = decodingTable[data.charAt(data.length() - 2)]; + b4 = decodingTable[data.charAt(data.length() - 1)]; + bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2)); + bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4); + } + return bytes; + } + + private static byte[] discardNonBase64Bytes(byte[] data) { + byte[] temp = new byte[data.length]; + int bytesCopied = 0; + for (int i = 0; i < data.length; i++) { + if (isValidBase64Byte(data[i])) { + temp[bytesCopied++] = data[i]; + } + } + byte[] newData = new byte[bytesCopied]; + System.arraycopy(temp, 0, newData, 0, bytesCopied); + return newData; + } + + private static String discardNonBase64Chars(String data) { + StringBuffer sb = new StringBuffer(); + int length = data.length(); + for (int i = 0; i < length; i++) { + if (isValidBase64Byte((byte) (data.charAt(i)))) { + sb.append(data.charAt(i)); + } + } + return sb.toString(); + } + + private static boolean isValidBase64Byte(byte b) { + if (b == '=') { + return true; + } else if ((b < 0) || (b >= 128)) { + return false; + } else if (decodingTable[b] == -1) { + return false; + } + return true; + } + + /** Encodes a raw byte array into a BASE64 String representation i accordance with RFC 2045. + * @param sArr The bytes to convert. If null or length 0 an empty array will be returned. + * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
+ * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a + * little faster. + * @return A BASE64 encoded array. Never null. + */ + public final static String encodeToString(byte[] sArr, boolean lineSep) + { + // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower. + return new String(encodeToChar(sArr, lineSep)); + } + + /** Encodes a raw byte array into a BASE64 char[] representation i accordance with RFC 2045. + * @param sArr The bytes to convert. If null or length 0 an empty array will be returned. + * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
+ * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a + * little faster. + * @return A BASE64 encoded array. Never null. + */ + public final static char[] encodeToChar(byte[] sArr, boolean lineSep) + { + // Check special case + int sLen = sArr != null ? sArr.length : 0; + if (sLen == 0) + return new char[0]; + + int eLen = (sLen / 3) * 3; // Length of even 24-bits. + int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count + int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array + char[] dArr = new char[dLen]; + + // Encode even 24-bits + for (int s = 0, d = 0, cc = 0; s < eLen;) { + // Copy next three bytes into lower 24 bits of int, paying attension to sign. + int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff); + + // Encode the int into four chars + dArr[d++] = CA[(i >>> 18) & 0x3f]; + dArr[d++] = CA[(i >>> 12) & 0x3f]; + dArr[d++] = CA[(i >>> 6) & 0x3f]; + dArr[d++] = CA[i & 0x3f]; + + // Add optional line separator + if (lineSep && ++cc == 19 && d < dLen - 2) { + dArr[d++] = '\r'; + dArr[d++] = '\n'; + cc = 0; + } + } + + // Pad and encode last bits if source isn't even 24 bits. + int left = sLen - eLen; // 0 - 2. + if (left > 0) { + // Prepare the int + int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0); + + // Set last four chars + dArr[dLen - 4] = CA[i >> 12]; + dArr[dLen - 3] = CA[(i >>> 6) & 0x3f]; + dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '='; + dArr[dLen - 1] = '='; + } + return dArr; + } +} + + diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DES.java b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DES.java new file mode 100644 index 0000000..b2661f2 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DES.java @@ -0,0 +1,122 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils.des; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; + +/** + * Created on 2022/3/2 10:01 + * + * @author Gong Youqiang + */ +public class DES { + /** 加密KEY */ + private static final byte[] KEY = "7;9Ku7;:84VG*B78".getBytes(); + /** 算法 */ + private static final String ALGORITHM = "DES"; + /** IV */ + private static final byte[] IV = "sHjrydLq".getBytes(); + /** TRANSFORMATION */ + private static final String TRANSFORMATION = "DES/CBC/PKCS5Padding"; + + private static int code = 0; + + public DES() { + } + + /** + * 构造函数 + * @param code 加密方式:0-“ISO-8859-1”编码,1-base64编码,其它-默认编码(utf-8) + */ + public DES(int code) { + this.code = code; + } + + /** + * 将字符串进行DES加密 + * @param source 未加密源字符串 + * @return 加密后字符串 + */ + public static String encrypt(String source) { + byte[] retByte = null; + + // Create SecretKey object + DESKeySpec dks = null; + try { + dks = new DESKeySpec(KEY); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + SecretKey securekey = keyFactory.generateSecret(dks); + + // Create IvParameterSpec object with initialization vector + IvParameterSpec spec = new IvParameterSpec(IV); + + // Create Cipter object + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + + // Initialize Cipher object + cipher.init(Cipher.ENCRYPT_MODE, securekey, spec); + + // Decrypting data + retByte = cipher.doFinal(source.getBytes()); + + String result = ""; + if (code == 0) { + result = new String(retByte, "ISO-8859-1"); + } else if (code == 1) { + result = Base64.encodeToString(retByte,false); + } else { + result = new String(retByte); + } + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } + + /** + * 将DES加密的字符串解密 + * @param encrypted 加密过的字符串 + * @return 未加密源字符串 + */ + public static String decrypt(String encrypted) { + byte[] retByte = null; + + // Create SecretKey object + DESKeySpec dks = null; + try { + dks = new DESKeySpec(KEY); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + SecretKey securekey = keyFactory.generateSecret(dks); + + // Create IvParameterSpec object with initialization vector + IvParameterSpec spec = new IvParameterSpec(IV); + + // Create Cipter object + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + + // Initialize Cipher object + cipher.init(Cipher.DECRYPT_MODE, securekey, spec); + + if (code == 0) { + retByte = encrypted.getBytes("ISO-8859-1"); + } else if (code == 1) { + retByte = Base64.decode(encrypted); + } else { + retByte = encrypted.getBytes(); + } + + // Decrypting data + retByte = cipher.doFinal(retByte); + return new String(retByte, "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } +} + diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DesUtil.java b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DesUtil.java new file mode 100644 index 0000000..ba4a3c6 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/utils/des/DesUtil.java @@ -0,0 +1,18 @@ +package com.cute.girl.hd.pink.img.wallpaper.utils.des; + + +import java.util.ArrayList; +import java.util.List; + +public class DesUtil { + public static void main(String[] args) { + List list = new ArrayList(); + for (String str : list) { + String ss = DES.encrypt(str); + System.out.println("<" + ss + ">"); + String aa = DES.decrypt(ss); + System.out.println(">" + aa + "<"); + System.out.println("---------------------"); + } + } +} diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/CustomItemDecoration.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/CustomItemDecoration.kt new file mode 100644 index 0000000..c938d24 --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/CustomItemDecoration.kt @@ -0,0 +1,96 @@ +package com.cute.girl.hd.pink.img.wallpaper.view + + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.cute.girl.hd.pink.img.wallpaper.utils.GlobalExt.dp2PxInt +class CustomItemDecoration : RecyclerView.ItemDecoration { + + // item的水平、垂直方向的间距 + private var verticalSpacing = 0 + private var horizontalSpacing = 0 + + // recyclerview 左右分别额外的边距,可正可负,效果如|◼ ◼ ◼ ◼|、| ◼ ◼ ◼ ◼ | + //首尾margin是 spacing + extraSpacing + private var extraSpacing = 0 + + // item占满一行时,该item是否需要左右间距 + var needVerticalSpacingInSingleLine = true + var needHorizontalSpacingInSingleLine = true + + constructor(spacing: Int) { + initSpacing(spacing, spacing, 0) + } + + constructor(spacing: Int, extraSpacing: Int) { + initSpacing(spacing, spacing, extraSpacing) + } + + constructor(verticalSpacing: Int, horizontalSpacing: Int, extraSpacing: Int) { + initSpacing(verticalSpacing, horizontalSpacing, extraSpacing) + } + + private fun initSpacing(verticalSpacing: Int, horizontalSpacing: Int, extraSpacing: Int) { + this.horizontalSpacing = horizontalSpacing.dp2PxInt() + this.verticalSpacing = verticalSpacing.dp2PxInt() + this.extraSpacing = extraSpacing.dp2PxInt() + } + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + val position = parent.getChildAdapterPosition(view) + var spanCount = 1 + var spanSize = 1 + var spanIndex = 0 + + parent.layoutManager?.run { + when (this) { + is StaggeredGridLayoutManager -> { + spanCount = this.spanCount + (view.layoutParams as StaggeredGridLayoutManager.LayoutParams)?.run { + if (isFullSpan) spanSize = spanCount + spanIndex = this.spanIndex + } + } + + is GridLayoutManager -> { + spanCount = this.spanCount + spanSize = this.spanSizeLookup.getSpanSize(position) + spanIndex = (view.layoutParams as GridLayoutManager.LayoutParams).spanIndex + } + + is LinearLayoutManager -> { + outRect.left = verticalSpacing + outRect.right = verticalSpacing + outRect.bottom = horizontalSpacing + return + } + + else -> {} + } + } + + if (spanSize == spanCount) { + outRect.left = + if (needVerticalSpacingInSingleLine) verticalSpacing + extraSpacing else 0 + outRect.right = + if (needVerticalSpacingInSingleLine) verticalSpacing + extraSpacing else 0 + outRect.bottom = if (needHorizontalSpacingInSingleLine) horizontalSpacing else 0 + } else { + val itemAllSpacing = (verticalSpacing * (spanCount + 1) + extraSpacing * 2) / spanCount + val left = verticalSpacing * (spanIndex + 1) - itemAllSpacing * spanIndex + extraSpacing + val right = itemAllSpacing - left + outRect.left = left + outRect.right = right + outRect.bottom = horizontalSpacing + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SetAsDialog.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SetAsDialog.kt new file mode 100644 index 0000000..884f25f --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SetAsDialog.kt @@ -0,0 +1,58 @@ +package com.cute.girl.hd.pink.img.wallpaper.view + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import com.cute.girl.hd.pink.img.wallpaper.R +import com.cute.girl.hd.pink.img.wallpaper.databinding.DialogSetBinding +import com.cute.girl.hd.pink.img.wallpaper.utils.DeviceUtil + +class SetAsDialog(private val ctx: Context, init: SetAsDialog.() -> Unit) : + Dialog(ctx, R.style.AppDialog) { + + private lateinit var binding: DialogSetBinding + var onClickHomeScreen: (() -> Unit)? = null + var onClickLockScreen: (() -> Unit)? = null + var onClickBoth: (() -> Unit)? = null + + init { + init() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DialogSetBinding.inflate(LayoutInflater.from(ctx)) + setContentView(binding.root) + initViews() + } + + private fun initViews() { + //设置宽度 + val p = window!!.attributes + p.width = (DeviceUtil.getScreenWidth(ctx) * 0.8).toInt() //设置dialog的宽度为当前手机屏幕的宽度*0.8 + window!!.attributes = p + + setCancelable(true) + setCanceledOnTouchOutside(true) + + binding.ivClose.setOnClickListener { + dismiss() + } + + binding.llHomeScreen.setOnClickListener { + dismiss() + onClickHomeScreen?.invoke() + } + + binding.llLockScreen.setOnClickListener { + dismiss() + onClickLockScreen?.invoke() + } + + binding.llBoth.setOnClickListener { + dismiss() + onClickBoth?.invoke() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SquareFrameLayout.kt b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SquareFrameLayout.kt new file mode 100644 index 0000000..35dc09f --- /dev/null +++ b/app/src/main/java/com/cute/girl/hd/pink/img/wallpaper/view/SquareFrameLayout.kt @@ -0,0 +1,19 @@ +package com.cute.girl.hd.pink.img.wallpaper.view + +import android.content.Context +import android.util.AttributeSet +import android.widget.FrameLayout + +class SquareFrameLayout : FrameLayout { + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/d_card_dialog_24dp.xml b/app/src/main/res/drawable/d_card_dialog_24dp.xml new file mode 100644 index 0000000..7195552 --- /dev/null +++ b/app/src/main/res/drawable/d_card_dialog_24dp.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/d_card_theme_pink_32dp.xml b/app/src/main/res/drawable/d_card_theme_pink_32dp.xml new file mode 100644 index 0000000..68d36a2 --- /dev/null +++ b/app/src/main/res/drawable/d_card_theme_pink_32dp.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 0000000..5d5d984 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000..3730a54 --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml new file mode 100644 index 0000000..a6380c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_download.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu.xml b/app/src/main/res/drawable/ic_menu.xml new file mode 100644 index 0000000..a538ab9 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_placeholder.xml b/app/src/main/res/drawable/ic_placeholder.xml new file mode 100644 index 0000000..fa00362 --- /dev/null +++ b/app/src/main/res/drawable/ic_placeholder.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_wallpaper.xml b/app/src/main/res/drawable/ic_wallpaper.xml new file mode 100644 index 0000000..aec682e --- /dev/null +++ b/app/src/main/res/drawable/ic_wallpaper.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/font/fredoka.ttf b/app/src/main/res/font/fredoka.ttf new file mode 100644 index 0000000..bcef8af Binary files /dev/null and b/app/src/main/res/font/fredoka.ttf differ diff --git a/app/src/main/res/layout/ability_category.xml b/app/src/main/res/layout/ability_category.xml new file mode 100644 index 0000000..dcd2fe4 --- /dev/null +++ b/app/src/main/res/layout/ability_category.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ability_main.xml b/app/src/main/res/layout/ability_main.xml new file mode 100644 index 0000000..e48a2ae --- /dev/null +++ b/app/src/main/res/layout/ability_main.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ability_preview.xml b/app/src/main/res/layout/ability_preview.xml new file mode 100644 index 0000000..c21c96b --- /dev/null +++ b/app/src/main/res/layout/ability_preview.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ability_privacy.xml b/app/src/main/res/layout/ability_privacy.xml new file mode 100644 index 0000000..e7fb115 --- /dev/null +++ b/app/src/main/res/layout/ability_privacy.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ability_start.xml b/app/src/main/res/layout/ability_start.xml new file mode 100644 index 0000000..2bc21ab --- /dev/null +++ b/app/src/main/res/layout/ability_start.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_set.xml b/app/src/main/res/layout/dialog_set.xml new file mode 100644 index 0000000..87aa913 --- /dev/null +++ b/app/src/main/res/layout/dialog_set.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_category.xml b/app/src/main/res/layout/item_category.xml new file mode 100644 index 0000000..d44f42a --- /dev/null +++ b/app/src/main/res/layout/item_category.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml new file mode 100644 index 0000000..76b3837 --- /dev/null +++ b/app/src/main/res/layout/item_image.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_preview.xml b/app/src/main/res/layout/item_preview.xml new file mode 100644 index 0000000..adcf087 --- /dev/null +++ b/app/src/main/res/layout/item_preview.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/page_category.xml b/app/src/main/res/layout/page_category.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/page_category.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/page_recent.xml b/app/src/main/res/layout/page_recent.xml new file mode 100644 index 0000000..0e41bfb --- /dev/null +++ b/app/src/main/res/layout/page_recent.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..e019a0c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..1923b27 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..091f6d3 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..1905585 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..35b1797 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..5a97509 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..3b15eac Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..54871d3 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..7d5cc3f Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..60b98d8 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..a80fdc9 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..07488c8 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..48d01bb Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..cb765bb Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..59e8d5c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/logo.png b/app/src/main/res/mipmap-xxxhdpi/logo.png new file mode 100644 index 0000000..1741048 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/logo.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..2a756f7 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #FF000000 + #FFFFFFFF + + #EBF6F5 + #ED99B2 + #D8D8D8 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..dc1aa11 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + Art Wallpaper + Image loading failed, please pull down to refresh and reload. + Downloading HD Image... + Set Wallpaper + Wallpaper set successfully + Home Screen + Lock Screen + Both + Wallpaper download failed! + Privacy Policy + Share App + Share Girl Wallpaper with your friends! share the link %s + Rate Us + Saved to album + Save failed + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..e3a34fc --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..5856b76 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..81150f8 --- /dev/null +++ b/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + 127.0.0.1 + + + + \ No newline at end of file diff --git a/app/src/test/java/com/cute/girl/hd/pink/img/wallpaper/ExampleUnitTest.kt b/app/src/test/java/com/cute/girl/hd/pink/img/wallpaper/ExampleUnitTest.kt new file mode 100644 index 0000000..312e1b7 --- /dev/null +++ b/app/src/test/java/com/cute/girl/hd/pink/img/wallpaper/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.cute.girl.hd.pink.img.wallpaper + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/app/testArtWallpaper.jks b/app/testArtWallpaper.jks new file mode 100644 index 0000000..b3382d7 Binary files /dev/null and b/app/testArtWallpaper.jks differ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..9129e93 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,12 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.jetbrainsKotlinAndroid) apply false + id("com.google.gms.google-services") version "4.3.15" apply false + id ("com.google.firebase.crashlytics") version "2.9.2" apply false +} +buildscript{ + dependencies{ + classpath("com.applovin.quality:AppLovinQualityServiceGradlePlugin:+") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..68c91ae --- /dev/null +++ b/gradle.properties @@ -0,0 +1,24 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..474156d --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,22 @@ +[versions] +agp = "8.1.3" +kotlin = "1.9.0" +coreKtx = "1.13.1" +junit = "4.13.2" +junitVersion = "1.1.5" +espressoCore = "3.5.1" +appcompat = "1.6.1" +material = "1.12.0" + +[libraries] +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } + +[plugins] +androidApplication = { id = "com.android.application", version.ref = "agp" } +jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..daa506f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 28 15:35:37 CST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/keyinfo/info b/keyinfo/info new file mode 100644 index 0000000..a158f6b --- /dev/null +++ b/keyinfo/info @@ -0,0 +1,5 @@ +应用名:Art Wallpaper +包名:com.wallart.art.wallpapers.hd +签名文件:ArtWallpaper.jks +别名:ArtWallpaperkey0 +密码:ArtWallpaper \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..dfdabf4 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,30 @@ +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + jcenter() + mavenCentral() + gradlePluginPortal() + maven{url = uri("https://artifacts.applovin.com/android")} + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + jcenter() + mavenCentral() + + maven ("https://artifact.bytedance.com/repository/pangle") + maven { url = uri("https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea") } + } +} + +rootProject.name = "ArtWallpaper" +include(":app") + \ No newline at end of file