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

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

View file

@ -47,13 +47,6 @@
<ID>MagicNumber:ImageCompressor.kt$ImageCompressor$8</ID>
<ID>MagicNumber:ImageCompressor.kt$ImageCompressor$90f</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$5</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: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: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$if</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 Telephone -&gt; VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property)</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>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>

File diff suppressed because it is too large Load diff

View file

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

View file

@ -43,19 +43,13 @@ class ConversationDetailsActivity : SimpleActivity() {
private val binding by viewBinding(ActivityConversationDetailsBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateMaterialActivityViews(
mainCoordinatorLayout = binding.conversationDetailsCoordinator,
nestedView = binding.participantsRecyclerview,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupEdgeToEdge(padBottomSystem = listOf(binding.conversationDetailsNestedScrollview))
setupMaterialScrollListener(
scrollingView = binding.conversationDetailsNestedScrollview,
toolbar = binding.conversationDetailsToolbar
topAppBar = binding.conversationDetailsAppbar,
)
threadId = intent.getLongExtra(THREAD_ID, 0L)
@ -77,7 +71,7 @@ class ConversationDetailsActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
setupToolbar(binding.conversationDetailsToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.conversationDetailsAppbar, NavigationIcon.Arrow)
updateTextColors(binding.conversationDetailsHolder)
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.getProperTextColor
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.openNotificationSettings
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.underlineText
@ -77,6 +76,8 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class MainActivity : SimpleActivity() {
override var isSearchBarEnabled = true
private val MAKE_DEFAULT_APP_REQUEST = 1
private var storedTextColor = 0
@ -88,19 +89,13 @@ class MainActivity : SimpleActivity() {
@SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(
mainCoordinatorLayout = binding.mainCoordinator,
nestedView = binding.conversationsList,
useTransparentNavigation = true,
useTopSearchMenu = true
)
setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.conversationsList))
checkAndDeleteOldRecycleBinMessages()
clearAllMessagesIfNeeded {
@ -139,9 +134,6 @@ class MainActivity : SimpleActivity() {
binding.conversationsProgressBar.setIndicatorColor(properPrimaryColor)
binding.conversationsProgressBar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA)
checkShortcut()
(binding.conversationsFab.layoutParams as? CoordinatorLayout.LayoutParams)?.bottomMargin =
navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.activity_margin)
.toInt()
}
override fun onPause() {
@ -154,17 +146,18 @@ class MainActivity : SimpleActivity() {
bus?.unregister(this)
}
override fun onBackPressed() {
if (binding.mainMenu.isSearchOpen) {
override fun onBackPressedCompat(): Boolean {
return if (binding.mainMenu.isSearchOpen) {
binding.mainMenu.closeSearch()
true
} else {
appLockManager.lock()
super.onBackPressed()
false
}
}
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.setupMenu()
@ -183,7 +176,7 @@ class MainActivity : SimpleActivity() {
searchTextChanged(text)
}
binding.mainMenu.getToolbar().setOnMenuItemClickListener { menuItem ->
binding.mainMenu.requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.show_recycle_bin -> launchRecycleBin()
R.id.show_archived -> launchArchivedConversations()
@ -196,7 +189,7 @@ class MainActivity : SimpleActivity() {
}
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_archived).isVisible = config.isArchiveAvailable
}
@ -219,7 +212,6 @@ class MainActivity : SimpleActivity() {
}
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
binding.mainMenu.updateColors()
}

View file

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

View file

@ -57,21 +57,15 @@ class NewConversationActivity : SimpleActivity() {
private val binding by viewBinding(ActivityNewConversationBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
title = getString(R.string.new_conversation)
updateTextColors(binding.newConversationHolder)
updateMaterialActivityViews(
mainCoordinatorLayout = binding.newConversationCoordinator,
nestedView = binding.contactsList,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.contactsList))
setupMaterialScrollListener(
scrollingView = binding.contactsList,
toolbar = binding.newConversationToolbar
topAppBar = binding.newConversationAppbar
)
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
@ -85,7 +79,7 @@ class NewConversationActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
setupToolbar(binding.newConversationToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.newConversationAppbar, NavigationIcon.Arrow)
binding.noContactsPlaceholder2.setTextColor(getProperPrimaryColor())
binding.noContactsPlaceholder2.underlineText()
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.beGoneIf
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.NavigationIcon
@ -33,20 +32,14 @@ class RecycleBinConversationsActivity : SimpleActivity() {
@SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupOptionsMenu()
updateMaterialActivityViews(
mainCoordinatorLayout = binding.recycleBinCoordinator,
nestedView = binding.conversationsList,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.conversationsList))
setupMaterialScrollListener(
scrollingView = binding.conversationsList,
toolbar = binding.recycleBinToolbar
topAppBar = binding.recycleBinAppbar
)
loadRecycleBinConversations()
@ -54,9 +47,7 @@ class RecycleBinConversationsActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
setupToolbar(binding.recycleBinToolbar, NavigationIcon.Arrow)
updateMenuColors()
setupTopAppBar(binding.recycleBinAppbar, NavigationIcon.Arrow)
loadRecycleBinConversations()
}
@ -82,10 +73,6 @@ class RecycleBinConversationsActivity : SimpleActivity() {
}
}
private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor())
}
private fun loadRecycleBinConversations() {
ensureBackgroundThread {
val conversations = try {

View file

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

View file

@ -45,7 +45,9 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsAnimationCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.doOnLayout
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.documentfile.provider.DocumentFile
import androidx.recyclerview.widget.LinearLayoutManager
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.getTextSize
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.insetsController
import org.fossify.commons.extensions.isDynamicTheme
import org.fossify.commons.extensions.isOrWasThankYouInstalled
import org.fossify.commons.extensions.isVisible
@ -237,19 +240,18 @@ class ThreadActivity : SimpleActivity() {
}
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(
mainCoordinatorLayout = binding.threadCoordinator,
nestedView = null,
useTransparentNavigation = false,
useTopSearchMenu = false
setupEdgeToEdge(
padBottomImeAndSystem = listOf(
binding.messageHolder.root,
binding.shortCodeHolder.root
)
)
setupMaterialScrollListener(null, binding.threadToolbar)
setupMessagingEdgeToEdge()
setupMaterialScrollListener(null, binding.threadAppbar)
val extras = intent.extras
if (extras == null) {
@ -270,17 +272,16 @@ class ThreadActivity : SimpleActivity() {
loadConversation()
setupAttachmentPickerView()
setupKeyboardListener()
hideAttachmentPicker()
maybeSetupRecycleBinView()
}
override fun onResume() {
super.onResume()
setupToolbar(
toolbar = binding.threadToolbar,
toolbarNavigationIcon = NavigationIcon.Arrow,
statusBarColor = getProperBackgroundColor()
setupTopAppBar(
topAppBar = binding.threadAppbar,
navigationIcon = NavigationIcon.Arrow,
topBarColor = getProperBackgroundColor()
)
isActivityVisible = true
@ -310,7 +311,6 @@ class ThreadActivity : SimpleActivity() {
val bottomBarColor = getBottomBarColor()
binding.messageHolder.root.setBackgroundColor(bottomBarColor)
binding.shortCodeHolder.root.setBackgroundColor(bottomBarColor)
updateNavigationBarColor(bottomBarColor)
}
override fun onPause() {
@ -325,12 +325,13 @@ class ThreadActivity : SimpleActivity() {
saveDraftMessage()
}
override fun onBackPressed() {
override fun onBackPressedCompat(): Boolean {
isAttachmentPickerVisible = false
if (binding.messageHolder.attachmentPickerHolder.isVisible()) {
return if (binding.messageHolder.attachmentPickerHolder.isVisible()) {
hideAttachmentPicker()
true
} else {
super.onBackPressed()
false
}
}
@ -911,15 +912,16 @@ class ThreadActivity : SimpleActivity() {
threadAddAttachment.setOnClickListener {
if (attachmentPickerHolder.isVisible()) {
isAttachmentPickerVisible = false
WindowCompat.getInsetsController(window, threadTypeMessage)
hideAttachmentPicker()
window.insetsController(binding.messageHolder.threadTypeMessage)
.show(WindowInsetsCompat.Type.ime())
} else {
isAttachmentPickerVisible = true
showOrHideAttachmentPicker()
WindowCompat.getInsetsController(window, threadTypeMessage)
showAttachmentPicker()
window.insetsController(binding.messageHolder.threadTypeMessage)
.hide(WindowInsetsCompat.Type.ime())
}
window.decorView.requestApplyInsets()
binding.messageHolder.threadTypeMessage.requestApplyInsets()
}
if (intent.extras?.containsKey(THREAD_ATTACHMENT_URI) == true) {
@ -2060,54 +2062,37 @@ class ThreadActivity : SimpleActivity() {
.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()) {
resources.getColor(org.fossify.commons.R.color.you_bottom_bar_color)
} else {
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 {
private const val TYPE_EDIT = 14
private const val TYPE_SEND = 15

View file

@ -24,12 +24,11 @@ class VCardViewerActivity : SimpleActivity() {
private val binding by viewBinding(ActivityVcardViewerBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateMaterialActivityViews(binding.vcardViewerCoordinator, binding.contactsList, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(binding.contactsList, binding.vcardToolbar)
setupEdgeToEdge(padBottomSystem = listOf(binding.contactsList))
setupMaterialScrollListener(binding.contactsList, binding.vcardAppbar)
val vCardUri = intent.getParcelableExtra(EXTRA_VCARD_URI) as? Uri
if (vCardUri != null) {
@ -44,7 +43,7 @@ class VCardViewerActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
setupToolbar(binding.vcardToolbar, NavigationIcon.Arrow)
setupTopAppBar(binding.vcardAppbar, NavigationIcon.Arrow)
}
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) {
init {
@SuppressLint("MissingPermission")
val availableSIMs = activity.subscriptionManagerCompat().activeSubscriptionInfoList
val availableSIMs = activity.subscriptionManagerCompat().activeSubscriptionInfoList.orEmpty()
addProperty(message.getSenderOrReceiverLabel(), message.getSenderOrReceiverPhoneNumbers())
if (availableSIMs.count() > 1) {

View file

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

View file

@ -6,19 +6,25 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/archive_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/archive_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/archive_nested_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/conversation_details_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/conversation_details_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/conversation_details_nested_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none">
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/conversation_details_holder"

View file

@ -6,20 +6,27 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/block_keywords_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/block_keywords_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/block_keywords_toolbar"
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
android:id="@+id/manage_blocked_keywords_wrapper"
android:layout_width="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
android:id="@+id/manage_blocked_keywords_list"

View file

@ -5,19 +5,26 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/new_conversation_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/new_conversation_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/new_conversation_holder"
android:layout_width="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
android:id="@+id/new_conversation_address"

View file

@ -6,19 +6,25 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/recycle_bin_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/recycle_bin_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/recycle_bin_nested_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/settings_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/settings_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/settings_nested_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none">
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/settings_holder"

View file

@ -6,21 +6,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/thread_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/thread_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
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
android:id="@+id/thread_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="none">
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include
layout="@layout/divider"

View file

@ -5,23 +5,30 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/vcard_toolbar"
<org.fossify.commons.views.MyAppBarLayout
android:id="@+id/vcard_appbar"
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" />
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/vcard_toolbar"
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
android:id="@+id/contacts_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:clipToPadding="false"
android:overScrollMode="ifContentScrolls"
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>

View file

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