diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/PreferencesViewModel.kt b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/PreferencesViewModel.kt index 138db525..21ae5738 100644 --- a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/PreferencesViewModel.kt +++ b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/PreferencesViewModel.kt @@ -1,13 +1,89 @@ package de.nicidienase.chaosflix.common.viewmodel +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.MutableLiveData import android.arch.lifecycle.ViewModel +import android.util.Log +import com.google.gson.Gson import de.nicidienase.chaosflix.common.mediadata.sync.Downloader +import de.nicidienase.chaosflix.common.userdata.entities.watchlist.WatchlistItem +import de.nicidienase.chaosflix.common.userdata.entities.watchlist.WatchlistItemDao +import de.nicidienase.chaosflix.common.util.LiveEvent import de.nicidienase.chaosflix.common.util.ThreadHandler +import java.io.BufferedReader +import java.io.BufferedWriter +import java.io.File +import java.io.FileReader +import java.io.FileWriter +import java.lang.Exception + +class PreferencesViewModel(val downloader: Downloader, + val watchlistItemDao: WatchlistItemDao, + val exportDir: File) : ViewModel() { + val gson = Gson() + + private val threadHandler = ThreadHandler() -class PreferencesViewModel(val downloader: Downloader) : ViewModel() { fun cleanNonUserData() { - ThreadHandler().runOnBackgroundThread { + threadHandler.runOnBackgroundThread { downloader.deleteNonUserData() } } + + fun exportFavorites() { + threadHandler.runOnBackgroundThread { + val favorites = watchlistItemDao.getAllSync() + val json = gson.toJson(favorites) + Log.d(TAG, json) + if (exportDir.isDirectory) { + val file = File("${exportDir.path}${File.separator}$FAVORITES_FILENAME") + if (file.exists()) { + file.delete() + file.createNewFile() + } + try { + val fileWriter = FileWriter(file) + val bufferedWriter = BufferedWriter(fileWriter) + bufferedWriter.write(json) + bufferedWriter.close() + fileWriter.close() + Log.d(TAG, file.path) + } catch (ex: Exception){ + ex.printStackTrace() + } + } + } + } + + fun importFavorites(): MutableLiveData, Exception>> { + val mutableLiveData = MutableLiveData,Exception>>() + mutableLiveData.postValue(LiveEvent(State.Loading,null,null)) + threadHandler.runOnBackgroundThread { + val file = File("${exportDir.path}${File.separator}$FAVORITES_FILENAME") + try { + if(file.exists()){ + val fileReader = FileReader(file) + val bufferedReader = BufferedReader(fileReader) + val json: String = bufferedReader.readText() + val fromJson = gson.fromJson(json, Array::class.java) + fromJson.map { watchlistItemDao.saveItem(WatchlistItem(eventGuid = it.eventGuid)) } + mutableLiveData.postValue(LiveEvent(State.Done,fromJson.asList(),null)) + } else { + mutableLiveData.postValue(LiveEvent(State.Done,null,null)) + } + } catch (ex: Exception){ + mutableLiveData.postValue(LiveEvent(State.Done,null,ex)) + } + } + return mutableLiveData + } + + enum class State { + Loading, Done + } + + companion object { + val TAG = PreferencesViewModel::class.java.simpleName + val FAVORITES_FILENAME = "chaosflix_favorites.json" + } } \ No newline at end of file diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt index dd83a61d..c26cc956 100644 --- a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt +++ b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt @@ -3,6 +3,7 @@ package de.nicidienase.chaosflix.common.viewmodel import android.arch.lifecycle.ViewModel import android.arch.lifecycle.ViewModelProvider import android.content.Context +import android.os.Environment import android.preference.PreferenceManager import de.nicidienase.chaosflix.common.DatabaseFactory import de.nicidienase.chaosflix.common.OfflineItemManager @@ -22,6 +23,7 @@ class ViewModelFactory(context: Context) : ViewModelProvider.Factory { val offlineItemManager = OfflineItemManager(context.applicationContext, database.offlineEventDao(),preferencesManager) val downloader by lazy { Downloader(recordingApi, database) } + val externalFilesDir = Environment.getExternalStorageDirectory() @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { @@ -32,7 +34,7 @@ class ViewModelFactory(context: Context) : ViewModelProvider.Factory { } else if (modelClass.isAssignableFrom(DetailsViewModel::class.java)) { return DetailsViewModel(database, offlineItemManager, preferencesManager, downloader) as T } else if (modelClass.isAssignableFrom(PreferencesViewModel::class.java)){ - return PreferencesViewModel(downloader) as T + return PreferencesViewModel(downloader, database.watchlistItemDao(), externalFilesDir) as T } else { throw UnsupportedOperationException("The requested ViewModel is currently unsupported. " + "Please make sure to implement are correct creation of it. " + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index e703c067..51018827 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -45,4 +45,6 @@ Automatically choose stream Allow downloads over metered networks Automatically choose recording + Export Favorites + Import Favorites diff --git a/common/src/main/res/xml/preferences.xml b/common/src/main/res/xml/preferences.xml index c7b04f9c..d1f112f5 100644 --- a/common/src/main/res/xml/preferences.xml +++ b/common/src/main/res/xml/preferences.xml @@ -2,31 +2,45 @@ + android:summary="@string/pref_mobile_downloads" + android:title="@string/setting_metered_networks"/> + android:summary="@string/pref_autoselect_stream" + android:title="@string/setting_choose_stream"/> + android:key="auto_select_recording" + android:summary="@string/pref_autoselect_recording" + android:title="@string/settings_choose_recording"/> - + + + + + + + + \ No newline at end of file diff --git a/touch/src/main/java/de/nicidienase/chaosflix/touch/settings/SettingsFragment.kt b/touch/src/main/java/de/nicidienase/chaosflix/touch/settings/SettingsFragment.kt index 0444f563..e42443a5 100644 --- a/touch/src/main/java/de/nicidienase/chaosflix/touch/settings/SettingsFragment.kt +++ b/touch/src/main/java/de/nicidienase/chaosflix/touch/settings/SettingsFragment.kt @@ -1,10 +1,12 @@ package de.nicidienase.chaosflix.touch.settings +import android.arch.lifecycle.Observer import android.arch.lifecycle.ViewModelProviders import android.content.Context import android.content.Intent import android.os.Bundle import android.preference.PreferenceManager +import android.support.design.widget.Snackbar import android.support.v7.preference.PreferenceFragmentCompat import de.nicidienase.chaosflix.R import de.nicidienase.chaosflix.common.viewmodel.PreferencesViewModel @@ -30,7 +32,7 @@ class SettingsFragment : PreferenceFragmentCompat() { if (requestCode == REQUEST_DIRECTORY) { if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { - val dir = data!!.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR) + val dir = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR) val sharedPref = PreferenceManager.getDefaultSharedPreferences(requireContext().applicationContext) val edit = sharedPref.edit() edit.putString("download_folder", dir) @@ -52,6 +54,8 @@ class SettingsFragment : PreferenceFragmentCompat() { updateSummary() val downloadFolderPref = this.findPreference("download_folder") val cleanCachePref = this.findPreference("delete_data") + val exportFavorites = this.findPreference("export_favorites") + val importFavorites = this.findPreference("import_favorites") downloadFolderPref?.setOnPreferenceClickListener { val chooserIntent = Intent(context, DirectoryChooserActivity::class.java) @@ -72,6 +76,36 @@ class SettingsFragment : PreferenceFragmentCompat() { viewModel.cleanNonUserData() return@setOnPreferenceClickListener true } + + exportFavorites?.setOnPreferenceClickListener { + viewModel.exportFavorites() + return@setOnPreferenceClickListener true + } + + importFavorites?.setOnPreferenceClickListener { + var snackbar: Snackbar? = null + viewModel.importFavorites().observe(this, Observer { event -> + when { + event?.state == PreferencesViewModel.State.Loading -> { + snackbar?.dismiss() + snackbar = Snackbar.make(listView,"Importing",Snackbar.LENGTH_INDEFINITE) + snackbar?.show() + } + event?.error != null -> { + snackbar?.dismiss() + val message: String = event.error?.message ?: event.error.toString() + snackbar = Snackbar.make(listView, message, Snackbar.LENGTH_SHORT) + snackbar?.show() + } + event?.state == PreferencesViewModel.State.Done -> { + snackbar?.dismiss() + snackbar = Snackbar.make(listView,"Import Done",Snackbar.LENGTH_SHORT) + snackbar?.show() + } + } + }) + return@setOnPreferenceClickListener true + } } companion object {