Skip to content

Commit 87f6d2e

Browse files
authored
chore: bump target SDK version to 35 (#492)
* chore: bump target SDK version to 35 * 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: migrate away from deprecated onBackPressed() * fix: migrate away from deprecated `onBackPressed()` * chore(deps): update org.fossify.commons to 5.5.0 * docs: update changelog * build: bump detekt return count limit * chore: update lint baselines
1 parent 85c8cfd commit 87f6d2e

18 files changed

+242
-198
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
### Changed
10+
11+
- Compatibility updates for Android 15 & 16
12+
913
## [1.7.3] - 2025-10-16
1014
### Changed
1115
- Updated translations

app/detekt-baseline.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$class</ID>
7979
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$if</ID>
8080
<ID>MaxLineLength:ConferenceActivity.kt$ConferenceActivity$conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {}</ID>
81-
<ID>MaxLineLength:ConferenceActivity.kt$ConferenceActivity$updateMaterialActivityViews(conferenceCoordinator, conferenceList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
8281
<ID>MaxLineLength:ConferenceCallsAdapter.kt$ConferenceCallsAdapter$itemConferenceCallName.text = callContact.name.ifEmpty { itemView.context.getString(R.string.unknown_caller) }</ID>
8382
<ID>MaxLineLength:Config.kt$Config$set(wasOverlaySnackbarConfirmed) = prefs.edit().putBoolean(WAS_OVERLAY_SNACKBAR_CONFIRMED, wasOverlaySnackbarConfirmed).apply()</ID>
8483
<ID>MaxLineLength:ContactsAdapter.kt$ContactsAdapter$SimpleContactsHelper(root.context).loadContactImage(contact.photoUri, itemContactImage, contact.getNameToDisplay())</ID>
@@ -101,11 +100,9 @@
101100
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.column_count).isVisible = currentFragment == getFavoritesFragment() &amp;&amp; config.viewType == VIEW_TYPE_GRID</ID>
102101
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun getCurrentFragment(): MyViewPagerFragment&lt;*&gt;?</ID>
103102
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun getInactiveTabIndexes(activeIndex: Int)</ID>
104-
<ID>MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true)</ID>
105103
<ID>MaxLineLength:MainActivity.kt$MainActivity$val</ID>
106104
<ID>MaxLineLength:MainActivity.kt$MainActivity$val confirmationText = "${getString(R.string.clear_history_confirmation)}\n\n${getString(R.string.cannot_be_undone)}"</ID>
107105
<ID>MaxLineLength:MainActivity.kt$MainActivity$val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor())</ID>
108-
<ID>MaxLineLength:ManageSpeedDialActivity.kt$ManageSpeedDialActivity$updateMaterialActivityViews(manageSpeedDialCoordinator, manageSpeedDialHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
109106
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$abstract</ID>
110107
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$setupColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperPrimaryColor())</ID>
111108
<ID>MaxLineLength:RecentCallsAdapter.kt$RecentCallsAdapter$findItem(R.id.cab_remove_default_sim).isVisible = (activity.config.getCustomSIM(selectedNumber) ?: "") != "" &amp;&amp; !call.isUnknownNumber</ID>
@@ -132,7 +129,6 @@
132129
<ID>MaxLineLength:SelectSIMDialog.kt$SelectSIMDialog$binding.selectSimRadioGroup.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
133130
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$private</ID>
134131
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") &amp;&amp; !isTiramisuPlus())</ID>
135-
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
136132
<ID>MaxLineLength:SpeedDialAdapter.kt$SpeedDialAdapter$private fun getSelectedItems()</ID>
137133
<ID>NestedBlockDepth:CallActivity.kt$CallActivity$private fun updateOtherPersonsInfo(avatarUri: String?)</ID>
138134
<ID>NestedBlockDepth:ContactsAdapter.kt$ContactsAdapter$@SuppressLint("ClickableViewAccessibility") private fun setupView(binding: ItemViewBinding, contact: Contact, holder: ViewHolder)</ID>

app/lint-baseline.xml

Lines changed: 120 additions & 98 deletions
Large diffs are not rendered by default.

