diff --git a/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt b/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt index 88e15b0e..b698e126 100644 --- a/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt +++ b/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt @@ -9,8 +9,24 @@ import androidx.activity.result.contract.ActivityResultContracts import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.dialogs.ExportBlockedNumbersDialog import org.fossify.commons.dialogs.FilePickerDialog -import org.fossify.commons.extensions.* -import org.fossify.commons.helpers.* +import org.fossify.commons.extensions.beVisibleIf +import org.fossify.commons.extensions.getFileOutputStream +import org.fossify.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.getTempFile +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.toFileDirItem +import org.fossify.commons.extensions.toast +import org.fossify.commons.extensions.underlineText +import org.fossify.commons.extensions.updateTextColors +import org.fossify.commons.extensions.viewBinding +import org.fossify.commons.helpers.APP_ICON_IDS +import org.fossify.commons.helpers.APP_LAUNCHER_NAME +import org.fossify.commons.helpers.ExportResult +import org.fossify.commons.helpers.NavigationIcon +import org.fossify.commons.helpers.PERMISSION_READ_STORAGE +import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE +import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.commons.helpers.isQPlus import org.fossify.commons.interfaces.RefreshRecyclerViewListener import org.fossify.messages.R import org.fossify.messages.databinding.ActivityManageBlockedKeywordsBinding @@ -45,7 +61,10 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL useTransparentNavigation = true, useTopSearchMenu = false ) - setupMaterialScrollListener(scrollingView = binding.manageBlockedKeywordsList, toolbar = binding.blockKeywordsToolbar) + setupMaterialScrollListener( + scrollingView = binding.manageBlockedKeywordsList, + toolbar = binding.blockKeywordsToolbar + ) updateTextColors(binding.manageBlockedKeywordsWrapper) binding.manageBlockedKeywordsPlaceholder2.apply { @@ -85,27 +104,28 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL } } - private val exportActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { uri -> - try { - val outputStream = uri?.let { contentResolver.openOutputStream(it) } - if (outputStream != null) { - exportBlockedKeywordsTo(outputStream) + private val exportActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { uri -> + try { + val outputStream = uri?.let { contentResolver.openOutputStream(it) } + if (outputStream != null) { + exportBlockedKeywordsTo(outputStream) + } + } catch (e: Exception) { + showErrorToast(e) } - } catch (e: Exception) { - showErrorToast(e) } - } - private val importActivityResultLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> - try { - if (uri != null) { - tryImportBlockedKeywordsFromFile(uri) + private val importActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + try { + if (uri != null) { + tryImportBlockedKeywordsFromFile(uri) + } + } catch (e: Exception) { + showErrorToast(e) } - } catch (e: Exception) { - showErrorToast(e) } - } - private fun tryImportBlockedKeywords() { if (isQPlus()) { @@ -202,7 +222,10 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL try { exportActivityResultLauncher.launch(file.name) } catch (e: ActivityNotFoundException) { - toast(org.fossify.commons.R.string.system_service_disabled, Toast.LENGTH_LONG) + toast( + org.fossify.commons.R.string.system_service_disabled, + Toast.LENGTH_LONG + ) } catch (e: Exception) { showErrorToast(e) } @@ -211,7 +234,11 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL } else { handlePermission(PERMISSION_WRITE_STORAGE) { isAllowed -> if (isAllowed) { - ExportBlockedNumbersDialog(this, config.lastBlockedKeywordExportPath, false) { file -> + ExportBlockedNumbersDialog( + this, + config.lastBlockedKeywordExportPath, + false + ) { file -> getFileOutputStream(file.toFileDirItem(this), true) { out -> exportBlockedKeywordsTo(out) } @@ -229,7 +256,12 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL ensureBackgroundThread { val blockedKeywords = config.blockedKeywords.sorted().toArrayList() runOnUiThread { - ManageBlockedKeywordsAdapter(this, blockedKeywords, this, binding.manageBlockedKeywordsList) { + ManageBlockedKeywordsAdapter( + activity = this, + blockedKeywords = blockedKeywords, + listener = this, + recyclerView = binding.manageBlockedKeywordsList + ) { addOrEditBlockedKeyword(it as String) }.apply { binding.manageBlockedKeywordsList.adapter = this @@ -241,7 +273,7 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL } } - fun addOrEditBlockedKeyword(keyword: String? = null) { + private fun addOrEditBlockedKeyword(keyword: String? = null) { AddBlockedKeywordDialog(this, keyword) { updateBlockedKeywords() } diff --git a/app/src/main/kotlin/org/fossify/messages/dialogs/ExportBlockedKeywordsDialog.kt b/app/src/main/kotlin/org/fossify/messages/dialogs/ExportBlockedKeywordsDialog.kt index a05e2b94..69a42dd1 100644 --- a/app/src/main/kotlin/org/fossify/messages/dialogs/ExportBlockedKeywordsDialog.kt +++ b/app/src/main/kotlin/org/fossify/messages/dialogs/ExportBlockedKeywordsDialog.kt @@ -3,7 +3,17 @@ package org.fossify.messages.dialogs import androidx.appcompat.app.AlertDialog import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.dialogs.FilePickerDialog -import org.fossify.commons.extensions.* +import org.fossify.commons.extensions.beGone +import org.fossify.commons.extensions.getAlertDialogBuilder +import org.fossify.commons.extensions.getCurrentFormattedDateTime +import org.fossify.commons.extensions.getParentPath +import org.fossify.commons.extensions.humanizePath +import org.fossify.commons.extensions.internalStoragePath +import org.fossify.commons.extensions.isAValidFilename +import org.fossify.commons.extensions.setupDialogStuff +import org.fossify.commons.extensions.showKeyboard +import org.fossify.commons.extensions.toast +import org.fossify.commons.extensions.value import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.messages.R import org.fossify.messages.databinding.DialogExportBlockedKeywordsBinding @@ -21,42 +31,49 @@ class ExportBlockedKeywordsDialog( private val config = activity.config init { - val view = DialogExportBlockedKeywordsBinding.inflate(activity.layoutInflater, null, false).apply { - exportBlockedKeywordsFolder.text = activity.humanizePath(realPath) - exportBlockedKeywordsFilename.setText("${activity.getString(R.string.blocked_keywords)}_${activity.getCurrentFormattedDateTime()}") + val view = + DialogExportBlockedKeywordsBinding.inflate(activity.layoutInflater, null, false).apply { + exportBlockedKeywordsFolder.text = activity.humanizePath(realPath) + exportBlockedKeywordsFilename.setText("${activity.getString(R.string.blocked_keywords)}_${activity.getCurrentFormattedDateTime()}") - if (hidePath) { - exportBlockedKeywordsFolderLabel.beGone() - exportBlockedKeywordsFolder.beGone() - } else { - exportBlockedKeywordsFolder.setOnClickListener { - FilePickerDialog(activity, realPath, false, showFAB = true) { - exportBlockedKeywordsFolder.text = activity.humanizePath(it) - realPath = it + if (hidePath) { + exportBlockedKeywordsFolderLabel.beGone() + exportBlockedKeywordsFolder.beGone() + } else { + exportBlockedKeywordsFolder.setOnClickListener { + FilePickerDialog(activity, realPath, false, showFAB = true) { + exportBlockedKeywordsFolder.text = activity.humanizePath(it) + realPath = it + } } } } - } activity.getAlertDialogBuilder() .setPositiveButton(org.fossify.commons.R.string.ok, null) .setNegativeButton(org.fossify.commons.R.string.cancel, null) .apply { - activity.setupDialogStuff(view.root, this, R.string.export_blocked_keywords) { alertDialog -> + activity.setupDialogStuff( + view = view.root, + dialog = this, + titleId = R.string.export_blocked_keywords + ) { alertDialog -> alertDialog.showKeyboard(view.exportBlockedKeywordsFilename) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { val filename = view.exportBlockedKeywordsFilename.value when { filename.isEmpty() -> activity.toast(org.fossify.commons.R.string.empty_name) filename.isAValidFilename() -> { - val file = File(realPath, "$filename$BLOCKED_KEYWORDS_EXPORT_EXTENSION") + val file = + File(realPath, "$filename$BLOCKED_KEYWORDS_EXPORT_EXTENSION") if (!hidePath && file.exists()) { activity.toast(org.fossify.commons.R.string.name_taken) return@setOnClickListener } ensureBackgroundThread { - config.lastBlockedKeywordExportPath = file.absolutePath.getParentPath() + config.lastBlockedKeywordExportPath = + file.absolutePath.getParentPath() callback(file) alertDialog.dismiss() } diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt b/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt index f636525d..29507906 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt @@ -2,7 +2,6 @@ package org.fossify.messages.helpers import android.content.Context import org.fossify.commons.helpers.BaseConfig -import org.fossify.commons.helpers.LAST_BLOCKED_NUMBERS_EXPORT_PATH import org.fossify.messages.extensions.getDefaultKeyboardHeight import org.fossify.messages.models.Conversation @@ -19,11 +18,13 @@ class Config(context: Context) : BaseConfig(context) { var showCharacterCounter: Boolean get() = prefs.getBoolean(SHOW_CHARACTER_COUNTER, false) - set(showCharacterCounter) = prefs.edit().putBoolean(SHOW_CHARACTER_COUNTER, showCharacterCounter).apply() + set(showCharacterCounter) = prefs.edit() + .putBoolean(SHOW_CHARACTER_COUNTER, showCharacterCounter).apply() var useSimpleCharacters: Boolean get() = prefs.getBoolean(USE_SIMPLE_CHARACTERS, false) - set(useSimpleCharacters) = prefs.edit().putBoolean(USE_SIMPLE_CHARACTERS, useSimpleCharacters).apply() + set(useSimpleCharacters) = prefs.edit() + .putBoolean(USE_SIMPLE_CHARACTERS, useSimpleCharacters).apply() var sendOnEnter: Boolean get() = prefs.getBoolean(SEND_ON_ENTER, false) @@ -31,19 +32,23 @@ class Config(context: Context) : BaseConfig(context) { var enableDeliveryReports: Boolean get() = prefs.getBoolean(ENABLE_DELIVERY_REPORTS, false) - set(enableDeliveryReports) = prefs.edit().putBoolean(ENABLE_DELIVERY_REPORTS, enableDeliveryReports).apply() + set(enableDeliveryReports) = prefs.edit() + .putBoolean(ENABLE_DELIVERY_REPORTS, enableDeliveryReports).apply() var sendLongMessageMMS: Boolean get() = prefs.getBoolean(SEND_LONG_MESSAGE_MMS, false) - set(sendLongMessageMMS) = prefs.edit().putBoolean(SEND_LONG_MESSAGE_MMS, sendLongMessageMMS).apply() + set(sendLongMessageMMS) = prefs.edit().putBoolean(SEND_LONG_MESSAGE_MMS, sendLongMessageMMS) + .apply() var sendGroupMessageMMS: Boolean get() = prefs.getBoolean(SEND_GROUP_MESSAGE_MMS, false) - set(sendGroupMessageMMS) = prefs.edit().putBoolean(SEND_GROUP_MESSAGE_MMS, sendGroupMessageMMS).apply() + set(sendGroupMessageMMS) = prefs.edit() + .putBoolean(SEND_GROUP_MESSAGE_MMS, sendGroupMessageMMS).apply() var lockScreenVisibilitySetting: Int get() = prefs.getInt(LOCK_SCREEN_VISIBILITY, LOCK_SCREEN_SENDER_MESSAGE) - set(lockScreenVisibilitySetting) = prefs.edit().putInt(LOCK_SCREEN_VISIBILITY, lockScreenVisibilitySetting).apply() + set(lockScreenVisibilitySetting) = prefs.edit() + .putInt(LOCK_SCREEN_VISIBILITY, lockScreenVisibilitySetting).apply() var mmsFileSizeLimit: Long get() = prefs.getLong(MMS_FILE_SIZE_LIMIT, FILE_SIZE_600_KB) @@ -51,7 +56,8 @@ class Config(context: Context) : BaseConfig(context) { var pinnedConversations: Set get() = prefs.getStringSet(PINNED_CONVERSATIONS, HashSet())!! - set(pinnedConversations) = prefs.edit().putStringSet(PINNED_CONVERSATIONS, pinnedConversations).apply() + set(pinnedConversations) = prefs.edit() + .putStringSet(PINNED_CONVERSATIONS, pinnedConversations).apply() fun addPinnedConversationByThreadId(threadId: Long) { pinnedConversations = pinnedConversations.plus(threadId.toString()) @@ -66,7 +72,8 @@ class Config(context: Context) : BaseConfig(context) { } fun removePinnedConversations(conversations: List) { - pinnedConversations = pinnedConversations.minus(conversations.map { it.threadId.toString() }) + pinnedConversations = + pinnedConversations.minus(conversations.map { it.threadId.toString() }) } var blockedKeywords: Set @@ -111,15 +118,18 @@ class Config(context: Context) : BaseConfig(context) { var lastRecycleBinCheck: Long get() = prefs.getLong(LAST_RECYCLE_BIN_CHECK, 0L) - set(lastRecycleBinCheck) = prefs.edit().putLong(LAST_RECYCLE_BIN_CHECK, lastRecycleBinCheck).apply() + set(lastRecycleBinCheck) = prefs.edit().putLong(LAST_RECYCLE_BIN_CHECK, lastRecycleBinCheck) + .apply() var isArchiveAvailable: Boolean get() = prefs.getBoolean(IS_ARCHIVE_AVAILABLE, true) - set(isArchiveAvailable) = prefs.edit().putBoolean(IS_ARCHIVE_AVAILABLE, isArchiveAvailable).apply() + set(isArchiveAvailable) = prefs.edit().putBoolean(IS_ARCHIVE_AVAILABLE, isArchiveAvailable) + .apply() var customNotifications: Set get() = prefs.getStringSet(CUSTOM_NOTIFICATIONS, HashSet())!! - set(customNotifications) = prefs.edit().putStringSet(CUSTOM_NOTIFICATIONS, customNotifications).apply() + set(customNotifications) = prefs.edit() + .putStringSet(CUSTOM_NOTIFICATIONS, customNotifications).apply() fun addCustomNotificationsByThreadId(threadId: Long) { customNotifications = customNotifications.plus(threadId.toString()) @@ -131,5 +141,6 @@ class Config(context: Context) : BaseConfig(context) { var lastBlockedKeywordExportPath: String get() = prefs.getString(LAST_BLOCKED_KEYWORD_EXPORT_PATH, "")!! - set(lastBlockedNumbersExportPath) = prefs.edit().putString(LAST_BLOCKED_KEYWORD_EXPORT_PATH, lastBlockedNumbersExportPath).apply() + set(lastBlockedNumbersExportPath) = prefs.edit() + .putString(LAST_BLOCKED_KEYWORD_EXPORT_PATH, lastBlockedNumbersExportPath).apply() } diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt b/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt index 01630cbd..75a0082f 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt @@ -26,8 +26,6 @@ const val SEND_GROUP_MESSAGE_MMS = "send_group_message_mms" const val MMS_FILE_SIZE_LIMIT = "mms_file_size_limit" const val PINNED_CONVERSATIONS = "pinned_conversations" const val BLOCKED_KEYWORDS = "blocked_keywords" -const val BLOCKED_KEYWORDS_EXPORT_DELIMITER = "," -const val BLOCKED_KEYWORDS_EXPORT_EXTENSION = ".txt" const val LAST_BLOCKED_KEYWORD_EXPORT_PATH = "last_blocked_keyword_export_path" const val EXPORT_SMS = "export_sms" const val EXPORT_MMS = "export_mms" @@ -92,6 +90,9 @@ const val CAPTURE_AUDIO_INTENT = 46 const val PICK_DOCUMENT_INTENT = 47 const val PICK_CONTACT_INTENT = 48 +const val BLOCKED_KEYWORDS_EXPORT_DELIMITER = "," +const val BLOCKED_KEYWORDS_EXPORT_EXTENSION = ".txt" + fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) }