feat: 添加删除收藏功能
This commit is contained in:
parent
5fb27f8d85
commit
e4345888f2
2
.idea/deploymentTargetDropDown.xml
generated
2
.idea/deploymentTargetDropDown.xml
generated
@ -15,7 +15,7 @@
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</targetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2024-04-24T03:32:20.457610Z" />
|
||||
<timeTargetWasSelectedWithDropDown value="2024-04-24T08:47:36.516818Z" />
|
||||
</State>
|
||||
</entry>
|
||||
</value>
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
package com.timber.soft.mylivewallpaper.data
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class CollectViewModel : ViewModel() {
|
||||
|
||||
private var wallpaperDataList: MutableLiveData<List<WallpaperData>> =
|
||||
MutableLiveData<List<WallpaperData>>()
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
wallpaperDataList.value = AppDatabase.dataBase.getWallpaperDao().getCollectData()
|
||||
}
|
||||
}
|
||||
|
||||
fun update() {
|
||||
viewModelScope.launch {
|
||||
wallpaperDataList.value = AppDatabase.dataBase.getWallpaperDao().getCollectData()
|
||||
}
|
||||
}
|
||||
|
||||
fun getList() = wallpaperDataList
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
}
|
||||
}
|
||||
@ -3,18 +3,23 @@ package com.timber.soft.mylivewallpaper.data
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Delete
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import androidx.room.Update
|
||||
|
||||
@Dao
|
||||
interface WallpaperDao {
|
||||
|
||||
@Query("delete from t_wallpaper")
|
||||
suspend fun deleteAllData()
|
||||
|
||||
@Query("select * from t_wallpaper where isCollect = :collect ")
|
||||
suspend fun getCollectData(collect: Boolean = true): List<WallpaperData>
|
||||
|
||||
@Update
|
||||
suspend fun updateData(wallpaperData: WallpaperData)
|
||||
|
||||
@Insert
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertData(wallpaperData: WallpaperData)
|
||||
|
||||
@Delete
|
||||
|
||||
@ -12,7 +12,7 @@ data class WallpaperData(
|
||||
val title: String,
|
||||
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
val id: Int = 0,
|
||||
var id: Int = 0,
|
||||
val classId: String? = null,
|
||||
var isCollect: Boolean = false,
|
||||
var downloadUrl: String? = null
|
||||
|
||||
@ -6,5 +6,6 @@ object AppFinalString {
|
||||
const val DB_VERSION = 1
|
||||
const val TABLE_NAME_WALLPAPER = "t_wallpaper"
|
||||
const val KEY_EXTRA = "KEY_EXTRA"
|
||||
const val ACTION_DATABASE_UPDATED = "ACTION_DATABASE_UPDATED"
|
||||
|
||||
}
|
||||
@ -34,6 +34,7 @@ class MainActivity :
|
||||
binding.mainViewpager.run {
|
||||
adapter = MainViewPagerAdapter(viewPagerFragments, supportFragmentManager)
|
||||
addOnPageChangeListener(this@MainActivity)
|
||||
setOffscreenPageLimit(0)
|
||||
}
|
||||
setTabSelect(0)
|
||||
}
|
||||
|
||||
@ -0,0 +1,63 @@
|
||||
package com.timber.soft.mylivewallpaper.ui.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
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.tools.AppFinalString
|
||||
import com.timber.soft.mylivewallpaper.ui.activity.DetailActivity
|
||||
|
||||
class CollectAdapter(
|
||||
private val context: Context,
|
||||
) : RecyclerView.Adapter<CollectAdapter.CollectItemViewHolder>() {
|
||||
|
||||
private var wallpaperDataList: List<WallpaperData> = emptyList()
|
||||
|
||||
fun updateData(dataList: List<WallpaperData>) {
|
||||
wallpaperDataList = dataList
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
inner class CollectItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
val wallpaperItem = itemView.findViewById<ImageView>(R.id.item_home_img)
|
||||
val rootView = itemView.findViewById<CardView>(R.id.item_home_root)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CollectItemViewHolder {
|
||||
val view = LayoutInflater.from(context).inflate(R.layout.item_home_wallpaper, parent,false)
|
||||
return CollectItemViewHolder(view)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return wallpaperDataList.size
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: CollectItemViewHolder, position: Int) {
|
||||
wallpaperDataList[position].run {
|
||||
try {
|
||||
Glide.with(context).load(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() {
|
||||
context.startActivity(Intent(context, DetailActivity::class.java).apply {
|
||||
putExtra(AppFinalString.KEY_EXTRA, this@run)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,12 +1,75 @@
|
||||
package com.timber.soft.mylivewallpaper.ui.fragment
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
import com.timber.soft.mylivewallpaper.data.CollectViewModel
|
||||
import com.timber.soft.mylivewallpaper.databinding.FragmentCollectBinding
|
||||
import com.timber.soft.mylivewallpaper.tools.AppFinalString
|
||||
import com.timber.soft.mylivewallpaper.ui.adapter.CollectAdapter
|
||||
|
||||
class CollectFragment : BaseFragment() {
|
||||
private lateinit var binding: FragmentCollectBinding
|
||||
private lateinit var collectAdapter: CollectAdapter
|
||||
private lateinit var collectViewModel: CollectViewModel
|
||||
override fun getFragmentContentView(): View {
|
||||
binding = FragmentCollectBinding.inflate(layoutInflater)
|
||||
return binding.root
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val filter = IntentFilter(AppFinalString.ACTION_DATABASE_UPDATED)
|
||||
LocalBroadcastManager.getInstance(requireContext())
|
||||
.registerReceiver(mDatabaseUpdatedReceiver, filter)
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
super.initViews()
|
||||
collectAdapter = CollectAdapter(requireContext())
|
||||
binding.recyclerCollect.run {
|
||||
adapter = collectAdapter
|
||||
layoutManager = StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
collectViewModel.update()
|
||||
}
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
super.onActivityCreated(savedInstanceState)
|
||||
collectViewModel = ViewModelProvider(this)[CollectViewModel::class.java]
|
||||
collectViewModel.getList().observe(viewLifecycleOwner, Observer {
|
||||
collectAdapter.updateData(it)
|
||||
})
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
LocalBroadcastManager.getInstance(requireContext())
|
||||
.unregisterReceiver(mDatabaseUpdatedReceiver)
|
||||
}
|
||||
|
||||
private val mDatabaseUpdatedReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent != null) {
|
||||
if (intent.action.equals(AppFinalString.ACTION_DATABASE_UPDATED)) {
|
||||
collectViewModel.update()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -7,8 +7,15 @@ import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||
import com.timber.soft.mylivewallpaper.R
|
||||
import com.timber.soft.mylivewallpaper.data.AppDatabase
|
||||
import com.timber.soft.mylivewallpaper.databinding.FragmentSettingBinding
|
||||
import com.timber.soft.mylivewallpaper.tools.AppFinalString
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class SettingFragment : BaseFragment() {
|
||||
private lateinit var binding: FragmentSettingBinding
|
||||
@ -19,17 +26,11 @@ class SettingFragment : BaseFragment() {
|
||||
|
||||
override fun initViews() {
|
||||
super.initViews()
|
||||
binding.setLayoutRating.setOnClickListener {
|
||||
RateFragment.newInstance(0, 0).show(childFragmentManager, "")
|
||||
}
|
||||
binding.setLayoutShare.setOnClickListener {
|
||||
val url = getString(R.string.set_shop_link) + (activity?.packageName ?: "")
|
||||
val intent = Intent(Intent.ACTION_SEND)
|
||||
intent.setType("text/plain")
|
||||
intent.putExtra(Intent.EXTRA_TEXT, url)
|
||||
startActivity(intent)
|
||||
}
|
||||
initButton()
|
||||
initInfoCard()
|
||||
}
|
||||
|
||||
private fun initInfoCard() {
|
||||
val pInfo: PackageInfo
|
||||
try {
|
||||
pInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
@ -45,4 +46,34 @@ class SettingFragment : BaseFragment() {
|
||||
binding.setAppVersion.text = "Version: " + ""
|
||||
}
|
||||
}
|
||||
|
||||
private fun initButton() {
|
||||
binding.setLayoutRating.setOnClickListener {
|
||||
RateFragment.newInstance(0, 0).show(childFragmentManager, "")
|
||||
}
|
||||
|
||||
binding.setLayoutShare.setOnClickListener {
|
||||
val url = getString(R.string.set_shop_link) + (activity?.packageName ?: "")
|
||||
val intent = Intent(Intent.ACTION_SEND)
|
||||
intent.setType("text/plain")
|
||||
intent.putExtra(Intent.EXTRA_TEXT, url)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
binding.setLayoutDelete.setOnClickListener() {
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
AppDatabase.dataBase.getWallpaperDao().deleteAllData()
|
||||
}
|
||||
sendDatabaseUpdatedBroadcast()
|
||||
Toast.makeText(
|
||||
requireActivity(), "Cleared all collections successfully.", Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun sendDatabaseUpdatedBroadcast() {
|
||||
val intent = Intent(AppFinalString.ACTION_DATABASE_UPDATED)
|
||||
LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent)
|
||||
}
|
||||
}
|
||||
9
app/src/main/res/drawable/svg_delete.xml
Normal file
9
app/src/main/res/drawable/svg_delete.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:pathData="M857.7,269.8L702.7,269.8C692.7,189 619.4,128 532.4,128S372.1,189 362,269.8L208.9,269.8c-21.1,0 -38.3,16 -38.3,35.8 0,19.8 17.2,35.8 38.3,35.8h55.5v518.8c0,19.8 17.2,35.8 38.3,35.8L762,896c21.2,0 38.3,-16 38.3,-35.8L800.3,341.4h57.4c21.1,0 38.3,-16 38.3,-35.8 0,-19.7 -17.2,-35.8 -38.3,-35.8zM532.4,198.2c45.4,0 84.7,29.9 93.7,71.6L438.6,269.8c9.1,-41.6 48.3,-71.6 93.8,-71.6zM417.5,735c0,19.8 -17.1,35.8 -38.3,35.8 -21.1,0 -38.3,-16 -38.3,-35.8v-286.3c0,-19.8 17.2,-35.8 38.3,-35.8 21.2,0 38.3,16 38.3,35.8v286.3zM570.7,735c0,19.8 -17.2,35.8 -38.3,35.8 -21.2,0 -38.3,-16 -38.3,-35.8v-286.3c0,-19.8 17.2,-35.8 38.3,-35.8 21.1,0 38.3,16 38.3,35.8v286.3zM723.8,735c0,19.8 -17.2,35.8 -38.3,35.8s-38.3,-16 -38.3,-35.8v-286.3c0,-19.8 17.2,-35.8 38.3,-35.8s38.3,16 38.3,35.8v286.3z"
|
||||
android:fillColor="#2c2c2c"/>
|
||||
</vector>
|
||||
@ -26,6 +26,8 @@
|
||||
android:id="@+id/recycler_collect"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="14dp"
|
||||
android:layout_marginEnd="14dp"
|
||||
android:paddingTop="4dp" />
|
||||
|
||||
</LinearLayout>
|
||||
@ -145,4 +145,39 @@
|
||||
</androidx.cardview.widget.CardView>
|
||||
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp"
|
||||
android:layout_marginStart="28dp"
|
||||
android:layout_marginTop="18dp"
|
||||
android:layout_marginEnd="28dp"
|
||||
app:cardCornerRadius="12dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/set_layout_delete"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/set_img_delete"
|
||||
android:layout_width="27dp"
|
||||
android:layout_height="27dp"
|
||||
android:layout_marginStart="25dp"
|
||||
android:src="@drawable/svg_delete" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="20dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/set_setting_delete"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="14sp" />
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
@ -12,6 +12,7 @@
|
||||
<string name="set_rate_us_content">We hope this app is useful for you, if it does, would youplease give us a 5 sar and a mice revtew on Google Play, it really helps!</string>
|
||||
<string name="set_cancel">CANCEL</string>
|
||||
<string name="set_rate_it">RATE IT</string>
|
||||
<string name="set_setting_delete">Clear All My Favorites</string>
|
||||
|
||||
<string name="collect_title">My Collection</string>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user