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:
parent
f3408f1f9a
commit
c91ce9560d
26 changed files with 400 additions and 415 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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.<no name provided>$3</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$4</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$5</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$6</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$7</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$8</ID>
|
|
||||||
<ID>MagicNumber:MessagesDatabase.kt$MessagesDatabase.Companion.<no name provided>$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 -> VCardPropertyWrapper(value, context.getString(org.fossify.commons.R.string.notes), property)</ID>
|
<ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Note -> VCardPropertyWrapper(value, context.getString(org.fossify.commons.R.string.notes), property)</ID>
|
||||||
<ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Telephone -> VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property)</ID>
|
<ID>MaxLineLength:VCard.kt$VCardPropertyWrapper.Companion$is Telephone -> 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<String></ID>
|
<ID>NestedBlockDepth:AttachmentUtils.kt$AttachmentUtils$private fun readBody(parser: XmlPullParser): List<String></ID>
|
||||||
<ID>NestedBlockDepth:Context.kt$fun Context.getThreadParticipants( threadId: Long, contactsMap: HashMap<Int, SimpleContact>?, ): ArrayList<SimpleContact></ID>
|
<ID>NestedBlockDepth:Context.kt$fun Context.getThreadParticipants( threadId: Long, contactsMap: HashMap<Int, SimpleContact>?, ): ArrayList<SimpleContact></ID>
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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" }
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ dependencyResolutionManagement {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven { setUrl("https://jitpack.io") }
|
maven { setUrl("https://jitpack.io") }
|
||||||
|
mavenLocal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
include(":app")
|
include(":app")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue