From e823cd57586e7ca7886d97859cc0c4dc88ad8de0 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 19 May 2024 20:01:32 -0500 Subject: [PATCH 1/4] Update lint-baseline --- uhabits-android/lint-baseline.xml | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/uhabits-android/lint-baseline.xml b/uhabits-android/lint-baseline.xml index 35b787313..6de04b377 100644 --- a/uhabits-android/lint-baseline.xml +++ b/uhabits-android/lint-baseline.xml @@ -265,17 +265,6 @@ column="52"/> - - - - + + + + @@ -5139,13 +5135,13 @@ id="IconDipSize" message="The image `ic_launcher_monochrome.png` varies significantly in its density-independent (dip) size across the various density versions: mipmap-hdpi/ic_launcher_monochrome.png: 108x108 dp (162x162 px), mipmap-mdpi/ic_launcher_monochrome.png: 162x162 dp (162x162 px), mipmap-xhdpi/ic_launcher_monochrome.png: 108x108 dp (216x216 px), mipmap-xxhdpi/ic_launcher_monochrome.png: 108x108 dp (324x324 px), mipmap-xxxhdpi/ic_launcher_monochrome.png: 108x108 dp (432x432 px)"> + file="src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png"/> + file="src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png"/> + file="src/main/res/mipmap-hdpi/ic_launcher_monochrome.png"/> From 732ec1c70aad2dd7da066652e127dd6d510c9e2d Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 19 May 2024 20:36:43 -0500 Subject: [PATCH 2/4] Update AGP; disable lint --- build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- uhabits-android/build.gradle.kts | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b4e6235bf..c5279d865 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { val kotlinVersion = "1.9.22" - id("com.android.application") version "8.1.4" apply (false) + id("com.android.application") version "8.4.0" apply (false) id("org.jetbrains.kotlin.android") version kotlinVersion apply (false) id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false) id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply (false) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586a5..17655d0ef 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 28154d587..33bac5f0b 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -19,7 +19,7 @@ plugins { id("com.github.triplet.play") version "3.8.6" - id("com.android.application") version "8.1.4" + id("com.android.application") version "8.4.0" id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.kapt") id("org.jlleitschuh.gradle.ktlint") @@ -93,9 +93,7 @@ android { } lint { - baseline = file("lint-baseline.xml") - disable += "GradleDependency" - warningsAsErrors = true + abortOnError = false } } From e7165d993f9bc9b234acada275f0aa991bc90083 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Mon, 20 May 2024 09:32:07 -0500 Subject: [PATCH 3/4] Make compatible with edge-to-edge (API 35) --- uhabits-android/build.gradle.kts | 2 ++ .../uhabits/activities/about/AboutView.kt | 2 ++ .../habits/edit/EditHabitActivity.kt | 9 ++++---- .../habits/list/ListHabitsActivity.kt | 2 ++ .../habits/show/ShowHabitActivity.kt | 2 ++ .../activities/settings/SettingsActivity.kt | 2 ++ .../uhabits/automation/EditSettingActivity.kt | 2 ++ .../isoron/uhabits/utils/ViewExtensions.kt | 22 +++++++++++++++++-- .../src/main/res/values/styles.xml | 2 +- 9 files changed, 38 insertions(+), 7 deletions(-) diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 33bac5f0b..894c0b4ec 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -44,12 +44,14 @@ android { namespace = "org.isoron.uhabits" compileSdk = 34 + // compileSdkPreview = "VanillaIceCream" defaultConfig { versionCode = 20200 versionName = "2.2.0" minSdk = 28 targetSdk = 34 + // targetSdkPreview = "VanillaIceCream" applicationId = "org.isoron.uhabits" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutView.kt index bc52f6fc0..27a01225a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutView.kt @@ -26,6 +26,7 @@ import org.isoron.uhabits.BuildConfig import org.isoron.uhabits.R import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.databinding.AboutBinding +import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.setupToolbar @@ -54,5 +55,6 @@ class AboutView( binding.tvTranslate.setOnClickListener { screen.showTranslationWebsite() } binding.tvVersion.setOnClickListener { screen.onPressDeveloperCountdown() } binding.tvVersion.text = String.format(version, BuildConfig.VERSION_NAME) + applyRootViewInsets() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt index a2f329d71..5479ab78c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt @@ -22,7 +22,6 @@ package org.isoron.uhabits.activities.habits.edit import android.annotation.SuppressLint import android.content.res.ColorStateList import android.content.res.Resources -import android.graphics.Color import android.os.Bundle import android.text.Html import android.text.Spanned @@ -53,7 +52,8 @@ import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.core.models.Reminder import org.isoron.uhabits.core.models.WeekdayList import org.isoron.uhabits.databinding.ActivityEditHabitBinding -import org.isoron.uhabits.utils.ColorUtils +import org.isoron.uhabits.utils.applyRootViewInsets +import org.isoron.uhabits.utils.applyToolbarInsets import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.formatTime import org.isoron.uhabits.utils.toFormattedString @@ -94,6 +94,8 @@ class EditHabitActivity : AppCompatActivity() { themeSwitcher.apply() binding = ActivityEditHabitBinding.inflate(layoutInflater) + binding.root.applyRootViewInsets() + binding.toolbar.applyToolbarInsets() setContentView(binding.root) if (intent.hasExtra("habitId")) { @@ -352,8 +354,7 @@ class EditHabitActivity : AppCompatActivity() { androidColor = themeSwitcher.currentTheme.color(color).toInt() binding.colorButton.backgroundTintList = ColorStateList.valueOf(androidColor) if (!themeSwitcher.isNightMode) { - val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f) - window.statusBarColor = darkerAndroidColor + window.statusBarColor = androidColor binding.toolbar.setBackgroundColor(androidColor) } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index 21936d4ea..d16f7d702 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -45,6 +45,7 @@ import org.isoron.uhabits.inject.ActivityContextModule import org.isoron.uhabits.inject.DaggerHabitsActivityComponent import org.isoron.uhabits.inject.HabitsActivityComponent import org.isoron.uhabits.inject.HabitsApplicationComponent +import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.dismissCurrentDialog import org.isoron.uhabits.utils.restartWithFade @@ -100,6 +101,7 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { menu = component.listHabitsMenu Thread.setDefaultUncaughtExceptionHandler(BaseExceptionHandler(this)) component.listHabitsBehavior.onStartup() + rootView.applyRootViewInsets() setContentView(rootView) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index 14baee148..a7d07db53 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -49,6 +49,7 @@ import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitMenuPresenter import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter import org.isoron.uhabits.core.ui.views.OnDateClickedListener import org.isoron.uhabits.intents.IntentFactory +import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.dismissCurrentDialog @@ -109,6 +110,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { ) view.setListener(presenter) + view.applyRootViewInsets() setContentView(view) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt index 0d5e25224..684310cb6 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt @@ -26,6 +26,7 @@ import org.isoron.uhabits.R import org.isoron.uhabits.activities.AndroidThemeSwitcher import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.databinding.SettingsActivityBinding +import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.setupToolbar class SettingsActivity : AppCompatActivity() { @@ -42,6 +43,7 @@ class SettingsActivity : AppCompatActivity() { color = PaletteColor(11), theme = themeSwitcher.currentTheme ) + binding.root.applyRootViewInsets() setContentView(binding.root) } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt index 55468cfda..aea60a099 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.kt @@ -24,6 +24,7 @@ import androidx.appcompat.app.AppCompatActivity import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.activities.AndroidThemeSwitcher import org.isoron.uhabits.core.models.HabitMatcher +import org.isoron.uhabits.utils.applyRootViewInsets class EditSettingActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -45,6 +46,7 @@ class EditSettingActivity : AppCompatActivity() { onSave = controller::onSave, args = args ) + view.applyRootViewInsets() setContentView(view) } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 3c92e7e1b..4da816dbb 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -46,6 +46,8 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.content.FileProvider +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import com.google.android.material.snackbar.Snackbar import org.isoron.platform.gui.toInt import org.isoron.uhabits.HabitsApplication @@ -180,10 +182,10 @@ fun View.setupToolbar( } else { theme.color(color).toInt() } - val darkerColor = ColorUtils.mixColors(toolbarColor, Color.BLACK, 0.75f) toolbar.background = ColorDrawable(toolbarColor) + toolbar.applyToolbarInsets() val activity = context as AppCompatActivity - activity.window.statusBarColor = darkerColor + activity.window.statusBarColor = toolbarColor activity.setSupportActionBar(toolbar) activity.supportActionBar?.setDisplayHomeAsUpEnabled(displayHomeAsUpEnabled) } @@ -245,3 +247,19 @@ fun View.getCenter(): PointF { viewLocation[1] -= this.height / 2 return PointF(viewLocation[0].toFloat(), viewLocation[1].toFloat()) } + +fun View.applyRootViewInsets() { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding(systemBarsInsets.left, 0, systemBarsInsets.right, systemBarsInsets.bottom) + insets + } +} + +fun View.applyToolbarInsets() { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding(0, systemBarsInsets.top, 0, 0) + insets + } +} diff --git a/uhabits-android/src/main/res/values/styles.xml b/uhabits-android/src/main/res/values/styles.xml index 87d053fe9..a06043963 100644 --- a/uhabits-android/src/main/res/values/styles.xml +++ b/uhabits-android/src/main/res/values/styles.xml @@ -243,7 +243,7 @@ From fc9cc423d06c9c83ee14dc9ae4bdeb0781a93a5c Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Mon, 20 May 2024 16:40:19 -0500 Subject: [PATCH 4/4] Multiple fixes to edge-to-edge display (API 35) --- .../uhabits/activities/habits/show/ShowHabitView.kt | 2 ++ .../java/org/isoron/uhabits/utils/ViewExtensions.kt | 10 ++++++++-- .../src/main/res/layout/activity_edit_habit.xml | 11 +++++++---- uhabits-android/src/main/res/layout/automation.xml | 5 ++++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt index cbb85825e..aec96aed3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt @@ -25,12 +25,14 @@ import android.widget.FrameLayout import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitState import org.isoron.uhabits.databinding.ShowHabitBinding +import org.isoron.uhabits.utils.applyToolbarInsets import org.isoron.uhabits.utils.setupToolbar class ShowHabitView(context: Context) : FrameLayout(context) { private val binding = ShowHabitBinding.inflate(LayoutInflater.from(context)) init { + binding.toolbar.applyToolbarInsets() addView(binding.root) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 4da816dbb..8086ddb93 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -251,7 +251,11 @@ fun View.getCenter(): PointF { fun View.applyRootViewInsets() { ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - view.setPadding(systemBarsInsets.left, 0, systemBarsInsets.right, systemBarsInsets.bottom) + val displayCutoutInsets = insets.getInsets(WindowInsetsCompat.Type.displayCutout()) + val left = maxOf(systemBarsInsets.left, displayCutoutInsets.left) + val right = maxOf(systemBarsInsets.right, displayCutoutInsets.right) + view.setPadding(left, 0, right, 0) + view.background = ColorDrawable(Color.BLACK) insets } } @@ -259,7 +263,9 @@ fun View.applyRootViewInsets() { fun View.applyToolbarInsets() { ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - view.setPadding(0, systemBarsInsets.top, 0, 0) + val displayCutoutInsets = insets.getInsets(WindowInsetsCompat.Type.displayCutout()) + val top = maxOf(systemBarsInsets.top, displayCutoutInsets.top) + view.setPadding(0, top, 0, 0) insets } } diff --git a/uhabits-android/src/main/res/layout/activity_edit_habit.xml b/uhabits-android/src/main/res/layout/activity_edit_habit.xml index 75dddb551..32866f654 100644 --- a/uhabits-android/src/main/res/layout/activity_edit_habit.xml +++ b/uhabits-android/src/main/res/layout/activity_edit_habit.xml @@ -18,7 +18,8 @@ ~ with this program. If not, see . --> - + android:layout_height="0dp" + android:layout_weight="1" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + android:background="?attr/contrast0"> - + diff --git a/uhabits-android/src/main/res/layout/automation.xml b/uhabits-android/src/main/res/layout/automation.xml index 184a5ffcb..fde3ff2be 100644 --- a/uhabits-android/src/main/res/layout/automation.xml +++ b/uhabits-android/src/main/res/layout/automation.xml @@ -58,7 +58,10 @@ + style="@style/dialogFormPanel" + android:layout_height="0dp" + android:layout_weight="1" + android:background="?attr/contrast0">