package com.github.libretube.util import android.content.Context import android.content.SharedPreferences import android.net.Uri import androidx.preference.PreferenceManager import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.ObjectInputStream import java.io.ObjectOutputStream /** * Backup and restore the preferences */ class BackupHelper( private val context: Context ) { private val TAG = this::class.java.name /** * Backup the default shared preferences to a file */ fun backupSharedPreferences(uri: Uri?) { if (uri == null) return var output: ObjectOutputStream? = null try { val fileDescriptor = context.contentResolver.openFileDescriptor(uri, "w")?.fileDescriptor output = ObjectOutputStream(FileOutputStream(fileDescriptor)) val pref: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) // write all preference objects to the output file output.writeObject(pref.all) } catch (e: Exception) { e.printStackTrace() } finally { try { // close the outputStream if (output != null) { output.flush() output.close() } } catch (ex: IOException) { ex.printStackTrace() } } } /** * restore the default shared preferences from a file */ @Suppress("UNCHECKED_CAST") fun restoreSharedPreferences(uri: Uri?) { if (uri == null) return var input: ObjectInputStream? = null try { val fileDescriptor = context.contentResolver.openFileDescriptor(uri, "r")?.fileDescriptor input = ObjectInputStream(FileInputStream(fileDescriptor)) val editor = PreferenceManager.getDefaultSharedPreferences(context).edit() // clear the previous settings editor.clear() // map all the preference keys and their values val entries = input.readObject() as Map // decide for each preference which type it is and save it to the preferences for ((key, value) in entries) { if (value is Boolean) editor.putBoolean(key, value) else if (value is Float) editor.putFloat(key, value) else if (value is Int) editor.putInt(key, value) else if (value is Long) editor.putLong(key, value) else if (value is String) editor.putString(key, value) } editor.commit() } catch (e: Exception) { e.printStackTrace() } finally { try { if (input != null) { input.close() } } catch (ex: IOException) { ex.printStackTrace() } } } }