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)