Implemented import/export for notes in SettingsActivity

This commit is contained in:
merkost 2023-07-07 23:19:05 +10:00
parent 4d2a756fe8
commit 9c2d0e5954
1 changed files with 93 additions and 4 deletions

View File

@ -1,26 +1,55 @@
package com.simplemobiletools.notes.pro.activities
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.Menu
import androidx.activity.result.contract.ActivityResultContracts
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.notes.pro.R
import com.simplemobiletools.notes.pro.extensions.config
import com.simplemobiletools.notes.pro.extensions.requestUnlockNotes
import com.simplemobiletools.notes.pro.extensions.updateWidgets
import com.simplemobiletools.notes.pro.extensions.widgetsDB
import com.simplemobiletools.notes.pro.helpers.*
import com.simplemobiletools.notes.pro.models.Note
import com.simplemobiletools.notes.pro.models.Widget
import kotlinx.android.synthetic.main.activity_settings.*
import java.util.*
import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.util.Locale
import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() {
private val notesFileType = "application/json"
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri != null) {
toast(R.string.importing)
importNotes(uri)
}
}
private val saveDocument = registerForActivityResult(ActivityResultContracts.CreateDocument(notesFileType)) { uri ->
if (uri != null) {
toast(R.string.exporting)
NotesHelper(this).getNotes { notes ->
requestUnlockNotes(notes) { unlockedNotes ->
val notLockedNotes = notes.filterNot { it.isLocked() }
val notesToExport = unlockedNotes + notLockedNotes
exportNotes(notesToExport, uri)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
@ -50,6 +79,8 @@ class SettingsActivity : SimpleActivity() {
setupCursorPlacement()
setupIncognitoMode()
setupCustomizeWidgetColors()
setupNotesExport()
setupNotesImport()
updateTextColors(settings_nested_scrollview)
arrayOf(
@ -257,4 +288,62 @@ class SettingsActivity : SimpleActivity() {
config.useIncognitoMode = settings_use_incognito_mode.isChecked
}
}
private fun setupNotesExport() {
settings_export_notes_holder.setOnClickListener {
val fileName = "${getString(R.string.notes)}_${getCurrentFormattedDateTime()}"
saveDocument.launch(fileName)
}
}
private fun setupNotesImport() {
settings_import_notes_holder.setOnClickListener {
getContent.launch(notesFileType)
}
}
private fun exportNotes(notes: List<Note>, uri: Uri) {
if (notes.isEmpty()) {
toast(R.string.no_entries_for_exporting)
} else {
try {
val outputStream = contentResolver.openOutputStream(uri)!!
val jsonString = Json.encodeToString(notes)
outputStream.use {
it.write(jsonString.toByteArray())
}
Log.e("EXPORTED", jsonString)
toast(R.string.exporting_successful)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
private fun importNotes(uri: Uri) {
try {
val jsonString = contentResolver.openInputStream(uri)!!.use { inputStream ->
inputStream.bufferedReader().readText()
}
val objects = Json.decodeFromString<List<Note>>(jsonString)
if (objects.isEmpty()) {
toast(R.string.no_entries_for_importing)
return
}
NotesHelper(this).importNotes(this, objects) { importResult ->
when (importResult) {
NotesHelper.ImportResult.IMPORT_OK -> toast(R.string.importing_successful)
NotesHelper.ImportResult.IMPORT_PARTIAL -> toast(R.string.importing_some_entries_failed)
else -> toast(R.string.importing_failed)
}
}
} catch (_: SerializationException) {
toast(R.string.invalid_file_format)
} catch (_: IllegalArgumentException) {
toast(R.string.invalid_file_format)
} catch (e: Exception) {
showErrorToast(e)
}
}
}