app/src/main/kotlin/org/fossify/phone/activities/CallActivity.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ class CallActivity : SimpleActivity() {
7575
return
7676
}
7777

78+
setupEdgeToEdge(
79+
padTopSystem = listOf(binding.callHolder),
80+
padBottomSystem = listOf(binding.callHolder),
81+
)
82+
7883
updateTextColors(binding.callHolder)
7984
initButtons()
8085
audioManager.mode = AudioManager.MODE_IN_CALL
@@ -91,11 +96,6 @@ class CallActivity : SimpleActivity() {
9196
override fun onResume() {
9297
super.onResume()
9398
updateState()
94-
updateNavigationBarColor(getProperBackgroundColor())
95-
96-
if (isDynamicTheme()) {
97-
updateStatusbarColor(getProperBackgroundColor())
98-
}
9999
}
100100

101101
override fun onDestroy() {
@@ -108,18 +108,21 @@ class CallActivity : SimpleActivity() {
108108
}
109109
}
110110

111-
override fun onBackPressed() {
111+
override fun onBackPressedCompat(): Boolean {
112112
if (binding.dialpadWrapper.isVisible()) {
113113
hideDialpad()
114-
return
115-
} else {
116-
super.onBackPressed()
114+
return true
117115
}
118116

119117
val callState = CallManager.getState()
120118
if (callState == Call.STATE_CONNECTING || callState == Call.STATE_DIALING) {
121119
toast(R.string.call_is_being_connected)
120+
// Allow user to go back but show toast - they can return to call via notification
121+
return false
122122
}
123+
124+
// Allow minimizing active call - user can return via notification
125+
return false
123126
}
124127

125128
private fun initButtons() = binding.apply {

app/src/main/kotlin/org/fossify/phone/activities/ConferenceActivity.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,17 @@ class ConferenceActivity : SimpleActivity() {
1111
private val binding by viewBinding(ActivityConferenceBinding::inflate)
1212

1313
override fun onCreate(savedInstanceState: Bundle?) {
14-
isMaterialActivity = true
1514
super.onCreate(savedInstanceState)
1615
setContentView(binding.root)
1716
binding.apply {
18-
updateMaterialActivityViews(conferenceCoordinator, conferenceList, useTransparentNavigation = true, useTopSearchMenu = false)
19-
setupMaterialScrollListener(conferenceList, conferenceToolbar)
17+
setupEdgeToEdge(padBottomSystem = listOf(conferenceList))
18+
setupMaterialScrollListener(binding.conferenceList, binding.conferenceAppbar)
2019
conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {}
2120
}
2221
}
2322

2423
override fun onResume() {
2524
super.onResume()
26-
setupToolbar(binding.conferenceToolbar, NavigationIcon.Arrow)
25+
setupTopAppBar(binding.conferenceAppbar, NavigationIcon.Arrow)
2726
}
2827
}

app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,12 @@ class DialpadActivity : SimpleActivity() {
9898
hasRussianLocale = Locale.getDefault().language == "ru"
9999

100100
binding.apply {
101-
updateMaterialActivityViews(
102-
mainCoordinatorLayout = dialpadCoordinator,
103-
nestedView = dialpadHolder,
104-
useTransparentNavigation = true,
105-
useTopSearchMenu = false
101+
setupEdgeToEdge(
102+
padBottomImeAndSystem = listOf(dialpadList, dialpadHolder)
106103
)
107-
setupMaterialScrollListener(dialpadList, dialpadToolbar)
104+
setupMaterialScrollListener(binding.dialpadList, binding.dialpadAppbar)
108105
}
109106

110-
updateNavigationBarColor(getProperBackgroundColor())
111-
112107
if (checkAppSideloading()) {
113108
return
114109
}
@@ -231,8 +226,7 @@ class DialpadActivity : SimpleActivity() {
231226
super.onResume()
232227
updateTextColors(binding.dialpadHolder)
233228
binding.dialpadClearChar.applyColorFilter(getProperTextColor())
234-
updateNavigationBarColor(getProperBackgroundColor())
235-
setupToolbar(binding.dialpadToolbar, NavigationIcon.Arrow)
229+
setupTopAppBar(binding.dialpadAppbar, NavigationIcon.Arrow)
236230
}
237231

238232
private fun setupOptionsMenu() {

app/src/main/kotlin/org/fossify/phone/activities/MainActivity.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ import org.greenrobot.eventbus.Subscribe
4848
import org.greenrobot.eventbus.ThreadMode
4949

5050
class MainActivity : SimpleActivity() {
51+
override var isSearchBarEnabled = true
52+
5153
private val binding by viewBinding(ActivityMainBinding::inflate)
5254

5355
private var launchedDialer = false
@@ -57,13 +59,12 @@ class MainActivity : SimpleActivity() {
5759
var cachedContacts = ArrayList<Contact>()
5860

5961
override fun onCreate(savedInstanceState: Bundle?) {
60-
isMaterialActivity = true
6162
super.onCreate(savedInstanceState)
6263
setContentView(binding.root)
6364
appLaunched(BuildConfig.APPLICATION_ID)
6465
setupOptionsMenu()
6566
refreshMenuItems()
66-
updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true)
67+
setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.mainTabsHolder))
6768

6869
EventBus.getDefault().register(this)
6970
launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false
@@ -173,11 +174,12 @@ class MainActivity : SimpleActivity() {
173174
refreshItems()
174175
}
175176

176-
override fun onBackPressed() {
177-
if (binding.mainMenu.isSearchOpen) {
177+
override fun onBackPressedCompat(): Boolean {
178+
return if (binding.mainMenu.isSearchOpen) {
178179
binding.mainMenu.closeSearch()
180+
true
179181
} else {
180-
super.onBackPressed()
182+
false
181183
}
182184
}
183185

@@ -188,7 +190,7 @@ class MainActivity : SimpleActivity() {
188190

189191
private fun refreshMenuItems() {
190192
val currentFragment = getCurrentFragment()
191-
binding.mainMenu.getToolbar().menu.apply {
193+
binding.mainMenu.requireToolbar().menu.apply {
192194
findItem(R.id.clear_call_history).isVisible = currentFragment == getRecentsFragment()
193195
findItem(R.id.sort).isVisible = currentFragment != getRecentsFragment()
194196
findItem(R.id.filter).isVisible = currentFragment != getRecentsFragment()
@@ -201,7 +203,7 @@ class MainActivity : SimpleActivity() {
201203

202204
private fun setupOptionsMenu() {
203205
binding.mainMenu.apply {
204-
getToolbar().inflateMenu(R.menu.menu)
206+
requireToolbar().inflateMenu(R.menu.menu)
205207
toggleHideOnScroll(false)
206208
setupMenu()
207209

@@ -215,7 +217,7 @@ class MainActivity : SimpleActivity() {
215217
getCurrentFragment()?.onSearchQueryChanged(text)
216218
}
217219

218-
getToolbar().setOnMenuItemClickListener { menuItem ->
220+
requireToolbar().setOnMenuItemClickListener { menuItem ->
219221
when (menuItem.itemId) {
220222
R.id.clear_call_history -> clearCallHistory()
221223
R.id.create_new_contact -> launchCreateNewContactIntent()
@@ -257,7 +259,6 @@ class MainActivity : SimpleActivity() {
257259
}
258260

259261
private fun updateMenuColors() {
260-
updateStatusbarColor(getProperBackgroundColor())
261262
binding.mainMenu.updateColors()
262263
}
263264

@@ -320,7 +321,6 @@ class MainActivity : SimpleActivity() {
320321

321322
val bottomBarColor = getBottomNavigationBackgroundColor()
322323
binding.mainTabsHolder.setBackgroundColor(bottomBarColor)
323-
updateNavigationBarColor(bottomBarColor)
324324
}
325325

326326
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until binding.mainTabsHolder.tabCount).filter { it != activeIndex }

app/src/main/kotlin/org/fossify/phone/activities/ManageSpeedDialActivity.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,12 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
2727
private var speedDialValues = mutableListOf<SpeedDial>()
2828

2929
override fun onCreate(savedInstanceState: Bundle?) {
30-
isMaterialActivity = true
3130
super.onCreate(savedInstanceState)
3231
setContentView(binding.root)
3332

3433
binding.apply {
35-
updateMaterialActivityViews(manageSpeedDialCoordinator, manageSpeedDialHolder, useTransparentNavigation = true, useTopSearchMenu = false)
36-
setupMaterialScrollListener(manageSpeedDialScrollview, manageSpeedDialToolbar)
34+
setupEdgeToEdge(padBottomSystem = listOf(manageSpeedDialScrollview))
35+
setupMaterialScrollListener(binding.manageSpeedDialScrollview, binding.manageSpeedDialAppbar)
3736

3837
}
3938

@@ -54,7 +53,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
5453

5554
override fun onResume() {
5655
super.onResume()
57-
setupToolbar(binding.manageSpeedDialToolbar, NavigationIcon.Arrow)
56+
setupTopAppBar(binding.manageSpeedDialAppbar, NavigationIcon.Arrow)
5857
}
5958

6059
override fun onStop() {

app/src/main/kotlin/org/fossify/phone/activities/SettingsActivity.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,20 @@ class SettingsActivity : SimpleActivity() {
7777
}
7878

7979
override fun onCreate(savedInstanceState: Bundle?) {
80-
isMaterialActivity = true
8180
super.onCreate(savedInstanceState)
8281
setContentView(binding.root)
8382
setupOptionsMenu()
8483
refreshMenuItems()
8584

8685
binding.apply {
87-
updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
88-
setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
86+
setupEdgeToEdge(padBottomSystem = listOf(settingsNestedScrollview))
87+
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsAppbar)
8988
}
9089
}
9190

9291
override fun onResume() {
9392
super.onResume()
94-
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
93+
setupTopAppBar(binding.settingsAppbar, NavigationIcon.Arrow)
9594

9695
setupCustomizeColors()
9796
setupUseEnglish()

app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.fossify.phone.dialogs
22

33
import android.graphics.Color
4-
import android.view.KeyEvent
54
import android.view.inputmethod.EditorInfo
65
import android.widget.ImageView
6+
import androidx.activity.addCallback
77
import androidx.appcompat.app.AlertDialog
88
import org.fossify.commons.extensions.*
99
import org.fossify.commons.models.contacts.Contact
@@ -37,15 +37,17 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
3737

3838
activity.getAlertDialogBuilder()
3939
.setNegativeButton(R.string.cancel, null)
40-
.setOnKeyListener { _, i, keyEvent ->
41-
if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
42-
backPressed()
43-
}
44-
true
45-
}
4640
.apply {
4741
activity.setupDialogStuff(binding.root, this, R.string.choose_contact) { alertDialog ->
4842
dialog = alertDialog
43+
alertDialog.onBackPressedDispatcher.addCallback(alertDialog) {
44+
if (binding.contactSearchView.isSearchOpen) {
45+
binding.contactSearchView.closeSearch()
46+
} else {
47+
isEnabled = false
48+
alertDialog.onBackPressedDispatcher.onBackPressed()
49+
}
50+
}
4951
}
5052
}
5153
}
@@ -65,10 +67,10 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
6567
}
6668

6769
private fun MySearchMenu.updateSearchViewUi() {
68-
getToolbar().beInvisible()
70+
requireToolbar().beInvisible()
6971
updateColors()
7072
setBackgroundColor(Color.TRANSPARENT)
71-
binding.topAppBarLayout.setBackgroundColor(Color.TRANSPARENT)
73+
binding.searchBarContainer.setBackgroundColor(Color.TRANSPARENT)
7274
}
7375

7476
private fun MySearchMenu.setSearchViewListeners() {
@@ -122,12 +124,4 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
122124
letterFastscroller.beVisibleIf(contactsEmptyPlaceholder.isGone())
123125
letterFastscrollerThumb.beVisibleIf(contactsEmptyPlaceholder.isGone())
124126
}
125-
126-
private fun backPressed() {
127-
if (binding.contactSearchView.isSearchOpen) {
128-
binding.contactSearchView.closeSearch()
129-
} else {
130-
dialog?.dismiss()
131-
}
132-
}
133127
}

0 commit comments

Comments
 (0)