Skip to content

Commit 02f16d0

Browse files
authored
Merge branch 'master' into master
2 parents 711a296 + 470ee6d commit 02f16d0

File tree

29 files changed

+897
-350
lines changed

29 files changed

+897
-350
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Changelog
22
==========
33

4+
Version 1.1.1 *(2025-03-18)
5+
----------------------------
6+
7+
* Fixed security vulnerability in app lock
8+
* Minor bug fixes and improvements
9+
* Added more translations
10+
411
Version 1.1.0 *(2024-07-22)
512
----------------------------
613

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package org.fossify.notes
22

3-
import android.app.Application
4-
import org.fossify.commons.extensions.checkUseEnglish
3+
import org.fossify.commons.FossifyApp
54

6-
class App : Application() {
7-
override fun onCreate() {
8-
super.onCreate()
9-
checkUseEnglish()
10-
}
5+
class App : FossifyApp() {
6+
override val isAppLockFeatureAvailable = true
117
}

app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt

Lines changed: 360 additions & 114 deletions
Large diffs are not rendered by default.

app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt

Lines changed: 145 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,86 @@ import org.fossify.commons.dialogs.ConfirmationDialog
1515
import org.fossify.commons.dialogs.PermissionRequiredDialog
1616
import org.fossify.commons.dialogs.RadioGroupDialog
1717
import 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
2037
import org.fossify.commons.models.RadioItem
2138
import org.fossify.notes.BuildConfig
2239
import org.fossify.notes.R
2340
import org.fossify.notes.databinding.ActivitySettingsBinding
2441
import org.fossify.notes.dialogs.ExportNotesDialog
2542
import 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
2870
import org.fossify.notes.models.Note
2971
import org.fossify.notes.models.Widget
3072
import java.util.Locale
3173
import kotlin.system.exitProcess
3274

3375
class 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
}

app/src/main/kotlin/org/fossify/notes/activities/SimpleActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ open class SimpleActivity : BaseSimpleActivity() {
2727
)
2828

2929
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
30+
31+
override fun getRepositoryName() = "Notes"
3032
}

app/src/main/kotlin/org/fossify/notes/activities/WidgetConfigureActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ class WidgetConfigureActivity : SimpleActivity() {
8585
} else {
8686
mBgColor = extras?.getInt(CUSTOMIZED_WIDGET_BG_COLOR) ?: config.widgetBgColor
8787
mTextColor = extras?.getInt(CUSTOMIZED_WIDGET_TEXT_COLOR) ?: config.widgetTextColor
88-
mShowTitle = extras?.getBoolean(CUSTOMIZED_WIDGET_SHOW_TITLE) ?: false
88+
mShowTitle = extras?.getBoolean(CUSTOMIZED_WIDGET_SHOW_TITLE) == true
8989
}
9090

91-
if (mTextColor == resources.getColor(org.fossify.commons.R.color.default_widget_text_color) && config.isUsingSystemTheme) {
91+
if (mTextColor == resources.getColor(org.fossify.commons.R.color.default_widget_text_color) && isDynamicTheme()) {
9292
mTextColor = resources.getColor(org.fossify.commons.R.color.you_primary_color, theme)
9393
}
9494

app/src/main/kotlin/org/fossify/notes/adapters/OpenNoteAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class OpenNoteAdapter(
107107
Color.BLACK
108108
}
109109

110-
val cardBackground = if (context.config.isUsingSystemTheme) {
110+
val cardBackground = if (context.isDynamicTheme()) {
111111
org.fossify.commons.R.drawable.dialog_you_background
112112
} else {
113113
org.fossify.commons.R.drawable.dialog_bg

app/src/main/res/values-de/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<string name="cannot_share_empty_text">Eine leere Notiz kann nicht geteilt werden</string>
77
<string name="new_note">Neue Notiz hinzufügen</string>
88
<string name="no_title">Bitte benenne deine Notiz</string>
9-
<string name="title_taken">Es existiert bereits eine Notiz mit diesem Namen</string>
9+
<string name="title_taken">Eine Notiz mit diesem Namen existiert bereits</string>
1010
<string name="open_note">Notiz öffnen</string>
1111
<string name="delete_note">Notiz löschen</string>
1212
<string name="delete_note_prompt_message">Die Notiz „%s“ wirklich löschen\?</string>

0 commit comments

Comments
 (0)