diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 61bc80a..d51d83a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -38,9 +38,9 @@ jobs:
- name: Download emu image and platform tools
run: echo "yes" | /usr/local/lib/android/sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools"
- name: Setup emu
- run: ./gradlew sampleapp:pixel5api34Setup
+ run: ./gradlew sampleapp:pixel5api35Setup
- name: Run UI Tests
- run: ./gradlew sampleapp:pixel5api34DebugAndroidTest -Pandroid.testoptions.manageddevices.emulator.gpu=swiftshader_indirect
+ run: ./gradlew sampleapp:pixel5api35DebugAndroidTest -Pandroid.testoptions.manageddevices.emulator.gpu=swiftshader_indirect
publish_release:
name: Publish Release
diff --git a/build-conventions/src/main/groovy/Kherkin.sharedPublish.gradle b/build-conventions/src/main/groovy/Kherkin.sharedPublish.gradle
index a168963..fed68ef 100644
--- a/build-conventions/src/main/groovy/Kherkin.sharedPublish.gradle
+++ b/build-conventions/src/main/groovy/Kherkin.sharedPublish.gradle
@@ -22,7 +22,7 @@ def getVersionName = { ->
}
android {
- compileSdk 34
+ compileSdk 35
version getVersionName()
publishing {
@@ -34,7 +34,7 @@ android {
defaultConfig {
minSdk 24
- targetSdk 34
+ targetSdk 35
versionName getVersionName()
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 9e463d7..ba4a784 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,25 +1,25 @@
[versions]
-activityCompose = "1.10.0"
+activityCompose = "1.10.1"
androidGradlePlugin = "8.6.1"
androidxJunit = "1.2.1"
-androidxNavigation = "2.8.7"
+androidxNavigation = "2.9.0"
androidxRules = "1.6.1"
androidxRunner = "1.6.2"
androidxUiautomator = "2.3.0"
-appcompat = "1.7.0"
-composeBom = "2025.02.00"
-constraintlayout = "2.2.0"
+appcompat = "1.7.1"
+composeBom = "2025.06.01"
+constraintlayout = "2.2.1"
espresso = "3.6.1"
findbugs = "3.0.2"
-fragmentKtx = "1.8.6"
+fragmentKtx = "1.8.8"
javaxInject = "1"
jreleaser = "1.17.0"
junit = "4.13.2"
kotlin = "2.1.10"
-lifecycleViewmodelKtx = "2.8.7"
+lifecycleViewmodelKtx = "2.9.1"
material = "1.12.0"
orchestrator = "1.5.1"
-viewbinding = "8.8.0"
+viewbinding = "8.11.0"
[libraries]
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
diff --git a/sampleapp/build.gradle b/sampleapp/build.gradle
index aed47e8..178cde1 100644
--- a/sampleapp/build.gradle
+++ b/sampleapp/build.gradle
@@ -43,9 +43,9 @@ android {
execution "ANDROIDX_TEST_ORCHESTRATOR"
managedDevices {
localDevices {
- pixel5api34 {
+ pixel5api35 {
device = "Pixel 5"
- apiLevel = 34
+ apiLevel = 35
systemImageSource = "aosp-atd"
}
}
diff --git a/sampleapp/src/main/AndroidManifest.xml b/sampleapp/src/main/AndroidManifest.xml
index 0270df6..78c6059 100644
--- a/sampleapp/src/main/AndroidManifest.xml
+++ b/sampleapp/src/main/AndroidManifest.xml
@@ -18,7 +18,10 @@
-
+
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt
index 609ce68..034e485 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt
@@ -48,7 +48,8 @@ private fun SetupContent() {
@Composable
private fun Greeting() {
- Text(text = stringResource(id = R.string.final_title))
+ Text(text = stringResource(id = R.string.final_title),
+ modifier = Modifier.padding(24.dp))
}
@Composable
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/SecondComposeActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/SecondComposeActivity.kt
index 6887fda..ce808ed 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/SecondComposeActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/SecondComposeActivity.kt
@@ -46,7 +46,8 @@ private fun SetupContent() {
@Composable
private fun Greeting() {
- Text(text = stringResource(id = R.string.second_title))
+ Text(text = stringResource(id = R.string.second_title),
+ modifier = Modifier.padding(24.dp))
}
@Composable
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ButtonActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ButtonActivity.kt
index 9e978d1..512a657 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ButtonActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ButtonActivity.kt
@@ -11,9 +11,13 @@ import android.text.style.ClickableSpan
import android.view.Menu
import android.view.MenuItem
import android.view.View
+import android.view.ViewGroup
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.Observer
import com.progressive.kherkin.sampleapp.R
import com.progressive.kherkin.sampleapp.databinding.ActivityButtonBinding
@@ -32,6 +36,8 @@ class ButtonActivity : AppCompatActivity(R.layout.activity_button) {
binding = ActivityButtonBinding.inflate(layoutInflater)
setContentView(binding.root)
+ setStatusBarMargin()
+
setupClickListeners()
setupObservers()
}
@@ -144,4 +150,19 @@ class ButtonActivity : AppCompatActivity(R.layout.activity_button) {
binding.buttonClickCounter.text = getString(R.string.button_click_counter_clicked, clicks + 1)
})
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.buttonConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/FinalActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/FinalActivity.kt
index 18e4e5d..85580a5 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/FinalActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/FinalActivity.kt
@@ -3,7 +3,11 @@ package com.progressive.sampleapp.activities.xml
import android.content.Intent
import android.os.Bundle
import android.view.View
+import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import com.progressive.kherkin.sampleapp.R
import com.progressive.kherkin.sampleapp.databinding.ActivityFinalBinding
@@ -18,6 +22,8 @@ class FinalActivity : AppCompatActivity(R.layout.activity_final) {
binding = ActivityFinalBinding.inflate(layoutInflater)
setContentView(binding.root)
+ setStatusBarMargin()
+
setupClickListener()
}
@@ -32,4 +38,19 @@ class FinalActivity : AppCompatActivity(R.layout.activity_final) {
binding.buttonBottom.text = getString(R.string.button_clicked)
}
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.finalConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ListActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ListActivity.kt
index 2000e40..cf0e2ff 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ListActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ListActivity.kt
@@ -3,8 +3,12 @@ package com.progressive.sampleapp.activities.xml
import android.content.Intent
import android.os.Bundle
import android.view.View
+import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@@ -22,6 +26,7 @@ class ListActivity : AppCompatActivity(R.layout.activity_list) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = getString(R.string.list_activity_title)
+ setStatusBarMargin()
initDataset()
}
@@ -42,4 +47,19 @@ class ListActivity : AppCompatActivity(R.layout.activity_list) {
divider.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider)!!)
recyclerView.addItemDecoration(divider)
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.listConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/TextFieldActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/TextFieldActivity.kt
index b4f3e4c..f9d837a 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/TextFieldActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/TextFieldActivity.kt
@@ -5,7 +5,11 @@ import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
+import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import com.progressive.kherkin.sampleapp.R
import com.progressive.kherkin.sampleapp.databinding.ActivityTextFieldBinding
import com.progressive.sampleapp.activities.compose.SecondComposeActivity
@@ -27,6 +31,8 @@ class TextFieldActivity : AppCompatActivity(R.layout.activity_text_field) {
binding = ActivityTextFieldBinding.inflate(layoutInflater)
setContentView(binding.root)
+ setStatusBarMargin()
+
binding.editTextEnabledLeft.addTextChangedListener(enabledTextWatcher)
binding.editTextVisibleLeft.addTextChangedListener(visibilityTextWatcher)
binding.editTextWithLabel.addTextChangedListener(numericTextWatcher)
@@ -80,4 +86,19 @@ class TextFieldActivity : AppCompatActivity(R.layout.activity_text_field) {
binding.editTextWithLabel2.visibility = View.VISIBLE
}
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.textConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ViewPagerActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ViewPagerActivity.kt
index e887d46..29514da 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ViewPagerActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/ViewPagerActivity.kt
@@ -3,7 +3,11 @@ package com.progressive.sampleapp.activities.xml
import android.content.Intent
import android.os.Bundle
import android.view.View
+import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.commit
import com.progressive.kherkin.sampleapp.R
import com.progressive.sampleapp.fragments.ViewPagerFragment
@@ -13,6 +17,9 @@ class ViewPagerActivity : AppCompatActivity(R.layout.activity_view_pager) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = getString(R.string.view_pager_activity_title)
+
+ setStatusBarMargin()
+
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
@@ -30,4 +37,19 @@ class ViewPagerActivity : AppCompatActivity(R.layout.activity_view_pager) {
intent = Intent(this, FinalActivity::class.java)
startActivity(intent)
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.viewPagerConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/WebViewActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/WebViewActivity.kt
index 630e981..cf08d12 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/WebViewActivity.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/xml/WebViewActivity.kt
@@ -1,9 +1,14 @@
package com.progressive.sampleapp.activities.xml
import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import com.progressive.kherkin.sampleapp.R
import com.progressive.kherkin.sampleapp.databinding.ActivityWebviewBinding
@@ -20,8 +25,25 @@ class WebViewActivity : AppCompatActivity(R.layout.activity_webview) {
binding = ActivityWebviewBinding.inflate(layoutInflater)
setContentView(binding.root)
+ setStatusBarMargin()
+
webView = binding.webView
webView.loadUrl(getString(R.string.web_url))
webView.webViewClient = WebViewClient()
}
+
+ private fun setStatusBarMargin() {
+ val view = findViewById(R.id.webViewConstraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/fragments/MainFragment.kt b/sampleapp/src/main/java/com/progressive/sampleapp/fragments/MainFragment.kt
index 061c939..16b19ac 100644
--- a/sampleapp/src/main/java/com/progressive/sampleapp/fragments/MainFragment.kt
+++ b/sampleapp/src/main/java/com/progressive/sampleapp/fragments/MainFragment.kt
@@ -10,8 +10,11 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
+import androidx.core.graphics.Insets
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
@@ -44,6 +47,8 @@ class MainFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ setStatusBarMargin()
+
setupMenu()
setupClickListeners()
handleNavigation()
@@ -135,4 +140,19 @@ class MainFragment : Fragment() {
binding.textTimePicker.setText(time)
}
}
+
+ private fun setStatusBarMargin() {
+ val view = activity?.findViewById(R.id.constraint)
+ if (view != null) {
+ val params = view.layoutParams
+ if (params is ViewGroup.MarginLayoutParams) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { _: View?, windowInsets: WindowInsetsCompat ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
+ params.setMargins(0, insets.top, 0, 0)
+ view.requestLayout()
+ windowInsets
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/sampleapp/src/main/res/layout/activity_button.xml b/sampleapp/src/main/res/layout/activity_button.xml
index 2300aca..c142ac4 100644
--- a/sampleapp/src/main/res/layout/activity_button.xml
+++ b/sampleapp/src/main/res/layout/activity_button.xml
@@ -2,6 +2,7 @@
diff --git a/sampleapp/src/main/res/layout/activity_final.xml b/sampleapp/src/main/res/layout/activity_final.xml
index a304754..2d788f6 100644
--- a/sampleapp/src/main/res/layout/activity_final.xml
+++ b/sampleapp/src/main/res/layout/activity_final.xml
@@ -1,6 +1,7 @@
@@ -45,10 +46,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="800dp"
+ android:layout_marginBottom="40dp"
android:autofillHints="no"
android:hint="@string/edit_text_bottom"
android:inputType="text"
android:text=""
+ app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/buttonFinal" />
diff --git a/sampleapp/src/main/res/layout/activity_list.xml b/sampleapp/src/main/res/layout/activity_list.xml
index 66f9e89..c33ba2d 100644
--- a/sampleapp/src/main/res/layout/activity_list.xml
+++ b/sampleapp/src/main/res/layout/activity_list.xml
@@ -2,6 +2,7 @@
diff --git a/sampleapp/src/main/res/layout/activity_view_pager.xml b/sampleapp/src/main/res/layout/activity_view_pager.xml
index 7db2301..329b19a 100644
--- a/sampleapp/src/main/res/layout/activity_view_pager.xml
+++ b/sampleapp/src/main/res/layout/activity_view_pager.xml
@@ -1,6 +1,7 @@
diff --git a/sampleapp/src/main/res/layout/activity_webview.xml b/sampleapp/src/main/res/layout/activity_webview.xml
index 10cd2e7..79c2274 100644
--- a/sampleapp/src/main/res/layout/activity_webview.xml
+++ b/sampleapp/src/main/res/layout/activity_webview.xml
@@ -1,7 +1,8 @@
+ android:layout_height="match_parent"
+ android:id="@+id/webViewConstraint">
@color/black
- ?attr/colorPrimaryVariant
+ - true
\ No newline at end of file