From 72956026751bc03026fea4460cd3d0e0d2f89a88 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 30 Jan 2025 11:29:45 +0100 Subject: [PATCH] Improve edge-to-edge handling --- Habitica/AndroidManifest.xml | 6 - .../res/layout/activity_adventure_guide.xml | 5 +- .../res/layout/activity_class_selection.xml | 2 + .../res/layout/activity_create_challenge.xml | 7 +- Habitica/res/layout/activity_fixcharacter.xml | 2 + Habitica/res/layout/activity_full_profile.xml | 4 +- Habitica/res/layout/activity_gem_purchase.xml | 4 +- Habitica/res/layout/activity_gift_gems.xml | 8 +- .../res/layout/activity_gift_subscription.xml | 9 +- Habitica/res/layout/activity_guidelines.xml | 5 +- Habitica/res/layout/activity_main_content.xml | 234 ++++---- .../res/layout/activity_notifications.xml | 3 + Habitica/res/layout/activity_party_invite.xml | 8 +- Habitica/res/layout/activity_prefs.xml | 10 +- .../res/layout/activity_report_message.xml | 6 +- .../res/layout/activity_skill_members.xml | 6 +- Habitica/res/layout/activity_skill_tasks.xml | 4 +- Habitica/res/layout/activity_task_form.xml | 546 ++++++++++-------- Habitica/res/layout/avatar_setup_drawer.xml | 4 +- Habitica/res/layout/bottom_sheet_wrapper.xml | 3 +- .../res/layout/dialog_challenge_filter.xml | 2 +- Habitica/res/layout/drawer_main.xml | 285 ++++----- Habitica/res/layout/fragment_about.xml | 3 +- .../res/layout/fragment_challenge_detail.xml | 3 +- Habitica/res/layout/fragment_chat.xml | 4 +- .../res/layout/fragment_compose_scrolling.xml | 1 + Habitica/res/layout/fragment_faq_detail.xml | 3 +- Habitica/res/layout/fragment_faq_overview.xml | 6 +- Habitica/res/layout/fragment_gem_purchase.xml | 3 +- .../res/layout/fragment_gift_gem_balance.xml | 5 +- .../res/layout/fragment_gift_gem_purchase.xml | 5 +- Habitica/res/layout/fragment_guild_detail.xml | 3 +- Habitica/res/layout/fragment_inbox.xml | 1 + Habitica/res/layout/fragment_no_party.xml | 1 + Habitica/res/layout/fragment_party_detail.xml | 1 + Habitica/res/layout/fragment_party_invite.xml | 6 +- Habitica/res/layout/fragment_promo_info.xml | 3 +- Habitica/res/layout/fragment_quest_detail.xml | 3 +- .../res/layout/fragment_report_message.xml | 1 + Habitica/res/layout/fragment_setup_tasks.xml | 4 +- Habitica/res/layout/fragment_stats.xml | 3 +- .../layout/fragment_subscription_content.xml | 5 +- .../res/layout/fragment_support_bug_fix.xml | 5 +- Habitica/res/layout/fragment_support_main.xml | 5 +- .../layout/fragment_tasks_recyclerview.xml | 23 + .../layout/widget_configure_habit_button.xml | 4 +- Habitica/res/values/styles.xml | 3 +- .../RealmBaseLocalRepository.kt | 2 +- .../habitica/ui/activities/BaseActivity.kt | 17 +- .../ui/activities/FullProfileActivity.kt | 4 +- .../habitica/ui/activities/MainActivity.kt | 10 + .../ui/activities/ReportMessageActivity.kt | 6 +- .../ui/activities/TaskFormActivity.kt | 7 +- .../ui/fragments/NavigationDrawerFragment.kt | 25 + .../purchases/SubscriptionFragment.kt | 2 +- .../social/party/PartySeekingFragment.kt | 36 +- .../tasks/TaskRecyclerViewFragment.kt | 11 +- .../ui/helpers/RecyclerViewEmptySupport.kt | 24 + .../habitica/ui/views/BottomSheetUtils.kt | 7 + .../dialogs/HabiticaBottomSheetDialog.kt | 4 + .../HabiticaBottomNavigationView.kt | 8 + 61 files changed, 828 insertions(+), 602 deletions(-) create mode 100644 Habitica/res/layout/fragment_tasks_recyclerview.xml diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index fffa0c3b8..d980ffcb6 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -70,27 +70,23 @@ android:name=".ui.activities.ArmoireActivity" android:parentActivityName=".ui.activities.MainActivity" android:label="@string/armoire" - android:screenOrientation="unspecified" tools:ignore="UnusedAttribute"> @@ -21,6 +23,7 @@ - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_class_selection.xml b/Habitica/res/layout/activity_class_selection.xml index 81ae8a0b6..dc1764e55 100644 --- a/Habitica/res/layout/activity_class_selection.xml +++ b/Habitica/res/layout/activity_class_selection.xml @@ -6,6 +6,8 @@ android:layout_height="match_parent" android:orientation="vertical"> diff --git a/Habitica/res/layout/activity_create_challenge.xml b/Habitica/res/layout/activity_create_challenge.xml index e5b096256..0665b75ff 100644 --- a/Habitica/res/layout/activity_create_challenge.xml +++ b/Habitica/res/layout/activity_create_challenge.xml @@ -7,6 +7,8 @@ android:orientation="vertical"> @@ -21,6 +23,7 @@ - - + diff --git a/Habitica/res/layout/activity_fixcharacter.xml b/Habitica/res/layout/activity_fixcharacter.xml index b81e46b60..16ede3b6e 100644 --- a/Habitica/res/layout/activity_fixcharacter.xml +++ b/Habitica/res/layout/activity_fixcharacter.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context="com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity"> @@ -22,7 +24,7 @@ diff --git a/Habitica/res/layout/activity_gem_purchase.xml b/Habitica/res/layout/activity_gem_purchase.xml index 4f50cc2c8..4d829d19a 100644 --- a/Habitica/res/layout/activity_gem_purchase.xml +++ b/Habitica/res/layout/activity_gem_purchase.xml @@ -20,9 +20,9 @@ + android:layout_height="wrap_content"> - + - + diff --git a/Habitica/res/layout/activity_guidelines.xml b/Habitica/res/layout/activity_guidelines.xml index 6ef2504fa..040b7a3c4 100644 --- a/Habitica/res/layout/activity_guidelines.xml +++ b/Habitica/res/layout/activity_guidelines.xml @@ -8,6 +8,8 @@ android:orientation="vertical"> @@ -23,6 +25,7 @@ @@ -31,4 +34,4 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_main_content.xml b/Habitica/res/layout/activity_main_content.xml index ee891de3e..2fa5f8769 100644 --- a/Habitica/res/layout/activity_main_content.xml +++ b/Habitica/res/layout/activity_main_content.xml @@ -1,146 +1,154 @@ - + tools:context=".ui.activities.MainActivity"> + + + - + android:background="?attr/headerBackgroundColor"> + + + android:id="@+id/header_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="?attr/actionBarSize" + android:layout_marginEnd="@dimen/header_border_spacing" + android:layout_marginStart="@dimen/header_border_spacing" + android:layout_marginBottom="@dimen/spacing_medium" + app:layout_collapseMode="parallax" /> + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?attr/actionBarSize" + style="@style/Toolbar.Modern" + android:background="?attr/headerBackgroundColor" + app:layout_collapseMode="pin" + app:popupTheme="@style/Theme.AppCompat.DayNight" + app:contentInsetStart="0dp" + app:contentInsetStartWithNavigation="0dp"> + + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_marginEnd="16dp"> + android:id="@+id/toolbar_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:ellipsize="end" + android:maxLines="1" + android:singleLine="true" + android:layout_alignParentStart="true" + style="@style/ToolbarTitle" + tools:text="Habitica" + android:background="@drawable/teams_title_bg" + android:paddingHorizontal="@dimen/spacing_large" + android:paddingVertical="1dp" /> + android:id="@+id/toolbar_accessory_container" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="centerCrop" + android:adjustViewBounds="true" + android:layout_centerVertical="true" + android:layout_alignParentEnd="true" /> + android:id="@+id/detail_tabs" + android:layout_width="match_parent" + android:layout_height="48dp" + android:layout_gravity="bottom" + android:background="?headerOffsetColor" + android:elevation="0dp" + android:fillViewport="false" + app:layout_anchor="@+id/collapsing_toolbar" + app:layout_anchorGravity="bottom" + app:layout_collapseMode="pin" + app:tabGravity="fill" + app:tabIndicatorColor="?textColorPrimary" + app:tabSelectedTextColor="?textColorPrimary" + app:tabMode="fixed" /> + - + android:paddingVertical="2dp" + android:paddingHorizontal="@dimen/spacing_medium" + android:background="@color/error_banner_background" + tools:visibility="visible" + android:visibility="gone"> + + - + android:layout_height="match_parent" + android:layout_gravity="bottom|center_horizontal"> + + + android:id="@+id/bottom_navigation" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentStart="true" + android:layout_alignParentEnd="true" /> diff --git a/Habitica/res/layout/activity_notifications.xml b/Habitica/res/layout/activity_notifications.xml index 59eb84eea..1a6d967b5 100644 --- a/Habitica/res/layout/activity_notifications.xml +++ b/Habitica/res/layout/activity_notifications.xml @@ -8,6 +8,8 @@ tools:context=".ui.activities.NotificationsActivity"> @@ -37,6 +39,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior"> - + - + - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_report_message.xml b/Habitica/res/layout/activity_report_message.xml index ab39fe2db..3f2cbbf02 100644 --- a/Habitica/res/layout/activity_report_message.xml +++ b/Habitica/res/layout/activity_report_message.xml @@ -16,7 +16,8 @@ app:behavior_peekHeight="350dp" app:behavior_hideable="true"> @@ -61,6 +62,7 @@ @@ -129,4 +131,4 @@ - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_skill_members.xml b/Habitica/res/layout/activity_skill_members.xml index 16b161655..55ac14671 100644 --- a/Habitica/res/layout/activity_skill_members.xml +++ b/Habitica/res/layout/activity_skill_members.xml @@ -8,6 +8,8 @@ android:orientation="vertical"> @@ -24,7 +26,7 @@ - - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_skill_tasks.xml b/Habitica/res/layout/activity_skill_tasks.xml index 7bd804109..b027533cb 100644 --- a/Habitica/res/layout/activity_skill_tasks.xml +++ b/Habitica/res/layout/activity_skill_tasks.xml @@ -8,6 +8,8 @@ android:orientation="vertical"> @@ -46,4 +48,4 @@ android:layout_weight="1" android:background="?attr/colorContentBackground" /> - \ No newline at end of file + diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml index 3df398cf4..cffc5d755 100644 --- a/Habitica/res/layout/activity_task_form.xml +++ b/Habitica/res/layout/activity_task_form.xml @@ -1,285 +1,321 @@ - + android:layout_height="match_parent" + android:orientation="vertical" + android:background="?attr/colorTintedBackground" + tools:context="com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity"> + + + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?attr/actionBarSize" + android:theme="@style/Toolbar" + style="@style/ToolbarTitleStyle" + app:layout_scrollFlags="scroll|enterAlways" + app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" /> + - - + + - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + tools:background="@color/brand_300" + android:orientation="vertical" + android:paddingStart="@dimen/spacing_large" + android:paddingEnd="@dimen/spacing_large" + android:paddingBottom="@dimen/spacing_large"> - - - - - - + style="@style/TaskFormTextInputLayoutAppearance" + app:boxStrokeWidth="2dp" + app:boxStrokeWidthFocused="2dp" + app:hintTextColor="?colorPrimaryText" + android:backgroundTint="?attr/colorPrimaryText" + android:hint="@string/task_title" + android:alpha="0.75"> - + + - - - + + + + + - + android:textColor="@color/text_primary" + tools:visibility="visible" + tools:text="Challenge Name" /> + - - - - - - + android:layout_marginStart="@dimen/spacing_large" + android:layout_marginEnd="@dimen/spacing_large"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Habitica/res/layout/avatar_setup_drawer.xml b/Habitica/res/layout/avatar_setup_drawer.xml index ad5a9f8dd..7b23d7452 100644 --- a/Habitica/res/layout/avatar_setup_drawer.xml +++ b/Habitica/res/layout/avatar_setup_drawer.xml @@ -27,7 +27,7 @@ app:tabPaddingStart="24dp" /> - - \ No newline at end of file + diff --git a/Habitica/res/layout/bottom_sheet_wrapper.xml b/Habitica/res/layout/bottom_sheet_wrapper.xml index f1ae3343f..3e94f98b6 100644 --- a/Habitica/res/layout/bottom_sheet_wrapper.xml +++ b/Habitica/res/layout/bottom_sheet_wrapper.xml @@ -14,6 +14,7 @@ android:layout_gravity="center_horizontal" /> - \ No newline at end of file + diff --git a/Habitica/res/layout/dialog_challenge_filter.xml b/Habitica/res/layout/dialog_challenge_filter.xml index c84ec77d9..d2867e467 100644 --- a/Habitica/res/layout/dialog_challenge_filter.xml +++ b/Habitica/res/layout/dialog_challenge_filter.xml @@ -73,7 +73,7 @@ android:padding="0dp"/> - + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment"> + android:id="@+id/menuHeaderView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="64dp" + android:paddingStart="16dp" + android:paddingEnd="1dp" + android:paddingBottom="8dp" + android:gravity="center_vertical" + android:orientation="horizontal" + android:background="?colorPrimaryOffset" + android:baselineAligned="false"> + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginEnd="@dimen/spacing_large" + android:background="@drawable/rounded_avatar_bg" + android:clipToPadding="true" + android:clipChildren="true"> + + android:id="@+id/avatarView" + android:layout_width="70dp" + android:layout_height="70dp" + android:layout_gravity="center" /> + - + android:layout_gravity="center_vertical" + android:orientation="vertical"> + + android:id="@+id/toolbarTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="1" + android:singleLine="true" + tools:text="Habitica" + style="@style/Body1" + android:textColor="@color/white" /> + + + android:id="@+id/notificationsButtonWrapper" + android:layout_width="33dp" + android:layout_height="33dp" + android:layout_marginStart="16dp"> + + android:id="@+id/notificationsButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@color/transparent" + android:src="@drawable/menu_notifications" + android:layout_centerVertical="true" + android:clickable="false" + android:contentDescription="@string/notifications" /> + android:id="@+id/notificationsBadge" + android:layout_width="wrap_content" + android:layout_height="20dp" + android:layout_alignStart="@id/notificationsButton" + android:layout_alignTop="@id/notificationsButton" + android:layout_marginStart="13dp" + android:layout_marginTop="-13dp" + android:background="@drawable/badge_circle" + android:gravity="center" + android:minWidth="20dp" + android:paddingTop="0dp" + android:textColor="@color/white" + android:textSize="12sp" + android:visibility="gone" + tools:text="1" + tools:visibility="visible" /> + + android:id="@+id/messagesButtonWrapper" + android:layout_width="33dp" + android:layout_height="33dp" + android:layout_marginStart="8dp"> + + android:id="@+id/messagesButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@color/transparent" + android:src="@drawable/menu_messages" + android:layout_centerVertical="true" + android:clickable="false" + android:contentDescription="@string/inbox" /> + android:id="@+id/messagesBadge" + android:layout_width="wrap_content" + android:layout_height="20dp" + android:layout_alignStart="@id/messagesButton" + android:layout_alignTop="@id/messagesButton" + android:layout_marginStart="13dp" + android:layout_marginTop="-12dp" + android:background="@drawable/badge_circle" + android:gravity="center" + android:minWidth="20dp" + android:paddingTop="0dp" + android:textColor="@color/white" + android:textSize="12sp" + android:visibility="gone" + tools:text="1" + tools:visibility="visible" /> + - + android:paddingStart="8dp" + android:paddingEnd="0dp"> + + + + android:id="@+id/settingsBadge" + android:layout_width="wrap_content" + android:layout_height="20dp" + android:layout_alignStart="@id/settingsButton" + android:layout_alignTop="@id/settingsButton" + android:layout_centerVertical="true" + android:layout_marginStart="13dp" + android:layout_marginTop="-12dp" + android:background="@drawable/badge_circle" + android:gravity="center" + android:minWidth="20dp" + android:paddingTop="0dp" + android:textColor="@color/white" + android:textSize="12sp" + android:visibility="gone" + tools:text="1" + tools:visibility="visible" /> + + android:id="@+id/recyclerView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="?attr/colorContentBackground" /> diff --git a/Habitica/res/layout/fragment_about.xml b/Habitica/res/layout/fragment_about.xml index a02b4c517..c9968ff41 100644 --- a/Habitica/res/layout/fragment_about.xml +++ b/Habitica/res/layout/fragment_about.xml @@ -1,5 +1,6 @@ - - - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_compose_scrolling.xml b/Habitica/res/layout/fragment_compose_scrolling.xml index 2418f8be3..b056303ff 100644 --- a/Habitica/res/layout/fragment_compose_scrolling.xml +++ b/Habitica/res/layout/fragment_compose_scrolling.xml @@ -1,5 +1,6 @@ diff --git a/Habitica/res/layout/fragment_faq_detail.xml b/Habitica/res/layout/fragment_faq_detail.xml index 65b4396d4..14cd03808 100644 --- a/Habitica/res/layout/fragment_faq_detail.xml +++ b/Habitica/res/layout/fragment_faq_detail.xml @@ -1,5 +1,6 @@ - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_faq_overview.xml b/Habitica/res/layout/fragment_faq_overview.xml index bbda2072c..962e1f891 100644 --- a/Habitica/res/layout/fragment_faq_overview.xml +++ b/Habitica/res/layout/fragment_faq_overview.xml @@ -1,5 +1,7 @@ - @@ -149,4 +151,4 @@ android:gravity="center"/> - + diff --git a/Habitica/res/layout/fragment_gem_purchase.xml b/Habitica/res/layout/fragment_gem_purchase.xml index 7b4526c48..39b75cfea 100644 --- a/Habitica/res/layout/fragment_gem_purchase.xml +++ b/Habitica/res/layout/fragment_gem_purchase.xml @@ -1,5 +1,6 @@ - - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_gift_gem_purchase.xml b/Habitica/res/layout/fragment_gift_gem_purchase.xml index 17bee47d1..08efd5479 100644 --- a/Habitica/res/layout/fragment_gift_gem_purchase.xml +++ b/Habitica/res/layout/fragment_gift_gem_purchase.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_guild_detail.xml b/Habitica/res/layout/fragment_guild_detail.xml index 00e8465a7..a2765c916 100644 --- a/Habitica/res/layout/fragment_guild_detail.xml +++ b/Habitica/res/layout/fragment_guild_detail.xml @@ -6,6 +6,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/refreshLayout"> - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_inbox.xml b/Habitica/res/layout/fragment_inbox.xml index 128c2222b..c3ba48d3c 100644 --- a/Habitica/res/layout/fragment_inbox.xml +++ b/Habitica/res/layout/fragment_inbox.xml @@ -7,6 +7,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_promo_info.xml b/Habitica/res/layout/fragment_promo_info.xml index 5e18f68ec..f8cc6a920 100644 --- a/Habitica/res/layout/fragment_promo_info.xml +++ b/Habitica/res/layout/fragment_promo_info.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_report_message.xml b/Habitica/res/layout/fragment_report_message.xml index 5d65ce580..c3444b3cc 100644 --- a/Habitica/res/layout/fragment_report_message.xml +++ b/Habitica/res/layout/fragment_report_message.xml @@ -63,6 +63,7 @@ diff --git a/Habitica/res/layout/fragment_setup_tasks.xml b/Habitica/res/layout/fragment_setup_tasks.xml index 4db1596a3..bc1ed7f62 100644 --- a/Habitica/res/layout/fragment_setup_tasks.xml +++ b/Habitica/res/layout/fragment_setup_tasks.xml @@ -48,11 +48,11 @@ android:layout_marginStart="@dimen/content_inset" android:layout_marginEnd="@dimen/content_inset" android:layout_marginBottom="12dp"/> - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_stats.xml b/Habitica/res/layout/fragment_stats.xml index 0f9a436e0..117dbbe08 100644 --- a/Habitica/res/layout/fragment_stats.xml +++ b/Habitica/res/layout/fragment_stats.xml @@ -1,5 +1,6 @@ - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_subscription_content.xml b/Habitica/res/layout/fragment_subscription_content.xml index beb8d1a76..497122fe0 100644 --- a/Habitica/res/layout/fragment_subscription_content.xml +++ b/Habitica/res/layout/fragment_subscription_content.xml @@ -1,8 +1,9 @@ - - @@ -135,4 +136,4 @@ android:layout_marginStart="@dimen/spacing_large" android:layout_marginEnd="@dimen/spacing_large" /> - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_support_main.xml b/Habitica/res/layout/fragment_support_main.xml index 5fae05eef..599dbce9e 100644 --- a/Habitica/res/layout/fragment_support_main.xml +++ b/Habitica/res/layout/fragment_support_main.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + diff --git a/Habitica/res/layout/fragment_tasks_recyclerview.xml b/Habitica/res/layout/fragment_tasks_recyclerview.xml new file mode 100644 index 000000000..7bbd6831c --- /dev/null +++ b/Habitica/res/layout/fragment_tasks_recyclerview.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/Habitica/res/layout/widget_configure_habit_button.xml b/Habitica/res/layout/widget_configure_habit_button.xml index b79ff31d1..c22b1821b 100644 --- a/Habitica/res/layout/widget_configure_habit_button.xml +++ b/Habitica/res/layout/widget_configure_habit_button.xml @@ -1,7 +1,7 @@ - - \ No newline at end of file + diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml index 927afef0a..5c9591dc7 100644 --- a/Habitica/res/values/styles.xml +++ b/Habitica/res/values/styles.xml @@ -1055,9 +1055,10 @@ true 0.3 @null - true + false @style/SheetDialogAnimations @style/Widget.App.BottomSheet.Modal + true @color/brand @color/brand_50 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt index fffac9d3c..c1a187a16 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt @@ -66,7 +66,7 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: } realm.executeTransaction { while (pendingSaves.isNotEmpty()) { - val pending = pendingSaves.removeFirst() + val pending = pendingSaves.removeAt(0) @Suppress("UNCHECKED_CAST") if (pending is RealmModel) { copy(it, pending) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index 7cdbfb7d8..b21454f28 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -15,15 +15,22 @@ import android.view.LayoutInflater import android.view.Menu import android.view.MenuItem import android.view.View +import android.view.ViewGroup.MarginLayoutParams +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.core.net.toUri +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.preference.PreferenceManager +import com.google.android.material.appbar.AppBarLayout import com.habitrpg.android.habitica.HabiticaApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.UserRepository @@ -119,6 +126,15 @@ abstract class BaseActivity : AppCompatActivity() { } } } + + findViewById(R.id.appbar)?.let { appbar -> + val paddingTop = appbar.paddingTop + ViewCompat.setOnApplyWindowInsetsListener(appbar) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(top = insets.top + paddingTop) + WindowInsetsCompat.CONSUMED + } + } } override fun onRestart() { @@ -217,7 +233,6 @@ abstract class BaseActivity : AppCompatActivity() { actionBar.setHomeButtonEnabled(true) } } - toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this, iconColor, backgroundColor) } } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index ca4cc02d0..f4d981927 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -251,7 +251,7 @@ class FullProfileActivity : BaseActivity() { clipboard?.setPrimaryClip(clip) if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { HabiticaSnackbar.showSnackbar( - this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, + this@FullProfileActivity.binding.nestedScrollView.getChildAt(0) as ViewGroup, String.format(getString(R.string.username_copied), userDisplayName), SnackbarDisplayType.NORMAL ) @@ -266,7 +266,7 @@ class FullProfileActivity : BaseActivity() { clipboard?.setPrimaryClip(clip) if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { HabiticaSnackbar.showSnackbar( - this@FullProfileActivity.binding.scrollView.getChildAt(0) as ViewGroup, + this@FullProfileActivity.binding.nestedScrollView.getChildAt(0) as ViewGroup, String.format(getString(R.string.id_copied), userDisplayName), SnackbarDisplayType.NORMAL ) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 1e429d3cb..2ed22f287 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -34,8 +34,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.children import androidx.core.view.setPadding +import androidx.core.view.updatePadding import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDestination @@ -237,6 +240,13 @@ open class MainActivity : BaseActivity(), SnackbarActivity { setupToolbar(binding.content.toolbar) + val headerPaddingTop = binding.content.headerView.paddingTop + ViewCompat.setOnApplyWindowInsetsListener(binding.content.headerView) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(top = insets.top + headerPaddingTop) + WindowInsetsCompat.CONSUMED + } + sideAvatarView = AvatarView(this, showBackground = true, showMount = false, showPet = false) viewModel.user.observe(this) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt index 424b56b1d..cdada7bc5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt @@ -48,7 +48,7 @@ class ReportMessageActivity : BaseActivity() { super.onCreate(savedInstanceState) setSupportActionBar(binding.toolbar) supportActionBar?.title = "" - raisedElevation = binding.appBar.elevation + raisedElevation = binding.appbar.elevation setStatusBarDim(true) binding.bottomSheet.setOnTouchListener { _, _ -> true } @@ -117,12 +117,12 @@ class ReportMessageActivity : BaseActivity() { private fun setStatusBarDim(dim: Boolean) { if (dim) { - binding.appBar.elevation = 0f + binding.appbar.elevation = 0f window.statusBarColor = getThemeColor(R.attr.colorPrimaryDark) binding.closeButton.visibility = View.GONE binding.toolbarTitle.setTypeface(null, Typeface.BOLD) } else { - binding.appBar.elevation = 8f + binding.appbar.elevation = 8f window.statusBarColor = ContextCompat.getColor(this, R.color.offset_background) binding.closeButton.visibility = View.VISIBLE binding.toolbarTitle.setTypeface(null, Typeface.NORMAL) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index 510547c92..39187c89f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -225,6 +225,7 @@ class TaskFormActivity : BaseActivity() { ContextCompat.getColor(this, R.color.white), upperTintColor ) + binding.appbar.setBackgroundColor(upperTintColor) } supportActionBar?.setBackgroundDrawable(ColorDrawable(upperTintColor)) binding.upperTextWrapper.setBackgroundColor(upperTintColor) @@ -267,12 +268,12 @@ class TaskFormActivity : BaseActivity() { View.OnFocusChangeListener { _, isFocused -> binding.notesInputLayout.alpha = if (isFocused) 0.8f else 0.6f } - binding.scrollView.setOnTouchListener { view, event -> + binding.nestedScrollView.setOnTouchListener { view, event -> userScrolled = - view == binding.scrollView && (event.action == MotionEvent.ACTION_SCROLL || event.action == MotionEvent.ACTION_MOVE) + view == binding.nestedScrollView && (event.action == MotionEvent.ACTION_SCROLL || event.action == MotionEvent.ACTION_MOVE) return@setOnTouchListener false } - binding.scrollView.setOnScrollChangeListener { _: NestedScrollView?, _: Int, _: Int, _: Int, _: Int -> + binding.nestedScrollView.setOnScrollChangeListener { _: NestedScrollView?, _: Int, _: Int, _: Int, _: Int -> if (userScrolled) { dismissKeyboard() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 519b122d5..cce0e3667 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -14,7 +14,10 @@ import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.os.bundleOf import androidx.core.view.GravityCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible +import androidx.core.view.updatePadding import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.DialogFragment import androidx.lifecycle.Lifecycle @@ -147,6 +150,28 @@ class NavigationDrawerFragment : DialogFragment() { false initializeMenuItems() + binding?.menuHeaderView?.let { + ViewCompat.setOnApplyWindowInsetsListener(it) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(top = insets.top) + WindowInsetsCompat.CONSUMED + } + } + + binding?.recyclerView?.let { + ViewCompat.setOnApplyWindowInsetsListener(it) { v, insets -> + val bars = insets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + bottom = bars.bottom, + left = bars.left + ) + WindowInsetsCompat.CONSUMED + } + } + adapter.itemSelectedEvents = { setSelection(it.transitionId, it.bundle, true) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index 65c091220..f585f4331 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -332,7 +332,7 @@ class SubscriptionFragment : BaseFragment() { binding?.content?.subscriptionOptions?.visibility = View.VISIBLE binding?.content?.subscriptionOptions?.postDelayed( { - binding?.content?.scrollView?.smoothScrollTo(0, binding?.content?.subscriptionOptions?.top ?: 0) + binding?.content?.nestedScrollView?.smoothScrollTo(0, binding?.content?.subscriptionOptions?.top ?: 0) }, 500 ) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt index 4040f5ef1..2688226b7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt @@ -23,7 +23,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text -import androidx.compose.material3.pulltorefresh.PullToRefreshContainer +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -212,23 +212,37 @@ fun PartySeekingView( val pageData = viewModel.seekingUsers.collectAsLazyPagingItems() val refreshing by viewModel.isRefreshing val pullRefreshState = rememberPullToRefreshState() - if (pullRefreshState.isRefreshing) { + if (pullRefreshState.isAnimating) { LaunchedEffect(true) { pageData.refresh() } } if (!refreshing) { LaunchedEffect(true) { - pullRefreshState.endRefresh() + pullRefreshState.animateToHidden() } } val scope = rememberCoroutineScope() - Box( + PullToRefreshBox( + state = pullRefreshState, + isRefreshing = refreshing, + onRefresh = { + viewModel.isRefreshing.value = true + pageData.refresh() + viewModel.isRefreshing.value = false + }, + indicator = { + HabiticaPullRefreshIndicator( + pageData.itemCount == 0, + refreshing, + pullRefreshState, + Modifier.align(Alignment.TopCenter) + ) + }, modifier = modifier .fillMaxSize() - .nestedScroll(pullRefreshState.nestedScrollConnection) ) { LazyColumn { item { @@ -362,18 +376,6 @@ fun PartySeekingView( else -> {} } } - PullToRefreshContainer( - modifier = Modifier.align(Alignment.TopCenter), - state = pullRefreshState, - indicator = { - HabiticaPullRefreshIndicator( - pageData.itemCount == 0, - refreshing, - it, - Modifier.align(Alignment.TopCenter) - ) - } - ) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 501970224..da427e5bc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -19,6 +19,7 @@ import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding +import com.habitrpg.android.habitica.databinding.FragmentTasksRecyclerviewBinding import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.HapticFeedbackManager import com.habitrpg.android.habitica.helpers.NotificationsManager @@ -65,19 +66,19 @@ import javax.inject.Inject @AndroidEntryPoint open class TaskRecyclerViewFragment : - BaseFragment(), + BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { private var taskFlowJob: Job? = null val viewModel: TasksViewModel by viewModels({ requireParentFragment() }) internal var canScoreTasks: Boolean = true - override var binding: FragmentRefreshRecyclerviewBinding? = null + override var binding: FragmentTasksRecyclerviewBinding? = null override fun createBinding( inflater: LayoutInflater, container: ViewGroup? - ): FragmentRefreshRecyclerviewBinding { - return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false) + ): FragmentTasksRecyclerviewBinding { + return FragmentTasksRecyclerviewBinding.inflate(inflater, container, false) } var recyclerAdapter: TaskRecyclerViewAdapter? = null @@ -358,8 +359,6 @@ open class TaskRecyclerViewFragment : } } - binding?.recyclerView?.setScaledPadding(context, 0, 0, 0, 108) - layoutManager = getLayoutManager(context) binding?.recyclerView?.layoutManager = layoutManager diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt index 39b058024..9571e4a06 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/RecyclerViewEmptySupport.kt @@ -2,6 +2,9 @@ package com.habitrpg.android.habitica.ui.helpers import android.content.Context import android.util.AttributeSet +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.helpers.EmptyItem import com.habitrpg.common.habitica.helpers.RecyclerViewState @@ -46,6 +49,27 @@ constructor( private var actualAdapter: Adapter<*>? = null private val emptyAdapter = RecyclerViewStateAdapter() + init { + clipToPadding = false + val topPadding = paddingTop + val bottomPadding = paddingBottom + val leftPadding = paddingLeft + val rightPadding = paddingRight + ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> + val bars = insets.getInsets( + WindowInsetsCompat.Type.systemBars() + or WindowInsetsCompat.Type.displayCutout() + ) + v.updatePadding( + left = bars.left + leftPadding, + top = topPadding, + right = bars.right + rightPadding, + bottom = bars.bottom + bottomPadding, + ) + WindowInsetsCompat.CONSUMED + } + } + private val observer = object : AdapterDataObserver() { override fun onChanged() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt index bc298d428..72233cf32 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/BottomSheetUtils.kt @@ -9,10 +9,16 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.displayCutout +import androidx.compose.foundation.layout.displayCutoutPadding import androidx.compose.foundation.layout.navigationBarsIgnoringVisibility import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.windowInsetsBottomHeight +import androidx.compose.foundation.layout.windowInsetsEndWidth +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.layout.windowInsetsStartWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -104,6 +110,7 @@ private fun BottomSheetWrapper( scrimColor = colorResource(R.color.gray_5).copy(alpha = 0.3f), sheetState = modalBottomSheetState, shape = RoundedCornerShape(topStart = radius, topEnd = radius), + contentWindowInsets = { WindowInsets(0) }, dragHandle = {}, content = { Column( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt index e9fc673fe..b51710129 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt @@ -2,7 +2,10 @@ package com.habitrpg.android.habitica.ui.views.dialogs import android.content.Context import android.view.View +import androidx.core.view.WindowCompat +import androidx.core.view.updateLayoutParams import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.internal.ViewUtils.doOnApplyWindowInsets import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.BottomSheetWrapperBinding @@ -20,6 +23,7 @@ open class HabiticaBottomSheetDialog(context: Context) : wrapperBinding.grabber.visibility = value } + override fun setContentView(view: View) { wrapperBinding.container.addView(view) super.setContentView(wrapperBinding.root) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt index 51584e438..3c3c5e9d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/navigation/HabiticaBottomNavigationView.kt @@ -12,7 +12,9 @@ import android.view.animation.RotateAnimation import android.widget.RelativeLayout import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.children +import androidx.core.view.updatePadding import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.MainNavigationViewBinding import com.habitrpg.common.habitica.extensions.getThemeColor @@ -110,6 +112,12 @@ constructor( animateButtonTap() true } + + ViewCompat.setOnApplyWindowInsetsListener(binding.itemWrapper) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = insets.bottom) + WindowInsetsCompat.CONSUMED + } binding.addButton.setOnTouchListener { _, event -> if (event.action == MotionEvent.ACTION_DOWN) { val animX = ObjectAnimator.ofFloat(binding.addButton, "scaleX", 1f, 1.1f)