From a5e90bbdb1066388f9f5acc74abc5b7e059c4709 Mon Sep 17 00:00:00 2001 From: litingting Date: Tue, 9 Sep 2025 13:50:16 +0800 Subject: [PATCH] V1.0(1) --- .gitignore | 15 + app/.gitignore | 1 + app/DynamicCartoonWallpaper.jks | Bin 0 -> 2626 bytes app/build.gradle.kts | 79 + app/objectbox-models/default.json | 116 + app/proguard-rules.pro | 194 + .../wallpaper/ExampleInstrumentedTest.kt | 24 + app/src/main/AndroidManifest.xml | 65 + app/src/main/assets/Explore.json | 4832 ++++++++++++++++ app/src/main/assets/Shift.json | 1037 ++++ app/src/main/assets/Trending.json | 4834 +++++++++++++++++ .../java/com/video/mobile/wallpaper/App.kt | 19 + .../video/mobile/wallpaper/BaseViewHolder.kt | 9 + .../java/com/video/mobile/wallpaper/Helper.kt | 185 + .../video/mobile/wallpaper/SplashActivity.kt | 63 + .../wallpaper/database/DataBaseManager.kt | 143 + .../wallpaper/database/LikeWallpaper.kt | 23 + .../wallpaper/database/VideoWallpaper.kt | 24 + .../wallpaper/favorite/FavoriteActivity.kt | 124 + .../wallpaper/favorite/FavoriteAdapter.kt | 91 + .../mobile/wallpaper/main/FragmentAdapter.kt | 12 + .../mobile/wallpaper/main/MainActivity.kt | 91 + .../mobile/wallpaper/main/MainAdapter.kt | 94 + .../mobile/wallpaper/main/MainFragment.kt | 110 + .../mobile/wallpaper/main/MainViewModel.kt | 41 + .../wallpaper/network/CustomResponseBody.kt | 37 + .../wallpaper/network/HttpInterceptor.kt | 18 + .../wallpaper/network/RetrofitManager.kt | 256 + .../mobile/wallpaper/network/VideoApi.kt | 41 + .../wallpaper/page/AllWallpaperPageSource.kt | 36 + .../mobile/wallpaper/page/LikePageSource.kt | 34 + .../wallpaper/preview/DisplayVideoActivity.kt | 502 ++ .../preview/VideoWallpaperService.kt | 112 + .../wallpaper/preview/WallpaperPathManager.kt | 52 + .../wallpaper/utils/RecyclerViewSpace.kt | 72 + .../main/res/drawable/common_back_button.xml | 9 + .../res/drawable/common_back_button_bg.xml | 6 + .../res/drawable/common_set_wallpaper_bg.xml | 7 + .../drawable/display_selector_favorite.xml | 6 + app/src/main/res/drawable/empty_favorite.xml | 39 + .../res/drawable/ic_launcher_background.xml | 170 + .../res/drawable/ic_launcher_foreground.xml | 30 + .../res/drawable/icon_favorite_selected.xml | 9 + .../res/drawable/icon_favorite_unselected.xml | 9 + .../res/drawable/main_gradient_border.xml | 27 + .../main/res/drawable/main_tab_selected.xml | 9 + .../main/res/drawable/main_tab_selector.xml | 6 + .../main/res/drawable/main_tab_unselect.xml | 7 + .../res/drawable/splash_progress_drawable.xml | 21 + .../res/drawable/thumbnail_placeholder.xml | 25 + .../res/layout/activity_display_video.xml | 190 + app/src/main/res/layout/activity_favorite.xml | 65 + app/src/main/res/layout/activity_main.xml | 86 + app/src/main/res/layout/activity_splash.xml | 58 + app/src/main/res/layout/favorite_adapter.xml | 16 + app/src/main/res/layout/fragment_main.xml | 13 + app/src/main/res/layout/main_adapter.xml | 20 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/mipmap-xxxhdpi/logo.png | Bin 0 -> 94089 bytes app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values/colors.xml | 13 + app/src/main/res/values/strings.xml | 17 + app/src/main/res/values/themes.xml | 16 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + app/src/main/res/xml/file_paths.xml | 8 + app/src/main/res/xml/video_wallpaper.xml | 5 + .../video/mobile/wallpaper/ExampleUnitTest.kt | 17 + build.gradle.kts | 10 + gradle.properties | 23 + gradle/libs.versions.toml | 26 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 + gradlew.bat | 89 + keystore.properties | 6 + settings.gradle.kts | 24 + 88 files changed, 14710 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/DynamicCartoonWallpaper.jks create mode 100644 app/build.gradle.kts create mode 100644 app/objectbox-models/default.json create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/video/mobile/wallpaper/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/Explore.json create mode 100644 app/src/main/assets/Shift.json create mode 100644 app/src/main/assets/Trending.json create mode 100644 app/src/main/java/com/video/mobile/wallpaper/App.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/BaseViewHolder.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/Helper.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/SplashActivity.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/database/DataBaseManager.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/database/LikeWallpaper.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/database/VideoWallpaper.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteActivity.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteAdapter.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/main/FragmentAdapter.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/main/MainActivity.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/main/MainAdapter.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/main/MainFragment.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/main/MainViewModel.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/network/CustomResponseBody.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/network/HttpInterceptor.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/network/RetrofitManager.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/network/VideoApi.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/page/AllWallpaperPageSource.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/page/LikePageSource.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/preview/DisplayVideoActivity.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/preview/VideoWallpaperService.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/preview/WallpaperPathManager.kt create mode 100644 app/src/main/java/com/video/mobile/wallpaper/utils/RecyclerViewSpace.kt create mode 100644 app/src/main/res/drawable/common_back_button.xml create mode 100644 app/src/main/res/drawable/common_back_button_bg.xml create mode 100644 app/src/main/res/drawable/common_set_wallpaper_bg.xml create mode 100644 app/src/main/res/drawable/display_selector_favorite.xml create mode 100644 app/src/main/res/drawable/empty_favorite.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/icon_favorite_selected.xml create mode 100644 app/src/main/res/drawable/icon_favorite_unselected.xml create mode 100644 app/src/main/res/drawable/main_gradient_border.xml create mode 100644 app/src/main/res/drawable/main_tab_selected.xml create mode 100644 app/src/main/res/drawable/main_tab_selector.xml create mode 100644 app/src/main/res/drawable/main_tab_unselect.xml create mode 100644 app/src/main/res/drawable/splash_progress_drawable.xml create mode 100644 app/src/main/res/drawable/thumbnail_placeholder.xml create mode 100644 app/src/main/res/layout/activity_display_video.xml create mode 100644 app/src/main/res/layout/activity_favorite.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/favorite_adapter.xml create mode 100644 app/src/main/res/layout/fragment_main.xml create mode 100644 app/src/main/res/layout/main_adapter.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/logo.png create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/file_paths.xml create mode 100644 app/src/main/res/xml/video_wallpaper.xml create mode 100644 app/src/test/java/com/video/mobile/wallpaper/ExampleUnitTest.kt create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 keystore.properties create mode 100644 settings.gradle.kts 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/DynamicCartoonWallpaper.jks b/app/DynamicCartoonWallpaper.jks new file mode 100644 index 0000000000000000000000000000000000000000..dd74dd71e74b7e2da913fd7bfe199bfcb949352a GIT binary patch literal 2626 zcma)8XHXOB5>2CnQi2cx0RfSo(0dUuG$~3)AR%-@Zz3fageyX*0@9RrmC!<0Kzc_6 zMXCzKaFw7a(jr8}%bWMcJMY(fb7sGtJ!g0S?U@gbXVnD(!Eiham61g{#U$lB2apL^ zhG$uV;92HQ=vQz&!{UEQ4C4?y!|(~+e-hn{Z2y^JX9a@F@C^DVq&D39_XGn6+zGD! zPst9Kfj|XDt_sTUSczm%`wUqFnzK8SEIL6TNlp+@1kTRL{O^q*76t%Zh>-=AVgmF6 zLx9o{PU85x!1PBt1TqTS%paFGfb0^O8y%pYt)K^EQc|_ltD4 zBf<1yBqjV_v7q?Ix}jX$#~1Uyl%VWZ7e zd?rgH_8XLs5U4KJorpMg<9FBJs8S7n@v-`~tA}#Dl0({;l9n9nvhA|t)X;!Oggr{L z??jk>pQTOf8)o6M4=-i!UEU34L_1>u;_W+%`xw=As1ptlFhbMpdpAtnUF0eC`B*%t zF&#O6G>Dtfi!q?H$z_LQZ->%_xN_qtf2CkSu*?N^ZEfpu;|Il@LQgG2Zj|1GWv=od zm=wZ=pWTQSbK+qd)cWyKRCW(bu&6?bhkB4~?GkE)!$jDf`#Bjj;<$oV0z#fgl%hx@fnN{k#3jIm+oYHC*~5 zp`?=8WHXM)jMru$noY9j=Am+DIq8pq2EdiZmS##+?LyJs@`A(%9f>F8oKLzXVh5vb z$}X?ucU0W}q;EtBIIS6D<~#3;H-)_kzu)l@;%Fur%R1uzGwq?Ej21LmM>PE5oEs$> zsve(7G&yS5XTj(1-Wm-CsIL~br@r-cic)d&SY@u8=|cD|w=Oztb1c{L z131JsjLWoKrlkMa4lDjvczkmA?qnP;@owiT#JRX72ec>imB3_r)#{Tjm(pW8FR2Cd zq*P3`1%!!H^p?5-S$5jhbSf(QgQYa)PJ1k9b$egRp5y zgEZXW(KTWqi@ED6qQxfD?%Q+R1b;cVty$l*Cb0A18N(_w=h z?Qy4^Y5mp$Ut-wHF0RZmEw05W)`w0uYaJeAnF&kuWetMg@;ach1lDopXSqmYEH};qm z64k_f9ldx(s9|$@^_P$AV8SUQ?S{9TB15A7wi4amax&zb8iICpGjLttOS?=!Kk zup{f8OaE(Eh=-YHES*cdBT(mwNFL%nc z0Hvq(7)nC;!;OF2B?}axeohtO35Wp%0nmUzfFA&J0yH2D5CI52K@cGNq{5ycaaNGI?dWj&^R8&;el$78IMHLk|9=!d#iHWfc52l<@D<+x18OM`F{+(HlsD06cimvHLvGx9&EXthzFx; z;B}K_zKopGXDJ(et=$}V_`(={r($8A=(mO8`(skD@$!igjumApRoCI7<;BrIw!_h1 zDp-`|)B>+{sU^|`SEa18MjF`y23bGp2TSrN*kVilBoawcYqeIxggX1nWO(sUWdh;? z|KqQEb1CRHXja@pnd3lQ%hcA+kP+Q@uW7$Tf2EDf@d6Ad^yq!!Fg8PS1M6Qt9xfH@==^pr zWS;jS)pYezqU-YBs!3PpL&3|Y|x=q)mA-)x`~&g5yHx;!|5(BJE7-6T0phgd3e&6;JpJ^St$SU5&DJn z^}H+tm?6EcsoZpQD?%wnqkw1m=B24Sg4Fl<*J70_G<8Hxoaiv=^1w*IP(sULDqU*2 z@%g#WUAGnc#~xe=9n~QrR>RXW4Y0dTubLXg-Yr}UJFg08!dO+Zf^MeP1ZFe_(5^b< z+7IUym!9=Q&p9xW3pX1NwFK7~syALRtW8lXiF_f9uDBvnExtv2fhwpOm%C^ z)x_TwCXeT|BDz?6qTbLPd}K>Ofd=R7*}s1wMXyBrn}#49a9^_2YRZc>0-^>F{2jqV zn}CKg8rvDk@GI`hoVezn?bf?>OSS^`6^A)q@GEcxoa6Vu3It>TKt$4u7L1*`dM4sh zu1BDP6hDXpv+eI?>wXqC9wOjo>UJT}giZjKuF#90SlRZwv0{Z3CB$+3>%{*Cr~Rq= literal 0 HcmV?d00001 diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..d9c9ec5 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,79 @@ +import java.util.Date +import java.text.SimpleDateFormat +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + id ("kotlin-parcelize") + id("io.objectbox") +} + +android { + namespace = "com.video.mobile.wallpaper" + compileSdk = 35 + + defaultConfig { + applicationId = "com.video.mobile.wallpaper" + minSdk = 24 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + setProperty( + "archivesBaseName", + "Dynamic Cartoon 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_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } + buildFeatures{ + viewBinding = true + buildConfig = true + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + + + implementation ("androidx.paging:paging-runtime-ktx:3.3.6") + + implementation ("com.google.code.gson:gson:2.12.1") + implementation("com.github.bumptech.glide:glide:4.16.0") + + // ViewModel + LiveData KTX +// implementation ("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.2") +// implementation ("androidx.lifecycle:lifecycle-livedata-ktx:2.9.2") + // Fragment KTX(提供 viewModels 扩展) + implementation ("androidx.fragment:fragment-ktx:1.8.9") + + implementation("androidx.media3:media3-exoplayer:1.8.0") + implementation ("androidx.media3:media3-ui:1.8.0") + + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") +} \ No newline at end of file diff --git a/app/objectbox-models/default.json b/app/objectbox-models/default.json new file mode 100644 index 0000000..1a472c2 --- /dev/null +++ b/app/objectbox-models/default.json @@ -0,0 +1,116 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:5861365936442707683", + "lastPropertyId": "6:8474641495170349359", + "name": "LikeWallpaper", + "properties": [ + { + "id": "1:1896367441224580523", + "name": "objectId", + "type": 6, + "flags": 1 + }, + { + "id": "2:518404838438816658", + "name": "description", + "type": 9 + }, + { + "id": "3:8610300359262444087", + "name": "id", + "type": 6 + }, + { + "id": "4:1799690089661510919", + "name": "image", + "type": 9 + }, + { + "id": "5:3735709230659931937", + "name": "wallpapertype", + "type": 6 + }, + { + "id": "6:8474641495170349359", + "name": "thumbnail", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:7214743200838441355", + "lastPropertyId": "10:5928432456802213941", + "name": "VideoWallpaper", + "properties": [ + { + "id": "1:8404628459774998577", + "name": "objectId", + "type": 6, + "flags": 1 + }, + { + "id": "2:2199034792582915578", + "name": "category", + "type": 9 + }, + { + "id": "3:8906378192469633251", + "name": "description", + "type": 9 + }, + { + "id": "4:4298057389705852700", + "name": "downloads", + "type": 9 + }, + { + "id": "5:5956110026349494870", + "name": "id", + "type": 6 + }, + { + "id": "6:6267621209200928594", + "name": "image", + "type": 9 + }, + { + "id": "7:8054649528453649863", + "name": "pro", + "type": 5 + }, + { + "id": "8:6813789647380825500", + "name": "resolution", + "type": 9 + }, + { + "id": "9:3370332525900065977", + "name": "thumbnail", + "type": 9 + }, + { + "id": "10:5928432456802213941", + "name": "wallpapertype", + "type": 6 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:7214743200838441355", + "lastIndexId": "0:0", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "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..a977834 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,194 @@ +# 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 + + +# 保持 Gson 和 TypeToken 不被混淆 +-keep class com.google.gson.** { *; } +-keep class com.google.gson.reflect.TypeToken { *; } + +# 保留与泛型相关的 TypeToken 使用,避免泛型信息丢失 +-keep class * extends com.google.gson.reflect.TypeToken { *; } + + + +# 保持 Gson 序列化相关的字段不被混淆 +-keepclassmembers class * { + @com.google.gson.annotations.SerializedName ; +} + +# 保持 Gson 构造方法不被混淆 +-keepclassmembers class com.google.gson.Gson { + public (...); +} + + +#-------------------------Gson +# Gson 反射需要保留字段名 +-keep class com.google.gson.stream.** { *; } +-keepattributes Signature +-keepattributes *Annotation* + +# 保留实体类字段(根据需要,你可以只针对自己的 model 包) +-keepclassmembers class com.video.mobile.wallpaper.database.VideoWallpaper { + ; +} +#-------------------------Gson + + + + +#-------------------------Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +-keep class com.video.mobile.wallpaper.database.VideoWallpaper implements java.io.Serializable { *; } +-keep class com.video.mobile.wallpaper.database.LikeWallpaper implements java.io.Serializable { *; } + +#-------------------------Serializable + + +#-------------------------Glide +# Glide v4 混淆规则 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.AppGlideModule +-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl { *; } +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; } + +#-------------------------Glide + + + + +# Retrofit +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keepattributes Signature +-keepattributes Exceptions + +# OkHttp +-dontwarn okhttp3.** +-keep class okhttp3.** { *; } + +# RxJava(如果用 RxJava2) +-dontwarn io.reactivex.** + + +-keep class androidx.media3.** { *; } +-dontwarn androidx.media3.** + + + + +# 保留 Retrofit 接口 +-keep interface com.video.mobile.wallpaper.network.VideoApi { *; } +-keep class com.video.mobile.wallpaper.database.LikeWallpaper { *; } +-keep class com.video.mobile.wallpaper.database.VideoWallpaper { *; } + + +# 保留 Retrofit 的所有类 +-keep class retrofit2.** { *; } + +# 保留 RxJava2 的所有类 +-keep class io.reactivex.** { *; } + +# 保留 CallAdapter 和 Converter 相关类 +-keep class retrofit2.adapter.** { *; } +-keep class retrofit2.converter.** { *; } + +# 保留类型 Token、类型适配器等相关类 +-keepclassmembers class * { + @retrofit2.http.* ; +} + +# 保留 Retrofit 和 OkHttp 的类和构造方法 +-keep class retrofit2.** { *; } +-keep class okhttp3.** { *; } + +# 保留 Retrofit 接口和方法 +-keep class retrofit2.Retrofit { *; } +-keep class retrofit2.Call { *; } +-keep class retrofit2.http.** { *; } + +# 保留所有使用 Retrofit 注解的字段、方法和类 +-keepclassmembers class * { + @retrofit2.http.* ; +} + +# 保留 Converter 和 CallAdapter 相关类 +-keep class retrofit2.converter.** { *; } +-keep class retrofit2.adapter.** { *; } + +# 保留 `@GET`, `@POST` 等注解 +-keepclassmembers class * { + @retrofit2.http.GET ; + @retrofit2.http.POST ; + @retrofit2.http.PUT ; + @retrofit2.http.DELETE ; + @retrofit2.http.PATCH ; + @retrofit2.http.Headers ; + @retrofit2.http.Query ; + @retrofit2.http.Body ; + @retrofit2.http.Path ; +} + +# 保留 OkHttp 相关类 +-keep class okhttp3.Request { *; } +-keep class okhttp3.Response { *; } +-keep class okhttp3.OkHttpClient { *; } + +# 保留 OkHttp 相关的拦截器 +-keep class okhttp3.Interceptor { *; } +-keep class okhttp3.logging.HttpLoggingInterceptor { *; } + +# 保留 OkHttp 的构造方法 +-keepclassmembers class okhttp3.** { + public (...); +} + +# 保留 OkHttpClient 的链式构建方式 +-keepclassmembers class okhttp3.OkHttpClient { + public okhttp3.OkHttpClient$Builder newBuilder(...); +} + +# 保留 HttpLoggingInterceptor 相关类 +-keep class okhttp3.logging.HttpLoggingInterceptor { *; } + +# 保留 Call 和 Request 方法 +-keepclassmembers class okhttp3.Call { + public *; +} +-keepclassmembers class okhttp3.Request { + public *; +} +-keepclassmembers class okhttp3.Response { + public *; +} + + + + diff --git a/app/src/androidTest/java/com/video/mobile/wallpaper/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/video/mobile/wallpaper/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..ad99f52 --- /dev/null +++ b/app/src/androidTest/java/com/video/mobile/wallpaper/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.video.mobile.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.video.mobile.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..7d05d32 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/Explore.json b/app/src/main/assets/Explore.json new file mode 100644 index 0000000..42f7f7b --- /dev/null +++ b/app/src/main/assets/Explore.json @@ -0,0 +1,4832 @@ +[ + { + "category": "Pattern", + "description": "Tick Tock ⏰", + "downloads": "10522", + "id": 189, + "image": "EX9qN2Sp", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1650692865-ballpattern.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Where am I 🕵🏻‍♀️", + "downloads": "5186", + "id": 188, + "image": "VjDfLBgT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650437848-bushsub.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Never ending triangles 📐", + "downloads": "10538", + "id": 187, + "image": "ViDSUzfG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650437837-foldingtriangle.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Hexagonal waves ⚡", + "downloads": "24948", + "id": 186, + "image": "mVsNlo9a", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650263214-hex0001-0300.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Home sweet home 🌎", + "downloads": "65003", + "id": 185, + "image": "SXkQLevp", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650263209-solarsystem30.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "I remember every night 🌙", + "downloads": "43685", + "id": 184, + "image": "ZckCjNdM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650005692-circlingstartrail.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Chill 🥤", + "downloads": "5713", + "id": 183, + "image": "LXi2ztvh", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650005674-chill.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "The dead shall raise 💀", + "downloads": "26938", + "id": 326, + "image": "YBsEl3bd", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1666766418-walkingskeleton.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Eat drink and be scary 🎃", + "downloads": "21949", + "id": 324, + "image": "UXmzNlDI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666457699-cementry330.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Wormhole 🚀", + "downloads": "19846", + "id": 323, + "image": "g3SMjGI8", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1666357791-looper51.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "✖️⭕", + "downloads": "20094", + "id": 321, + "image": "kfISWXG6", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666073451-glitchface.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Love for RGB ⌨️", + "downloads": "39426", + "id": 320, + "image": "5ZVq6Prd", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1665764837-keys50.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Travel through time ⏳", + "downloads": "23381", + "id": 319, + "image": "lzmt7owB", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1665764832-rgbfinal.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Are we in a simulation 🤔", + "downloads": "9950", + "id": 318, + "image": "FQNd2aKp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1665474502-cybercity.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Splitting halves ⚛️", + "downloads": "3033", + "id": 317, + "image": "FxKsChSA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1665474490-toggle3.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Countryside 🏕", + "downloads": "22600", + "id": 306, + "image": "Pl1uckY0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1665245461-nightgrass1.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Trying to expand 🤔", + "downloads": "8120", + "id": 305, + "image": "e8p9NE2q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1665245449-criclebreathe.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Any technique is worthless before my eyes ⚔️", + "downloads": "113532", + "id": 303, + "image": "o8O5Zjg9", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1664871083-itachiuchiha2.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Stretch some candy 🍬", + "downloads": "16610", + "id": 302, + "image": "QqugVMzt", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664871075-candy.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Air drops 🪂", + "downloads": "22613", + "id": 301, + "image": "Bdq0uYwg", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1664526005-forestairdrop.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Gamers paradise 🎮", + "downloads": "67120", + "id": 169, + "image": "ZNIgCsTj", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648711035-pssyarray0.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Excited cards 🧡", + "downloads": "11782", + "id": 168, + "image": "bN0WaRht", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1648711023-recarray.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Runaway lines 😉", + "downloads": "9402", + "id": 167, + "image": "GLZf5btI", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648617302-squareill.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Where trekking ends ⛺", + "downloads": "18369", + "id": 166, + "image": "TslXeryf", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648617295-vectorcamp.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Escaping the chores of life🧳", + "downloads": "72644", + "id": 165, + "image": "1b9Enzr8", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1648446795-van0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Recording the life 📼", + "downloads": "38594", + "id": 204, + "image": "fwPayG3u", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1652165587-record1.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Incursion 😉", + "downloads": "12058", + "id": 203, + "image": "5mMz2Xae", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1652165583-frames.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Riding the town 🚙", + "downloads": "32298", + "id": 202, + "image": "t7c0Vnr9", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1652009046-town.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Break the rules 🤭", + "downloads": "39315", + "id": 201, + "image": "4k7pbWnN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652009042-inteldino.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Mountain of cards ⛰️", + "downloads": "21303", + "id": 200, + "image": "1OUHBt0A", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651642619-mount.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Juicy Pine 🍍", + "downloads": "16425", + "id": 199, + "image": "uVXhD8zU", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1651642615-pineapple.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Warm beginning 🌄", + "downloads": "54617", + "id": 198, + "image": "6M4yxFB2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1651467020-birdsflying.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ripples ⭕", + "downloads": "62834", + "id": 197, + "image": "xtrPQmnY", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1651467012-drops.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Wriggly cosmos 🖤", + "downloads": "13123", + "id": 41, + "image": "xNFSWdyz", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642490906-dark hole0001-0240.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Swing with the lamp 🛋️", + "downloads": "11339", + "id": 40, + "image": "I0GAalQN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642488646-hanging light.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Mood for a rain 🌧️", + "downloads": "30615", + "id": 39, + "image": "Zs3BCXJl", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486515-rain.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Think Big 💡", + "downloads": "9340", + "id": 38, + "image": "eOcINzdF", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486479-think big.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "The Saiyan Prince 🔥", + "downloads": "21458", + "id": 37, + "image": "ayb6ospZ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486467-vegeta.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Christmas eve ☃️", + "downloads": "18453", + "id": 36, + "image": "qO5rKNj9", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486448-snow fall.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Play with dino 🦕", + "downloads": "5122", + "id": 35, + "image": "xfMGgp1q", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486428-0001-0125.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Spiral of light 💙", + "downloads": "11455", + "id": 34, + "image": "GeYfZgVw", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486424-rolling tube0001-0500.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Guider of the sea 🌊", + "downloads": "10444", + "id": 33, + "image": "qMXGWpEH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486388-lighthouse0001-0100.png", + "wallpapertype": 3 + }, + + { + "category": "Typography", + "description": "Always be yourself ❤️", + "downloads": "6754", + "id": 32, + "image": "ewJ0fYQr", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486351-bee.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Bridge through the mist 🌳", + "downloads": "6774", + "id": 645, + "image": "nFAQaw0h", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1723108025-forest waterfalls_2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Pinging for the enemies 🪖", + "downloads": "6701", + "id": 644, + "image": "FJLr4j6T", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1723108060-radar_2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Charting the unknown one map at a time 🧭", + "downloads": "18324", + "id": 509, + "image": "Q0igIXVA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1700978539-compass.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Gentle breezes and the turning of blades 🍃", + "downloads": "8983", + "id": 508, + "image": "ysKJIc51", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1700978311-windmill valley.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Decked boat dancing on ripples 🛶", + "downloads": "13654", + "id": 504, + "image": "OrfjM83b", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1700211939-boatreflection2k.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Dream it do it 🦄", + "downloads": "12236", + "id": 503, + "image": "oGkTW15v", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1700212340-dream.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Eternal hues dance in the void\u0027s embrace 🎗️", + "downloads": "32127", + "id": 501, + "image": "AH5k0P6g", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1699344949-gradstroke_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Every petal tells a story 🌸", + "downloads": "13810", + "id": 500, + "image": "rNv4fW6u", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1699344917-flowerbranch_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Nostalgia meets sound 🎶", + "downloads": "15172", + "id": 498, + "image": "n9VhFq3s", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1698050834-twoshaderecordplayer2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Neon tunnel ⚡", + "downloads": "14192", + "id": 497, + "image": "kVy928fx", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1698050818-room2K.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Stay on target 💫🛸", + "downloads": "20936", + "id": 496, + "image": "CoeM1An7", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1697521561-starfighter starwars_2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Lost in luminescence 🟩", + "downloads": "16625", + "id": 495, + "image": "mC6WLnhq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1697521556-cyberally_2k.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Colors in a mesmerizing dance 🎨", + "downloads": "17455", + "id": 483, + "image": "4DHhiegM", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1696497611-gradlines2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Life a flying plane with ever changing backdrop colors ✈️", + "downloads": "11865", + "id": 481, + "image": "P8S2Gopf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1696496990-planeexpand2K.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "This looks like a job for Superman 💪", + "downloads": "10963", + "id": 640, + "image": "EfkJFC2q", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1722262750-suoerman2k.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Gamer Zone ", + "downloads": "5937", + "id": 639, + "image": "jeavPVlk", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1722262736-gameover2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Neon Tunnel ⚡", + "downloads": "15158", + "id": 635, + "image": "hCUj7aN6", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1721293058-tunetunnel_2k0001-0300.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Gradient Hue 🔴", + "downloads": "6912", + "id": 634, + "image": "5LFc76e2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1721293053-gradient timerlinear_2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Analog warmth in a digital world 🎧", + "downloads": "8204", + "id": 623, + "image": "miEeOcTs", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1720429273-recordplayer2K.png", + "wallpapertype": 3 + }, + { + "category": "Retro", + "description": "Good old days 💻", + "downloads": "14702", + "id": 622, + "image": "N9KsFl3O", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1720429136-windowsxp2K.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Be calm as koi 🐟", + "downloads": "9404", + "id": 618, + "image": "BeIJvh3T", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1719476480-koi fish.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Edge lighting 🌈", + "downloads": "11309", + "id": 617, + "image": "3MqLDHgV", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1719476474-rgb frame.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Rise against the wind 🪁", + "downloads": "11620", + "id": 613, + "image": "Rw3mt7SW", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1718609085-kitevalley2K.png", + "wallpapertype": 3 + }, + { + "category": "Retro", + "description": "An inviting friend 🐈", + "downloads": "5581", + "id": 612, + "image": "3ToUh4n5", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1718609070-cattable2K.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "The Glitch", + "downloads": "5416", + "id": 608, + "image": "IQ432Vmq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1717667347-cubes2kmain0001-0350.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Pencil Pen and Rubber", + "downloads": "13328", + "id": 607, + "image": "BIZVzLhf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1717667297-computerportal2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Peanuts Snoopy ✈️", + "downloads": "21721", + "id": 479, + "image": "9X65KbOj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1695799095-snoopy.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Sponge loops 🧽", + "downloads": "9122", + "id": 478, + "image": "vWLsGClJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695799085-gradienttube_2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Desert nights where stars write their own stories 🌵", + "downloads": "17040", + "id": 476, + "image": "3T8jLvog", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695198738-pyramid star gaze.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Life\u0027s like a rolling ball on a track full of twists and turns ", + "downloads": "8669", + "id": 475, + "image": "D1NMe3so", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695198716-rolling ball2K.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "When in doubt nap it out - Snorlax\u0027s motto 💤", + "downloads": "23170", + "id": 473, + "image": "kDPZBVYW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1694594155-snorlax.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Enter the neon-lit future where beats and bytes collide ⚡", + "downloads": "14665", + "id": 472, + "image": "7t3pUOLY", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1694590930-retrodot_2k.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Mario time 💥", + "downloads": "18024", + "id": 470, + "image": "0hzyAtom", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1694076946-supermario2K.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Imagination is the limit 🧑🏻‍🚀🎈", + "downloads": "28778", + "id": 469, + "image": "0DaVbFgs", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1694076934-flying astronaut.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Melodic Vibrating Wires 🎸", + "downloads": "11127", + "id": 467, + "image": "oVmTNSUe", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1693380422-guitar.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Wind\u0027s Caress 🌼", + "downloads": "6041", + "id": 466, + "image": "XAYWrv2H", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1693380406-flower.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Sunlit meadows 🌲", + "downloads": "18514", + "id": 464, + "image": "1bjIgeUr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1692776611-vectorbirdscenery.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Quantum engine ⚡", + "downloads": "18174", + "id": 463, + "image": "LCYPha4j", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1692776605-cubeneon.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Magical Forest 🌙", + "downloads": "10444", + "id": 603, + "image": "3ZRN94cV", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1716827412-forestbrook2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Curved glass ✨", + "downloads": "14164", + "id": 602, + "image": "bnSzZRO0", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1716799592-rainbow_2k0001-0200.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "A feline farewell to daylight ☀️🐈", + "downloads": "12906", + "id": 598, + "image": "V7m6i1fw", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1715848167-cat_2k.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Embracing the subtle artistry of shades 🟠🟡🟢🔵", + "downloads": "7843", + "id": 597, + "image": "GnYQwXOT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1715848159-halfcircle_2k.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Star gazing 💫", + "downloads": "13899", + "id": 593, + "image": "fN82DWoX", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714984090-star gazing astronaut.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Through the window night whispers its secrets 🪟", + "downloads": "31153", + "id": 592, + "image": "x1sAjaXT", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714984080-outside window view.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "EVE 💓", + "downloads": "22127", + "id": 588, + "image": "IgLHh1Sk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714060538-eve_2K.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Propelling the colors 🌈", + "downloads": "10949", + "id": 587, + "image": "lhvpF8Rx", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1714060447-propeller_2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Never ending ☀️", + "downloads": "21092", + "id": 583, + "image": "rbA5MsC2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1713257200-retro sun rally.png", + "wallpapertype": 3 + }, + { + "category": "Retro", + "description": "Switch of an era 🎶", + "downloads": "21591", + "id": 582, + "image": "YKog49vH", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1713257189-ipod_2k.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Soul of the street painted in rain drops", + "downloads": "12640", + "id": 578, + "image": "2qtG1ZMH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1712388148-rainingsidewalk2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Circles shift into places", + "downloads": "7883", + "id": 577, + "image": "rekDpLvG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1712388120-move2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Fourfold Path", + "downloads": "8218", + "id": 461, + "image": "VKy4mqPT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1692167442-jlines2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Red Radiance ⭕", + "downloads": "19172", + "id": 460, + "image": "D0ZKbEIl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1692167428-energyfield2k.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Apple \u0027s Hello 👋🏻", + "downloads": "19110", + "id": 458, + "image": "HumJo4BE", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1691565388-hello2k.png", + "wallpapertype": 3 + }, + { + "category": "Retro", + "description": "Evening in the garage 🔧", + "downloads": "32082", + "id": 457, + "image": "irEbHd9Y", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1691565326-street2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Hiding in the shadows 🦇 Waiting to strike ⚡", + "downloads": "23746", + "id": 455, + "image": "wfUACS1t", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1690956632-batcave_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Lines of music 🎸", + "downloads": "10193", + "id": 454, + "image": "fayjwWkG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1690956236-two shade record player_2k.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Sliding cards 🎴", + "downloads": "11580", + "id": 452, + "image": "QncwPgzG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1690361489-jumping_shade_2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Thunder ⚡", + "downloads": "31019", + "id": 451, + "image": "iBepAVKk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1690361455-lightning2K.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "A captivating view that holds our gaze refusing to let go 🏞️", + "downloads": "10129", + "id": 449, + "image": "akJXn52S", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1689839410-cloudvalley2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Swirling into the hearts ➰", + "downloads": "20209", + "id": 448, + "image": "NWjAcdlJ", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1689838759-gradientloop2K.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Keep smiling until it\u0027s clear 📷", + "downloads": "13533", + "id": 446, + "image": "7iG4Usoh", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "camerafocus2k7676.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "The pop waves 🌊", + "downloads": "20111", + "id": 445, + "image": "WgRq68CP", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1689149442-waves.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Itachi Uchiha 🔥", + "downloads": "47419", + "id": 573, + "image": "EuWIeJiO", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1711352204-itachi_moon_2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Rise and grind 🍵", + "downloads": "17604", + "id": 572, + "image": "JOuItFm3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1711352182-coffee_cup_2K.png", + "wallpapertype": 3 + }, + { + "category": "Retro", + "description": "Record Play Repeat 🎤", + "downloads": "14541", + "id": 568, + "image": "69vNVpUj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1710404402-TeenageEngineering2K.png", + "wallpapertype": 3 + }, + { + "category": "Miscellaneous", + "description": "Pop out Pop in ⚽", + "downloads": "16221", + "id": 567, + "image": "TZUgQRtJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1710404359-cylinderballs2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Welcome to Arrakis ☀️", + "downloads": "17919", + "id": 563, + "image": "m31EhtRz", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1709535876-dune0001-0045.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Glimpse of parallel world 🌍", + "downloads": "18688", + "id": 562, + "image": "oVLnApSP", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1709535857-4 layer land.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Pulses to infinity ♾️", + "downloads": "17887", + "id": 558, + "image": "B2mpiW7j", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1708590245-lineexpand360.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Melting into the backdrops🔵", + "downloads": "13878", + "id": 557, + "image": "L3dv7UKW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1708590234-layerlava.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "They glow 🌙", + "downloads": "19554", + "id": 552, + "image": "CkdnroBR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1707727905-firefilebottle.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Harnessing the power ⚛️", + "downloads": "16133", + "id": 551, + "image": "DrNBnY6z", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1707727879-spherical2K.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Still a long way to go 🚶🏻‍♀️", + "downloads": "11983", + "id": 547, + "image": "JTL6lDty", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1706956207-long way_2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Atoms surfed the waves of fun ⚛️", + "downloads": "16729", + "id": 546, + "image": "JaRcbEiC", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1706956200-wavedots_2k.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "There\u0027s a way out 🌌", + "downloads": "40456", + "id": 443, + "image": "dgHwYSLM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1688456077-bk2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Rising blocks 🧱", + "downloads": "8798", + "id": 442, + "image": "rjLqdbJn", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1688456022-risingBlocks2K.png", + "wallpapertype": 3 + }, + { + "category": "Travel", + "description": "As the landscape unfolds outside the window 🚊", + "downloads": "14730", + "id": 440, + "image": "mqMsnKui", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1687675294-train doorwindow2k.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Fusion 🌀", + "downloads": "11282", + "id": 439, + "image": "KAVzISrB", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1687675278-test2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Era of gamers 🎮", + "downloads": "14820", + "id": 437, + "image": "bVjyp4hr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1686986248-tv2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Flowing qubits 💡", + "downloads": "11363", + "id": 436, + "image": "72WQsAgc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1686986110-dotlayer2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Sky shows the way ✨", + "downloads": "13406", + "id": 434, + "image": "Qirg9kAw", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1686295557-lighthouse2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "stripes 🔻", + "downloads": "18209", + "id": 433, + "image": "1FACemca", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1686295552-steplines2k.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Childhood memories 🕹️", + "downloads": "19855", + "id": 431, + "image": "jDKXMEw2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1685514859-gameboy_2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Catch the toast 🍞", + "downloads": "5430", + "id": 430, + "image": "U0FJ38hC", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1685514843-bread toaster_2k.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Beauty of late night snow ☃️", + "downloads": "27034", + "id": 428, + "image": "CA95YeWL", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1684743860-streetlight_2k.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Popping pops 🎉", + "downloads": "9486", + "id": 427, + "image": "xoP63fkn", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1684743824-stringingcolour_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "House\u0027s like a step 🪜", + "downloads": "6960", + "id": 542, + "image": "5Zv1adoC", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1705999571-merge houses.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Loops like domino ♦️", + "downloads": "17721", + "id": 541, + "image": "QMpWG2bY", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1705999547-morf lines.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Spaceship on a joy ride 🚀", + "downloads": "12519", + "id": 537, + "image": "mMaCO5Dp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1704961330-vector planet.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "A sunny beach day 🏖️", + "downloads": "9754", + "id": 536, + "image": "cnyDCeda", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1704961259-beach guard.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Happy New Year 🎆", + "downloads": "4631", + "id": 532, + "image": "PhMH24dz", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1704208922-happynewyear_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Quack quack 🦆", + "downloads": "23614", + "id": 531, + "image": "blzMJ4Ip", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1704208911-duck_2k.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Cubes Glide on Breeze 🟨", + "downloads": "9265", + "id": 528, + "image": "PpxmrE8C", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1703667173-cube cylinder_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Winter\u0027s Silent Whispers ☃️", + "downloads": "4833", + "id": 527, + "image": "MA8NXHL7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1703667129-snow globe.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Retro vibes ⚡", + "downloads": "16840", + "id": 523, + "image": "LyfTNpZr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1702654981-neon_lines_2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Seaside bliss framed in sunlight 🌊", + "downloads": "14632", + "id": 522, + "image": "xXNtEKmv", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1702654961-horizontal_landscape_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Winter embrace with snowflakes as delicate as whispered dreams ❄️☃️", + "downloads": "10265", + "id": 513, + "image": "NMmZzpDI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1701677478-colourful snowfall.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "A tapestry of seamless blending 🟥🟧🟨", + "downloads": "7989", + "id": 512, + "image": "bJs7kS5q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1701677467-square expanition flip.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Planets doing its job 🌍", + "downloads": "16227", + "id": 425, + "image": "kifBrWvn", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1684046356-solar_system_orange_2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Dancing with the flow 🙄", + "downloads": "26572", + "id": 424, + "image": "P1h65qJA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1684046241-red_black_2k_vbr2.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Vroooom 🚀", + "downloads": "26702", + "id": 422, + "image": "9mWULPBx", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1683189916-rocket.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Nearing the end of day ⛵", + "downloads": "15541", + "id": 421, + "image": "GqeN0UxH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1683189872-boatshadow_2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Trapped in unknown 💢 ", + "downloads": "13065", + "id": 419, + "image": "Qrvs6PAb", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "lineneon.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Fading ghost 👻", + "downloads": "29733", + "id": 418, + "image": "yiYvJB7c", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1682493720-movingghost_2k.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "A rainy night ☔", + "downloads": "68431", + "id": 416, + "image": "ZcCYk74p", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1681804057-rainingstreet.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Mirror reality 😎", + "downloads": "7271", + "id": 415, + "image": "rgALv9TE", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1681804030-flip.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Make a wish 💫", + "downloads": "31631", + "id": 413, + "image": "v48jd1uq", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1681201758-mountainskyview.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Frames of reality 🔮", + "downloads": "15110", + "id": 412, + "image": "XJK8uRe4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1681201744-frame2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Linking links 🔗", + "downloads": "8785", + "id": 410, + "image": "0ugr2XTF", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1680509340-rubber.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Cruising through the street 🚗", + "downloads": "19331", + "id": 409, + "image": "CegovyQJ", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1680509310-neoncity.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "I can wiggle wiggle 🌻🌵", + "downloads": "10645", + "id": 407, + "image": "4TERVbsO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1679896707-cactus.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Silky waves 🌊", + "downloads": "16259", + "id": 406, + "image": "KG3R7iX4", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1679896671-waves.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Best part of the day - Evening 🌆", + "downloads": "9277", + "id": 403, + "image": "sMcSilt2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1679204730-sunlightreflectionvbr1.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Expanding bubbles 🎈", + "downloads": "7193", + "id": 402, + "image": "OgYCR5WZ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1679204714-bubble.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "You are already under my genjutsu 🥷🏻", + "downloads": "133342", + "id": 400, + "image": "I9rPTLMw", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1678429646-itachiuchiha.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Let it go 😉", + "downloads": "10826", + "id": 399, + "image": "okXRmlH7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1678429628-letitgo.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Glitch ⚡", + "downloads": "9707", + "id": 397, + "image": "gvJl2drZ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1677823065-synth.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Looping trios 😎", + "downloads": "6160", + "id": 396, + "image": "67SLDahN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1677822985-twotripattern.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Fallen hero 😃", + "downloads": "28919", + "id": 394, + "image": "D4dkOoLq", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1677218914-among us_2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Sailing the evening wind ⛵", + "downloads": "10105", + "id": 393, + "image": "oKUqdwa1", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1677218894-lighthouse boat.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Flying above the grass 🍃", + "downloads": "8682", + "id": 390, + "image": "HcKWT93r", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1676443822-hotairballoon.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Waves within waves 😁", + "downloads": "18588", + "id": 389, + "image": "R84zOhsM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1676443809-circlestripes2K.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Gentleness of evening wind 🍃", + "downloads": "13770", + "id": 387, + "image": "o28DawGu", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1675674075-tricutreevalley.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "With me comes the tail ✈️", + "downloads": "33202", + "id": 386, + "image": "bMOCTl9N", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1675674061-planetail.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Yin and yang ☯", + "downloads": "7919", + "id": 384, + "image": "DYWXTiLx", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1674890254-yinyang2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Pulse of energy ⚡", + "downloads": "9623", + "id": 383, + "image": "Nh1ofe8P", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1674890229-wave2k.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Am I on the right planet 🧑🏻‍🚀", + "downloads": "29524", + "id": 381, + "image": "iQW8dSPH", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1674109405-Astrounaut on planet_2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Waves contained in a traingle 📐", + "downloads": "8373", + "id": 380, + "image": "kzDQR9JP", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1674109401-gradientframewave_2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Northern lights ☁", + "downloads": "20410", + "id": 378, + "image": "MDuYI51V", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1673154571-lines.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Neon drops 🌟", + "downloads": "19901", + "id": 377, + "image": "b1vrFOlV", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1673154563-raindrops.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Breathing cubes 🟩", + "downloads": "17639", + "id": 375, + "image": "YGXbzLM1", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1672397960-cubesmerge.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Sprint through cyber tunnel ⚡", + "downloads": "14289", + "id": 374, + "image": "HsjFeWJv", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1672397952-tunnel2K.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Window of time 🪟", + "downloads": "17742", + "id": 372, + "image": "oPxUq89D", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1671781199-frame.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Christmas time ❄️", + "downloads": "26055", + "id": 371, + "image": "59PsapVJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1671781190-lightsetchristmas_2k .png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "The seeds of the sacred tree 🍃", + "downloads": "21113", + "id": 369, + "image": "q7WLCVaM", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1670919451-avatar0601-1200.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Boo boo 👻", + "downloads": "23431", + "id": 368, + "image": "2G49hE5K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1670919440-pixelghost2k.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Line that divides dimension 🔮", + "downloads": "8405", + "id": 367, + "image": "OseuYg9c", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1670574738-flipbubbles2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ripples 🌊", + "downloads": "12342", + "id": 366, + "image": "fy6ijzpL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1670574723-speaker2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Energy orb ⚡", + "downloads": "25517", + "id": 352, + "image": "OloNzAQy", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1669881138-scifireactor.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Messing around with lines 🌈", + "downloads": "13971", + "id": 351, + "image": "ktlWo6YM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1669881134-lineplay.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Glitch in the matrix 💾", + "downloads": "37534", + "id": 350, + "image": "p3u7Osyn", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1669615907-matrix.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Colourful memories of old school 📼", + "downloads": "32147", + "id": 349, + "image": "HVKo2fx5", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1669615899-cassetterainbow.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "In search for life 🚀", + "downloads": "15434", + "id": 347, + "image": "zRWeQaAj", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1669098076-exoplanet.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Streaks through the cracks 🔦", + "downloads": "42678", + "id": 346, + "image": "2YdFqCme", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1669098067-bleedinglight.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Looking for the prey 🦅", + "downloads": "17104", + "id": 344, + "image": "ILohYjwu", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1668584410-treesabove.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ocean planet 😁", + "downloads": "32764", + "id": 343, + "image": "ToXANS7D", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1668584406-planetinocean.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Wind and flowers 🌷", + "downloads": "9931", + "id": 341, + "image": "9HPnwGeM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1668151041-flowerfield.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Light bars ⚡", + "downloads": "10833", + "id": 340, + "image": "AOLH63u2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1668151038-spectrum.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Up up and away ✈", + "downloads": "17367", + "id": 339, + "image": "sxVPWklG", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1667900451-planewindow.png", + "wallpapertype": 3 + }, + { + "category": "Pixel", + "description": "Torii ⛩", + "downloads": "17351", + "id": 338, + "image": "VYeXZAd4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667900441-japanesearch.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Pebble waves 🌌", + "downloads": "16096", + "id": 333, + "image": "f0tcegFG", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1667557680-chips.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Cornering stripes 🏁", + "downloads": "13463", + "id": 332, + "image": "jvMzuYBS", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667557670-turninglines.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "A day in city 🏙", + "downloads": "11885", + "id": 329, + "image": "uHbALW25", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1667146134-planeabove.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Pew pew 😁", + "downloads": "15250", + "id": 328, + "image": "bKT7ZB8v", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667146129-pewgun.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Simple as a flower 🌼", + "downloads": "7734", + "id": 327, + "image": "luVyJaZX", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666766421-flowerpot.png", + "wallpapertype": 3 + }, + + { + "category": "Geometry", + "description": "Bouncers ⭕", + "downloads": "8236", + "id": 300, + "image": "2PXEkfjJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664525996-twoshadeball.png", + "wallpapertype": 3 + }, + { + "category": "Pixel", + "description": "Festival vibe 🎆", + "downloads": "12369", + "id": 299, + "image": "cDJIejZY", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1664170966-pixelfireworks.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Swirl 🌀", + "downloads": "14260", + "id": 298, + "image": "NdU7By6V", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664170950-spriallines.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Trains are beautiful 🚄", + "downloads": "13239", + "id": 297, + "image": "cskeY8Fx", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1663832513-bridgetrain.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Magic below the blocks 🪄", + "downloads": "12364", + "id": 296, + "image": "m3i5XUIA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663832509-risingneon.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Make it count ⏳", + "downloads": "14671", + "id": 295, + "image": "KEUARZqg", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663568574-makeitcount3.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Just floating around 🌊", + "downloads": "13852", + "id": 294, + "image": "1UWTpG87", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1663568542-jellyfish1.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Gradient strings 🪡", + "downloads": "10977", + "id": 293, + "image": "NiCIf7nO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663217492-gradientline.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Way back home 🪟", + "downloads": "7507", + "id": 292, + "image": "DEBxzG9u", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663217494-window.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ring Planet 🌌", + "downloads": "47734", + "id": 285, + "image": "FrinSg37", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1662879807-saturn1.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Kinda spooky 🦇", + "downloads": "26097", + "id": 284, + "image": "i6GlZz4g", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662879788-spookyforest.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Disco floor 💃🏻", + "downloads": "10471", + "id": 283, + "image": "4tyKUwEl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662621794-discovibe.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Buzzing bees 🐝", + "downloads": "9126", + "id": 282, + "image": "JBg1PslY", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662621769-beehive.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Golden Gate Bridge 🌉", + "downloads": "14313", + "id": 281, + "image": "Aio6auR2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662355278-goldengatebridge.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "I solemnly swear that I am up to no good 🪄", + "downloads": "9892", + "id": 280, + "image": "q07B9wFL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662355270-footprint.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Above the clouds 🛩️", + "downloads": "16277", + "id": 279, + "image": "qYZW1Rv0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662008358-planeabovewater.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Halftone 🪄", + "downloads": "6331", + "id": 278, + "image": "4HyjqJlt", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662008355-Dots.png", + "wallpapertype": 3 + }, + { + "category": "Pixel", + "description": "Pixel warmth 🔥", + "downloads": "13832", + "id": 277, + "image": "hyzI7Pk3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1661751428-pixelcampfire.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Push and Pull 🥸", + "downloads": "5337", + "id": 276, + "image": "PiAKybTX", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1661751415-pushline.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Meow 🐈", + "downloads": "16366", + "id": 273, + "image": "i0E3UoF9", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1661490668-sleepingcat.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Crystal dimension 🤩", + "downloads": "17247", + "id": 272, + "image": "yCWtPghR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1661490666-animation81.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Hilltop holidays 🖖🏻", + "downloads": "5709", + "id": 271, + "image": "bC9oJ78l", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660751887-Hillhouse.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "The maze 🫣", + "downloads": "13626", + "id": 270, + "image": "eYlUWwG3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660751880-patternrgb.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Winter night ☃", + "downloads": "55895", + "id": 269, + "image": "rT350txs", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1660723718-snowapartment.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Minimal waves 🌊", + "downloads": "8365", + "id": 268, + "image": "jxsMPnZO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660723701-abstractwaves.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Weekend rides 🚙", + "downloads": "15007", + "id": 267, + "image": "2pHIefF3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660376766-sunsetride.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Entering the night 🌙", + "downloads": "6464", + "id": 266, + "image": "GrLxaBz5", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660376731-lighthousevector.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Go with the flow ⛵", + "downloads": "15836", + "id": 265, + "image": "ZIj76vOl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660118394-redboat.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Strings of reality ⭕", + "downloads": "22984", + "id": 264, + "image": "aiVWKcY1", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1660118383-contourarray.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Nature heals 🌳", + "downloads": "19023", + "id": 263, + "image": "PjXMoci9", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1659866405-fallleaves.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Clash of opposites 🌈", + "downloads": "8520", + "id": 262, + "image": "N8A1wHLX", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659866395-loopie.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Wire\u0027s connecting people 👕👖", + "downloads": "11849", + "id": 259, + "image": "xRM4ArGk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1659593345-hangingclothes.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Everything is energy ⚡", + "downloads": "35593", + "id": 258, + "image": "IN0nhgL4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659593329-circuit.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Waves of shades 🌊", + "downloads": "8988", + "id": 257, + "image": "qyIXY1ZG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1659335310-colourgrid6.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "It\u0027s fading 🤞🏻", + "downloads": "6495", + "id": 256, + "image": "beVy1x6O", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659335301-fadinglines1.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Domain Expansion 🤞🏻", + "downloads": "55325", + "id": 255, + "image": "PiQtZJen", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658994833-gojo1.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Face towards light 🌻", + "downloads": "13841", + "id": 254, + "image": "RHDuFAgb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1658994666-sunflower.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Night brings fear 🏰", + "downloads": "28856", + "id": 253, + "image": "nAKjYWZ3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658655062-nightcatle.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "The path isn\u0027t a straight line, it\u0027s a spiral 🌀", + "downloads": "17420", + "id": 252, + "image": "qVJI5SN0", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1658649402-crcfluid.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Through the unknown 🤐", + "downloads": "19806", + "id": 251, + "image": "zLp2Vj4x", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658385467-animation 670001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Endings are beautiful 🌇", + "downloads": "17405", + "id": 250, + "image": "NMy608Ya", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1658385460-sunset.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Glide through your dreams 🛩", + "downloads": "6136", + "id": 249, + "image": "EUqnwDWt", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1658134331-glider.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Strip\u0027s traffic 😉", + "downloads": "10830", + "id": 248, + "image": "kGB3yMqb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1658134320-grid1.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "To honour the time machine - James Webb Telescope", + "downloads": "17217", + "id": 247, + "image": "n5cMUxgb", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1657812000-galaxy.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Life is a journey 🚗 ", + "downloads": "7788", + "id": 246, + "image": "yZvaUhFu", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657811993-lifejourney.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Comfort of home 🌃", + "downloads": "20284", + "id": 245, + "image": "BCT9fx3h", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1657517940-window scape new.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Home is where plants are🪴", + "downloads": "17135", + "id": 244, + "image": "5Vu7v1yp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1657517928-leaves1.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Make a wish 🌠", + "downloads": "40387", + "id": 243, + "image": "cLVaypI2", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657291661-shootingstar.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Flocking beams ⚡", + "downloads": "19099", + "id": 242, + "image": "578AbrmR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1657291653-dots.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Raining colors 🌧", + "downloads": "34561", + "id": 241, + "image": "yWAg8i4Q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1657031337-rainbowrain.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Looping loops ⭕", + "downloads": "5955", + "id": 240, + "image": "Oi8ofNPb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657031328-circle.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Cruising the unknown 🚀", + "downloads": "24491", + "id": 239, + "image": "AFY4hrK0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1656773205-rocketnew.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Monolith of energy ⚡", + "downloads": "18018", + "id": 238, + "image": "nXOH7dPa", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1656773192-trianglewaves.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Blow 💨", + "downloads": "9642", + "id": 237, + "image": "YwJ2fH5V", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1656482859-paperwindmill.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Fusion 🌀", + "downloads": "25882", + "id": 236, + "image": "RQt2913o", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1656482849-Energyfield.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Land of dreams 🌳", + "downloads": "40565", + "id": 235, + "image": "jkobCr5V", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1656235975-butterflygreen.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Blazing through the tunnel ⚡", + "downloads": "39397", + "id": 234, + "image": "Fa8NqnjJ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1656235972-circletunnel23.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Chilling through the countryside 🚙", + "downloads": "12497", + "id": 233, + "image": "rzTJdu4Q", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655976665-countrydrive.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Shades of sun 🕶", + "downloads": "8436", + "id": 232, + "image": "Xwz4GZqr", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1655976648-colour_1.png", + "wallpapertype": 3 + }, + + { + "category": "Movies", + "description": "Stay Out Of My Territory - Heisenberg ⚗️", + "downloads": "28476", + "id": 227, + "image": "NbxPlFc3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655190766-breaking bad.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Old school 🎧", + "downloads": "26803", + "id": 225, + "image": "S6F4TnJ7", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1655189835-walkman.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "It\u0027s my turn 🔥", + "downloads": "92346", + "id": 224, + "image": "K6ySTF5k", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654933736-gokuhair.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Being minimal 😉", + "downloads": "32791", + "id": 223, + "image": "h4Z5OQDq", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1654933732-snowfall.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Enjoy the smell of rain ☔", + "downloads": "12485", + "id": 222, + "image": "1VcGN9RO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654668060-rainvector.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Trying to connect 😉", + "downloads": "9309", + "id": 221, + "image": "ZUkGF4Ez", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654668052-roundewave.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Spring is nature\u0027s way of saying let\u0027s party 🌄", + "downloads": "6956", + "id": 220, + "image": "LMBHkEXS", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1654413275-landscape.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Digital branches ⚡", + "downloads": "31536", + "id": 219, + "image": "wzT3YAxH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654413266-simdots.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Beginning of the Hawkin\u0027s curse 🎃", + "downloads": "96580", + "id": 218, + "image": "VKpGv0RL", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1654161170-vecnahouse.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Summer waves 🌊", + "downloads": "6533", + "id": 217, + "image": "Q0HK57si", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1654161159-wavvve.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Life is like a roller coaster, live it, be happy, enjoy life 🎢", + "downloads": "11891", + "id": 216, + "image": "tUuqKWn5", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1653896481-rollercoster40.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Dustin , Do you copy 😉", + "downloads": "15823", + "id": 215, + "image": "EBMK7NTF", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653896478-walkietalkie.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Through the hurdles ⚡", + "downloads": "24404", + "id": 214, + "image": "wQ37vMgz", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1653546875-animation56.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Today is your day 😁", + "downloads": "19519", + "id": 213, + "image": "VnoQmB5a", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653546861-today.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Rotary cards 🎴", + "downloads": "47420", + "id": 212, + "image": "a0TEy1IM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1653291520-roundedsquare2.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "In one drop of water are found all the secrets of all the oceans", + "downloads": "16073", + "id": 211, + "image": "k6uprVsf", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1653291509-boattrip6.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Converging stripes ⭕", + "downloads": "7242", + "id": 210, + "image": "e1Evxh7K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1653028917-cutcircle2.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Dropping frames 📐", + "downloads": "14824", + "id": 209, + "image": "9QDqL4BM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653028915-framerotate2.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Comfort of home 🏡", + "downloads": "50495", + "id": 208, + "image": "nG0Qs51U", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652767860-livingroom.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Ice and fire 🔥❄️", + "downloads": "15892", + "id": 207, + "image": "eNWAYdob", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652767839-zig.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Cozy summer 🏖️", + "downloads": "16156", + "id": 206, + "image": "zE9R6gSG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652337222-seawave.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Mirror dimension 🪄", + "downloads": "4103", + "id": 205, + "image": "Ukx7qj3K", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1652337215-cutsphere.png", + "wallpapertype": 3 + }, + + { + "category": "Landscape", + "description": "Mining the coins 🪙", + "downloads": "19665", + "id": 196, + "image": "CeFq9Owm", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1651215776-mining.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Flipping cards 🎴", + "downloads": "21405", + "id": 195, + "image": "5mXc9s83", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651215762-tilewave.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Blue Planet 🔵", + "downloads": "95474", + "id": 194, + "image": "osJuAmep", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1651049003-planet007.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Droplets 💧", + "downloads": "6104", + "id": 193, + "image": "TMiOn2da", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651048971-droppattern.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Way back home 🚦", + "downloads": "21282", + "id": 192, + "image": "nCfxJUEd", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650866841-traffic light.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ghost Rider 🔥", + "downloads": "28949", + "id": 191, + "image": "agjLlwE3", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650866838-skullnew.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Wakeup call 🍵", + "downloads": "15116", + "id": 190, + "image": "5zsv48Oi", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650692872-windownearsubway.png", + "wallpapertype": 3 + }, + + + { + "category": "Pattern", + "description": "Circling ⭕", + "downloads": "10382", + "id": 164, + "image": "M3w0tZxG", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1648446785-pluspattern.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Confused steps 🤭", + "downloads": "13653", + "id": 163, + "image": "Xi0J6UdY", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648310198-contour.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Taking rest is also being productive 💤", + "downloads": "20668", + "id": 162, + "image": "M8qTZGFQ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1648195234-restisproductive.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "I\u0027m in love with the grass 🌳", + "downloads": "16630", + "id": 161, + "image": "uHybICne", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1648112120-grasscutter0001-0310.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "The Eighty\u0027s Vibe 🕺 ", + "downloads": "16953", + "id": 160, + "image": "9hoTBQZL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648112112-animation380001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "I think I\u0027m superman\u0027s favorite 💚", + "downloads": "8838", + "id": 159, + "image": "Oox1TRYe", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1647851269-supperman0001-0093.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Confused ghost 👻", + "downloads": "15853", + "id": 158, + "image": "joyRhH14", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1647851266-panghost.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Joy of smiley\u0027s 😉", + "downloads": "3987", + "id": 157, + "image": "m7hJcMwv", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1647760634-smiley.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Hide and seek with the cats 😸", + "downloads": "18341", + "id": 156, + "image": "BLck8Qrx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647760632-cats.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "The Resistance ski speeder 🔥", + "downloads": "33573", + "id": 155, + "image": "qm6kevX7", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1647590528-starwars0080-0240.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Gift from nature 🌊", + "downloads": "24805", + "id": 154, + "image": "opYn9biL", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647590523-waterfall.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Rainbow effect 🌈", + "downloads": "29502", + "id": 153, + "image": "IrWp7Pok", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1647418463-circlingrainbowhigh.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Through the town road 🤠", + "downloads": "4135", + "id": 152, + "image": "Gvj8U5RM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647418455-cowbo45.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "There is something you have to protect ⚔️", + "downloads": "19655", + "id": 150, + "image": "9FzEXMxC", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1647246742-nezukobox.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Beats ⚡", + "downloads": "10892", + "id": 149, + "image": "cqWTe6jN", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647246737-greenanim.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Countryside are always refreshing 🏡", + "downloads": "7561", + "id": 148, + "image": "dGAhZSgC", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646986493-house 3.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Chores of the city 🌇", + "downloads": "7860", + "id": 147, + "image": "prKe6Qwu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646986489-sidetrain.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Joy of celebration 🎉", + "downloads": "16140", + "id": 146, + "image": "L4VbOsYe", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646986481-fireworkview.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Feeling the calm 📻", + "downloads": "50154", + "id": 145, + "image": "KbaDizGu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646888235-windowview.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Through the warp tunnel 🚀", + "downloads": "19924", + "id": 144, + "image": "xVDSuvjo", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646888230-animation390001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Winter cave 🪵", + "downloads": "5577", + "id": 143, + "image": "YfFaywoH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646725986-foresthouse.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Juicy slices 🍉", + "downloads": "5634", + "id": 142, + "image": "CUgLfE0M", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646725977-watermelon.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Love for old 🎷", + "downloads": "22506", + "id": 141, + "image": "fshCMoKF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646500025-musictape.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Joy of baloons 🎈", + "downloads": "4514", + "id": 140, + "image": "4aNESDct", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646500005-baloon.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Camping nights ⛺", + "downloads": "17785", + "id": 139, + "image": "YzMrhTdj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646306068-snowforest.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Gamer\u0027s paradise 👨🏻‍💻", + "downloads": "28767", + "id": 138, + "image": "brocN6Da", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646306064-pc.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "Batmobile in Action 🦇", + "downloads": "26251", + "id": 137, + "image": "0oKr7TM4", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1646123484-batmobile.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Gateway to the metaverse ⚡️", + "downloads": "10402", + "id": 136, + "image": "ATgbnVti", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646123475-animation33.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Trying to meet the ends 😁", + "downloads": "3460", + "id": 135, + "image": "E39sJtD8", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646123470-tripattern.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "On a date 🦇 🐱", + "downloads": "41699", + "id": 134, + "image": "sUMx4igS", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1645948957-thebatman.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Being retro 🕺", + "downloads": "5221", + "id": 133, + "image": "Y5EsZt9h", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645948953-animation330001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Beats 💓", + "downloads": "32496", + "id": 132, + "image": "UJN3sn7G", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1645948947-heartbeat.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Weekend life 🎣", + "downloads": "21075", + "id": 131, + "image": "UHGgV6xz", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645689678-fishingboat.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Pokeball ❤️", + "downloads": "29725", + "id": 130, + "image": "gf98ksKa", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645689676-pokeball0001-0100.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Colour Blades 💚", + "downloads": "7661", + "id": 129, + "image": "byXhakCg", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645689669-yellowpanel.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Serene Night ✨", + "downloads": "23302", + "id": 128, + "image": "MG6JrH1F", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645601780-windmillill.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Pac Man 🕹", + "downloads": "42164", + "id": 127, + "image": "wZWDOt1x", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645601772-pacman.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Cube of Wisdom ⚡", + "downloads": "15387", + "id": 126, + "image": "6nPkafpA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645601756-icecube.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Run with the stripes 💜", + "downloads": "12677", + "id": 125, + "image": "54nkHS0T", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645515883-intercutline.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Cyber Planet ", + "downloads": "7650", + "id": 124, + "image": "FdBayDEC", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645515875-animation620001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Gaming", + "description": "Love\u0027s clicking ⌨️", + "downloads": "51051", + "id": 123, + "image": "Kuj9oSd4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645515864-key0001-0247.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Rings and Rings ✌🏻", + "downloads": "28938", + "id": 122, + "image": "NVcnSvTy", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1645515845-vectorgalaxy.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Vroom Vroom 🏎️", + "downloads": "7868", + "id": 121, + "image": "OCXNm04f", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645259201-car0001-0150.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Meow Meow 🐱", + "downloads": "7582", + "id": 120, + "image": "UauRwNgt", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645259197-catdoodles.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Core of the ancient magic 🔮", + "downloads": "8480", + "id": 119, + "image": "QHtIJZqr", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645259194-cubetemp0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Curly curly 🖤", + "downloads": "2843", + "id": 118, + "image": "J0YFxAoq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645173539-zigzag.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Solve the riddle 🔮", + "downloads": "5099", + "id": 117, + "image": "cxm8NBsl", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645173533-ancientartifact.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Just charging 🔋", + "downloads": "9093", + "id": 116, + "image": "6h5i7aTK", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645173517-justcharging.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Rainbow rain 🌈", + "downloads": "4098", + "id": 115, + "image": "A0xUfN6E", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645173469-rainbowcloud.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Imagination is important than knowledge 🔬", + "downloads": "7391", + "id": 114, + "image": "u0sL3bFq", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645087072-galaxyhouse.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Magic steps 🔮", + "downloads": "4093", + "id": 113, + "image": "FTQVdDNo", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645087070-arr0040-0119.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Dancing dots 💚", + "downloads": "2173", + "id": 112, + "image": "wb9c0oGx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645000768-circlesplashpattern.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Train\u0027s coming 🚞", + "downloads": "9956", + "id": 111, + "image": "JcweovKf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645000755-train0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Follow the wave ⚡", + "downloads": "13076", + "id": 110, + "image": "E9LzS5PG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645000748-Comp2dot.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Sprouting forest 🌳", + "downloads": "2845", + "id": 109, + "image": "qefFvO0a", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644653266-colourtree.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Where are the humans 🛸", + "downloads": "14777", + "id": 108, + "image": "xtTe6CAl", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644653255-ufo.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Hello anybody home 🚀", + "downloads": "27032", + "id": 107, + "image": "EmrYWiA1", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644653245-blackhole.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Error ", + "downloads": "24550", + "id": 106, + "image": "cofEiJ9d", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644653226-error.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Disco disco 🕺", + "downloads": "3723", + "id": 105, + "image": "0tExmCbu", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644653213-animation 210001-0240.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Loving the queit life 🏡", + "downloads": "3643", + "id": 104, + "image": "Af0esPFS", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566689-hotair.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Sailing through the horizon ⛵", + "downloads": "7979", + "id": 103, + "image": "eBdwiH6f", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566665-oceanboat.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Lava lamp ☮️", + "downloads": "14879", + "id": 102, + "image": "l01wioFT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566624-lavalamp.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Realm of cubes ▪️◻️◾◼️", + "downloads": "7134", + "id": 101, + "image": "hAe9R7wf", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566610-decube.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Waves 💜", + "downloads": "7413", + "id": 100, + "image": "MWjAhRZF", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566581-gradientwave.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Every action has a reaction 🤓", + "downloads": "16880", + "id": 99, + "image": "9kC2wZUn", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644566566-pend.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Dots dots go away 😜", + "downloads": "5505", + "id": 98, + "image": "UoYrjhKc", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566535-dotarray.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Tik tok Tik tok ⏳", + "downloads": "3457", + "id": 97, + "image": "i3xABMhj", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644566514-rotateballs.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Feeling the rain 🌧️", + "downloads": "13316", + "id": 96, + "image": "H59OQqzb", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566465-girl in rain.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Camping folks ⛺", + "downloads": "13276", + "id": 84, + "image": "gYska4tH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643356780-camp fire.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Night sky ✨", + "downloads": "11100", + "id": 83, + "image": "xtVHQ5qX", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643356776-night shy.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Creating memories in the snow, one angel at a time ☃️❄️", + "downloads": "1936", + "id": 705, + "image": "rX1J9fqj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1733126052-snow angel_2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Christmas time for snoopy ❄️☃️", + "downloads": "1220", + "id": 704, + "image": "85IPsh6E", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1733125861-snoopy house_2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "The wave of joy 🌊", + "downloads": "7106", + "id": 182, + "image": "nYb783FD", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1649835082-wave.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "The opposite pairs 😉", + "downloads": "11237", + "id": 181, + "image": "g4NZzoAl", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1649835076-dna.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Roll into adventure with BB-8 💫", + "downloads": "1886", + "id": 700, + "image": "HDabQGWh", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1732175087-BB-8_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Chasing the breeze ⛵", + "downloads": "1682", + "id": 699, + "image": "31HPOwuK", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1732175071-waving boat_2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Let\u0027s Bravo 💪🏻", + "downloads": "3553", + "id": 695, + "image": "x3rgHsu0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1731314484-johnny bravo_2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Energy tiles ⚡", + "downloads": "1964", + "id": 694, + "image": "35VZSQ2q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1731314477-cybersandwich_2k0001-0350.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "From the shadows, I rise 🕷✨", + "downloads": "4665", + "id": 690, + "image": "7tphTLSA", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1730447376-spiderman noir_2k.png", + "wallpapertype": 3 + }, + { + "category": "Miscellaneous", + "description": "Under the watchful eye of the moon, she rides the night 🌕✨🧙‍♀️", + "downloads": "2033", + "id": 689, + "image": "l8rWAa52", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1730447262-witch night_2k.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "Moon 🌕", + "downloads": "5277", + "id": 685, + "image": "EDVQUOwk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1729501659-moon_2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Boo want to be scary👻 ", + "downloads": "3210", + "id": 684, + "image": "PUW2EhR0", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1729501572-ghostwind_2k.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Someone\u0027s being cooked 🪦", + "downloads": "2618", + "id": 680, + "image": "eQTYlByI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1728551180-graveyard_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Woo hahaha 🎃🕯️", + "downloads": "2211", + "id": 679, + "image": "Wwu1pX5t", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1728551171-pumkin candle_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Monsoon cocktail 🍸", + "downloads": "2692", + "id": 675, + "image": "XHRV2kop", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1727687143-cocktail_2k.png", + "wallpapertype": 3 + }, + { + "category": "Space", + "description": "The red planet 🌍", + "downloads": "3070", + "id": 674, + "image": "vufNpc9r", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1727687132-planet landscape_2k.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Ace Burner ♠️♥️♦️♣️", + "downloads": "7229", + "id": 670, + "image": "bHAg0sop", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1726732728-card on fire_2k.png", + "wallpapertype": 3 + }, + { + "category": "Cityscape", + "description": "Golden Gate Bridge 🌉", + "downloads": "4815", + "id": 669, + "image": "NBfadl9x", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1726732699-golden gate bridge view_2k.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "The core ⚡", + "downloads": "6344", + "id": 665, + "image": "si2RCIbU", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1725870751-hexogen_2k.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Radiate like flowers 🌼", + "downloads": "3406", + "id": 664, + "image": "K6zaDsGx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1725870736-fadingflowers_2k.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Spider Glitch 🕸️", + "downloads": "11606", + "id": 660, + "image": "qducAoan", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1724917214-spiderlogoglitch_2k.png", + "wallpapertype": 3 + }, + { + "category": "Tech", + "description": "Give your device some power surge ⚡", + "downloads": "5455", + "id": 659, + "image": "Ob9d70IC", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1724917204-generator_2k.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Autonomous Ultra Instinct 🔥", + "downloads": "20255", + "id": 655, + "image": "9f0Cepkb", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1724059272-gokuultrainstinct2k.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "⭕ pop out ⭕", + "downloads": "4045", + "id": 654, + "image": "Hogh0Jt3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1724059263-cylinder2k0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Wiggly wiggly 😁", + "downloads": "11687", + "id": 82, + "image": "ku28xKdm", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1643356768-deform.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Where\u0027s my mouse 🤔", + "downloads": "7843", + "id": 81, + "image": "ijQndh5H", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643356755-old computer0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Dope", + "description": "Enter the metaverse⚡", + "downloads": "14561", + "id": 79, + "image": "pY1Fq7tw", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643271285-animation 450001-0200.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Busy riding the sands 🌵", + "downloads": "11250", + "id": 78, + "image": "cM85T0jo", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643010196-car0001-0247.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Atoms play 🔬", + "downloads": "3933", + "id": 77, + "image": "FgTs76uc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643010160-animation 250001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "I am vengeance 🔥", + "downloads": "79041", + "id": 76, + "image": "lRNOhvxW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643010123-batman.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Vibe 🕺", + "downloads": "4625", + "id": 75, + "image": "86ixr5kA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643010117-vibe.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Warp drive through the vaccum ✨", + "downloads": "22782", + "id": 74, + "image": "tFNP0Ywm", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1643010114-erer.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Need a bucket to collect all these 🪣", + "downloads": "22076", + "id": 73, + "image": "FGPpaDgu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642839034-playstation symbol0250-0499.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Fabric of reality 😉", + "downloads": "10565", + "id": 71, + "image": "jVHDdWh6", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752256-dot 1.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Enjoying through the woods 🚗", + "downloads": "19355", + "id": 70, + "image": "4Oiby2ms", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752242-night forest ride0001-0150.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Don\u0027t tell anyone about this base 🚀", + "downloads": "4460", + "id": 69, + "image": "clMvD7o4", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752214-pyramid0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Festival of light 🕯️", + "downloads": "11457", + "id": 68, + "image": "ABnsbwC3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642750093-lanterns0118-1000.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Searching for glaciers ☹️", + "downloads": "7258", + "id": 67, + "image": "32yZIpDV", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642750069-boat ride.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Rengoku🔥", + "downloads": "51805", + "id": 66, + "image": "IVLv624U", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642750053-rengoku.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Spiral of spectrum 🌈", + "downloads": "5468", + "id": 65, + "image": "u6lHZCQF", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642750022-circle0001-0200.png", + "wallpapertype": 3 + }, + { + "category": "Geometry", + "description": "Antigravity keeps me floating⚡", + "downloads": "4770", + "id": 64, + "image": "JKvqt5Pa", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642750008-dune0001-0150.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Through the pulses 🔮 .", + "downloads": "9721", + "id": 63, + "image": "CBy8i1kc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642749980-worm hole0001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Booo Booo 👻", + "downloads": "79317", + "id": 62, + "image": "VflzaU4B", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642749968-ghost.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Countryside 🚜", + "downloads": "7608", + "id": 61, + "image": "N20IdgeG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642749960-farmhouse0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Be a percent better everyday 💚", + "downloads": "43680", + "id": 60, + "image": "EDLpF1YJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642668016-1better.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "WIndmill 🍃", + "downloads": "6871", + "id": 59, + "image": "AY4nRzhf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667421-windmill0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Founding Titan", + "downloads": "14549", + "id": 58, + "image": "SbVr2TeA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667392-Aot.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Ride by the river 🚗", + "downloads": "7984", + "id": 57, + "image": "gDf0iX2S", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667356-night ride0001-0150.png", + "wallpapertype": 3 + }, + { + "category": "Superheroes", + "description": "God of thunder⚡", + "downloads": "30090", + "id": 56, + "image": "0TIqwLE7", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642667341-thor.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Exploring the deep waters 🌊", + "downloads": "8687", + "id": 55, + "image": "kfMaSvZ4", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642667334-sub0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Cyber waves 💜", + "downloads": "6689", + "id": 54, + "image": "ZP4qMsQe", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642491028-shape10001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Hoping for Dr Strange to come 😉", + "downloads": "18501", + "id": 53, + "image": "VR4E6smB", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642491015-strange portal.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Have fun at the carnival 🎡", + "downloads": "13168", + "id": 52, + "image": "z4bn3Hlk", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642491005-carnival0001-0500.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Pink flower ", + "downloads": "7908", + "id": 51, + "image": "VPIEWTYB", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490992-flower.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Feel the pulse 😊", + "downloads": "10718", + "id": 50, + "image": "41gcyMYN", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490982-cube0001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Cat love 🐈", + "downloads": "9241", + "id": 49, + "image": "Om2nPfBg", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490976-cat.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Have a good day 😎", + "downloads": "5768", + "id": 48, + "image": "Q0Ironk1", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642490971-coffee.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Magic Flower 💙", + "downloads": "6247", + "id": 47, + "image": "T3YR9Wnf", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490964-blue flower.png", + "wallpapertype": 3 + }, + { + "category": "Abstract", + "description": "Waveform 🖤", + "downloads": "15265", + "id": 46, + "image": "HpqY1Qxd", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642490957-shape0001-0120.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Ultra Instinct 🔥", + "downloads": "70321", + "id": 45, + "image": "mV5S6Qko", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642490947-goku ultra.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Planet love 🌍", + "downloads": "16894", + "id": 44, + "image": "VZ6i51qI", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490937-planet.png", + "wallpapertype": 3 + }, + { + "category": "Typography", + "description": "Loading ...... ", + "downloads": "13881", + "id": 43, + "image": "5kdBMGiW", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490932-loading.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Color popping jet 🌈", + "downloads": "7164", + "id": 42, + "image": "iGXD8kwI", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490923-jet.png", + "wallpapertype": 3 + }, + + { + "category": "Landscape", + "description": "Climb the hill 💙", + "downloads": "7916", + "id": 31, + "image": "4ldD89Fn", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486325-ropeway.png", + "wallpapertype": 3 + }, + + + { + "category": "Minimal", + "description": "Dance with the cactus 🌵", + "downloads": "6398", + "id": 30, + "image": "6BiDZEWA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486262-catcus.png", + "wallpapertype": 3 + }, + + + { + "category": "Amoled", + "description": "Ball of fire 🔥", + "downloads": "20861", + "id": 29, + "image": "gLiRYKEk", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486187-geometryball0001-0250.png", + "wallpapertype": 3 + }, + + { + "category": "Abstract", + "description": "The Watcher ⚡", + "downloads": "15915", + "id": 180, + "image": "rcGDtH4i", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649662069-animation 470001-0250.png", + "wallpapertype": 3 + }, + { + "category": "Movies", + "description": "Banana 🍌", + "downloads": "30165", + "id": 179, + "image": "7f3Bsx60", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1649661826-minions.png", + "wallpapertype": 3 + }, + { + "category": "Nature", + "description": "Soothing of sea ⛵", + "downloads": "30550", + "id": 178, + "image": "3fabqR4C", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649485172-sunset boat.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Glide with the cards 💜", + "downloads": "12076", + "id": 177, + "image": "JcHhSQiF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649485125-trianglewave.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Keep calm and play 🎧", + "downloads": "23149", + "id": 176, + "image": "Ve8GXgvF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649322136-cassette.png", + "wallpapertype": 3 + }, + { + "category": "Anime", + "description": "Awakening the dragon 🔥", + "downloads": "24039", + "id": 175, + "image": "sLUpavix", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1649322130-dragonball.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "The Eighty\u0027s 🕺", + "downloads": "10381", + "id": 174, + "image": "UHF3y6E7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649137233-dotshigh.png", + "wallpapertype": 3 + }, + { + "category": "Amoled", + "description": "Raining triangles ⚡️", + "downloads": "16841", + "id": 231, + "image": "Wg13hPZz", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655713095-triangs.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "A day in the desert 🌵", + "downloads": "8885", + "id": 230, + "image": "CATQUy6K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1655713087-materialdesert.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Nature has it\u0027s own secrets 🍃", + "downloads": "27997", + "id": 229, + "image": "NfUDOu0K", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1655452812-fantasyland.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Catch with the lines 🤐", + "downloads": "7333", + "id": 228, + "image": "UNgGb3f6", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1655452805-justlines.png", + "wallpapertype": 3 + }, + { + "category": "Pattern", + "description": "Squares are on a trip 😉", + "downloads": "10223", + "id": 173, + "image": "fi49c06E", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1649137222-squares.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "Journey through the color valley 🌈", + "downloads": "26208", + "id": 172, + "image": "xNAUw4vm", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1648970974-plane.png", + "wallpapertype": 3 + }, + { + "category": "Material", + "description": "Rhythm of the circles 💜 ", + "downloads": "17511", + "id": 171, + "image": "582tpb6m", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648711049-circlegrad.png", + "wallpapertype": 3 + }, + { + "category": "Minimal", + "description": "There\u0027s two sides for everything 😇", + "downloads": "12718", + "id": 170, + "image": "OqL53EQk", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1648711046-minimalsun.png", + "wallpapertype": 3 + }, + { + "category": "Landscape", + "description": "Spooky 🎃", + "downloads": "87567", + "id": 25, + "image": "BHMsxl02", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1639590645-halloween2021.png", + "wallpapertype": 3 + } +] \ No newline at end of file diff --git a/app/src/main/assets/Shift.json b/app/src/main/assets/Shift.json new file mode 100644 index 0000000..13215d9 --- /dev/null +++ b/app/src/main/assets/Shift.json @@ -0,0 +1,1037 @@ +[ + { + "category": "Geometry", + "description": "Harmony unfolds 🟦", + "downloads": "5555", + "id": 539, + "image": "48YVaEuq", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1705651353-cuberotate2k.png", + "wallpapertype": 2 + }, + { + "category": "Nature", + "description": "Day switch ☀️🌙", + "downloads": "3386", + "id": 535, + "image": "8J7czLSB", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1704703062-window sunrise.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Looping to position 💫", + "downloads": "3050", + "id": 534, + "image": "pvYL4hFO", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1704703054-expandingcircle.png", + "wallpapertype": 2 + }, + { + "category": "Landscape", + "description": "Once upon a time in the woods 🌳", + "downloads": "2961", + "id": 530, + "image": "hnseFk3Z", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1703947630-home_bush_2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Popping up 🎈", + "downloads": "2338", + "id": 529, + "image": "WOXEH5D4", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1703947537-popping_colors_2k.png", + "wallpapertype": 2 + }, + { + "category": "Movies", + "description": "It\u0027s a warning 🦇", + "downloads": "9634", + "id": 525, + "image": "sZoI6gRf", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702968393-bat signal.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Shades shuffle fun begins 🎨", + "downloads": "2795", + "id": 524, + "image": "GeONUQ6J", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702967787-circleshift.png", + "wallpapertype": 2 + }, + { + "category": "Pattern", + "description": "Feel the gentle shift 🍃", + "downloads": "4692", + "id": 521, + "image": "z9GA6cHW", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702286051-cylinder2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Rising sun ☀️", + "downloads": "2985", + "id": 520, + "image": "rwi1MSsY", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702286038-raising sun.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "I am Ironman 💪🏻", + "downloads": "1326", + "id": 703, + "image": "ICzHuLJP", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1732780381-ironman neon_2k.png", + "wallpapertype": 2 + }, + + { + "category": "Minimal", + "description": "Tower house 🗼", + "downloads": "591", + "id": 698, + "image": "xsjW8gvY", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1731915691-tower_2k.png", + "wallpapertype": 2 + }, + { + "category": "Nature", + "description": "Crayon Mountains Popping 🖍️", + "downloads": "674", + "id": 697, + "image": "t3mSRDCL", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1731915688-colour mountain_2k.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Synth pyramid 📐", + "downloads": "1553", + "id": 693, + "image": "x38Pp6Vr", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1731050705-trineon_2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Falling waves 🌊", + "downloads": "792", + "id": 692, + "image": "yYkH9Vq0", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1731050684-circle to layer_2k.png", + "wallpapertype": 2 + }, + { + "category": "Movies", + "description": "Darth Vader ⚡", + "downloads": "2206", + "id": 688, + "image": "ouPNjUaG", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1730105713-dark vader_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Boooo 👻", + "downloads": "1070", + "id": 687, + "image": "9uTM4ACd", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1730105705-Boo_2k.png", + "wallpapertype": 2 + }, + { + "category": "Miscellaneous", + "description": "Knock knock , Who is there ? 🧛", + "downloads": "1886", + "id": 683, + "image": "KO0uSwXC", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1729154624-opening door_2k.png", + "wallpapertype": 2 + }, + { + "category": "Miscellaneous", + "description": "Way to October vacation 🎃🏰 ", + "downloads": "889", + "id": 682, + "image": "JNEV0mit", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1729151449-haunted mansion_2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Be precise as an arrow ▶️ ", + "downloads": "1534", + "id": 678, + "image": "L0bF283S", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1728292173-slidingtile_2k.png", + "wallpapertype": 2 + }, + { + "category": "Landscape", + "description": "Desert Shift 🌵☀️", + "downloads": "1361", + "id": 677, + "image": "S5dMltrq", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1728292118-desertdunes2K.png", + "wallpapertype": 2 + }, + { + "category": "Pattern", + "description": "The curves 😎", + "downloads": "2478", + "id": 673, + "image": "o6e9FsQv", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1727341664-curvedlines2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Good old days 💾", + "downloads": "1559", + "id": 672, + "image": "lx845U6Q", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1727341650-pc2k.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "Spidey zips down 🕸️", + "downloads": "3520", + "id": 668, + "image": "F8hIbuJ4", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1726475725-spidermanhanging2k.png", + "wallpapertype": 2 + }, + { + "category": "Pet", + "description": "Cutie Penguin 🐧", + "downloads": "1474", + "id": 667, + "image": "Tcntw8bH", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1726475712-penguinface2k.png", + "wallpapertype": 2 + }, + { + "category": "Anime", + "description": "⚡Thunder Breathing 1st form⚡", + "downloads": "3094", + "id": 663, + "image": "bAJ08nia", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1725522176-zenitsu_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Don a pair of Air Jordans 👟", + "downloads": "1921", + "id": 662, + "image": "OXSLmJtw", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1725522167-nike shoe_2k.png", + "wallpapertype": 2 + }, + { + "category": "Geometry", + "description": "Building blocks 🟪🟥", + "downloads": "1274", + "id": 658, + "image": "DmvYtg80", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1724667176-blocks2K.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Pop and mix 🎉", + "downloads": "1549", + "id": 657, + "image": "7EmxM1jV", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1724667168-bubbles2K.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "Wolverine ☠️", + "downloads": "4756", + "id": 653, + "image": "FYVlR1NU", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1723713273-wolverine2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Jiggle Jiggle 🍬", + "downloads": "1994", + "id": 652, + "image": "LCc5pKIB", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1723713251-Gradientpalette2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Any one can be a king 👑", + "downloads": "2395", + "id": 643, + "image": "fDpQxayu", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1722847957-chess2k.png", + "wallpapertype": 2 + }, + { + "category": "Pet", + "description": "Kitty gang 🐈🐾", + "downloads": "1439", + "id": 642, + "image": "MlpP4B0S", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1722847942-catpaw2K.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "Deadpool and Wolverine 🔥", + "downloads": "6087", + "id": 638, + "image": "ncBUSZ2L", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1721896129-DeadpoolWolverine2K.png", + "wallpapertype": 2 + }, + { + "category": "Cityscape", + "description": "A new day begins 🪟", + "downloads": "2436", + "id": 637, + "image": "jIEJ9BA1", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1721896117-throughwindow1_2K.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "A summer morning 🏡", + "downloads": "2073", + "id": 633, + "image": "XFlIokSP", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1721032986-Dayflip2K.png", + "wallpapertype": 2 + }, + { + "category": "Space", + "description": "Saturn spins adorned with dazzling rings 🌌", + "downloads": "10756", + "id": 545, + "image": "H2aKjmDL", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1706514413-ringplanet_2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Evolving circles ⭕", + "downloads": "7355", + "id": 544, + "image": "ZyDusM4P", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1706513923-circleblow_2k.png", + "wallpapertype": 2 + }, + { + "category": "Landscape", + "description": "Shifting Serenity Views 🏠", + "downloads": "2885", + "id": 540, + "image": "C8g7pe24", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1705651363-newlandscapehouse2k.png", + "wallpapertype": 2 + }, + + { + "category": "Amoled", + "description": "On Off 😎", + "downloads": "5914", + "id": 632, + "image": "QVtPCovm", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1721032969-onoff2K.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "Hiding in the shadows 🦇", + "downloads": "7283", + "id": 621, + "image": "YXD8CmeA", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1720085732-batman_2k.png", + "wallpapertype": 2 + }, + + { + "category": "Minimal", + "description": "Rolling to destiny 🎱", + "downloads": "4790", + "id": 561, + "image": "qC4psWve", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1709273956-billiard2k.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Petals jiggle in the breeze 🌸", + "downloads": "10406", + "id": 560, + "image": "bHiwXdo2", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1709273946-openflower2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Day night shift ☀️🌕", + "downloads": "5157", + "id": 556, + "image": "Mlc9oRVH", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1708333651-sunturn.png", + "wallpapertype": 2 + }, + { + "category": "Typography", + "description": "Locked Unlocked 🔒🔓", + "downloads": "11009", + "id": 554, + "image": "Av4VI0qC", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1708332444-unlocked.png", + "wallpapertype": 2 + }, + { + "category": "Landscape", + "description": "Bright arid landscape 🌵", + "downloads": "3443", + "id": 550, + "image": "4aYWQKNS", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1707475758-desert2K.png", + "wallpapertype": 2 + }, + { + "category": "Geometry", + "description": "Rings align ⭕", + "downloads": "4777", + "id": 549, + "image": "pidgYrxB", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1707475745-loopsNew2K.png", + "wallpapertype": 2 + }, + + + + + + + { + "category": "Abstract", + "description": "Orange slices 🟠", + "downloads": "2433", + "id": 606, + "image": "1PtmB6il", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1717395427-orange circle_2k0001-0050.png", + "wallpapertype": 2 + }, + { + "category": "Pattern", + "description": "Falling stripes 🎨", + "downloads": "2070", + "id": 605, + "image": "tfs0AY7l", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1717395410-linerundown_2k.png", + "wallpapertype": 2 + }, + { + "category": "Anime", + "description": "Itadori x Sukuna 🔥", + "downloads": "8954", + "id": 601, + "image": "lrUWHFvP", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1716449636-itadoriandzukuna.png", + "wallpapertype": 2 + }, + { + "category": "Pattern", + "description": "Navigate the maze 🧩", + "downloads": "3419", + "id": 600, + "image": "DxkCl7iq", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1716449627-rectanglelines.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Landscape shift 🖼️", + "downloads": "2727", + "id": 596, + "image": "KtN2sG5w", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1715584110-framezoom2k.png", + "wallpapertype": 2 + }, + { + "category": "Typography", + "description": "Good Vibes Only 😁", + "downloads": "2733", + "id": 595, + "image": "zO5ksKJV", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1715584105-goodvibeonly2k.png", + "wallpapertype": 2 + }, + { + "category": "Gaming", + "description": "Gameboy inside out 🪛", + "downloads": "6698", + "id": 591, + "image": "QjGb2vy5", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1714639479-gameboy_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "3 Body Problem ☀️☀️☀️", + "downloads": "2845", + "id": 590, + "image": "zdQN8P3W", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1714639448-3 body problem_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Spring call 🌸", + "downloads": "3753", + "id": 586, + "image": "pL0kMy1C", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1713773909-flowerbranch.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Glitch in existence 🪩", + "downloads": "6597", + "id": 585, + "image": "WeAF2qJm", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1713773884-glitch man0001-0035.png", + "wallpapertype": 2 + }, + { + "category": "Cityscape", + "description": "Pop into existence 🏘", + "downloads": "1301", + "id": 581, + "image": "6r81al3P", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1712997465-risingtown2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Form the Palette 🎨", + "downloads": "2866", + "id": 580, + "image": "0sXSAFkj", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1712997453-linesmmove2k.png", + "wallpapertype": 2 + }, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "category": "Geometry", + "description": "Growing bubbles 🫧", + "downloads": "2656", + "id": 519, + "image": "WEf1JHFZ", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702285284-growingbubble.png", + "wallpapertype": 2 + }, + + + + + + + + + + + + + + + + + + + + + + + + { + "category": "Material", + "description": "Sliding square ⏹", + "downloads": "5871", + "id": 518, + "image": "hOGIEMqX", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1702285263-sliding_square.png", + "wallpapertype": 2 + }, + + + + + + + + + + + + + + + + + + + + + + + { + "category": "Geometry", + "description": "Intertwined cubes ", + "downloads": "5396", + "id": 517, + "image": "Bc20n43T", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1702285251-roundedcube2k.png", + "wallpapertype": 2 + }, + { + "category": "Nature", + "description": "Let it bloom 💮", + "downloads": "3282", + "id": 516, + "image": "W1XC0yrb", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702285229-flower2K.png", + "wallpapertype": 2 + }, + + + + + + + + + + + + + + + + { + "category": "Miscellaneous", + "description": "Swirl into the green void ", + "downloads": "5267", + "id": 515, + "image": "kPY95NQo", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1702285213-lays2K.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Windows 7", + "downloads": "758", + "id": 702, + "image": "fGSUEenP", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1732780372-windows 7_2k.png", + "wallpapertype": 2 + }, + { + "category": "Material", + "description": "Sticky notes 📒", + "downloads": "2103", + "id": 620, + "image": "YJD7LnCX", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1720085704-square2k.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Get scared 🙀", + "downloads": "2846", + "id": 616, + "image": "rZLjIRhE", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1719215549-glitchskull2K.png", + "wallpapertype": 2 + }, + { + "category": "Landscape", + "description": "The switch 🌵", + "downloads": "1847", + "id": 615, + "image": "vD7QEWG1", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1719215546-desertdune2K.png", + "wallpapertype": 2 + }, + { + "category": "Superheroes", + "description": "Spidey sense ⚡", + "downloads": "9491", + "id": 611, + "image": "lgX9Ano5", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1718267939-spiderman_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Happy for the sunlight ☀️", + "downloads": "1836", + "id": 610, + "image": "tkKnUw0l", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1718267930-sunlight plant_2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Morning brew ☕️", + "downloads": "5436", + "id": 576, + "image": "VUPXYARh", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1711962964-coffeecup2k.png", + "wallpapertype": 2 + }, + { + "category": "Geometry", + "description": "Shifting to place", + "downloads": "3785", + "id": 575, + "image": "58hJ1Nr6", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1711962940-cubes2k0001-0050.png", + "wallpapertype": 2 + }, + { + "category": "Space", + "description": "You never know what is on other side 🌌", + "downloads": "8644", + "id": 571, + "image": "7BbSo6rh", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1711087406-blackHole2K_new.png", + "wallpapertype": 2 + }, + { + "category": "Amoled", + "description": "Choose your card ♥️♣️♦️♠️", + "downloads": "7814", + "id": 570, + "image": "1KzDkET8", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1711087377-cards2K.png", + "wallpapertype": 2 + }, + { + "category": "Anime", + "description": "Feel pain, contemplate pain, accept pain, know pain 🍃", + "downloads": "15354", + "id": 566, + "image": "TDObkX4i", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1710142587-pain2k.png", + "wallpapertype": 2 + }, + { + "category": "Pattern", + "description": "Drops that freeze in time 💧", + "downloads": "2622", + "id": 565, + "image": "q04esM6p", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1710142568-cutlines2k.png", + "wallpapertype": 2 + }, + { + "category": "Minimal", + "description": "Christmas tree brings warmth and joy 🎄❄️", + "downloads": "306", + "id": 708, + "image": "91FmL0Jl", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1733734622-christmas tree_2k.png", + "wallpapertype": 2 + }, + { + "category": "Miscellaneous", + "description": "Santa 🎅🏻", + "downloads": "260", + "id": 707, + "image": "ajNEZA8D", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1733734615-santa_2k.png", + "wallpapertype": 2 + }, + { + "category": "Abstract", + "description": "Wafer hues 🔴🟡", + "downloads": "3539", + "id": 514, + "image": "Sf1wL0E6", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1702285186-yellowlayer.png", + "wallpapertype": 2 + } +] \ No newline at end of file diff --git a/app/src/main/assets/Trending.json b/app/src/main/assets/Trending.json new file mode 100644 index 0000000..97928e9 --- /dev/null +++ b/app/src/main/assets/Trending.json @@ -0,0 +1,4834 @@ +[ + { + "category": "Nature", + "description": "Nearing the end of day ⛵", + "downloads": "15541", + "id": 421, + "image": "GqeN0UxH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1683189872-boatshadow_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ripples ⭕", + "downloads": "62835", + "id": 197, + "image": "xtrPQmnY", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1651467012-drops.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Travel through time ⏳", + "downloads": "23381", + "id": 319, + "image": "lzmt7owB", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1665764832-rgbfinal.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Silky waves 🌊", + "downloads": "16259", + "id": 406, + "image": "KG3R7iX4", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1679896671-waves.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Land of dreams 🌳", + "downloads": "40565", + "id": 235, + "image": "jkobCr5V", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1656235975-butterflygreen.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Life a flying plane with ever changing backdrop colors ✈️", + "downloads": "11866", + "id": 481, + "image": "P8S2Gopf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1696496990-planeexpand2K.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Keep smiling until it\u0027s clear 📷", + "downloads": "13533", + "id": 446, + "image": "7iG4Usoh", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "camerafocus2k7676.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Eat drink and be scary 🎃", + "downloads": "21949", + "id": 324, + "image": "UXmzNlDI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666457699-cementry330.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Kinda spooky 🦇", + "downloads": "26097", + "id": 284, + "image": "i6GlZz4g", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662879788-spookyforest.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Blazing through the tunnel ⚡", + "downloads": "39397", + "id": 234, + "image": "Fa8NqnjJ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1656235972-circletunnel23.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Breathing cubes 🟩", + "downloads": "17639", + "id": 375, + "image": "YGXbzLM1", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1672397960-cubesmerge.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Hide and seek with the cats 😸", + "downloads": "18342", + "id": 156, + "image": "BLck8Qrx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647760632-cats.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Pokeball ❤️", + "downloads": "29725", + "id": 130, + "image": "gf98ksKa", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645689676-pokeball0001-0100.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "The Eighty\u0027s Vibe 🕺 ", + "downloads": "16953", + "id": 160, + "image": "9hoTBQZL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648112112-animation380001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "I\u0027m in love with the grass 🌳", + "downloads": "16630", + "id": 161, + "image": "uHybICne", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1648112120-grasscutter0001-0310.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "A day in the desert 🌵", + "downloads": "8885", + "id": 230, + "image": "CATQUy6K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1655713087-materialdesert.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "The Watcher ⚡", + "downloads": "15915", + "id": 180, + "image": "rcGDtH4i", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649662069-animation 470001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Shades of sun 🕶", + "downloads": "8436", + "id": 232, + "image": "Xwz4GZqr", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1655976648-colour_1.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Taking rest is also being productive 💤", + "downloads": "20668", + "id": 162, + "image": "M8qTZGFQ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1648195234-restisproductive.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Trying to connect 😉", + "downloads": "9309", + "id": 221, + "image": "ZUkGF4Ez", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654668052-roundewave.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "It\u0027s fading 🤞🏻", + "downloads": "6495", + "id": 256, + "image": "beVy1x6O", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659335301-fadinglines1.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Rhythm of the circles 💜 ", + "downloads": "17511", + "id": 171, + "image": "582tpb6m", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648711049-circlegrad.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Hilltop holidays 🖖🏻", + "downloads": "5709", + "id": 271, + "image": "bC9oJ78l", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660751887-Hillhouse.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "You are already under my genjutsu 🥷🏻", + "downloads": "133346", + "id": 400, + "image": "I9rPTLMw", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1678429646-itachiuchiha.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Itachi Uchiha 🔥", + "downloads": "47422", + "id": 573, + "image": "EuWIeJiO", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1711352204-itachi_moon_2K.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Any technique is worthless before my eyes ⚔️", + "downloads": "113536", + "id": 303, + "image": "o8O5Zjg9", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1664871083-itachiuchiha2.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "A rainy night ☔", + "downloads": "68432", + "id": 416, + "image": "ZcCYk74p", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1681804057-rainingstreet.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Through the window night whispers its secrets 🪟", + "downloads": "31153", + "id": 592, + "image": "x1sAjaXT", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714984080-outside window view.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "There\u0027s a way out 🌌", + "downloads": "40457", + "id": 443, + "image": "dgHwYSLM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1688456077-bk2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Eternal hues dance in the void\u0027s embrace 🎗️", + "downloads": "32127", + "id": 501, + "image": "AH5k0P6g", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1699344949-gradstroke_2k.png", + "wallpapertype": 0 + }, + { + "category": "Retro", + "description": "Evening in the garage 🔧", + "downloads": "32082", + "id": 457, + "image": "irEbHd9Y", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1691565326-street2k.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Autonomous Ultra Instinct 🔥", + "downloads": "20256", + "id": 655, + "image": "9f0Cepkb", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1724059272-gokuultrainstinct2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Thunder ⚡", + "downloads": "31019", + "id": 451, + "image": "iBepAVKk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1690361455-lightning2K.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "EVE 💓", + "downloads": "22128", + "id": 588, + "image": "IgLHh1Sk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714060538-eve_2K.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Imagination is the limit 🧑🏻‍🚀🎈", + "downloads": "28778", + "id": 469, + "image": "0DaVbFgs", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1694076934-flying astronaut.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "When in doubt nap it out - Snorlax\u0027s motto 💤", + "downloads": "23170", + "id": 473, + "image": "kDPZBVYW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1694594155-snorlax.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Peanuts Snoopy ✈️", + "downloads": "21721", + "id": 479, + "image": "9X65KbOj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1695799095-snoopy.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ring Planet 🌌", + "downloads": "47734", + "id": 285, + "image": "FrinSg37", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1662879807-saturn1.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Hiding in the shadows 🦇 Waiting to strike ⚡", + "downloads": "23746", + "id": 455, + "image": "wfUACS1t", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1690956632-batcave_2k.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Stay on target 💫🛸", + "downloads": "20936", + "id": 496, + "image": "CoeM1An7", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1697521561-starfighter starwars_2k.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Dancing with the flow 🙄", + "downloads": "26572", + "id": 424, + "image": "P1h65qJA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1684046241-red_black_2k_vbr2.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Vroooom 🚀", + "downloads": "26702", + "id": 422, + "image": "9mWULPBx", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1683189916-rocket.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Welcome to Arrakis ☀️", + "downloads": "17919", + "id": 563, + "image": "m31EhtRz", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1709535876-dune0001-0045.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Rise and grind 🍵", + "downloads": "17604", + "id": 572, + "image": "JOuItFm3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1711352182-coffee_cup_2K.png", + "wallpapertype": 0 + }, + { + "category": "Retro", + "description": "Switch of an era 🎶", + "downloads": "21591", + "id": 582, + "image": "YKog49vH", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1713257189-ipod_2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Quack quack 🦆", + "downloads": "23616", + "id": 531, + "image": "blzMJ4Ip", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1704208911-duck_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Never ending ☀️", + "downloads": "21092", + "id": 583, + "image": "rbA5MsC2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1713257200-retro sun rally.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Streaks through the cracks 🔦", + "downloads": "42679", + "id": 346, + "image": "2YdFqCme", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1669098067-bleedinglight.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "It\u0027s my turn 🔥", + "downloads": "92347", + "id": 224, + "image": "K6ySTF5k", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654933736-gokuhair.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Make a wish 💫", + "downloads": "31632", + "id": 413, + "image": "v48jd1uq", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1681201758-mountainskyview.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Beginning of the Hawkin\u0027s curse 🎃", + "downloads": "96580", + "id": 218, + "image": "VKpGv0RL", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1654161170-vecnahouse.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Show me where is the enemy ", + "downloads": "44977", + "id": 322, + "image": "25QVbcyG", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1666073442-erenyeager.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Fading ghost 👻", + "downloads": "29733", + "id": 418, + "image": "yiYvJB7c", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1682493720-movingghost_2k.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Glitch in the matrix 💾", + "downloads": "37534", + "id": 350, + "image": "p3u7Osyn", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1669615907-matrix.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "With me comes the tail ✈️", + "downloads": "33202", + "id": 386, + "image": "bMOCTl9N", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1675674061-planetail.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "They glow 🌙", + "downloads": "19554", + "id": 552, + "image": "CkdnroBR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1707727905-firefilebottle.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Pulses to infinity ♾️", + "downloads": "17887", + "id": 558, + "image": "B2mpiW7j", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1708590245-lineexpand360.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Love for RGB ⌨️", + "downloads": "39427", + "id": 320, + "image": "5ZVq6Prd", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1665764837-keys50.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Fallen hero 😃", + "downloads": "28919", + "id": 394, + "image": "D4dkOoLq", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1677218914-among us_2k.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Neon Tunnel ⚡", + "downloads": "15158", + "id": 635, + "image": "hCUj7aN6", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1721293058-tunetunnel_2k0001-0300.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Loops like domino ♦️", + "downloads": "17722", + "id": 541, + "image": "QMpWG2bY", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1705999547-morf lines.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Domain Expansion 🤞🏻", + "downloads": "55327", + "id": 255, + "image": "PiQtZJen", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658994833-gojo1.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Am I on the right planet 🧑🏻‍🚀", + "downloads": "29524", + "id": 381, + "image": "iQW8dSPH", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1674109405-Astrounaut on planet_2k.png", + "wallpapertype": 0 + }, + { + "category": "Retro", + "description": "Good old days 💻", + "downloads": "14702", + "id": 622, + "image": "N9KsFl3O", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1720429136-windowsxp2K.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Charting the unknown one map at a time 🧭", + "downloads": "18324", + "id": 509, + "image": "Q0igIXVA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1700978539-compass.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Colourful memories of old school 📼", + "downloads": "32147", + "id": 349, + "image": "HVKo2fx5", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1669615899-cassetterainbow.png", + "wallpapertype": 0 + }, + { + "category": "Miscellaneous", + "description": "Pop out Pop in ⚽", + "downloads": "16221", + "id": 567, + "image": "TZUgQRtJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1710404359-cylinderballs2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ocean planet 😁", + "downloads": "32765", + "id": 343, + "image": "ToXANS7D", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1668584406-planetinocean.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Atoms surfed the waves of fun ⚛️", + "downloads": "16729", + "id": 546, + "image": "JaRcbEiC", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1706956200-wavedots_2k.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Harnessing the power ⚛️", + "downloads": "16134", + "id": 551, + "image": "DrNBnY6z", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1707727879-spherical2K.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Retro vibes ⚡", + "downloads": "16840", + "id": 523, + "image": "LyfTNpZr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1702654981-neon_lines_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Curved glass ✨", + "downloads": "14165", + "id": 602, + "image": "bnSzZRO0", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1716799592-rainbow_2k0001-0200.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Swirling into the hearts ➰", + "downloads": "20209", + "id": 448, + "image": "NWjAcdlJ", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1689838759-gradientloop2K.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Blue Planet 🔵", + "downloads": "95474", + "id": 194, + "image": "osJuAmep", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1651049003-planet007.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Red Radiance ⭕", + "downloads": "19173", + "id": 460, + "image": "D0ZKbEIl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1692167428-energyfield2k.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Colors in a mesmerizing dance 🎨", + "downloads": "17455", + "id": 483, + "image": "4DHhiegM", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1696497611-gradlines2k.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Apple \u0027s Hello 👋🏻", + "downloads": "19111", + "id": 458, + "image": "HumJo4BE", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1691565388-hello2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "The pop waves 🌊", + "downloads": "20111", + "id": 445, + "image": "WgRq68CP", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1689149442-waves.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Star gazing 💫", + "downloads": "13899", + "id": 593, + "image": "fN82DWoX", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1714984090-star gazing astronaut.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Sunlit meadows 🌲", + "downloads": "18514", + "id": 464, + "image": "1bjIgeUr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1692776611-vectorbirdscenery.png", + "wallpapertype": 0 + }, + { + "category": "Retro", + "description": "Record Play Repeat 🎤", + "downloads": "14541", + "id": 568, + "image": "69vNVpUj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1710404402-TeenageEngineering2K.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Mario time 💥", + "downloads": "18024", + "id": 470, + "image": "0hzyAtom", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1694076946-supermario2K.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Pencil Pen and Rubber", + "downloads": "13329", + "id": 607, + "image": "BIZVzLhf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1717667297-computerportal2k.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Quantum engine ⚡", + "downloads": "18174", + "id": 463, + "image": "LCYPha4j", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1692776605-cubeneon.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Lost in luminescence 🟩", + "downloads": "16625", + "id": 495, + "image": "mC6WLnhq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1697521556-cyberally_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Desert nights where stars write their own stories 🌵", + "downloads": "17040", + "id": 476, + "image": "3T8jLvog", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695198738-pyramid star gaze.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Christmas time ❄️", + "downloads": "26055", + "id": 371, + "image": "59PsapVJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1671781190-lightsetchristmas_2k .png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "A feline farewell to daylight ☀️🐈", + "downloads": "12906", + "id": 598, + "image": "V7m6i1fw", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1715848167-cat_2k.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Childhood memories 🕹️", + "downloads": "19855", + "id": 431, + "image": "jDKXMEw2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1685514859-gameboy_2k.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Spider Glitch 🕸️", + "downloads": "11607", + "id": 660, + "image": "qducAoan", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1724917214-spiderlogoglitch_2k.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Melting into the backdrops🔵", + "downloads": "13878", + "id": 557, + "image": "L3dv7UKW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1708590234-layerlava.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Seaside bliss framed in sunlight 🌊", + "downloads": "14632", + "id": 522, + "image": "xXNtEKmv", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1702654961-horizontal_landscape_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Energy orb ⚡", + "downloads": "25517", + "id": 352, + "image": "OloNzAQy", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1669881138-scifireactor.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Nostalgia meets sound 🎶", + "downloads": "15172", + "id": 498, + "image": "n9VhFq3s", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1698050834-twoshaderecordplayer2k.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Soul of the street painted in rain drops", + "downloads": "12640", + "id": 578, + "image": "2qtG1ZMH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1712388148-rainingsidewalk2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Rise against the wind 🪁", + "downloads": "11621", + "id": 613, + "image": "Rw3mt7SW", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1718609085-kitevalley2K.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "stripes 🔻", + "downloads": "18209", + "id": 433, + "image": "1FACemca", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1686295552-steplines2k.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "This looks like a job for Superman 💪", + "downloads": "10964", + "id": 640, + "image": "EfkJFC2q", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1722262750-suoerman2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Edge lighting 🌈", + "downloads": "11309", + "id": 617, + "image": "3MqLDHgV", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1719476474-rgb frame.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Boo boo 👻", + "downloads": "23431", + "id": 368, + "image": "2G49hE5K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1670919440-pixelghost2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "The dead shall raise 💀", + "downloads": "26938", + "id": 326, + "image": "YBsEl3bd", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1666766418-walkingskeleton.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Neon tunnel ⚡", + "downloads": "14192", + "id": 497, + "image": "kVy928fx", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1698050818-room2K.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Cruising through the street 🚗", + "downloads": "19331", + "id": 409, + "image": "CegovyQJ", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1680509310-neoncity.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Decked boat dancing on ripples 🛶", + "downloads": "13655", + "id": 504, + "image": "OrfjM83b", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1700211939-boatreflection2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Every petal tells a story 🌸", + "downloads": "13810", + "id": 500, + "image": "rNv4fW6u", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1699344917-flowerbranch_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Enter the neon-lit future where beats and bytes collide ⚡", + "downloads": "14666", + "id": 472, + "image": "7t3pUOLY", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1694590930-retrodot_2k.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Spaceship on a joy ride 🚀", + "downloads": "12519", + "id": 537, + "image": "mMaCO5Dp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1704961330-vector planet.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Still a long way to go 🚶🏻‍♀️", + "downloads": "11983", + "id": 547, + "image": "JTL6lDty", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1706956207-long way_2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Propelling the colors 🌈", + "downloads": "10949", + "id": 587, + "image": "lhvpF8Rx", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1714060447-propeller_2K.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Northern lights ☁", + "downloads": "20410", + "id": 378, + "image": "MDuYI51V", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1673154571-lines.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Magical Forest 🌙", + "downloads": "10444", + "id": 603, + "image": "3ZRN94cV", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1716827412-forestbrook2K.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "The seeds of the sacred tree 🍃", + "downloads": "21113", + "id": 369, + "image": "q7WLCVaM", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1670919451-avatar0601-1200.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Everything is energy ⚡", + "downloads": "35593", + "id": 258, + "image": "IN0nhgL4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659593329-circuit.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Neon drops 🌟", + "downloads": "19901", + "id": 377, + "image": "b1vrFOlV", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1673154563-raindrops.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Planets doing its job 🌍", + "downloads": "16227", + "id": 425, + "image": "kifBrWvn", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1684046356-solar_system_orange_2k.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Make a wish 🌠", + "downloads": "40387", + "id": 243, + "image": "cLVaypI2", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657291661-shootingstar.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Waves within waves 😁", + "downloads": "18588", + "id": 389, + "image": "R84zOhsM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1676443809-circlestripes2K.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Dream it do it 🦄", + "downloads": "12236", + "id": 503, + "image": "oGkTW15v", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1700212340-dream.png", + "wallpapertype": 0 + }, + { + "category": "Travel", + "description": "As the landscape unfolds outside the window 🚊", + "downloads": "14730", + "id": 440, + "image": "mqMsnKui", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1687675294-train doorwindow2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Era of gamers 🎮", + "downloads": "14820", + "id": 437, + "image": "bVjyp4hr", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1686986248-tv2k.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Be calm as koi 🐟", + "downloads": "9404", + "id": 618, + "image": "BeIJvh3T", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1719476480-koi fish.png", + "wallpapertype": 0 + }, + + { + "category": "Dope", + "description": "Frames of reality 🔮", + "downloads": "15110", + "id": 412, + "image": "XJK8uRe4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1681201744-frame2k.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Countryside 🏕", + "downloads": "22600", + "id": 306, + "image": "Pl1uckY0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1665245461-nightgrass1.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Window of time 🪟", + "downloads": "17742", + "id": 372, + "image": "oPxUq89D", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1671781199-frame.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Sky shows the way ✨", + "downloads": "13406", + "id": 434, + "image": "Qirg9kAw", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1686295557-lighthouse2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Comfort of home 🏡", + "downloads": "50495", + "id": 208, + "image": "nG0Qs51U", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652767860-livingroom.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Air drops 🪂", + "downloads": "22613", + "id": 301, + "image": "Bdq0uYwg", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1664526005-forestairdrop.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Winter embrace with snowflakes as delicate as whispered dreams ❄️☃️", + "downloads": "10265", + "id": 513, + "image": "NMmZzpDI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1701677478-colourful snowfall.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Rotary cards 🎴", + "downloads": "47420", + "id": 212, + "image": "a0TEy1IM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1653291520-roundedsquare2.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Analog warmth in a digital world 🎧", + "downloads": "8205", + "id": 623, + "image": "miEeOcTs", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1720429273-recordplayer2K.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "A sunny beach day 🏖️", + "downloads": "9754", + "id": 536, + "image": "cnyDCeda", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1704961259-beach guard.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Raining colors 🌧", + "downloads": "34561", + "id": 241, + "image": "yWAg8i4Q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1657031337-rainbowrain.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Home sweet home 🌎", + "downloads": "65003", + "id": 185, + "image": "SXkQLevp", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650263209-solarsystem30.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Warm beginning 🌄", + "downloads": "54617", + "id": 198, + "image": "6M4yxFB2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1651467020-birdsflying.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Wormhole 🚀", + "downloads": "19846", + "id": 323, + "image": "g3SMjGI8", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1666357791-looper51.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Melodic Vibrating Wires 🎸", + "downloads": "11127", + "id": 467, + "image": "oVmTNSUe", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1693380422-guitar.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "✖️⭕", + "downloads": "20094", + "id": 321, + "image": "kfISWXG6", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666073451-glitchface.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Sliding cards 🎴", + "downloads": "11580", + "id": 452, + "image": "QncwPgzG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1690361489-jumping_shade_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ace Burner ♠️♥️♦️♣️", + "downloads": "7229", + "id": 670, + "image": "bHAg0sop", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1726732728-card on fire_2k.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Trapped in unknown 💢 ", + "downloads": "13065", + "id": 419, + "image": "Qrvs6PAb", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "lineneon.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Cubes Glide on Breeze 🟨", + "downloads": "9265", + "id": 528, + "image": "PpxmrE8C", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1703667173-cube cylinder_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Night brings fear 🏰", + "downloads": "28856", + "id": 253, + "image": "nAKjYWZ3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658655062-nightcatle.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Looking for the prey 🦅", + "downloads": "17104", + "id": 344, + "image": "ILohYjwu", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1668584410-treesabove.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Up up and away ✈", + "downloads": "17367", + "id": 339, + "image": "sxVPWklG", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1667900451-planewindow.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Embracing the subtle artistry of shades 🟠🟡🟢🔵", + "downloads": "7843", + "id": 597, + "image": "GnYQwXOT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1715848159-halfcircle_2k.png", + "wallpapertype": 0 + }, + { + "category": "Pixel", + "description": "Torii ⛩", + "downloads": "17351", + "id": 338, + "image": "VYeXZAd4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667900441-japanesearch.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Fusion 🌀", + "downloads": "11282", + "id": 439, + "image": "KAVzISrB", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1687675278-test2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Circles shift into places", + "downloads": "7883", + "id": 577, + "image": "rekDpLvG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1712388120-move2k.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Flowing qubits 💡", + "downloads": "11363", + "id": 436, + "image": "72WQsAgc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1686986110-dotlayer2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Gentle breezes and the turning of blades 🍃", + "downloads": "8983", + "id": 508, + "image": "ysKJIc51", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1700978311-windmill valley.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Gentleness of evening wind 🍃", + "downloads": "13770", + "id": 387, + "image": "o28DawGu", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1675674075-tricutreevalley.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Bridge through the mist 🌳", + "downloads": "6774", + "id": 645, + "image": "nFAQaw0h", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1723108025-forest waterfalls_2k.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Gradient Hue 🔴", + "downloads": "6912", + "id": 634, + "image": "5LFc76e2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1721293053-gradient timerlinear_2k.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Sprint through cyber tunnel ⚡", + "downloads": "14289", + "id": 374, + "image": "HsjFeWJv", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1672397952-tunnel2K.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "In search for life 🚀", + "downloads": "15434", + "id": 347, + "image": "zRWeQaAj", + "pro": 99, + "resolution": "2160 x 3840", + "thumbnail": "1669098076-exoplanet.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Lines of music 🎸", + "downloads": "10193", + "id": 454, + "image": "fayjwWkG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1690956236-two shade record player_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Pinging for the enemies 🪖", + "downloads": "6701", + "id": 644, + "image": "FJLr4j6T", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1723108060-radar_2k.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Pebble waves 🌌", + "downloads": "16096", + "id": 333, + "image": "f0tcegFG", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1667557680-chips.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Sponge loops 🧽", + "downloads": "9122", + "id": 478, + "image": "vWLsGClJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695799085-gradienttube_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "A captivating view that holds our gaze refusing to let go 🏞️", + "downloads": "10129", + "id": 449, + "image": "akJXn52S", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1689839410-cloudvalley2K.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "The core ⚡", + "downloads": "6344", + "id": 665, + "image": "si2RCIbU", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1725870751-hexogen_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Escaping the chores of life🧳", + "downloads": "72644", + "id": 165, + "image": "1b9Enzr8", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1648446795-van0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Strings of reality ⭕", + "downloads": "22984", + "id": 264, + "image": "aiVWKcY1", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1660118383-contourarray.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Gamers paradise 🎮", + "downloads": "67122", + "id": 169, + "image": "ZNIgCsTj", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648711035-pssyarray0.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Being minimal 😉", + "downloads": "32791", + "id": 223, + "image": "h4Z5OQDq", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1654933732-snowfall.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "A tapestry of seamless blending 🟥🟧🟨", + "downloads": "7989", + "id": 512, + "image": "bJs7kS5q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1701677467-square expanition flip.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Messing around with lines 🌈", + "downloads": "13971", + "id": 351, + "image": "ktlWo6YM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1669881134-lineplay.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Life\u0027s like a rolling ball on a track full of twists and turns ", + "downloads": "8669", + "id": 475, + "image": "D1NMe3so", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1695198716-rolling ball2K.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Pew pew 😁", + "downloads": "15250", + "id": 328, + "image": "bKT7ZB8v", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667146129-pewgun.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Stretch some candy 🍬", + "downloads": "16610", + "id": 302, + "image": "QqugVMzt", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664871075-candy.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Recording the life 📼", + "downloads": "38594", + "id": 204, + "image": "fwPayG3u", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1652165587-record1.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Gamer Zone ", + "downloads": "5937", + "id": 639, + "image": "jeavPVlk", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1722262736-gameover2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Break the rules 🤭", + "downloads": "39315", + "id": 201, + "image": "4k7pbWnN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652009042-inteldino.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "I can wiggle wiggle 🌻🌵", + "downloads": "10645", + "id": 407, + "image": "4TERVbsO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1679896707-cactus.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Digital branches ⚡", + "downloads": "31536", + "id": 219, + "image": "wzT3YAxH", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654413266-simdots.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "House\u0027s like a step 🪜", + "downloads": "6960", + "id": 542, + "image": "5Zv1adoC", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1705999571-merge houses.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Let it go 😉", + "downloads": "10826", + "id": 399, + "image": "okXRmlH7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1678429628-letitgo.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Nature has it\u0027s own secrets 🍃", + "downloads": "27997", + "id": 229, + "image": "NfUDOu0K", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1655452812-fantasyland.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "Moon 🌕", + "downloads": "5279", + "id": 685, + "image": "EDVQUOwk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1729501659-moon_2k.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Stay Out Of My Territory - Heisenberg ⚗️", + "downloads": "28476", + "id": 227, + "image": "NbxPlFc3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655190766-breaking bad.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Fusion 🌀", + "downloads": "25882", + "id": 236, + "image": "RQt2913o", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1656482849-Energyfield.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Popping pops 🎉", + "downloads": "9486", + "id": 427, + "image": "xoP63fkn", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1684743824-stringingcolour_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ripples 🌊", + "downloads": "12342", + "id": 366, + "image": "fy6ijzpL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1670574723-speaker2k.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Fourfold Path", + "downloads": "8218", + "id": 461, + "image": "VKy4mqPT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1692167442-jlines2k.png", + "wallpapertype": 0 + }, + { + "category": "Tech", + "description": "Give your device some power surge ⚡", + "downloads": "5455", + "id": 659, + "image": "Ob9d70IC", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1724917204-generator_2k.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Rising blocks 🧱", + "downloads": "8798", + "id": 442, + "image": "rjLqdbJn", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1688456022-risingBlocks2K.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Cornering stripes 🏁", + "downloads": "13463", + "id": 332, + "image": "jvMzuYBS", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1667557670-turninglines.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Cruising the unknown 🚀", + "downloads": "24491", + "id": 239, + "image": "AFY4hrK0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1656773205-rocketnew.png", + "wallpapertype": 0 + }, + { + "category": "Retro", + "description": "An inviting friend 🐈", + "downloads": "5581", + "id": 612, + "image": "3ToUh4n5", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1718609070-cattable2K.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Nature heals 🌳", + "downloads": "19023", + "id": 263, + "image": "PjXMoci9", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1659866405-fallleaves.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Old school 🎧", + "downloads": "26803", + "id": 225, + "image": "S6F4TnJ7", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1655189835-walkman.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Crystal dimension 🤩", + "downloads": "17247", + "id": 272, + "image": "yCWtPghR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1661490666-animation81.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Sailing the evening wind ⛵", + "downloads": "10105", + "id": 393, + "image": "oKUqdwa1", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1677218894-lighthouse boat.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "I remember every night 🌙", + "downloads": "43686", + "id": 184, + "image": "ZckCjNdM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650005692-circlingstartrail.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "The Glitch", + "downloads": "5416", + "id": 608, + "image": "IQ432Vmq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1717667347-cubes2kmain0001-0350.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Above the clouds 🛩️", + "downloads": "16277", + "id": 279, + "image": "qYZW1Rv0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662008358-planeabovewater.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Glitch ⚡", + "downloads": "9707", + "id": 397, + "image": "gvJl2drZ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1677823065-synth.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "From the shadows, I rise 🕷✨", + "downloads": "4666", + "id": 690, + "image": "7tphTLSA", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1730447376-spiderman noir_2k.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Make it count ⏳", + "downloads": "14671", + "id": 295, + "image": "KEUARZqg", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663568574-makeitcount3.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Through the unknown 🤐", + "downloads": "19806", + "id": 251, + "image": "zLp2Vj4x", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1658385467-animation 670001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Golden Gate Bridge 🌉", + "downloads": "4815", + "id": 669, + "image": "NBfadl9x", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1726732699-golden gate bridge view_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Swirl 🌀", + "downloads": "14260", + "id": 298, + "image": "NdU7By6V", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664170950-spriallines.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Best part of the day - Evening 🌆", + "downloads": "9277", + "id": 403, + "image": "sMcSilt2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1679204730-sunlightreflectionvbr1.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Meow 🐈", + "downloads": "16366", + "id": 273, + "image": "i0E3UoF9", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1661490668-sleepingcat.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Riding the town 🚙", + "downloads": "32298", + "id": 202, + "image": "t7c0Vnr9", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1652009046-town.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Linking links 🔗", + "downloads": "8785", + "id": 410, + "image": "0ugr2XTF", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1680509340-rubber.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Comfort of home 🌃", + "downloads": "20284", + "id": 245, + "image": "BCT9fx3h", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1657517940-window scape new.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "A day in city 🏙", + "downloads": "11885", + "id": 329, + "image": "uHbALW25", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1667146134-planeabove.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Pulse of energy ⚡", + "downloads": "9623", + "id": 383, + "image": "Nh1ofe8P", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1674890229-wave2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Just floating around 🌊", + "downloads": "13852", + "id": 294, + "image": "1UWTpG87", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1663568542-jellyfish1.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Trains are beautiful 🚄", + "downloads": "13239", + "id": 297, + "image": "cskeY8Fx", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1663832513-bridgetrain.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Golden Gate Bridge 🌉", + "downloads": "14313", + "id": 281, + "image": "Aio6auR2", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662355278-goldengatebridge.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Light bars ⚡", + "downloads": "10833", + "id": 340, + "image": "AOLH63u2", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1668151038-spectrum.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Go with the flow ⛵", + "downloads": "15836", + "id": 265, + "image": "ZIj76vOl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660118394-redboat.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "The path isn\u0027t a straight line, it\u0027s a spiral 🌀", + "downloads": "17420", + "id": 252, + "image": "qVJI5SN0", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1658649402-crcfluid.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Flying above the grass 🍃", + "downloads": "8682", + "id": 390, + "image": "HcKWT93r", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1676443822-hotairballoon.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Flocking beams ⚡", + "downloads": "19099", + "id": 242, + "image": "578AbrmR", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1657291653-dots.png", + "wallpapertype": 0 + }, + { + "category": "Pixel", + "description": "Festival vibe 🎆", + "downloads": "12369", + "id": 299, + "image": "cDJIejZY", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1664170966-pixelfireworks.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Endings are beautiful 🌇", + "downloads": "17405", + "id": 250, + "image": "NMy608Ya", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1658385460-sunset.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Weekend rides 🚙", + "downloads": "15007", + "id": 267, + "image": "2pHIefF3", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1660376766-sunsetride.png", + "wallpapertype": 0 + }, + { + "category": "Pixel", + "description": "Pixel warmth 🔥", + "downloads": "13833", + "id": 277, + "image": "hyzI7Pk3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1661751428-pixelcampfire.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Magic below the blocks 🪄", + "downloads": "12364", + "id": 296, + "image": "m3i5XUIA", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663832509-risingneon.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Through the hurdles ⚡", + "downloads": "24404", + "id": 214, + "image": "wQ37vMgz", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1653546875-animation56.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Wind and flowers 🌷", + "downloads": "9931", + "id": 341, + "image": "9HPnwGeM", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1668151041-flowerfield.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "To honour the time machine - James Webb Telescope", + "downloads": "17217", + "id": 247, + "image": "n5cMUxgb", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1657812000-galaxy.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Wind\u0027s Caress 🌼", + "downloads": "6041", + "id": 466, + "image": "XAYWrv2H", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1693380406-flower.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Mirror reality 😎", + "downloads": "7271", + "id": 415, + "image": "rgALv9TE", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1681804030-flip.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "⭕ pop out ⭕", + "downloads": "4045", + "id": 654, + "image": "Hogh0Jt3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1724059263-cylinder2k0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Waves contained in a traingle 📐", + "downloads": "8373", + "id": 380, + "image": "kzDQR9JP", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1674109401-gradientframewave_2k.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Home is where plants are🪴", + "downloads": "17135", + "id": 244, + "image": "5Vu7v1yp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1657517928-leaves1.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "The maze 🫣", + "downloads": "13626", + "id": 270, + "image": "eYlUWwG3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660751880-patternrgb.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Monolith of energy ⚡", + "downloads": "18018", + "id": 238, + "image": "nXOH7dPa", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1656773192-trianglewaves.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Yin and yang ☯", + "downloads": "7919", + "id": 384, + "image": "DYWXTiLx", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1674890254-yinyang2K.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Let\u0027s Bravo 💪🏻", + "downloads": "3554", + "id": 695, + "image": "x3rgHsu0", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1731314484-johnny bravo_2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Winter\u0027s Silent Whispers ☃️", + "downloads": "4833", + "id": 527, + "image": "MA8NXHL7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1703667129-snow globe.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Expanding bubbles 🎈", + "downloads": "7193", + "id": 402, + "image": "OgYCR5WZ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1679204714-bubble.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Line that divides dimension 🔮", + "downloads": "8405", + "id": 367, + "image": "OseuYg9c", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1670574738-flipbubbles2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ghost Rider 🔥", + "downloads": "28949", + "id": 191, + "image": "agjLlwE3", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650866838-skullnew.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Happy New Year 🎆", + "downloads": "4631", + "id": 532, + "image": "PhMH24dz", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1704208922-happynewyear_2k.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Are we in a simulation 🤔", + "downloads": "9950", + "id": 318, + "image": "FQNd2aKp", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1665474502-cybercity.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Gradient strings 🪡", + "downloads": "10977", + "id": 293, + "image": "NiCIf7nO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663217492-gradientline.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Face towards light 🌻", + "downloads": "13841", + "id": 254, + "image": "RHDuFAgb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1658994666-sunflower.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Radiate like flowers 🌼", + "downloads": "3406", + "id": 664, + "image": "K6zaDsGx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1725870736-fadingflowers_2k.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Raining triangles ⚡️", + "downloads": "16841", + "id": 231, + "image": "Wg13hPZz", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655713095-triangs.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Boo want to be scary👻 ", + "downloads": "3210", + "id": 684, + "image": "PUW2EhR0", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1729501572-ghostwind_2k.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Disco floor 💃🏻", + "downloads": "10471", + "id": 283, + "image": "4tyKUwEl", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1662621794-discovibe.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Today is your day 😁", + "downloads": "19519", + "id": 213, + "image": "VnoQmB5a", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653546861-today.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Banana 🍌", + "downloads": "30165", + "id": 179, + "image": "7f3Bsx60", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1649661826-minions.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Soothing of sea ⛵", + "downloads": "30550", + "id": 178, + "image": "3fabqR4C", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649485172-sunset boat.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Catch the toast 🍞", + "downloads": "5430", + "id": 430, + "image": "U0FJ38hC", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1685514843-bread toaster_2k.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Wire\u0027s connecting people 👕👖", + "downloads": "11849", + "id": 259, + "image": "xRM4ArGk", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1659593345-hangingclothes.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Feeling the calm 📻", + "downloads": "50154", + "id": 145, + "image": "KbaDizGu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646888235-windowview.png", + "wallpapertype": 0 + }, + { + "category": "Space", + "description": "The red planet 🌍", + "downloads": "3070", + "id": 674, + "image": "vufNpc9r", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1727687132-planet landscape_2k.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Looping trios 😎", + "downloads": "6160", + "id": 396, + "image": "67SLDahN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1677822985-twotripattern.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "I solemnly swear that I am up to no good 🪄", + "downloads": "9892", + "id": 280, + "image": "q07B9wFL", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662355270-footprint.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Mountain of cards ⛰️", + "downloads": "21303", + "id": 200, + "image": "1OUHBt0A", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651642619-mount.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Simple as a flower 🌼", + "downloads": "7734", + "id": 327, + "image": "luVyJaZX", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1666766421-flowerpot.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Hexagonal waves ⚡", + "downloads": "24948", + "id": 186, + "image": "mVsNlo9a", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650263214-hex0001-0300.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Trying to expand 🤔", + "downloads": "8120", + "id": 305, + "image": "e8p9NE2q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1665245449-criclebreathe.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Flipping cards 🎴", + "downloads": "21405", + "id": 195, + "image": "5mXc9s83", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651215762-tilewave.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Buzzing bees 🐝", + "downloads": "9126", + "id": 282, + "image": "JBg1PslY", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662621769-beehive.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Bouncers ⭕", + "downloads": "8236", + "id": 300, + "image": "2PXEkfjJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1664525996-twoshadeball.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Monsoon cocktail 🍸", + "downloads": "2692", + "id": 675, + "image": "XHRV2kop", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1727687143-cocktail_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Way back home 🚦", + "downloads": "21282", + "id": 192, + "image": "nCfxJUEd", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650866841-traffic light.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Someone\u0027s being cooked 🪦", + "downloads": "2618", + "id": 680, + "image": "eQTYlByI", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1728551180-graveyard_2k.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Dustin , Do you copy 😉", + "downloads": "15823", + "id": 215, + "image": "EBMK7NTF", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653896478-walkietalkie.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Mining the coins 🪙", + "downloads": "19665", + "id": 196, + "image": "CeFq9Owm", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1651215776-mining.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "In one drop of water are found all the secrets of all the oceans", + "downloads": "16073", + "id": 211, + "image": "k6uprVsf", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1653291509-boattrip6.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Strip\u0027s traffic 😉", + "downloads": "10830", + "id": 248, + "image": "kGB3yMqb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1658134320-grid1.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Chilling through the countryside 🚙", + "downloads": "12497", + "id": 233, + "image": "rzTJdu4Q", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1655976665-countrydrive.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Journey through the color valley 🌈", + "downloads": "26208", + "id": 172, + "image": "xNAUw4vm", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1648970974-plane.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Cozy summer 🏖️", + "downloads": "16156", + "id": 206, + "image": "zE9R6gSG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652337222-seawave.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Ice and fire 🔥❄️", + "downloads": "15892", + "id": 207, + "image": "eNWAYdob", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1652767839-zig.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "The Resistance ski speeder 🔥", + "downloads": "33573", + "id": 155, + "image": "qm6kevX7", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1647590528-starwars0080-0240.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Awakening the dragon 🔥", + "downloads": "24039", + "id": 175, + "image": "sLUpavix", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1649322130-dragonball.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Way back home 🪟", + "downloads": "7507", + "id": 292, + "image": "DEBxzG9u", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1663217494-window.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Keep calm and play 🎧", + "downloads": "23149", + "id": 176, + "image": "Ve8GXgvF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649322136-cassette.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Minimal waves 🌊", + "downloads": "8365", + "id": 268, + "image": "jxsMPnZO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660723701-abstractwaves.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Dropping frames 📐", + "downloads": "14825", + "id": 209, + "image": "9QDqL4BM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1653028915-framerotate2.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Waves of shades 🌊", + "downloads": "8988", + "id": 257, + "image": "qyIXY1ZG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1659335310-colourgrid6.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Juicy Pine 🍍", + "downloads": "16425", + "id": 199, + "image": "uVXhD8zU", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1651642615-pineapple.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Enjoy the smell of rain ☔", + "downloads": "12485", + "id": 222, + "image": "1VcGN9RO", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1654668060-rainvector.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Clash of opposites 🌈", + "downloads": "8520", + "id": 262, + "image": "N8A1wHLX", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1659866395-loopie.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Woo hahaha 🎃🕯️", + "downloads": "2211", + "id": 679, + "image": "Wwu1pX5t", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1728551171-pumkin candle_2k.png", + "wallpapertype": 0 + }, + { + "category": "Miscellaneous", + "description": "Under the watchful eye of the moon, she rides the night 🌕✨🧙‍♀️", + "downloads": "2033", + "id": 689, + "image": "l8rWAa52", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1730447262-witch night_2k.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Creating memories in the snow, one angel at a time ☃️❄️", + "downloads": "1937", + "id": 705, + "image": "rX1J9fqj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1733126052-snow angel_2k.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Rainbow effect 🌈", + "downloads": "29502", + "id": 153, + "image": "IrWp7Pok", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1647418463-circlingrainbowhigh.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "On a date 🦇 🐱", + "downloads": "41699", + "id": 134, + "image": "sUMx4igS", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1645948957-thebatman.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Energy tiles ⚡", + "downloads": "1964", + "id": 694, + "image": "35VZSQ2q", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1731314477-cybersandwich_2k0001-0350.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Blow 💨", + "downloads": "9642", + "id": 237, + "image": "YwJ2fH5V", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1656482859-paperwindmill.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Life is like a roller coaster, live it, be happy, enjoy life 🎢", + "downloads": "11891", + "id": 216, + "image": "tUuqKWn5", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1653896481-rollercoster40.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Roll into adventure with BB-8 💫", + "downloads": "1886", + "id": 700, + "image": "HDabQGWh", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1732175087-BB-8_2k.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Love\u0027s clicking ⌨️", + "downloads": "51051", + "id": 123, + "image": "Kuj9oSd4", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645515864-key0001-0247.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Halftone 🪄", + "downloads": "6331", + "id": 278, + "image": "4HyjqJlt", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1662008355-Dots.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Wakeup call 🍵", + "downloads": "15116", + "id": 190, + "image": "5zsv48Oi", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1650692872-windownearsubway.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Life is a journey 🚗 ", + "downloads": "7788", + "id": 246, + "image": "yZvaUhFu", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657811993-lifejourney.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Pac Man 🕹", + "downloads": "42164", + "id": 127, + "image": "wZWDOt1x", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645601772-pacman.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Chasing the breeze ⛵", + "downloads": "1683", + "id": 699, + "image": "31HPOwuK", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1732175071-waving boat_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Entering the night 🌙", + "downloads": "6464", + "id": 266, + "image": "GrLxaBz5", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1660376731-lighthousevector.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Gift from nature 🌊", + "downloads": "24805", + "id": 154, + "image": "opYn9biL", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647590523-waterfall.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Incursion 😉", + "downloads": "12058", + "id": 203, + "image": "5mMz2Xae", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1652165583-frames.png", + "wallpapertype": 0 + }, + + { + "category": "Cityscape", + "description": "Winter night ☃", + "downloads": "55895", + "id": 269, + "image": "rT350txs", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1660723718-snowapartment.png", + "wallpapertype": 0 + }, + + { + "category": "Anime", + "description": "There is something you have to protect ⚔️", + "downloads": "19655", + "id": 150, + "image": "9FzEXMxC", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1647246742-nezukobox.png", + "wallpapertype": 0 + }, + { + "category": "Movies", + "description": "Christmas time for snoopy ❄️☃️", + "downloads": "1221", + "id": 704, + "image": "85IPsh6E", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1733125861-snoopy house_2k.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Looping loops ⭕", + "downloads": "5955", + "id": 240, + "image": "Oi8ofNPb", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1657031328-circle.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Tick Tock ⏰", + "downloads": "10522", + "id": 189, + "image": "EX9qN2Sp", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1650692865-ballpattern.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Love for old 🎷", + "downloads": "22506", + "id": 141, + "image": "fshCMoKF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646500025-musictape.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Never ending triangles 📐", + "downloads": "10538", + "id": 187, + "image": "ViDSUzfG", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650437837-foldingtriangle.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Glide with the cards 💜", + "downloads": "12076", + "id": 177, + "image": "JcHhSQiF", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649485125-trianglewave.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Spring is nature\u0027s way of saying let\u0027s party 🌄", + "downloads": "6956", + "id": 220, + "image": "LMBHkEXS", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1654413275-landscape.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "The opposite pairs 😉", + "downloads": "11237", + "id": 181, + "image": "g4NZzoAl", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1649835076-dna.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Confused ghost 👻", + "downloads": "15853", + "id": 158, + "image": "joyRhH14", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1647851266-panghost.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Through the warp tunnel 🚀", + "downloads": "19924", + "id": 144, + "image": "xVDSuvjo", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646888230-animation390001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "There\u0027s two sides for everything 😇", + "downloads": "12718", + "id": 170, + "image": "OqL53EQk", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1648711046-minimalsun.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Converging stripes ⭕", + "downloads": "7242", + "id": 210, + "image": "e1Evxh7K", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1653028917-cutcircle2.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Confused steps 🤭", + "downloads": "13653", + "id": 163, + "image": "Xi0J6UdY", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648310198-contour.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Summer waves 🌊", + "downloads": "6533", + "id": 217, + "image": "Q0HK57si", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1654161159-wavvve.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Rings and Rings ✌🏻", + "downloads": "28938", + "id": 122, + "image": "NVcnSvTy", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1645515845-vectorgalaxy.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Splitting halves ⚛️", + "downloads": "3033", + "id": 317, + "image": "FxKsChSA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1665474490-toggle3.png", + "wallpapertype": 0 + }, + { + "category": "Material", + "description": "Excited cards 🧡", + "downloads": "11782", + "id": 168, + "image": "bN0WaRht", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1648711023-recarray.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "I am vengeance 🔥", + "downloads": "79041", + "id": 76, + "image": "lRNOhvxW", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643010123-batman.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "The Eighty\u0027s 🕺", + "downloads": "10381", + "id": 174, + "image": "UHF3y6E7", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1649137233-dotshigh.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Joy of celebration 🎉", + "downloads": "16140", + "id": 146, + "image": "L4VbOsYe", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646986481-fireworkview.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Serene Night ✨", + "downloads": "23302", + "id": 128, + "image": "MG6JrH1F", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645601780-windmillill.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Squares are on a trip 😉", + "downloads": "10223", + "id": 173, + "image": "fi49c06E", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1649137222-squares.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Weekend life 🎣", + "downloads": "21075", + "id": 131, + "image": "UHGgV6xz", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645689678-fishingboat.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Camping nights ⛺", + "downloads": "17785", + "id": 139, + "image": "YzMrhTdj", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646306068-snowforest.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Circling ⭕", + "downloads": "10382", + "id": 164, + "image": "M3w0tZxG", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1648446785-pluspattern.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Runaway lines 😉", + "downloads": "9402", + "id": 167, + "image": "GLZf5btI", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648617302-squareill.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "The wave of joy 🌊", + "downloads": "7106", + "id": 182, + "image": "nYb783FD", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1649835082-wave.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Droplets 💧", + "downloads": "6104", + "id": 193, + "image": "TMiOn2da", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1651048971-droppattern.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Beats ⚡", + "downloads": "10892", + "id": 149, + "image": "cqWTe6jN", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647246737-greenanim.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "I think I\u0027m superman\u0027s favorite 💚", + "downloads": "8838", + "id": 159, + "image": "Oox1TRYe", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1647851269-supperman0001-0093.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Hello anybody home 🚀", + "downloads": "27032", + "id": 107, + "image": "EmrYWiA1", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644653245-blackhole.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Chill 🥤", + "downloads": "5713", + "id": 183, + "image": "LXi2ztvh", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1650005674-chill.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Cube of Wisdom ⚡", + "downloads": "15387", + "id": 126, + "image": "6nPkafpA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645601756-icecube.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Where am I 🕵🏻‍♀️", + "downloads": "5186", + "id": 188, + "image": "VjDfLBgT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1650437848-bushsub.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Mirror dimension 🪄", + "downloads": "4103", + "id": 205, + "image": "Ukx7qj3K", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1652337215-cutsphere.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Error ", + "downloads": "24550", + "id": 106, + "image": "cofEiJ9d", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644653226-error.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Booo Booo 👻", + "downloads": "79317", + "id": 62, + "image": "VflzaU4B", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642749968-ghost.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Gateway to the metaverse ⚡️", + "downloads": "10402", + "id": 136, + "image": "ATgbnVti", + "pro": 7, + "resolution": "2160 x 3840", + "thumbnail": "1646123475-animation33.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Run with the stripes 💜", + "downloads": "12677", + "id": 125, + "image": "54nkHS0T", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645515883-intercutline.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Chores of the city 🌇", + "downloads": "7860", + "id": 147, + "image": "prKe6Qwu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646986489-sidetrain.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Countryside are always refreshing 🏡", + "downloads": "7561", + "id": 148, + "image": "dGAhZSgC", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646986493-house 3.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Rengoku🔥", + "downloads": "51807", + "id": 66, + "image": "IVLv624U", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642750053-rengoku.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Where are the humans 🛸", + "downloads": "14777", + "id": 108, + "image": "xtTe6CAl", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644653255-ufo.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Follow the wave ⚡", + "downloads": "13076", + "id": 110, + "image": "E9LzS5PG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645000748-Comp2dot.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Colour Blades 💚", + "downloads": "7661", + "id": 129, + "image": "byXhakCg", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645689669-yellowpanel.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Every action has a reaction 🤓", + "downloads": "16880", + "id": 99, + "image": "9kC2wZUn", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644566566-pend.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Winter cave 🪵", + "downloads": "5577", + "id": 143, + "image": "YfFaywoH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646725986-foresthouse.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Juicy slices 🍉", + "downloads": "5634", + "id": 142, + "image": "CUgLfE0M", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646725977-watermelon.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Lava lamp ☮️", + "downloads": "14879", + "id": 102, + "image": "l01wioFT", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566624-lavalamp.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Cyber Planet ", + "downloads": "7650", + "id": 124, + "image": "FdBayDEC", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645515875-animation620001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Joy of smiley\u0027s 😉", + "downloads": "3987", + "id": 157, + "image": "m7hJcMwv", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1647760634-smiley.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Core of the ancient magic 🔮", + "downloads": "8480", + "id": 119, + "image": "QHtIJZqr", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645259194-cubetemp0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Just charging 🔋", + "downloads": "9093", + "id": 116, + "image": "6h5i7aTK", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645173517-justcharging.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Vroom Vroom 🏎️", + "downloads": "7868", + "id": 121, + "image": "OCXNm04f", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645259201-car0001-0150.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Through the town road 🤠", + "downloads": "4135", + "id": 152, + "image": "Gvj8U5RM", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1647418455-cowbo45.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Train\u0027s coming 🚞", + "downloads": "9956", + "id": 111, + "image": "JcweovKf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645000755-train0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Warp drive through the vaccum ✨", + "downloads": "22782", + "id": 74, + "image": "tFNP0Ywm", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1643010114-erer.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Meow Meow 🐱", + "downloads": "7582", + "id": 120, + "image": "UauRwNgt", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645259197-catdoodles.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Be a percent better everyday 💚", + "downloads": "43680", + "id": 60, + "image": "EDLpF1YJ", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642668016-1better.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Need a bucket to collect all these 🪣", + "downloads": "22076", + "id": 73, + "image": "FGPpaDgu", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642839034-playstation symbol0250-0499.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Being retro 🕺", + "downloads": "5221", + "id": 133, + "image": "Y5EsZt9h", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645948953-animation330001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Joy of baloons 🎈", + "downloads": "4514", + "id": 140, + "image": "4aNESDct", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1646500005-baloon.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Feeling the rain 🌧️", + "downloads": "13316", + "id": 96, + "image": "H59OQqzb", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566465-girl in rain.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Imagination is important than knowledge 🔬", + "downloads": "7391", + "id": 114, + "image": "u0sL3bFq", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645087072-galaxyhouse.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Camping folks ⛺", + "downloads": "13276", + "id": 84, + "image": "gYska4tH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643356780-camp fire.png", + "wallpapertype": 0 + }, + { + "category": "Dope", + "description": "Enter the metaverse⚡", + "downloads": "14561", + "id": 79, + "image": "pY1Fq7tw", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643271285-animation 450001-0200.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Enjoying through the woods 🚗", + "downloads": "19355", + "id": 70, + "image": "4Oiby2ms", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752242-night forest ride0001-0150.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Wiggly wiggly 😁", + "downloads": "11687", + "id": 82, + "image": "ku28xKdm", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1643356768-deform.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Night sky ✨", + "downloads": "11100", + "id": 83, + "image": "xtVHQ5qX", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643356776-night shy.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Sailing through the horizon ⛵", + "downloads": "7979", + "id": 103, + "image": "eBdwiH6f", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566665-oceanboat.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Trying to meet the ends 😁", + "downloads": "3460", + "id": 135, + "image": "E39sJtD8", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646123470-tripattern.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Solve the riddle 🔮", + "downloads": "5099", + "id": 117, + "image": "cxm8NBsl", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645173533-ancientartifact.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Busy riding the sands 🌵", + "downloads": "11250", + "id": 78, + "image": "cM85T0jo", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643010196-car0001-0247.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Waves 💜", + "downloads": "7413", + "id": 100, + "image": "MWjAhRZF", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566581-gradientwave.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Realm of cubes ▪️◻️◾◼️", + "downloads": "7134", + "id": 101, + "image": "hAe9R7wf", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566610-decube.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "God of thunder⚡", + "downloads": "30090", + "id": 56, + "image": "0TIqwLE7", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642667341-thor.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Ultra Instinct 🔥", + "downloads": "70321", + "id": 45, + "image": "mV5S6Qko", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642490947-goku ultra.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Rainbow rain 🌈", + "downloads": "4098", + "id": 115, + "image": "A0xUfN6E", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645173469-rainbowcloud.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Magic steps 🔮", + "downloads": "4093", + "id": 113, + "image": "FTQVdDNo", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645087070-arr0040-0119.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Where\u0027s my mouse 🤔", + "downloads": "7843", + "id": 81, + "image": "ijQndh5H", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1643356755-old computer0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Fabric of reality 😉", + "downloads": "10566", + "id": 71, + "image": "jVHDdWh6", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752256-dot 1.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Festival of light 🕯️", + "downloads": "11457", + "id": 68, + "image": "ABnsbwC3", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642750093-lanterns0118-1000.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Dots dots go away 😜", + "downloads": "5505", + "id": 98, + "image": "UoYrjhKc", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644566535-dotarray.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Curly curly 🖤", + "downloads": "2843", + "id": 118, + "image": "J0YFxAoq", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1645173539-zigzag.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Disco disco 🕺", + "downloads": "3723", + "id": 105, + "image": "0tExmCbu", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1644653213-animation 210001-0240.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Loving the queit life 🏡", + "downloads": "3643", + "id": 104, + "image": "Af0esPFS", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644566689-hotair.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "Founding Titan", + "downloads": "14549", + "id": 58, + "image": "SbVr2TeA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667392-Aot.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Sprouting forest 🌳", + "downloads": "2845", + "id": 109, + "image": "qefFvO0a", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1644653266-colourtree.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Hoping for Dr Strange to come 😉", + "downloads": "18502", + "id": 53, + "image": "VR4E6smB", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642491015-strange portal.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Through the pulses 🔮 .", + "downloads": "9721", + "id": 63, + "image": "CBy8i1kc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642749980-worm hole0001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Searching for glaciers ☹️", + "downloads": "7258", + "id": 67, + "image": "32yZIpDV", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642750069-boat ride.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Tik tok Tik tok ⏳", + "downloads": "3457", + "id": 97, + "image": "i3xABMhj", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1644566514-rotateballs.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Dancing dots 💚", + "downloads": "2173", + "id": 112, + "image": "wb9c0oGx", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1645000768-circlesplashpattern.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Vibe 🕺", + "downloads": "4625", + "id": 75, + "image": "86ixr5kA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643010117-vibe.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Atoms play 🔬", + "downloads": "3934", + "id": 77, + "image": "FgTs76uc", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1643010160-animation 250001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Countryside 🚜", + "downloads": "7608", + "id": 61, + "image": "N20IdgeG", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642749960-farmhouse0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Have fun at the carnival 🎡", + "downloads": "13168", + "id": 52, + "image": "z4bn3Hlk", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642491005-carnival0001-0500.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Spiral of spectrum 🌈", + "downloads": "5468", + "id": 65, + "image": "u6lHZCQF", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642750022-circle0001-0200.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Don\u0027t tell anyone about this base 🚀", + "downloads": "4460", + "id": 69, + "image": "clMvD7o4", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642752214-pyramid0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Ride by the river 🚗", + "downloads": "7984", + "id": 57, + "image": "gDf0iX2S", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667356-night ride0001-0150.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "WIndmill 🍃", + "downloads": "6871", + "id": 59, + "image": "AY4nRzhf", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642667421-windmill0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Exploring the deep waters 🌊", + "downloads": "8687", + "id": 55, + "image": "kfMaSvZ4", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642667334-sub0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Geometry", + "description": "Antigravity keeps me floating⚡", + "downloads": "4770", + "id": 64, + "image": "JKvqt5Pa", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642750008-dune0001-0150.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Feel the pulse 😊", + "downloads": "10718", + "id": 50, + "image": "41gcyMYN", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490982-cube0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Waveform 🖤", + "downloads": "15265", + "id": 46, + "image": "HpqY1Qxd", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642490957-shape0001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Planet love 🌍", + "downloads": "16894", + "id": 44, + "image": "VZ6i51qI", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490937-planet.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Cyber waves 💜", + "downloads": "6689", + "id": 54, + "image": "ZP4qMsQe", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642491028-shape10001-0120.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Mood for a rain 🌧️", + "downloads": "30616", + "id": 39, + "image": "Zs3BCXJl", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486515-rain.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Pink flower ", + "downloads": "7908", + "id": 51, + "image": "VPIEWTYB", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490992-flower.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Cat love 🐈", + "downloads": "9241", + "id": 49, + "image": "Om2nPfBg", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490976-cat.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Loading ...... ", + "downloads": "13881", + "id": 43, + "image": "5kdBMGiW", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490932-loading.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Wriggly cosmos 🖤", + "downloads": "13123", + "id": 41, + "image": "xNFSWdyz", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642490906-dark hole0001-0240.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Have a good day 😎", + "downloads": "5768", + "id": 48, + "image": "Q0Ironk1", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642490971-coffee.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Magic Flower 💙", + "downloads": "6247", + "id": 47, + "image": "T3YR9Wnf", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490964-blue flower.png", + "wallpapertype": 0 + }, + { + "category": "Anime", + "description": "The Saiyan Prince 🔥", + "downloads": "21458", + "id": 37, + "image": "ayb6ospZ", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486467-vegeta.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Swing with the lamp 🛋️", + "downloads": "11339", + "id": 40, + "image": "I0GAalQN", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1642488646-hanging light.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Color popping jet 🌈", + "downloads": "7164", + "id": 42, + "image": "iGXD8kwI", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642490923-jet.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Christmas eve ☃️", + "downloads": "18453", + "id": 36, + "image": "qO5rKNj9", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486448-snow fall.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Think Big 💡", + "downloads": "9340", + "id": 38, + "image": "eOcINzdF", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486479-think big.png", + "wallpapertype": 0 + }, + { + "category": "Abstract", + "description": "Spiral of light 💙", + "downloads": "11455", + "id": 34, + "image": "GeYfZgVw", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486424-rolling tube0001-0500.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Guider of the sea 🌊", + "downloads": "10444", + "id": 33, + "image": "qMXGWpEH", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486388-lighthouse0001-0100.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Play with dino 🦕", + "downloads": "5122", + "id": 35, + "image": "xfMGgp1q", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486428-0001-0125.png", + "wallpapertype": 0 + }, + { + "category": "Typography", + "description": "Always be yourself ❤️", + "downloads": "6754", + "id": 32, + "image": "ewJ0fYQr", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486351-bee.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Spooky 🎃", + "downloads": "87567", + "id": 25, + "image": "BHMsxl02", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1639590645-halloween2021.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Climb the hill 💙", + "downloads": "7916", + "id": 31, + "image": "4ldD89Fn", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486325-ropeway.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Ball of fire 🔥", + "downloads": "20861", + "id": 29, + "image": "gLiRYKEk", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1642486187-geometryball0001-0250.png", + "wallpapertype": 0 + }, + { + "category": "Cityscape", + "description": "Beauty of late night snow ☃️", + "downloads": "27034", + "id": 428, + "image": "CA95YeWL", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1684743860-streetlight_2k.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Glimpse of parallel world 🌍", + "downloads": "18688", + "id": 562, + "image": "oVLnApSP", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1709535857-4 layer land.png", + "wallpapertype": 0 + }, + { + "category": "Nature", + "description": "Where trekking ends ⛺", + "downloads": "18369", + "id": 166, + "image": "TslXeryf", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1648617295-vectorcamp.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Push and Pull 🥸", + "downloads": "5337", + "id": 276, + "image": "PiAKybTX", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1661751415-pushline.png", + "wallpapertype": 0 + }, + { + "category": "Gaming", + "description": "Gamer\u0027s paradise 👨🏻‍💻", + "downloads": "28767", + "id": 138, + "image": "brocN6Da", + "pro": 5, + "resolution": "2160 x 3840", + "thumbnail": "1646306064-pc.png", + "wallpapertype": 0 + }, + { + "category": "Amoled", + "description": "Beats 💓", + "downloads": "32497", + "id": 132, + "image": "UJN3sn7G", + "pro": 0, + "resolution": "2160 x 3840", + "thumbnail": "1645948947-heartbeat.png", + "wallpapertype": 0 + }, + { + "category": "Landscape", + "description": "Glide through your dreams 🛩", + "downloads": "6136", + "id": 249, + "image": "EUqnwDWt", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1658134331-glider.png", + "wallpapertype": 0 + }, + { + "category": "Pattern", + "description": "Catch with the lines 🤐", + "downloads": "7333", + "id": 228, + "image": "UNgGb3f6", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1655452805-justlines.png", + "wallpapertype": 0 + }, + { + "category": "Superheroes", + "description": "Batmobile in Action 🦇", + "downloads": "26251", + "id": 137, + "image": "0oKr7TM4", + "pro": 10, + "resolution": "2160 x 3840", + "thumbnail": "1646123484-batmobile.png", + "wallpapertype": 0 + }, + { + "category": "Minimal", + "description": "Dance with the cactus 🌵", + "downloads": "6398", + "id": 30, + "image": "6BiDZEWA", + "pro": 3, + "resolution": "2160 x 3840", + "thumbnail": "1642486262-catcus.png", + "wallpapertype": 0 + } +] \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/App.kt b/app/src/main/java/com/video/mobile/wallpaper/App.kt new file mode 100644 index 0000000..bd0b134 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/App.kt @@ -0,0 +1,19 @@ +package com.video.mobile.wallpaper + +import android.app.Application +import com.video.mobile.wallpaper.database.DataBaseManager + +class App : Application(){ + companion object{ + val TAG = "============" + lateinit var mApp :App + } + override fun onCreate() { + super.onCreate() + mApp = this + DataBaseManager.init(this) + Helper.loadJson(this) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/BaseViewHolder.kt b/app/src/main/java/com/video/mobile/wallpaper/BaseViewHolder.kt new file mode 100644 index 0000000..ffe4836 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/BaseViewHolder.kt @@ -0,0 +1,9 @@ +package com.video.mobile.wallpaper + +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding + + +class BaseViewHolder( + itemVb: T +) : RecyclerView.ViewHolder(itemVb.root) \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/Helper.kt b/app/src/main/java/com/video/mobile/wallpaper/Helper.kt new file mode 100644 index 0000000..971603c --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/Helper.kt @@ -0,0 +1,185 @@ +package com.video.mobile.wallpaper + +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Parcelable +import android.util.Log +import android.widget.Toast +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.VideoWallpaper +import okhttp3.ResponseBody +import java.io.BufferedReader +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.InputStreamReader +import java.io.OutputStream +import java.io.Reader +import java.io.StringWriter +import java.lang.reflect.Type +import java.nio.charset.StandardCharsets +import java.util.concurrent.Executors + +object Helper { + + val thumbnailStr: String = "https://neutrolabgames.com/LiveLoop/CpanelPix/VideoThumb/" + fun showMyLog(message: String) { + Log.d(App.TAG, message) + } + + fun loadJson(context: Context) { + val name = arrayOf("Trending.json", "Explore.json", "Shift.json") + val cachedThreadPool = Executors.newFixedThreadPool(3) + for (i in 0..2) { + val task = i + cachedThreadPool.execute { + val gson: Gson = Gson() + var open = context.assets.open(name[task]) + + val type: Type = + object : TypeToken?>() { + }.type + val covertStr: String = getJsonStr(open) + val data: List = + gson.fromJson(covertStr, type) + for (wallpaper in data) { + DataBaseManager.insertDb(wallpaper) + } +// Shared.INSTANCE.setDbinit("1") + + } + } + } + + fun showToast(context: Context,message: String){ + Toast.makeText(context,message, Toast.LENGTH_SHORT).show() + } + + fun getJsonStr(stream: InputStream): String { + var covertStr = "" + try { + val writer = StringWriter() + val buffer = CharArray(stream.available()) + val reader: Reader = BufferedReader(InputStreamReader(stream, StandardCharsets.UTF_8)) + var a = 0 + while ((reader.read(buffer).also { a = it }) != -1) { + writer.write(buffer, 0, a) + } + covertStr = writer.toString() + } catch (e: IOException) { + return covertStr + } + return covertStr + } + + + + @Suppress("DEPRECATION") + inline fun Intent.getSerializableExtraCompat(key: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getSerializableExtra(key, T::class.java) + } else { + getSerializableExtra(key) as? T + } + } + + + fun writeFile(input: InputStream, filePath: String): Boolean { + try { + val byteArray = ByteArray(4096) + val output = ByteArrayOutputStream() + var bytesRead: Int + while ((input.read(byteArray).also { bytesRead = it }) != -1) { + output.write(byteArray, 0, bytesRead) + } + + val file = File(filePath) + if (!file.exists()) { + file.createNewFile() + } + + val fileOutputStream = FileOutputStream(filePath) + fileOutputStream.write(output.toByteArray()) + output.close() + fileOutputStream.close() + return true + } catch (ex: Exception) { + showMyLog("---------ex=${ex.message}" ) + return false + } + } + + fun writeResponseBodyToDisk(body: ResponseBody, filePath: String): Boolean { + return try { + val file = File(filePath) + var inputStream: InputStream? = null + var outputStream: OutputStream? = null + + try { + val buffer = ByteArray(8 * 1024) + var bytesRead: Int + inputStream = body.byteStream() + outputStream = FileOutputStream(file) + + var totalBytes: Long = 0 + while (inputStream.read(buffer).also { bytesRead = it } != -1) { + outputStream.write(buffer, 0, bytesRead) + totalBytes += bytesRead + } + outputStream.flush() + + showMyLog("downloaded=$totalBytes contentType = ${body.contentType()}") + val bytes = body.bytes() + showMyLog("bytes = ${String(bytes.take(100).toByteArray())}") + + // 这里不能用 contentLength,因为 chunked = -1 + totalBytes > 0 + } finally { + inputStream?.close() + outputStream?.close() + } + } catch (e: Exception) { + e.printStackTrace() + false + } + } + +// fun writeResponseBodyToDisk(body: ResponseBody, filePath: String): Boolean { +// return try { +// val file = File(filePath) +// var inputStream: InputStream? = null +// var outputStream: OutputStream? = null +// +// try { +// val buffer = ByteArray(8 * 1024) +// var bytesRead: Int +// inputStream = body.byteStream() +// outputStream = FileOutputStream(file) +// +// while (inputStream.read(buffer).also { bytesRead = it } != -1) { +// outputStream.write(buffer, 0, bytesRead) +// } +// outputStream.flush() +// +// // ✅ 校验完整性 +// val downloaded = file.length() +// val expected = body.contentLength() +// showMyLog("downloaded=$downloaded , expected=$expected") +// +// downloaded == expected || expected == -1L +// } finally { +// inputStream?.close() +// outputStream?.close() +// } +// } catch (e: Exception) { +// e.printStackTrace() +// false +// } +// } + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/SplashActivity.kt b/app/src/main/java/com/video/mobile/wallpaper/SplashActivity.kt new file mode 100644 index 0000000..d8faefc --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/SplashActivity.kt @@ -0,0 +1,63 @@ +package com.video.mobile.wallpaper + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.CountDownTimer +import android.widget.ProgressBar +import android.widget.TextView +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity + +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.video.mobile.wallpaper.main.MainActivity + + +class SplashActivity : AppCompatActivity() { + + private var countDownTimer: CountDownTimer? = null + private val timer = 2000L + + private lateinit var progressBar: ProgressBar + private lateinit var textProgress: TextView + + override fun onCreate(savedInstanceState: Bundle?) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { +// installSplashScreen() +// } + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_splash) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + progressBar = findViewById(R.id.progress_bar) + textProgress = findViewById(R.id.textview_progress) + countDownTimer = object : CountDownTimer(timer, 100) { + override fun onTick(millisUntilFinished: Long) { + val v: Float = + 100 - millisUntilFinished.toFloat() / timer * 100 + val v1 = v.toInt() + progressBar.progress = v1 + textProgress.text = getString(R.string.splash_progress_text, v1) + } + + override fun onFinish() { + launchMain() + } + + } + countDownTimer?.start() + } + + private fun launchMain() { + val max = 100 + textProgress.text = getString(R.string.splash_progress_text, max) + progressBar.progress = max + startActivity(Intent(this@SplashActivity, MainActivity::class.java)) + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/database/DataBaseManager.kt b/app/src/main/java/com/video/mobile/wallpaper/database/DataBaseManager.kt new file mode 100644 index 0000000..dce866a --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/database/DataBaseManager.kt @@ -0,0 +1,143 @@ +package com.video.mobile.wallpaper.database + +import android.content.Context +import com.video.mobile.wallpaper.BuildConfig +import com.video.mobile.wallpaper.Helper +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.android.AndroidScheduler +import io.objectbox.config.DebugFlags +import io.objectbox.query.Query +import io.objectbox.reactive.DataSubscription +import io.objectbox.reactive.DataSubscriptionList + +object DataBaseManager { + val pageSize = 10 + + var boxStore: BoxStore? = null + + + var videoWallpaperBox: Box? = null + + var likeWallpaperBox: Box? = null + + + val observer: DataSubscription? = null + + + fun init(context: Context?) { + boxStore = MyObjectBox.builder().androidContext(context) + .debugFlags(DebugFlags.LOG_QUERIES or DebugFlags.LOG_QUERY_PARAMETERS) + .build() + + } + + fun getDataBox(): Box? { + videoWallpaperBox = videoWallpaperBox ?: boxStore?.boxFor(VideoWallpaper::class.java) + + return videoWallpaperBox + } + + fun getLikeBox(): Box? { + likeWallpaperBox = likeWallpaperBox ?: boxStore?.boxFor(LikeWallpaper::class.java) + return likeWallpaperBox + } + + fun setLikeUpdateListener(queryAllLike:(List)->Unit): DataSubscription { + val likeBox: Box? = getLikeBox() + val build: Query = likeBox!!.query() + .build() + return build.subscribe(DataSubscriptionList()) + .on(AndroidScheduler.mainThread()) + .observer { data -> + Helper.showMyLog("---OnLikeUpdateListener-------------" + data.size) + queryAllLike(data) + } + } + + fun insertDb(resultData: VideoWallpaper) { + val objectBox: Box? = getDataBox() + val first: VideoWallpaper? = objectBox!!.query() + .equal(VideoWallpaper_.wallpapertype, resultData.wallpapertype) + .equal(VideoWallpaper_.id, resultData.id) + .build() + .findFirst() + if (first == null) { +// Common.logMsg("---insertDb------Wallpapertype------" + resultData.getWallpapertype() + "-------id=" + resultData.getId()); + Helper.showMyLog("--------insertDb ${resultData.wallpapertype} + ${resultData.id}") + objectBox.put(resultData) + } + } + + + fun insertLike(favoriteData: LikeWallpaper) { + val likeBox: Box? = getLikeBox() + val first: LikeWallpaper? = likeBox!!.query() + .equal(LikeWallpaper_.id, favoriteData.id) + .build() + .findFirst() + if (first == null) { + Helper.showMyLog("---insertLike-----------------id=" + favoriteData.id) + likeBox.put(favoriteData) + } else { + Helper.showMyLog("---insertLike-----------------id=" + favoriteData.id) + } + } + + + fun deleteLike(id: Long,deleteResult:(b: Boolean)-> Unit) { + val likeBox: Box? = getLikeBox() + val first: LikeWallpaper? = likeBox!!.query() + .equal(LikeWallpaper_.id, id) + .build() + .findFirst() + if (first != null) { + val remove = likeBox.remove(first.objectId) + deleteResult(remove) + Helper.showMyLog("---deleteLike-----------------id=$id") + } + } + + fun queryIsLike(id: Long): Boolean { + val likeBox: Box? = getLikeBox() + val first: LikeWallpaper? = likeBox!!.query() + .equal(LikeWallpaper_.id, id) + .build() + .findFirst() + return first != null + } + + + + fun queryData(wallpaperType: Long, currentPage: Int): List { + val offset: Int = (currentPage - 1) * pageSize + + val objectBoxLike: Box? = getDataBox() + val data: List = objectBoxLike!!.query() + .equal(VideoWallpaper_.wallpapertype, wallpaperType) + .build() + .find(offset.toLong(), pageSize.toLong()) + + return data + } + + fun queryLike(currentPage: Int): List { + val offset: Int = (currentPage - 1) * pageSize + val likeBox: Box? = getLikeBox() + val data: List = likeBox!!.query() + .build() + .find(offset.toLong(), pageSize.toLong()) + + return data + } + + fun queryAllData(wallpaperType: Long): List { + val objectBoxLike: Box? = getDataBox() + val data: List = objectBoxLike!!.query() + .equal(VideoWallpaper_.wallpapertype, wallpaperType) + .build() + .find() + + return data + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/database/LikeWallpaper.kt b/app/src/main/java/com/video/mobile/wallpaper/database/LikeWallpaper.kt new file mode 100644 index 0000000..df20521 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/database/LikeWallpaper.kt @@ -0,0 +1,23 @@ +package com.video.mobile.wallpaper.database + +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id +import java.io.Serializable + + +@Entity +data class LikeWallpaper( + + @Id + var objectId: Long = 0, + var description: String? = null, + + var id: Long = 0, + + var image: String? = null, + + //0 :trending 1:dnamic 2:shift 3:explore + var wallpapertype: Long = 0, + + var thumbnail: String? = null +) : Serializable diff --git a/app/src/main/java/com/video/mobile/wallpaper/database/VideoWallpaper.kt b/app/src/main/java/com/video/mobile/wallpaper/database/VideoWallpaper.kt new file mode 100644 index 0000000..78d0e47 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/database/VideoWallpaper.kt @@ -0,0 +1,24 @@ +package com.video.mobile.wallpaper.database + +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id +import java.io.Serializable + + +@Entity +data class VideoWallpaper( + @Id + var objectId: Long = 0, + var category: String? = null, + + var description: String? = null, + + var downloads: String? = null, + var id: Long = 0, + var image: String? = null, + var pro: Int = 0, + var resolution: String? = null, + var thumbnail: String? = null, + //0 :trending 1:dnamic 2:shift 3:explore + var wallpapertype: Long = 0 +): Serializable diff --git a/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteActivity.kt b/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteActivity.kt new file mode 100644 index 0000000..0e5d9c5 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteActivity.kt @@ -0,0 +1,124 @@ +package com.video.mobile.wallpaper.favorite + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.activity.enableEdgeToEdge +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.PagingData +import androidx.paging.liveData +import androidx.paging.map +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.LikeWallpaper +import com.video.mobile.wallpaper.page.LikePageSource +import com.video.mobile.wallpaper.preview.DisplayVideoActivity +import com.video.mobile.wallpaper.utils.RecyclerViewSpace + +class FavoriteActivity : AppCompatActivity() { + private lateinit var imageBack: ImageView + private lateinit var recyclerView: RecyclerView + private lateinit var layoutEmpty: LinearLayout + private lateinit var favoriteAdapter: FavoriteAdapter + + private val launcher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode == RESULT_OK) { + val deleteSuccess = result.data?.getBooleanExtra(DisplayVideoActivity.IS_REFRESH, false) ?: false + if (deleteSuccess) { + favoriteAdapter.refresh() + Helper.showMyLog("--------- favoriteAdapter.refresh()") + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_favorite) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + imageBack = findViewById(R.id.image_back) + imageBack.setOnClickListener { finish() } + recyclerView = findViewById(R.id.favorite_recyclerview) + layoutEmpty = findViewById(R.id.layout_empty) + + + init() + } + + + private fun init() { + favoriteAdapter = FavoriteAdapter(this@FavoriteActivity) { data, strImage -> + launcher.launch(Intent(this@FavoriteActivity, DisplayVideoActivity::class.java).apply { + putExtra(DisplayVideoActivity.KEY_LIKE_WALLPAPER, data) + putExtra(DisplayVideoActivity.THUMBNAIL_STRING, strImage) + putExtra(DisplayVideoActivity.KEY_TYPE, DisplayVideoActivity.SOURCE_LIKE) + }) + } + recyclerView.run { + adapter = favoriteAdapter + layoutManager = GridLayoutManager(this@FavoriteActivity, 2) + addItemDecoration(RecyclerViewSpace(3, 3, 2)) + } + + getPagingData().observe(this@FavoriteActivity, + object : Observer> { + override fun onChanged(value: PagingData) { + value.map { item -> + Helper.showMyLog("---------LikeWallpaper = ${item.id}") // 打印每条数据 + item + }.let { favoriteAdapter.submitData(lifecycle, it) } + + } + + }); + + favoriteAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + checkEmpty() + } + + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + checkEmpty() + } + + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + checkEmpty() + } + + private fun checkEmpty() { + Helper.showMyLog("---------checkEmpty") // 打印每条数据 + layoutEmpty.isVisible = favoriteAdapter.itemCount == 0 + recyclerView.isVisible = favoriteAdapter.itemCount != 0 + } + }) + + } + + private fun getPagingData(): LiveData> { + + return Pager( + PagingConfig(DataBaseManager.pageSize) + ) { LikePageSource() }.liveData + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteAdapter.kt b/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteAdapter.kt new file mode 100644 index 0000000..be279d7 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/favorite/FavoriteAdapter.kt @@ -0,0 +1,91 @@ +package com.video.mobile.wallpaper.favorite + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.utils.widget.ImageFilterView +import androidx.paging.PagingDataAdapter +import androidx.recyclerview.widget.DiffUtil +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.RequestListener +import com.bumptech.glide.request.target.Target +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.database.LikeWallpaper +import com.video.mobile.wallpaper.database.VideoWallpaper + +class FavoriteAdapter(var context: Context,var clickWallpaper:(wallpaper: LikeWallpaper,thumbnailStr: String)-> Unit) : + PagingDataAdapter(DIFF_CALLBACK) { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteAdapterViewHolder { + Helper.showMyLog("-----onCreateViewHolder- ") + return FavoriteAdapterViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.favorite_adapter, parent, false) + ) + } + + override fun onBindViewHolder(holder: FavoriteAdapterViewHolder, position: Int) { + Helper.showMyLog("-----${position}-- ") + val likeWallpaper = getItem(position) + + likeWallpaper?.run { + Helper.showMyLog("-----${position}--${Helper.thumbnailStr + thumbnail}") + val string = Helper.thumbnailStr + thumbnail + holder.imageFilterView.setOnClickListener { + clickWallpaper(likeWallpaper,string) + } + Glide.with(context) + .asDrawable() + .load(string) + .placeholder(R.drawable.thumbnail_placeholder) + .centerCrop() + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + Helper.showMyLog("---onLoadFailed--${e?.message}") + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + return false + } + }) + .into(holder.imageFilterView) + } ?: Helper.showMyLog("-----erro-- ") + + } + + + inner class FavoriteAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageFilterView: ImageFilterView = itemView.findViewById(R.id.thumbnail) + + + } +} + +val DIFF_CALLBACK: DiffUtil.ItemCallback = + object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: LikeWallpaper, newItem: LikeWallpaper): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: LikeWallpaper, newItem: LikeWallpaper): Boolean { + return oldItem.id == newItem.id + } + } \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/main/FragmentAdapter.kt b/app/src/main/java/com/video/mobile/wallpaper/main/FragmentAdapter.kt new file mode 100644 index 0000000..8611a5f --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/main/FragmentAdapter.kt @@ -0,0 +1,12 @@ +package com.video.mobile.wallpaper.main + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + +class FragmentAdapter(context: FragmentActivity, var list: List) : + FragmentStateAdapter(context) { + override fun getItemCount(): Int = list.size + + override fun createFragment(position: Int): Fragment = list[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/main/MainActivity.kt b/app/src/main/java/com/video/mobile/wallpaper/main/MainActivity.kt new file mode 100644 index 0000000..0792ff4 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/main/MainActivity.kt @@ -0,0 +1,91 @@ +package com.video.mobile.wallpaper.main + +import android.content.Intent +import android.os.Bundle +import android.widget.ImageView +import android.widget.TextView +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.viewpager2.widget.ViewPager2 +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.favorite.FavoriteActivity + +class MainActivity : AppCompatActivity() { + + + private lateinit var tab1: TextView + private lateinit var tab2: TextView + private lateinit var tab3: TextView + private lateinit var tvList: List + private lateinit var viewPager: ViewPager2 + private lateinit var favoriteBtn: ImageView + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_main) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + tab1 = findViewById(R.id.text_1_explore) + tab2 = findViewById(R.id.text_2_shift) + tab3 = findViewById(R.id.text_3_trending) + viewPager = findViewById(R.id.viewpager2) + favoriteBtn = findViewById(R.id.favorite_btn) + + tvList = listOf(tab1, tab2, tab3) + setTabSelect(tab1) + setClick() + + + + viewPager.run { + adapter = FragmentAdapter( + this@MainActivity, listOf( + MainFragment.newInstance(3), + MainFragment.newInstance(2), + MainFragment.newInstance(0) + ) + ) + registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + when (position) { + 0 -> setTabSelect(tab1) + 1 -> setTabSelect(tab2) + 2 -> setTabSelect(tab3) + } + } + }) + + } + } + + private fun setClick() { + tab1.setOnClickListener { + setTabSelect(tab1) + viewPager.currentItem = 0 + } + tab2.setOnClickListener { + setTabSelect(tab2) + viewPager.currentItem = 1 + } + tab3.setOnClickListener { + setTabSelect(tab3) + viewPager.currentItem = 2 + } + favoriteBtn.setOnClickListener { + startActivity(Intent(this@MainActivity, FavoriteActivity::class.java)) + } + } + + private fun setTabSelect(textView: TextView) { + tvList.forEach { it.isSelected = false } + textView.isSelected = true + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/main/MainAdapter.kt b/app/src/main/java/com/video/mobile/wallpaper/main/MainAdapter.kt new file mode 100644 index 0000000..dc5b67c --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/main/MainAdapter.kt @@ -0,0 +1,94 @@ +package com.video.mobile.wallpaper.main + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.utils.widget.ImageFilterView +import androidx.paging.PagingDataAdapter +import androidx.recyclerview.widget.DiffUtil +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.RequestListener +import com.bumptech.glide.request.target.Target +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.database.VideoWallpaper + +class MainAdapter(var context: Context,var clickWallpaper:(wallpaper: VideoWallpaper,thumbnailStr: String)-> Unit) : + PagingDataAdapter(DIFF_CALLBACK) { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainAdapterViewHolder { + Helper.showMyLog("-----onCreateViewHolder- ") + return MainAdapterViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.main_adapter, parent, false) + ) + } + + override fun onBindViewHolder(holder: MainAdapterViewHolder, position: Int) { + Helper.showMyLog("-----${position}-- ") + val videoWallpaper = getItem(position) + videoWallpaper?.run { + if (position == 0 || position == 1) { + holder.viewPlaceholder.visibility = View.VISIBLE + } else { + holder.viewPlaceholder.visibility = View.GONE + } + Helper.showMyLog("-----${position}--${Helper.thumbnailStr + thumbnail}") + val string = Helper.thumbnailStr + thumbnail + holder.imageFilterView.setOnClickListener { + clickWallpaper(videoWallpaper,string) + } + Glide.with(context) + .asDrawable() + .load(string) + .placeholder(R.drawable.thumbnail_placeholder) + .centerCrop() + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + Helper.showMyLog("---onLoadFailed--${e?.message}") + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + return false + } + }) + .into(holder.imageFilterView) + } ?: Helper.showMyLog("-----erro-- ") + + } + + + inner class MainAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageFilterView: ImageFilterView = itemView.findViewById(R.id.thumbnail) + + val viewPlaceholder: View = itemView.findViewById(R.id.view_placeholder) + } +} + +val DIFF_CALLBACK: DiffUtil.ItemCallback = + object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: VideoWallpaper, newItem: VideoWallpaper): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: VideoWallpaper, newItem: VideoWallpaper): Boolean { + return oldItem.id == newItem.id + } + } \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/main/MainFragment.kt b/app/src/main/java/com/video/mobile/wallpaper/main/MainFragment.kt new file mode 100644 index 0000000..de92d88 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/main/MainFragment.kt @@ -0,0 +1,110 @@ +package com.video.mobile.wallpaper.main + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.PagingData +import androidx.paging.liveData +import androidx.paging.map +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.VideoWallpaper +import com.video.mobile.wallpaper.page.AllWallpaperPageSource +import com.video.mobile.wallpaper.preview.DisplayVideoActivity +import com.video.mobile.wallpaper.utils.RecyclerViewSpace +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import kotlin.properties.Delegates + +private const val ARG_PARAM1 = "param1" + +class MainFragment : Fragment() { + + private var type by Delegates.notNull() + + + private lateinit var recyclerView: RecyclerView + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + type = it.getLong(ARG_PARAM1) + + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_main, container, false) + recyclerView = view.findViewById(R.id.recycler_view) + onInit() + return view + } + + private fun onInit(){ + val mainAdapter = MainAdapter(requireActivity()){ data,strImage-> + startActivity( Intent(requireActivity(), DisplayVideoActivity::class.java).apply { + putExtra(DisplayVideoActivity.KEY_VIDEO_WALLPAPER,data) + putExtra(DisplayVideoActivity.THUMBNAIL_STRING,strImage) + }) + } + recyclerView.run { + adapter = mainAdapter + layoutManager = GridLayoutManager(requireContext(),2) + addItemDecoration(RecyclerViewSpace(3,3,2)) + } +// viewModel.initType(type) +// lifecycleScope.launch { +// viewModel.videoPagingFlow.collectLatest { pagingData -> +// pagingData.map { item -> +// println("VideoWallpaper = ${item.id}") // 打印每条数据 +// item +// }.let { mainAdapter.submitData(it) } +// } +// } + + getPagingData(type).observe(getViewLifecycleOwner(),object :Observer>{ + override fun onChanged(value: PagingData) { +// mainAdapter.submitData(lifecycle, value) + value.map { item -> + Helper.showMyLog("---------VideoWallpaper = ${item.id}") // 打印每条数据 + item + }.let { mainAdapter.submitData(lifecycle,it) } + + } + + }); + } + + fun getPagingData(wallpaperType: Long): LiveData> { + + return Pager( + PagingConfig(DataBaseManager.pageSize) + ) { AllWallpaperPageSource(wallpaperType) }.liveData + } + + + companion object { + @JvmStatic + fun newInstance(type: Long) = + MainFragment().apply { + arguments = Bundle().apply { + putLong(ARG_PARAM1, type) + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/main/MainViewModel.kt b/app/src/main/java/com/video/mobile/wallpaper/main/MainViewModel.kt new file mode 100644 index 0000000..264f6e6 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/main/MainViewModel.kt @@ -0,0 +1,41 @@ +//package com.video.mobile.wallpaper.main +// +//import androidx.lifecycle.LiveData +//import androidx.lifecycle.ViewModel +//import androidx.lifecycle.viewModelScope +//import androidx.paging.Pager +//import androidx.paging.PagingConfig +//import androidx.paging.PagingData +//import androidx.paging.cachedIn +//import androidx.paging.liveData +//import com.video.mobile.wallpaper.database.DataBaseManager +//import com.video.mobile.wallpaper.database.VideoWallpaper +//import com.video.mobile.wallpaper.page.AllWallpaperPageSource +//import kotlinx.coroutines.flow.Flow +//import kotlin.properties.Delegates +// +//class MainViewModel : ViewModel() { +// +// fun getPagingData(wallpaperType: Long): LiveData> { +// +// return Pager( +// PagingConfig(DataBaseManager.pageSize) +// ) { AllWallpaperPageSource(wallpaperType) }.liveData +// } +// +// +// private var type by Delegates.notNull() +// +// fun initType(wallpaperType: Long){ +// type = wallpaperType +// } +// val videoPagingFlow: Flow> = Pager( +// config = PagingConfig( +// pageSize = DataBaseManager.pageSize, // 每页加载数量 +// initialLoadSize = DataBaseManager.pageSize, // 首次加载数量 +// enablePlaceholders = false // 是否占位符 +// ), +// pagingSourceFactory = { AllWallpaperPageSource(type) } +// ).flow +// .cachedIn(viewModelScope) +//} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/network/CustomResponseBody.kt b/app/src/main/java/com/video/mobile/wallpaper/network/CustomResponseBody.kt new file mode 100644 index 0000000..a544bbf --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/network/CustomResponseBody.kt @@ -0,0 +1,37 @@ +package com.video.mobile.wallpaper.network + +import okhttp3.MediaType +import okhttp3.ResponseBody +import okio.Buffer +import okio.BufferedSource +import okio.ForwardingSource +import okio.buffer +import java.io.IOException + +class CustomResponseBody( + var responseBody: ResponseBody, + var contentLength: String, + var progressListener: (mByte: Long,total: Long,complete: Boolean) -> Unit +) : + ResponseBody() { + + private var bufferedSource: BufferedSource? = null + override fun contentLength(): Long = responseBody.contentLength() + + override fun contentType(): MediaType? = responseBody.contentType() + + override fun source(): BufferedSource = + bufferedSource ?: object : ForwardingSource(responseBody.source()) { + var totalBytesRead: Long = 0L + + @Throws(IOException::class) + override fun read(sink: Buffer, byteCount: Long): Long { + val bytesRead = super.read(sink, byteCount) + totalBytesRead += if (bytesRead != -1L) bytesRead else 0 + + progressListener(totalBytesRead, contentLength.toLong(), bytesRead == -1L) + + return bytesRead + } + }.buffer() +} diff --git a/app/src/main/java/com/video/mobile/wallpaper/network/HttpInterceptor.kt b/app/src/main/java/com/video/mobile/wallpaper/network/HttpInterceptor.kt new file mode 100644 index 0000000..56f67c4 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/network/HttpInterceptor.kt @@ -0,0 +1,18 @@ +package com.video.mobile.wallpaper.network + +import okhttp3.Interceptor +import okhttp3.Response + +class HttpInterceptor(var progressListener: (mByte: Long, total: Long, complete: Boolean) -> Unit) : + Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val originalResponse = chain.proceed(chain.request()) + var fileLength = originalResponse.header("File-Length") + if (fileLength == null) { + fileLength = "0" + } + return originalResponse.newBuilder() + .body(CustomResponseBody(originalResponse.body!!, fileLength, progressListener)) + .build() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/network/RetrofitManager.kt b/app/src/main/java/com/video/mobile/wallpaper/network/RetrofitManager.kt new file mode 100644 index 0000000..47b4d97 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/network/RetrofitManager.kt @@ -0,0 +1,256 @@ +package com.video.mobile.wallpaper.network + + +import com.video.mobile.wallpaper.BuildConfig +import com.video.mobile.wallpaper.Helper +import io.reactivex.Observable +import io.reactivex.disposables.Disposable +import io.reactivex.functions.Consumer +import io.reactivex.schedulers.Schedulers +import okhttp3.OkHttpClient +import okhttp3.ResponseBody +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory +import java.util.concurrent.TimeUnit + +object RetrofitManager { + + private var clientBuilder: OkHttpClient.Builder? = null + + + private const val BASE_URL = "https://neutrolabgames.com/" + private const val DEFAULT_TIMEOUT = 5L // 秒 + + + val retrofit: Retrofit.Builder by lazy { + Retrofit.Builder() + .baseUrl("https://neutrolabgames.com/") + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + } + + private fun createRetrofit( + progressListener: (bytesRead: Long, contentLength: Long, done: Boolean) -> Unit + ): Retrofit { + // 日志拦截器 + val loggingInterceptor = HttpLoggingInterceptor().apply { + level = if (BuildConfig.DEBUG) + HttpLoggingInterceptor.Level.HEADERS + else + HttpLoggingInterceptor.Level.NONE + } + + // OkHttpClient + val client = OkHttpClient.Builder() +// .addInterceptor(loggingInterceptor) + .addNetworkInterceptor(HttpInterceptor(progressListener)) + .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .build() + + return Retrofit.Builder() + .baseUrl(BASE_URL) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .client(client) + .build() + } + + + @Synchronized + private fun getRetrofit(progressListener: (mByte: Long, total: Long, complete: Boolean) -> Unit): Retrofit? { + +// retrofit = new Retrofit.Builder() +// .baseUrl(base_Host) +// .client(client) +// /**/ .addConverterFactory(ScalarsConverterFactory.create()) // 支持返回 String 类型 +// * / .addConverterFactory(GsonConverterFactory.create()) */ +// .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) +// .build(); + +// builder = builder ?: Retrofit.Builder() +// .baseUrl(base_Host) +// .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + + + val DEFAULT_TIMEOUT: Long = 5 + val httpLoggingInterceptor = + HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BODY) } + + clientBuilder = clientBuilder ?: OkHttpClient.Builder() + .addInterceptor(httpLoggingInterceptor) + .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) + + clientBuilder?.apply { + addInterceptor(HttpInterceptor(progressListener)) + }?.build()?.let { + return retrofit.client(it).build() + } ?: return null + + + } + + fun getMp4( + id: Long, + image: String, + path: String, + progressListener: (mByte: Long, total: Long, complete: Boolean) -> Unit, + resultListener: (isOK: Boolean, savePath: String) -> Unit + ): Disposable { +// val retrofit = createRetrofit(progressListener) +// val api = retrofit.create(VideoApi::class.java) +// Helper.showMyLog("----------getMp4----- ") +// return download(api.getMP4(id, "5eV6snEwfY7Yv6Ub", image, "DL8", "ViewLive"),path,resultListener) + val retrofit = createRetrofit(progressListener) + retrofit.let { + Helper.showMyLog("----------get Mp4----- ") + return it.create(VideoApi::class.java) + .getMP4(id, "5eV6snEwfY7Yv6Ub", image, "DL8", "ViewLive") + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .subscribe( + { body -> // onNext + val save = Helper.writeResponseBodyToDisk(body, path) + + Helper.showMyLog("-----save =${save}") + }, + { error -> // onError + resultListener(false, error.message ?: "download error") + }, + { // onComplete + resultListener(true, path) + Helper.showMyLog( "Download completed") + }, + { disposable -> // onSubscribe + Helper.showMyLog("Subscribed, can cancel if needed") + // 例如:保存 disposable 用于取消下载 + }) +// .subscribe(object : Consumer { +// @Throws(Exception::class) +// override fun accept(body: ResponseBody) { +// val b: Boolean = Helper.writeFile(body.byteStream(), path) +// resultListener(b, path) +// } +// }, object : Consumer { +// @Throws(Exception::class) +// override fun accept(throwable: Throwable) { +// resultListener(false, throwable.message.toString()) +// } +// }) + + } + + } + + + fun getShiftMp4( + id: Long, + image: String, + path: String, + progressListener: (mByte: Long, total: Long, complete: Boolean) -> Unit, + resultListener: (isOK: Boolean, savePath: String) -> Unit + ): Disposable { +// +// val retrofit = createRetrofit(progressListener) +// val api = retrofit.create(VideoApi::class.java) +// Helper.showMyLog("----------getShiftMp4----- ") +// return download( +// api.getShiftMP4(id, "5eV6snEwfY7Yv6Ub", image, "DL8", "ViewShiftLive"), +// path, +// resultListener +// ) + val retrofit = createRetrofit(progressListener) + + retrofit.let { + Helper.showMyLog("----------getShiftMp4----- ") + return it.create(VideoApi::class.java) + .getShiftMP4(id, "5eV6snEwfY7Yv6Ub", image, "DL8", "ViewShiftLive") + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .subscribe(object : Consumer { + @Throws(Exception::class) + override fun accept(body: ResponseBody) { + val b: Boolean = Helper.writeResponseBodyToDisk(body, path) + resultListener(b, path) + } + }, object : Consumer { + @Throws(Exception::class) + override fun accept(throwable: Throwable) { + resultListener(false, throwable.message.toString()) + } + }) + + + } + } + + + private fun download( + apiCall: Observable, + path: String, + resultListener: (Boolean, String) -> Unit + ): Disposable { + return apiCall + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .subscribe(object : Consumer { + @Throws(Exception::class) + override fun accept(body: ResponseBody) { + val success = try { + Helper.writeFile(body.byteStream(), path) + } catch (e: Exception) { + e.printStackTrace() + false + } + resultListener(success, path) + } + }, object : Consumer { + @Throws(Exception::class) + override fun accept(throwable: Throwable) { + resultListener(false, throwable.message ?: "unknown error") + } + }) + } + +// public void getDnamicMp4(int id, String image,String path, OnVideoResultListener listener) { + // musicApi.getDMP4(id,"5eV6snEwfY7Yv6Ub",image,"DL8","ViewTimerLive","1" ) + // .subscribeOn(Schedulers.io()) + // .unsubscribeOn(Schedulers.io()) + // .observeOn(Schedulers.io()) + // .subscribe(new ObserverWrapper<>(new OnRequestListener() { + // @Override + // public void onFail(String errorMsg) { + // listener.onVideoResult(false,errorMsg); + // } + // + // @Override + // public void onSuccess(ResponseBody data) { + // boolean b = Common.writeFile(data.byteStream(), path); + // listener.onVideoResult(b,path); + // } + // + // })); + // } + + +// companion object { +// @Volatile +// private lateinit var REQUEST_MANAGER: RetrofitManager +// +// val instance: RetrofitManager +// get() { +// if (REQUEST_MANAGER == null) { +// synchronized(RetrofitManager::class.java) { +// if (REQUEST_MANAGER == null) { +// REQUEST_MANAGER = RetrofitManager() +// } +// } +// } +// return REQUEST_MANAGER +// } +// } +} diff --git a/app/src/main/java/com/video/mobile/wallpaper/network/VideoApi.kt b/app/src/main/java/com/video/mobile/wallpaper/network/VideoApi.kt new file mode 100644 index 0000000..9163636 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/network/VideoApi.kt @@ -0,0 +1,41 @@ +package com.video.mobile.wallpaper.network + +import io.reactivex.Observable +import okhttp3.ResponseBody +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.POST + +interface VideoApi { + @POST("LiveLoop/AppData/jmywall.php") + @FormUrlEncoded + fun getMP4( + @Field("pi") pi: Long, + @Field("medium") medium: String?, + @Field("alpha") alpha: String?, + @Field("version") version: String?, + @Field("quality") quality: String? + ): Observable + + + //shift + @POST("LiveLoop/AppData/jshiftwall.php") + @FormUrlEncoded + fun getShiftMP4( + @Field("pi") pi: Long, + @Field("medium") medium: String?, + @Field("alpha") alpha: String?, + @Field("version") version: String?, + @Field("quality") quality: String? + ): Observable // + // //Dnamic + // @POST("LiveLoop/AppData/jdaytimewall.php") + // @FormUrlEncoded + // Observable getDMP4(@Field("pi") int pi, + // @Field("medium") String medium, + // @Field("alpha") String alpha, + // @Field("version") String version, + // @Field("quality") String quality, + // @Field("filenumber") String filenumber); + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/page/AllWallpaperPageSource.kt b/app/src/main/java/com/video/mobile/wallpaper/page/AllWallpaperPageSource.kt new file mode 100644 index 0000000..f268bf4 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/page/AllWallpaperPageSource.kt @@ -0,0 +1,36 @@ +package com.video.mobile.wallpaper.page + +import androidx.paging.PagingSource +import androidx.paging.PagingState +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.VideoWallpaper + +class AllWallpaperPageSource(var wallpaperType: Long) : PagingSource() { + + override fun getRefreshKey(state: PagingState): Int? { + + return null + } + + override suspend fun load(params: LoadParams): LoadResult { + + try { + val page = params.key ?: 1 + + page.let { + val data: List = DataBaseManager.queryData(wallpaperType, it) + Helper.showMyLog("--------load data ${data.size} ") + return LoadResult.Page( + data, + if (it > 1) it - 1 else null, + if (data.isEmpty()) null else it + 1 + ) + } + + } catch (e: Exception) { + Helper.showMyLog("--------load ${e.message} ") + return LoadResult.Error(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/page/LikePageSource.kt b/app/src/main/java/com/video/mobile/wallpaper/page/LikePageSource.kt new file mode 100644 index 0000000..d549809 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/page/LikePageSource.kt @@ -0,0 +1,34 @@ +package com.video.mobile.wallpaper.page + +import androidx.paging.PagingSource +import androidx.paging.PagingState +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.LikeWallpaper +import com.video.mobile.wallpaper.database.VideoWallpaper + +class LikePageSource() : PagingSource() { + + override fun getRefreshKey(state: PagingState): Int? { + + return null + } + + override suspend fun load(params: LoadParams): LoadResult { + + try { + val page = params.key ?: 1 + + page.let { + val data: List = DataBaseManager.queryLike(it) + return LoadResult.Page( + data, + if (it > 1) it - 1 else null, + if (data.isEmpty()) null else it + 1 + ) + } + + } catch (e: Exception) { + return LoadResult.Error(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/preview/DisplayVideoActivity.kt b/app/src/main/java/com/video/mobile/wallpaper/preview/DisplayVideoActivity.kt new file mode 100644 index 0000000..7c5f635 --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/preview/DisplayVideoActivity.kt @@ -0,0 +1,502 @@ +package com.video.mobile.wallpaper.preview + +import android.app.WallpaperManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.graphics.drawable.Drawable +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.activity.enableEdgeToEdge +import androidx.annotation.OptIn +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.FileProvider +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import androidx.media3.common.util.UnstableApi +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.ui.PlayerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.video.mobile.wallpaper.App +import com.video.mobile.wallpaper.Helper +import com.video.mobile.wallpaper.Helper.getSerializableExtraCompat +import com.video.mobile.wallpaper.R +import com.video.mobile.wallpaper.database.DataBaseManager +import com.video.mobile.wallpaper.database.LikeWallpaper +import com.video.mobile.wallpaper.database.VideoWallpaper +import com.video.mobile.wallpaper.network.RetrofitManager +import com.video.mobile.wallpaper.utils.RecyclerViewSpace +import io.reactivex.disposables.Disposable +import java.io.File +import kotlin.properties.Delegates + +class DisplayVideoActivity : AppCompatActivity() { + + + companion object { + val KEY_VIDEO_WALLPAPER = "video_wallpaper" + val KEY_LIKE_WALLPAPER = "like_wallpaper" + val KEY_TYPE = "source" + val SOURCE_MAIN = -1 + val SOURCE_LIKE = -2 + val THUMBNAIL_STRING = "thumbnail_string" + val IS_REFRESH = "is_refresh" + + } + + private var intentVideoWallpaper: VideoWallpaper? = null + private var intentLikeWallpaper: LikeWallpaper? = null + + private var sourceType: Int = -1 + private val loadingType_circle = 0 + private val loadingType_download = 1 + private val loadingType_retry = 2 + private var exoPlayer: ExoPlayer? = null + private lateinit var downloadingProgressLayout: LinearLayout + private lateinit var backFrameLayout: FrameLayout + private lateinit var downloadProgressbar: ProgressBar + private lateinit var progressBar: ProgressBar + private lateinit var playerView: PlayerView + private lateinit var retryLinearLayout: LinearLayout + private lateinit var loadingLayout: RelativeLayout + private lateinit var retryTextView: TextView + + private var wallpaperId by Delegates.notNull() + + private var wallpaperType by Delegates.notNull() + private lateinit var thumbnailImageView: ImageView + + private lateinit var cachePath: String + private lateinit var cacheFile: File + + private var disposable: Disposable? = null + + private lateinit var networkErrorStr: String + private lateinit var playErrorStr: String + private lateinit var thumbnailStr: String + + private lateinit var textDescriptor: TextView + private lateinit var textBtnSet: TextView + private lateinit var frameFavorite: FrameLayout + private lateinit var imageFavorite: ImageView + + private lateinit var textRetry: TextView + + private lateinit var bottomLayout: LinearLayout + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_display_video) + backFrameLayout = findViewById(R.id.back_btn) + bottomLayout = findViewById(R.id.layout_btn) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) +// v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + val params = backFrameLayout.layoutParams as ViewGroup.MarginLayoutParams + params.topMargin = systemBars.top + backFrameLayout.layoutParams = params + + val marginLayoutParams = bottomLayout.layoutParams as ViewGroup.MarginLayoutParams + marginLayoutParams.bottomMargin = + systemBars.bottom + RecyclerViewSpace.dpToPx(20f).toInt() + bottomLayout.layoutParams = marginLayoutParams + Helper.showMyLog("---systemBars.top--${systemBars.top} bottom = ${systemBars.bottom}") + insets + } + downloadingProgressLayout = findViewById(R.id.download_progress_layout) + downloadProgressbar = findViewById(R.id.horizontal_progressbar) + progressBar = findViewById(R.id.normal_progress) + playerView = findViewById(R.id.player_view) + retryLinearLayout = findViewById(R.id.retry_layout) + loadingLayout = findViewById(R.id.loading_bg_layout) + retryTextView = findViewById(R.id.tv_load_fail) + thumbnailImageView = findViewById(R.id.image_thumbnail) + textRetry = findViewById(R.id.tv_retry_button) + + textDescriptor = findViewById(R.id.tv_video_describe) + textBtnSet = findViewById(R.id.text_btn_set) + frameFavorite = findViewById(R.id.framelayout_favorite) + imageFavorite = findViewById(R.id.im_favorite) + + + networkErrorStr = getString(R.string.download_fail_network) + playErrorStr = getString(R.string.download_fail_unknown) + getIntentData() + setAllClick() + initPlayerView() + if (cacheFile.exists()) { + playVideo(cacheFile) + } else { + getNetWorkVideo(cachePath) + } + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Helper.showMyLog("---handleOnBackPressed") + backPage() + } + + }) + + } + + private fun setAllClick() { + backFrameLayout.setOnClickListener { + backPage() + + } + textBtnSet.setOnClickListener { + if (cacheFile.exists()) { + setVideoWallpaper() + } else { + Helper.showToast(this@DisplayVideoActivity, getString(R.string.cache_file_no_lost)) + } + } + textRetry.setOnClickListener { + getNetWorkVideo(cachePath) + } + frameFavorite.setOnClickListener { + showCircleLoading(true, loadingType_circle) + val newStatus = !imageFavorite.isSelected + if (newStatus) { + intentVideoWallpaper?.let { + Helper.showMyLog("--- Video --insertLike ") + DataBaseManager.insertLike(LikeWallpaper().apply { + id = it.id + description = it.description + image = it.image + wallpapertype = it.wallpapertype + thumbnail = it.thumbnail + }) + } + intentLikeWallpaper?.let { + Helper.showMyLog("---Like --insertLike ") + DataBaseManager.insertLike(it) + } + imageFavorite.isSelected = newStatus + showCircleLoading(false) + } else { + DataBaseManager.deleteLike(wallpaperId) { deleteOk -> + showCircleLoading(false) + if (deleteOk) { + imageFavorite.isSelected = newStatus + Helper.showToast( + this@DisplayVideoActivity, + getString(R.string.remove_favorite_ok) + ) + } else { + Helper.showToast( + this@DisplayVideoActivity, + getString(R.string.remove_favorite_fail) + ) + } + } + } + } + } + + + private fun backPage() { + val resultIntent = Intent() + resultIntent.putExtra(IS_REFRESH, !imageFavorite.isSelected) + setResult(RESULT_OK, resultIntent) + finish() + } + + private fun getIntentData() { + sourceType = intent.getIntExtra(KEY_TYPE, SOURCE_MAIN) + when (sourceType) { + SOURCE_MAIN -> { + intentVideoWallpaper = intent.getSerializableExtraCompat(KEY_VIDEO_WALLPAPER) + Helper.showMyLog("---序列化 intentVideoWallpaper=${intentVideoWallpaper} ") + intentVideoWallpaper?.let { + wallpaperId = it.id + wallpaperType = it.wallpapertype + } + + + } + + SOURCE_LIKE -> { + intentLikeWallpaper = intent.getSerializableExtraCompat(KEY_LIKE_WALLPAPER) + Helper.showMyLog("---序列化 intentLikeWallpaper=${intentLikeWallpaper} ") + intentLikeWallpaper?.let { + wallpaperId = it.id + wallpaperType = it.wallpapertype + } + } + } + textDescriptor.text = intentVideoWallpaper?.description ?: intentLikeWallpaper?.description + thumbnailStr = intent.getStringExtra(THUMBNAIL_STRING).toString() + + cachePath = getCachePath(wallpaperId) + cacheFile = File(cachePath) + + Helper.showMyLog("--thumbnailStr=${thumbnailStr} ") + Glide.with(this) + .asDrawable() + .load(thumbnailStr) + .placeholder(R.drawable.thumbnail_placeholder) + .centerCrop() + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + Helper.showMyLog("---onLoadFailed--${e?.message}") + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + return false + } + }) + .into(thumbnailImageView) + + + imageFavorite.setSelected(DataBaseManager.queryIsLike(wallpaperId)) + } + + + private fun initPlayerView() { + exoPlayer = ExoPlayer.Builder(this) + .build() + exoPlayer?.run { + repeatMode = ExoPlayer.REPEAT_MODE_ONE +// addListener(object : Player.Listener { +// override fun onPlaybackStateChanged(playbackState: Int) { +// if (playbackState == Player.STATE_READY) { +//// showCircleLoading(true, loadingType_circle) +// Helper.showMyLog("-------onPlaybackStateChanged-----") +// } +// } +// }) + } + playerView.setPlayer(exoPlayer) + + } + + private fun setVideoWallpaper() { + WallpaperPathManager.video_wallpaper_path = cachePath + Helper.showMyLog("----------setVideo_path---cachePath=$cachePath") + val wallpaperManager = WallpaperManager.getInstance(this) + try { + wallpaperManager.clear() + Helper.showMyLog("----------clear=") + } catch (e: java.lang.Exception) { + Helper.showMyLog("---------e=" + e.message) + } + + try { + val componentName = + ComponentName(this@DisplayVideoActivity, VideoWallpaperService::class.java) + val intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER) + intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, componentName) + startActivity(intent) + } catch (e: java.lang.Exception) { + Helper.showMyLog("---------e=" + e.message) + } + finish() + } + + @OptIn(UnstableApi::class) + private fun playVideo(file: File) { + try { + val uri = Uri.fromFile(file) +// val uriFromFilePath: Uri = Com.getUriFromFilePath(this, filePath) +// val mediaItem = MediaItem.fromUri(uriFromFilePath) +// val mediaSource: ProgressiveMediaSource = createMediaSource(mediaItem) + val mediaItem = MediaItem.fromUri(uri) + exoPlayer?.setMediaItem(mediaItem) + exoPlayer?.addListener(object : Player.Listener { + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + Helper.showMyLog("-------------onPlayerError error=${error.message}") +// deleteFile(cacheFile) + showCircleLoading(true, loadingType_retry, playErrorStr) + + } + + override fun onRenderedFirstFrame() { + super.onRenderedFirstFrame() + //播放视频第一帧 + showCircleLoading(false) + thumbnailImageView.visibility = View.GONE + + } + }) + exoPlayer?.prepare() + exoPlayer?.play() + } catch (e: Exception) { + Helper.showMyLog("playVideo ${e.message}") +// deleteFile(cacheFile) + showCircleLoading(true, loadingType_retry, playErrorStr) + } + } + + private fun getNetWorkVideo(cachePath: String) { + showCircleLoading(true, loadingType_circle) + val imageStr = intentVideoWallpaper?.image ?: intentLikeWallpaper?.image + imageStr?.let { + if (wallpaperType == 2L) { + //shift + disposable = RetrofitManager + .getShiftMp4( + wallpaperId, + it, + cachePath, + { mByte: Long, total: Long, complete: Boolean -> + runOnUiThread { + updateDownloadProgress(mByte, total, complete) + } + + }) { ok: Boolean, path: String -> + runOnUiThread { + requestResult(ok, path) + } + + } + } else { + disposable = RetrofitManager.getMp4( + wallpaperId, + it, + cachePath, + { mByte: Long, total: Long, complete: Boolean -> + runOnUiThread { + updateDownloadProgress(mByte, total, complete) + } + }) { ok: Boolean, path: String -> + runOnUiThread { + requestResult(ok, path) + } + } + } + } + + } + + private fun requestResult(isOK: Boolean, path: String) { + Helper.showMyLog("------------requestResult-------path= ${path}") + val file = File(path) + if (file.exists() && isOK) { + playVideo(file) + } else { + showCircleLoading(true, loadingType_retry) + } + + } + + private fun showCircleLoading( + show: Boolean, + loadingType: Int? = 0, + retryString: String? = networkErrorStr + ) { + if (show) { + loadingLayout.visibility = View.VISIBLE + when (loadingType) { + loadingType_circle -> { + progressBar.visibility = View.VISIBLE + retryLinearLayout.visibility = View.GONE + downloadingProgressLayout.visibility = View.GONE + } + + loadingType_download -> { + progressBar.visibility = View.GONE + retryLinearLayout.visibility = View.GONE + downloadingProgressLayout.visibility = View.VISIBLE + } + + loadingType_retry -> { + progressBar.visibility = View.GONE + retryLinearLayout.visibility = View.VISIBLE + downloadingProgressLayout.visibility = View.GONE + retryTextView.text = retryString + } + } + + } else { + loadingLayout.visibility = View.GONE + } + + } + + private fun updateDownloadProgress(mByte: Long, total: Long, complete: Boolean) { + Helper.showMyLog("------------updateDownloadProgress---- ${mByte}") + if (total <= 0) { + + } else { + val current = ((100 * mByte) / total).toInt() + if (downloadProgressbar.progress != current) { + runOnUiThread(object : Runnable { + override fun run() { + if (downloadingProgressLayout.visibility !== View.VISIBLE) { + showCircleLoading(true, loadingType_download) + Helper.showMyLog("------------showLoading------11-----") + } else { + Helper.showMyLog("------------showLoading------22-----") + } + downloadProgressbar.progress = current + } + }) + } + } + + } + + /** + * 所有下载的视频保存位置 + */ + private fun getCachePath(id: Long): String { + + return "${App.mApp.cacheDir}/$id.mp4" + } + + private fun deleteFile(file: File): Boolean { + return file.exists() && file.delete() + } + + fun getUriFromFilePath(context: Context, filePath: String): Uri? { + val file = File(filePath) + + // 使用 FileProvider 获取 URI + return FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file) + } + + override fun onDestroy() { + super.onDestroy() + exoPlayer?.release() +// if (countDownTimer != null) { +// countDownTimer.cancel() +// countDownTimer = null +// } + disposable?.isDisposed?.let { + if (!it) { + Helper.showMyLog("----------- disposable?.dispose()---") + disposable?.dispose() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/preview/VideoWallpaperService.kt b/app/src/main/java/com/video/mobile/wallpaper/preview/VideoWallpaperService.kt new file mode 100644 index 0000000..244f33b --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/preview/VideoWallpaperService.kt @@ -0,0 +1,112 @@ +package com.video.mobile.wallpaper.preview + +import android.net.Uri +import android.service.wallpaper.WallpaperService +import android.view.SurfaceHolder +import androidx.annotation.OptIn +import androidx.media3.common.C +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import androidx.media3.common.util.UnstableApi +import androidx.media3.exoplayer.ExoPlayer +import com.video.mobile.wallpaper.Helper +import java.io.File + +class VideoWallpaperService : WallpaperService() { + override fun onCreateEngine(): Engine? = VideoWallpaperEngine() + + inner class VideoWallpaperEngine : Engine() { + private var exoPlayer: ExoPlayer? = null + + + @OptIn(UnstableApi::class) + private fun initExoPlay() { + exoPlayer = ExoPlayer.Builder(this@VideoWallpaperService).build() + exoPlayer?.repeatMode = ExoPlayer.REPEAT_MODE_ONE + update() + } + + override fun onCreate(surfaceHolder: SurfaceHolder?) { + super.onCreate(surfaceHolder) + Helper.showMyLog("-----Engine-----onCreate") + initExoPlay() + + } + + @OptIn(UnstableApi::class) + override fun onSurfaceCreated(holder: SurfaceHolder?) { + super.onSurfaceCreated(holder) + val surface = holder?.surface + if (surface != null) { + exoPlayer?.setVideoSurface(surface) + exoPlayer?.videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING + } + + + } + + override fun onVisibilityChanged(visible: Boolean) { + super.onVisibilityChanged(visible) + Helper.showMyLog("-------Engine---onVisibilityChanged visible=$visible") + if (visible) { + update() + exoPlayer?.play() + } else { + exoPlayer?.pause() + } + } + + + override fun onSurfaceDestroyed(holder: SurfaceHolder?) { + super.onSurfaceDestroyed(holder) + Helper.showMyLog("------Engine----onSurfaceDestroyed---") + exoPlayer?.release() + } + + override fun onDestroy() { + super.onDestroy() + Helper.showMyLog("-------Engine---onDestroy---") + + + } + + override fun onSurfaceChanged( + holder: SurfaceHolder?, + format: Int, + width: Int, + height: Int + ) { + super.onSurfaceChanged(holder, format, width, height) + + } + + + private fun update() { + val file = File(WallpaperPathManager.video_wallpaper_path) + if (file.isFile && file.exists()) { + val uri = Uri.fromFile(file) + val mediaItem = MediaItem.fromUri(uri) + exoPlayer?.run { + setMediaItem(mediaItem) + addListener(object : Player.Listener { + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + Helper.showMyLog("-----------update--onPlayerError") + } + + override fun onRenderedFirstFrame() { + super.onRenderedFirstFrame() + //播放视频第一帧 + Helper.showMyLog("-----------update--播放视频第一帧") + } + }) + prepare() + playWhenReady = true + } + } + } + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/preview/WallpaperPathManager.kt b/app/src/main/java/com/video/mobile/wallpaper/preview/WallpaperPathManager.kt new file mode 100644 index 0000000..6dd9dbc --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/preview/WallpaperPathManager.kt @@ -0,0 +1,52 @@ +package com.video.mobile.wallpaper.preview + +import android.content.Context +import android.content.SharedPreferences +import com.video.mobile.wallpaper.App +import androidx.core.content.edit + + +object WallpaperPathManager { + + val KEY_CURRENT_WAPPPAPER_PATH = "video_wallpaper_path" + val DB_INIT_DATAT = "init_db_data" + + private var shared: SharedPreferences? = null + + var video_wallpaper_path: String + get() = queryString( + KEY_CURRENT_WAPPPAPER_PATH, + "" + ) + set(value) { + saveString(KEY_CURRENT_WAPPPAPER_PATH, value) + } + var dbinit: String + get() = queryString( + DB_INIT_DATAT, + "0" + ) + set(value) { + saveString(DB_INIT_DATAT, value) + } + + private fun getShared(): SharedPreferences { + if (shared == null) { + shared = App.mApp.getSharedPreferences("", Context.MODE_PRIVATE) + } + return shared!! + + } + + fun saveString(key: String, value: String) { + getShared().edit { + putString(key, value) + } + } + + fun queryString(key: String, defaultValue: String): String { + return getShared() + .getString(key, defaultValue).orEmpty() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/video/mobile/wallpaper/utils/RecyclerViewSpace.kt b/app/src/main/java/com/video/mobile/wallpaper/utils/RecyclerViewSpace.kt new file mode 100644 index 0000000..c1ca24e --- /dev/null +++ b/app/src/main/java/com/video/mobile/wallpaper/utils/RecyclerViewSpace.kt @@ -0,0 +1,72 @@ +package com.video.mobile.wallpaper.utils + +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.RecyclerView.ItemDecoration +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.video.mobile.wallpaper.App +import kotlin.math.roundToInt + + +class RecyclerViewSpace(v: Int, h: Int, ex: Int) : ItemDecoration() { + private val v: Int = dpToPx(v.toFloat()).roundToInt() + private val h: Int = dpToPx(h.toFloat()).roundToInt() + private val ex: Int = dpToPx(ex.toFloat()).roundToInt() + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + var spanCount = 1 + var spanSize = 1 + var spanIndex = 0 + + val childAdapterPosition = parent.getChildAdapterPosition(view) + val layoutManager = parent.layoutManager + if (layoutManager is StaggeredGridLayoutManager) { + val layoutParams = view.layoutParams as StaggeredGridLayoutManager.LayoutParams + spanCount = layoutManager.spanCount + if (layoutParams.isFullSpan) { + spanSize = spanCount + } + spanIndex = layoutParams.spanIndex + } else if (layoutManager is GridLayoutManager) { + val gridLayoutManager = layoutManager + val layoutParams = view.layoutParams as GridLayoutManager.LayoutParams + spanCount = gridLayoutManager.spanCount + spanSize = gridLayoutManager.spanSizeLookup.getSpanSize(childAdapterPosition) + spanIndex = layoutParams.spanIndex + } else if (layoutManager is LinearLayoutManager) { + outRect.left = v + outRect.right = v + outRect.bottom = h + } + + if (spanSize == spanCount) { + outRect.left = v + ex + outRect.right = v + ex + outRect.bottom = h + } else { + val itemAllSpacing = (v * (spanCount + 1) + ex * 2) / spanCount + val left = v * (spanIndex + 1) - itemAllSpacing * spanIndex + ex + val right = itemAllSpacing - left + outRect.left = left + outRect.right = right + outRect.bottom = h + } + } + + + companion object { + fun dpToPx(dpValue: Float): Float { + val density: Float = App.mApp.resources.displayMetrics.density + return density * dpValue + 0.5f + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/common_back_button.xml b/app/src/main/res/drawable/common_back_button.xml new file mode 100644 index 0000000..f53206f --- /dev/null +++ b/app/src/main/res/drawable/common_back_button.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/common_back_button_bg.xml b/app/src/main/res/drawable/common_back_button_bg.xml new file mode 100644 index 0000000..b3a80b7 --- /dev/null +++ b/app/src/main/res/drawable/common_back_button_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/common_set_wallpaper_bg.xml b/app/src/main/res/drawable/common_set_wallpaper_bg.xml new file mode 100644 index 0000000..68a8855 --- /dev/null +++ b/app/src/main/res/drawable/common_set_wallpaper_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/display_selector_favorite.xml b/app/src/main/res/drawable/display_selector_favorite.xml new file mode 100644 index 0000000..2fea616 --- /dev/null +++ b/app/src/main/res/drawable/display_selector_favorite.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/empty_favorite.xml b/app/src/main/res/drawable/empty_favorite.xml new file mode 100644 index 0000000..1ef5394 --- /dev/null +++ b/app/src/main/res/drawable/empty_favorite.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + 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..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/icon_favorite_selected.xml b/app/src/main/res/drawable/icon_favorite_selected.xml new file mode 100644 index 0000000..139dc4e --- /dev/null +++ b/app/src/main/res/drawable/icon_favorite_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_favorite_unselected.xml b/app/src/main/res/drawable/icon_favorite_unselected.xml new file mode 100644 index 0000000..bd2801d --- /dev/null +++ b/app/src/main/res/drawable/icon_favorite_unselected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/main_gradient_border.xml b/app/src/main/res/drawable/main_gradient_border.xml new file mode 100644 index 0000000..99a51ca --- /dev/null +++ b/app/src/main/res/drawable/main_gradient_border.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/main_tab_selected.xml b/app/src/main/res/drawable/main_tab_selected.xml new file mode 100644 index 0000000..3e04ebd --- /dev/null +++ b/app/src/main/res/drawable/main_tab_selected.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/main_tab_selector.xml b/app/src/main/res/drawable/main_tab_selector.xml new file mode 100644 index 0000000..bc64c6f --- /dev/null +++ b/app/src/main/res/drawable/main_tab_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/main_tab_unselect.xml b/app/src/main/res/drawable/main_tab_unselect.xml new file mode 100644 index 0000000..bc34020 --- /dev/null +++ b/app/src/main/res/drawable/main_tab_unselect.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_progress_drawable.xml b/app/src/main/res/drawable/splash_progress_drawable.xml new file mode 100644 index 0000000..63c2e1f --- /dev/null +++ b/app/src/main/res/drawable/splash_progress_drawable.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/thumbnail_placeholder.xml b/app/src/main/res/drawable/thumbnail_placeholder.xml new file mode 100644 index 0000000..2cdfaea --- /dev/null +++ b/app/src/main/res/drawable/thumbnail_placeholder.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_display_video.xml b/app/src/main/res/layout/activity_display_video.xml new file mode 100644 index 0000000..74a3dc4 --- /dev/null +++ b/app/src/main/res/layout/activity_display_video.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_favorite.xml b/app/src/main/res/layout/activity_favorite.xml new file mode 100644 index 0000000..0e713ee --- /dev/null +++ b/app/src/main/res/layout/activity_favorite.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..06f6249 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..828dfa1 --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/favorite_adapter.xml b/app/src/main/res/layout/favorite_adapter.xml new file mode 100644 index 0000000..b5db04e --- /dev/null +++ b/app/src/main/res/layout/favorite_adapter.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml new file mode 100644 index 0000000..bb257cd --- /dev/null +++ b/app/src/main/res/layout/fragment_main.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_adapter.xml b/app/src/main/res/layout/main_adapter.xml new file mode 100644 index 0000000..126be25 --- /dev/null +++ b/app/src/main/res/layout/main_adapter.xml @@ -0,0 +1,20 @@ + + + + + + + + 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..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ 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..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ 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 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 zcmV-Y3$650Nk&FW3jhFDMM6+kP&il$0000G0000-002h-06|PpNWB9900E$G+qN-D z+81ABX7q?;bwx%xBg?kcwr$(C-Tex-ZCkHUw(Y9#+`E5-zuONG5fgw~E2WDng@Bc@ z24xy+R1n%~6xI#u9vJ8zREI)sb<&Il(016}Z~V1n^PU3-_H17A*Bf^o)&{_uBv}Py zulRfeE8g(g6HFhk_?o_;0@tz?1I+l+Y#Q*;RVC?(ud`_cU-~n|AX-b`JHrOIqn(-t&rOg-o`#C zh0LPxmbOAEb;zHTu!R3LDh1QO zZTf-|lJNUxi-PpcbRjw3n~n-pG;$+dIF6eqM5+L();B2O2tQ~|p{PlpNcvDbd1l%c zLtXn%lu(3!aNK!V#+HNn_D3lp z2%l+hK-nsj|Bi9;V*WIcQRTt5j90A<=am+cc`J zTYIN|PsYAhJ|=&h*4wI4ebv-C=Be#u>}%m;a{IGmJDU`0snWS&$9zdrT(z8#{OZ_Y zxwJx!ZClUi%YJjD6Xz@OP8{ieyJB=tn?>zaI-4JN;rr`JQbb%y5h2O-?_V@7pG_+y z(lqAsqYr!NyVb0C^|uclHaeecG)Sz;WV?rtoqOdAAN{j%?Uo%owya(F&qps@Id|Of zo@~Y-(YmfB+chv^%*3g4k3R0WqvuYUIA+8^SGJ{2Bl$X&X&v02>+0$4?di(34{pt* zG=f#yMs@Y|b&=HyH3k4yP&goF2LJ#tBLJNNDo6lG06r}ghC-pC4Q*=x3;|+W04zte zAl>l4kzUBQFYF(E`KJy?ZXd1tnfbH+Z~SMmA21KokJNs#eqcXWKUIC>{TuoKe^vhF z);H)o`t9j~`$h1D`#bxe@E`oE`cM9w(@)5Bp8BNukIwM>wZHfd0S;5bcXA*5KT3bj zc&_~`&{z7u{Et!Z_k78H75gXf4g8<_ul!H$eVspPeU3j&&Au=2R*Zp#M9$9s;fqwgzfiX=E_?BwVcfx3tG9Q-+<5fw z%Hs64z)@Q*%s3_Xd5>S4dg$s>@rN^ixeVj*tqu3ZV)biDcFf&l?lGwsa zWj3rvK}?43c{IruV2L`hUU0t^MemAn3U~x3$4mFDxj=Byowu^Q+#wKRPrWywLjIAp z9*n}eQ9-gZmnd9Y0WHtwi2sn6n~?i#n9VN1B*074_VbZZ=WrpkMYr{RsI ztM_8X1)J*DZejxkjOTRJ&a*lrvMKBQURNP#K)a5wIitfu(CFYV4FT?LUB$jVwJSZz zNBFTWg->Yk0j&h3e*a5>B=-xM7dE`IuOQna!u$OoxLlE;WdrNlN)1 z7**de7-hZ!(%_ZllHBLg`Ir#|t>2$*xVOZ-ADZKTN?{(NUeLU9GbuG-+Axf*AZ-P1 z0ZZ*fx+ck4{XtFsbcc%GRStht@q!m*ImssGwuK+P@%gEK!f5dHymg<9nSCXsB6 zQ*{<`%^bxB($Z@5286^-A(tR;r+p7B%^%$N5h%lb*Vlz-?DL9x;!j<5>~kmXP$E}m zQV|7uv4SwFs0jUervsxVUm>&9Y3DBIzc1XW|CUZrUdb<&{@D5yuLe%Xniw^x&{A2s z0q1+owDSfc3Gs?ht;3jw49c#mmrViUfX-yvc_B*wY|Lo7; zGh!t2R#BHx{1wFXReX*~`NS-LpSX z#TV*miO^~B9PF%O0huw!1Zv>^d0G3$^8dsC6VI!$oKDKiXdJt{mGkyA`+Gwd4D-^1qtNTUK)`N*=NTG-6}=5k6suNfdLt*dt8D| z%H#$k)z#ZRcf|zDWB|pn<3+7Nz>?WW9WdkO5(a^m+D4WRJ9{wc>Y}IN)2Kbgn;_O? zGqdr&9~|$Y0tP=N(k7^Eu;iO*w+f%W`20BNo)=Xa@M_)+o$4LXJyiw{F?a633SC{B zl~9FH%?^Rm*LVz`lkULs)%idDX^O)SxQol(3jDRyBVR!7d`;ar+D7do)jQ}m`g$TevUD5@?*P8)voa?kEe@_hl{_h8j&5eB-5FrYW&*FHVt$ z$kRF9Nstj%KRzpjdd_9wO=4zO8ritN*NPk_9avYrsF(!4))tm{Ga#OY z(r{0buexOzu7+rw8E08Gxd`LTOID{*AC1m*6Nw@osfB%0oBF5sf<~wH1kL;sd zo)k6^VyRFU`)dt*iX^9&QtWbo6yE8XXH?`ztvpiOLgI3R+=MOBQ9=rMVgi<*CU%+d1PQQ0a1U=&b0vkF207%xU0ssI2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cafae79ff0ba8360434b39f9f99625766b6ed954 GIT binary patch literal 94089 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..cfaab71 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..b2402d4 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,13 @@ + + + #FF000000 + #FFFFFFFF + #70D7D6D6 + #D4E7FF + #FFEFFC + #536DFF + #FF7FED + #BFFFFFFF + #CA1919 + #C8C6C6 + \ 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..d12a990 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + Dynamic Cartoon Wallpaper + %d%% + Explore + Shift + Trending + Loading failed, please check the network and try again + Some unknown errors occurred during playing, please try again later + Retry + Downloading video, please wait patiently + Set Wallpaper + Favorite + Go collect your favorite wallpapers + Successfully canceled the collection + Failed to cancel collection + The resource is lost, please re-enter this page + \ 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..c4ceef6 --- /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..4df9255 --- /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/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..5506708 --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/src/main/res/xml/video_wallpaper.xml b/app/src/main/res/xml/video_wallpaper.xml new file mode 100644 index 0000000..013b58f --- /dev/null +++ b/app/src/main/res/xml/video_wallpaper.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/test/java/com/video/mobile/wallpaper/ExampleUnitTest.kt b/app/src/test/java/com/video/mobile/wallpaper/ExampleUnitTest.kt new file mode 100644 index 0000000..2a33ce0 --- /dev/null +++ b/app/src/test/java/com/video/mobile/wallpaper/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.video.mobile.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/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..efc3258 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,10 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false +} +buildscript { + dependencies { + classpath("io.objectbox:objectbox-gradle-plugin:4.0.3") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..20e2a01 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# 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 +# 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..4fa6cca --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,26 @@ +[versions] +agp = "8.10.1" +kotlin = "2.0.21" +coreKtx = "1.16.0" +junit = "4.13.2" +junitVersion = "1.3.0" +espressoCore = "3.7.0" +appcompat = "1.7.1" +material = "1.12.0" +activity = "1.10.1" +constraintlayout = "2.2.1" + +[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" } +androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { 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 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6a41b0f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Aug 13 18:04:51 CST 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-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/keystore.properties b/keystore.properties new file mode 100644 index 0000000..f9bb04b --- /dev/null +++ b/keystore.properties @@ -0,0 +1,6 @@ +app_name=Dynamic Cartoon Wallpaper +package_name=com.video.mobile.wallpaper +keystoreFile=app/DynamicCartoonWallpaper.jks +key_alias=DynamicCartoonWallpaperkey0 +key_store_password=DynamicCartoonWallpaper +key_password=DynamicCartoonWallpaper \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..d97fc00 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "Dynamic Cartoon Wallpaper" +include(":app") + \ No newline at end of file