Skip to content

Commit 718c466

Browse files
rohit9625RitikaPahwa4444Copilot
authored
Bump target sdk to API 35 and make the app UI compatible with edge to edge (#6393)
* chore: upgrade target SDK and refactor function signatures to resolve build issues * chore: bump android gradle plugin version * chore(ui): add extension functions for applying edge to edge insets * fix: apply system bar top and bottom insets for edge to edge * fix: force edge to edge for backward compatibility and consistent UI * fix: apply top bar insets as padding and make the status bar color white Since the toolbars have primary color as bg, we should make the status bar white * chore: bump robolectric version for API 35 compatibility * fix: preserve existing margins when adding new insets * feat(customselector): improve RecyclerView edge-to-edge inset handling It allows the last item to sits above the navigation bar while preserving edge-to-edge appearance. * feat(notification): improve RecyclerView edge-to-edge insets handling Also, refactor LocationPicker and DescriptionEdit activities to use extension functions and reduce duplication * fix(quiz): enable and handle edge-to-edge insets and status icon colors * fix: bottom insets not dispatched on all API versions consistently Upgraded core-ktx version installCompatInsetsDispatch wasn't available on current version * fix: return fallback value when versionName is null Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: resolve compilation errors * docs: add KDoc for edge-to-edge insets utility functions * fix(SearchActivity): apply insets for system bars * fix(util): add utility function to handle keyboard insets with animation * fix(upload): handle keyboard insets for upload media detail card view * fix(login): hadle IME insets and make edge-to-edge backward compatible --------- Co-authored-by: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent b8a5583 commit 718c466

35 files changed

+348
-19
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ if (isRunningOnTravisAndIsNotPRBuild) {
1818

1919
android {
2020
namespace = "fr.free.nrw.commons"
21-
compileSdk = 34
21+
compileSdk = 35
2222

2323
defaultConfig {
2424
applicationId = "fr.free.nrw.commons"
2525
minSdk = 21
26-
targetSdk = 34
26+
targetSdk = 35
2727
versionCode = 1055
2828
versionName = "5.6.1"
2929

app/src/main/java/fr/free/nrw/commons/AboutActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import fr.free.nrw.commons.utils.ConfigUtils.getVersionNameWithSha
1919
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
2020
import java.util.Collections
2121
import androidx.core.net.toUri
22+
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
2223
import fr.free.nrw.commons.utils.handleWebUrl
2324
import fr.free.nrw.commons.utils.setUnderlinedText
2425

@@ -47,6 +48,7 @@ class AboutActivity : BaseActivity() {
4748
*/
4849
binding = ActivityAboutBinding.inflate(layoutInflater)
4950
val view: View = binding!!.root
51+
applyEdgeToEdgeTopInsets(binding!!.toolbarLayout)
5052
setContentView(view)
5153

5254
setSupportActionBar(binding!!.toolbarBinding.toolbar)

app/src/main/java/fr/free/nrw/commons/WelcomeActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import fr.free.nrw.commons.databinding.ActivityWelcomeBinding
99
import fr.free.nrw.commons.databinding.PopupForCopyrightBinding
1010
import fr.free.nrw.commons.quiz.QuizActivity
1111
import fr.free.nrw.commons.theme.BaseActivity
12+
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
1213
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
1314

1415
class WelcomeActivity : BaseActivity() {
@@ -23,6 +24,7 @@ class WelcomeActivity : BaseActivity() {
2324
public override fun onCreate(savedInstanceState: Bundle?) {
2425
super.onCreate(savedInstanceState)
2526
binding = ActivityWelcomeBinding.inflate(layoutInflater)
27+
applyEdgeToEdgeAllInsets(binding!!.welcomePager.rootView)
2628
setContentView(binding!!.root)
2729

2830
isQuiz = intent?.extras?.getBoolean("isQuiz", false) ?: false

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.appcompat.app.AlertDialog
2222
import androidx.appcompat.app.AppCompatDelegate
2323
import androidx.core.app.NavUtils
2424
import androidx.core.content.ContextCompat
25+
import androidx.core.view.WindowCompat
2526
import fr.free.nrw.commons.BuildConfig
2627
import fr.free.nrw.commons.CommonsApplication
2728
import fr.free.nrw.commons.R
@@ -32,11 +33,13 @@ import fr.free.nrw.commons.contributions.MainActivity
3233
import fr.free.nrw.commons.databinding.ActivityLoginBinding
3334
import fr.free.nrw.commons.di.ApplicationlessInjection
3435
import fr.free.nrw.commons.kvstore.JsonKvStore
36+
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
3537
import fr.free.nrw.commons.utils.AbstractTextWatcher
3638
import fr.free.nrw.commons.utils.ActivityUtils.startActivityWithFlags
3739
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
3840
import fr.free.nrw.commons.utils.SystemThemeUtils
3941
import fr.free.nrw.commons.utils.ViewUtil.hideKeyboard
42+
import fr.free.nrw.commons.utils.handleKeyboardInsets
4043
import fr.free.nrw.commons.utils.handleWebUrl
4144
import io.reactivex.disposables.CompositeDisposable
4245
import timber.log.Timber
@@ -79,7 +82,14 @@ class LoginActivity : AccountAuthenticatorActivity() {
7982
delegate.installViewFactory()
8083
delegate.onCreate(savedInstanceState)
8184

85+
WindowCompat.getInsetsController(window, window.decorView)
86+
.isAppearanceLightStatusBars = !isDarkTheme
87+
88+
WindowCompat.setDecorFitsSystemWindows(window, false)
89+
8290
binding = ActivityLoginBinding.inflate(layoutInflater)
91+
applyEdgeToEdgeAllInsets(binding!!.root)
92+
binding?.aboutPrivacyPolicy?.handleKeyboardInsets()
8393
with(binding!!) {
8494
setContentView(root)
8595

app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.widget.Toast
1010
import fr.free.nrw.commons.BuildConfig
1111
import fr.free.nrw.commons.R
1212
import fr.free.nrw.commons.theme.BaseActivity
13+
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
1314
import timber.log.Timber
1415

1516
class SignupActivity : BaseActivity() {
@@ -21,6 +22,7 @@ class SignupActivity : BaseActivity() {
2122
Timber.d("Signup Activity started")
2223

2324
webView = WebView(this)
25+
applyEdgeToEdgeAllInsets(webView!!)
2426
with(webView!!) {
2527
setContentView(this)
2628
webViewClient = MyWebViewClient()

app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import fr.free.nrw.commons.explore.categories.sub.SubCategoriesFragment
2323
import fr.free.nrw.commons.media.MediaDetailPagerFragment
2424
import fr.free.nrw.commons.media.MediaDetailProvider
2525
import fr.free.nrw.commons.theme.BaseActivity
26+
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
2627
import fr.free.nrw.commons.utils.handleWebUrl
2728
import fr.free.nrw.commons.wikidata.model.WikiSite
2829
import fr.free.nrw.commons.wikidata.model.page.PageTitle
@@ -57,6 +58,7 @@ class CategoryDetailsActivity : BaseActivity(),
5758

5859
binding = ActivityCategoryDetailsBinding.inflate(layoutInflater)
5960
val view = binding.root
61+
applyEdgeToEdgeAllInsets(view)
6062
setContentView(view)
6163
supportFragmentManager = getSupportFragmentManager()
6264
viewPagerAdapter = ViewPagerAdapter(this, supportFragmentManager)

app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import fr.free.nrw.commons.quiz.QuizChecker
3434
import fr.free.nrw.commons.settings.SettingsFragment
3535
import fr.free.nrw.commons.startWelcome
3636
import fr.free.nrw.commons.theme.BaseActivity
37+
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
3738
import fr.free.nrw.commons.upload.UploadProgressActivity
3839
import fr.free.nrw.commons.upload.worker.WorkRequestHelper.Companion.makeOneTimeWorkRequest
3940
import fr.free.nrw.commons.utils.ViewUtilWrapper
@@ -112,6 +113,7 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
112113
public override fun onCreate(savedInstanceState: Bundle?) {
113114
super.onCreate(savedInstanceState)
114115
binding = MainBinding.inflate(layoutInflater)
116+
applyEdgeToEdgeAllInsets(binding!!.root)
115117
setContentView(binding!!.root)
116118
setSupportActionBar(binding!!.toolbarBinding.toolbar)
117119
tabLayout = binding!!.fragmentMainNavTabLayout

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import androidx.compose.ui.tooling.preview.Preview
4040
import androidx.compose.ui.unit.dp
4141
import androidx.constraintlayout.widget.ConstraintLayout
4242
import androidx.core.content.ContextCompat
43+
import androidx.core.view.ViewGroupCompat
4344
import androidx.lifecycle.ViewModelProvider
4445
import fr.free.nrw.commons.R
4546
import fr.free.nrw.commons.customselector.database.NotForUploadStatus
@@ -56,6 +57,8 @@ import fr.free.nrw.commons.media.ZoomableActivity
5657
import fr.free.nrw.commons.theme.BaseActivity
5758
import fr.free.nrw.commons.upload.FileUtilsWrapper
5859
import fr.free.nrw.commons.utils.CustomSelectorUtils
60+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
61+
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
5962
import kotlinx.coroutines.CoroutineDispatcher
6063
import kotlinx.coroutines.CoroutineScope
6164
import kotlinx.coroutines.Dispatchers
@@ -198,6 +201,9 @@ class CustomSelectorActivity :
198201
.fillMaxWidth(),
199202
)
200203
}
204+
ViewGroupCompat.installCompatInsetsDispatch(binding.root)
205+
applyEdgeToEdgeTopInsets(toolbarBinding.toolbarLayout)
206+
bottomSheetBinding.bottomLayout.applyEdgeToEdgeBottomPaddingInsets()
201207
val view = binding.root
202208
setContentView(view)
203209

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/FolderFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding
1818
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
1919
import fr.free.nrw.commons.media.MediaClient
2020
import fr.free.nrw.commons.upload.FileProcessor
21+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
2122
import javax.inject.Inject
2223

2324
/**
@@ -99,6 +100,7 @@ class FolderFragment : CommonsDaggerSupportFragment() {
99100
selectorRV = binding?.selectorRv
100101
loader = binding?.loader
101102
with(binding?.selectorRv) {
103+
this?.applyEdgeToEdgeBottomPaddingInsets()
102104
this?.layoutManager = gridLayoutManager
103105
this?.setHasFixedSize(true)
104106
this?.adapter = folderAdapter

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import fr.free.nrw.commons.media.MediaClient
4141
import fr.free.nrw.commons.theme.BaseActivity
4242
import fr.free.nrw.commons.upload.FileProcessor
4343
import fr.free.nrw.commons.upload.FileUtilsWrapper
44+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
4445
import io.reactivex.schedulers.Schedulers
4546
import kotlinx.coroutines.flow.MutableStateFlow
4647
import kotlinx.coroutines.flow.asStateFlow
@@ -217,6 +218,7 @@ class ImageFragment :
217218
imageAdapter.setSingleSelection(singleSelection)
218219
gridLayoutManager = GridLayoutManager(context, getSpanCount())
219220
with(binding?.selectorRv) {
221+
this?.applyEdgeToEdgeBottomPaddingInsets()
220222
this?.layoutManager = gridLayoutManager
221223
this?.setHasFixedSize(true)
222224
this?.adapter = imageAdapter

0 commit comments

Comments
 (0)