From c425db736f7699065e3d3100cab8713b97ab7ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Sat, 28 Sep 2024 12:36:38 +0200 Subject: [PATCH] Add reusable workflows for PRs and testing builds --- .github/workflows/pr.yml | 9 + .github/workflows/testing-build.yml | 10 + app/build.gradle.kts | 9 +- app/detekt-baseline.xml | 428 ++++++ app/lint-baseline.xml | 2178 +++++++++++++++++++++++++++ build.gradle.kts | 1 + gradle/libs.versions.toml | 3 + 7 files changed, 2637 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/testing-build.yml create mode 100644 app/detekt-baseline.xml create mode 100644 app/lint-baseline.xml 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/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/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" }