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">