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 0000000..6eba668
Binary files /dev/null and b/app/src/main/res/drawable/img_loading.png differ
diff --git a/app/src/main/res/drawable/img_loading_err.png b/app/src/main/res/drawable/img_loading_err.png
new file mode 100644
index 0000000..6d7b3a2
Binary files /dev/null and b/app/src/main/res/drawable/img_loading_err.png differ
diff --git a/app/src/main/res/drawable/selector_collection.xml b/app/src/main/res/drawable/selector_collection.xml
new file mode 100644
index 0000000..60f2664
--- /dev/null
+++ b/app/src/main/res/drawable/selector_collection.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ 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]