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

View File

@@ -19,11 +19,14 @@
package com.aurora.store.view.ui.commons package com.aurora.store.view.ui.commons
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.room.favourites.Favourite import com.aurora.store.data.room.favourites.Favourite
import com.aurora.store.databinding.FragmentFavouriteBinding 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 com.aurora.store.viewmodel.all.FavouriteViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Calendar
@AndroidEntryPoint @AndroidEntryPoint
class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) { 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 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -55,8 +69,21 @@ class FavouriteFragment : BaseFragment(R.layout.fragment_favourite) {
} }
// Toolbar // Toolbar
binding.toolbar.setNavigationOnClickListener { binding.toolbar.apply {
findNavController().navigateUp() 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) .id(i)
) )
} }
} else if(favourites.isEmpty()) { } else if (favourites.isEmpty()) {
add( add(
NoAppViewModel_() NoAppViewModel_()
.id("no_app") .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 elevation = 0f
title = getString(R.string.title_spoof_manager) title = getString(R.string.title_spoof_manager)
navigationIcon = ContextCompat.getDrawable(view.context, R.drawable.ic_arrow_back) navigationIcon = ContextCompat.getDrawable(view.context, R.drawable.ic_arrow_back)
inflateMenu(R.menu.menu_spoof) inflateMenu(R.menu.menu_import_export)
setNavigationOnClickListener { findNavController().navigateUp() } setNavigationOnClickListener { findNavController().navigateUp() }
setOnMenuItemClickListener { setOnMenuItemClickListener {
when (it.itemId) { when (it.itemId) {

View File

@@ -19,9 +19,15 @@
package com.aurora.store.viewmodel.all package com.aurora.store.viewmodel.all
import android.content.Context
import android.net.Uri
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope 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.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 dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
@@ -32,11 +38,32 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class FavouriteViewModel @Inject constructor( class FavouriteViewModel @Inject constructor(
private val favouriteDao: FavouriteDao, private val favouriteDao: FavouriteDao,
private val gson: Gson
) : ViewModel() { ) : ViewModel() {
val favouritesList = favouriteDao.favourites() val favouritesList = favouriteDao.favourites()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .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) { fun removeFavourite(packageName: String) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
favouriteDao.delete(packageName) favouriteDao.delete(packageName)

View File

@@ -29,6 +29,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize" android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" android:theme="?attr/actionBarTheme"
app:menu="@menu/menu_import_export"
app:navigationIcon="@drawable/ic_arrow_back" app:navigationIcon="@drawable/ic_arrow_back"
app:title="@string/title_favourites_manager" /> app:title="@string/title_favourites_manager" />

View File

@@ -456,4 +456,10 @@
<string name="remove_dispenser_summary">Do you wish to remove the dispenser \"<xliff:g id="url">%1$s</xliff:g>\"?</string> <string name="remove_dispenser_summary">Do you wish to remove the dispenser \"<xliff:g id="url">%1$s</xliff:g>\"?</string>
<string name="add">Add</string> <string name="add">Add</string>
<string name="remove">Remove</string> <string name="remove">Remove</string>
<!-- FavouriteFragment-->
<string name="toast_fav_import_failed">Failed to import favourites!</string>
<string name="toast_fav_export_failed">Failed to export favourites!</string>
<string name="toast_fav_import_success">Favourites imported!</string>
<string name="toast_fav_export_success">Favourites exported!</string>
</resources> </resources>