Skip to content

Commit 014511d

Browse files
authored
Merge pull request #208 from caarmen/issue-206-fix-app-bar-insets
Issue #206: Fix broken insets since targeting Android 15.
2 parents d4a4d77 + a71a68e commit 014511d

File tree

10 files changed

+250
-150
lines changed

10 files changed

+250
-150
lines changed

Diff for: app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ android {
6363
namespace "ca.rmen.android.poetassistant"
6464
minSdkVersion 21
6565
targetSdkVersion 35
66-
versionCode 113008
67-
versionName "1.30.8"
66+
versionCode 113009
67+
versionName "1.30.9"
6868
// setting vectorDrawables.useSupportLibrary = true means pngs won't be generated at
6969
// build time: http://android-developers.blogspot.fr/2016/02/android-support-library-232.html
7070
vectorDrawables.useSupportLibrary = true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2024 Carmen Alvarez
3+
*
4+
* This file is part of Poet Assistant.
5+
*
6+
* Poet Assistant is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* Poet Assistant is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with Poet Assistant. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
20+
package ca.rmen.android.poetassistant
21+
22+
import android.view.View
23+
import android.view.ViewGroup
24+
import androidx.core.view.ViewCompat
25+
import androidx.core.view.WindowInsetsCompat
26+
import androidx.core.view.updateLayoutParams
27+
28+
fun fixInsets(view: View) {
29+
// Issue #206:
30+
// https://developer.android.com/develop/ui/views/layout/edge-to-edge#system-bars-insets
31+
ViewCompat.setOnApplyWindowInsetsListener(view) { v, windowInsets ->
32+
val insets = windowInsets.getInsets(
33+
WindowInsetsCompat.Type.systemBars()
34+
or WindowInsetsCompat.Type.displayCutout() or WindowInsetsCompat.Type.statusBars()
35+
)
36+
// To control the status bar color, we have to draw a view behind it.
37+
// https://developer.android.com/reference/android/view/Window.html#setStatusBarColor(int)
38+
// If we have this view, then make it the height of the status bar.
39+
val statusBarView = v.findViewById<View>(R.id.status_bar_view)
40+
statusBarView?.updateLayoutParams<ViewGroup.LayoutParams> {
41+
height = insets.top
42+
}
43+
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
44+
// If we don't have a status bar view, we need to shift the content
45+
// of the root view down, so it's below the status bar.
46+
if (statusBarView == null) {
47+
topMargin = insets.top
48+
}
49+
leftMargin = insets.left
50+
bottomMargin = insets.bottom
51+
rightMargin = insets.right
52+
}
53+
WindowInsetsCompat.CONSUMED
54+
}
55+
}

Diff for: app/src/main/kotlin/ca/rmen/android/poetassistant/about/AboutActivity.kt

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import android.widget.TextView
2929
import ca.rmen.android.poetassistant.R
3030
import ca.rmen.android.poetassistant.compat.VectorCompat
3131
import ca.rmen.android.poetassistant.databinding.ActivityAboutBinding
32+
import ca.rmen.android.poetassistant.fixInsets
3233

3334
class AboutActivity : AppCompatActivity() {
3435

@@ -50,6 +51,7 @@ class AboutActivity : AppCompatActivity() {
5051
val appVersionText = getString(R.string.about_app_version, getString(R.string.app_name), versionName)
5152
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_about)
5253
mBinding.txtVersion.text = appVersionText
54+
fixInsets(mBinding.root)
5355
hackSetIcons()
5456
}
5557

