@@ -15,31 +15,86 @@ import org.fossify.commons.dialogs.ConfirmationDialog
1515import org.fossify.commons.dialogs.PermissionRequiredDialog
1616import org.fossify.commons.dialogs.RadioGroupDialog
1717import org.fossify.commons.dialogs.SecurityDialog
18- import org.fossify.commons.extensions.*
19- import org.fossify.commons.helpers.*
18+ import org.fossify.commons.extensions.beGone
19+ import org.fossify.commons.extensions.beVisible
20+ import org.fossify.commons.extensions.beVisibleIf
21+ import org.fossify.commons.extensions.getProperPrimaryColor
22+ import org.fossify.commons.extensions.openRequestExactAlarmSettings
23+ import org.fossify.commons.extensions.showErrorToast
24+ import org.fossify.commons.extensions.toast
25+ import org.fossify.commons.extensions.updateTextColors
26+ import org.fossify.commons.extensions.viewBinding
27+ import org.fossify.commons.helpers.IS_CUSTOMIZING_COLORS
28+ import org.fossify.commons.helpers.NavigationIcon
29+ import org.fossify.commons.helpers.PROTECTION_FINGERPRINT
30+ import org.fossify.commons.helpers.SHOW_ALL_TABS
31+ import org.fossify.commons.helpers.ensureBackgroundThread
32+ import org.fossify.commons.helpers.isOreoPlus
33+ import org.fossify.commons.helpers.isQPlus
34+ import org.fossify.commons.helpers.isRPlus
35+ import org.fossify.commons.helpers.isSPlus
36+ import org.fossify.commons.helpers.isTiramisuPlus
2037import org.fossify.commons.models.RadioItem
2138import org.fossify.notes.BuildConfig
2239import org.fossify.notes.R
2340import org.fossify.notes.databinding.ActivitySettingsBinding
2441import org.fossify.notes.dialogs.ExportNotesDialog
2542import org.fossify.notes.dialogs.ManageAutoBackupsDialog
26- import org.fossify.notes.extensions.*
27- import org.fossify.notes.helpers.*
43+ import org.fossify.notes.extensions.cancelScheduledAutomaticBackup
44+ import org.fossify.notes.extensions.config
45+ import org.fossify.notes.extensions.requestUnlockNotes
46+ import org.fossify.notes.extensions.scheduleNextAutomaticBackup
47+ import org.fossify.notes.extensions.updateWidgets
48+ import org.fossify.notes.extensions.widgetsDB
49+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_BG_COLOR
50+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_ID
51+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_KEY_ID
52+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_NOTE_ID
53+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_SHOW_TITLE
54+ import org.fossify.notes.helpers.CUSTOMIZED_WIDGET_TEXT_COLOR
55+ import org.fossify.notes.helpers.FONT_SIZE_100_PERCENT
56+ import org.fossify.notes.helpers.FONT_SIZE_125_PERCENT
57+ import org.fossify.notes.helpers.FONT_SIZE_150_PERCENT
58+ import org.fossify.notes.helpers.FONT_SIZE_175_PERCENT
59+ import org.fossify.notes.helpers.FONT_SIZE_200_PERCENT
60+ import org.fossify.notes.helpers.FONT_SIZE_250_PERCENT
61+ import org.fossify.notes.helpers.FONT_SIZE_300_PERCENT
62+ import org.fossify.notes.helpers.FONT_SIZE_50_PERCENT
63+ import org.fossify.notes.helpers.FONT_SIZE_60_PERCENT
64+ import org.fossify.notes.helpers.FONT_SIZE_75_PERCENT
65+ import org.fossify.notes.helpers.FONT_SIZE_90_PERCENT
66+ import org.fossify.notes.helpers.GRAVITY_CENTER
67+ import org.fossify.notes.helpers.GRAVITY_END
68+ import org.fossify.notes.helpers.GRAVITY_START
69+ import org.fossify.notes.helpers.NotesHelper
2870import org.fossify.notes.models.Note
2971import org.fossify.notes.models.Widget
3072import java.util.Locale
3173import kotlin.system.exitProcess
3274
3375class SettingsActivity : SimpleActivity () {
3476 private val notesFileType = " application/json"
77+ private val notesImportFileTypes = buildList {
78+ add(" application/json" )
79+ if (! isQPlus()) {
80+ // Workaround for https://github.com/FossifyOrg/Notes/issues/34
81+ add(" application/octet-stream" )
82+ }
83+ }
84+
3585 private val binding by viewBinding(ActivitySettingsBinding ::inflate)
3686
3787 override fun onCreate (savedInstanceState : Bundle ? ) {
3888 isMaterialActivity = true
3989 super .onCreate(savedInstanceState)
4090 setContentView(binding.root)
4191
42- updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true , useTopSearchMenu = false )
92+ updateMaterialActivityViews(
93+ mainCoordinatorLayout = binding.settingsCoordinator,
94+ nestedView = binding.settingsHolder,
95+ useTransparentNavigation = true ,
96+ useTopSearchMenu = false
97+ )
4398 setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar)
4499 }
45100
@@ -89,25 +144,27 @@ class SettingsActivity : SimpleActivity() {
89144 return super .onCreateOptionsMenu(menu)
90145 }
91146
92- private val getContent = registerForActivityResult(ActivityResultContracts .GetContent ()) { uri ->
93- if (uri != null ) {
94- toast(org.fossify.commons.R .string.importing)
95- importNotes(uri)
147+ private val getContent =
148+ registerForActivityResult(ActivityResultContracts .OpenDocument ()) { uri ->
149+ if (uri != null ) {
150+ toast(org.fossify.commons.R .string.importing)
151+ importNotes(uri)
152+ }
96153 }
97- }
98154
99- private val saveDocument = registerForActivityResult(ActivityResultContracts .CreateDocument (notesFileType)) { uri ->
100- if (uri != null ) {
101- toast(org.fossify.commons.R .string.exporting)
102- NotesHelper (this ).getNotes { notes ->
103- requestUnlockNotes(notes) { unlockedNotes ->
104- val notLockedNotes = notes.filterNot { it.isLocked() }
105- val notesToExport = unlockedNotes + notLockedNotes
106- exportNotes(notesToExport, uri)
155+ private val saveDocument =
156+ registerForActivityResult(ActivityResultContracts .CreateDocument (notesFileType)) { uri ->
157+ if (uri != null ) {
158+ toast(org.fossify.commons.R .string.exporting)
159+ NotesHelper (this ).getNotes { notes ->
160+ requestUnlockNotes(notes) { unlockedNotes ->
161+ val notLockedNotes = notes.filterNot { it.isLocked() }
162+ val notesToExport = unlockedNotes + notLockedNotes
163+ exportNotes(notesToExport, uri)
164+ }
107165 }
108166 }
109167 }
110- }
111168
112169 private fun setupCustomizeColors () {
113170 binding.settingsColorCustomizationHolder.setOnClickListener {
@@ -127,9 +184,13 @@ class SettingsActivity : SimpleActivity() {
127184
128185 private fun setupLanguage () {
129186 binding.settingsLanguage.text = Locale .getDefault().displayLanguage
130- binding.settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
131- binding.settingsLanguageHolder.setOnClickListener {
132- launchChangeAppLanguageIntent()
187+ if (isTiramisuPlus()) {
188+ binding.settingsLanguageHolder.beVisible()
189+ binding.settingsLanguageHolder.setOnClickListener {
190+ launchChangeAppLanguageIntent()
191+ }
192+ } else {
193+ binding.settingsLanguageHolder.beGone()
133194 }
134195 }
135196
@@ -232,7 +293,9 @@ class SettingsActivity : SimpleActivity() {
232293 private fun setupGravity () {
233294 binding.settingsGravity.text = getGravityText()
234295 binding.settingsGravityHolder.setOnClickListener {
235- val items = listOf (GRAVITY_START , GRAVITY_CENTER , GRAVITY_END ).map { RadioItem (it, getGravityOptionLabel(it)) }
296+ val items = listOf (GRAVITY_START , GRAVITY_CENTER , GRAVITY_END ).map {
297+ RadioItem (it, getGravityOptionLabel(it))
298+ }
236299 RadioGroupDialog (this @SettingsActivity, ArrayList (items), config.gravity) {
237300 config.gravity = it as Int
238301 binding.settingsGravity.text = getGravityText()
@@ -242,13 +305,15 @@ class SettingsActivity : SimpleActivity() {
242305 }
243306
244307 private fun getGravityOptionLabel (gravity : Int ): String {
245- val leftToRightDirection = TextUtilsCompat .getLayoutDirectionFromLocale(Locale .getDefault()) == ViewCompat .LAYOUT_DIRECTION_LTR
308+ val leftToRightDirection = TextUtilsCompat
309+ .getLayoutDirectionFromLocale(Locale .getDefault()) == ViewCompat .LAYOUT_DIRECTION_LTR
246310 val leftRightLabels = listOf (R .string.left, R .string.right)
247311 val startEndLabels = if (leftToRightDirection) {
248312 leftRightLabels
249313 } else {
250314 leftRightLabels.reversed()
251315 }
316+
252317 return getString(
253318 when (gravity) {
254319 GRAVITY_START -> startEndLabels.first()
@@ -315,7 +380,7 @@ class SettingsActivity : SimpleActivity() {
315380
316381 private fun setupNotesImport () {
317382 binding.settingsImportNotesHolder.setOnClickListener {
318- getContent.launch(notesFileType )
383+ getContent.launch(notesImportFileTypes.toTypedArray() )
319384 }
320385 }
321386
@@ -427,8 +492,17 @@ class SettingsActivity : SimpleActivity() {
427492 private fun setupAppPasswordProtection () {
428493 binding.settingsAppPasswordProtection.isChecked = config.isAppPasswordProtectionOn
429494 binding.settingsAppPasswordProtectionHolder.setOnClickListener {
430- val tabToShow = if (config.isAppPasswordProtectionOn) config.appProtectionType else SHOW_ALL_TABS
431- SecurityDialog (this , config.appPasswordHash, tabToShow) { hash, type, success ->
495+ val tabToShow = if (config.isAppPasswordProtectionOn) {
496+ config.appProtectionType
497+ } else {
498+ SHOW_ALL_TABS
499+ }
500+
501+ SecurityDialog (
502+ activity = this ,
503+ requiredHash = config.appPasswordHash,
504+ showTabIndex = tabToShow
505+ ) { hash, type, success ->
432506 if (success) {
433507 val hasPasswordProtection = config.isAppPasswordProtectionOn
434508 binding.settingsAppPasswordProtection.isChecked = ! hasPasswordProtection
@@ -437,31 +511,65 @@ class SettingsActivity : SimpleActivity() {
437511 config.appProtectionType = type
438512
439513 if (config.isAppPasswordProtectionOn) {
440- val confirmationTextId = if (config.appProtectionType == PROTECTION_FINGERPRINT )
441- org.fossify.commons.R .string.fingerprint_setup_successfully else org.fossify.commons.R .string.protection_setup_successfully
442- ConfirmationDialog (this , " " , confirmationTextId, org.fossify.commons.R .string.ok, 0 ) { }
514+ val confirmationTextId =
515+ if (config.appProtectionType == PROTECTION_FINGERPRINT ) {
516+ org.fossify.commons.R .string.fingerprint_setup_successfully
517+ } else {
518+ org.fossify.commons.R .string.protection_setup_successfully
519+ }
520+
521+ ConfirmationDialog (
522+ activity = this ,
523+ message = " " ,
524+ messageId = confirmationTextId,
525+ positive = org.fossify.commons.R .string.ok,
526+ negative = 0
527+ ) { }
443528 }
444529 }
445530 }
446531 }
447532 }
448533
449534 private fun setupNoteDeletionPasswordProtection () {
450- binding.settingsNoteDeletionPasswordProtection.isChecked = config.isDeletePasswordProtectionOn
535+ binding.settingsNoteDeletionPasswordProtection.isChecked =
536+ config.isDeletePasswordProtectionOn
537+
451538 binding.settingsNoteDeletionPasswordProtectionHolder.setOnClickListener {
452- val tabToShow = if (config.isDeletePasswordProtectionOn) config.deleteProtectionType else SHOW_ALL_TABS
453- SecurityDialog (this , config.deletePasswordHash, tabToShow) { hash, type, success ->
539+ val tabToShow = if (config.isDeletePasswordProtectionOn) {
540+ config.deleteProtectionType
541+ } else {
542+ SHOW_ALL_TABS
543+ }
544+
545+ SecurityDialog (
546+ activity = this ,
547+ requiredHash = config.deletePasswordHash,
548+ showTabIndex = tabToShow
549+ ) { hash, type, success ->
454550 if (success) {
455551 val hasPasswordProtection = config.isDeletePasswordProtectionOn
456- binding.settingsNoteDeletionPasswordProtection.isChecked = ! hasPasswordProtection
552+ binding.settingsNoteDeletionPasswordProtection.isChecked =
553+ ! hasPasswordProtection
457554 config.isDeletePasswordProtectionOn = ! hasPasswordProtection
458555 config.deletePasswordHash = if (hasPasswordProtection) " " else hash
459556 config.deleteProtectionType = type
460557
461558 if (config.isDeletePasswordProtectionOn) {
462- val confirmationTextId = if (config.deleteProtectionType == PROTECTION_FINGERPRINT )
463- org.fossify.commons.R .string.fingerprint_setup_successfully else org.fossify.commons.R .string.protection_setup_successfully
464- ConfirmationDialog (this , " " , confirmationTextId, org.fossify.commons.R .string.ok, 0 ) { }
559+ val confirmationTextId =
560+ if (config.deleteProtectionType == PROTECTION_FINGERPRINT ) {
561+ org.fossify.commons.R .string.fingerprint_setup_successfully
562+ } else {
563+ org.fossify.commons.R .string.protection_setup_successfully
564+ }
565+
566+ ConfirmationDialog (
567+ activity = this ,
568+ message = " " ,
569+ messageId = confirmationTextId,
570+ positive = org.fossify.commons.R .string.ok,
571+ negative = 0
572+ ) { }
465573 }
466574 }
467575 }
0 commit comments