Skip to content

Commit 83ecab4

Browse files
committed
Cleanup notes export
1 parent 7bae4fa commit 83ecab4

6 files changed

Lines changed: 85 additions & 39 deletions

File tree

app/src/main/java/com/philkes/notallyx/presentation/UiExtensions.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import com.google.android.material.shape.MaterialShapeDrawable
8484
import com.google.android.material.shape.RelativeCornerSize
8585
import com.google.android.material.shape.RoundedCornerTreatment
8686
import com.google.android.material.shape.ShapeAppearanceModel
87+
import com.google.android.material.snackbar.Snackbar
8788
import com.google.android.material.textfield.MaterialAutoCompleteTextView
8889
import com.philkes.notallyx.R
8990
import com.philkes.notallyx.data.imports.ImportProgress
@@ -927,6 +928,21 @@ fun Context.showToast(message: CharSequence) =
927928
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
928929
}
929930

931+
fun View.showSnackbar(
932+
msgResId: Int,
933+
actionResId: Int? = null,
934+
onActionListener: View.OnClickListener? = null,
935+
) = showSnackbar(getString(msgResId), actionResId, onActionListener)
936+
937+
fun View.showSnackbar(
938+
message: String,
939+
actionResId: Int? = null,
940+
onActionListener: View.OnClickListener? = null,
941+
) =
942+
Snackbar.make(this, message, Snackbar.LENGTH_LONG)
943+
.apply { actionResId?.let { setAction(it, onActionListener) } }
944+
.show()
945+
930946
fun Context.restartApplication(
931947
fragmentIdToOpen: Int? = null,
932948
extra: Pair<String, Boolean>? = null,

app/src/main/java/com/philkes/notallyx/presentation/activity/main/MainActivity.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,8 @@ class MainActivity : LockedActivity<ActivityMainBinding>() {
465465

466466
private fun exportSelectedNotes(mimeType: ExportMimeType) {
467467
exportNotes(
468-
mimeType,
469468
baseModel.actionMode.selectedNotes.values,
469+
mimeType,
470470
exportFileActivityResultLauncher,
471471
exportNotesActivityResultLauncher,
472472
)
@@ -563,13 +563,17 @@ class MainActivity : LockedActivity<ActivityMainBinding>() {
563563
exportFileActivityResultLauncher =
564564
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
565565
if (result.resultCode == RESULT_OK) {
566-
result.data?.data?.let { uri -> baseModel.exportSelectedNoteToFile(uri) }
566+
result.data?.data?.let { uri ->
567+
baseModel.exportSelectedNoteToFile(uri, binding.root)
568+
}
567569
}
568570
}
569571
exportNotesActivityResultLauncher =
570572
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
571573
if (result.resultCode == RESULT_OK) {
572-
result.data?.data?.let { uri -> baseModel.exportSelectedNotesToFolder(uri) }
574+
result.data?.data?.let { uri ->
575+
baseModel.exportSelectedNotesToFolder(uri, binding.root)
576+
}
573577
}
574578
}
575579
}

app/src/main/java/com/philkes/notallyx/presentation/activity/note/EditActivity.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ import com.philkes.notallyx.presentation.viewmodel.preference.ListItemSort
8888
import com.philkes.notallyx.presentation.viewmodel.preference.NotesSortBy
8989
import com.philkes.notallyx.presentation.widget.WidgetProvider
9090
import com.philkes.notallyx.utils.FileError
91-
import com.philkes.notallyx.utils.backup.exportNotes
91+
import com.philkes.notallyx.utils.backup.exportNote
9292
import com.philkes.notallyx.utils.changeStatusAndNavigationBarColor
9393
import com.philkes.notallyx.utils.changehistory.ChangeHistory
9494
import com.philkes.notallyx.utils.getFileName
@@ -406,7 +406,7 @@ abstract class EditActivity(private val type: Type) :
406406
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
407407
if (result.resultCode == RESULT_OK) {
408408
result.data?.data?.let { uri ->
409-
baseModel.exportNoteToFile(uri, notallyModel.getBaseNote())
409+
baseModel.exportNoteToFile(uri, notallyModel.getBaseNote(), binding.root)
410410
}
411411
}
412412
}
@@ -956,12 +956,7 @@ abstract class EditActivity(private val type: Type) :
956956
}
957957

958958
override fun export(mimeType: ExportMimeType) {
959-
exportNotes(
960-
mimeType,
961-
listOf(notallyModel.getBaseNote()),
962-
exportFileActivityResultLauncher,
963-
exportFileActivityResultLauncher,
964-
)
959+
exportNote(notallyModel.getBaseNote(), mimeType, exportFileActivityResultLauncher)
965960
}
966961