Diff for: app/src/main/kotlin/ca/rmen/android/poetassistant/about/LicenseActivity.kt

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import ca.rmen.android.poetassistant.Constants
3030
import ca.rmen.android.poetassistant.R
3131
import ca.rmen.android.poetassistant.dagger.DaggerHelper
3232
import ca.rmen.android.poetassistant.databinding.ActivityLicenseBinding
33+
import ca.rmen.android.poetassistant.fixInsets
3334
import java.io.BufferedReader
3435
import java.io.IOException
3536
import java.io.InputStreamReader
@@ -60,6 +61,7 @@ class LicenseActivity : AppCompatActivity() {
6061
val title = intent.getStringExtra(EXTRA_TITLE)
6162
val licenseFile = intent.getStringExtra(EXTRA_LICENSE_TEXT_ASSET_FILE)!!
6263
mBinding.tvTitle.text = title
64+
fixInsets(mBinding.root)
6365
val threading = DaggerHelper.getMainScreenComponent(this).getThreading()
6466
threading.execute({ readFile(licenseFile) },
6567
{ mBinding.tvLicenseText.text = it })

Diff for: app/src/main/kotlin/ca/rmen/android/poetassistant/main/dictionaries/ResultListFragment.kt

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ import android.view.MenuItem
3030
import android.view.View
3131
import android.view.ViewGroup
3232
import android.view.inputmethod.InputMethodManager
33+
import androidx.core.view.ViewCompat
34+
import androidx.core.view.WindowInsetsCompat
35+
import androidx.core.view.updatePadding
3336
import androidx.databinding.DataBindingUtil
3437
import androidx.fragment.app.Fragment
3538
import androidx.lifecycle.Observer
@@ -42,6 +45,7 @@ import ca.rmen.android.poetassistant.R
4245
import ca.rmen.android.poetassistant.compat.VectorCompat
4346
import ca.rmen.android.poetassistant.databinding.BindingCallbackAdapter
4447
import ca.rmen.android.poetassistant.databinding.FragmentResultListBinding
48+
import ca.rmen.android.poetassistant.fixInsets
4549
import ca.rmen.android.poetassistant.main.AppBarLayoutHelper
4650
import ca.rmen.android.poetassistant.main.Tab
4751
import ca.rmen.android.poetassistant.settings.SettingsPrefs
@@ -73,6 +77,7 @@ class ResultListFragment<out T: Any> : Fragment() {
7377
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_result_list, container, false)
7478
mBinding.recyclerView.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
7579
mBinding.recyclerView.setHasFixedSize(true)
80+
fixInsets(mBinding.recyclerView)
7681
@Suppress("UNCHECKED_CAST")
7782
mViewModel = ResultListFactory.createViewModel(it, this) as ResultListViewModel<T>
7883
mBinding.viewModel = mViewModel

Diff for: app/src/main/kotlin/ca/rmen/android/poetassistant/settings/SettingsActivity.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,14 @@ import android.provider.Settings
3131
import android.text.TextUtils
3232
import android.util.Log
3333
import android.view.View
34+
import android.view.ViewGroup
3435
import androidx.activity.result.contract.ActivityResultContracts
3536
import androidx.annotation.VisibleForTesting
3637
import androidx.appcompat.app.AppCompatActivity
3738
import androidx.core.content.ContextCompat
39+
import androidx.core.view.ViewCompat
40+
import androidx.core.view.WindowInsetsCompat
41+
import androidx.core.view.updateLayoutParams
3842
import androidx.databinding.DataBindingUtil
3943
import androidx.lifecycle.Observer
4044
import androidx.lifecycle.ViewModelProvider
@@ -49,6 +53,7 @@ import ca.rmen.android.poetassistant.Tts
4953
import ca.rmen.android.poetassistant.TtsState
5054
import ca.rmen.android.poetassistant.dagger.DaggerHelper
5155
import ca.rmen.android.poetassistant.databinding.ActivitySettingsBinding
56+
import ca.rmen.android.poetassistant.fixInsets
5257
import ca.rmen.android.poetassistant.main.dictionaries.ConfirmDialogFragment
5358
import com.google.android.material.snackbar.Snackbar
5459
import kotlinx.coroutines.launch
@@ -61,8 +66,9 @@ class SettingsActivity : AppCompatActivity() {
6166

6267
override fun onCreate(savedInstanceState: Bundle?) {
6368
super.onCreate(savedInstanceState)
64-
DataBindingUtil.setContentView<ActivitySettingsBinding>(this, R.layout.activity_settings)
69+
val binding = DataBindingUtil.setContentView<ActivitySettingsBinding>(this, R.layout.activity_settings)
6570
supportActionBar?.setDisplayHomeAsUpEnabled(true)
71+
fixInsets(binding.root)
6672
volumeControlStream = AudioManager.STREAM_MUSIC
6773
}
6874

0 commit comments

Comments
 (0)