Add favourites apps [2/2]
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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,
|
||||||
|
)
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user