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]