diff --git a/.github/workflows/image-minimizer.js b/.github/workflows/image-minimizer.js index 6ec67b57..ca4ae10e 100644 --- a/.github/workflows/image-minimizer.js +++ b/.github/workflows/image-minimizer.js @@ -18,7 +18,7 @@ module.exports = async ({github, context}) => { initialBody = context.payload.comment.body; } else if (context.eventName == 'issues') { initialBody = context.payload.issue.body; - } else if (context.eventName == 'pull_request') { + } else if (context.eventName == 'pull_request_target') { initialBody = context.payload.pull_request.body; } else { console.log('Aborting: No body found'); @@ -34,7 +34,7 @@ module.exports = async ({github, context}) => { // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com//.) const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; - const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm; + const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/user-attachments\/assets\/[\-0-9a-f]{36,})\)/gm; // Check if we found something let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody) @@ -77,7 +77,7 @@ module.exports = async ({github, context}) => { repo: context.repo.repo, body: newBody }); - } else if (context.eventName == 'pull_request') { + } else if (context.eventName == 'pull_request_target') { console.log('Updating pull request', context.payload.pull_request.number); await github.rest.pulls.update({ pull_number: context.payload.pull_request.number, diff --git a/.github/workflows/image-minimizer.yml b/.github/workflows/image-minimizer.yml index 567a5377..5b9e0c03 100644 --- a/.github/workflows/image-minimizer.yml +++ b/.github/workflows/image-minimizer.yml @@ -5,21 +5,17 @@ on: types: [created, edited] issues: types: [opened, edited] - pull_request: + pull_request_target: types: [opened, edited] -permissions: - issues: write - pull-requests: write - jobs: try-minimize: runs-on: ubuntu-latest - permissions: - pull-requests: write steps: - uses: actions/checkout@v4 + with: + token: ${{ secrets.FOSSIFYBOT_TOKEN }} - uses: actions/setup-node@v4 with: @@ -32,6 +28,7 @@ jobs: uses: actions/github-script@v7 timeout-minutes: 3 with: + github-token: ${{ secrets.FOSSIFYBOT_TOKEN }} script: | const script = require('.github/workflows/image-minimizer.js'); await script({github, context}); diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index eef815bd..0eaf9af8 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -1,25 +1,24 @@ name: no-response -# Both `issue_comment` and `scheduled` event types are required for this Action -# to work properly. on: - issue_comment: - types: [created] schedule: - # Run daily at midnight. - - cron: '0 0 * * *' - -permissions: - issues: write - pull-requests: write + - cron: '0 0 * * *' # Runs daily at midnight + workflow_dispatch: jobs: noResponse: runs-on: ubuntu-latest steps: - - uses: lee-dohm/no-response@v0.5.0 + - uses: actions/stale@v9 with: - token: ${{ github.token }} + repo-token: ${{ secrets.FOSSIFYBOT_TOKEN }} + days-before-stale: -1 # Number of days of inactivity before an issue is closed for lack of response. - daysUntilClose: 30 - responseRequiredLabel: waiting for author + days-before-close: 14 + only-labels: 'waiting for author' + stale-issue-label: 'waiting for author' + stale-pr-label: 'waiting for author' + remove-stale-when-updated: false + ignore-updates: true + close-issue-message: This issue has been automatically closed due to inactivity. We requested additional information but have not received a response from the original author. Without the requested details, we cannot proceed. If you have or find the information needed, please comment so we can reopen the issue. + close-pr-message: This pull request has been automatically closed due to inactivity. We requested additional information but have not received a response from the original author. Without the requested details, we cannot proceed. If you have the needed information or updates, please reopen the PR or comment so we can continue the review. diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..36adc78e --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,9 @@ +name: PR + +on: + pull_request: + branches: [ master ] + +jobs: + call-pr-workflow: + uses: FossifyOrg/.github/.github/workflows/pr.yml@main diff --git a/.github/workflows/testing-build.yml b/.github/workflows/testing-build.yml new file mode 100644 index 00000000..33379f92 --- /dev/null +++ b/.github/workflows/testing-build.yml @@ -0,0 +1,10 @@ +name: Testing build (on PR) + +on: + pull_request: + branches: [ master ] + types: [ labeled, opened, synchronize, reopened ] + +jobs: + call-testing-build-workflow: + uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e866208a..1b2a61be 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlinAndroid) alias(libs.plugins.kotlinSerialization) alias(libs.plugins.ksp) + alias(libs.plugins.detekt) } val keystorePropertiesFile: File = rootProject.file("keystore.properties") @@ -92,10 +93,16 @@ android { lint { checkReleaseBuilds = false - abortOnError = false + abortOnError = true + warningsAsErrors = true + baseline = file("lint-baseline.xml") } } +detekt { + baseline = file("detekt-baseline.xml") +} + dependencies { implementation(libs.fossify.commons) implementation(libs.eventbus) diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml new file mode 100644 index 00000000..90842d8b --- /dev/null +++ b/app/detekt-baseline.xml @@ -0,0 +1,428 @@ + + + + + ComplexCondition:Activity.kt$contact.rawId > 1000000 && contact.contactId > 1000000 && contact.rawId == contact.contactId && (isPackageInstalled(simpleContacts) || isPackageInstalled(simpleContactsDebug)) + ComplexCondition:NewConversationActivity.kt$NewConversationActivity$(intent.action == Intent.ACTION_SENDTO || intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_VIEW) && intent.dataString != null + ComplexCondition:NewConversationActivity.kt$NewConversationActivity$contact.phoneNumbers.any { it.normalizedNumber.contains(searchString, true) } || contact.name.contains(searchString, true) || contact.name.contains(searchString.normalizeString(), true) || contact.name.normalizeString().contains(searchString, true) + CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun getNewConversations(cachedConversations: ArrayList<Conversation>) + CyclomaticComplexMethod:MessagesImporter.kt$MessagesImporter$private fun InputStream.importXml() + CyclomaticComplexMethod:NotificationHelper.kt$NotificationHelper$@SuppressLint("NewApi") fun showMessageNotification( messageId: Long, address: String, body: String, threadId: Long, bitmap: Bitmap?, sender: String?, alertOnlyOnce: Boolean = false ) + CyclomaticComplexMethod:ThreadActivity.kt$ThreadActivity$@SuppressLint("MissingPermission") private fun getThreadItems(): ArrayList<ThreadItem> + CyclomaticComplexMethod:ThreadActivity.kt$ThreadActivity$private fun refreshMenuItems() + CyclomaticComplexMethod:ThreadActivity.kt$ThreadActivity$private fun setupButtons() + CyclomaticComplexMethod:ThreadActivity.kt$ThreadActivity$private fun setupThread() + EmptyCatchBlock:Context.kt${ } + EmptyCatchBlock:MessagesWriter.kt$MessagesWriter${ } + EmptyFunctionBlock:ArchivedConversationsAdapter.kt$ArchivedConversationsAdapter${} + EmptyFunctionBlock:BaseConversationsAdapter.kt$BaseConversationsAdapter${} + EmptyFunctionBlock:ContactsAdapter.kt$ContactsAdapter${} + EmptyFunctionBlock:ManageBlockedKeywordsAdapter.kt$ManageBlockedKeywordsAdapter${} + EmptyFunctionBlock:RecycleBinConversationsAdapter.kt$RecycleBinConversationsAdapter${} + EmptyFunctionBlock:SearchResultsAdapter.kt$SearchResultsAdapter${} + EmptyFunctionBlock:ThreadActivity.kt$ThreadActivity.<no name provided>${} + EmptyFunctionBlock:ThreadAdapter.kt$ThreadAdapter${} + ForbiddenComment:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$// TODO: Need to check whether SC still trying to deliver the SMS to destination and will send the report again? + FunctionParameterNaming:Config.kt$Config$SIMId: Int + LargeClass:ThreadActivity.kt$ThreadActivity : SimpleActivity + LongMethod:Context.kt$fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList<SimpleContact> = ArrayList()): ArrayList<Conversation> + LongMethod:Context.kt$fun Context.getMMS(threadId: Long? = null, getImageResolutions: Boolean = false, sortOrder: String? = null, dateFrom: Int = -1): ArrayList<Message> + LongMethod:Context.kt$fun Context.getMessages( threadId: Long, getImageResolutions: Boolean, dateFrom: Int = -1, includeScheduledMessages: Boolean = true, limit: Int = MESSAGES_LIMIT ): ArrayList<Message> + LongMethod:MessagesReader.kt$MessagesReader$private fun getMmsMessages(threadIds: List<Long>, includeTextOnlyAttachment: Boolean = false): List<MmsBackup> + LongMethod:NotificationHelper.kt$NotificationHelper$@SuppressLint("NewApi") fun showMessageNotification( messageId: Long, address: String, body: String, threadId: Long, bitmap: Bitmap?, sender: String?, alertOnlyOnce: Boolean = false ) + LongMethod:ThreadActivity.kt$ThreadActivity$private fun setupAttachmentPickerView() + LongMethod:ThreadActivity.kt$ThreadActivity$private fun setupButtons() + LongMethod:ThreadActivity.kt$ThreadActivity$private fun setupThread() + LongParameterList:AttachmentPreviews.kt$( activity: Activity, uri: Uri, attachment: Boolean = false, onClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null, onVCardLoaded: (() -> Unit)? = null, ) + LongParameterList:AttachmentPreviews.kt$( uri: Uri, title: String, mimeType: String, onClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null, onRemoveButtonClicked: (() -> Unit)? = null ) + LongParameterList:Context.kt$( address: String, subject: String, body: String, date: Long, read: Int, threadId: Long, type: Int, subscriptionId: Int ) + LongParameterList:Context.kt$( uri: Uri, projection: Array<String>, selection: String? = null, selectionArgs: Array<String>? = null, sortOrder: String? = null, callback: (cursor: Cursor) -> Unit ) + LongParameterList:MessagingUtils.kt$MessagingUtils$( subId: Int, dest: String, text: String, timestamp: Long, threadId: Long, status: Int = Sms.STATUS_NONE, type: Int = Sms.MESSAGE_TYPE_OUTBOX, messageId: Long? = null ) + LongParameterList:NotificationHelper.kt$NotificationHelper$( messageId: Long, address: String, body: String, threadId: Long, bitmap: Bitmap?, sender: String?, alertOnlyOnce: Boolean = false ) + LongParameterList:SmsReceiver.kt$SmsReceiver$( context: Context, address: String, subject: String, body: String, date: Long, read: Int, threadId: Long, type: Int, subscriptionId: Int, status: Int ) + LongParameterList:SmsSender.kt$SmsSender$( subId: Int, dest: String, messages: ArrayList<String>, serviceCenter: String?, requireDeliveryReport: Boolean, messageUri: Uri ) + LongParameterList:SmsSender.kt$SmsSender$( subId: Int, destination: String, body: String, serviceCenter: String?, requireDeliveryReport: Boolean, messageUri: Uri ) + MagicNumber:Activity.kt$1000000 + MagicNumber:BaseConversationsAdapter.kt$BaseConversationsAdapter$0.7f + MagicNumber:BaseConversationsAdapter.kt$BaseConversationsAdapter$0.8f + MagicNumber:BaseConversationsAdapter.kt$BaseConversationsAdapter$0.9f + MagicNumber:BaseConversationsAdapter.kt$BaseConversationsAdapter$1.2f + MagicNumber:ContactsAdapter.kt$ContactsAdapter$1.2f + MagicNumber:Context.kt$10 + MagicNumber:Context.kt$1000 + MagicNumber:Context.kt$1000L + MagicNumber:Context.kt$500L + MagicNumber:ImageCompressor.kt$ImageCompressor$0.6f + MagicNumber:ImageCompressor.kt$ImageCompressor$100 + MagicNumber:ImageCompressor.kt$ImageCompressor$180f + MagicNumber:ImageCompressor.kt$ImageCompressor$270f + MagicNumber:ImageCompressor.kt$ImageCompressor$3 + MagicNumber:ImageCompressor.kt$ImageCompressor$30 + MagicNumber:ImageCompressor.kt$ImageCompressor$56 + MagicNumber:ImageCompressor.kt$ImageCompressor$6 + MagicNumber:ImageCompressor.kt$ImageCompressor$8 + MagicNumber:ImageCompressor.kt$ImageCompressor$90f + MagicNumber:MainActivity.kt$MainActivity$30 + MagicNumber:Message.kt$Message$1000L + MagicNumber:Message.kt$Message.Companion$31 + MagicNumber:MessageDetailsDialog.kt$MessageDetailsDialog$1000L + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$3 + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$4 + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$5 + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$6 + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$7 + MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$8 + MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$23 + MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$5 + MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$59 + MagicNumber:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$3000 + MagicNumber:SearchResultsAdapter.kt$SearchResultsAdapter$0.8f + MagicNumber:SearchResultsAdapter.kt$SearchResultsAdapter$0.9f + MagicNumber:SearchResultsAdapter.kt$SearchResultsAdapter$1.2f + MagicNumber:SettingsActivity.kt$SettingsActivity$3 + MagicNumber:SettingsActivity.kt$SettingsActivity$4 + MagicNumber:SettingsActivity.kt$SettingsActivity$5 + MagicNumber:SettingsActivity.kt$SettingsActivity$6 + MagicNumber:SettingsActivity.kt$SettingsActivity$7 + MagicNumber:SmsReceiver.kt$SmsReceiver$1000 + MagicNumber:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$0x03 + MagicNumber:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$0x3f + MagicNumber:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$16 + MagicNumber:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$24 + MagicNumber:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$3 + MagicNumber:ThreadActivity.kt$ThreadActivity$0.4f + MagicNumber:ThreadActivity.kt$ThreadActivity$0.9f + MagicNumber:ThreadActivity.kt$ThreadActivity$1000 + MagicNumber:ThreadActivity.kt$ThreadActivity$1000L + MagicNumber:ThreadActivity.kt$ThreadActivity$14 + MagicNumber:ThreadActivity.kt$ThreadActivity$15 + MagicNumber:ThreadActivity.kt$ThreadActivity$150 + MagicNumber:ThreadActivity.kt$ThreadActivity$16 + MagicNumber:ThreadActivity.kt$ThreadActivity$2 + MagicNumber:ThreadActivity.kt$ThreadActivity$20 + MagicNumber:ThreadActivity.kt$ThreadActivity$30 + MagicNumber:ThreadActivity.kt$ThreadActivity$300 + MagicNumber:ThreadActivity.kt$ThreadActivity$500L + MagicNumber:ThreadAdapter.kt$ThreadAdapter$0.8f + MagicNumber:ThreadAdapter.kt$ThreadAdapter$4 + MagicNumber:VCardViewerAdapter.kt$VCardViewerAdapter.VCardContactViewHolder$1.1f + MagicNumber:VCardViewerAdapter.kt$VCardViewerAdapter.VCardPropertyViewHolder$1.1f + MatchingDeclarationName:ThreadItems.kt$ThreadItem + MaxLineLength:AddBlockedKeywordDialog.kt$AddBlockedKeywordDialog$class + MaxLineLength:ArchivedConversationsAdapter.kt$ArchivedConversationsAdapter$val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:ArchivedConversationsAdapter.kt$ArchivedConversationsAdapter$val conversationsToUnarchive = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:AttachmentPreviews.kt$vcardAttachmentHolder + MaxLineLength:AttachmentPreviews.kt$vcardSubtitle.text = context.resources.getQuantityString(R.plurals.and_other_contacts, quantity, quantity) + MaxLineLength:AttachmentsAdapter.kt$AttachmentsAdapter$onClick = { activity.launchViewIntent(attachment.uri, attachment.mimetype, attachment.filename) } + MaxLineLength:AttachmentsAdapter.kt$AttachmentsAdapter.<no name provided>$override + MaxLineLength:AutoCompleteTextViewAdapter.kt$AutoCompleteTextViewAdapter$class + MaxLineLength:BaseConversationsAdapter.kt$BaseConversationsAdapter$SimpleContactsHelper(activity).loadContactImage(conversation.photoUri, conversationImage, conversation.title, placeholder) + MaxLineLength:BaseConversationsAdapter.kt$BaseConversationsAdapter$protected fun getSelectedItems() + MaxLineLength:BaseConversationsAdapter.kt$BaseConversationsAdapter.<no name provided>$override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) + MaxLineLength:Config.kt$Config$set(lockScreenVisibilitySetting) = prefs.edit().putInt(LOCK_SCREEN_VISIBILITY, lockScreenVisibilitySetting).apply() + MaxLineLength:Constants.kt$/** Not to be used with real messages persisted in the telephony db. This is for internal use only (e.g. scheduled messages, notification ids etc). */ + MaxLineLength:ContactsAdapter.kt$ContactsAdapter$activity: SimpleActivity + MaxLineLength:Context.kt$for + MaxLineLength:Context.kt$fun + MaxLineLength:Context.kt$if + MaxLineLength:Context.kt$selection = "${Sms.DATE} < ${dateFrom.toLong()}" + MaxLineLength:Context.kt$val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) + MaxLineLength:Context.kt$val contact = SimpleContact(addressId, addressId, name, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList()) + MaxLineLength:Context.kt$val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first(), isArchived = archived) + MaxLineLength:Context.kt$val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" + MaxLineLength:Context.kt$val privateContact = privateContacts.firstOrNull { it.phoneNumbers.first().normalizedNumber == senderNumber } + MaxLineLength:ConversationDetailsActivity.kt$ConversationDetailsActivity$setupMaterialScrollListener(scrollingView = binding.participantsRecyclerview, toolbar = binding.conversationDetailsToolbar) + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$findItem(R.id.cab_block_number).title = activity.addLockedLabelIfNeeded(org.fossify.commons.R.string.block_number) + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$findItem(R.id.cab_dial_number).isVisible = isSingleSelection && !isGroupConversation && !isShortCodeWithLetters(selectedConversation.phoneNumber) + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$menu.findItem(R.id.cab_pin_conversation).isVisible = selectedConversations.any { !pinnedConversations.contains(it.threadId.toString()) } + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$menu.findItem(R.id.cab_unpin_conversation).isVisible = selectedConversations.any { pinnedConversations.contains(it.threadId.toString()) } + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$val conversationsMarkedAsRead = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$val conversationsMarkedAsUnread = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:ConversationsAdapter.kt$ConversationsAdapter$val question = String.format(resources.getString(org.fossify.commons.R.string.block_confirmation), numbersString) + MaxLineLength:ConversationsDao.kt$ConversationsDao$@Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE (SELECT COUNT(*) FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND messages.thread_id = conversations.thread_id) > 0") + MaxLineLength:ConversationsDao.kt$ConversationsDao$@Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE archived = 0") + MaxLineLength:ConversationsDao.kt$ConversationsDao$@Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE archived = 1") + MaxLineLength:DirectReplyReceiver.kt$DirectReplyReceiver$context.notificationHelper.showMessageNotification(messageId, address, body, threadId, bitmap, sender = null, alertOnlyOnce = true) + MaxLineLength:DirectReplyReceiver.kt$DirectReplyReceiver$val message = context.getMessages(threadId, getImageResolutions = false, includeScheduledMessages = false, limit = 1).lastOrNull() + MaxLineLength:Gson.kt$private val gsonBuilder = GsonBuilder().registerTypeAdapter(object : TypeToken<Map<String, Any>>() {}.type, MapDeserializerDoubleAsIntFix()) + MaxLineLength:HeadlessSmsSendService.kt$HeadlessSmsSendService$val number = Uri.decode(intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").trim()) + MaxLineLength:ImageCompressor.kt$ImageCompressor$fun + MaxLineLength:ImageCompressor.kt$ImageCompressor$private + MaxLineLength:ImageCompressor.kt$ImageCompressor$var imageFile = File(outputDirectory, System.currentTimeMillis().toString().plus(mimeType.getExtensionFromMimeType())) + MaxLineLength:MainActivity.kt$MainActivity$(drawable as LayerDrawable).findDrawableByLayerId(org.fossify.commons.R.id.shortcut_plus_background).applyColorFilter(appIconColor) + MaxLineLength:MainActivity.kt$MainActivity$// there are no cached conversations on the first run so we show the loading placeholder and progress until we are done loading from telephony + MaxLineLength:MainActivity.kt$MainActivity$// while SEND_SMS and READ_SMS permissions are mandatory, READ_CONTACTS is optional. If we don't have it, we just won't be able to show the contact name in some cases + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, org.fossify.commons.R.string.faq_2_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, org.fossify.commons.R.string.faq_6_text_commons)) + MaxLineLength:MainActivity.kt$MainActivity$val searchResult = SearchResult(-1, conversation.title, conversation.phoneNumber, date, conversation.threadId, conversation.photoUri) + MaxLineLength:MainActivity.kt$MainActivity$val searchResult = SearchResult(message.id, recipient, message.body, date, message.threadId, message.senderPhotoUri) + MaxLineLength:ManageBlockedKeywordsActivity.kt$ManageBlockedKeywordsActivity$ManageBlockedKeywordsAdapter + MaxLineLength:ManageBlockedKeywordsActivity.kt$ManageBlockedKeywordsActivity$setupMaterialScrollListener(scrollingView = binding.manageBlockedKeywordsList, toolbar = binding.blockKeywordsToolbar) + MaxLineLength:MessagesDao.kt$MessagesDao$@Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND recycle_bin_messages.deleted_ts < :timestamp") + MaxLineLength:MessagesDao.kt$MessagesDao$@Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND thread_id = :threadId") + MaxLineLength:MessagesDao.kt$MessagesDao$@Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL") + MaxLineLength:MessagesDao.kt$MessagesDao$@Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND thread_id = :threadId AND is_scheduled = 1") + MaxLineLength:MessagesDao.kt$MessagesDao$@Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND thread_id = :threadId") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase$@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class, RecycleBinMessage::class], version = 8) + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion$db + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$"INSERT OR IGNORE INTO conversations_new (thread_id, snippet, date, read, title, photo_uri, is_group_conversation, phone_number) " + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$"SELECT thread_id, snippet, date, read, title, photo_uri, is_group_conversation, phone_number FROM conversations" + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread_id` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE TABLE IF NOT EXISTS `recycle_bin_messages` (`id` INTEGER NOT NULL PRIMARY KEY, `deleted_ts` INTEGER NOT NULL)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE TABLE conversations_new (`thread_id` INTEGER NOT NULL PRIMARY KEY, `snippet` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `title` TEXT NOT NULL, `photo_uri` TEXT NOT NULL, `is_group_conversation` INTEGER NOT NULL, `phone_number` TEXT NOT NULL)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_conversations_id` ON `conversations` (`thread_id`)") + MaxLineLength:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_recycle_bin_messages_id` ON `recycle_bin_messages` (`id`)") + MaxLineLength:MessagesImporter.kt$MessagesImporter$messagesFailed > 0 && messagesImported > 0 -> activity.toast(org.fossify.commons.R.string.importing_some_entries_failed) + MaxLineLength:MessagesReader.kt$MessagesReader$parts.add(MmsPart(contentDisposition, charset, contentId, contentLocation, contentType, ctStart, ctType, filename, name, sequenceOrder, text, data)) + MaxLineLength:MessagesReader.kt$MessagesReader$smsList.add(SmsBackup(subscriptionId, address, body, date, dateSent, locked, protocol, read, status, type, serviceCenter)) + MaxLineLength:MessagesReader.kt$MessagesReader$val partUri = if (isQPlus()) Mms.Part.CONTENT_URI.buildUpon().appendPath(partId.toString()).build() else Uri.parse("content://mms/part/$partId") + MaxLineLength:MessagesReader.kt$MessagesReader$val uri = if (isRPlus()) Mms.Addr.getAddrUriForMessage(messageId.toString()) else Uri.parse("content://mms/$messageId/addr") + MaxLineLength:MessagesWriter.kt$MessagesWriter$// 2. write parts - parts depend on the msg id, check if part exist before writing, write data if it is a non-text part + MaxLineLength:MessagesWriter.kt$MessagesWriter$val addressUri = if (isRPlus()) Mms.Addr.getAddrUriForMessage(messageId.toString()) else Uri.parse("content://mms/$messageId/addr") + MaxLineLength:MessagesWriter.kt$MessagesWriter$val selection = "${Mms.Part.CONTENT_LOCATION} = ? AND ${Mms.Part.CONTENT_TYPE} = ? AND ${Mms.Part.MSG_ID} = ? AND ${Mms.Part.CONTENT_ID} = ?" + MaxLineLength:MessagesWriter.kt$MessagesWriter$val selectionArgs = arrayOf(mmsBackup.date.toString(), mmsBackup.dateSent.toString(), threadId.toString(), mmsBackup.messageBox.toString()) + MaxLineLength:MessagesWriter.kt$MessagesWriter$val selectionArgs = arrayOf(mmsPart.contentLocation.toString(), mmsPart.contentType, messageId.toString(), mmsPart.contentId.toString()) + MaxLineLength:Messaging.kt$* + MaxLineLength:Messaging.kt$fun + MaxLineLength:Messaging.kt$messagingUtils.sendSmsMessage(text, addresses.toSet(), settings.subscriptionId, settings.deliveryReports, messageId) + MaxLineLength:MessagingUtils.kt$MessagingUtils$context.showErrorToast(e.localizedMessage ?: context.getString(org.fossify.commons.R.string.unknown_error_occurred)) + MaxLineLength:MessagingUtils.kt$MessagingUtils$fun + MaxLineLength:MmsPart.kt$MmsPart$return !(text != null || contentType.lowercase().startsWith("text") || contentType.lowercase() == "application/smil") + MaxLineLength:MmsReceiver.kt$MmsReceiver$override fun onError(context: Context, error: String) + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$// READ_CONTACTS permission is not mandatory, but without it we won't be able to show any suggestions during typing + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$SimpleContactsHelper(this@NewConversationActivity).loadContactImage(contact.photoUri, suggestedContactImage, contact.name) + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$if + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$items.add(RadioItem(index, "${phoneNumber.normalizedNumber} ($type)", phoneNumber.normalizedNumber)) + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$val number = intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").replace("+", "%2b").trim() + MaxLineLength:NewConversationActivity.kt$NewConversationActivity$} + MaxLineLength:NotificationHelper.kt$NotificationHelper$PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE) + MaxLineLength:NotificationHelper.kt$NotificationHelper$PendingIntent.getBroadcast(context, notificationId, deleteSmsIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE) + MaxLineLength:NotificationHelper.kt$NotificationHelper$PendingIntent.getBroadcast(context, notificationId, markAsReadIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE) + MaxLineLength:NotificationHelper.kt$NotificationHelper$builder.addAction(org.fossify.commons.R.drawable.ic_check_vector, context.getString(R.string.mark_as_read), markAsReadPendingIntent) + MaxLineLength:NotificationHelper.kt$NotificationHelper$private + MaxLineLength:NotificationHelper.kt$NotificationHelper$val activeStyle = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(currentNotification.notification) + MaxLineLength:NotificationHelper.kt$NotificationHelper$val contentPendingIntent = PendingIntent.getActivity(context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE) + MaxLineLength:RecycleBinConversationsAdapter.kt$RecycleBinConversationsAdapter$val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation> + MaxLineLength:ScheduleMessageDialog.kt$ScheduleMessageDialog$activity + MaxLineLength:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$context.showErrorToast(e.localizedMessage ?: context.getString(org.fossify.commons.R.string.unknown_error_occurred)) + MaxLineLength:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$val wakelock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "simple.messenger:scheduled.message.receiver") + MaxLineLength:SearchResult.kt$SearchResult + MaxLineLength:SearchResultsAdapter.kt$SearchResultsAdapter$SimpleContactsHelper(activity).loadContactImage(searchResult.photoUri, searchResultImage, searchResult.title) + MaxLineLength:SearchResultsAdapter.kt$SearchResultsAdapter$activity: SimpleActivity + MaxLineLength:SettingsActivity.kt$SettingsActivity$ConfirmationDialog(this@SettingsActivity, "", confirmationTextId, org.fossify.commons.R.string.ok, 0) { } + MaxLineLength:SettingsActivity.kt$SettingsActivity$private + MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) + MaxLineLength:SmsReceiver.kt$SmsReceiver$handleMessage(context, address, subject, body, date, read, threadId, type, subscriptionId, status) + MaxLineLength:SmsReceiver.kt$SmsReceiver$val newMessageId = context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) + MaxLineLength:SmsReceiver.kt$SmsReceiver$val participant = SimpleContact(0, 0, senderName, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList()) + MaxLineLength:SmsSender.kt$SmsSender$val intent = Intent(SendStatusReceiver.SMS_DELIVERED_ACTION, requestUri, app, SmsStatusDeliveredReceiver::class.java) + MaxLineLength:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$// TODO: Need to check whether SC still trying to deliver the SMS to destination and will send the report again? + MaxLineLength:ThreadActivity.kt$ThreadActivity$(selectedContactBg as LayerDrawable).findDrawableByLayerId(R.id.selected_contact_bg).applyColorFilter(properPrimaryColor) + MaxLineLength:ThreadActivity.kt$ThreadActivity$// do not show the date/time above every message, only if the difference between the 2 messages is at least MIN_DATE_TIME_DIFF_SECS, + MaxLineLength:ThreadActivity.kt$ThreadActivity$CAPTURE_VIDEO_INTENT, PICK_DOCUMENT_INTENT, CAPTURE_AUDIO_INTENT, PICK_PHOTO_INTENT, PICK_VIDEO_INTENT -> addAttachment(data) + MaxLineLength:ThreadActivity.kt$ThreadActivity$binding.messageHolder.scheduledMessageButton.text + MaxLineLength:ThreadActivity.kt$ThreadActivity$binding.messageHolder.threadSelectSimNumber.text = (availableSIMCards[currentSIMCardIndex].id).toString() + MaxLineLength:ThreadActivity.kt$ThreadActivity$deleteMessages = { messages, toRecycleBin, fromRecycleBin -> deleteMessages(messages, toRecycleBin, fromRecycleBin) } + MaxLineLength:ThreadActivity.kt$ThreadActivity$findItem(R.id.add_number_to_contact).isVisible + MaxLineLength:ThreadActivity.kt$ThreadActivity$findItem(R.id.archive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == false && !isRecycleBin && archiveAvailable + MaxLineLength:ThreadActivity.kt$ThreadActivity$findItem(R.id.rename_conversation).isVisible = participants.size > 1 && conversation != null && !isRecycleBin + MaxLineLength:ThreadActivity.kt$ThreadActivity$findItem(R.id.unarchive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == true && !isRecycleBin && archiveAvailable + MaxLineLength:ThreadActivity.kt$ThreadActivity$if + MaxLineLength:ThreadActivity.kt$ThreadActivity$it.height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() + MaxLineLength:ThreadActivity.kt$ThreadActivity$it.width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() + MaxLineLength:ThreadActivity.kt$ThreadActivity$launchActivityForResult(this, PICK_SAVE_FILE_INTENT, error = org.fossify.commons.R.string.system_service_disabled) + MaxLineLength:ThreadActivity.kt$ThreadActivity$messages = messages.filter { !recycledMessages.contains(it.id) }.toMutableList() as ArrayList<Message> + MaxLineLength:ThreadActivity.kt$ThreadActivity$private + MaxLineLength:ThreadActivity.kt$ThreadActivity$privateContacts.firstOrNull { it.doesHavePhoneNumber(participant.phoneNumbers.first().normalizedNumber) } + MaxLineLength:ThreadActivity.kt$ThreadActivity$updateMaterialActivityViews(binding.threadCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = false) + MaxLineLength:ThreadActivity.kt$ThreadActivity$val contact = SimpleContact(number.hashCode(), number.hashCode(), number, "", arrayListOf(phoneNumber), ArrayList(), ArrayList()) + MaxLineLength:ThreadActivity.kt$ThreadActivity$val firstRowWidth = parentWidth - resources.getDimension(org.fossify.commons.R.dimen.normal_icon_size).toInt() + sideMargin / 2 + MaxLineLength:ThreadActivity.kt$ThreadActivity$val isSentFromDifferentKnownSIM = prevSIMId != -1 && message.subscriptionId != -1 && prevSIMId != message.subscriptionId + MaxLineLength:ThreadActivity.kt$ThreadActivity$val question = String.format(resources.getString(org.fossify.commons.R.string.block_confirmation), numbersString) + MaxLineLength:ThreadActivity.kt$ThreadActivity$val shouldScrollToBottom = currentList.lastOrNull() != threadItems.lastOrNull() && lastPosition - lastVisiblePosition == 1 + MaxLineLength:ThreadActivity.kt$ThreadActivity$val subscriptionId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId ?: SmsManager.getDefaultSmsSubscriptionId() + MaxLineLength:ThreadActivity.kt$ThreadActivity.<no name provided>$override fun onProgress(insets: WindowInsetsCompat, runningAnimations: MutableList<WindowInsetsAnimationCompat>) + MaxLineLength:ThreadActivity.kt$ThreadActivity.<no name provided>$val isCloseToBottom = lastVisibleItemPosition >= getOrCreateThreadAdapter().itemCount - SCROLL_TO_BOTTOM_FAB_LIMIT + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$// not sure how we can get UnknownFormatConversionException here, so show the error and hope that someone reports it + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$mimetype.isImageMimeType() || mimetype.isVideoMimeType() -> setupImageView(holder, binding = this, message, attachment) + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$mimetype.isVCardMimeType() -> setupVCardView(holder, threadMessageAttachmentsHolder, message, attachment) + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$private + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$private fun getSelectedItems() + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$text = dateTime.date.formatDateOrTime(context, hideTimeAtOtherDays = false, showYearEvenIfCurrent = false) + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$threadSuccess.setImageResource(if (isDelivered) R.drawable.ic_check_double_vector else org.fossify.commons.R.drawable.ic_check_vector) + MaxLineLength:ThreadAdapter.kt$ThreadAdapter$val + MaxLineLength:ThreadAdapter.kt$ThreadAdapter.<no name provided>$override + MaxLineLength:ThreadAdapter.kt$ThreadAdapter.<no name provided>$override fun onResourceReady(dr: Drawable, a: Any, t: Target<Drawable>, d: DataSource, i: Boolean) + MaxLineLength:VCard.kt$Telephone::class.java + MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Note -> VCardPropertyWrapper(value, context.getString(org.fossify.commons.R.string.notes), property) + MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Telephone -> VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property) + MaxLineLength:VCard.kt$VCardWrapper$data + MaxLineLength:VCardViewerActivity.kt$VCardViewerActivity$updateMaterialActivityViews(binding.vcardViewerCoordinator, binding.contactsList, useTransparentNavigation = true, useTopSearchMenu = false) + MaxLineLength:VCardViewerAdapter.kt$VCardViewerAdapter.VCardPropertyViewHolder$inner + NestedBlockDepth:AttachmentUtils.kt$AttachmentUtils$private fun readBody(parser: XmlPullParser): List<String> + NestedBlockDepth:Context.kt$fun Context.getAllDrafts(): HashMap<Long, String?> + NestedBlockDepth:Context.kt$fun Context.getThreadParticipants(threadId: Long, contactsMap: HashMap<Int, SimpleContact>?): ArrayList<SimpleContact> + NestedBlockDepth:MessagesImporter.kt$MessagesImporter$private fun InputStream.importXml() + NestedBlockDepth:MessagesWriter.kt$MessagesWriter$@SuppressLint("NewApi") private fun writeMmsPart(mmsPart: MmsPart, messageId: Long) + NestedBlockDepth:Messaging.kt$fun Context.sendMessageCompat(text: String, addresses: List<String>, subId: Int?, attachments: List<Attachment>, messageId: Long? = null) + NestedBlockDepth:MessagingUtils.kt$MessagingUtils$@Deprecated("TODO: Move/rewrite MMS code into the app.") fun sendMmsMessage(text: String, addresses: List<String>, attachment: Attachment?, settings: Settings, messageId: Long? = null) + NestedBlockDepth:MessagingUtils.kt$MessagingUtils$fun updateSmsMessageSendingStatus(messageUri: Uri?, type: Int) + NestedBlockDepth:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$override fun updateAndroidDatabase(context: Context, intent: Intent, receiverResultCode: Int) + NestedBlockDepth:ThreadActivity.kt$ThreadActivity$private fun fetchNextMessages() + NestedBlockDepth:ThreadActivity.kt$ThreadActivity$private fun setupAttachmentSizes() + NestedBlockDepth:ThreadActivity.kt$ThreadActivity$private fun setupButtons() + NestedBlockDepth:ThreadAdapter.kt$ThreadAdapter$private fun setupSentMessageView(messageBinding: ItemMessageBinding, message: Message) + NestedBlockDepth:ThreadAdapter.kt$ThreadAdapter$private fun setupView(holder: ViewHolder, view: View, message: Message) + PrintStackTrace:Context.kt$e + PrintStackTrace:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$e + PrintStackTrace:SmsManager.kt$e + ReturnCount:Context.kt$fun Context.getFileSizeFromUri(uri: Uri): Long + ReturnCount:Context.kt$fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto + ReturnCount:MapDeserializerDoubleAsIntFix.kt$MapDeserializerDoubleAsIntFix$fun read(element: JsonElement): Any? + ReturnCount:MessagesReader.kt$MessagesReader$@SuppressLint("NewApi") private fun usePart(partId: Long, block: (InputStream) -> String): String + ReturnCount:ThreadActivity.kt$ThreadActivity$private fun addAttachment(uri: Uri) + ReturnCount:VCardParser.kt$fun VCard?.parseNameFromVCard(): String? + SpreadOperator:Context.kt$(*scheduledMessages) + SpreadOperator:MainActivity.kt$MainActivity$(*currentMessages.toTypedArray()) + SpreadOperator:ThreadActivity.kt$ThreadActivity$(*currentMessages.toTypedArray()) + SwallowedException:Activity.kt$e: ActivityNotFoundException + SwallowedException:ArchivedConversationsActivity.kt$ArchivedConversationsActivity$e: Exception + SwallowedException:AttachmentPreviews.kt$e: Exception + SwallowedException:Context.kt$e: Exception + SwallowedException:Context.kt$e: FileNotFoundException + SwallowedException:ImageCompressor.kt$ImageCompressor$e: Exception + SwallowedException:JsonElement.kt$e: Exception + SwallowedException:MainActivity.kt$MainActivity$e: Exception + SwallowedException:MessagesImporter.kt$MessagesImporter$e: Exception + SwallowedException:MessagesImporter.kt$MessagesImporter$e: IllegalArgumentException + SwallowedException:MessagesImporter.kt$MessagesImporter$e: SerializationException + SwallowedException:MessagesReader.kt$MessagesReader$e: IOException + SwallowedException:MessagesWriter.kt$MessagesWriter$e: Exception + SwallowedException:MmsReceiver.kt$MmsReceiver$e: Exception + SwallowedException:NewConversationActivity.kt$NewConversationActivity$e: Exception + SwallowedException:RecycleBinConversationsActivity.kt$RecycleBinConversationsActivity$e: Exception + SwallowedException:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$e: NullPointerException + SwallowedException:ThreadActivity.kt$ThreadActivity$e: ActivityNotFoundException + SwallowedException:ThreadActivity.kt$ThreadActivity$e: Exception + SwallowedException:VCardParser.kt$e: Exception + ThrowingExceptionsWithoutMessageOrCause:AttachmentUtils.kt$AttachmentUtils$IllegalStateException() + ThrowingExceptionsWithoutMessageOrCause:MessagesImporter.kt$MessagesImporter$IllegalStateException() + ThrowsCount:SmsSender.kt$SmsSender$fun sendMessage( subId: Int, destination: String, body: String, serviceCenter: String?, requireDeliveryReport: Boolean, messageUri: Uri ) + TooGenericExceptionCaught:Activity.kt$e: Exception + TooGenericExceptionCaught:ArchivedConversationsActivity.kt$ArchivedConversationsActivity$e: Exception + TooGenericExceptionCaught:AttachmentPreviews.kt$e: Exception + TooGenericExceptionCaught:Context.kt$e: Exception + TooGenericExceptionCaught:DirectReplyReceiver.kt$DirectReplyReceiver$e: Exception + TooGenericExceptionCaught:ImageCompressor.kt$ImageCompressor$e: Exception + TooGenericExceptionCaught:JsonElement.kt$e: Exception + TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception + TooGenericExceptionCaught:MessagesImporter.kt$MessagesImporter$e: Exception + TooGenericExceptionCaught:MessagesWriter.kt$MessagesWriter$e: Exception + TooGenericExceptionCaught:Messaging.kt$e: Exception + TooGenericExceptionCaught:MessagingUtils.kt$MessagingUtils$e: Error + TooGenericExceptionCaught:MessagingUtils.kt$MessagingUtils$e: Exception + TooGenericExceptionCaught:MmsReceiver.kt$MmsReceiver$e: Exception + TooGenericExceptionCaught:NewConversationActivity.kt$NewConversationActivity$e: Exception + TooGenericExceptionCaught:RecycleBinConversationsActivity.kt$RecycleBinConversationsActivity$e: Exception + TooGenericExceptionCaught:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$e: Error + TooGenericExceptionCaught:ScheduledMessageReceiver.kt$ScheduledMessageReceiver$e: Exception + TooGenericExceptionCaught:SettingsActivity.kt$SettingsActivity$e: Exception + TooGenericExceptionCaught:SmsManager.kt$e: Exception + TooGenericExceptionCaught:SmsSender.kt$SmsSender$e: Exception + TooGenericExceptionCaught:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$e: NullPointerException + TooGenericExceptionCaught:ThreadActivity.kt$ThreadActivity$e: Error + TooGenericExceptionCaught:ThreadActivity.kt$ThreadActivity$e: Exception + TooGenericExceptionCaught:ThreadAdapter.kt$ThreadAdapter$e: Exception + TooGenericExceptionCaught:VCardParser.kt$e: Exception + TooManyFunctions:ArchivedConversationsActivity.kt$ArchivedConversationsActivity : SimpleActivity + TooManyFunctions:BaseConversationsAdapter.kt$BaseConversationsAdapter : MyRecyclerViewListAdapterOnPopupTextUpdate + TooManyFunctions:ContactsAdapter.kt$ContactsAdapter : MyRecyclerViewAdapter + TooManyFunctions:Context.kt$org.fossify.messages.extensions.Context.kt + TooManyFunctions:ConversationsAdapter.kt$ConversationsAdapter : BaseConversationsAdapter + TooManyFunctions:ConversationsDao.kt$ConversationsDao + TooManyFunctions:JsonObject.kt$org.fossify.messages.extensions.gson.JsonObject.kt + TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivity + TooManyFunctions:ManageBlockedKeywordsAdapter.kt$ManageBlockedKeywordsAdapter : MyRecyclerViewAdapter + TooManyFunctions:MessagesDao.kt$MessagesDao + TooManyFunctions:RecycleBinConversationsActivity.kt$RecycleBinConversationsActivity : SimpleActivity + TooManyFunctions:SearchResultsAdapter.kt$SearchResultsAdapter : MyRecyclerViewAdapter + TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity + TooManyFunctions:ThreadActivity.kt$ThreadActivity : SimpleActivity + TooManyFunctions:ThreadAdapter.kt$ThreadAdapter : MyRecyclerViewListAdapter + UnusedParameter:ArchivedConversationsActivity.kt$ArchivedConversationsActivity$event: Events.RefreshMessages + UnusedParameter:MainActivity.kt$MainActivity$event: Events.RefreshMessages + UnusedParameter:RecycleBinConversationsActivity.kt$RecycleBinConversationsActivity$event: Events.RefreshMessages + UnusedParameter:ThreadActivity.kt$ThreadActivity$event: Events.RefreshMessages + UnusedPrivateMember:MessagesImporter.kt$MessagesImporter$private fun isJsonMimeType(mimeType: String): Boolean + UseCheckOrError:AttachmentUtils.kt$AttachmentUtils$throw IllegalStateException() + UseCheckOrError:MessagesImporter.kt$MessagesImporter$throw IllegalStateException() + UseRequire:SmsSender.kt$SmsSender$throw IllegalArgumentException("SmsSender: empty text message") + VariableNaming:MainActivity.kt$MainActivity$private val MAKE_DEFAULT_APP_REQUEST = 1 + VariableNaming:MessagesWriter.kt$MessagesWriter$private val INVALID_ID = -1L + VariableNaming:ThreadActivity.kt$ThreadActivity$private val MIN_DATE_TIME_DIFF_SECS = 300 + VariableNaming:ThreadActivity.kt$ThreadActivity$private val SCROLL_TO_BOTTOM_FAB_LIMIT = 20 + VariableNaming:ThreadActivity.kt$ThreadActivity$private val TYPE_DELETE = 16 + VariableNaming:ThreadActivity.kt$ThreadActivity$private val TYPE_EDIT = 14 + VariableNaming:ThreadActivity.kt$ThreadActivity$private val TYPE_SEND = 15 + WildcardImport:Activity.kt$import org.fossify.commons.extensions.* + WildcardImport:ArchivedConversationsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:AttachmentPreviews.kt$import org.fossify.commons.extensions.* + WildcardImport:AttachmentPreviews.kt$import org.fossify.messages.extensions.* + WildcardImport:AttachmentsAdapter.kt$import org.fossify.commons.extensions.* + WildcardImport:AttachmentsAdapter.kt$import org.fossify.messages.extensions.* + WildcardImport:AttachmentsAdapter.kt$import org.fossify.messages.helpers.* + WildcardImport:BaseConversationsAdapter.kt$import org.fossify.commons.extensions.* + WildcardImport:Context.kt$import android.provider.Telephony.* + WildcardImport:Context.kt$import org.fossify.commons.extensions.* + WildcardImport:Context.kt$import org.fossify.commons.helpers.* + WildcardImport:Context.kt$import org.fossify.messages.helpers.* + WildcardImport:Context.kt$import org.fossify.messages.models.* + WildcardImport:ConversationDetailsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:ConversationDetailsActivity.kt$import org.fossify.messages.extensions.* + WildcardImport:ConversationsAdapter.kt$import org.fossify.commons.extensions.* + WildcardImport:ConversationsAdapter.kt$import org.fossify.messages.extensions.* + WildcardImport:DirectReplyReceiver.kt$import org.fossify.messages.extensions.* + WildcardImport:ExportMessagesDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:JsonElement.kt$import com.google.gson.* + WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:MainActivity.kt$import org.fossify.messages.extensions.* + WildcardImport:ManageBlockedKeywordsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:ManageBlockedKeywordsAdapter.kt$import android.view.* + WildcardImport:MessagesDao.kt$import androidx.room.* + WildcardImport:MessagesDatabase.kt$import org.fossify.messages.models.* + WildcardImport:MessagesImporter.kt$import org.fossify.messages.models.* + WildcardImport:MessagesReader.kt$import org.fossify.commons.extensions.* + WildcardImport:MessagesReader.kt$import org.fossify.messages.models.* + WildcardImport:MmsReceiver.kt$import org.fossify.messages.extensions.* + WildcardImport:NewConversationActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:NewConversationActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:NewConversationActivity.kt$import org.fossify.messages.helpers.* + WildcardImport:RecycleBinConversationsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:ScheduleMessageDialog.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.dialogs.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:SettingsActivity.kt$import org.fossify.messages.helpers.* + WildcardImport:SmsReceiver.kt$import org.fossify.messages.extensions.* + WildcardImport:SmsStatusSentReceiver.kt$import org.fossify.messages.extensions.* + WildcardImport:ThreadActivity.kt$import androidx.core.view.* + WildcardImport:ThreadActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:ThreadActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:ThreadActivity.kt$import org.fossify.messages.extensions.* + WildcardImport:ThreadActivity.kt$import org.fossify.messages.helpers.* + WildcardImport:ThreadActivity.kt$import org.fossify.messages.messaging.* + WildcardImport:ThreadActivity.kt$import org.fossify.messages.models.* + WildcardImport:ThreadActivity.kt$import org.fossify.messages.models.ThreadItem.* + WildcardImport:ThreadAdapter.kt$import org.fossify.commons.extensions.* + WildcardImport:ThreadAdapter.kt$import org.fossify.messages.databinding.* + WildcardImport:ThreadAdapter.kt$import org.fossify.messages.extensions.* + WildcardImport:ThreadAdapter.kt$import org.fossify.messages.helpers.* + WildcardImport:ThreadAdapter.kt$import org.fossify.messages.models.ThreadItem.* + WildcardImport:VCard.kt$import ezvcard.property.* + WildcardImport:VCardViewerAdapter.kt$import org.fossify.commons.extensions.* + + diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml new file mode 100644 index 00000000..328e901f --- /dev/null +++ b/app/lint-baseline.xml @@ -0,0 +1,2178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 a294acc0..f6db61d1 100644 --- a/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt +++ b/app/src/main/kotlin/org/fossify/messages/activities/ManageBlockedKeywordsActivity.kt @@ -71,9 +71,9 @@ class ManageBlockedKeywordsActivity : BaseSimpleActivity(), RefreshRecyclerViewL private fun updateBlockedKeywords() { ensureBackgroundThread { - val blockedKeywords = config.blockedKeywords + val blockedKeywords = config.blockedKeywords.sorted().toArrayList() runOnUiThread { - ManageBlockedKeywordsAdapter(this, blockedKeywords.toArrayList(), this, binding.manageBlockedKeywordsList) { + ManageBlockedKeywordsAdapter(this, blockedKeywords, this, binding.manageBlockedKeywordsList) { addOrEditBlockedKeyword(it as String) }.apply { binding.manageBlockedKeywordsList.adapter = this diff --git a/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt index a31f1eb0..24f576c7 100644 --- a/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt @@ -5,13 +5,41 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle +import android.provider.DocumentsContract import androidx.activity.result.contract.ActivityResultContracts -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.json.encodeToStream import org.fossify.commons.activities.ManageBlockedNumbersActivity -import org.fossify.commons.dialogs.* -import org.fossify.commons.extensions.* -import org.fossify.commons.helpers.* +import org.fossify.commons.dialogs.ChangeDateTimeFormatDialog +import org.fossify.commons.dialogs.ConfirmationDialog +import org.fossify.commons.dialogs.FeatureLockedDialog +import org.fossify.commons.dialogs.RadioGroupDialog +import org.fossify.commons.dialogs.SecurityDialog +import org.fossify.commons.extensions.addLockedLabelIfNeeded +import org.fossify.commons.extensions.beGoneIf +import org.fossify.commons.extensions.beVisibleIf +import org.fossify.commons.extensions.getBlockedNumbers +import org.fossify.commons.extensions.getCustomizeColorsString +import org.fossify.commons.extensions.getFontSizeText +import org.fossify.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.isOrWasThankYouInstalled +import org.fossify.commons.extensions.launchPurchaseThankYouIntent +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.toast +import org.fossify.commons.extensions.updateTextColors +import org.fossify.commons.extensions.viewBinding +import org.fossify.commons.helpers.FONT_SIZE_EXTRA_LARGE +import org.fossify.commons.helpers.FONT_SIZE_LARGE +import org.fossify.commons.helpers.FONT_SIZE_MEDIUM +import org.fossify.commons.helpers.FONT_SIZE_SMALL +import org.fossify.commons.helpers.NavigationIcon +import org.fossify.commons.helpers.PROTECTION_FINGERPRINT +import org.fossify.commons.helpers.SHOW_ALL_TABS +import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.commons.helpers.isNougatPlus +import org.fossify.commons.helpers.isOreoPlus +import org.fossify.commons.helpers.isPiePlus +import org.fossify.commons.helpers.isTiramisuPlus import org.fossify.commons.models.RadioItem import org.fossify.messages.R import org.fossify.messages.databinding.ActivitySettingsBinding @@ -19,7 +47,19 @@ import org.fossify.messages.dialogs.ExportMessagesDialog import org.fossify.messages.extensions.config import org.fossify.messages.extensions.emptyMessagesRecycleBin import org.fossify.messages.extensions.messagesDB -import org.fossify.messages.helpers.* +import org.fossify.messages.helpers.FILE_SIZE_100_KB +import org.fossify.messages.helpers.FILE_SIZE_1_MB +import org.fossify.messages.helpers.FILE_SIZE_200_KB +import org.fossify.messages.helpers.FILE_SIZE_2_MB +import org.fossify.messages.helpers.FILE_SIZE_300_KB +import org.fossify.messages.helpers.FILE_SIZE_600_KB +import org.fossify.messages.helpers.FILE_SIZE_NONE +import org.fossify.messages.helpers.LOCK_SCREEN_NOTHING +import org.fossify.messages.helpers.LOCK_SCREEN_SENDER +import org.fossify.messages.helpers.LOCK_SCREEN_SENDER_MESSAGE +import org.fossify.messages.helpers.MessagesImporter +import org.fossify.messages.helpers.MessagesReader +import org.fossify.messages.helpers.refreshMessages import java.util.Locale import kotlin.system.exitProcess @@ -27,7 +67,14 @@ class SettingsActivity : SimpleActivity() { private var blockedNumbersAtPause = -1 private var recycleBinMessages = 0 private val messagesFileType = "application/json" - private val messageImportFileTypes = listOf("application/json", "application/xml", "text/xml") + private val messageImportFileTypes = buildList { + add("application/json") + add("application/xml") + add("text/xml") + if (!isPiePlus()) { + add("application/octet-stream") + } + } private val binding by viewBinding(ActivitySettingsBinding::inflate) @@ -42,7 +89,10 @@ class SettingsActivity : SimpleActivity() { useTransparentNavigation = true, useTopSearchMenu = false ) - setupMaterialScrollListener(scrollingView = binding.settingsNestedScrollview, toolbar = binding.settingsToolbar) + setupMaterialScrollListener( + scrollingView = binding.settingsNestedScrollview, + toolbar = binding.settingsToolbar + ) } override fun onResume() { @@ -73,7 +123,9 @@ class SettingsActivity : SimpleActivity() { setupMessagesImport() updateTextColors(binding.settingsNestedScrollview) - if (blockedNumbersAtPause != -1 && blockedNumbersAtPause != getBlockedNumbers().hashCode()) { + if ( + blockedNumbersAtPause != -1 && blockedNumbersAtPause != getBlockedNumbers().hashCode() + ) { refreshMessages() } @@ -90,23 +142,25 @@ class SettingsActivity : SimpleActivity() { } } - private val getContent = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> - if (uri != null) { - MessagesImporter(this).importMessages(uri) + private val getContent = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> + if (uri != null) { + MessagesImporter(this).importMessages(uri) + } } - } - private val saveDocument = registerForActivityResult(ActivityResultContracts.CreateDocument(messagesFileType)) { uri -> - if (uri != null) { - toast(org.fossify.commons.R.string.exporting) - exportMessages(uri) + private val saveDocument = + registerForActivityResult(ActivityResultContracts.CreateDocument(messagesFileType)) { uri -> + if (uri != null) { + toast(org.fossify.commons.R.string.exporting) + exportMessages(uri) + } } - } private fun setupMessagesExport() { binding.settingsExportMessagesHolder.setOnClickListener { ExportMessagesDialog(this) { fileName -> - saveDocument.launch(fileName) + saveDocument.launch("$fileName.json") } } } @@ -117,25 +171,37 @@ class SettingsActivity : SimpleActivity() { } } + @OptIn(kotlinx.serialization.ExperimentalSerializationApi::class) private fun exportMessages(uri: Uri) { ensureBackgroundThread { + var success = false try { - MessagesReader(this).getMessagesToExport(config.exportSms, config.exportMms) { messagesToExport -> + MessagesReader(this).getMessagesToExport( + config.exportSms, + config.exportMms + ) { messagesToExport -> if (messagesToExport.isEmpty()) { toast(org.fossify.commons.R.string.no_entries_for_exporting) return@getMessagesToExport } val json = Json { encodeDefaults = true } - val jsonString = json.encodeToString(messagesToExport) - val outputStream = contentResolver.openOutputStream(uri)!! - - outputStream.use { - it.write(jsonString.toByteArray()) + contentResolver.openOutputStream(uri)!!.buffered().use { outputStream -> + json.encodeToStream(messagesToExport, outputStream) } + success = true toast(org.fossify.commons.R.string.exporting_successful) } - } catch (e: Exception) { - showErrorToast(e) + } catch (e: Throwable) { // also catch OutOfMemoryError etc. + showErrorToast(e.toString()) + } finally { + if (!success) { + // delete the file to avoid leaving behind an empty/corrupt file + try { + DocumentsContract.deleteDocument(contentResolver, uri) + } catch (ignored: Exception) { + // ignored because we don't want to overwhelm the user with two error messages + } + } } } } @@ -167,7 +233,10 @@ class SettingsActivity : SimpleActivity() { } private fun setupUseEnglish() = binding.apply { - settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) + settingsUseEnglishHolder.beVisibleIf( + (config.wasUseEnglishToggled || Locale.getDefault().language != "en") + && !isTiramisuPlus() + ) settingsUseEnglish.isChecked = config.useEnglish settingsUseEnglishHolder.setOnClickListener { settingsUseEnglish.toggle() @@ -187,7 +256,8 @@ class SettingsActivity : SimpleActivity() { // support for device-wise blocking came on Android 7, rely only on that @TargetApi(Build.VERSION_CODES.N) private fun setupManageBlockedNumbers() = binding.apply { - settingsManageBlockedNumbers.text = addLockedLabelIfNeeded(org.fossify.commons.R.string.manage_blocked_numbers) + settingsManageBlockedNumbers.text = + addLockedLabelIfNeeded(org.fossify.commons.R.string.manage_blocked_numbers) settingsManageBlockedNumbersHolder.beVisibleIf(isNougatPlus()) settingsManageBlockedNumbersHolder.setOnClickListener { @@ -202,7 +272,8 @@ class SettingsActivity : SimpleActivity() { } private fun setupManageBlockedKeywords() = binding.apply { - settingsManageBlockedKeywords.text = addLockedLabelIfNeeded(R.string.manage_blocked_keywords) + settingsManageBlockedKeywords.text = + addLockedLabelIfNeeded(R.string.manage_blocked_keywords) settingsManageBlockedKeywordsHolder.setOnClickListener { if (isOrWasThankYouInstalled()) { @@ -230,7 +301,10 @@ class SettingsActivity : SimpleActivity() { RadioItem(FONT_SIZE_SMALL, getString(org.fossify.commons.R.string.small)), RadioItem(FONT_SIZE_MEDIUM, getString(org.fossify.commons.R.string.medium)), RadioItem(FONT_SIZE_LARGE, getString(org.fossify.commons.R.string.large)), - RadioItem(FONT_SIZE_EXTRA_LARGE, getString(org.fossify.commons.R.string.extra_large)) + RadioItem( + FONT_SIZE_EXTRA_LARGE, + getString(org.fossify.commons.R.string.extra_large) + ) ) RadioGroupDialog(this@SettingsActivity, items, config.fontSize) { @@ -352,7 +426,11 @@ class SettingsActivity : SimpleActivity() { recycleBinMessages = messagesDB.getArchivedCount() runOnUiThread { settingsEmptyRecycleBinSize.text = - resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages) + resources.getQuantityString( + R.plurals.delete_messages, + recycleBinMessages, + recycleBinMessages + ) } } @@ -372,7 +450,11 @@ class SettingsActivity : SimpleActivity() { } recycleBinMessages = 0 settingsEmptyRecycleBinSize.text = - resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages) + resources.getQuantityString( + R.plurals.delete_messages, + recycleBinMessages, + recycleBinMessages + ) } } } @@ -381,8 +463,17 @@ class SettingsActivity : SimpleActivity() { private fun setupAppPasswordProtection() = binding.apply { settingsAppPasswordProtection.isChecked = config.isAppPasswordProtectionOn settingsAppPasswordProtectionHolder.setOnClickListener { - val tabToShow = if (config.isAppPasswordProtectionOn) config.appProtectionType else SHOW_ALL_TABS - SecurityDialog(this@SettingsActivity, config.appPasswordHash, tabToShow) { hash, type, success -> + val tabToShow = if (config.isAppPasswordProtectionOn) { + config.appProtectionType + } else { + SHOW_ALL_TABS + } + + SecurityDialog( + activity = this@SettingsActivity, + requiredHash = config.appPasswordHash, + showTabIndex = tabToShow + ) { hash, type, success -> if (success) { val hasPasswordProtection = config.isAppPasswordProtectionOn settingsAppPasswordProtection.isChecked = !hasPasswordProtection @@ -391,13 +482,20 @@ class SettingsActivity : SimpleActivity() { config.appProtectionType = type if (config.isAppPasswordProtectionOn) { - val confirmationTextId = if (config.appProtectionType == PROTECTION_FINGERPRINT) { - org.fossify.commons.R.string.fingerprint_setup_successfully - } else { - org.fossify.commons.R.string.protection_setup_successfully - } + val confirmationTextId = + if (config.appProtectionType == PROTECTION_FINGERPRINT) { + org.fossify.commons.R.string.fingerprint_setup_successfully + } else { + org.fossify.commons.R.string.protection_setup_successfully + } - ConfirmationDialog(this@SettingsActivity, "", confirmationTextId, org.fossify.commons.R.string.ok, 0) { } + ConfirmationDialog( + activity = this@SettingsActivity, + message = "", + messageId = confirmationTextId, + positive = org.fossify.commons.R.string.ok, + negative = 0 + ) { } } } } diff --git a/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt b/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt index 5aa24e30..50c5873d 100644 --- a/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt @@ -278,11 +278,11 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList< projection += Threads.ARCHIVED } - var selection = "${Threads.MESSAGE_COUNT} > ?" - var selectionArgs = arrayOf("0") + var selection = "${Threads.MESSAGE_COUNT} > 0" + var selectionArgs = arrayOf() if (threadId != null) { selection += " AND ${Threads._ID} = ?" - selectionArgs = arrayOf("0", threadId.toString()) + selectionArgs += threadId.toString() } val sortOrder = "${Threads.DATE} DESC" @@ -355,11 +355,10 @@ private fun Context.queryCursorUnsafe( fun Context.getConversationIds(): List { val uri = Uri.parse("${Threads.CONTENT_URI}?simple=true") val projection = arrayOf(Threads._ID) - val selection = "${Threads.MESSAGE_COUNT} > ?" - val selectionArgs = arrayOf("0") + val selection = "${Threads.MESSAGE_COUNT} > 0" val sortOrder = "${Threads.DATE} ASC" val conversationIds = mutableListOf() - queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> + queryCursor(uri, projection, selection, null, sortOrder, true) { cursor -> val id = cursor.getLongValue(Threads._ID) conversationIds.add(id) } @@ -1060,16 +1059,9 @@ fun Context.insertOrUpdateConversation( conversation: Conversation, cachedConv: Conversation? = conversationsDB.getConversationWithThreadId(conversation.threadId) ) { - val updatedConv = if (cachedConv != null) { - val usesCustomTitle = cachedConv.usesCustomTitle - val title = if (usesCustomTitle) { - cachedConv.title - } else { - conversation.title - } - conversation.copy(title = title, usesCustomTitle = usesCustomTitle) - } else { - conversation + var updatedConv = conversation + if (cachedConv != null && cachedConv.usesCustomTitle) { + updatedConv = updatedConv.copy(title = cachedConv.title, usesCustomTitle = cachedConv.usesCustomTitle) } conversationsDB.insertOrUpdate(updatedConv) } diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt index 9faa06a6..476c2b80 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt @@ -4,6 +4,7 @@ import android.net.Uri import android.util.Xml import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.ensureBackgroundThread @@ -32,18 +33,17 @@ class MessagesImporter(private val activity: SimpleActivity) { } else { importJson(uri) } - } catch (e: Exception) { - activity.showErrorToast(e) + } catch (e: Throwable) { // also catch OutOfMemoryError etc. + activity.showErrorToast(e.toString()) } } + @OptIn(kotlinx.serialization.ExperimentalSerializationApi::class) private fun importJson(uri: Uri) { try { - val jsonString = activity.contentResolver.openInputStream(uri)!!.use { inputStream -> - inputStream.bufferedReader().readText() + val deserializedList = activity.contentResolver.openInputStream(uri)!!.buffered().use { inputStream -> + Json.decodeFromStream>(inputStream) } - - val deserializedList = Json.decodeFromString>(jsonString) if (deserializedList.isEmpty()) { activity.toast(org.fossify.commons.R.string.no_entries_for_importing) return diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/ReceiverUtils.kt b/app/src/main/kotlin/org/fossify/messages/helpers/ReceiverUtils.kt new file mode 100644 index 00000000..e7d8b483 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/messages/helpers/ReceiverUtils.kt @@ -0,0 +1,17 @@ +package org.fossify.messages.helpers + +import android.content.Context +import org.fossify.messages.extensions.config + +object ReceiverUtils { + + fun isMessageFilteredOut(context: Context, body: String): Boolean { + for (blockedKeyword in context.config.blockedKeywords) { + if (body.contains(blockedKeyword, ignoreCase = true)) { + return true + } + } + + return false + } +} diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt index b34c9545..c8c1c136 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt @@ -6,13 +6,14 @@ import android.os.Handler import android.os.Looper import com.bumptech.glide.Glide import com.klinker.android.send_message.MmsReceivedReceiver -import org.fossify.commons.extensions.isNumberBlocked -import org.fossify.commons.extensions.normalizePhoneNumber -import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.* +import org.fossify.commons.helpers.SimpleContactsHelper import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.messages.R import org.fossify.messages.extensions.* +import org.fossify.messages.helpers.ReceiverUtils.isMessageFilteredOut import org.fossify.messages.helpers.refreshMessages +import org.fossify.messages.models.Message // more info at https://github.com/klinker41/android-smsmms class MmsReceiver : MmsReceivedReceiver() { @@ -27,29 +28,52 @@ class MmsReceiver : MmsReceivedReceiver() { val address = mms.getSender()?.phoneNumbers?.first()?.normalizedNumber ?: "" val size = context.resources.getDimension(R.dimen.notification_large_icon_size).toInt() + val privateCursor = context.getMyContactsCursor(false, true) ensureBackgroundThread { - val glideBitmap = try { - Glide.with(context) - .asBitmap() - .load(mms.attachment!!.attachments.first().getUri()) - .centerCrop() - .into(size, size) - .get() - } catch (e: Exception) { - null - } - - Handler(Looper.getMainLooper()).post { - context.showReceivedMessageNotification(mms.id, address, mms.body, mms.threadId, glideBitmap) - val conversation = context.getConversations(mms.threadId).firstOrNull() ?: return@post - ensureBackgroundThread { - context.insertOrUpdateConversation(conversation) - context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) - refreshMessages() + if (context.baseConfig.blockUnknownNumbers) { + val simpleContactsHelper = SimpleContactsHelper(context) + simpleContactsHelper.exists(address, privateCursor) { exists -> + if (exists) { + handleMmsMessage(context, mms, size, address) + } } + } else { + handleMmsMessage(context, mms, size, address) } } } override fun onError(context: Context, error: String) = context.showErrorToast(context.getString(R.string.couldnt_download_mms)) + + private fun handleMmsMessage( + context: Context, + mms: Message, + size: Int, + address: String + ) { + if (isMessageFilteredOut(context, mms.body)) { + return + } + + val glideBitmap = try { + Glide.with(context) + .asBitmap() + .load(mms.attachment!!.attachments.first().getUri()) + .centerCrop() + .into(size, size) + .get() + } catch (e: Exception) { + null + } + + Handler(Looper.getMainLooper()).post { + context.showReceivedMessageNotification(mms.id, address, mms.body, mms.threadId, glideBitmap) + val conversation = context.getConversations(mms.threadId).firstOrNull() ?: return@post + ensureBackgroundThread { + context.insertOrUpdateConversation(conversation) + context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) + refreshMessages() + } + } + } } diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt index 326cc03c..9ffe81d0 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt @@ -14,6 +14,7 @@ import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.commons.models.PhoneNumber import org.fossify.commons.models.SimpleContact import org.fossify.messages.extensions.* +import org.fossify.messages.helpers.ReceiverUtils.isMessageFilteredOut import org.fossify.messages.helpers.refreshMessages import org.fossify.messages.models.Message @@ -40,7 +41,6 @@ class SmsReceiver : BroadcastReceiver() { date = System.currentTimeMillis() threadId = context.getThreadId(address) } - if (context.baseConfig.blockUnknownNumbers) { val simpleContactsHelper = SimpleContactsHelper(context) simpleContactsHelper.exists(address, privateCursor) { exists -> @@ -122,14 +122,4 @@ class SmsReceiver : BroadcastReceiver() { } } } - - private fun isMessageFilteredOut(context: Context, body: String): Boolean { - for (blockedKeyword in context.config.blockedKeywords) { - if (body.contains(blockedKeyword, ignoreCase = true)) { - return true - } - } - - return false - } } diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index a6b3daec..5d055e0d 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -1,2 +1,119 @@ - \ No newline at end of file + + পুনরুদ্ধার করুন + সমস্ত বার্তা পুনরুদ্ধার করুন + আপনি কি রিসাইকেল বিন খালি করার বিষয়ে নিশ্চিত? বার্তা স্থায়ীভাবে হারিয়ে যাবে। + প্রেরক এবং বার্তা + আপনাকে অন্তত একটি আইটেম নির্বাচন করতে হবে + এমএমএস ইমপোর্ট করুন + একটি খালি নম্বরে বার্তা পাঠাতে পারবেন না + টেলিফোনি ডাটাবেসে বার্তা সংরক্ষণ করতে অক্ষম + বার্তা পাঠানো যায়নি, রেডিও বন্ধ আছে + বার্তা পাঠানো যায়নি, ক্যারিয়ার ত্রুটি + বার্তা পাঠানো যায়নি, ত্রুটি কোড: %d + এর মত শর্ট কোডে উত্তর দিতে পারবেন না + সংযুক্তির আকার সর্বাধিক এমএমএস সীমা ছাড়িয়ে গেছে + সিম কার্ড উপলব্ধ নেই + এমএমএস ডাউনলোড করা যায়নি + কেন অ্যাপটির ইন্টারনেট অ্যাক্সেস প্রয়োজন? + এমএমএস আকার ক্যারিয়ার দ্বারা সীমিত, আপনি অ্যাপ সেটিংসে একটি ছোট সীমা সেট করে চেষ্টা করতে পারেন। + অন্য প্রান্তের জন আমার এমএমএস পাচ্ছে না, আমি কি এটি সম্পর্কে কিছু করতে পারি? + অ্যাপটি কি সময় নির্ধারিত বার্তা সমর্থন করে? + হ্যাঁ, আপনি পাঠান বোতামটি দীর্ঘক্ষণ টিপে এবং পছন্দসই তারিখ এবং সময় বেছে নিয়ে ভবিষ্যতে পাঠানোর জন্য বার্তাগুলি নির্ধারণ করতে পারেন। + সদস্যরা + কথোপকথনের নাম + নতুন কথোপকথন + কন্টাক্ট বা নম্বর যোগ করুন… + পরামর্শ + শুধুমাত্র আপনি এই কথোপকথন নাম দেখতে পারবেন + কথোপকথনের নাম পরিবর্তন করুন + সময় নির্ধারিত বার্তা + বার্তা পাঠানোর জন্য সময় নির্ধারণ করুন + পাঠানোর সময় নির্ধারণ করুন + বার্তার বিবরণ + পাঠানোর নির্ধারিত সময় বাতিল করুন + এই সময়ে প্রাপ্ত + বার্তা আপডেট করুন + ফোনটি চালু রাখুন এবং নিশ্চিত করুন যে ব্যাকগ্রাউন্ডে থাকা অবস্থায় অ্যাপটিকে বন্ধ করার কিছু নেই। + প্রেরক + আপনাকে অবশ্যই ভবিষ্যতের একটি সময় বেছে নিতে হবে + এখনই পাঠান + প্রাপক + এই সময়ে পাঠানো হয়েছে + আর্কাইভ করা কথোপকথন দেখুন + সমস্ত আর্কাইভ করা কথোপকথন মুছুন + আর্কাইভ করুন + আপনি কি নিশ্চিত যে আপনি আর্কাইভ খালি করতে চান? সমস্ত আর্কাইভ করা কথোপকথন স্থায়ীভাবে হারিয়ে যাবে। + আপনি কি এই কথোপকথনের সমস্ত বার্তা পুনরুদ্ধার করার বিষয়ে নিশ্চিত? + + %d টি কথোপকথন + %d গুলো কথোপকথন + + ব্লক করা কীওয়ার্ড + ব্লক করা কীওয়ার্ড পরিচালনা করুন + আপনি কোন কীওয়ার্ড ব্লক করছেন না. আপনি এখানে কীওয়ার্ড যুক্ত করতে পারেন যাতে সেগুলি ধারণকারী সমস্ত বার্তা ব্লক করা যায়। + পাঠানো এমএমএস চিত্রের আকার পরিবর্তন করুন + কোন সীমা নেই + বার্তাসমূহ + বহির্গামী বার্তা + এমএমএস হিসাবে গ্রুপ বার্তা পাঠান + এমএমএস হিসাবে দীর্ঘ বার্তা পাঠান + বার্তা এক্সপোর্ট করুন + বার্তা ইমপোর্ট করুন + এসএমএস ইমপোর্ট করুন + এসএমএস এক্সপোর্ট করুন + এমএমএস এক্সপোর্ট করুন + বার্তা পাঠানো যায়নি, পরিষেবা অনুপলব্ধ + আপনি শুধুমাত্র \"503501\" এর মতো নম্বর সহ শর্ট কোডের উত্তর দিতে পারেন কিন্তু \"AB-CD0\" এর মতো অক্ষর এবং সংখ্যা সম্বলিত কোডগুলিতে নয়। + দুঃখজনকভাবে এটি এমএমএস সংযুক্তি পাঠানোর জন্য প্রয়োজন. অন্যান্য অ্যাপের তুলনায় এমএমএস পাঠাতে না পারা সত্যিই একটি বড় অসুবিধা হবে, তাই আমরা এই পথে যাওয়ার সিদ্ধান্ত নিয়েছি। যাইহোক, সাধারণত, কোন বিজ্ঞাপন, ট্র্যাকিং বা বিশ্লেষণ কোনো কিছুই নেই, ইন্টারনেট শুধুমাত্র এমএমএস পাঠানোর জন্য ব্যবহার করা হয়। + উপরে পিন করুন + আর্কাইভকৃত বার্তাসমূহ + ফরোয়ার্ড করুন + কোনো আর্কাইভকৃত কথোপকথন পাওয়া যায়নি + কাস্টম বিজ্ঞপ্তি সক্রিয় করুন + আর্কাইভ সফলভাবে খালি করা হয়েছে + একটি ব্লকড কীওয়ার্ড যোগ করুন + আর্কাইভ মুক্ত করুন + লক স্ক্রীন বিজ্ঞপ্তি দৃশ্যমানতা + + এবং আরও %d জন + এবং আরও %d জনকে + + \'%s\' এর নিকট আপনার বার্তা পাঠানো হয় নি + ব্যক্তি যোগ করুন + সংযুক্তি + কোন সংরক্ষিত কথোপকথন পাওয়া যায়নি + একটি কথোপকথন শুরু করুন + উত্তর দিন + বার্তা লেখার সময় একটি অক্ষর কাউন্টার দেখান + বার্তা লোড হচ্ছে… + প্রেরক উত্তর সমর্থন করে না + কথোপকথনের বিবরণ + রিসাইকেল বিন এড়িয়ে যান, সরাসরি বার্তা মুছুন + আপনি কি এই কথোপকথনের সমস্ত বার্তা মুছে ফেলার বিষয়ে নিশ্চিত? + আপনি কি নিশ্চিত আপনি %s আর্কাইভ করতে চান? + আপনি কি %s পুনরুদ্ধার করার বিষয়ে নিশ্চিত? + কীওয়ার্ড + + %d টি বার্তা + %d গুলো বার্তা + + শুধুমাত্র প্রেরক + ডেলিভারি রিপোর্ট সক্রিয় করুন + বার্তা পাঠানোর সময় উচ্চারণ এবং ডায়াক্রিটিকগুলি সরান + এন্টার চাপলে বার্তা পাঠান + একটি বার্তা লিখুন… + বার্তা পাঠানো হয়নি + পাঠানো হয় নি। পুনরায় চেষ্টা করতে স্পর্শ করুন। + খসড়া + পাঠানো হচ্ছে… + আনপিন করুন + নির্বাচিত আকারে ছবি সংকুচিত করা যায় নি + সদৃশ আইটেম অন্তর্ভুক্ত করা হয়নি + এসএমএস পেয়েছেন + নতুন বার্তা + পঠিত হিসাবে চিহ্নিত করুন + অপঠিত হিসাবে চিহ্নিত করুন + আমি + Messages + \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b895e76a..b63da4bc 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -2,7 +2,7 @@ Escriviu un missatge… Missatge no enviat - No s\'ha enviat. Toqueu per tornar-ho a provar. + No s\'ha enviat. Toqueu per a tornar-ho a provar. El vostre missatge a «%s» no s\'ha enviat Afegeix una persona Adjunt @@ -109,10 +109,10 @@ La targeta SIM no està disponible No es poden baixar MMS Per què l\'aplicació requereix accés a Internet\? - Malauradament, és necessari per enviar adjunts MMS. No poder enviar MMS seria un gran desavantatge en comparació amb altres aplicacions, així que vam decidir anar per aquest camí. Tanmateix, com sol ser, no hi ha cap anunci, seguiment o anàlisi de cap mena, Internet només s\'utilitza per enviar MMS. + Malauradament, és necessari per a enviar adjunts MMS. No poder enviar MMS seria un gran desavantatge en comparació amb altres aplicacions, així que vam decidir anar per aquest camí. Tanmateix, com sol ser, no hi ha cap anunci, seguiment o anàlisi de cap mena, Internet només s\'utilitza per a enviar MMS. La mida dels MMS està limitada pels operadors, podeu provar d\'establir un límit més petit a la configuració de l\'aplicació. L\'aplicació admet missatges programats\? - Sí, podeu programar missatges per enviar-los en el futur prement prolongadament el botó Envia i escollint la data i l\'hora desitjades. + Sí, podeu programar missatges per a enviar-los en el futur prement prolongadament el botó Envia i escollint la data i l\'hora desitjades. L\'altre extrem no ha rebut el meu MMS, hi puc fer alguna cosa\? Activa les notificacions personalitzades Missatges diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index bb8c82ab..ccae2ad2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,6 +1,6 @@ - Meddelelser + Beskeder Skriv en besked… Beskeden blev ikke sendt Blev ikke sendt, tryk for at gensende. @@ -10,7 +10,7 @@ Ingen gemte samtaler er fundet Start en samtale Svar - Vis en karaktertæller ved skrivning af beskeder + Vis en tegntæller ved skrivning af beskeder Henter beskeder… Afsender understøtter ikke svar Udkast @@ -28,25 +28,25 @@ Samtaledetaljer Omdøb samtale Kun du kan se dette samtalenavn - Planlagt meddelelse - Planlæg meddelelse + Planlagt besked + Planlæg besked Planlæg afsendelse Annuler planlagt afsendelse Du skal vælge et tidspunkt i fremtiden Hold telefonen tændt, og sørg for, at der ikke er noget der afbryder appen, mens den er i baggrunden. - Opdater meddelelse + Opdater besked Send nu - Meddelelsesdetaljer + Beskeddetaljer Afsender Modtager Sendt Modtaget Modtag SMS - Ny Besked + Ny besked Marker som læst Marker som ulæst Mig - Aktiver tilpassede meddelelser + Aktiver tilpassede beskeder Fjerne arkivering Slet alle arkiverede samtaler Arkiv @@ -56,9 +56,9 @@ Arkivet er successfuldt blevet tømt Er du sikker på, at du vil tømme arkivet? Alle arkiverede samtaler vil gå permanent tabt. Gendan - Gendan alle meddelelser - Er du sikker på, at du vil tømme papirkurven? Beskederne vil blive permanent tabt. - Brug ikke Papirkurven, slet meddelelse direkte + Gendan alle beskeder + Er du sikker på, at du vil tømme papirkurven? Beskederne vil være permanent tabt. + Brug ikke papirkurven, slet beskeder med det samme Er du sikker på, at du vil slette alle beskeder i denne samtale\? %d samtale @@ -69,25 +69,25 @@ %d beskeder Er du sikker på du vil arkivere %s? - Er du sikker på du vil gendanne alle meddelelser i denne samtale? + Er du sikker på, at du vil gendanne alle beskeder i denne samtale? Er du sikker på du vil gendanne %s? Nøgleord Blokerede nøgleord Administrer blokerede nøgleord - Du blokerer ikke nogen søgeord. Du kan tilføje nøgleord her for at blokere alle meddelelser, der indeholder dem. + Du blokerer ikke nogen søgeord. Du kan tilføje nøgleord her for at blokere alle beskeder, der indeholder dem. Tilføj et blokeret nøgleord - Synlighed af meddelelse på låseskærmen - Afsender og meddelelse + Synlighed af notifikation på låseskærmen + Afsender og besked Kun afsender Aktiver leveringsrapporter - Fjerne accenter og diakritiske tegn ved afsendelse af meddelelser - Send meddelelse når der trykkes Enter + Fjerne accenter og diakritiske tegn ved afsendelse af beskeder + Send besked, når der trykkes Enter Ændr størrelse på MMS-billeder Ingen grænse - Udgående meddelelser - Send gruppemeddelelser som MMS + Udgående beskeder + Send gruppebeskeder som MMS Send lange beskeder som MMS - Meddelelser + Beskeder Eksporter beskeder Eksporter SMS Eksportér MMS @@ -95,12 +95,12 @@ Importer SMS Importér MMS Du skal vælge mindst ét element - Kan ikke sende meddelelse til et tomt nummer - Kan ikke gemme meddelelse i telefonens database - Kunne ikke sende meddelelse, service ikke tilgængelig + Kan ikke sende besked til et tomt nummer + Kan ikke gemme besked i telefonens database + Kunne ikke sende besked, service ikke tilgængelig Kunne ike sende meddelels, radio er slukket - "Kunne ikke sende meddelelse; operatørfejl " - Kunne ikke sende meddelelse, fejlmeddelelse: %d + Kunne ikke sende besked; operatørfejl + Kunne ikke sende besked, fejlmeddelelse: %d Kan ikke svare på korte koder som denne Du kan kun svare på korte koder med tal som \"503501\", men ikke på koder, der indeholder bogstaver og tal som \"AB-CD0\". Størrelse på vedhæftning overstiger maks @@ -112,4 +112,8 @@ MMS-størrelsen er begrænset af udbydere, du kan prøve at sætte en mindre grænse i appindstillingerne. Kan man planlægge afsendelse? Ja, du kan planlægge beskeder til at blive sendt i fremtiden ved at trykke længe på Send-knappen og vælge den ønskede dato og tid. - + + og %d anden + og %d andre + + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 211e4ab1..ca769db9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -118,5 +118,5 @@ ¿La aplicación admite mensajes programados\? Sí, puedes programar el envío de mensajes en el futuro pulsando prolongadamente el botón de envío y eligiendo la fecha y hora deseadas. Activar las notificaciones personalizadas - Messages + Mensajes \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 299a7185..ca2ef003 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -9,4 +9,14 @@ Eranskina Ez da gordetako elkarrizketarik aurkitu Hasi elkarrizketa + Zirriborroa + Erantzun + Mezuak kargatzen… + Bidaltzaileak ez ditu erantzunik onartzen + Bidaltzen… + Finkatu goian + Askatu aingura + Erakutsi karaktere-kontagailua mezuak idaztean + Birbidali + Ezin da irudia konprimitu hautatutako tamainara \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index a6b3daec..09d634a4 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,2 +1,119 @@ - \ No newline at end of file + + درآوردن از بایگانی + تنظیم اعلان شخصی‌شده + بایگانی کردن + نمایش بایگانی‌ها + حذف همه‌ی بایگانی‌ها + هیچ پیامی در بایگانی نیست + بایگانی با موفقیت خالی شد + بازیابی + بازیابی همه‌ی پیام‌ها + بی‌خیال سطل شو، پیام‌ها را درجا حذف کن + همه‌ی پیام‌های این گفت‌وگو حذف شود؟ + ‏%s بازیابی شود؟ + + ‏%d گفت‌وگو + ‏%d گفت‌وگو + + کلیدواژه + کلیدواژه‌های مسدودشده + کلیدواژه‌ای برای مسدودسازی ندارید. می‌توانید کلیدواژه‌ای اضافه کنید تا پیام‌های حاوی آن مسدود شوند. + نمایش اعلان در صفحه‌ی قفل + فرستنده و پیام + تغییر اندازه‌ی تصاویر ارسالی در فراپیام + پیام‌های ارسالی + ارسال پیام گروهی در قالب فراپیام + ارسال پیام‌های طولانی در قالب فراپیام + برون‌برد پیام‌ها + برون‌برد فراپیام‌ها + درون‌برد پیام‌ها + درون‌برد پیامک‌ها + درون‌برد فراپیام‌ها + حداقل یک مورد را انتخاب کنید + ارسال پیام به شماره‌ی خالی امکان‌پذیر نیست + ذخیره‌سازی پیام در دادگان تلفن امکان‌پذیر نیست + پاسخ به کدهای کوتاه مثل این امکان‌پذیر نیست + پیام ارسال نشد، خارج از دسترس + پیام ارسال نشد، فرستنده خاموش است + پیام ارسال نشد، خطای اپراتور + اندازه‌ی پیوست بیشتر از حد مجاز فراپیام است + سیم‌کارت نیست + این برنامه چه نیازی به دسترسی به اینترنت دارد؟ + طرف مقابل فراپیام مرا نمی‌گیرد، چه کار می‌توانم بکنم؟ + اندازه‌ی فراپیام از سوی اپراتور محدود شده است؛ می‌توانید در تنظیمات برنامه، حد کمتری را امتحان کنید. + آیا این برنامه از پیام‌های زمان‌بندی‌شده پشتیبانی می‌کند؟ + متن پیام…‏ + ارسال نشد. برای تلاش دوباره، لمس کنید. + پیام شما به %s ارسال نشده + پیام ارسال نشد، خطای کد %d‏ + مورد تکراری درج نشد + + و %d نفر دیگر + و %d نفر دیگر + + افزودن مخاطب یا شماره… + عضوها + عنوان گفت‌وگو + جزئیات گفت‌وگو + تنها شما می‌توانید این عنوان گفت‌وگو را ببینید + گوشی را روشن نگه دارید و مطمئن شوید که هیچ‌چیز فعالیت برنامه در پس‌زمینه را متوقف نکند. + بایگانی + بایگانی، خالی شود؟ همه‌ی پیام‌های بایگانی برای همیشه حذف می‌شوند. + سطل زباله، خالی شود؟ پیام‌ها برای همیشه حذف می‌شوند. + ‏%s بایگانی شود؟ + همه‌ی پیام‌های این گفت‌وگو بازیابی شود؟ + + ‏%d پیام + ‏%d پیام + + مدیریت کلیدواژه‌های مسدودشده + گزارش تحویل پیام + حذف نشانه‌های حروف لاتین هنگام ارسال پیام + بدون محدودیت + پیام‌ها + برون‌برد پیامک‌ها + فقط می‌توانید به سرشماره‌های عددی مثل 7575 پیام بفرستید؛ نه به سرشماره‌های الفبایی مثل IRANCELL.‏ + فراپیام بارگیری نشد + متأسفانه برای ارسال فراپیام لازم است. عدم امکان ارسال فراپیام، در مقایسه با دیگر برنامه‌ها، کمبود بزرگی به حساب می‌آید؛ بنابراین تصمیم گرفتیم بی‌خیالش نشویم. با این حال، طبق معمول، هیچ تبلیغات، ردیابی یا تحلیل داده‌ای به هیچ وجه در کار نیست؛ اینترنت فقط برای ارسال فراپیام استفاده می‌شود. + افزودن گیرنده + افزودن کلیدواژه‌ی مسدودشده + بله، می‌توانید با نگه‌داشتن دکمه‌ی ارسال و انتخاب تاریخ و ساعت دلخواه، پیام‌ها را برای ارسال در آینده زمان‌بندی کنید. + پیام‌ها + پیام ارسال نشد + پیوست + گفت‌وگویی را آغاز کنید + پاسخ + در حال بارگیری پیام‌ها… + فرستنده، امکان دریافت پاسخ ندارد + پیش‌نویس + در حال ارسال… + سنجاق به بالا + برداشتن سنجاق + ارسال به دیگری + امکان فشرده‌سازی تصویر به اندازه‌ی انتخاب‌شده وجود ندارد + گفت‌وگوی تازه + پیشنهادها + هیچ گفت‌وگویی نداشته اید + نمایش شمارشگر نویسه‌ها هنگام نوشتن پیام + تغییر عنوان گفت‌وگو + پیام زمان‌بندی‌شده + زمان‌بندی پیام + ارسال زمان‌دار + لغو ارسال زمان‌دار + باید زمانی در آینده انتخاب کنید + به‌روزرسانی پیام + همین الآن بفرست + اطلاعات پیام + فرستنده + گیرنده + دریافتی در + ارسالی در + پیامک دریافتی + پیام تازه + خوانده شده + خوانده نشده + من + فقط فرستنده + ارسال پیام با کلید اینتر + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6e27b77e..5b06f514 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -50,13 +50,13 @@ Merkitse lukemattomaksi Minä Poista arkivointi - Poista kaikki arkivoidut keskustelut + Poista kaikki arkistoidut keskustelut Arkisto - Näytä arkivoidut keskustelut + Näytä arkistoidut keskustelut Arkivoi Arkivoituja keskusteluja ei löytynyt Arkisto tyhjennettiin onnistuneesti - Haluatko tyhjentää arkiston\? Kaikki arkivoidut keskustelut menetetään pysyvästi. + Haluatko tyhjentää arkiston? Kaikki arkistoidut keskustelut menetetään pysyvästi. Palauta Palauta kaikki viestit Haluatko tyhjentää Roskakorin\? Viestit menetetään pysyvästi. @@ -114,4 +114,6 @@ Operaattorit rajoittavat MMS-kokoa, voit yrittää asettaa pienemmän rajan sovelluksen asetuksissa. Tukeeko sovellus ajoitettua viestien lähetystä\? Kyllä tukee ja voit ajoittaa viestin lähetyksen painamalla lähetyspainiketta pitkään ja valitsemalla halutun päivän ja kellonajan. - + Viestit + Käytä mukautettuja ilmoituksia + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 167d16fa..0e5a574b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -118,4 +118,5 @@ Activer les notifications personnalisées Suggestions Archive - + Messages + \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 3a656e23..6f7651c0 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -19,7 +19,7 @@ Tidak dapat mengompres gambar ke ukuran yang dipilih Item duplikat tidak termasuk - and %d others + dan %d lainnya Percakapan baru Tambahkan Kontak atau Nomor… @@ -75,4 +75,42 @@ Ukuran MMS dibatasi oleh penyedia, Anda dapat menetapkan batas yang lebih kecil dalam pengaturan aplikasi. Apakah aplikasi mendukung penjadwalan pesan\? Ya, Anda bisa menjadwalkan pesan untuk dikirim di masa depan dengan menekan lama pada tombol Kirim dan memilih tanggal dan waktu yang diinginkan. - + Aktifkan notifikasi khusus + Detail pesan + Penerima + Dikirim pukul + Diterima pukul + Arsip + Tampilkan percakapan yang diarsipkan + Arsip + Tidak ada arsip percakapan yang ditemukan + Arsip telah berhasil dikosongkan + Anda yakin ingin mengosongkan arsip? Semua percakapan yang diarsipkan akan hilang secara permanen. + Pesan + Sematkan ke atas + Pengirim + Perbarui pesan + Hapus semua percakapan yang diarsipkan + Saya + Tidak diarsipkan + Pulihkan + Pulihkan semua pesan + Anda yakin ingin memulihkan %s? + Ekspor SMS + Impir pesan + Impor SMS + Tidak dapat mengunduh MMS + Kata kunci + Ukuran lampiran melebihi batas maksimum yang diizinkan untuk MMS + Kata kunci yang diblokir + Ekspor pesan + Kartu SIM tidak tersedia + Anda belum memblokir kata kunci apa pun. Anda dapat menambahkan kata kunci di sini untuk memblokir semua pesan yang mengandung kata kunci tersebut. + Pesan + Kelola kata kunci yang diblokir + Anda yakin ingin mengosongkan Keranjang Sampah? Pesan-pesan di dalamnya akan hilang secara permanen. + Lewati Keranjang Sampah, hapus pesan secara langsung + Anda yakin ingin mengarsipkan %s? + Anda yakin ingin memulihkan semua pesan dari percakapan ini? + Tambahkan kata kunci yang diblokir + \ No newline at end of file diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 69eceacd..40ecf1bf 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -67,4 +67,18 @@ למרבה הצער, זה נחוץ לשליחת קבצי MMS מצורפים. אי היכולת לשלוח MMS תהיה חיסרון עצום בהשוואה לאפליקציות אחרות, אז החלטנו ללכת בדרך זו. עם זאת, כמו בדרך כלל, אין מודעות, מעקב או ניתוח כלשהם, האינטרנט משמש רק לשליחת MMS. הקצה השני לא מקבל את ה-MMS שלי, האם יש משהו שאני יכול לעשות בנידון\? גודל ה-MMS מוגבל על ידי הספקים, אתה יכול לנסות להגדיר מגבלה קטנה יותר בהגדרות האפליקציה. - + הודעות + חברים + שם שיחה + פרטי שיחה + שינוי שם שיחה + רק אתה יכול לראות את שם השיחה הזה + הודעה מתוזמנת + הודעת לוח זמנים + תכנן משלוח + בטל משלוח מתוכנן + יש לבחור נקודת זמן בעתיד + עדכון הודעה + כן, אתה יכול לתזמן שליחת הודעות בעתיד על ידי לחיצה ארוכה על כפתור השליחה ובחירת התאריך והשעה הרצויים. + פריט כפול לא נכלל + \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 330f5623..c1aff288 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -20,7 +20,7 @@ 選択したサイズに画像を圧縮できません 重複したアイテムは含まれていませんでした - and %d others + とあと%d件 新しい会話 連絡先や電話番号を追加… @@ -45,21 +45,21 @@ 自分 本当にこの会話のすべてのメッセージを削除しますか? - %d 件の会話 + %d件の会話 - %d 件のメッセージ + %d件のメッセージ - ロック画面の通知表示 - 差出人とメッセージ - 差出人のみ - 配信確認レポートを有効にする - 送信するメッセージから発音記号を取り除く (英語) + ロック画面の通知の可視性 + 送信者とメッセージ + 送信者のみ + 配信レポートを有効にする + 送信するメッセージから発音記号を取り除く Enter キーでメッセージを送信 - 送信する MMS の画像をリサイズ - 制限しない + 送信した MMS の画像をリサイズ + 制限なし 送信するメッセージ - グループメッセージは MMS として送信 + グループメッセージを MMS として送信 長いメッセージを MMS として送信 メッセージ メッセージをエクスポート @@ -68,8 +68,8 @@ メッセージをインポート SMS をインポート MMS をインポート - 1 つ以上のアイテムを選択する必要があります - 番号を空にすることはできません + 1 つ以上のアイテムを選択してください + 空の番号にメッセージを送信できません メッセージを電話データベースに保存できませんでした メッセージを送信できませんでした (サービス利用不可) メッセージを送信できませんでした (無線オフにより) @@ -78,9 +78,39 @@ このようなショートコードには返信できません 「503501」のような数字のみのショートコードには返信できますが、「AB-CD0」のようなアルファベットと数字を含んだショートコードには返信できません。 なぜアプリの使用にインターネットへのアクセスが必要なのですか? - MMS (マルチメディアメッセージサービス) にはインターネットが必要となります。ほかのアプリでは使用できる MMS が使用できないことは大きな不利益となるため、このようになっています。 ただし、通常通り広告・追跡・分析は一切行わず、インターネットは MMS のみに使用されます。 - メッセージ相手が MMS を受信できません。何かできますか? - MMS のサイズは通信キャリアによって制限されています。アプリの設定で制限を小さくしてみてください(「送信する MMS の画像をリサイズ」から制限を小さくできます)。 + SSMの添付ファイルを送信するために必要となります。ほかのアプリでは使用できるMMSを使用できないことは非常な不利となるため、そのようになっています。ただし他の場合と同様、広告・追跡・分析は一切行わず、インターネットはMMSのみに使用されます。 + メッセージ相手が MMS を受信できません。どうすればいいですか? + MMSのサイズは通信キャリアによって制限されています。アプリの設定で制限を小さくしてみてください。 アプリは予約メッセージをサポートしていますか? はい、送信ボタンを長押しして、希望の日付と時刻を選択することで、今後送信したいメッセージを予約できます。 - + 送信者 + メッセージ + メッセージ詳細 + 受信者 + すべてのアーカイブされた会話を削除する + アーカイブ + 非アーカイブ + アーカイブされた会話を表示する + アーカイブ + アーカイブされた会話が見つかりませんでした + すべてのメッセージを復元する + 復元 + カスタム通知を有効にする + キーワード + ブロックされたキーワード + ブロックされたキーワードを管理する + ブロックされたキーワードを追加する + キーワードをブロックしていません。 ここでキーワードを追加して、それらを含むすべてのメッセージをブロックすることができます。 + ごみ箱に入れずメッセージを直接削除 + 添付ファイルのサイズがMMSの制限を超えています + SIMカードは利用できません + 送信時間 + 受信時間 + アーカイブを空にしました + アーカイブを空にしてよろしいですか?全ての会話は完全に消去されます。 + ごみ箱を空にしてよろしいですか?メッセージは完全に消去されます。 + %sを復元してよろしいですか? + %sをアーカイブしてよろしいですか? + この会話の全てのメッセージを復元してよろしいですか? + MMSをダウンロードできませんでした + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index a6b3daec..9696d5b0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,2 +1,116 @@ - \ No newline at end of file + + 보관 해제 + 보관 + 보관한 대화가 없습니다 + 보관된 대화가 삭제되었습니다 + 복원 + 보관한 대화를 삭제하시겠습니까? 모든 보관된 대화가 영구적으로 삭제됩니다. + 보낸 사람 및 내용 + 보낸 사람만 + 수신 확인 사용 + MMS 이미지 크기 조정 + 엔터 입력 시 메시지 전송 + 메시지 전송 시 악센트 및 발음 부호 제거 + 제한 없음 + 메시지 + 긴 메시지를 MMS로 전송 + 보내는 메시지 + 그룹 메시지를 MMS로 전송 + 메시지 내보내기 + SMS 내보내기 + MMS 내보내기 + 메시지 불러오기 + SMS 불러오기 + MMS 불러오기 + 한 개 이상의 항목을 선택해야 합니다 + 무선 통신이 사용 중지되어 있어 메시지가 전송되지 않았습니다 + 통신 오류로 인해 메시지가 전송되지 않았습니다 + 다음 오류로 인해 메시지가 전송되지 않았습니다: %d + 해당 단축 코드에는 답장할 수 없습니다 + SIM 카드를 사용할 수 없습니다 + MMS를 다운로드할 수 없습니다 + 첨부 파일의 크기가 MMS 제한을 초과합니다 + 왜 인터넷 접근 권한이 필요한가요? + 예약 메시지를 지원하나요? + 네, 전송 버튼을 길게 눌러서 원하는 날짜와 시간에 메시지를 전송하도록 예약할 수 있습니다. + 받는 사람이 제 MMS를 못 받았다고 합니다. 제가 무엇을 해야 하나요? + MMS 크기는 이동 통신사에 의해 제한됩니다. 앱 설정에서 저 작은 크기로 설정해보세요. + 새 메시지 + 사용자 지정 알림 사용 + 보관한 대화 모두 삭제 + 보관된 대화 표시 + + 대화 %d개 + + + 메시지 %d개 + + 차단한 키워드가 없습니다. 특정 키워드를 포함한 메시지를 차단하려면 여기에 단어를 추가하세요. + 잠금 화면 알림 표시 여부 + 빈 번호로 메지지를 보낼 수 없습니다 + 메시지를 Telephony 저장소에 저장할 수 없습니다 + 통신 서비스를 사용할 수 없어 메시지가 전송되지 않았습니다 + \"AB-CD0\"과 같은 단어를 포함한 단축 코드가 아닌 \"503501\"과 같은 숫자 단축 코드에만 답장할 수 있습니다. + 안타깝게도 MMS 첨부 파일을 전송하려면 인터넷 접근이 필요합니다. MMS를 전송하지 못한다면 다른 앱과 비교하여 큰 단점이 될 것입니다. 하지만 저희의 다른 앱과 마찬가지로 광고나 추적, 분석따위는 포함되어 있지 않고, 인터넷은 MMS 전송을 위해서만 사용됩니다. + 메시지 전송 안 됨 + 저장된 대화가 없습니다 + 답장 + 고정 해제 + 참여자 + 대화명 + 휴대전화의 전원이 켜져있고 앱이 백그라운드에서 종료되지 않도록 설정하세요. + 휴지통에 보관하지 않고 바로 삭제 + 이 대화의 메시지를 모두 삭제하시겠습니까? + 휴지통을 비우시겠습니까? 모든 메시지가 영구적으로 삭제됩니다. + 모든 메시지 복원 + 이 대화의 모든 메시지를 복원하시겠습니까? + %s를 보관하시겠습니까? + %s를 복원하시겠습니까? + 차단된 단어 + 단어 + 차단한 키워드 + 차단 키워드 추가 + 메시지 + 메시지를 입력하세요… + 전송되지 않았습니다. 다시 시도하려면 선택하세요. + \'%s\'에게 전송한 메시지가 전송되지 않았습니다 + 수신자 추가 + 첨부 + 대화 시작 + 메시지 작성 시 글자 수 표시 + 메시지 불러오는 중… + 보낸 사람이 답장 기능을 지원하지 않습니다 + 임시 저장 + 전송 중… + 상단에 고정 + 전달 + 사진을 선택한 크기로 압축할 수 없습니다 + 중복된 항목이 제외되었습니다 + + 외 %d명 + + 새 대화 + 연락처 또는 전화번호 추가… + 제안 + 대화 세부 사항 + 대화명 편집 + 대화명은 다른 사람한테 표시되지 않습니다 + 예약된 메시지 + 메시지 예약 + 예약 전송 + 예약 전송 취소 + 미래의 시간을 선택해야 합니다 + 메시지 수정 + 지금 전송 + 메시지 세부 정보 + 보낸 사람 + 받는 사람 + 전송 시간 + 받은 시간 + 받은 메시지 + 읽음으로 표시 + 읽지 않음으로 표시 + + 보관 + \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0eeb95c4..e7965bbf 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -103,7 +103,7 @@ Kon het bericht niet verzenden: vliegtuigmodus Kon het bericht niet verzenden: netwerkfout Kon het bericht niet verzenden: foutcode %d - Er kan niet gereageerd worden op korte codes zoals deze + Er kan niet worden gereageerd op dit bericht Er kan alleen worden gereageerd op korte codes met cijfers, zoals \"503501\", maar niet op codes met letters en cijfers, zoals \"AB-CD0\". De bestandsgrootte van de bijlage overschrijdt de limiet voor MMS Simkaart niet beschikbaar diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 371c8176..e1c32ee4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,9 +20,9 @@ Não pôde comprimir imagem ao tamanho selecionado O item duplicado não foi incluído - and %d other - and %d others - and %d others + E %d outro + E %d outros + E %d outros Nova conversa Adicionar contato ou número… @@ -117,4 +117,6 @@ Ativar notificações personalizadas Atualizar mensagem Detalhes da mensagem + Não foi possível baixar o MMS + Mensagens \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 04c8b3a5..90a11ad4 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -1,55 +1,55 @@ O arquivo foi limpo com sucesso - Escrever uma mensagem … + Escrever uma mensagem… Responder - Mantenha o dispositivo ligado e certifique-se de que nada interrompe a aplicação em segundo plano. + Mantenha o telefone ligado e verifique se não há nada que esteja a bloquear a aplicação em segundo plano. Enviar agora - Não foram encontradas conversas arquivadas - Tem a certeza que pretende limpar o arquivo? Todas as conversas arquivadas serão apagadas permanentemente. + Não existem conversas arquivadas + Tem a certeza de que pretende limpar o arquivo? Todas as conversas arquivadas serão eliminadas. Restaurar - Tem a certeza que deseja apagar todas as mensagens desta conversa? - Tem a certeza que deseja arquivar %s? - Não foram encontradas conversas arquivadas + Tem a certeza de que pretende apagar todas as mensagens desta conversa? + Tem a certeza de que pretende arquivar %s? + Não foram encontradas conversas %d conversa %d conversas - %d conversas + %d mensagem %d mensagens - %d mensagens + Sem limite Enviar mensagens de grupo como MMS Enviar mensagens longas como MMS Mensagens Exportar mensagens - Não foi possível enviar mensagem, código de erro: %d - O tamanho do anexo excede os limites máximos de MMS - Cartão SIM indisponível - Não foi possível descarregar o MMS - Qual o motivo da aplicação necessitar de internet? - A aplicação suporta o agendamento de mensagens? + Não foi possível enviar a mensagem. Erro: %d + O anexo excede o tamanho máximo permitido para MMS + Cartão SIM não encontrado + Não foi possível descarregar a MMS + Porque é que a aplicação requer acesso à Internet? + Posso agendar mensagens com esta aplicação? Atualizar mensagem Exportar SMS - Enviar mensagem ao clicar no Enter + Enviar mensagem ao premir Enter Mensagens Mensagem não enviada - Não enviada. Clique para tentar novamente. - A sua mensagem para \'%s\' não foi enviada - Comece uma conversa + Não enviada. Toque para tentar novamente. + A mensagem destinada a \'%s\' não foi enviada + Iniciar uma conversa Adicionar pessoa Anexo - Mostrar contador de caractéres ao escrever mensagens + Mostrar número de caracteres ao escrever a mensagem A carregar mensagens… - Recebido a - Itens duplicados não foram incluídos + Recebida a + O item duplicado não foi incluído - e %d outro - e %d outros - e %d outros + e mais %d + e mais %d + Nova conversa Adicionar contacto ou número… @@ -58,7 +58,7 @@ Nome da conversa Detalhes da conversa Renomear conversa - Só pode visualizar o nome da conversa + Apenas você pode ver o nome desta conversa Detalhes da mensagem SMS recebida Nova mensagem @@ -70,29 +70,53 @@ Agendar envio Remetente Eu - Fixar no topo + Fixar Desafixar - Cancelar o envio de agendamento + Cancelar envio agendado Ativar notificações personalizadas Eliminar todas as conversas arquivadas - Arquivo / Arquivadas + Arquivo Mostrar conversas arquivadas Desarquivar - Tem a certeza que deseja limpar a reciclagem? As mensagens serão permanentemente apagadas. - Ignorar a reciclagem e apagar as mensagens de forma direta - Tem certeza de que deseja restaurar todas as mensagens desta conversa? + Tem a certeza de que pretende esvaziar a reciclagem? As mensagens não poderão ser recuperadas. + Eliminar mensagens sem as colocar na reciclagem + Tem a certeza de que pretende restaurar todas as mensagens desta conversa? Restaurar todas as mensagens - Arquivo / Arquivadas - Tem a certeza que quer restaurar %s? + Arquivo + Tem a certeza de que pretende restaurar %s? Exportar MMS Importar mensagens Importar SMS Importar MMS - Deve selecionar pelo menos um item - Não é possível enviar mensagem a um número vazio - Não foi possível enviar mensagem, serviço indisponível - Visibilidade da notificação no ecrã de bloqueio + Tem que selecionar, pelo menos, 1 item + Não pode enviar mensagens se não existir um destinatário + Serviço indisponível. Não pode enviar a mensagem + Notificação no ecrã de bloqueio Remetente e mensagem - Apenas o remetente + Apenas remetente Ativar relatórios de entrega + Erro da operadora. Não pode enviar a mensagem + Infelizmente, é a única forma de poder enviar anexos MMS. Não ter a capacidade de enviar MMS representaria uma enorme desvantagem comparativamente a outras aplicações e foi por isso que tomámos esta decisão. Mas, como habitualmente, a aplicação não tem anúncios, não rastreia os utilizadores nem recolhe dados pessoais. Esta permissão apenas é necessária para enviar MMS. + O destinatário não recebe as minhas MMS, o que posso fazer? + Palavra-chave + Palavras-chave bloqueadas + Gerir palavras-chave bloqueadas + Não existem quaisquer palavras-chave bloqueadas. Pode adicionar palavras-chave para bloquear todas as mensagens que as contenham. + Adicionar palavra-chave + Remover acentos e diacríticos nas mensagens enviadas + Não foi possível guardar a mensagem na base de dados do telefone + Rádio desligado. Não pode enviar a mensagem + Não é possível responder a códigos deste tipo + O tamanho das MMS é limitado pelas operadoras. Tente definir um limite inferior nas definições da aplicação. + Sim, pode agendar mensagens e escolher a data e hora de envio com um toque longo no botão Enviar. + Apenas é possível responder a códigos curtos com números como, por exemplo, e não a códigos que combinem letras e números com, por exemplo, \"AB-CD0\". + Tem que escolher um momento futuro + Redimensionar imagens MMS enviadas + Mensagens a enviar + O remetente não aceita respostas + Rascunho + Encaminhar + Não foi possível comprimir a imagem para o tamanho selecionado + Destinatário + Enviada a \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4bac849d..1f9cab61 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -14,7 +14,7 @@ O remetente não aceita respostas Rascunho A enviar… - Fixar + Afixar no topo Desafixar Encaminhar Não foi possível comprimir a imagem para o tamanho selecionado @@ -61,7 +61,7 @@ Restaurar todas as mensagens Tem a certeza de que pretende esvaziar a reciclagem\? As mensagens não poderão ser recuperadas. Eliminar mensagens sem as colocar na reciclagem - Tem a certeza de que pretende apagar todas as mensagens desta conversa\? + Tem a certeza de que pretende eliminar todas as mensagens desta conversa? Tem a certeza de que pretende arquivar %s\? Tem a certeza de que pretende restaurar todas as mensagens desta conversa\? Tem a certeza de que pretende restaurar %s\? diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index e12314d4..936b8e0f 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,29 +1,29 @@ - Introduceţi un mesaj… + Introdu un mesaj… Mesajul nu a fost trimis Mesajul nu a fost trimis. Apasă pentru a încerca din nou. Mesajul tău către \'%s\' nu a fost trimis Adaugă o persoană - Anexă - Nu au fost găsite conversaţii stocate - Începe o conversaţie + Atașament + Nu au fost găsite conversații stocate + Începe o conversație Răspunde - Afişează un contor de caractere la scrierea mesajelor + Afișează un contor de caractere la scrierea mesajelor Încărcare mesaje… - Expeditorul nu suportă funcţia de a răspunde la mesaje + Expeditorul nu suportă funcția de a răspunde la mesaje Ciornă Trimitere… - Fixare în vârf + Fixare în partea de sus Elimină fixarea - Redirecţionare + Redirecționare Nu se poate comprima imaginea la dimensiunea selectată - și %d alt - și %d altele - și %d de altele + și încă %d + și încă %d + și încă %d - Conversaţie nouă + Conversație nouă Adaugă contact sau număr de telefon… Sugestii SMS-uri primite @@ -31,11 +31,11 @@ Marchează ca citit Marchează ca necitit Eu - Sunteți sigur că doriți să ștergeți toate mesajele din această conversație\? + Ești sigur că dorești să ștergi toate mesajele din această conversație? - %d conversaţie - %d conversaţii - %d conversaţii + %d conversație + %d conversații + %d conversații %d mesaj @@ -43,30 +43,80 @@ %d mesaje Vizibilitatea notificării pe ecranul de blocare - Expeditor şi mesaj + Expeditor și mesaj Doar expeditorul - Activați rapoartele de livrare - Elimnă accente şi diacritice la trimitearea mesajelor + Activează rapoartele de livrare + Elimină accentele și diacriticele la trimiterea mesajelor Redimensioneză imaginile trimise prin MMS Fără limită Mesaje transmise - Trimiteți mesaje de grup ca MMS - Trimiteți mesaje lungi ca MMS - Mesajele + Trimite mesaje de grup ca MMS + Trimite mesaje lungi ca MMS + Mesaje Exportă mesajele Exportă mesajele SMS Exportă mesajele MMS Importă mesajele Importă mesajele SMS Importă mesajele MMS - Trebuie să selectaţi cel puţin un element + Trebuie să selectezi cel puțin un element De ce necesită aplicația acces la internet\? - Din păcate este nevoie pentru a primite anexe MMS. Ideea de a nu putea trimite MMS-uri ar prezenta un dezavantaj foarte mare în comparaţie cu alte aplicaţii, aşa că am decis să mergem pe această cale. Totuşi, ca de obicei, nu este prezentă nici un fel de reclamă, urmărire sau analiză, internetul este folosit doar pentru a trimite MMS-uri. + Din păcate este nevoie pentru a primite anexe MMS. Ideea de a nu putea trimite MMS-uri ar prezenta un dezavantaj foarte mare în comparație cu alte aplicații, așa că am decis să mergem pe această cale. Totuși, ca de obicei, nu este prezentă niciun fel de reclamă, urmărire sau analiză, internetul este folosit doar pentru a trimite MMS-uri. Celălalt capăt nu-mi primește MMS-ul, pot face ceva în acest sens\? - Dimensiunea MMS este limitată de operatorii de telefonie; puteți încerca să setați o limită mai mică în setările aplicației. - Membrii + Dimensiunea MMS este limitată de operatorii de telefonie; poți încerca să setezi o limită mai mică în setările aplicației. + Membri Numele conversației Detaliile conversației Redenumire conversație Mesaje + Numai tu poți vedea numele acestei conversații + Mesaj programat + Programează mesajul + Programează trimiterea + Trebuie să alegi un timp în viitor + Ține telefonul pornit și asigură-te că nimic nu oprește aplicația în fundal. + Actualizează mesajul + Trimite acum + Detalii mesaj + Șterge toate conversațiile arhivate + Arhivează + Afișează conversațiile arhivate + Expeditor + Trimis la + Destinatar + Primit la + Dezarhivează + Nu au fost găsite conversații arhivate + Arhiva a fost golită cu succes + Restaurează toate mesajele + Sigur dorești să golești Coșul de reciclare? Mesajele se vor pierde definitiv. + Omite Coșul de reciclare, șterge direct mesajele + Sigur dorești să arhivezi %s? + Sigur dorești să restabilești toate mesajele acestei conversații? + Sigur dorești să restaurezi %s? + Cuvânt cheie + Cuvinte cheie blocate + Gestionează cuvintele cheie blocate + Adaugă un cuvânt cheie blocat + Da, poți programa mesajele care urmează să fie trimise în viitor, apăsând lung butonul Trimite și alegând data și ora dorită. + Trimite mesaj apăsând Enter + Nu blochezi niciun cuvânt cheie. Poți adăuga cuvinte cheie aici pentru a bloca toate mesajele care le conțin. + Nu se poate salva mesajul în baza de date de telefonie + Nu s-a putut trimite mesajul, modulul radio este oprit + Nu pot răspunde la astfel de coduri scurte + Poți răspunde numai la codurile scurte cu numere precum „503501”, dar nu și la codurile care conțin litere și numere precum „AB-CD0”. + Dimensiunea atașamentului depășește limita maximă MMS + Nu s-a putut descărca MMS + Elementul duplicat nu a fost inclus + Restaurare + Activează notificările personalizate + Nu s-a putut trimite mesajul, serviciul nu este disponibil + Nu s-a putut trimite mesajul, eroare de operator + Nu s-a putut trimite mesajul, cod de eroare: %d + Cartela SIM nu este disponibilă + Aplicația acceptă mesajele programate? + Arhivează + Sigur dorești să golești arhiva? Toate conversațiile arhivate se vor pierde definitiv. + Anulează trimiterea programată + Nu se poate trimite mesaj la un număr gol \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 34c80059..a401ccf7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -21,7 +21,7 @@ Yinelenen öge dahil edilmedi ve %d diğeri - ve %d diğeri + ve %d diğerleri Yeni görüşme Kişi veya Numara Ekle… diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index da48f9c3..b0c83f30 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -82,7 +82,7 @@ Ключове слово Заблоковані ключові слова Керувати заблокованими ключовими словами - У вас немає заблокованих ключових слів. Ви можете додати ключові слова тут, щоб блокувати всі повідомлення, що містить їх + У вас немає заблокованих ключових слів. Ви можете додати ключові слова тут, щоб блокувати всі повідомлення, що містить їх. Додати заблоковане ключове слово Видимість сповіщень на екрані блокування Відправник і повідомлення @@ -110,7 +110,7 @@ Не вдалося надіслати повідомлення, помилка оператора Не вдалося надіслати повідомлення, код помилки: %d Не можна відповідати на такі короткі коди - Ви можете відповідати лише на короткі коди з цифрами, як-от \"503501\", але не на коди, що містять літери та цифри, як-от \"AB-CD0\". + Ви можете відповідати лише на короткі коди з цифрами, як-от «503501», але не на коди, що містять літери та цифри, як-от «AB-CD0». Розмір вкладеного файлу перевищує максимальний ліміт MMS SIM-картка не доступна Не вдалося завантажити MMS @@ -120,4 +120,6 @@ Розмір MMS обмежений операторами, ви можете спробувати зменшити ліміт у налаштуваннях програми. Чи підтримує застосунок заплановані повідомлення\? Так, ви можете запланувати надсилання повідомлень у майбутньому, довго натискаючи кнопку «Надіслати» та вибираючи потрібну дату й час. + Повідомлення + Ввімкнути власні сповіщення \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 0b848f1d..697eb2aa 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -111,4 +111,6 @@ Kích thước MMS bị giới hạn bởi nhà cung cấp dịch vụ, bạn có thể thử đặt giới hạn nhỏ hơn trong cài đặt ứng dụng. Ứng dụng có hỗ trợ gửi tin nhắn theo lịch trình không\? Có, bạn có thể lên lịch gửi tin nhắn trong tương lai bằng cách nhấn và giữ nút Gửi và chọn ngày giờ mong muốn. - + Bật thông báo tùy chỉnh + Tin nhắn + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6389df48..cc14da56 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -111,4 +111,6 @@ MMS 的大小受到電信業者的限制,您可以嘗試在應用程式設定中設定較小的限制。 應用程式是否支援排程訊息? 是的,您可以長按「送出」按鈕並選擇所需的日期和時間,以排程將訊息送出。 - + 啟用自訂通知 + 簡訊 + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 46e23adf..06775b3b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.kotlinAndroid).apply(false) alias(libs.plugins.kotlinSerialization).apply(false) alias(libs.plugins.ksp).apply(false) + alias(libs.plugins.detekt).apply(false) } tasks.register("clean") { diff --git a/fastlane/metadata/android/az-AZ/changelogs/1.txt b/fastlane/metadata/android/az-AZ/changelogs/1.txt new file mode 100644 index 00000000..7ebfe7a5 --- /dev/null +++ b/fastlane/metadata/android/az-AZ/changelogs/1.txt @@ -0,0 +1 @@ +* İlkin buraxılış diff --git a/fastlane/metadata/android/bg/title.txt b/fastlane/metadata/android/bg/title.txt new file mode 100644 index 00000000..6e82a909 --- /dev/null +++ b/fastlane/metadata/android/bg/title.txt @@ -0,0 +1 @@ +Фосифай SMS Месинджър diff --git a/fastlane/metadata/android/bn-BD/changelogs/1.txt b/fastlane/metadata/android/bn-BD/changelogs/1.txt new file mode 100644 index 00000000..1105627e --- /dev/null +++ b/fastlane/metadata/android/bn-BD/changelogs/1.txt @@ -0,0 +1 @@ +* প্রাথমিক প্রকাশ diff --git a/fastlane/metadata/android/bn-BD/changelogs/2.txt b/fastlane/metadata/android/bn-BD/changelogs/2.txt new file mode 100644 index 00000000..913f3b46 --- /dev/null +++ b/fastlane/metadata/android/bn-BD/changelogs/2.txt @@ -0,0 +1,2 @@ +* ছোটখাট বাগ সংশোধন এবং উন্নতি +* কিছু translation যোগ করা হয়েছে diff --git a/fastlane/metadata/android/bn-BD/full_description.txt b/fastlane/metadata/android/bn-BD/full_description.txt new file mode 100644 index 00000000..5c4642f9 --- /dev/null +++ b/fastlane/metadata/android/bn-BD/full_description.txt @@ -0,0 +1,32 @@ +Fossify Messenger হল আপনার বিশ্বস্ত মেসেজিং সঙ্গী, যা আপনার মেসেজিং অভিজ্ঞতাকে বিভিন্ন উপায়ে উন্নত করার জন্য ডিজাইন করা হয়েছে। + +📱 সহজে কানেক্টেড থাকুন: +Fossify Messenger এর মাধ্যমে, আপনি আপনার প্রিয়জনদের সাথে সংযুক্ত থাকতে অনায়াসে SMS এবং MMS বার্তা পাঠাতে পারেন। SMS/MMS ভিত্তিক গ্রুপ মেসেজিং উপভোগ করুন এবং ফটো, ইমোজি এবং দ্রুত শুভেচ্ছার মাধ্যমে নিজেকে প্রকাশ করুন। + +🚫 অবাঞ্ছিত বার্তা ব্লক করুন: +একটি শক্তিশালী ব্লকিং বৈশিষ্ট্য সহ আপনার মেসেজিং অভিজ্ঞতার নিয়ন্ত্রণ নিন, সহজেই অবাঞ্ছিত বার্তাগুলিকে প্রতিরোধ করুন, এমনকি অজানা পরিচিতি থেকেও। আপনি ঝামেলা-মুক্ত ব্যাকআপের জন্য ব্লক করা নম্বরগুলি ইমপোর্ট এবং এক্সপোর্ট করতে পারেন। উপরন্তু, নির্দিষ্ট শব্দ বা বাক্যাংশ সহ বার্তাগুলিকে আপনার ইনবক্সে পৌঁছাতে বাধা দিয়ে আপনার অভিজ্ঞতা কাস্টমাইজ করুন। + +🔒 অনায়াসে এসএমএস ব্যাকআপ: +গুরুত্বপূর্ণ বার্তা হারানোর বিষয়ে উদ্বেগকে বিদায় জানান। Fossify Messenger আপনাকে আপনার বার্তা রপ্তানি এবং আমদানি করার অনুমতি দিয়ে সুবিধাজনক SMS ব্যাকআপ কার্যকারিতা প্রদান করে। এই বৈশিষ্ট্যটি নিশ্চিত করে যে আপনি আপনার মূল্যবান কথোপকথন না হারিয়ে সহজেই ডিভাইসগুলি স্যুইচ করতে পারেন৷ + +🚀 বিদ্যুত-দ্রুত এবং হালকা: +এর শক্তিশালী বৈশিষ্ট্য থাকা সত্ত্বেও, ফসিফাই মেসেঞ্জার একটি উল্লেখযোগ্যভাবে ছোট app এর আকার নিয়ে গর্ব করে, এটিকে দ্রুত এবং সহজে ডাউনলোড এবং ইনস্টল করে। এসএমএস ব্যাকআপের সাথে আসা মানসিক শান্তি উপভোগ করার সময় speed এবং দক্ষতার অভিজ্ঞতা নিন। + +🔐 উন্নত গোপনীয়তা: +অতিরিক্ত গোপনীয়তার জন্য আপনার lockscreen যা প্রদর্শিত হবে তা কাস্টমাইজ করুন। শুধুমাত্র প্রেরক, বার্তা সামগ্রী বা all প্রদর্শন করতে বেছে নিন। আপনার বার্তা আপনার নিয়ন্ত্রণে আছে. + +🔍 কার্যকরী বার্তা search: +কথোপকথনের মাধ্যমে অন্তহীন স্ক্রোলিংকে বিদায় বলুন। ফসিফাই মেসেঞ্জার দ্রুত এবং দক্ষ অনুসন্ধান বৈশিষ্ট্য সহ বার্তা পুনরুদ্ধারকে সহজ করে। আপনার যা প্রয়োজন তা search করুন। যখন আপনার এটি প্রয়োজন। + +🌈 আধুনিক ডিজাইন এবং ব্যবহারকারী-বান্ধব ইন্টারফেস: +একটি ব্যবহারকারী-বান্ধব ইন্টারফেসের সাথে একটি পরিষ্কার, আধুনিক ডিজাইন উপভোগ করুন। app টিতে একটি বস্তুগত নকশা এবং একটি অন্ধকার থিম বিকল্প রয়েছে, যা একটি দৃশ্যমান আকর্ষণীয় এবং আরামদায়ক ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। + +🌐 ওপেন সোর্স স্বচ্ছতা: +আপনার গোপনীয়তা একটি শীর্ষ অগ্রাধিকার. ফসিফাই মেসেঞ্জার ইন্টারনেট সংযোগের প্রয়োজন ছাড়াই কাজ করে, বার্তা নিরাপত্তা এবং স্থিতিশীলতার নিশ্চয়তা দেয়। আমাদের app টি সম্পূর্ণ বিজ্ঞাপন মুক্ত এবং অপ্রয়োজনীয় অনুমতির জন্য অনুরোধ করে না। অধিকন্তু, এটি সম্পূর্ণরূপে ওপেন সোর্স, যা আপনাকে মানসিক শান্তি প্রদান করে, কারণ আপনার কাছে নিরাপত্তা এবং গোপনীয়তা নিরীক্ষার জন্য সোর্স কোডের অ্যাক্সেস রয়েছে। + +ফসিফাই মেসেঞ্জারে স্যুইচ করুন এবং মেসেজ করার অভিজ্ঞতা নিন যেভাবে এটি হওয়া উচিত - ব্যক্তিগত, দক্ষ এবং ব্যবহারকারী-বান্ধব৷ এখনই ডাউনলোড করুন এবং আপনার মেসেজিং অভিজ্ঞতা সুরক্ষিত করতে প্রতিশ্রুতিবদ্ধ আমাদের সম্প্রদায়ে যোগ দিন। + +আরও Fossify app গুলি অন্বেষণ করুন: https://www.fossify.org +ওপেন-সোর্স কোড: https://www.github.com/FossifyOrg +Reddit এ সম্প্রদায়ে যোগ দিন: https://www.reddit.com/r/Fossify +টেলিগ্রামে সংযোগ করুন: https://t.me/Fossify diff --git a/fastlane/metadata/android/bn-BD/short_description.txt b/fastlane/metadata/android/bn-BD/short_description.txt new file mode 100644 index 00000000..f79c3502 --- /dev/null +++ b/fastlane/metadata/android/bn-BD/short_description.txt @@ -0,0 +1 @@ +ওপেন সোর্স এবং বিজ্ঞাপন-মুক্ত SMS/MMS মেসেজিং app diff --git a/fastlane/metadata/android/ca/changelogs/2.txt b/fastlane/metadata/android/ca/changelogs/2.txt new file mode 100644 index 00000000..f9c4b1ff --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/2.txt @@ -0,0 +1,2 @@ +* Correccions d'errors menors i millores +* S'han afegit diverses traduccions diff --git a/fastlane/metadata/android/cs-CZ/changelogs/1.txt b/fastlane/metadata/android/cs-CZ/changelogs/1.txt index 909b4eb0..9ad7f851 100644 --- a/fastlane/metadata/android/cs-CZ/changelogs/1.txt +++ b/fastlane/metadata/android/cs-CZ/changelogs/1.txt @@ -1 +1 @@ -* Initial release +* Prvotní vydání diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2.txt b/fastlane/metadata/android/cs-CZ/changelogs/2.txt new file mode 100644 index 00000000..229edb58 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2.txt @@ -0,0 +1,2 @@ +* Minor bug fixes and improvements +* Added some translations diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt new file mode 100644 index 00000000..c3d0f421 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/full_description.txt @@ -0,0 +1,32 @@ +Zprávy Fossify jsou vaším důvěryhodným společníkem pro zasílání zpráv. Jsou navrženy tak, aby různými způsoby vylepšovaly váš zážitek ze zasílání zpráv. + +📱 ZŮSTAŇTE SNADNO VE SPOJENÍ: +S aplikací Zprávy Fossify můžete snadno posílat zprávy SMS a MMS a zůstat tak ve spojení se svými blízkými. Posílejte si skupinové zprávy založené na SMS/MMS a vyjadřujte se pomocí fotografií, emotikonů a rychlých pozdravů. + +🚫 BLOKOVÁNÍ NEŽÁDOUCÍCH ZPRÁV: +Převezměte kontrolu nad zasíláním zpráv díky robustní funkci blokování, která snadno zabrání zasílání nechtěných zpráv, a to i od neznámých kontaktů. Zablokovaná čísla můžete také exportovat a importovat pro bezproblémové zálohování. Navíc si můžete přizpůsobit své prostředí tím, že zabráníte zprávám s určitými slovy nebo frázemi, aby se dostaly do vaší schránky. + +🔒 BEZPROBLÉMOVÉ ZÁLOHOVÁNÍ SMS: +Rozlučte se s obavami ze ztráty důležitých zpráv. Zprávy Fossify nabízí pohodlnou funkci zálohování SMS – umožňují export a import zpráv. Tato funkce zajišťuje, že můžete snadno změnit zařízení, aniž byste přišli o své cenné konverzace. + +🚀 BLESKURYCHLÉ A LEHKÉ: +I přes své výkonné funkce se Zprávy Fossify mohou pochlubit pozoruhodně malou velikostí aplikace, díky které se rychle a snadno stahují a instalují. Zažijte rychlost a efektivitu a zároveň si užívejte klid, který přináší zálohování SMS. + +🔐 VYLEPŠENÁ OCHRANA SOUKROMÍ: +Přizpůsobte si, co se zobrazuje na zamykací obrazovce, a zajistěte si tak větší soukromí. Zvolte si, zda chcete zobrazit pouze odesílatele, obsah zprávy nebo vůbec nic. Své zprávy máte pod kontrolou. + +🔍 EFEKTIVNÍ VYHLEDÁVÁNÍ ZPRÁV: +Rozlučte se s nekonečným procházením konverzací. Zprávy Fossify zjednodušují vyhledávání zpráv pomocí funkce rychlého a efektivního vyhledávání. Najděte, co potřebujete, kdykoli a kdekoli. + +🌈 MODERNÍ DESIGN A PŘÍVĚTIVÉ ROZHRANÍ: +Vychutnejte si čistý, moderní design s uživatelsky přívětivým rozhraním. Aplikace využívá Material Design a možnost tmavého motivu, což poskytuje vizuálně přitažlivé a pohodlné uživatelské prostředí. + +🌐 TRANSPARENTNOST OTEVŘENÉHO ZDROJE: +Vaše soukromí je nejvyšší prioritou. Zprávy Fossify fungují bez nutnosti připojení k internetu, což zaručuje stabilitu a bezpečnost zpráv. Naše aplikace je zcela bez reklam a nevyžaduje zbytečná oprávnění. Navíc je plně open-source, což vám poskytuje klid, protože máte přístup ke zdrojovému kódu pro bezpečnostní audity a audity soukromí. + +Přejděte na aplikaci Zprávy Fossify a vyzkoušejte si zasílání zpráv tak, jak má být – soukromé, efektivní a uživatelsky přívětivé. Stáhněte si aplikaci nyní a připojte se k naší komunitě, která je odhodlána chránit vaše zprávy. + +Prozkoumejte další aplikace Fossify: https://www.fossify.org. +Otevřený zdrojový kód: https://www.github.com/FossifyOrg +Přidejte se ke komunitě na Redditu: https://www.reddit.com/r/Fossify +Připojte se na Telegram: https://t.me/Fossify diff --git a/fastlane/metadata/android/da-DK/changelogs/1.txt b/fastlane/metadata/android/da-DK/changelogs/1.txt new file mode 100644 index 00000000..f0dd5e66 --- /dev/null +++ b/fastlane/metadata/android/da-DK/changelogs/1.txt @@ -0,0 +1 @@ +* Første udgivelse diff --git a/fastlane/metadata/android/da-DK/changelogs/2.txt b/fastlane/metadata/android/da-DK/changelogs/2.txt new file mode 100644 index 00000000..a6313ac3 --- /dev/null +++ b/fastlane/metadata/android/da-DK/changelogs/2.txt @@ -0,0 +1,2 @@ +* Mindre fejlretninger og forbedrelser +* Tilføjede nogle oversættelser diff --git a/fastlane/metadata/android/da-DK/full_description.txt b/fastlane/metadata/android/da-DK/full_description.txt new file mode 100644 index 00000000..914d92e5 --- /dev/null +++ b/fastlane/metadata/android/da-DK/full_description.txt @@ -0,0 +1,32 @@ +Fossify Messenger er din pålidelige beskedtjeneste, designet til at forbedre din beskedoplevelse på forskellige måder. + +📱 HOLD FORBINDELSEN UDEN BESVÆR: +Med Fossify Messenger kan du nemt sende SMS- og MMS-beskeder for at holde forbindelsen med dine kære. Nyd SMS/MMS-baserede gruppebeskeder, og udtryk dig med fotos, emojis og hurtige hilsner. + +🚫 BLOKÉR UØNSKEDE BESKEDER: +Tag kontrol over din beskedoplevelse med en robust blokeringsfunktion, der nemt forhindrer uønskede beskeder, selv fra ukendte kontakter. Du kan også eksportere og importere blokerede numre til problemfri sikkerhedskopiering. Derudover kan du tilpasse din oplevelse ved at forhindre beskeder med specifikke ord eller sætninger i at nå din indbakke. + +🔒 NEM SMS-SIKKERHEDSKOPIERING: +Sig farvel til bekymringer om at miste vigtige beskeder. Fossify Messenger tilbyder praktisk SMS-sikkerhedskopiering ved at give dig mulighed for at eksportere og importere dine beskeder. Denne funktion sikrer, at du nemt kan skifte enhed uden at miste dine værdifulde samtaler. + +🚀 LYNHURTIG OG LET: +På trods af sine kraftfulde funktioner har Fossify Messenger en bemærkelsesværdig lille app-størrelse, hvilket gør den hurtig og nem at hente og installere. Oplev hastighed og effektivitet, mens du nyder trygheden, der følger med SMS-sikkerhedskopiering. + +🔐 FORBEDRET PRIVATLIV: +Tilpas, hvad der vises på din låseskærm for ekstra privatliv. Vælg kun at vise afsenderen, beskedens indhold eller slet ingenting. Dine beskeder er i din kontrol. + +🔍 EFFEKTIV BESKEDSØGNING: +Sig farvel til endeløs scrolling gennem samtaler. Fossify Messenger forenkler beskedhentning med en hurtig og effektiv søgefunktion. Find det, du har brug for, når du har brug for det. + +🌈 MODERNE DESIGN OG BRUGERVENLIG GRÆNSEFLADE: +Nyd et rent, moderne design med en brugervenlig grænseflade. Appen har et materialedesign og et mørkt tema, der giver en visuelt tiltalende og behagelig brugeroplevelse. + +🌐 OPEN SOURCE-TRANSPARENS: +Dit privatliv er en topprioritet. Fossify Messenger fungerer uden at kræve en internetforbindelse, hvilket garanterer meddelelsessikkerhed og stabilitet. Vores app er helt fri for reklamer og beder ikke om unødvendige tilladelser. Desuden er den helt open source, hvilket giver dig ro i sindet, da du har adgang til kildekoden til sikkerheds- og privatlivsrevisioner. + +Skift til Fossify Messenger, og oplev beskeder, som de bør være — private, effektive og brugervenlige. Hent den nu, og bliv en del af vores fællesskab, der er engageret i at beskytte din beskedoplevelse. + +Udforsk flere Fossify-apps: https://www.fossify.org +Open source-kode: https://www.github.com/FossifyOrg +Deltag i fællesskabet på Reddit: https://www.reddit.com/r/Fossify +Opret forbindelse på Telegram: https://t.me/Fossify diff --git a/fastlane/metadata/android/da-DK/short_description.txt b/fastlane/metadata/android/da-DK/short_description.txt new file mode 100644 index 00000000..22b92d4d --- /dev/null +++ b/fastlane/metadata/android/da-DK/short_description.txt @@ -0,0 +1 @@ +Open-source og reklame-fri SMS/MMS meddelelses-app diff --git a/fastlane/metadata/android/da-DK/title.txt b/fastlane/metadata/android/da-DK/title.txt new file mode 100644 index 00000000..1d5049dd --- /dev/null +++ b/fastlane/metadata/android/da-DK/title.txt @@ -0,0 +1 @@ +Fossify SMS Messenger diff --git a/fastlane/metadata/android/de-DE/changelogs/2.txt b/fastlane/metadata/android/de-DE/changelogs/2.txt new file mode 100644 index 00000000..b2af11ab --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/2.txt @@ -0,0 +1,2 @@ +* Kleinere Fehlerbehebungen und Verbesserungen +* Einige Übersetzungen hinzugefügt diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index e7ea05ee..7253c597 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -9,7 +9,7 @@ Mit Fossify Messenger kannst du mühelos SMS- und MMS-Nachrichten versenden, um 🔒 MÜHELOSE SMS-SICHERUNG: Verabschiede dich von der Sorge, wichtige Nachrichten zu verlieren. Fossify Messenger bietet eine praktische SMS-Sicherungsfunktion, mit der du deine Nachrichten exportieren und importieren kannst. Diese Funktion stellt sicher, dass du problemlos das Gerät wechseln kannst, ohne deine wertvollen Unterhaltungen zu verlieren. -🚀 BLITZSCHNELL UND LEICHT: +🚀 BLITZSCHNELL UND SCHLANK: Trotz seiner leistungsstarken Funktionen ist die App von Fossify Messenger bemerkenswert klein, so dass sie schnell und einfach heruntergeladen und installiert werden kann. Erlebe Schnelligkeit und Effizienz und genieße gleichzeitig die Sicherheit, die dir die SMS-Sicherung bietet. 🔐 VERBESSERTE PRIVATSPHÄRE: @@ -18,13 +18,13 @@ Passe an, was auf deinem Sperrbildschirm angezeigt wird, um deine Privatsphäre 🔍 EFFIZIENTE NACHRICHTENSUCHE: Verabschiede dich vom endlosen Scrollen durch Unterhaltungen. Fossify Messenger vereinfacht das Auffinden von Nachrichten mit einer schnellen und effizienten Suchfunktion. Finde, was du brauchst, wann du es brauchst. -🌈 MODERNES DESIGN & BENUTZERFREUNDLICHE OBERFLÄCHE: -Genieße ein sauberes, modernes Design mit einer benutzerfreundlichen Oberfläche. Die App verfügt über ein Material Design und ein dunkles Farbschema, die ein optisch ansprechendes und komfortables Nutzererlebnis bietet. +🌈 MODERNES DESIGN & BEDIENFREUNDLICHE OBERFLÄCHE: +Genieße ein sauberes, modernes Design mit einer bedienfreundlichen Oberfläche. Die App verfügt über ein Material Design und ein dunkles Farbschema, die ein optisch ansprechendes und komfortables Nutzungserlebnis bieten. 🌐 OPEN-SOURCE-TRANSPARENZ: Deine Privatsphäre hat höchste Priorität. Der Fossify Messenger funktioniert ohne Internetverbindung und garantiert so die Sicherheit und Stabilität deiner Nachrichten. Unsere App ist völlig werbefrei und fordert keine unnötigen Berechtigungen an. Außerdem ist sie vollständig quelloffen, was dich beruhigt, da du Zugang zum Quellcode hast, um die Sicherheit und den Datenschutz zu überprüfen. -Steig auf Fossify Messenger um und erlebe Messaging so, wie es sein sollte – privat, effizient und benutzerfreundlich. Lade jetzt herunter und schließe dich unserer Community an, die sich für die Sicherheit deines Messaging-Erlebnisses einsetzt. +Steig auf Fossify Messenger um und erlebe Messaging so, wie es sein sollte – privat, effizient und bedienfreundlich. Lade jetzt herunter und schließe dich unserer Community an, die sich für die Sicherheit deines Messaging-Erlebnisses einsetzt. Entdecke weitere Apps von Fossify: https://www.fossify.org Open-Source-Code: https://www.github.com/FossifyOrg diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt index 690c0747..a1ea4b04 100644 --- a/fastlane/metadata/android/de-DE/short_description.txt +++ b/fastlane/metadata/android/de-DE/short_description.txt @@ -1 +1 @@ -Open Source und werbefreie SMS/MMS-Nachrichten-App +Quelloffene und werbefreie SMS/MMS-Nachrichten-App diff --git a/fastlane/metadata/android/es-ES/changelogs/2.txt b/fastlane/metadata/android/es-ES/changelogs/2.txt new file mode 100644 index 00000000..8d994eef --- /dev/null +++ b/fastlane/metadata/android/es-ES/changelogs/2.txt @@ -0,0 +1,2 @@ +* Mejoras y correcciones de errores menores +* Añadidas algunas traducciones diff --git a/fastlane/metadata/android/et/changelogs/2.txt b/fastlane/metadata/android/et/changelogs/2.txt new file mode 100644 index 00000000..91d08e92 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/2.txt @@ -0,0 +1,2 @@ +* Väiksemad veaparandused ja kohendused +* Lisasime mõned tõlked diff --git a/fastlane/metadata/android/et/full_description.txt b/fastlane/metadata/android/et/full_description.txt index 43c6781f..d2ca761c 100644 --- a/fastlane/metadata/android/et/full_description.txt +++ b/fastlane/metadata/android/et/full_description.txt @@ -1,7 +1,7 @@ Fossify Sõnumid on sinu usaldusväärne sõnumikaaslane, mis on loodud selleks, et parandada sinu sõnumikogemust mitmel viisil. -📱 PÜSI HÕLPSASTI SUHLUSES: -Fossify Sõnumitega saad hõlpsasti saata SMS- ja MMS-sõnumeid, et püsida ühenduses oma lähedastega. Kasuta SMS/MMS-põhiseid rühmasõnumeid ja väljenda end fotode, emotikoonide ja kiirtervitustega. +📱 PÜSI HÕLPSASTI SUHTLUSES: +Fossify Sõnumitega saad hõlpsasti saata SMS- ja MMS-sõnumeid, et püsida ühenduses oma lähedastega. Kasuta SMS/MMS-põhiseid rühmasõnumeid ja väljenda end fotode, emotikonide ja kiirtervitustega. 🚫 BLOKEERI SOOVIMATUD SÕNUMID: Haara oma sõnumite kasutamise üle kontroll tõhusa blokeerimisfunktsiooniga, mis takistab hõlpsasti soovimatuid sõnumeid, isegi tundmatutelt kontaktidelt. Samuti saad blokeeritud numbreid eksportida ja importida, et teha hõlpsasti varukoopiaid. Lisaks saad oma kogemust kohandada, takistades teatud sõnu või fraase sisaldavate sõnumite jõudmist oma postkasti. @@ -10,21 +10,21 @@ Haara oma sõnumite kasutamise üle kontroll tõhusa blokeerimisfunktsiooniga, m Unusta aeg, mil kaotasid tähtsaid sõnumeid. Fossify Sõnumid pakub mugavat SMS-i varundamise funktsiooni, võimaldades sul oma sõnumeid eksportida ja importida. See funktsioon tagab, et saad hõlpsasti seadmeid vahetada, ilma et kaotaksid oma väärtuslikke vestlusi. 🚀 VÄLKKIIRE JA NAPI RESSURSIVAJADUSEGA: -Vaatamata oma võimsatele funktsioonidele on rakendus Fossify Sõnumid märkimisväärselt väikese suurusega, mistõttu on seda kiire ja lihtne alla laadida ja paigaldada. Kogege kiirust ja tõhusust, nautides samal ajal meelerahu, mis kaasneb SMS-i varundamisega. +Vaatamata oma võimsatele funktsioonidele on rakendus Fossify Sõnumid märkimisväärselt väikese suurusega, mistõttu on seda kiire ja lihtne alla laadida ja paigaldada. Koge kiirust ja tõhusust, nautides samal ajal meelerahu, mis kaasneb SMS-i varundamisega. 🔐 TÄIUSTATUD PRIVAATSUS: -Kohanda, mis sinu nutiseadme lukustusekraanil ilmub, et suurendada privaatsust. Vali, kas soovite kuvada ainult saatjat, sõnumi sisu või üldse mitte midagi. Sinu sõnumid on sinu kontrolli all. +Kohanda, mis sinu nutiseadme lukustusekraanil ilmub, et suurendada privaatsust. Vali, kas soovid kuvada ainult saatjat, sõnumi sisu või üldse mitte midagi. Sinu sõnumid on sinu kontrolli all. 🔍 TÕHUS SÕNUMIOTSING: Ütle hüvasti lõputule vestluste sirvimisele. Fossify Sõnumid lihtsustab sõnumite leidmist kiire ja tõhusa otsingufunktsiooniga. Leia see, mida vajad, siis, kui seda vajad. 🌈 KAASAEGNE KUJUNDUS JA KASUTAJASÕBRALIK KASUTAJALIIDES: -Nautige puhast, kaasaegset disaini ja kasutajasõbralikku kasutajaliidest. Rakendus lähtub „Material Design“ kujundusloogikast ja olemas on tumedate teemade valik, mis üheskoos pakuvad visuaalselt atraktiivset ja mugavat kasutajakogemust. +Naudi puhast, kaasaegset disaini ja kasutajasõbralikku kasutajaliidest. Rakendus lähtub „Material Design“ kujundusloogikast ja olemas on tumedate teemade valik, mis üheskoos pakuvad visuaalselt atraktiivset ja mugavat kasutajakogemust. 🌐 AVATUD LÄHTEKOODIL PÕHINEV LÄBIPAISTVUS: Sinu privaatsus on esmatähtis. Fossify Sõnumid töötab ilma internetiühendust nõudmata, tagades sõnumite turvalisuse ja stabiilsuse. Meie rakendus on täiesti reklaamivaba ja ei küsi mittevajalikke lubasid. Lisaks on see täielikult avatud lähtekoodiga, mis tagab sulle meelerahu, kuna sul on soovi korral juurdepääs lähtekoodile turvalisuse ja privaatsuse kontrollimiseks. -Kasutage rakendust Fossify Sõnumid ja saada sõnumeid nii, nagu see peaks olema - privaatselt, tõhusalt ja kasutajasõbralikul viisil. Laadige rakendus alla ja liituge meie kogukonnaga, mis on pühendunud sinu sõnumikogemuse kaitsmisele. +Kasuta rakendust Fossify Sõnumid ja saada sõnumeid nii, nagu see peaks olema - privaatselt, tõhusalt ja kasutajasõbralikul viisil. Laadi rakendus alla ja liitu meie kogukonnaga, mis on pühendunud sinu sõnumikogemuse kaitsmisele. Tutvu Fossify rakendustega: https://www.fossify.org Avatud lähtekood: https://www.github.com/FossifyOrg diff --git a/fastlane/metadata/android/eu-ES/changelogs/1.txt b/fastlane/metadata/android/eu-ES/changelogs/1.txt new file mode 100644 index 00000000..40a31ce1 --- /dev/null +++ b/fastlane/metadata/android/eu-ES/changelogs/1.txt @@ -0,0 +1 @@ +* Hasierako bertsioa diff --git a/fastlane/metadata/android/fi-FI/changelogs/1.txt b/fastlane/metadata/android/fi-FI/changelogs/1.txt new file mode 100644 index 00000000..5a64ffbe --- /dev/null +++ b/fastlane/metadata/android/fi-FI/changelogs/1.txt @@ -0,0 +1 @@ +* Ensimmäinen julkaisu diff --git a/fastlane/metadata/android/fi-FI/changelogs/2.txt b/fastlane/metadata/android/fi-FI/changelogs/2.txt new file mode 100644 index 00000000..20bcec13 --- /dev/null +++ b/fastlane/metadata/android/fi-FI/changelogs/2.txt @@ -0,0 +1,2 @@ +* Pieniä korjauksia ja parannuksia. +* Lisätty käännöksiä diff --git a/fastlane/metadata/android/fi-FI/short_description.txt b/fastlane/metadata/android/fi-FI/short_description.txt new file mode 100644 index 00000000..66a4200a --- /dev/null +++ b/fastlane/metadata/android/fi-FI/short_description.txt @@ -0,0 +1 @@ +Mainosvapaa avoimen lähdekoodin SMS/MMS viestien lähettämisen sovellus diff --git a/fastlane/metadata/android/fi-FI/title.txt b/fastlane/metadata/android/fi-FI/title.txt new file mode 100644 index 00000000..1d5049dd --- /dev/null +++ b/fastlane/metadata/android/fi-FI/title.txt @@ -0,0 +1 @@ +Fossify SMS Messenger diff --git a/fastlane/metadata/android/hi-IN/changelogs/2.txt b/fastlane/metadata/android/hi-IN/changelogs/2.txt new file mode 100644 index 00000000..bfcbc37c --- /dev/null +++ b/fastlane/metadata/android/hi-IN/changelogs/2.txt @@ -0,0 +1,2 @@ +* छोटे बग फिक्स और सुधार +* कुछ अनुवाद जोड़े गए diff --git a/fastlane/metadata/android/hi-IN/title.txt b/fastlane/metadata/android/hi-IN/title.txt index 52ffa4cb..1d5049dd 100644 --- a/fastlane/metadata/android/hi-IN/title.txt +++ b/fastlane/metadata/android/hi-IN/title.txt @@ -1 +1 @@ -Fossify SMS मैसेंजर +Fossify SMS Messenger diff --git a/fastlane/metadata/android/hu-HU/changelogs/1.txt b/fastlane/metadata/android/hu-HU/changelogs/1.txt new file mode 100644 index 00000000..7a38c34e --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/1.txt @@ -0,0 +1 @@ +* Kezdeti kiadás diff --git a/fastlane/metadata/android/id/changelogs/1.txt b/fastlane/metadata/android/id/changelogs/1.txt new file mode 100644 index 00000000..379b024b --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1.txt @@ -0,0 +1 @@ +* Rilis awal diff --git a/fastlane/metadata/android/it-IT/changelogs/1.txt b/fastlane/metadata/android/it-IT/changelogs/1.txt new file mode 100644 index 00000000..44bd2bb2 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/1.txt @@ -0,0 +1 @@ +* Versione iniziale diff --git a/fastlane/metadata/android/ja-JP/changelogs/1.txt b/fastlane/metadata/android/ja-JP/changelogs/1.txt new file mode 100644 index 00000000..5d91ad87 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/1.txt @@ -0,0 +1 @@ +* 初公開 diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt new file mode 100644 index 00000000..591b1b16 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/short_description.txt @@ -0,0 +1 @@ +オープンソースで広告なしのSMS/MMSメッセージングアプリ diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt new file mode 100644 index 00000000..1109b22a --- /dev/null +++ b/fastlane/metadata/android/ja-JP/title.txt @@ -0,0 +1 @@ +Fossify SMSメッセンジャー diff --git a/fastlane/metadata/android/ko-KR/short_description.txt b/fastlane/metadata/android/ko-KR/short_description.txt new file mode 100644 index 00000000..4b67ba62 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/short_description.txt @@ -0,0 +1 @@ +오픈 소스이며 광고로부터 자유로운 SMS/MMS 메시징 앱 diff --git a/fastlane/metadata/android/ko-KR/title.txt b/fastlane/metadata/android/ko-KR/title.txt new file mode 100644 index 00000000..820fc01d --- /dev/null +++ b/fastlane/metadata/android/ko-KR/title.txt @@ -0,0 +1 @@ +Fossify SMS 메신저 diff --git a/fastlane/metadata/android/nl-NL/changelogs/1.txt b/fastlane/metadata/android/nl-NL/changelogs/1.txt new file mode 100644 index 00000000..f324ac48 --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/1.txt @@ -0,0 +1 @@ +* Eerste versie diff --git a/fastlane/metadata/android/nl-NL/short_description.txt b/fastlane/metadata/android/nl-NL/short_description.txt index eee1cf8e..7037345d 100644 --- a/fastlane/metadata/android/nl-NL/short_description.txt +++ b/fastlane/metadata/android/nl-NL/short_description.txt @@ -1 +1 @@ -Open-source en advertentievrij SMS/MMS-berichtenbeheer +Opensource en advertentievrij SMS/MMS-berichtenbeheer diff --git a/fastlane/metadata/android/pl-PL/short_description.txt b/fastlane/metadata/android/pl-PL/short_description.txt index cf793781..b4680569 100644 --- a/fastlane/metadata/android/pl-PL/short_description.txt +++ b/fastlane/metadata/android/pl-PL/short_description.txt @@ -1 +1 @@ -Otwartoźródłowa i wolna od reklam aplikacja do przesyłania wiadomości SMS/MMS. +Otwartoźródłowa i wolna od reklam aplikacja do przesyłania wiadomości SMS/MMS diff --git a/fastlane/metadata/android/ro/changelogs/1.txt b/fastlane/metadata/android/ro/changelogs/1.txt index b7fd9657..6ea13320 100644 --- a/fastlane/metadata/android/ro/changelogs/1.txt +++ b/fastlane/metadata/android/ro/changelogs/1.txt @@ -1 +1 @@ -* Lansarea inițială +* Lansare inițială diff --git a/fastlane/metadata/android/ro/short_description.txt b/fastlane/metadata/android/ro/short_description.txt new file mode 100644 index 00000000..259ba523 --- /dev/null +++ b/fastlane/metadata/android/ro/short_description.txt @@ -0,0 +1 @@ +Aplicație pentru SMS/MMS cu sursă deschisă și fără anunțuri diff --git a/fastlane/metadata/android/tr-TR/changelogs/1.txt b/fastlane/metadata/android/tr-TR/changelogs/1.txt new file mode 100644 index 00000000..4b04c191 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1.txt @@ -0,0 +1 @@ +* İlk sürüm diff --git a/fastlane/metadata/android/tr-TR/changelogs/2.txt b/fastlane/metadata/android/tr-TR/changelogs/2.txt new file mode 100644 index 00000000..0e6a5abf --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/2.txt @@ -0,0 +1,2 @@ +* Küçük hata düzeltmeleri ve iyileştirmeler +* Bazı çeviriler eklendi diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt new file mode 100644 index 00000000..7c21a329 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/full_description.txt @@ -0,0 +1,36 @@ +Fossify SMS İleti, Sms iletigönderme deneyiminizi çeşitli şekillerde geliştirmek için tasarlanmış güvenilir SMS Haberleşme arkadaşınızdır. + +📱 KOLAYLIKLA BAĞLANTIDA KALIN: +Fossify SMS İleti ile sevdiklerinizle bağlantıda kalmak için zahmetsizce SMS ve MMS iletileri gönderebilirsiniz. SMS/MMS tabanlı grup haberleşmenin keyfini çıkarın ve kendinizi fotoğraflar, emojiler ve hızlı selamlamalarla ifade edin. + +🚫 İSTENMEYEN İLETİLERİ ENGELLEYİN: +Bilinmeyen kişilerden bile gelen istenmeyen iletileri kolayca engelleyen güçlü engelleme özelliği ile haberleşme deneyiminizin kontrolünü elinize alın. Ayrıca sorunsuz yedekleme için engellenen numaraları dışa ve içe aktarabilirsiniz. Ayrıca, belirli kelimeler veya ifadeler içeren iletilerin gelen kutunuza ulaşmasını engelleyerek deneyiminizi özelleştirin. + +🔒 ZAHMETSİZ SMS YEDEKLEME: +Önemli iletileri kaybetme endişesine elveda deyin. Fossify SMS İleti, iletiletilerinizi dışa ve içe aktarmanıza izin vererek kullanışlı SMS yedekleme işlevi sunar. Bu özellik, değerli konuşmalarınızı kaybetmeden kolayca cihaz değiştirebilmenizi sağlar. + +🚀 IŞIK HIZINDA VE HAFİF: +Güçlü özelliklerine rağmen, Fossify SMS İleti oldukça küçük bir uygulama boyutuna sahiptir, bu da indirmeyi ve yüklemeyi hızlı ve kolay hale getirir. SMS yedekleme ile gelen gönül rahatlığının tadını çıkarırken hız ve verimliliği deneyimleyin. + +🔐 GELİŞMİŞ GİZLİLİK: +Daha fazla gizlilik için kilit ekranınızda görünenleri özelleştirin. Yalnızca göndereni, ileti içeriğini veya hiçbir şeyi görüntülemeyi seçin. İletileriniz sizin kontrolünüzde. + +🔍 ETKİLİ İLETİ ARAMA: +Konuşmalar arasında sonsuz kaydırma yapmaya elveda deyin. Fossify SMS İleti, hızlı ve etkili bir arama özelliği ile ileti erişimini basitleştirir. İhtiyacınız olanı, ihtiyacınız olduğunda bulun. + +🌈 MODERN TASARIM VE KULLANICI DOSTU ARAYÜZ: +Kullanıcı dostu bir arayüz ile temiz, modern bir tasarımın keyfini çıkarın. Uygulama, görsel olarak çekici ve rahat bir kullanıcı deneyimi sağlayan materyal bir tasarıma ve koyu tema seçeneğine sahiptir. + +🌐 AÇIK KAYNAK ŞEFFAFLIĞI: +Gizliliğiniz en önemli önceliğimizdir. Fossify Sms İleti, internet bağlantısı gerektirmeden çalışarak ileti güvenliğini ve kararlılığını garanti eder. Uygulamamız tamamen reklamsızdır ve gereksiz izinler talep etmez. Dahası, tamamen açık kaynak kodludur ve güvenlik ve gizlilik denetimleri için kaynak koduna erişiminiz olduğundan içinizin rahat olmasını sağlar. + +Fossify SMS İletiler’e geçiş yapın ve haberleşmeyi olması gerektiği gibi deneyimleyin - özel, verimli ve kullanıcı dostu. Şimdi indirin ve mesajlaşma deneyiminizi korumaya kararlı topluluğumuza katılın. + +Daha fazla Fossify uygulaması keşfedin: +https://www.fossify.org +Açık Kaynak Kodu: +https://www.github.com/FossifyOrg +Reddit'teki topluluğa katılın: +https://www.reddit.com/r/Fossify +Telegram üzerinden bağlanın: +https://t.me/Fossify diff --git a/fastlane/metadata/android/tr-TR/short_description.txt b/fastlane/metadata/android/tr-TR/short_description.txt new file mode 100644 index 00000000..368b3c2c --- /dev/null +++ b/fastlane/metadata/android/tr-TR/short_description.txt @@ -0,0 +1 @@ +Açık kaynaklı ve Reklamsız SMS/MMS mesajlaşma uygulaması diff --git a/fastlane/metadata/android/tr-TR/title.txt b/fastlane/metadata/android/tr-TR/title.txt new file mode 100644 index 00000000..e898b354 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/title.txt @@ -0,0 +1 @@ +Fossify SMS İletiler diff --git a/fastlane/metadata/android/uk/changelogs/1.txt b/fastlane/metadata/android/uk/changelogs/1.txt new file mode 100644 index 00000000..cf2a5326 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1.txt @@ -0,0 +1 @@ +* Початковий випуск diff --git a/fastlane/metadata/android/uk/changelogs/2.txt b/fastlane/metadata/android/uk/changelogs/2.txt new file mode 100644 index 00000000..ef191db3 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/2.txt @@ -0,0 +1,2 @@ +* Виправлено незначні помилки та зроблено покращення +* Додано деякі переклади diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt new file mode 100644 index 00000000..b6defce9 --- /dev/null +++ b/fastlane/metadata/android/uk/full_description.txt @@ -0,0 +1,32 @@ +Fossify Месенджер – це ваш надійний компаньйон для обміну повідомленнями, розроблений, щоб покращити ваш досвід обміну повідомленнями різними способами. + +📱 ЗАЛИШАЙТЕСЯ НА ЗВ'ЯЗКУ З ЛЕГКІСТЮ: +За допомогою Fossify Месенджер ви можете легко надсилати SMS та MMS-повідомлення, щоб залишатися на зв'язку зі своїми близькими. Насолоджуйтесь груповими повідомленнями на основі SMS/MMS та виражайте себе за допомогою фотографій, емоджі та швидких привітань. + +🚫 БЛОКУЙТЕ НЕБАЖАНІ ПОВІДОМЛЕННЯ: +Контролюйте обмін повідомленнями за допомогою надійної функції блокування, яка легко запобігає отриманню небажаних повідомлень, навіть від невідомих контактів. Ви також можете експортувати та імпортувати заблоковані номери для зручного резервного копіювання. Крім того, ви можете налаштувати свій досвід, запобігаючи отриманню повідомлень з певними словами або фразами у вашій поштовій скриньці. + +🔒 РЕЗЕРВНЕ КОПІЮВАННЯ СМС БЕЗ ЗАЙВИХ ЗУСИЛЬ: +Попрощайтеся із занепокоєнням про втрату важливих повідомлень. Fossify Месенджер пропонує зручну функцію резервного копіювання SMS, дозволяючи вам експортувати та імпортувати ваші повідомлення. Ця функція гарантує, що ви зможете легко переходити з одного пристрою на інший, не втрачаючи цінних розмов. + +🚀 БЛИСКАВИЧНО ШВИДКИЙ І ЛЕГКИЙ: +Попри свої потужні функції, Fossify Месенджер може похвалитися надзвичайно малим розміром, що робить його швидким і простим у завантаженні та встановленні. Відчуйте швидкість та ефективність, насолоджуючись душевним спокоєм, який приходить з резервним копіюванням SMS. + +🔐 ПОКРАЩЕНА ПРИВАТНІСТЬ: +Налаштуйте те, що показується на екрані блокування, для додаткової приватності. Вибирайте, щоби показувати тільки відправника, вміст повідомлення або взагалі нічого. Ви можете контролювати свої повідомлення. + +🔍 ЕФЕКТИВНИЙ ПОШУК ПОВІДОМЛЕНЬ: +Попрощайтеся з нескінченною прокруткою розмов. Fossify Месенджер спрощує пошук повідомлень завдяки швидкій та ефективній функції пошуку. Знаходьте те, що вам потрібно, коли вам це потрібно. + +🌈 СУЧАСНИЙ ДИЗАЙН ТА ЗРУЧНИЙ ІНТЕРФЕЙС: +Насолоджуйтесь чистим, сучасним дизайном та зручним інтерфейсом. Застосунок має матеріальний дизайн та темну тему, що забезпечує візуально привабливий та комфортний користувацький досвід. + +🌐 ПРОЗОРІСТЬ З ВІДКРИТИМ ВИХІДНИМ КОДОМ: +Ваша приватність є головним пріоритетом. Fossify Месенджер працює без з'єднання з мережею, гарантуючи безпеку та стабільність повідомлень. Наш застосунок не має і не запитує непотрібних дозволів. Більше того, він повністю відкритий, що дає вам спокій, оскільки ви маєте доступ до вихідного коду для аудиту безпеки та приватності. + +Переходьте на Fossify Месенджер і відчуйте, що обмін повідомленнями має бути таким, яким він має бути: приватним, ефективним і зручним для користувача. Завантажуйте зараз і приєднуйтесь до нашої спільноти, яка прагне захистити ваш досвід обміну повідомленнями. + +Дізнайтеся більше про застосунки Fossify: https://www.fossify.org +Відкритий код: https://www.github.com/FossifyOrg +Приєднуйтесь до спільноти на Reddit: https://www.reddit.com/r/Fossify +Приєднуйтесь у Telegram: https://t.me/Fossify diff --git a/fastlane/metadata/android/uk/short_description.txt b/fastlane/metadata/android/uk/short_description.txt new file mode 100644 index 00000000..d926a763 --- /dev/null +++ b/fastlane/metadata/android/uk/short_description.txt @@ -0,0 +1 @@ +Застосунок для SMS/MMS повідомлень з відкритим вихідним кодом і без реклами diff --git a/fastlane/metadata/android/uk/title.txt b/fastlane/metadata/android/uk/title.txt new file mode 100644 index 00000000..ac71a28a --- /dev/null +++ b/fastlane/metadata/android/uk/title.txt @@ -0,0 +1 @@ +Fossify SMS-месенджер diff --git a/fastlane/metadata/android/zh-CN/changelogs/1.txt b/fastlane/metadata/android/zh-CN/changelogs/1.txt new file mode 100644 index 00000000..ebac50d2 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/1.txt @@ -0,0 +1 @@ +* 首次发布 diff --git a/fastlane/metadata/android/zh-CN/changelogs/2.txt b/fastlane/metadata/android/zh-CN/changelogs/2.txt new file mode 100644 index 00000000..b29cce93 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/2.txt @@ -0,0 +1,2 @@ +* 小错误修复和改进 +* 添加了一些翻译 diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt new file mode 100644 index 00000000..463abb9f --- /dev/null +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -0,0 +1,32 @@ +Fossify 信息是您值得信赖的消息传递伴侣,旨在以多种方式增强您的消息传递体验。 + +📱 轻松保持联系: +使用 Fossify 信息,您可以轻松发送短信和彩信,与亲人保持联系。享受基于短信/彩信的群组消息传递,用照片、表情符号和快速问候来表达自己。 + +🚫 阻止不需要的消息: +通过强大的阻止功能控制您的消息传递体验,轻松阻止不需要的消息,甚至来自未知联系人的消息。您还可以导出和导入被阻止的号码,以便轻松备份。此外,通过阻止带有特定单词或短语的消息到达您的收信箱来定制您的体验。 + +🔒 轻松备份短信: +告别丢失重要信息的担忧。Fossify 信息提供方便的短信备份功能,允许您导出和导入消息。此功能可确保您可以轻松切换设备,而不会丢失宝贵的对话。 + +🚀 快速轻量: +尽管 Fossify 信息功能强大,但应用体积却非常小,使其下载和安装快速简单。体验速度和效率,同时享受短信备份带来的安心。 + +🔐 增强隐私: +自定义锁屏上显示的内容,以增加隐私。选择仅显示发送者、消息内容或根本不显示。您的消息由您控制。 + +🔍 高效的消息搜索: +告别无休止地浏览对话。Fossify 信息通过快速高效的搜索功能简化了消息检索。在您需要时找到您需要的内容。 + +🌈 现代设计和用户友好的界面: +享受简洁、现代的设计和用户友好的界面。本应用具有 Material 设计和深色主题选项,提供视觉上吸引人和舒适的用户体验。 + +🌐 开源透明度: +您的隐私是重中之重。Fossify 信息无需互联网连接即可运行,保证了消息的安全性和稳定性。我们的应用完全没有广告,也不会请求不必要的权限。此外,它是完全开源的,让您放心,因为您可以访问源代码进行安全和隐私审核。 + +切换到 Fossify 信息,以应有的方式体验消息传递——私密、高效和用户友好。立即下载并加入我们致力于保护您的消息传递体验的社区。 + +探索更多 Fossify 应用:https://www.fossify.org +开源代码:https://www.github.com/FossifyOrg +加入 Reddit 社区:https://www.reddit.com/r/Fossify +在 Telegram 上联系:https://t.me/Fossify diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt new file mode 100644 index 00000000..6ef89abe --- /dev/null +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -0,0 +1 @@ +开源无广告的短信/彩信应用 diff --git a/fastlane/metadata/android/zh-CN/title.txt b/fastlane/metadata/android/zh-CN/title.txt new file mode 100644 index 00000000..c5894354 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/title.txt @@ -0,0 +1 @@ +Fossify 信息 diff --git a/fastlane/metadata/android/zh-TW/changelogs/2.txt b/fastlane/metadata/android/zh-TW/changelogs/2.txt new file mode 100644 index 00000000..777d3fb3 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/2.txt @@ -0,0 +1 @@ +* 新增一些翻譯 diff --git a/fastlane/metadata/android/zh-TW/short_description.txt b/fastlane/metadata/android/zh-TW/short_description.txt new file mode 100644 index 00000000..dc1fcf92 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/short_description.txt @@ -0,0 +1 @@ +開放原始碼且無廣告的 SMS/MMS 通訊應用程式 diff --git a/fastlane/metadata/android/zh-TW/title.txt b/fastlane/metadata/android/zh-TW/title.txt new file mode 100644 index 00000000..a842db4b --- /dev/null +++ b/fastlane/metadata/android/zh-TW/title.txt @@ -0,0 +1 @@ +Fossify SMS 簡訊 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2f914e8..52208bbd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,6 +4,8 @@ kotlin = "1.9.21" kotlinxSerializationJson = "1.6.0" #KSP ksp = "1.9.21-1.0.16" +#Detekt +detekt = "1.23.3" #AndroidX androidx-constraintlayout = "2.1.4" androidx-swiperefreshlayout = "1.1.0" @@ -61,3 +63,4 @@ android = { id = "com.android.application", version.ref = "gradlePlugins-agp" } kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }