From 7dddca6b13c15e3c9dfd0525231e8d0e56e820b6 Mon Sep 17 00:00:00 2001 From: smugleafdev Date: Tue, 1 Jul 2025 07:20:00 -0600 Subject: [PATCH 1/3] Update sample app for api 35/36 edge to edge --- sampleapp/src/main/AndroidManifest.xml | 5 ++++- .../compose/FinalComposeActivity.kt | 3 ++- .../compose/SecondComposeActivity.kt | 3 ++- .../activities/xml/ButtonActivity.kt | 21 ++++++++++++++++++ .../sampleapp/activities/xml/FinalActivity.kt | 21 ++++++++++++++++++ .../sampleapp/activities/xml/ListActivity.kt | 20 +++++++++++++++++ .../activities/xml/TextFieldActivity.kt | 21 ++++++++++++++++++ .../activities/xml/ViewPagerActivity.kt | 22 +++++++++++++++++++ .../activities/xml/WebViewActivity.kt | 22 +++++++++++++++++++ .../sampleapp/fragments/MainFragment.kt | 20 +++++++++++++++++ .../src/main/res/layout/activity_button.xml | 1 + .../src/main/res/layout/activity_final.xml | 3 +++ .../src/main/res/layout/activity_list.xml | 1 + .../main/res/layout/activity_view_pager.xml | 1 + .../src/main/res/layout/activity_webview.xml | 3 ++- sampleapp/src/main/res/values/themes.xml | 1 + 16 files changed, 164 insertions(+), 4 deletions(-) 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 From 19638a2ed57d7b41b66de3eb7a8633da9ef3de61 Mon Sep 17 00:00:00 2001 From: smugleafdev Date: Tue, 1 Jul 2025 07:23:34 -0600 Subject: [PATCH 2/3] Bump versions, run tests on api 35 --- gradle/libs.versions.toml | 16 ++++++++-------- sampleapp/build.gradle | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) 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..032ed9a 100644 --- a/sampleapp/build.gradle +++ b/sampleapp/build.gradle @@ -45,7 +45,7 @@ android { localDevices { pixel5api34 { device = "Pixel 5" - apiLevel = 34 + apiLevel = 35 systemImageSource = "aosp-atd" } } From 072d60fd67feb1c9bff0222b2f6df51a5b95cd27 Mon Sep 17 00:00:00 2001 From: smugleafdev Date: Tue, 1 Jul 2025 07:32:24 -0600 Subject: [PATCH 3/3] Update missed 34 -> 35 --- .github/workflows/build.yml | 4 ++-- .../src/main/groovy/Kherkin.sharedPublish.gradle | 4 ++-- sampleapp/build.gradle | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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/sampleapp/build.gradle b/sampleapp/build.gradle index 032ed9a..178cde1 100644 --- a/sampleapp/build.gradle +++ b/sampleapp/build.gradle @@ -43,7 +43,7 @@ android { execution "ANDROIDX_TEST_ORCHESTRATOR" managedDevices { localDevices { - pixel5api34 { + pixel5api35 { device = "Pixel 5" apiLevel = 35 systemImageSource = "aosp-atd"