Add favourites apps [2/2]

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-07-02 20:00:27 +07:00
parent bbedb30d46
commit 81d3b15ce2
7 changed files with 88 additions and 5 deletions

View File

@@ -0,0 +1,8 @@
package com.aurora.store.data.room.favourites
import com.aurora.store.BuildConfig
data class ImportExport(
val favourites: List<Favourite>,
val auroraStoreVersion: Int = BuildConfig.VERSION_CODE,
)

View File

@@ -1,6 +1,7 @@
package com.aurora.store.module
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -14,6 +15,8 @@ object CommonModule {
@Singleton
@Provides
fun providesGsonInstance(): Gson {
return Gson()
return GsonBuilder()
.setPrettyPrinting()
.create()
}
}

View File

@@ -19,11 +19,14 @@
package com.aurora.store.view.ui.commons
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.aurora.extensions.toast
import com.aurora.store.R
import com.aurora.store.data.room.favourites.Favourite
import com.aurora.store.databinding.FragmentFavouriteBinding
@@ -33,6 +36,7 @@ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
import com.aurora.store.viewmodel.all.FavouriteViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import java.util.Calendar
@AndroidEntryPoint
class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
@@ -43,6 +47,16 @@ class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
private val viewModel: FavouriteViewModel by viewModels()
private val mimeType = "application/json"
private val startForDocumentImport =
registerForActivityResult(ActivityResultContracts.OpenDocument()) {
if (it != null) importDeviceConfig(it) else toast(R.string.toast_fav_import_failed)
}
private val startForDocumentExport =
registerForActivityResult(ActivityResultContracts.CreateDocument(mimeType)) {
if (it != null) exportDeviceConfig(it) else toast(R.string.toast_fav_export_failed)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -55,8 +69,21 @@ class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
}
// Toolbar
binding.toolbar.setNavigationOnClickListener {
findNavController().navigateUp()
binding.toolbar.apply {
setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_import -> startForDocumentImport.launch(arrayOf(mimeType))
R.id.action_export -> {
startForDocumentExport.launch(
"aurora_store_favourites_${Calendar.getInstance().time.time}.json"
)
}
else -> {}
}
true
}
setNavigationOnClickListener { findNavController().navigateUp() }
}
}
@@ -75,7 +102,7 @@ class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
.id(i)
)
}
} else if(favourites.isEmpty()) {
} else if (favourites.isEmpty()) {
add(
NoAppViewModel_()
.id("no_app")
@@ -95,4 +122,15 @@ class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
}
}
}
private fun importDeviceConfig(uri: Uri) {
viewModel.importFavourites(requireContext(), uri)
binding.recycler.requestModelBuild()
toast(R.string.toast_fav_import_success)
}
private fun exportDeviceConfig(uri: Uri) {
viewModel.exportFavourites(requireContext(), uri)
toast(R.string.toast_fav_export_success)
}
}

View File

@@ -72,7 +72,7 @@ class SpoofFragment : Fragment(R.layout.activity_generic_pager) {
elevation = 0f
title = getString(R.string.title_spoof_manager)
navigationIcon = ContextCompat.getDrawable(view.context, R.drawable.ic_arrow_back)
inflateMenu(R.menu.menu_spoof)
inflateMenu(R.menu.menu_import_export)
setNavigationOnClickListener { findNavController().navigateUp() }
setOnMenuItemClickListener {
when (it.itemId) {

View File

@@ -19,9 +19,15 @@
package com.aurora.store.viewmodel.all
import android.content.Context
import android.net.Uri
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.aurora.store.data.room.favourites.Favourite
import com.aurora.store.data.room.favourites.FavouriteDao
import com.aurora.store.data.room.favourites.ImportExport
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharingStarted
@@ -32,11 +38,32 @@ import javax.inject.Inject
@HiltViewModel
class FavouriteViewModel @Inject constructor(
private val favouriteDao: FavouriteDao,
private val gson: Gson
) : ViewModel() {
val favouritesList = favouriteDao.favourites()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
fun importFavourites(context: Context, uri: Uri) {
viewModelScope.launch(Dispatchers.IO) {
context.contentResolver.openInputStream(uri)?.use {
val type = object : TypeToken<ImportExport>() {}.type
val importExport = gson.fromJson<ImportExport>(it.bufferedReader().readText(), type)
favouriteDao.insertAll(
importExport.favourites.map { fav -> fav.copy(mode = Favourite.Mode.IMPORT) }
)
}
}
}
fun exportFavourites(context: Context, uri: Uri) {
viewModelScope.launch(Dispatchers.IO) {
context.contentResolver.openOutputStream(uri)?.use {
it.write(gson.toJson(ImportExport(favouritesList.value!!)).encodeToByteArray())
}
}
}
fun removeFavourite(packageName: String) {
viewModelScope.launch(Dispatchers.IO) {
favouriteDao.delete(packageName)