diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 3509c3c..d4fc0b9 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -15,7 +15,7 @@ - + diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/CollectViewModel.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/CollectViewModel.kt new file mode 100644 index 0000000..c21ddd5 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/CollectViewModel.kt @@ -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> = + MutableLiveData>() + + 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() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt index 98b5ae8..dec3b4d 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperDao.kt @@ -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 @Update suspend fun updateData(wallpaperData: WallpaperData) - @Insert + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertData(wallpaperData: WallpaperData) @Delete 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 index c3ffa61..018e1e6 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/data/WallpaperData.kt @@ -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 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 index 8208084..2683974 100644 --- a/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/tools/AppFinalString.kt @@ -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" } \ 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 index 3e0fdc7..c1021d1 100644 --- 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 @@ -34,6 +34,7 @@ class MainActivity : binding.mainViewpager.run { adapter = MainViewPagerAdapter(viewPagerFragments, supportFragmentManager) addOnPageChangeListener(this@MainActivity) + setOffscreenPageLimit(0) } setTabSelect(0) } diff --git a/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/CollectAdapter.kt b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/CollectAdapter.kt new file mode 100644 index 0000000..1d77209 --- /dev/null +++ b/app/src/main/java/com/timber/soft/mylivewallpaper/ui/adapter/CollectAdapter.kt @@ -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() { + + private var wallpaperDataList: List = emptyList() + + fun updateData(dataList: List) { + wallpaperDataList = dataList + notifyDataSetChanged() + } + + inner class CollectItemViewHolder(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): 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) + }) + } + } + } +} \ No newline at end of file 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 index 63b395f..19e7389 100644 --- 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 @@ -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() + } + } + } + } } \ 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 index 4fada93..e632bc4 100644 --- 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 @@ -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) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_delete.xml b/app/src/main/res/drawable/svg_delete.xml new file mode 100644 index 0000000..c366025 --- /dev/null +++ b/app/src/main/res/drawable/svg_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_collect.xml b/app/src/main/res/layout/fragment_collect.xml index 0ef716c..dba6421 100644 --- a/app/src/main/res/layout/fragment_collect.xml +++ b/app/src/main/res/layout/fragment_collect.xml @@ -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" /> \ 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 index f008213..18f5b15 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -145,4 +145,39 @@ + + + + + + + + + + + + \ 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 286e044..70bf683 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ 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! CANCEL RATE IT + Clear All My Favorites My Collection