967962
private fun delete() {

app/src/main/java/com/philkes/notallyx/presentation/viewmodel/BaseNoteModel.kt

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.content.Intent
66
import android.net.Uri
77
import android.os.Build
88
import android.print.PdfPrintListener
9+
import android.view.View
910
import androidx.annotation.RequiresApi
1011
import androidx.core.net.toUri
1112
import androidx.documentfile.provider.DocumentFile
@@ -44,6 +45,7 @@ import com.philkes.notallyx.presentation.activity.main.fragment.settings.Setting
4445
import com.philkes.notallyx.presentation.getQuantityString
4546
import com.philkes.notallyx.presentation.restartApplication
4647
import com.philkes.notallyx.presentation.setCancelButton
48+
import com.philkes.notallyx.presentation.showSnackbar
4749
import com.philkes.notallyx.presentation.showToast
4850
import com.philkes.notallyx.presentation.view.misc.NotNullLiveData
4951
import com.philkes.notallyx.presentation.view.misc.Progress
@@ -64,6 +66,7 @@ import com.philkes.notallyx.utils.backup.clearAllLabels
6466
import com.philkes.notallyx.utils.backup.copyDatabase
6567
import com.philkes.notallyx.utils.backup.exportAsZip
6668
import com.philkes.notallyx.utils.backup.exportPdfFile
69+
import com.philkes.notallyx.utils.backup.exportPdfFileFolder
6770
import com.philkes.notallyx.utils.backup.exportPlainTextFile
6871
import com.philkes.notallyx.utils.backup.exportPlainTextFileFolder
6972
import com.philkes.notallyx.utils.backup.getPreviousLabels
@@ -84,6 +87,7 @@ import com.philkes.notallyx.utils.security.encryptDatabase
8487
import com.philkes.notallyx.utils.security.isEncryptedDatabase
8588
import com.philkes.notallyx.utils.security.isUnencryptedDatabase
8689
import com.philkes.notallyx.utils.toReadablePath
90+
import com.philkes.notallyx.utils.viewFile
8791
import java.io.File
8892
import java.util.concurrent.atomic.AtomicInteger
8993
import javax.crypto.Cipher
@@ -441,7 +445,7 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
441445
}
442446
}
443447

444-
fun exportNoteToFile(fileUri: Uri, note: BaseNote) {
448+
fun exportNoteToFile(fileUri: Uri, note: BaseNote, snackbarView: View) {
445449
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
446450
app.log(TAG, throwable = throwable)
447451
actionMode.close(true)
@@ -459,7 +463,17 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
459463
override fun onSuccess(file: DocumentFile) {
460464
actionMode.close(true)
461465
val message = app.getQuantityString(R.plurals.exported_notes, 1)
462-
app.showToast("$message to '${app.toReadablePath(fileUri)}'")
466+
snackbarView.showSnackbar(
467+
"$message to '${app.toReadablePath(fileUri)}'",
468+
R.string.open_link,
469+
) {
470+
app.viewFile(fileUri, selectedExportMimeType.mimeType)
471+
}
472+
snackbarView.showFileSnackbar(
473+
"$message to '${app.toReadablePath(fileUri)}'",
474+
fileUri,
475+
ExportMimeType.PDF,
476+
)
463477
}
464478

465479
override fun onFailure(message: CharSequence?) {
@@ -478,13 +492,17 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
478492
)
479493
actionMode.close(true)
480494
val message = app.getQuantityString(R.plurals.exported_notes, 1)
481-
app.showToast("$message to '${app.toReadablePath(fileUri)}'")
495+
snackbarView.showFileSnackbar(
496+
"$message to '${app.toReadablePath(fileUri)}'",
497+
fileUri,
498+
selectedExportMimeType,
499+
)
482500
}
483501
}
484502
}
485503
}
486504

