diff --git a/CHANGELOG.md b/CHANGELOG.md index 775548b99..c37626019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,32 +1,54 @@ # Changelog +## [2.3.1] -- 2025-08-13 + +### Changed + +- Add notes to exported CSV files (@iSoron) + +### Fixed + +- Prevent some views from being obscured by system UI (@iSoron, #2171) +- Disable confetti if animations are disabled globally (@iSoron, #2170) +- Make symbols easier to distinguish in "pure black" dark mode (powerjungle, #2136) +- Trim unit labels when necessary (@hiqua, @iSoron, #2158) + ## [2.3.0] -- 2025-06-23 + ### Added + - Add support for Android 15 and 16 (@iSoron) - Show confetti animation (@gokulk16, @iSoron, #1743) - Show streaks for measurable habits (@teckwarz, #2059) - Allow user to unset measurable habits (@leontodd, @kalina559, #1899, #2109) ### Changed + - Change background widget color for habits with implicit checks (@wobbba, #1915) ### Fixed + - Fix notification when goal type is set to maximum (@manish99verma, #1931) - Never mark "at most" habits as completed for the day (@kalina559, #2077) - Increase minimum widget size (@iSoron, #2118) - Improve Gradle configuration (@jimlyas, #2108) ## [2.2.0] -- 2024-01-30 + ### Added + - Add support for Android 14 (@iSoron, @hiqua) - Allow user to change app language (@leondzn) ### Fixed + - Implement workaround to make notifications non-dismissible in Android 14 (@iSoron, #1872) - Fix splash screen background color in dark mode (@SIKV, #1888) ## [2.1.3] -- 2023-08-28 + ### Fixed + - Use text input on Samsung devices (@iSoron, #1719) - Prevent crash if alarm permission is revoked (@iSoron) - Adjust widget colors (@iSoron) @@ -34,7 +56,9 @@ - Fix skip button in locales that use comma instead of dot (@iSoron, #1721) ## [2.1.2] -- 2023-05-26 + ### Fixed + - Fix bug that caused widget to enter checkmark on wrong date (@iSoron, #1541) - Fix widget corners on Android 12 (@iSoron) - Fix bug that caused notes to be lost when editing a checkmark (@iSoron, #1566) @@ -42,18 +66,23 @@ - Accept comma (instead of dot) in certain locales (@iSoron) ### Changed + - Remove update delay after entering a checkmark (@iSoron) ### Removed -- Remove stack widgets (@iSoron) +- Remove stack widgets (@iSoron) ## [2.1.1] -- 2022-09-24 + ### Fixed + - Fix Tasker plugin (@iSoron, #1503) ## [2.1.0] -- 2022-09-10 + ### Added + - Allow user to add notes to specific dates (@vbh, #1103) - Allow user to track "at most" numerical habits (@KristianTashkov, #1101) - Allow user to add skips to measurable habits (@kalina559, #1319) @@ -64,10 +93,12 @@ - Add support for Android 13 themed icons (@cheeeeer, #1497) ### Removed + - Hide snooze button Android 12 notifications (@hiqua, #1226) - Remove preference to set LED lights (@iSoron) ### Changed + - Hide failed habits along with completed ones (@hiqua, #1052) - Cycle through all checkmark states when toggling (@iSoron) - Add delay after toggling a habit (@hiqua, @kalina559, #1147) @@ -76,6 +107,7 @@ - Increase target SDK to 31 (@hiqua) ### Fixed + - Fix small dialog buttons (@kalina559, #1096) - Fix invalid CSV files (@hiqua, #1177) - Fix small issues in calendar chart (@kalina559, #1314) @@ -84,13 +116,16 @@ - Fix widgets not working correctly on API 33 (@iSoron, #1488) ### Refactoring & Testing + - Replace raster icons by vector assets (@kalina559) - Remove JVM dependencies from uhabits-core module (@sgallese) - Add various missing tests (@sgallese) - Upgrade project dependencies (@hiqua, @sgallese) ## [2.0.3] - 2021-08-21 + ### Fixed + - Improve automatic checkmarks for monthly habits (@iSoron, #947) - Fix small theme issues (@iSoron) - Fix ANR on some Samsung phones (@iSoron, #962) @@ -102,9 +137,11 @@ ## [2.0.2] - 2021-05-23 ### Changed + - Make checkmark widget resizable ### Fixed + - Fix crash caused by numerical habits with zero target (@iSoron, #903) - Fix small issues with font size (@iSoron) - Allow fractional target values (@sumanabhi, #911) @@ -115,18 +152,22 @@ ## [2.0.1] - 2021-05-09 ### Added + - Make midnight delay optional and disabled by default (@hiqua) -- Add arrows to sort menu (@iSoron) +- Add arrows to sort menu (@iSoron) ### Removed + - Temporarily remove experimental device sync functionality. This feature will be re-added in Loop 2.1. ### Changed + - Make implicit checkmarks easier to read (@iSoron) - Update and improve list of translators (@hiqua, @iSoron) ### Fixed + - Disable transparency for stacked widgets (@hiqua) - Fix various color issues on the dark theme (@hiqua, @iSoron) - Fix "customize notifications" on older devices (@hiqua) @@ -135,6 +176,7 @@ - Fix checkmark widget not rendering properly on some Samsung phones (@iSoron) ### Refactoring & Testing + - Finish conversion of the entire project to Kotlin (@hiqua, @iSoron, @MarKco) - Automatically run large tests on GitHub Actions (@iSoron) - Remove unused v21 resources (@hiqua) @@ -142,6 +184,7 @@ ## [2.0.0-alpha] - 2020-11-29 ### Added + - Track numeric habits (@iSoron, @namnl) - Skip days without breaking streak (@KristianTashkov) - Sort habits by status (@hiqua) @@ -152,15 +195,18 @@ - Export backups daily (@iSoron) ### Removed + - Drop support to devices older than Android 6.0 (API 23) ### Fixed + - Reset chart offset when switching scale (@alxmjo) - Don't show reminders from archived habits (@KristianTashkov) - Lapses on non-daily habits decrease the score too much (@iSoron) - Update widgets at midnight (@KristianTashkov) ### Refactoring + - Convert files to Kotlin (@olegivo) ## [1.8.12] - 2021-01-30 @@ -185,13 +231,15 @@ ## [1.8.8] - 2020-06-21 -- Make small changes to the habit scheduling algorithm, so that "1 time every x days" habits work more predictably. +- Make small changes to the habit scheduling algorithm, so that "1 time every x days" habits work + more predictably. - Fix crash when saving habit ## [1.8.0] - 2020-01-01 - New bar chart showing number of repetitions performed in each week, month, quarter or year. -- Improved calculation of streaks for non-daily habits: performing habits on irregular weekdays will no longer break your streak. +- Improved calculation of streaks for non-daily habits: performing habits on irregular weekdays will + no longer break your streak. - Many more colors to choose from (now 20 in total). - Ability to customize how transparent the widgets are on your home screen. - Ability to customize the first day of the week. diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 804b30c8f..498c0881b 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -36,7 +36,7 @@ Updating gradle might fix this, so try again in the future to remove this and ru If this doesn't produce any warning, try to remove it. */ kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { @@ -44,8 +44,8 @@ android { compileSdk = 36 defaultConfig { - versionCode = 20300 - versionName = "2.3.0" + versionCode = 20301 + versionName = "2.3.1" minSdk = 28 targetSdk = 36 applicationId = "org.isoron.uhabits" @@ -79,11 +79,11 @@ android { compileOptions { isCoreLibraryDesugaringEnabled = true - targetCompatibility(JavaVersion.VERSION_11) - sourceCompatibility(JavaVersion.VERSION_11) + targetCompatibility(JavaVersion.VERSION_17) + sourceCompatibility(JavaVersion.VERSION_17) } - kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString() + kotlinOptions.jvmTarget = JavaVersion.VERSION_17.toString() buildFeatures.viewBinding = true lint.abortOnError = false } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt index ac133ec7d..a37d85234 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt @@ -22,7 +22,7 @@ package org.isoron.uhabits.activities.habits.list.views import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import org.isoron.uhabits.BaseViewTest -import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith @@ -35,23 +35,22 @@ class EmptyListViewTest : BaseViewTest() { } private val path = "habits/list/EmptyListView" - private val view: EmptyListView = EmptyListView(targetContext) - - @Before - override fun setUp() { - super.setUp() - measureView(view, dpToPixels(200), dpToPixels(200)) - } @Test + @Ignore("non-deterministic failure") fun testRender_done() { + val view = EmptyListView(targetContext) view.showDone() + measureView(view, dpToPixels(200), dpToPixels(200)) assertRenders(view, "$path/done.png") } @Test + @Ignore("non-deterministic failure") fun testRender_empty() { + val view = EmptyListView(targetContext) view.showEmpty() + measureView(view, dpToPixels(200), dpToPixels(200)) assertRenders(view, "$path/empty.png") } } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.kt index 628a2ebbf..392058714 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.kt @@ -25,6 +25,7 @@ import org.isoron.uhabits.R import org.isoron.uhabits.core.utils.DateUtils.Companion.getTodayWithOffset import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import java.io.IOException @@ -57,6 +58,7 @@ class CheckmarkWidgetViewTest : BaseViewTest() { @Test @Throws(IOException::class) + @Ignore("non-deterministic") fun testRender_checked() { assertRenders(view, PATH + "checked.png") } 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 27a01225a..0df0a5524 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.applyBottomInset import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.setupToolbar @@ -55,6 +56,7 @@ class AboutView( binding.tvTranslate.setOnClickListener { screen.showTranslationWebsite() } binding.tvVersion.setOnClickListener { screen.onPressDeveloperCountdown() } binding.tvVersion.text = String.format(version, BuildConfig.VERSION_NAME) + binding.outerLinearLayout.applyBottomInset() applyRootViewInsets() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.kt index 59225dd2f..9a4b24bf9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.kt @@ -204,7 +204,7 @@ class RingView : View { val res = StyledResources(context) if (backgroundColor == null) backgroundColor = res.getColor(R.attr.cardBgColor) if (inactiveColor == null) inactiveColor = res.getColor(R.attr.contrast100) - inactiveColor = setAlpha(inactiveColor!!, 0.1f) + inactiveColor = setAlpha(inactiveColor!!, 0.15f) rect = RectF() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 074f22f75..14e53298b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -23,6 +23,7 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle +import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import dagger.Lazy import nl.dionsegijn.konfetti.core.Party @@ -226,6 +227,14 @@ class ListHabitsScreen override fun showConfetti(color: PaletteColor, x: Float, y: Float) { if (x == 0f && y == 0f) return if (preferences.isConfettiAnimationDisabled) return + if (Settings.Global.getFloat( + activity.contentResolver, + Settings.Global.ANIMATOR_DURATION_SCALE, + 1f + ) == 0f + ) { + return + } val baseColor = themeSwitcher.currentTheme!!.color(color).toInt() rootView.get().konfettiView.start( Party( @@ -299,30 +308,36 @@ class ListHabitsScreen command.selected.size ) } + is ChangeHabitColorCommand -> { return activity.resources.getQuantityString( R.plurals.toast_habits_changed, command.selected.size ) } + is CreateHabitCommand -> { return activity.resources.getString(R.string.toast_habit_created) } + is DeleteHabitsCommand -> { return activity.resources.getQuantityString( R.plurals.toast_habits_deleted, command.selected.size ) } + is EditHabitCommand -> { return activity.resources.getQuantityString(R.plurals.toast_habits_changed, 1) } + is UnarchiveHabitsCommand -> { return activity.resources.getQuantityString( R.plurals.toast_habits_unarchived, command.selected.size ) } + else -> return null } } @@ -335,9 +350,11 @@ class ListHabitsScreen adapter.refresh() activity.showMessage(activity.resources.getString(R.string.habits_imported)) } + ImportDataTask.NOT_RECOGNIZED -> { activity.showMessage(activity.resources.getString(R.string.file_not_recognized)) } + else -> { activity.showMessage(activity.resources.getString(R.string.could_not_import)) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt index fd6df425f..9b5c7ca43 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt @@ -20,11 +20,14 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context +import android.graphics.Rect import android.os.Bundle import android.os.Parcelable import android.view.GestureDetector import android.view.MotionEvent import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper.DOWN import androidx.recyclerview.widget.ItemTouchHelper.END @@ -57,6 +60,7 @@ class HabitCardListView( ) : RecyclerView(context, null, R.attr.scrollableRecyclerViewStyle) { var checkmarkCount: Int = 0 + private var insetDecorationsAdded: Boolean = false var dataOffset: Int = 0 set(value) { @@ -75,9 +79,32 @@ class HabitCardListView( setHasFixedSize(true) isLongClickable = true layoutManager = LinearLayoutManager(context) + applyBottomInset() super.setAdapter(adapter) } + private fun applyBottomInset() { + ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> + if (insetDecorationsAdded) return@setOnApplyWindowInsetsListener insets + insetDecorationsAdded = true + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + addItemDecoration(object : ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: State + ) { + val itemCount = parent.adapter?.itemCount + if (parent.getChildAdapterPosition(view) == itemCount?.minus(1)) { + outRect.bottom = systemBarsInsets.bottom + } + } + }) + insets + } + } + fun createHabitCardView(): HabitCardView { return cardViewFactory.create() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index eea1244eb..2edf17225 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -238,17 +238,18 @@ class HabitCardView( private fun getAbsoluteButtonLocation(timestamp: Timestamp): PointF { val containerLocation = IntArray(2) - this.getLocationOnScreen(containerLocation) + this.getLocationInWindow(containerLocation) val relButtonLocation = getRelativeButtonLocation(timestamp) val windowInsets = rootWindowInsets - val statusBarHeight = if (SDK_INT <= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + val xInset = windowInsets?.displayCutout?.safeInsetLeft ?: 0 + val yInset = if (SDK_INT <= Build.VERSION_CODES.VANILLA_ICE_CREAM) { windowInsets?.systemWindowInsetTop ?: 0 } else { 0 } return PointF( - containerLocation[0].toFloat() + relButtonLocation.x, - containerLocation[1].toFloat() + relButtonLocation.y - statusBarHeight + containerLocation[0].toFloat() + relButtonLocation.x - xInset, + containerLocation[1].toFloat() + relButtonLocation.y - yInset ) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 03fe66e53..be2baa446 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -189,16 +189,19 @@ class NumberButtonView( textSize = dim(R.dimen.smallTextSize) typeface = getFontAwesome() } + value >= 0 -> { label = value.toShortString() typeface = BOLD_TYPEFACE textSize = dim(R.dimen.smallTextSize) } + preferences.areQuestionMarksEnabled -> { label = resources.getString(R.string.fa_question) typeface = getFontAwesome() textSize = dim(R.dimen.smallerTextSize) } + else -> { label = "0" typeface = BOLD_TYPEFACE @@ -212,14 +215,23 @@ class NumberButtonView( pUnit.color = activeColor if (units.isBlank()) { + // Draw number without units rect.set(0f, 0f, width.toFloat(), height.toFloat()) rect.offset(0f, 0.5f * em) canvas.drawText(label, rect.centerX(), rect.centerY(), pNumber) } else { + // Draw number rect.set(0f, 0f, width.toFloat(), height.toFloat()) canvas.drawText(label, rect.centerX(), rect.centerY(), pNumber) + + // Draw units + val maxUnitsWidth = width * 0.9f + var trimmedUnits = units + while (trimmedUnits.length > 2 && pUnit.measureText(trimmedUnits) > maxUnitsWidth) { + trimmedUnits = trimmedUnits.dropLast(2) + "…" + } rect.offset(0f, 1.3f * em) - canvas.drawText(units, rect.centerX(), rect.centerY(), pUnit) + canvas.drawText(trimmedUnits, rect.centerX(), rect.centerY(), pUnit) } drawNotesIndicator(canvas, color, em, notes) 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 fb484745d..c707f2d6d 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,6 +25,7 @@ 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.applyBottomInset import org.isoron.uhabits.utils.applyToolbarInsets import org.isoron.uhabits.utils.setupToolbar @@ -57,6 +58,7 @@ class ShowHabitView(context: Context) : FrameLayout(context) { } else { binding.targetCard.visibility = GONE } + binding.linearLayout.applyBottomInset() } fun setListener(presenter: ShowHabitPresenter) { 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 684310cb6..8b9b77480 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.applyBottomInset import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.setupToolbar @@ -44,6 +45,7 @@ class SettingsActivity : AppCompatActivity() { theme = themeSwitcher.currentTheme ) binding.root.applyRootViewInsets() + binding.root.applyBottomInset() setContentView(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 8086ddb93..5663ae8a2 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 @@ -260,6 +260,14 @@ fun View.applyRootViewInsets() { } } +fun View.applyBottomInset() { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding(0, 0, 0, systemBarsInsets.bottom) + insets + } +} + fun View.applyToolbarInsets() { ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) diff --git a/uhabits-android/src/main/res/layout/about.xml b/uhabits-android/src/main/res/layout/about.xml index 3eb152757..2dec3ae86 100644 --- a/uhabits-android/src/main/res/layout/about.xml +++ b/uhabits-android/src/main/res/layout/about.xml @@ -1,5 +1,4 @@ - - + android:layout_width="fill_parent" + android:layout_height="fill_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:background="?windowBackgroundColor" + android:fillViewport="true"> + style="@style/Toolbar" /> + android:src="@drawable/intro_icon_1" /> + android:text="@string/app_name" /> + android:text="" /> @@ -75,32 +75,32 @@ + android:textColor="?aboutScreenColor" /> + android:text="@string/pref_rate_this_app" /> + android:text="@string/pref_send_feedback" /> + android:text="@string/help_translate" /> + android:text="@string/pref_view_source_code" /> + android:id="@+id/tvPrivacy" + style="@style/About.Item.Clickable" + android:text="@string/pref_view_privacy" /> @@ -111,7 +111,7 @@ + android:textColor="?aboutScreenColor" /> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + -> + > diff --git a/uhabits-android/src/main/res/layout/show_habit.xml b/uhabits-android/src/main/res/layout/show_habit.xml index 72f1b7ca9..7631d8c9e 100644 --- a/uhabits-android/src/main/res/layout/show_habit.xml +++ b/uhabits-android/src/main/res/layout/show_habit.xml @@ -17,8 +17,7 @@ ~ with this program. If not, see . --> - + android:layout_alignParentTop="true" /> + style="@style/ShowHabit.Subtitle" /> + android:paddingTop="12dp" /> + android:paddingTop="12dp" /> + android:gravity="center" /> + android:gravity="center" /> + android:paddingBottom="0dp" /> + style="@style/Card" /> + style="@style/Card" /> diff --git a/uhabits-android/src/main/res/layout/show_habit_subtitle.xml b/uhabits-android/src/main/res/layout/show_habit_subtitle.xml index 7361b4565..837b264d9 100644 --- a/uhabits-android/src/main/res/layout/show_habit_subtitle.xml +++ b/uhabits-android/src/main/res/layout/show_habit_subtitle.xml @@ -1,5 +1,4 @@ - -