From 04e6b9596b6e514d245e81c9d5f1d212669ea6fb Mon Sep 17 00:00:00 2001 From: Hafizzle Date: Thu, 19 Oct 2023 16:33:40 -0400 Subject: [PATCH 01/10] Load notification view individually versus creating entire view list --- .../ui/activities/NotificationsActivity.kt | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 69282cbcf..f5cc2782c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -133,13 +133,18 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget binding.notificationItems.addView(inflater?.inflate(R.layout.no_notifications, binding.notificationItems, false)) } + private fun displayNotificationsListView(notifications: List) { binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END - val viewList = arrayListOf() - createNotificationsHeaderView(notifications.count())?.let { viewList.add(it) } + + val currentViews = mutableSetOf().apply { + for (i in 0 until binding.notificationItems.childCount) { + add(binding.notificationItems.getChildAt(i)) + } + } lifecycleScope.launch(ExceptionHandler.coroutine()) { - notifications.map { + notifications.forEach { val item: View? = when (it.type) { Notification.Type.NEW_CHAT_MESSAGE.type -> createNewChatMessageNotification(it) Notification.Type.NEW_STUFF.type -> createNewStuffNotification(it) @@ -154,30 +159,23 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget else -> null } - if (item != null) { - viewList.add(item) + item?.let { view -> + if (currentViews.contains(view)) { + currentViews.remove(view) + } else { + binding.notificationItems.addView(view) + } } } - updateNotificationsAndRefresh(viewList) - } - } - private fun updateNotificationsAndRefresh(newItems: List) { - val currentViews = (0 until binding.notificationItems.childCount).map { - binding.notificationItems.getChildAt(it) - } - val viewsToRemove = currentViews - newItems - viewsToRemove.forEach { binding.notificationItems.removeView(it) } - val viewsToAdd = newItems - currentViews - viewsToAdd.forEach { - binding.notificationItems.addView(it) - } + // Remove views that are no longer valid + currentViews.forEach { binding.notificationItems.removeView(it) } - lifecycleScope.launch { - delay(250) - // Unnecessary but looks clean c: - if (binding.notificationItems.visibility != View.VISIBLE) { - binding.notificationItems.fadeInAnimation(200) + lifecycleScope.launch { + delay(250) + if (binding.notificationItems.visibility != View.VISIBLE) { + binding.notificationItems.fadeInAnimation(200) + } } } } From 90524ea4b952770e121032055bec13da4218f680 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 19 Oct 2023 10:41:13 +0200 Subject: [PATCH 02/10] improve display --- .../res/drawable/snackbar_background_red.xml | 4 ++-- Habitica/res/layout/snackbar_view.xml | 6 ++---- .../shops/TimeTravelersShopFragment.kt | 17 +++++++++++++++++ .../habitica/ui/views/shops/PurchaseDialog.kt | 3 --- .../helpers/RecyclerViewEmptySupport.kt | 6 +++++- version.properties | 2 +- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Habitica/res/drawable/snackbar_background_red.xml b/Habitica/res/drawable/snackbar_background_red.xml index c03d995f3..097eab78b 100644 --- a/Habitica/res/drawable/snackbar_background_red.xml +++ b/Habitica/res/drawable/snackbar_background_red.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Habitica/res/layout/snackbar_view.xml b/Habitica/res/layout/snackbar_view.xml index fe2f8f56b..9dd48cc9c 100644 --- a/Habitica/res/layout/snackbar_view.xml +++ b/Habitica/res/layout/snackbar_view.xml @@ -38,8 +38,7 @@ android:layout_height="wrap_content" tools:text="This is the Title" android:gravity="center" - style="@style/Title2" - android:textSize="18sp" + android:textSize="16sp" android:visibility="gone" tools:visibility="visible" android:textColor="@color/white"/> @@ -49,8 +48,7 @@ android:layout_height="wrap_content" tools:text="This is the Content" android:gravity="center" - style="@style/Body1" - android:textSize="13sp" + android:textSize="14sp" android:visibility="gone" tools:visibility="visible" android:textColor="@color/white"/> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt index 77217c3b9..035b224d2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt @@ -4,9 +4,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.models.shops.Shop +import com.habitrpg.android.habitica.ui.fragments.purchases.EventOutcomeSubscriptionBottomSheetFragment +import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionBottomSheetFragment import com.habitrpg.android.habitica.ui.views.CurrencyText +import com.habitrpg.common.habitica.helpers.launchCatching import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.seconds @AndroidEntryPoint class TimeTravelersShopFragment : ShopFragment() { @@ -22,6 +28,17 @@ class TimeTravelersShopFragment : ShopFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initializeCurrencyViews() + + lifecycleScope.launchCatching { + val user = userViewModel.user.value + if (user?.isSubscribed != true) { + delay(2.seconds) + val subscriptionBottomSheet = EventOutcomeSubscriptionBottomSheetFragment().apply { + eventType = EventOutcomeSubscriptionBottomSheetFragment.EVENT_HOURGLASS_SHOP_OPENED + } + activity?.supportFragmentManager?.let { subscriptionBottomSheet.show(it, SubscriptionBottomSheetFragment.TAG) } + } + } } override fun initializeCurrencyViews() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt index 3ab9210c1..f9906a37c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt @@ -380,10 +380,7 @@ class PurchaseDialog( } parentActivity?.let { activity -> subscriptionBottomSheet.show(activity.supportFragmentManager, SubscriptionBottomSheetFragment.TAG) } } - } - - } return } diff --git a/common/src/main/java/com/habitrpg/common/habitica/helpers/RecyclerViewEmptySupport.kt b/common/src/main/java/com/habitrpg/common/habitica/helpers/RecyclerViewEmptySupport.kt index 16d3c152b..b82a5cbd3 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/helpers/RecyclerViewEmptySupport.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/helpers/RecyclerViewEmptySupport.kt @@ -87,7 +87,11 @@ class RecyclerViewStateAdapter(val showLoadingAsEmpty: Boolean = false) : Recycl animation1.duration = 300 animation1.startOffset = 500 animation1.fillAfter = true - view.findViewById(R.id.loading_indicator).startAnimation(animation1) + view.findViewById(R.id.compose_view).setContent { + HabiticaTheme { + HabiticaCircularProgressView(Modifier.size(60.dp)) + } + } object : RecyclerView.ViewHolder(view) {} } 1 -> FailedViewHolder(parent.inflate(R.layout.failed_item)) diff --git a/version.properties b/version.properties index f08f21455..2c1200f3d 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.3 -CODE=6681 \ No newline at end of file +CODE=6691 \ No newline at end of file From fd19fe6edeba9ce6334e702b57400bf93d18ed3b Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 19 Oct 2023 13:03:57 +0200 Subject: [PATCH 03/10] show new loading view in more places --- Habitica/build.gradle | 2 +- Habitica/res/layout/activity_death.xml | 5 + .../habitica/interactors/FeedPetUseCase.kt | 2 +- .../habitica/interactors/HatchPetUseCase.kt | 2 +- .../habitica/interactors/ShareMountUseCase.kt | 2 +- .../habitica/interactors/SharePetUseCase.kt | 2 +- .../habitica/ui/activities/ArmoireActivity.kt | 5 +- .../ui/activities/BirthdayActivity.kt | 2 +- .../habitica/ui/activities/DeathActivity.kt | 18 +- .../ui/activities/FullProfileActivity.kt | 2 +- .../habitica/ui/activities/MainActivity.kt | 10 +- .../ui/activities/TaskFormActivity.kt | 5 +- .../ui/activities/TaskSummaryActivity.kt | 8 +- .../customization/AvatarOverviewFragment.kt | 3 +- .../purchases/GemsPurchaseFragment.kt | 2 +- .../purchases/SubscriptionFragment.kt | 2 +- .../social/party/PartyDetailFragment.kt | 2 +- .../social/party/PartyInviteFragment.kt | 3 +- .../social/party/PartySeekingFragment.kt | 5 +- .../habitica/ui/theme/HabiticaTheme.kt | 259 ++++-------------- .../habitica/ui/views/AppHeaderView.kt | 6 +- .../habitica/ui/views/BottomSheetUtils.kt | 3 +- .../habitica/ui/views/GroupPlanMemberList.kt | 4 +- .../habitica/ui/views/HabiticaButton.kt | 2 +- .../android/habitica/ui/views/LabeledBar.kt | 3 +- .../habitica/ui/views/LoadingButton.kt | 3 +- .../android/habitica/ui/views/UserRow.kt | 1 + .../views/dialogs/HabiticaProgressDialog.kt | 15 +- .../views/equipment/EquipmentOverviewView.kt | 6 +- .../preferences/PauseResumeDamageView.kt | 3 +- .../progress/HabiticaPullRefreshIndicator.kt | 4 +- .../ui/views/social/PartySeekingListItem.kt | 5 +- .../ui/views/stable/MountBottomSheet.kt | 3 +- .../ui/views/stable/PetBottomSheet.kt | 3 +- .../habitica/ui/views/tasks/AssignedView.kt | 3 +- .../tasks/form/HabitScoringButtonsView.kt | 3 +- .../views/tasks/form/TaskDifficultyButtons.kt | 3 +- .../ui/views/tasks/form/TaskFormSelector.kt | 3 +- build.gradle | 4 +- common/build.gradle.kts | 18 +- .../helpers/RecyclerViewEmptySupport.kt | 9 +- .../common/habitica/theme/HabiticaTheme.kt | 146 ++++++++++ .../habitica}/views/ComposableAvatarView.kt | 2 +- .../views}/HabiticaCircularProgressView.kt | 4 +- common/src/main/res/layout/loading_item.xml | 6 +- common/src/main/res/values/colors.xml | 9 + fastlane/changelog.txt | 17 +- version.properties | 2 +- 48 files changed, 365 insertions(+), 266 deletions(-) create mode 100644 common/src/main/java/com/habitrpg/common/habitica/theme/HabiticaTheme.kt rename {Habitica/src/main/java/com/habitrpg/android/habitica/ui => common/src/main/java/com/habitrpg/common/habitica}/views/ComposableAvatarView.kt (93%) rename {Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/progress => common/src/main/java/com/habitrpg/common/habitica/views}/HabiticaCircularProgressView.kt (97%) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 3fe3b87af..8bd4fcc9d 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -116,7 +116,7 @@ dependencies { implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version" implementation 'com.google.android.play:core:1.10.3' - implementation 'androidx.activity:activity-compose:1.7.2' + implementation 'androidx.activity:activity-compose:1.8.0' implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.animation:animation:$compose_version" diff --git a/Habitica/res/layout/activity_death.xml b/Habitica/res/layout/activity_death.xml index 2b5e2dc04..d69c75c04 100644 --- a/Habitica/res/layout/activity_death.xml +++ b/Habitica/res/layout/activity_death.xml @@ -82,6 +82,11 @@ android:layout_height="0dp" android:layout_weight="1" /> + +