487-
fun exportNotesToFolder(folderUri: Uri, notes: Collection<BaseNote>) {
505+
fun exportNotesToFolder(folderUri: Uri, notes: Collection<BaseNote>, snackbarView: View) {
488506
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
489507
app.log(TAG, throwable = throwable)
490508
actionMode.close(true)
@@ -497,7 +515,7 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
497515
when (selectedExportMimeType) {
498516
ExportMimeType.PDF -> {
499517
for (note in notes) {
500-
exportPdfFile(
518+
exportPdfFileFolder(
501519
app,
502520
note,
503521
DocumentFile.fromTreeUri(app, folderUri)!!,
@@ -514,7 +532,7 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
514532
R.plurals.exported_notes,
515533
counter.get(),
516534
)
517-
app.showToast(
535+
snackbarView.showSnackbar(
518536
"$message to '${app.toReadablePath(folderUri)}'"
519537
)
520538
}
@@ -543,18 +561,22 @@ class BaseNoteModel(private val app: Application) : AndroidViewModel(app) {
543561
actionMode.close(true)
544562
progress.postValue(ExportNotesProgress(inProgress = false))
545563
val message = app.getQuantityString(R.plurals.exported_notes, counter.get())
546-
app.showToast("$message to '${app.toReadablePath(folderUri)}'")
564+
snackbarView.showSnackbar("$message to '${app.toReadablePath(folderUri)}'")
547565
}
548566
}
549567
}
550568
}
551569

552-
fun exportSelectedNotesToFolder(folderUri: Uri) {
553-
exportNotesToFolder(folderUri, actionMode.selectedNotes.values)
570+
fun exportSelectedNotesToFolder(folderUri: Uri, snackbarView: View) {
571+
exportNotesToFolder(folderUri, actionMode.selectedNotes.values, snackbarView)
572+
}
573+
574+
fun exportSelectedNoteToFile(fileUri: Uri, snackbarView: View) {
575+
exportNoteToFile(fileUri, actionMode.selectedNotes.values.first(), snackbarView)
554576
}
555577

556-
fun exportSelectedNoteToFile(fileUri: Uri) {
557-
exportNoteToFile(fileUri, actionMode.selectedNotes.values.first())
578+
private fun View.showFileSnackbar(msg: String, fileUri: Uri, mimeType: ExportMimeType) {
579+
showSnackbar(msg, R.string.open_link) { app.viewFile(fileUri, mimeType.mimeType) }
558580
}
559581

560582
fun pinBaseNotes(pinned: Boolean) {

app/src/main/java/com/philkes/notallyx/utils/AndroidExtensions.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,11 @@ fun Context.viewFile(uri: Uri, mimeType: String) {
377377
Intent(Intent.ACTION_VIEW)
378378
.apply {
379379
setDataAndType(uri, mimeType)
380-
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
380+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
381+
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
381382
}
382383
.wrapWithChooser(this)
384+
.apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }
383385
startActivity(intent)
384386
}
385387

app/src/main/java/com/philkes/notallyx/utils/backup/ExportExtensions.kt

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -806,27 +806,14 @@ private fun ContextWrapper.tryPostErrorNotification(e: Throwable) {
806806
}
807807

808808
fun LockedActivity<*>.exportNotes(
809-
mimeType: ExportMimeType,
810809
notes: Collection<BaseNote>,
811-
saveFileResultLauncher: ActivityResultLauncher<Intent>,
810+
mimeType: ExportMimeType,
811+
exportToFileResultLauncher: ActivityResultLauncher<Intent>,
812812
exportToFolderResultLauncher: ActivityResultLauncher<Intent>,
813813
) {
814814
baseModel.selectedExportMimeType = mimeType
815815
if (notes.size == 1) {
816-
val baseNote = notes.first()
817-
// Store the selected note for export and immediately ask user for target location
818-
baseModel.selectedExportBaseNote = baseNote
819-
val suggestedName =
820-
(baseNote.title.ifBlank { getString(R.string.note) }) + "." + mimeType.fileExtension
821-
val intent =
822-
Intent(Intent.ACTION_CREATE_DOCUMENT)
823-
.apply {
824-
type = mimeType.mimeType
825-
addCategory(Intent.CATEGORY_OPENABLE)
826-
putExtra(Intent.EXTRA_TITLE, suggestedName)
827-
}
828-
.wrapWithChooser(this)
829-
saveFileResultLauncher.launch(intent)
816+
exportNote(notes.first(), mimeType, exportToFileResultLauncher)
830817
} else {
831818
lifecycleScope.launch {
832819
val intent =
@@ -837,3 +824,23 @@ fun LockedActivity<*>.exportNotes(
837824
}
838825
}
839826
}
827+
828+
fun LockedActivity<*>.exportNote(
829+
note: BaseNote,
830+
mimeType: ExportMimeType,
831+
exportToFileResultLauncher: ActivityResultLauncher<Intent>,
832+
) {
833+
// Store the selected note for export and immediately ask user for target location
834+
baseModel.selectedExportBaseNote = note
835+
val suggestedName =
836+
(note.title.ifBlank { getString(R.string.note) }) + "." + mimeType.fileExtension
837+
val intent =
838+
Intent(Intent.ACTION_CREATE_DOCUMENT)
839+
.apply {
840+
type = mimeType.mimeType
841+
addCategory(Intent.CATEGORY_OPENABLE)
842+
putExtra(Intent.EXTRA_TITLE, suggestedName)
843+
}
844+
.wrapWithChooser(this)
845+
exportToFileResultLauncher.launch(intent)
846+
}

0 commit comments

Comments
 (0)