From 81d3b15ce23562aa541e1b94b2b45951372bf38f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 2 Jul 2024 20:00:27 +0700 Subject: [PATCH] Add favourites apps [2/2] Signed-off-by: Aayush Gupta --- .../data/room/favourites/ImportExport.kt | 8 ++++ .../com/aurora/store/module/CommonModule.kt | 5 ++- .../view/ui/commons/FavouriteFragment.kt | 44 +++++++++++++++++-- .../store/view/ui/spoof/SpoofFragment.kt | 2 +- .../store/viewmodel/all/FavouriteViewModel.kt | 27 ++++++++++++ .../main/res/layout/fragment_favourite.xml | 1 + app/src/main/res/values/strings.xml | 6 +++ 7 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/data/room/favourites/ImportExport.kt diff --git a/app/src/main/java/com/aurora/store/data/room/favourites/ImportExport.kt b/app/src/main/java/com/aurora/store/data/room/favourites/ImportExport.kt new file mode 100644 index 000000000..dabcf00e7 --- /dev/null +++ b/app/src/main/java/com/aurora/store/data/room/favourites/ImportExport.kt @@ -0,0 +1,8 @@ +package com.aurora.store.data.room.favourites + +import com.aurora.store.BuildConfig + +data class ImportExport( + val favourites: List, + val auroraStoreVersion: Int = BuildConfig.VERSION_CODE, +) diff --git a/app/src/main/java/com/aurora/store/module/CommonModule.kt b/app/src/main/java/com/aurora/store/module/CommonModule.kt index d45234035..c8e60209d 100644 --- a/app/src/main/java/com/aurora/store/module/CommonModule.kt +++ b/app/src/main/java/com/aurora/store/module/CommonModule.kt @@ -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() } } diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/FavouriteFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/FavouriteFragment.kt index d1e98263a..7a96e71b7 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/FavouriteFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/FavouriteFragment.kt @@ -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) + } } diff --git a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt index ee1dcd9f8..a32b955f9 100644 --- a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt @@ -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) { diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/FavouriteViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/FavouriteViewModel.kt index 24f89eaf5..0069de371 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/FavouriteViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/FavouriteViewModel.kt @@ -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() {}.type + val importExport = gson.fromJson(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) diff --git a/app/src/main/res/layout/fragment_favourite.xml b/app/src/main/res/layout/fragment_favourite.xml index 349f82b9c..ec04fbb7e 100644 --- a/app/src/main/res/layout/fragment_favourite.xml +++ b/app/src/main/res/layout/fragment_favourite.xml @@ -29,6 +29,7 @@ android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" + app:menu="@menu/menu_import_export" app:navigationIcon="@drawable/ic_arrow_back" app:title="@string/title_favourites_manager" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8612d973d..8fc24e3c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -456,4 +456,10 @@ Do you wish to remove the dispenser \"%1$s\"? Add Remove + + + Failed to import favourites! + Failed to export favourites! + Favourites imported! + Favourites exported!