chore: bump target SDK version to 35 (#471)

* chore: bump target SDK version to 35

* fix: address nullability issues

* chore: bump target SDK version to 36

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: update edge-to-edge implementation

* refactor: migrate away from deprecated onBackPressed()

* chore(deps): update org.fossify.commons to 5.5.0

* docs: update changelog

* fix: add missing dependencies

* chore: update lint baselines
This commit is contained in:
Naveen Singh 2025-10-26 22:58:17 +05:30 committed by GitHub
parent f3408f1f9a
commit c91ce9560d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 400 additions and 415 deletions

View file

@ -5,7 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
### Changed ### Changed
- Compatibility updates for Android 15 & 16
- Calling now works directly without launching dialpad ([#562]) - Calling now works directly without launching dialpad ([#562])
## [1.5.0] - 2025-10-18 ## [1.5.0] - 2025-10-18

View file

@ -144,6 +144,7 @@ dependencies {
implementation(libs.mmslib) implementation(libs.mmslib)
implementation(libs.androidx.swiperefreshlayout) implementation(libs.androidx.swiperefreshlayout)
implementation(libs.androidx.constraintlayout) implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.documentfile)
implementation(libs.androidx.lifecycle.process) implementation(libs.androidx.lifecycle.process)
implementation(libs.ez.vcard) implementation(libs.ez.vcard)
implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.json)

View file

@ -47,13 +47,6 @@
<ID>MagicNumber:ImageCompressor.kt$ImageCompressor$8</ID> <ID>MagicNumber:ImageCompressor.kt$ImageCompressor$8</ID>
<ID>MagicNumber:ImageCompressor.kt$ImageCompressor$90f</ID> <ID>MagicNumber:ImageCompressor.kt$ImageCompressor$90f</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$30</ID> <ID>MagicNumber:MainActivity.kt$MainActivity$30</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$3</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$4</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$5</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$6</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$7</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$8</ID>
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.&lt;no name provided&gt;$9</ID>
<ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$23</ID> <ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$23</ID>
<ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$5</ID> <ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$5</ID>
<ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$59</ID> <ID>MagicNumber:ScheduleMessageDialog.kt$ScheduleMessageDialog$59</ID>
@ -134,6 +127,7 @@
<ID>MaxLineLength:SmsReceiver.kt$SmsReceiver$val participant = SimpleContact(0, 0, senderName, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList())</ID> <ID>MaxLineLength:SmsReceiver.kt$SmsReceiver$val participant = SimpleContact(0, 0, senderName, photoUri, arrayListOf(phoneNumber), ArrayList(), ArrayList())</ID>
<ID>MaxLineLength:SmsSender.kt$SmsSender$val intent = Intent(SendStatusReceiver.SMS_DELIVERED_ACTION, requestUri, app, SmsStatusDeliveredReceiver::class.java)</ID> <ID>MaxLineLength:SmsSender.kt$SmsSender$val intent = Intent(SendStatusReceiver.SMS_DELIVERED_ACTION, requestUri, app, SmsStatusDeliveredReceiver::class.java)</ID>
<ID>MaxLineLength:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$// TODO: Need to check whether SC still trying to deliver the SMS to destination and will send the report again?</ID> <ID>MaxLineLength:SmsStatusDeliveredReceiver.kt$SmsStatusDeliveredReceiver$// TODO: Need to check whether SC still trying to deliver the SMS to destination and will send the report again?</ID>
<ID>MaxLineLength:ThreadActivity.kt$ThreadActivity$// check keyboard height just to be sure, 150 seems like a good middle ground between ime and navigation bar</ID>
<ID>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,</ID> <ID>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,</ID>
<ID>MaxLineLength:ThreadActivity.kt$ThreadActivity$if</ID> <ID>MaxLineLength:ThreadActivity.kt$ThreadActivity$if</ID>
<ID>MaxLineLength:ThreadActivity.kt$ThreadActivity$privateContacts.firstOrNull { it.doesHavePhoneNumber(participant.phoneNumbers.first().normalizedNumber) }</ID> <ID>MaxLineLength:ThreadActivity.kt$ThreadActivity$privateContacts.firstOrNull { it.doesHavePhoneNumber(participant.phoneNumbers.first().normalizedNumber) }</ID>
@ -149,7 +143,6 @@
<ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Note -&gt; VCardPropertyWrapper(value, context.getString(org.fossify.commons.R.string.notes), property)</ID> <ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Note -&gt; VCardPropertyWrapper(value, context.getString(org.fossify.commons.R.string.notes), property)</ID>
<ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Telephone -&gt; VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property)</ID> <ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Telephone -&gt; VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property)</ID>
<ID>MaxLineLength:VCard.kt$VCardWrapper$data</ID> <ID>MaxLineLength:VCard.kt$VCardWrapper$data</ID>
<ID>MaxLineLength:VCardViewerActivity.kt$VCardViewerActivity$updateMaterialActivityViews(binding.vcardViewerCoordinator, binding.contactsList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:VCardViewerAdapter.kt$VCardViewerAdapter.VCardPropertyViewHolder$inner</ID> <ID>MaxLineLength:VCardViewerAdapter.kt$VCardViewerAdapter.VCardPropertyViewHolder$inner</ID>
<ID>NestedBlockDepth:AttachmentUtils.kt$AttachmentUtils$private fun readBody(parser: XmlPullParser): List&lt;String&gt;</ID> <ID>NestedBlockDepth:AttachmentUtils.kt$AttachmentUtils$private fun readBody(parser: XmlPullParser): List&lt;String&gt;</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.getThreadParticipants( threadId: Long, contactsMap: HashMap&lt;Int, SimpleContact&gt;?, ): ArrayList&lt;SimpleContact&gt;</ID> <ID>NestedBlockDepth:Context.kt$fun Context.getThreadParticipants( threadId: Long, contactsMap: HashMap&lt;Int, SimpleContact&gt;?, ): ArrayList&lt;SimpleContact&gt;</ID>

File diff suppressed because it is too large Load diff

View file

@ -33,27 +33,22 @@ class ArchivedConversationsActivity : SimpleActivity() {
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
setupOptionsMenu() setupOptionsMenu()
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.conversationsList))
mainCoordinatorLayout = binding.archiveCoordinator, setupMaterialScrollListener(
nestedView = binding.conversationsList, scrollingView = binding.conversationsList,
useTransparentNavigation = true, topAppBar = binding.archiveAppbar
useTopSearchMenu = false
) )
setupMaterialScrollListener(scrollingView = binding.conversationsList, toolbar = binding.archiveToolbar)
loadArchivedConversations() loadArchivedConversations()
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.archiveToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.archiveAppbar, NavigationIcon.Arrow)
updateMenuColors()
loadArchivedConversations() loadArchivedConversations()
} }
@ -79,10 +74,6 @@ class ArchivedConversationsActivity : SimpleActivity() {
} }
} }
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
}
private fun loadArchivedConversations() { private fun loadArchivedConversations() {
ensureBackgroundThread { ensureBackgroundThread {
val conversations = try { val conversations = try {

View file

@ -43,19 +43,13 @@ class ConversationDetailsActivity : SimpleActivity() {
private val binding by viewBinding(ActivityConversationDetailsBinding::inflate) private val binding by viewBinding(ActivityConversationDetailsBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
updateMaterialActivityViews( setupEdgeToEdge(padBottomSystem = listOf(binding.conversationDetailsNestedScrollview))
mainCoordinatorLayout = binding.conversationDetailsCoordinator,
nestedView = binding.participantsRecyclerview,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener( setupMaterialScrollListener(
scrollingView = binding.conversationDetailsNestedScrollview, scrollingView = binding.conversationDetailsNestedScrollview,
toolbar = binding.conversationDetailsToolbar topAppBar = binding.conversationDetailsAppbar,
) )
threadId = intent.getLongExtra(THREAD_ID, 0L) threadId = intent.getLongExtra(THREAD_ID, 0L)
@ -77,7 +71,7 @@ class ConversationDetailsActivity : SimpleActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.conversationDetailsToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.conversationDetailsAppbar, NavigationIcon.Arrow)
updateTextColors(binding.conversationDetailsHolder) updateTextColors(binding.conversationDetailsHolder)
val primaryColor = getProperPrimaryColor() val primaryColor = getProperPrimaryColor()

View file

@ -32,7 +32,6 @@ import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperPrimaryColor import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getProperTextColor import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.hideKeyboard import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.openNotificationSettings import org.fossify.commons.extensions.openNotificationSettings
import org.fossify.commons.extensions.toast import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.underlineText import org.fossify.commons.extensions.underlineText
@ -77,6 +76,8 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
class MainActivity : SimpleActivity() { class MainActivity : SimpleActivity() {
override var isSearchBarEnabled = true
private val MAKE_DEFAULT_APP_REQUEST = 1 private val MAKE_DEFAULT_APP_REQUEST = 1
private var storedTextColor = 0 private var storedTextColor = 0
@ -88,19 +89,13 @@ class MainActivity : SimpleActivity() {
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() refreshMenuItems()
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.conversationsList))
mainCoordinatorLayout = binding.mainCoordinator,
nestedView = binding.conversationsList,
useTransparentNavigation = true,
useTopSearchMenu = true
)
checkAndDeleteOldRecycleBinMessages() checkAndDeleteOldRecycleBinMessages()
clearAllMessagesIfNeeded { clearAllMessagesIfNeeded {
@ -139,9 +134,6 @@ class MainActivity : SimpleActivity() {
binding.conversationsProgressBar.setIndicatorColor(properPrimaryColor) binding.conversationsProgressBar.setIndicatorColor(properPrimaryColor)
binding.conversationsProgressBar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) binding.conversationsProgressBar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA)
checkShortcut() checkShortcut()
(binding.conversationsFab.layoutParams as? CoordinatorLayout.LayoutParams)?.bottomMargin =
navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.activity_margin)
.toInt()
} }
override fun onPause() { override fun onPause() {
@ -154,17 +146,18 @@ class MainActivity : SimpleActivity() {
bus?.unregister(this) bus?.unregister(this)
} }
override fun onBackPressed() { override fun onBackPressedCompat(): Boolean {
if (binding.mainMenu.isSearchOpen) { return if (binding.mainMenu.isSearchOpen) {
binding.mainMenu.closeSearch() binding.mainMenu.closeSearch()
true
} else { } else {
appLockManager.lock() appLockManager.lock()
super.onBackPressed() false
} }
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
binding.mainMenu.getToolbar().inflateMenu(R.menu.menu_main) binding.mainMenu.requireToolbar().inflateMenu(R.menu.menu_main)
binding.mainMenu.toggleHideOnScroll(true) binding.mainMenu.toggleHideOnScroll(true)
binding.mainMenu.setupMenu() binding.mainMenu.setupMenu()
@ -183,7 +176,7 @@ class MainActivity : SimpleActivity() {
searchTextChanged(text) searchTextChanged(text)
} }
binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem -> binding.mainMenu.requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.show_recycle_bin -> launchRecycleBin() R.id.show_recycle_bin -> launchRecycleBin()
R.id.show_archived -> launchArchivedConversations() R.id.show_archived -> launchArchivedConversations()
@ -196,7 +189,7 @@ class MainActivity : SimpleActivity() {
} }
private fun refreshMenuItems() { private fun refreshMenuItems() {
binding.mainMenu.getToolbar().menu.apply { binding.mainMenu.requireToolbar().menu.apply {
findItem(R.id.show_recycle_bin).isVisible = config.useRecycleBin findItem(R.id.show_recycle_bin).isVisible = config.useRecycleBin
findItem(R.id.show_archived).isVisible = config.isArchiveAvailable findItem(R.id.show_archived).isVisible = config.isArchiveAvailable
} }
@ -219,7 +212,6 @@ class MainActivity : SimpleActivity() {
} }
private fun updateMenuColors() { private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
binding.mainMenu.updateColors() binding.mainMenu.updateColors()
} }

View file

@ -34,21 +34,15 @@ class ManageBlockedKeywordsActivity : SimpleActivity(), RefreshRecyclerViewListe
private val binding by viewBinding(ActivityManageBlockedKeywordsBinding::inflate) private val binding by viewBinding(ActivityManageBlockedKeywordsBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
updateBlockedKeywords() updateBlockedKeywords()
setupOptionsMenu() setupOptionsMenu()
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.manageBlockedKeywordsList))
mainCoordinatorLayout = binding.blockKeywordsCoordinator,
nestedView = binding.manageBlockedKeywordsList,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener( setupMaterialScrollListener(
scrollingView = binding.manageBlockedKeywordsList, scrollingView = binding.manageBlockedKeywordsList,
toolbar = binding.blockKeywordsToolbar topAppBar = binding.blockKeywordsAppbar
) )
updateTextColors(binding.manageBlockedKeywordsWrapper) updateTextColors(binding.manageBlockedKeywordsWrapper)
@ -63,7 +57,7 @@ class ManageBlockedKeywordsActivity : SimpleActivity(), RefreshRecyclerViewListe
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.blockKeywordsToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.blockKeywordsAppbar, NavigationIcon.Arrow)
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {

View file

@ -57,21 +57,15 @@ class NewConversationActivity : SimpleActivity() {
private val binding by viewBinding(ActivityNewConversationBinding::inflate) private val binding by viewBinding(ActivityNewConversationBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
title = getString(R.string.new_conversation) title = getString(R.string.new_conversation)
updateTextColors(binding.newConversationHolder) updateTextColors(binding.newConversationHolder)
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.contactsList))
mainCoordinatorLayout = binding.newConversationCoordinator,
nestedView = binding.contactsList,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener( setupMaterialScrollListener(
scrollingView = binding.contactsList, scrollingView = binding.contactsList,
toolbar = binding.newConversationToolbar topAppBar = binding.newConversationAppbar
) )
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
@ -85,7 +79,7 @@ class NewConversationActivity : SimpleActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.newConversationToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.newConversationAppbar, NavigationIcon.Arrow)
binding.noContactsPlaceholder2.setTextColor(getProperPrimaryColor()) binding.noContactsPlaceholder2.setTextColor(getProperPrimaryColor())
binding.noContactsPlaceholder2.underlineText() binding.noContactsPlaceholder2.underlineText()
binding.suggestionsLabel.setTextColor(getProperPrimaryColor()) binding.suggestionsLabel.setTextColor(getProperPrimaryColor())

View file

@ -7,7 +7,6 @@ import org.fossify.commons.dialogs.ConfirmationDialog
import org.fossify.commons.extensions.areSystemAnimationsEnabled import org.fossify.commons.extensions.areSystemAnimationsEnabled
import org.fossify.commons.extensions.beGoneIf import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beVisibleIf import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.hideKeyboard import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.viewBinding import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.NavigationIcon import org.fossify.commons.helpers.NavigationIcon
@ -33,20 +32,14 @@ class RecycleBinConversationsActivity : SimpleActivity() {
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
setupOptionsMenu() setupOptionsMenu()
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.conversationsList))
mainCoordinatorLayout = binding.recycleBinCoordinator,
nestedView = binding.conversationsList,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener( setupMaterialScrollListener(
scrollingView = binding.conversationsList, scrollingView = binding.conversationsList,
toolbar = binding.recycleBinToolbar topAppBar = binding.recycleBinAppbar
) )
loadRecycleBinConversations() loadRecycleBinConversations()
@ -54,9 +47,7 @@ class RecycleBinConversationsActivity : SimpleActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.recycleBinToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.recycleBinAppbar, NavigationIcon.Arrow)
updateMenuColors()
loadRecycleBinConversations() loadRecycleBinConversations()
} }
@ -82,10 +73,6 @@ class RecycleBinConversationsActivity : SimpleActivity() {
} }
} }
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
}
private fun loadRecycleBinConversations() { private fun loadRecycleBinConversations() {
ensureBackgroundThread { ensureBackgroundThread {
val conversations = try { val conversations = try {

View file

@ -85,25 +85,19 @@ class SettingsActivity : SimpleActivity() {
private val binding by viewBinding(ActivitySettingsBinding::inflate) private val binding by viewBinding(ActivitySettingsBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
updateMaterialActivityViews( setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.settingsNestedScrollview))
mainCoordinatorLayout = binding.settingsCoordinator,
nestedView = binding.settingsHolder,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener( setupMaterialScrollListener(
scrollingView = binding.settingsNestedScrollview, scrollingView = binding.settingsNestedScrollview,
toolbar = binding.settingsToolbar topAppBar = binding.settingsAppbar
) )
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.settingsAppbar, NavigationIcon.Arrow)
setupCustomizeColors() setupCustomizeColors()
setupCustomizeNotifications() setupCustomizeNotifications()

View file

@ -45,7 +45,9 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsAnimationCompat import androidx.core.view.WindowInsetsAnimationCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.doOnLayout
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -74,6 +76,7 @@ import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getProperTextColor import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getTextSize import org.fossify.commons.extensions.getTextSize
import org.fossify.commons.extensions.hideKeyboard import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.insetsController
import org.fossify.commons.extensions.isDynamicTheme import org.fossify.commons.extensions.isDynamicTheme
import org.fossify.commons.extensions.isOrWasThankYouInstalled import org.fossify.commons.extensions.isOrWasThankYouInstalled
import org.fossify.commons.extensions.isVisible import org.fossify.commons.extensions.isVisible
@ -237,19 +240,18 @@ class ThreadActivity : SimpleActivity() {
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() refreshMenuItems()
setupEdgeToEdge(
updateMaterialActivityViews( padBottomImeAndSystem = listOf(
mainCoordinatorLayout = binding.threadCoordinator, binding.messageHolder.root,
nestedView = null, binding.shortCodeHolder.root
useTransparentNavigation = false, )
useTopSearchMenu = false
) )
setupMaterialScrollListener(null, binding.threadToolbar) setupMessagingEdgeToEdge()
setupMaterialScrollListener(null, binding.threadAppbar)
val extras = intent.extras val extras = intent.extras
if (extras == null) { if (extras == null) {
@ -270,17 +272,16 @@ class ThreadActivity : SimpleActivity() {
loadConversation() loadConversation()
setupAttachmentPickerView() setupAttachmentPickerView()
setupKeyboardListener()
hideAttachmentPicker() hideAttachmentPicker()
maybeSetupRecycleBinView() maybeSetupRecycleBinView()
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar( setupTopAppBar(
toolbar = binding.threadToolbar, topAppBar = binding.threadAppbar,
toolbarNavigationIcon = NavigationIcon.Arrow, navigationIcon = NavigationIcon.Arrow,
statusBarColor = getProperBackgroundColor() topBarColor = getProperBackgroundColor()
) )
isActivityVisible = true isActivityVisible = true
@ -310,7 +311,6 @@ class ThreadActivity : SimpleActivity() {
val bottomBarColor = getBottomBarColor() val bottomBarColor = getBottomBarColor()
binding.messageHolder.root.setBackgroundColor(bottomBarColor) binding.messageHolder.root.setBackgroundColor(bottomBarColor)
binding.shortCodeHolder.root.setBackgroundColor(bottomBarColor) binding.shortCodeHolder.root.setBackgroundColor(bottomBarColor)
updateNavigationBarColor(bottomBarColor)
} }
override fun onPause() { override fun onPause() {
@ -325,12 +325,13 @@ class ThreadActivity : SimpleActivity() {
saveDraftMessage() saveDraftMessage()
} }
override fun onBackPressed() { override fun onBackPressedCompat(): Boolean {
isAttachmentPickerVisible = false isAttachmentPickerVisible = false
if (binding.messageHolder.attachmentPickerHolder.isVisible()) { return if (binding.messageHolder.attachmentPickerHolder.isVisible()) {
hideAttachmentPicker() hideAttachmentPicker()
true
} else { } else {
super.onBackPressed() false
} }
} }
@ -911,15 +912,16 @@ class ThreadActivity : SimpleActivity() {
threadAddAttachment.setOnClickListener { threadAddAttachment.setOnClickListener {
if (attachmentPickerHolder.isVisible()) { if (attachmentPickerHolder.isVisible()) {
isAttachmentPickerVisible = false isAttachmentPickerVisible = false
WindowCompat.getInsetsController(window, threadTypeMessage) hideAttachmentPicker()
window.insetsController(binding.messageHolder.threadTypeMessage)
.show(WindowInsetsCompat.Type.ime()) .show(WindowInsetsCompat.Type.ime())
} else { } else {
isAttachmentPickerVisible = true isAttachmentPickerVisible = true
showOrHideAttachmentPicker() showAttachmentPicker()
WindowCompat.getInsetsController(window, threadTypeMessage) window.insetsController(binding.messageHolder.threadTypeMessage)
.hide(WindowInsetsCompat.Type.ime()) .hide(WindowInsetsCompat.Type.ime())
} }
window.decorView.requestApplyInsets() binding.messageHolder.threadTypeMessage.requestApplyInsets()
} }
if (intent.extras?.containsKey(THREAD_ATTACHMENT_URI) == true) { if (intent.extras?.containsKey(THREAD_ATTACHMENT_URI) == true) {
@ -2060,54 +2062,37 @@ class ThreadActivity : SimpleActivity() {
.start() .start()
} }
private fun setupKeyboardListener() {
window.decorView.setOnApplyWindowInsetsListener { view, insets ->
showOrHideAttachmentPicker()
view.onApplyWindowInsets(insets)
}
val callback =
object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) {
override fun onPrepare(animation: WindowInsetsAnimationCompat) {
super.onPrepare(animation)
showOrHideAttachmentPicker()
}
override fun onProgress(
insets: WindowInsetsCompat,
runningAnimations: MutableList<WindowInsetsAnimationCompat>,
) = insets
}
ViewCompat.setWindowInsetsAnimationCallback(window.decorView, callback)
}
private fun showOrHideAttachmentPicker() {
val type = WindowInsetsCompat.Type.ime()
val insets = ViewCompat.getRootWindowInsets(window.decorView) ?: return
val isKeyboardVisible = insets.isVisible(type)
if (isKeyboardVisible) {
val keyboardHeight = insets.getInsets(type).bottom
val bottomBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
// check keyboard height just to be sure, 150 seems like a good middle ground between ime and navigation bar
config.keyboardHeight = if (keyboardHeight > 150) {
keyboardHeight - bottomBarHeight
} else {
getDefaultKeyboardHeight()
}
hideAttachmentPicker()
} else if (isAttachmentPickerVisible) {
showAttachmentPicker()
}
}
private fun getBottomBarColor() = if (isDynamicTheme()) { private fun getBottomBarColor() = if (isDynamicTheme()) {
resources.getColor(org.fossify.commons.R.color.you_bottom_bar_color) resources.getColor(org.fossify.commons.R.color.you_bottom_bar_color)
} else { } else {
getBottomNavigationBackgroundColor() getBottomNavigationBackgroundColor()
} }
fun setupMessagingEdgeToEdge() {
ViewCompat.setOnApplyWindowInsetsListener(
binding.messageHolder.threadTypeMessage
) { view, insets ->
val type = WindowInsetsCompat.Type.ime()
val isKeyboardVisible = insets.isVisible(type)
if (isKeyboardVisible) {
val keyboardHeight = insets.getInsets(type).bottom
val bottomBarHeight = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom
// check keyboard height just to be sure, 150 seems like a good middle ground between ime and navigation bar
config.keyboardHeight = if (keyboardHeight > 150) {
keyboardHeight - bottomBarHeight
} else {
getDefaultKeyboardHeight()
}
hideAttachmentPicker()
} else if (isAttachmentPickerVisible) {
showAttachmentPicker()
}
insets
}
}
companion object { companion object {
private const val TYPE_EDIT = 14 private const val TYPE_EDIT = 14
private const val TYPE_SEND = 15 private const val TYPE_SEND = 15

View file

@ -24,12 +24,11 @@ class VCardViewerActivity : SimpleActivity() {
private val binding by viewBinding(ActivityVcardViewerBinding::inflate) private val binding by viewBinding(ActivityVcardViewerBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) setContentView(binding.root)
updateMaterialActivityViews(binding.vcardViewerCoordinator, binding.contactsList, useTransparentNavigation = true, useTopSearchMenu = false) setupEdgeToEdge(padBottomSystem = listOf(binding.contactsList))
setupMaterialScrollListener(binding.contactsList, binding.vcardToolbar) setupMaterialScrollListener(binding.contactsList, binding.vcardAppbar)
val vCardUri = intent.getParcelableExtra(EXTRA_VCARD_URI) as? Uri val vCardUri = intent.getParcelableExtra(EXTRA_VCARD_URI) as? Uri
if (vCardUri != null) { if (vCardUri != null) {
@ -44,7 +43,7 @@ class VCardViewerActivity : SimpleActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(binding.vcardToolbar, NavigationIcon.Arrow) setupTopAppBar(binding.vcardAppbar, NavigationIcon.Arrow)
} }
private fun setupOptionsMenu(vCardUri: Uri) { private fun setupOptionsMenu(vCardUri: Uri) {

View file

@ -17,7 +17,7 @@ import org.joda.time.DateTime
class MessageDetailsDialog(val activity: BaseSimpleActivity, val message: Message) : BasePropertiesDialog(activity) { class MessageDetailsDialog(val activity: BaseSimpleActivity, val message: Message) : BasePropertiesDialog(activity) {
init { init {
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
val availableSIMs = activity.subscriptionManagerCompat().activeSubscriptionInfoList val availableSIMs = activity.subscriptionManagerCompat().activeSubscriptionInfoList.orEmpty()
addProperty(message.getSenderOrReceiverLabel(), message.getSenderOrReceiverPhoneNumbers()) addProperty(message.getSenderOrReceiverLabel(), message.getSenderOrReceiverPhoneNumbers())
if (availableSIMs.count() > 1) { if (availableSIMs.count() > 1) {

View file

@ -30,7 +30,7 @@ class DirectReplyReceiver : BroadcastReceiver() {
val availableSIMs = context.subscriptionManagerCompat().activeSubscriptionInfoList val availableSIMs = context.subscriptionManagerCompat().activeSubscriptionInfoList
if ((availableSIMs?.size ?: 0) > 1) { if ((availableSIMs?.size ?: 0) > 1) {
val currentSIMCardIndex = context.config.getUseSIMIdAtNumber(address) val currentSIMCardIndex = context.config.getUseSIMIdAtNumber(address)
val wantedId = availableSIMs.getOrNull(currentSIMCardIndex) val wantedId = availableSIMs?.getOrNull(currentSIMCardIndex)
if (wantedId != null) { if (wantedId != null) {
subscriptionId = wantedId.subscriptionId subscriptionId = wantedId.subscriptionId
} }

View file

@ -6,19 +6,25 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/archive_toolbar" android:id="@+id/archive_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:title="@string/archived_conversations" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/archive_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/archived_conversations"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/archive_nested_scrollview" android:id="@+id/archive_nested_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true" android:fillViewport="true"
android:scrollbars="none" android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/conversation_details_toolbar" android:id="@+id/conversation_details_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:title="@string/conversation_details" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/conversation_details_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/conversation_details"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/conversation_details_nested_scrollview" android:id="@+id/conversation_details_nested_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true" android:fillViewport="true"
android:scrollbars="none"> android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout
android:id="@+id/conversation_details_holder" android:id="@+id/conversation_details_holder"

View file

@ -6,20 +6,27 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/block_keywords_toolbar" android:id="@+id/block_keywords_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:menu="@menu/menu_add_blocked_keyword" <com.google.android.material.appbar.MaterialToolbar
app:title="@string/manage_blocked_keywords" android:id="@+id/block_keywords_toolbar"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:menu="@menu/menu_add_blocked_keyword"
app:title="@string/manage_blocked_keywords"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/manage_blocked_keywords_wrapper" android:id="@+id/manage_blocked_keywords_wrapper"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<org.fossify.commons.views.MyRecyclerView <org.fossify.commons.views.MyRecyclerView
android:id="@+id/manage_blocked_keywords_list" android:id="@+id/manage_blocked_keywords_list"

View file

@ -5,19 +5,26 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/new_conversation_toolbar" android:id="@+id/new_conversation_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:title="@string/new_conversation" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/new_conversation_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/new_conversation"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/new_conversation_holder" android:id="@+id/new_conversation_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<org.fossify.commons.views.MyEditText <org.fossify.commons.views.MyEditText
android:id="@+id/new_conversation_address" android:id="@+id/new_conversation_address"

View file

@ -6,19 +6,25 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/recycle_bin_toolbar" android:id="@+id/recycle_bin_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:title="@string/recycle_bin" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/recycle_bin_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/recycle_bin"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/recycle_bin_nested_scrollview" android:id="@+id/recycle_bin_nested_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true" android:fillViewport="true"
android:scrollbars="none" android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/settings_toolbar" android:id="@+id/settings_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:title="@string/settings" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/settings_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:title="@string/settings"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/settings_nested_scrollview" android:id="@+id/settings_nested_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true" android:fillViewport="true"
android:scrollbars="none"> android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout <LinearLayout
android:id="@+id/settings_holder" android:id="@+id/settings_holder"

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/thread_toolbar" android:id="@+id/thread_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:menu="@menu/menu_thread" <com.google.android.material.appbar.MaterialToolbar
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:id="@+id/thread_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:menu="@menu/menu_thread"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/thread_holder" android:id="@+id/thread_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true" android:fillViewport="true"
android:scrollbars="none"> android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include <include
layout="@layout/divider" layout="@layout/divider"

View file

@ -5,23 +5,30 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <org.fossify.commons.views.MyAppBarLayout
android:id="@+id/vcard_toolbar" android:id="@+id/vcard_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
android:background="@color/color_primary"
app:menu="@menu/menu_vcard" <com.google.android.material.appbar.MaterialToolbar
app:title="@string/contact_details" android:id="@+id/vcard_toolbar"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" /> android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:menu="@menu/menu_vcard"
app:title="@string/contact_details"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
</org.fossify.commons.views.MyAppBarLayout>
<org.fossify.commons.views.MyRecyclerView <org.fossify.commons.views.MyRecyclerView
android:id="@+id/contacts_list" android:id="@+id/contacts_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:clipToPadding="false" android:clipToPadding="false"
android:overScrollMode="ifContentScrolls" android:overScrollMode="ifContentScrolls"
android:scrollbars="none" android:scrollbars="none"
app:layoutManager="org.fossify.commons.views.MyLinearLayoutManager" /> app:layoutManager="org.fossify.commons.views.MyLinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -2,13 +2,13 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:paddingHorizontal="@dimen/normal_margin">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/reply_disabled_text" android:id="@+id/reply_disabled_text"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/activity_margin" android:padding="@dimen/activity_margin"
android:text="@string/invalid_short_code" android:text="@string/invalid_short_code"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -21,6 +21,7 @@
android:id="@+id/reply_disabled_info" android:id="@+id/reply_disabled_info"
android:layout_width="@dimen/normal_icon_size" android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size"
android:layout_marginEnd="@dimen/normal_margin"
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/more_info" android:contentDescription="@string/more_info"
android:padding="@dimen/normal_margin" android:padding="@dimen/normal_margin"

View file

@ -11,19 +11,20 @@ detektCompose = "0.4.27"
androidx-constraintlayout = "2.2.1" androidx-constraintlayout = "2.2.1"
androidx-swiperefreshlayout = "1.1.0" androidx-swiperefreshlayout = "1.1.0"
androidx-lifecycleprocess = "2.8.7" androidx-lifecycleprocess = "2.8.7"
androidx-documentfile = "1.1.0"
#Eventbus #Eventbus
eventbus = "3.3.1" eventbus = "3.3.1"
#Room #Room
room = "2.8.2" room = "2.8.2"
#Fossify #Fossify
commons = "5.4.0" commons = "5.5.0"
mmslib = "1.0.0" mmslib = "1.0.0"
indicator-fast-scroll = "4524cd0b61" indicator-fast-scroll = "4524cd0b61"
#Gradle #Gradle
gradlePlugins-agp = "8.11.1" gradlePlugins-agp = "8.11.1"
#build #build
app-build-compileSDKVersion = "34" app-build-compileSDKVersion = "36"
app-build-targetSDK = "34" app-build-targetSDK = "36"
app-build-minimumSDK = "26" app-build-minimumSDK = "26"
app-build-javaVersion = "VERSION_17" app-build-javaVersion = "VERSION_17"
app-build-kotlinJVMTarget = "17" app-build-kotlinJVMTarget = "17"
@ -34,6 +35,7 @@ ez-vcard = "0.12.1"
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidx-constraintlayout" } androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidx-constraintlayout" }
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "androidx-lifecycleprocess" } androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "androidx-lifecycleprocess" }
androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "androidx-swiperefreshlayout" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "androidx-swiperefreshlayout" }
androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "androidx-documentfile" }
#Room #Room
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }

View file

@ -11,6 +11,7 @@ dependencyResolutionManagement {
google() google()
mavenCentral() mavenCentral()
maven { setUrl("https://jitpack.io") } maven { setUrl("https://jitpack.io") }
mavenLocal()
} }
} }
include(":app") include(":app")