diff --git a/CHANGELOG.md b/CHANGELOG.md
index c431415f4..3bfd49353 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Changed
+
+- Compatibility updates for Android 15 & 16
+
## [1.7.3] - 2025-10-16
### Changed
- Updated translations
diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml
index e4c786281..34374a4f5 100644
--- a/app/detekt-baseline.xml
+++ b/app/detekt-baseline.xml
@@ -78,7 +78,6 @@
MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$class
MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$if
MaxLineLength:ConferenceActivity.kt$ConferenceActivity$conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {}
- MaxLineLength:ConferenceActivity.kt$ConferenceActivity$updateMaterialActivityViews(conferenceCoordinator, conferenceList, useTransparentNavigation = true, useTopSearchMenu = false)
MaxLineLength:ConferenceCallsAdapter.kt$ConferenceCallsAdapter$itemConferenceCallName.text = callContact.name.ifEmpty { itemView.context.getString(R.string.unknown_caller) }
MaxLineLength:Config.kt$Config$set(wasOverlaySnackbarConfirmed) = prefs.edit().putBoolean(WAS_OVERLAY_SNACKBAR_CONFIRMED, wasOverlaySnackbarConfirmed).apply()
MaxLineLength:ContactsAdapter.kt$ContactsAdapter$SimpleContactsHelper(root.context).loadContactImage(contact.photoUri, itemContactImage, contact.getNameToDisplay())
@@ -101,11 +100,9 @@
MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.column_count).isVisible = currentFragment == getFavoritesFragment() && config.viewType == VIEW_TYPE_GRID
MaxLineLength:MainActivity.kt$MainActivity$private fun getCurrentFragment(): MyViewPagerFragment<*>?
MaxLineLength:MainActivity.kt$MainActivity$private fun getInactiveTabIndexes(activeIndex: Int)
- MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true)
MaxLineLength:MainActivity.kt$MainActivity$val
MaxLineLength:MainActivity.kt$MainActivity$val confirmationText = "${getString(R.string.clear_history_confirmation)}\n\n${getString(R.string.cannot_be_undone)}"
MaxLineLength:MainActivity.kt$MainActivity$val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor())
- MaxLineLength:ManageSpeedDialActivity.kt$ManageSpeedDialActivity$updateMaterialActivityViews(manageSpeedDialCoordinator, manageSpeedDialHolder, useTransparentNavigation = true, useTopSearchMenu = false)
MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$abstract
MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$setupColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperPrimaryColor())
MaxLineLength:RecentCallsAdapter.kt$RecentCallsAdapter$findItem(R.id.cab_remove_default_sim).isVisible = (activity.config.getCustomSIM(selectedNumber) ?: "") != "" && !call.isUnknownNumber
@@ -132,7 +129,6 @@
MaxLineLength:SelectSIMDialog.kt$SelectSIMDialog$binding.selectSimRadioGroup.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
MaxLineLength:SettingsActivity.kt$SettingsActivity$private
MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
- MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
MaxLineLength:SpeedDialAdapter.kt$SpeedDialAdapter$private fun getSelectedItems()
NestedBlockDepth:CallActivity.kt$CallActivity$private fun updateOtherPersonsInfo(avatarUri: String?)
NestedBlockDepth:ContactsAdapter.kt$ContactsAdapter$@SuppressLint("ClickableViewAccessibility") private fun setupView(binding: ItemViewBinding, contact: Contact, holder: ViewHolder)
diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml
index 4a5a8c6d9..25f91167f 100644
--- a/app/lint-baseline.xml
+++ b/app/lint-baseline.xml
@@ -19,12 +19,12 @@
errorLine2=" ^">
-
-
-
-
@@ -95,22 +84,11 @@
errorLine1="gradlePlugins-agp = "8.11.1""
errorLine2=" ~~~~~~~~">
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -189,7 +211,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -200,7 +222,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -211,7 +233,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -222,7 +244,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -244,13 +266,13 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1516,7 +1538,7 @@
errorLine2=" ~~~~~~~~~">
@@ -1604,7 +1626,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1615,7 +1637,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -1648,7 +1670,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/CallActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/CallActivity.kt
index 3f7a5583e..c56a57bb7 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/CallActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/CallActivity.kt
@@ -75,6 +75,11 @@ class CallActivity : SimpleActivity() {
return
}
+ setupEdgeToEdge(
+ padTopSystem = listOf(binding.callHolder),
+ padBottomSystem = listOf(binding.callHolder),
+ )
+
updateTextColors(binding.callHolder)
initButtons()
audioManager.mode = AudioManager.MODE_IN_CALL
@@ -91,11 +96,6 @@ class CallActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
updateState()
- updateNavigationBarColor(getProperBackgroundColor())
-
- if (isDynamicTheme()) {
- updateStatusbarColor(getProperBackgroundColor())
- }
}
override fun onDestroy() {
@@ -108,18 +108,21 @@ class CallActivity : SimpleActivity() {
}
}
- override fun onBackPressed() {
+ override fun onBackPressedCompat(): Boolean {
if (binding.dialpadWrapper.isVisible()) {
hideDialpad()
- return
- } else {
- super.onBackPressed()
+ return true
}
val callState = CallManager.getState()
if (callState == Call.STATE_CONNECTING || callState == Call.STATE_DIALING) {
toast(R.string.call_is_being_connected)
+ // Allow user to go back but show toast - they can return to call via notification
+ return false
}
+
+ // Allow minimizing active call - user can return via notification
+ return false
}
private fun initButtons() = binding.apply {
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/ConferenceActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/ConferenceActivity.kt
index d9f58a2a9..dae1af333 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/ConferenceActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/ConferenceActivity.kt
@@ -11,18 +11,17 @@ class ConferenceActivity : SimpleActivity() {
private val binding by viewBinding(ActivityConferenceBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
- isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.apply {
- updateMaterialActivityViews(conferenceCoordinator, conferenceList, useTransparentNavigation = true, useTopSearchMenu = false)
- setupMaterialScrollListener(conferenceList, conferenceToolbar)
+ setupEdgeToEdge(padBottomSystem = listOf(conferenceList))
+ setupMaterialScrollListener(binding.conferenceList, binding.conferenceAppbar)
conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {}
}
}
override fun onResume() {
super.onResume()
- setupToolbar(binding.conferenceToolbar, NavigationIcon.Arrow)
+ setupTopAppBar(binding.conferenceAppbar, NavigationIcon.Arrow)
}
}
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt
index 5113bb8ac..6656abeb0 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt
@@ -98,17 +98,12 @@ class DialpadActivity : SimpleActivity() {
hasRussianLocale = Locale.getDefault().language == "ru"
binding.apply {
- updateMaterialActivityViews(
- mainCoordinatorLayout = dialpadCoordinator,
- nestedView = dialpadHolder,
- useTransparentNavigation = true,
- useTopSearchMenu = false
+ setupEdgeToEdge(
+ padBottomImeAndSystem = listOf(dialpadList, dialpadHolder)
)
- setupMaterialScrollListener(dialpadList, dialpadToolbar)
+ setupMaterialScrollListener(binding.dialpadList, binding.dialpadAppbar)
}
- updateNavigationBarColor(getProperBackgroundColor())
-
if (checkAppSideloading()) {
return
}
@@ -231,8 +226,7 @@ class DialpadActivity : SimpleActivity() {
super.onResume()
updateTextColors(binding.dialpadHolder)
binding.dialpadClearChar.applyColorFilter(getProperTextColor())
- updateNavigationBarColor(getProperBackgroundColor())
- setupToolbar(binding.dialpadToolbar, NavigationIcon.Arrow)
+ setupTopAppBar(binding.dialpadAppbar, NavigationIcon.Arrow)
}
private fun setupOptionsMenu() {
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/MainActivity.kt
index 7968588bc..a94b186d0 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/MainActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/MainActivity.kt
@@ -48,6 +48,8 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class MainActivity : SimpleActivity() {
+ override var isSearchBarEnabled = true
+
private val binding by viewBinding(ActivityMainBinding::inflate)
private var launchedDialer = false
@@ -57,13 +59,12 @@ class MainActivity : SimpleActivity() {
var cachedContacts = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
- isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu()
refreshMenuItems()
- updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true)
+ setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.mainTabsHolder))
EventBus.getDefault().register(this)
launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false
@@ -173,11 +174,12 @@ class MainActivity : SimpleActivity() {
refreshItems()
}
- override fun onBackPressed() {
- if (binding.mainMenu.isSearchOpen) {
+ override fun onBackPressedCompat(): Boolean {
+ return if (binding.mainMenu.isSearchOpen) {
binding.mainMenu.closeSearch()
+ true
} else {
- super.onBackPressed()
+ false
}
}
@@ -188,7 +190,7 @@ class MainActivity : SimpleActivity() {
private fun refreshMenuItems() {
val currentFragment = getCurrentFragment()
- binding.mainMenu.getToolbar().menu.apply {
+ binding.mainMenu.requireToolbar().menu.apply {
findItem(R.id.clear_call_history).isVisible = currentFragment == getRecentsFragment()
findItem(R.id.sort).isVisible = currentFragment != getRecentsFragment()
findItem(R.id.filter).isVisible = currentFragment != getRecentsFragment()
@@ -201,7 +203,7 @@ class MainActivity : SimpleActivity() {
private fun setupOptionsMenu() {
binding.mainMenu.apply {
- getToolbar().inflateMenu(R.menu.menu)
+ requireToolbar().inflateMenu(R.menu.menu)
toggleHideOnScroll(false)
setupMenu()
@@ -215,7 +217,7 @@ class MainActivity : SimpleActivity() {
getCurrentFragment()?.onSearchQueryChanged(text)
}
- getToolbar().setOnMenuItemClickListener { menuItem ->
+ requireToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.clear_call_history -> clearCallHistory()
R.id.create_new_contact -> launchCreateNewContactIntent()
@@ -257,7 +259,6 @@ class MainActivity : SimpleActivity() {
}
private fun updateMenuColors() {
- updateStatusbarColor(getProperBackgroundColor())
binding.mainMenu.updateColors()
}
@@ -320,7 +321,6 @@ class MainActivity : SimpleActivity() {
val bottomBarColor = getBottomNavigationBackgroundColor()
binding.mainTabsHolder.setBackgroundColor(bottomBarColor)
- updateNavigationBarColor(bottomBarColor)
}
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until binding.mainTabsHolder.tabCount).filter { it != activeIndex }
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/ManageSpeedDialActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/ManageSpeedDialActivity.kt
index 8fcf5e054..bf057b9d4 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/ManageSpeedDialActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/ManageSpeedDialActivity.kt
@@ -27,13 +27,12 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
private var speedDialValues = mutableListOf()
override fun onCreate(savedInstanceState: Bundle?) {
- isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.apply {
- updateMaterialActivityViews(manageSpeedDialCoordinator, manageSpeedDialHolder, useTransparentNavigation = true, useTopSearchMenu = false)
- setupMaterialScrollListener(manageSpeedDialScrollview, manageSpeedDialToolbar)
+ setupEdgeToEdge(padBottomSystem = listOf(manageSpeedDialScrollview))
+ setupMaterialScrollListener(binding.manageSpeedDialScrollview, binding.manageSpeedDialAppbar)
}
@@ -54,7 +53,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
override fun onResume() {
super.onResume()
- setupToolbar(binding.manageSpeedDialToolbar, NavigationIcon.Arrow)
+ setupTopAppBar(binding.manageSpeedDialAppbar, NavigationIcon.Arrow)
}
override fun onStop() {
diff --git a/app/src/main/kotlin/org/fossify/phone/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/SettingsActivity.kt
index a4ef9ef02..49776b30a 100644
--- a/app/src/main/kotlin/org/fossify/phone/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/org/fossify/phone/activities/SettingsActivity.kt
@@ -77,21 +77,20 @@ class SettingsActivity : SimpleActivity() {
}
override fun onCreate(savedInstanceState: Bundle?) {
- isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupOptionsMenu()
refreshMenuItems()
binding.apply {
- updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
- setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
+ setupEdgeToEdge(padBottomSystem = listOf(settingsNestedScrollview))
+ setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsAppbar)
}
}
override fun onResume() {
super.onResume()
- setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
+ setupTopAppBar(binding.settingsAppbar, NavigationIcon.Arrow)
setupCustomizeColors()
setupUseEnglish()
diff --git a/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt b/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt
index e37447d58..20e556390 100644
--- a/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt
+++ b/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt
@@ -1,9 +1,9 @@
package org.fossify.phone.dialogs
import android.graphics.Color
-import android.view.KeyEvent
import android.view.inputmethod.EditorInfo
import android.widget.ImageView
+import androidx.activity.addCallback
import androidx.appcompat.app.AlertDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.models.contacts.Contact
@@ -37,15 +37,17 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List
- if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
- backPressed()
- }
- true
- }
.apply {
activity.setupDialogStuff(binding.root, this, R.string.choose_contact) { alertDialog ->
dialog = alertDialog
+ alertDialog.onBackPressedDispatcher.addCallback(alertDialog) {
+ if (binding.contactSearchView.isSearchOpen) {
+ binding.contactSearchView.closeSearch()
+ } else {
+ isEnabled = false
+ alertDialog.onBackPressedDispatcher.onBackPressed()
+ }
+ }
}
}
}
@@ -65,10 +67,10 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List
-
+ android:layout_height="wrap_content">
+
+
+
+
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
+ android:layout_height="wrap_content">
+
+
+
+
+ android:focusableInTouchMode="true"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+ android:scrollbars="none"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
+ android:layout_height="wrap_content">
+
+
+
+
+ android:scrollbars="none"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
+ android:layout_height="wrap_content">
+
+
+
+
+ android:scrollbars="none"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">