From 9f5c9e4d176879abe6cbed01c4bd36f2789b36e2 Mon Sep 17 00:00:00 2001 From: LUX-Timber Date: Mon, 22 Apr 2024 16:07:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E4=BA=86=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetDropDown.xml | 15 ++- app/build.gradle | 27 +++++ app/src/main/AndroidManifest.xml | 5 +- .../mylivewallpaper/activity/MainActivity.kt | 23 ---- .../adapter/ViewPagerAdapter.kt | 14 --- .../mylivewallpaper/data/WallpaperData.kt | 19 +++ .../data/WallpaperViewModel.kt | 65 +++++++++++ .../fragment/CollectFragment.kt | 9 -- .../mylivewallpaper/fragment/HomeFragment.kt | 4 - .../fragment/SettingFragment.kt | 9 -- .../mylivewallpaper/tools/AppFinalString.kt | 5 + .../soft/mylivewallpaper/tools/AppTools.kt | 17 +++ .../mylivewallpaper/tools/MyApplication.kt | 16 +++ .../{ => ui}/activity/BaseActivity.kt | 16 ++- .../ui/activity/MainActivity.kt | 97 +++++++++++++++ .../{ => ui}/activity/StartActivity.kt | 2 +- .../ui/adapter/HomeItemAdapter.kt | 55 +++++++++ .../ui/adapter/MainViewPagerAdapter.kt | 18 +++ .../{ => ui}/fragment/BaseFragment.kt | 3 +- .../ui/fragment/CollectFragment.kt | 12 ++ .../ui/fragment/HomeFragment.kt | 77 ++++++++++++ .../ui/fragment/SettingFragment.kt | 12 ++ .../ui/listener/OnHomeItemClickListener.kt | 7 ++ app/src/main/res/drawable/img_loading.png | Bin 0 -> 5708 bytes app/src/main/res/drawable/img_loading_err.png | Bin 0 -> 5362 bytes .../main/res/drawable/selector_collection.xml | 7 ++ app/src/main/res/drawable/selector_home.xml | 7 ++ .../main/res/drawable/selector_setting.xml | 7 ++ app/src/main/res/drawable/svg_collection.xml | 9 ++ .../res/drawable/svg_collection_enable.xml | 9 ++ app/src/main/res/drawable/svg_home.xml | 9 ++ app/src/main/res/drawable/svg_home_enable.xml | 9 ++ app/src/main/res/drawable/svg_loading.xml | 9 ++ app/src/main/res/drawable/svg_loading_err.xml | 12 ++ app/src/main/res/drawable/svg_setting.xml | 9 ++ .../main/res/drawable/svg_setting_enable.xml | 9 ++ app/src/main/res/layout/activity_main.xml | 110 ++++++++++++++++-- app/src/main/res/layout/activity_start.xml | 2 +- app/src/main/res/layout/fragment_collect.xml | 6 + app/src/main/res/layout/fragment_home.xml | 34 ++++++ app/src/main/res/layout/fragment_setting.xml | 6 + .../main/res/layout/item_home_wallpaper.xml | 20 ++++ app/src/main/res/values/colors.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- gradle.properties | 4 +- gradle/libs.versions.toml | 6 + 46 files changed, 735 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/activity/MainActivity.kt delete mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/adapter/ViewPagerAdapter.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperViewModel.kt delete mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/fragment/CollectFragment.kt delete mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/fragment/HomeFragment.kt delete mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/fragment/SettingFragment.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/tools/MyApplication.kt rename app/src/main/java/com/timber/soft/mylivewallpaper/{ => ui}/activity/BaseActivity.kt (65%) create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/MainActivity.kt rename app/src/main/java/com/timber/soft/mylivewallpaper/{ => ui}/activity/StartActivity.kt (95%) create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/HomeItemAdapter.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/MainViewPagerAdapter.kt rename app/src/main/java/com/timber/soft/mylivewallpaper/{ => ui}/fragment/BaseFragment.kt (92%) create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/CollectFragment.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/HomeFragment.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt create mode 100644 app/src/main/java/com/timber/soft/mylivewallpaper/ui/listener/OnHomeItemClickListener.kt create mode 100644 app/src/main/res/drawable/img_loading.png create mode 100644 app/src/main/res/drawable/img_loading_err.png create mode 100644 app/src/main/res/drawable/selector_collection.xml create mode 100644 app/src/main/res/drawable/selector_home.xml create mode 100644 app/src/main/res/drawable/selector_setting.xml create mode 100644 app/src/main/res/drawable/svg_collection.xml create mode 100644 app/src/main/res/drawable/svg_collection_enable.xml create mode 100644 app/src/main/res/drawable/svg_home.xml create mode 100644 app/src/main/res/drawable/svg_home_enable.xml create mode 100644 app/src/main/res/drawable/svg_loading.xml create mode 100644 app/src/main/res/drawable/svg_loading_err.xml create mode 100644 app/src/main/res/drawable/svg_setting.xml create mode 100644 app/src/main/res/drawable/svg_setting_enable.xml create mode 100644 app/src/main/res/layout/fragment_collect.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_setting.xml create mode 100644 app/src/main/res/layout/item_home_wallpaper.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 0c0c338..6faa8eb 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,7 +3,20 @@ - + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 5ba822b..ad15ccf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) + id("kotlin-kapt") } android { @@ -33,6 +34,7 @@ android { buildFeatures { viewBinding = true + buildConfig = true } } @@ -47,4 +49,29 @@ dependencies { testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core + + implementation 'androidx.appcompat:appcompat:1.0.0' //必须 1.0.0 以上 + implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0' //核心必须依赖 + implementation 'io.github.scwang90:refresh-header-classics:2.1.0' //经典刷新头 + implementation 'io.github.scwang90:refresh-header-radar:2.1.0' //雷达刷新头 + implementation 'io.github.scwang90:refresh-header-falsify:2.1.0' //虚拟刷新头 + implementation 'io.github.scwang90:refresh-header-material:2.1.0' //谷歌刷新头 + implementation 'io.github.scwang90:refresh-header-two-level:2.1.0' //二级刷新头 + implementation 'io.github.scwang90:refresh-footer-ball:2.1.0' //球脉冲加载 + implementation 'io.github.scwang90:refresh-footer-classics:2.1.0' //经典加载 + + implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + + kapt 'androidx.room:room-compiler:2.6.1' + implementation 'androidx.room:room-runtime:2.6.1' + implementation("androidx.room:room-ktx:2.6.1") + + // viewModel + implementation(libs.lifecycle.viewmodel.ktx) + //viewModel初始化用 + implementation(libs.activity.ktx) + implementation(libs.fragment.ktx) + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a87876e..d097404 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ @@ -24,7 +25,7 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/MainActivity.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/activity/MainActivity.kt deleted file mode 100644 index a06a224..0000000 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/MainActivity.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.timber.soft.mylivewallpaper.activity - -import android.os.Bundle -import android.view.View -import androidx.activity.enableEdgeToEdge -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import com.timber.soft.mylivewallpaper.R -import com.timber.soft.mylivewallpaper.databinding.ActivityMainBinding - -class MainActivity : BaseActivity() { - private lateinit var binding: ActivityMainBinding - override fun getActivityContentView(): View { - binding = ActivityMainBinding.inflate(layoutInflater) - return binding.root - } - - override fun initViews() { - super.initViews() - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/adapter/ViewPagerAdapter.kt deleted file mode 100644 index 69e8de9..0000000 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/adapter/ViewPagerAdapter.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.timber.soft.mylivewallpaper.adapter - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentPagerAdapter - -class ViewPagerAdapter : FragmentPagerAdapter() { - override fun getCount(): Int { - TODO("Not yet implemented") - } - - override fun getItem(position: Int): Fragment { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt new file mode 100644 index 0000000..6b1b37a --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt @@ -0,0 +1,19 @@ +package com.timber.soft.mylivewallpaper.data + +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.timber.soft.mylivewallpaper.tools.AppFinalString +import java.io.Serializable + +@Entity(tableName = AppFinalString.TABLE_NAME_WALLPAPER) +data class WallpaperData( + val thumbnail: String, + val preview: String, + val title: String, + + @PrimaryKey(autoGenerate = true) + val id: Int = 0, + val classId: String? = null, + var isCollect: Boolean = false, + var downloadUrl: String? = null, +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperViewModel.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperViewModel.kt new file mode 100644 index 0000000..740cd0f --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperViewModel.kt @@ -0,0 +1,65 @@ +package com.timber.soft.mylivewallpaper.data + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.timber.soft.mylivewallpaper.tools.AppTools +import com.timber.soft.mylivewallpaper.tools.AppTools.parseJsonFile +import com.timber.soft.mylivewallpaper.tools.MyApplication +import java.util.concurrent.atomic.AtomicBoolean + +class WallpaperViewModel : ViewModel() { + private var wallpaperDataListLiveData: MutableLiveData> = + MutableLiveData() + private var wallpaperDataList: MutableList = mutableListOf() + private var wallpaperPoolsList: MutableList = mutableListOf() + var isLoading = AtomicBoolean(false) + + fun getData(): MutableLiveData> { + return wallpaperDataListLiveData + } + + fun updateWallpaper() { + if (isLoading.get()) { + return + } + try { + isLoading.set(true) + wallpaperDataList.clear() + wallpaperPoolsList.clear() + wallpaperPoolsList.addAll(getDataList()) + val list = wallpaperPoolsList.subList(0, 40) + wallpaperDataList.addAll(list) + wallpaperPoolsList.removeAll(list) + } catch (e: Exception) { + e.printStackTrace() + } finally { + wallpaperDataListLiveData.postValue(wallpaperDataList) + isLoading.set(false) + } + } + + fun loadWallpaper() { + if (isLoading.get()) { + return + } + try { + isLoading.set(true) + val list = wallpaperPoolsList.subList(0, 20) + wallpaperDataList.addAll(list) + wallpaperPoolsList.removeAll(list) + } catch (e: Exception) { + e.printStackTrace() + } finally { + wallpaperDataListLiveData.postValue(wallpaperDataList) + isLoading.set(false) + } + } + + private fun getDataList(): List { + return parseJsonFile(MyApplication.appContext.assets.open("live.json")).shuffled() + } + + override fun onCleared() { + super.onCleared() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/CollectFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/CollectFragment.kt deleted file mode 100644 index 45c8de0..0000000 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/CollectFragment.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.timber.soft.mylivewallpaper.fragment - -import android.view.View - -class CollectFragment :BaseFragment(){ - override fun getFragmentContentView(): View { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/HomeFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/HomeFragment.kt deleted file mode 100644 index 80b2f37..0000000 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/HomeFragment.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.timber.soft.mylivewallpaper.fragment - -class HomeFragment { -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/SettingFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/SettingFragment.kt deleted file mode 100644 index 5ff44eb..0000000 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/SettingFragment.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.timber.soft.mylivewallpaper.fragment - -import android.view.View - -class SettingFragment :BaseFragment(){ - override fun getFragmentContentView(): View { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt new file mode 100644 index 0000000..9cc3545 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt @@ -0,0 +1,5 @@ +package com.timber.soft.mylivewallpaper.tools + +object AppFinalString { + const val TABLE_NAME_WALLPAPER = "wallpaper" +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt new file mode 100644 index 0000000..2996f91 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppTools.kt @@ -0,0 +1,17 @@ +package com.timber.soft.mylivewallpaper.tools + +import android.os.Handler +import android.os.Looper +import com.google.gson.Gson +import com.timber.soft.mylivewallpaper.data.WallpaperData +import java.io.InputStream +import java.io.InputStreamReader + +object AppTools { + fun onMain(operation: () -> Unit) = Handler(Looper.getMainLooper()).post(operation) + fun parseJsonFile(jsonInputStream: InputStream): List { + val reader = InputStreamReader(jsonInputStream) + val jsonString = reader.readText() + return Gson().fromJson(jsonString, Array::class.java).toMutableList() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/MyApplication.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/MyApplication.kt new file mode 100644 index 0000000..2cd3cbf --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/MyApplication.kt @@ -0,0 +1,16 @@ +package com.timber.soft.mylivewallpaper.tools + +import android.app.Application +import android.content.Context + +class MyApplication : Application() { + companion object { + lateinit var appContext: Context + } + + override fun onCreate() { + super.onCreate() + appContext = this + } +} + diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/BaseActivity.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/BaseActivity.kt similarity index 65% rename from app/src/main/java/com/timber/soft/mylivewallpaper/activity/BaseActivity.kt rename to app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/BaseActivity.kt index 1743c2c..c61535e 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/BaseActivity.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/BaseActivity.kt @@ -1,4 +1,4 @@ -package com.timber.soft.mylivewallpaper.activity +package com.timber.soft.mylivewallpaper.ui.activity import android.graphics.Color import android.os.Build @@ -14,12 +14,22 @@ abstract class BaseActivity : AppCompatActivity() { } open fun initViews() { + initStatusBar() + } + + abstract fun getActivityContentView(): View + + private fun initStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.statusBarColor = Color.TRANSPARENT } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// window.decorView.systemUiVisibility = +// (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) +// window.statusBarColor = Color.TRANSPARENT +// } } +} - abstract fun getActivityContentView(): View -} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/MainActivity.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/MainActivity.kt new file mode 100644 index 0000000..3e0fdc7 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/MainActivity.kt @@ -0,0 +1,97 @@ +package com.timber.soft.mylivewallpaper.ui.activity + +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentPagerAdapter +import androidx.viewpager.widget.ViewPager.OnPageChangeListener +import com.timber.soft.mylivewallpaper.databinding.ActivityMainBinding +import com.timber.soft.mylivewallpaper.ui.adapter.MainViewPagerAdapter +import com.timber.soft.mylivewallpaper.ui.fragment.CollectFragment +import com.timber.soft.mylivewallpaper.ui.fragment.HomeFragment +import com.timber.soft.mylivewallpaper.ui.fragment.SettingFragment + +class MainActivity : + BaseActivity(), + OnPageChangeListener, + View.OnClickListener { + private lateinit var binding: ActivityMainBinding + private var viewPagerFragments = mutableListOf() + override fun getActivityContentView(): View { + binding = ActivityMainBinding.inflate(layoutInflater) + return binding.root + } + + override fun initViews() { + super.initViews() + initViewPager() + initTab() + } + + private fun initViewPager() { + viewPagerFragments.add(HomeFragment()) + viewPagerFragments.add(CollectFragment()) + viewPagerFragments.add(SettingFragment()) + binding.mainViewpager.run { + adapter = MainViewPagerAdapter(viewPagerFragments, supportFragmentManager) + addOnPageChangeListener(this@MainActivity) + } + setTabSelect(0) + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + } + + override fun onPageSelected(position: Int) { + setTabSelect(position) + } + + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onClick(v: View?) { + when (v) { + binding.mainTabHome -> { + setTabSelect(0) + } + + binding.mainTabCollect -> { + setTabSelect(1) + } + + binding.mainTabSet -> { + setTabSelect(2) + } + } + } + + private fun setTabSelect(position: Int) { + when (position) { + 0 -> { + binding.mainTabHome.isSelected = true + binding.mainTabCollect.isSelected = false + binding.mainTabSet.isSelected = false + binding.mainViewpager.currentItem = 0 + } + + 1 -> { + binding.mainTabHome.isSelected = false + binding.mainTabCollect.isSelected = true + binding.mainTabSet.isSelected = false + binding.mainViewpager.currentItem = 1 + } + + 2 -> { + binding.mainTabHome.isSelected = false + binding.mainTabCollect.isSelected = false + binding.mainTabSet.isSelected = true + binding.mainViewpager.currentItem = 2 + } + } + } + + private fun initTab() { + binding.mainTabHome.setOnClickListener(this) + binding.mainTabCollect.setOnClickListener(this) + binding.mainTabSet.setOnClickListener(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/StartActivity.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/StartActivity.kt similarity index 95% rename from app/src/main/java/com/timber/soft/mylivewallpaper/activity/StartActivity.kt rename to app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/StartActivity.kt index b6fac01..1912831 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/activity/StartActivity.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/activity/StartActivity.kt @@ -1,4 +1,4 @@ -package com.timber.soft.mylivewallpaper.activity +package com.timber.soft.mylivewallpaper.ui.activity import android.content.Intent import android.view.View diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/HomeItemAdapter.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/HomeItemAdapter.kt new file mode 100644 index 0000000..3b5aad4 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/HomeItemAdapter.kt @@ -0,0 +1,55 @@ +package com.timber.soft.mylivewallpaper.ui.adapter + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.cardview.widget.CardView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.timber.soft.mylivewallpaper.R +import com.timber.soft.mylivewallpaper.data.WallpaperData +import com.timber.soft.mylivewallpaper.ui.listener.OnHomeItemClickListener + +class HomeItemAdapter( + private val context: Context, + private val wallpaperDataList: MutableList, + private val listener: OnHomeItemClickListener +) : RecyclerView.Adapter() { + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val wallpaperItem = itemView.findViewById(R.id.item_home_img) + val rootView = itemView.findViewById(R.id.item_home_root) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_home_wallpaper, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return wallpaperDataList.size + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val wallpaperData = wallpaperDataList[position] + try { + Glide.with(context).load(wallpaperData.thumbnail) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .transition(DrawableTransitionOptions.withCrossFade()).apply( + RequestOptions().placeholder(R.drawable.img_loading) + ).error(R.drawable.img_loading_err).into(holder.wallpaperItem) + } catch (e: Exception) { + e.printStackTrace() + } + + holder.rootView.setOnClickListener() { + listener.onItemClick(position, wallpaperData) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/MainViewPagerAdapter.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/MainViewPagerAdapter.kt new file mode 100644 index 0000000..11f44ca --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/MainViewPagerAdapter.kt @@ -0,0 +1,18 @@ +package com.timber.soft.mylivewallpaper.ui.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class MainViewPagerAdapter( + private val pagerData: List, + private val fragmentManager: FragmentManager +) : FragmentPagerAdapter(fragmentManager) { + override fun getCount(): Int { + return pagerData.size + } + + override fun getItem(position: Int): Fragment { + return pagerData[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/BaseFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/BaseFragment.kt similarity index 92% rename from app/src/main/java/com/timber/soft/mylivewallpaper/fragment/BaseFragment.kt rename to app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/BaseFragment.kt index b0cc550..a00d232 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/fragment/BaseFragment.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/BaseFragment.kt @@ -1,4 +1,4 @@ -package com.timber.soft.mylivewallpaper.fragment +package com.timber.soft.mylivewallpaper.ui.fragment import android.os.Bundle @@ -21,7 +21,6 @@ abstract class BaseFragment : Fragment() { } open fun initViews() { - } abstract fun getFragmentContentView(): View diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/CollectFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/CollectFragment.kt new file mode 100644 index 0000000..63b395f --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/CollectFragment.kt @@ -0,0 +1,12 @@ +package com.timber.soft.mylivewallpaper.ui.fragment + +import android.view.View +import com.timber.soft.mylivewallpaper.databinding.FragmentCollectBinding + +class CollectFragment : BaseFragment() { + private lateinit var binding: FragmentCollectBinding + override fun getFragmentContentView(): View { + binding = FragmentCollectBinding.inflate(layoutInflater) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/HomeFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/HomeFragment.kt new file mode 100644 index 0000000..2bd8899 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/HomeFragment.kt @@ -0,0 +1,77 @@ +package com.timber.soft.mylivewallpaper.ui.fragment + +import android.util.Log +import android.view.View +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.timber.soft.mylivewallpaper.data.WallpaperData +import com.timber.soft.mylivewallpaper.data.WallpaperViewModel +import com.timber.soft.mylivewallpaper.databinding.FragmentHomeBinding +import com.timber.soft.mylivewallpaper.ui.adapter.HomeItemAdapter +import com.timber.soft.mylivewallpaper.ui.listener.OnHomeItemClickListener +import kotlinx.coroutines.Dispatchers +import androidx.fragment.app.viewModels +import com.timber.soft.mylivewallpaper.tools.AppTools.onMain +import kotlinx.coroutines.launch + +class HomeFragment : BaseFragment() { + + private lateinit var binding: FragmentHomeBinding + private val wallpaperViewModel: WallpaperViewModel by viewModels() + private var wallpaperDataList: MutableList = mutableListOf() + private lateinit var homeItemAdapter: HomeItemAdapter + + override fun getFragmentContentView(): View { + binding = FragmentHomeBinding.inflate(layoutInflater) + return binding.root + } + + override fun initViews() { + super.initViews() + initRecyclerView() + initRefreshLayout() + } + + private fun initRefreshLayout() { + binding.homeRefreshLayout.setOnRefreshListener { + if (wallpaperViewModel.isLoading.get()) { + return@setOnRefreshListener + } + lifecycleScope.launch(Dispatchers.IO) { + wallpaperViewModel.updateWallpaper() + } + } + + binding.homeRefreshLayout.setOnLoadMoreListener { + if (wallpaperViewModel.isLoading.get()) { + return@setOnLoadMoreListener + } + wallpaperViewModel.loadWallpaper() + } + + wallpaperViewModel.getData().observe(this) { list -> + wallpaperDataList.clear() + wallpaperDataList.addAll(list) + onMain { + binding.homeRefreshLayout.finishRefresh() + binding.homeRefreshLayout.finishLoadMore() + homeItemAdapter.notifyDataSetChanged() + } + } + } + + private fun initRecyclerView() { + homeItemAdapter = + HomeItemAdapter(requireContext(), wallpaperDataList, object : OnHomeItemClickListener { + override fun onItemClick(position: Int, wallpaperData: WallpaperData) { +// val intent = Intent(requireContext()) + Log.d("home_item_root", "item has been click!") + } + }) + binding.homeRecyclerview.run { + layoutManager = StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL) + adapter = homeItemAdapter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt new file mode 100644 index 0000000..224b358 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/fragment/SettingFragment.kt @@ -0,0 +1,12 @@ +package com.timber.soft.mylivewallpaper.ui.fragment + +import android.view.View +import com.timber.soft.mylivewallpaper.databinding.FragmentSettingBinding + +class SettingFragment : BaseFragment() { + private lateinit var binding: FragmentSettingBinding + override fun getFragmentContentView(): View { + binding = FragmentSettingBinding.inflate(layoutInflater) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/listener/OnHomeItemClickListener.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/listener/OnHomeItemClickListener.kt new file mode 100644 index 0000000..e781d95 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/listener/OnHomeItemClickListener.kt @@ -0,0 +1,7 @@ +package com.timber.soft.mylivewallpaper.ui.listener + +import com.timber.soft.mylivewallpaper.data.WallpaperData + +interface OnHomeItemClickListener { + fun onItemClick(position: Int, wallpaperData: WallpaperData) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/img_loading.png b/app/src/main/res/drawable/img_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..6eba6682152f057eadadbd544a2f18ee989fdb34 GIT binary patch literal 5708 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 eUrP`Ax&tjqnC`^$m + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_home.xml b/app/src/main/res/drawable/selector_home.xml new file mode 100644 index 0000000..392ef01 --- /dev/null +++ b/app/src/main/res/drawable/selector_home.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_setting.xml b/app/src/main/res/drawable/selector_setting.xml new file mode 100644 index 0000000..c93c153 --- /dev/null +++ b/app/src/main/res/drawable/selector_setting.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_collection.xml b/app/src/main/res/drawable/svg_collection.xml new file mode 100644 index 0000000..0c3554d --- /dev/null +++ b/app/src/main/res/drawable/svg_collection.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_collection_enable.xml b/app/src/main/res/drawable/svg_collection_enable.xml new file mode 100644 index 0000000..ad6dad5 --- /dev/null +++ b/app/src/main/res/drawable/svg_collection_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_home.xml b/app/src/main/res/drawable/svg_home.xml new file mode 100644 index 0000000..cc1e575 --- /dev/null +++ b/app/src/main/res/drawable/svg_home.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_home_enable.xml b/app/src/main/res/drawable/svg_home_enable.xml new file mode 100644 index 0000000..2492653 --- /dev/null +++ b/app/src/main/res/drawable/svg_home_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_loading.xml b/app/src/main/res/drawable/svg_loading.xml new file mode 100644 index 0000000..be64742 --- /dev/null +++ b/app/src/main/res/drawable/svg_loading.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_loading_err.xml b/app/src/main/res/drawable/svg_loading_err.xml new file mode 100644 index 0000000..7d168dd --- /dev/null +++ b/app/src/main/res/drawable/svg_loading_err.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/svg_setting.xml b/app/src/main/res/drawable/svg_setting.xml new file mode 100644 index 0000000..e68592f --- /dev/null +++ b/app/src/main/res/drawable/svg_setting.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_setting_enable.xml b/app/src/main/res/drawable/svg_setting_enable.xml new file mode 100644 index 0000000..d60a154 --- /dev/null +++ b/app/src/main/res/drawable/svg_setting_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2ac34c2..ff7083b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,24 +1,112 @@ - + android:orientation="vertical" + tools:context=".ui.activity.MainActivity"> + android:layout_height="match_parent" /> - + android:layout_height="56dp" - \ No newline at end of file + android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" + + android:layout_marginStart="40dp" + android:layout_marginEnd="40dp" + android:layout_marginBottom="44dp" + android:backgroundTint="@color/white" + android:gravity="center" + app:cardCornerRadius="28dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_start.xml b/app/src/main/res/layout/activity_start.xml index ebc36b9..cf20d82 100644 --- a/app/src/main/res/layout/activity_start.xml +++ b/app/src/main/res/layout/activity_start.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" - tools:context=".activity.StartActivity"> + tools:context=".ui.activity.StartActivity"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..4b44d8b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_setting.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_wallpaper.xml b/app/src/main/res/layout/item_home_wallpaper.xml new file mode 100644 index 0000000..efa15dc --- /dev/null +++ b/app/src/main/res/layout/item_home_wallpaper.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ddedc13..16e34e6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,8 +1,8 @@ - #FF000000 + #FF2C2C2C #FFFFFFFF #3095DE - #CFEBFF + #80BFEFFF #B4DEFE \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57304fe..07b69ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,7 @@ MyLiveWallpaper - + Home + Collect + Set \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 20e2a01..f59eb09 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ 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 +android.nonTransitiveRClass=true + +android.enableJetifier=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 67b4232..625763d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,10 @@ espressoCore = "3.5.1" appcompat = "1.6.1" material = "1.11.0" activity = "1.8.0" +activity-ktx = "1.9.0" +fragment-ktx = "1.6.2" constraintlayout = "2.1.4" +lifecycle = "2.7.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -18,6 +21,9 @@ androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-co 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" } +lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activity-ktx" } +fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment-ktx" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } [plugins]