show new loading view in more places

This commit is contained in:
Phillip Thelen 2023-10-19 13:03:57 +02:00
parent 90524ea4b9
commit fd19fe6ede
48 changed files with 365 additions and 266 deletions

View file

@ -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"

View file

@ -82,6 +82,11 @@
android:layout_height="0dp"
android:layout_weight="1" />
<androidx.compose.ui.platform.ComposeView
android:id="@+id/progress_view"
android:layout_width="60dp"
android:layout_height="60dp" />
<Button
android:id="@+id/restart_button"
style="@style/HabiticaButton.Maroon"

View file

@ -14,7 +14,7 @@ import com.habitrpg.android.habitica.databinding.MountImageviewBinding
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.SnackbarActivity
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog

View file

@ -13,7 +13,7 @@ import com.habitrpg.android.habitica.databinding.PetImageviewBinding
import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.layoutInflater

View file

@ -14,7 +14,7 @@ import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.databinding.MountImageviewBinding
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.dpToPx

View file

@ -26,7 +26,7 @@ import com.habitrpg.android.habitica.databinding.PetImageviewBinding
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.dpToPx

View file

@ -9,7 +9,6 @@ import android.widget.FrameLayout
import android.widget.RelativeLayout
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository
@ -24,16 +23,14 @@ import com.habitrpg.android.habitica.helpers.HitType
import com.habitrpg.android.habitica.helpers.ReviewManager
import com.habitrpg.android.habitica.ui.fragments.purchases.EventOutcomeSubscriptionBottomSheetFragment
import com.habitrpg.android.habitica.ui.fragments.purchases.EventOutcomeSubscriptionBottomSheetFragment.Companion.EVENT_ARMOIRE_OPENED
import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionBottomSheetFragment
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.ads.AdButton
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog
import com.habitrpg.android.habitica.ui.views.progress.HabiticaCircularProgressView
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.launchCatching
import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint

View file

@ -65,7 +65,7 @@ import com.habitrpg.android.habitica.helpers.EventCategory
import com.habitrpg.android.habitica.helpers.HitType
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.CurrencyText
import com.habitrpg.android.habitica.ui.views.HabiticaButton

View file

@ -32,6 +32,8 @@ import com.habitrpg.common.habitica.extensions.fromHtml
import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope
@ -144,8 +146,14 @@ class DeathActivity : BaseActivity(), SnackbarActivity {
putLong("last_sub_revive", Date().time)
}
lifecycleScope.launchCatching {
delay(300)
binding.reviveSubscriberWrapper.startAnimation(Animations.fadeOutAnimation())
binding.restartButton.startAnimation(Animations.fadeOutAnimation())
binding.progressView.startAnimation(Animations.fadeInAnimation())
binding.progressView.setContent {
HabiticaTheme {
HabiticaCircularProgressView()
}
}
}
lifecycleScope.launch(ExceptionHandler.coroutine()) {
userRepository.updateUser("stats.hp", 1)
@ -162,6 +170,14 @@ class DeathActivity : BaseActivity(), SnackbarActivity {
binding.restartButton.setOnClickListener {
binding.restartButton.isEnabled = false
binding.reviveSubscriberWrapper.startAnimation(Animations.fadeOutAnimation())
binding.restartButton.startAnimation(Animations.fadeOutAnimation())
binding.progressView.startAnimation(Animations.fadeInAnimation())
binding.progressView.setContent {
HabiticaTheme {
HabiticaCircularProgressView()
}
}
lifecycleScope.launch(ExceptionHandler.coroutine()) {
val brokenItem = userRepository.revive()
if (brokenItem != null) {

View file

@ -39,7 +39,7 @@ import com.habitrpg.android.habitica.models.user.Permission
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter
import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.AppHeaderView
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType

View file

@ -4,7 +4,6 @@ import android.app.NotificationChannel
import android.app.NotificationManager
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
@ -18,7 +17,6 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.height
@ -30,14 +28,12 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.view.children
import androidx.core.view.setPadding
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.navigation.NavDestination
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
@ -68,17 +64,17 @@ import com.habitrpg.android.habitica.interactors.CheckClassSelectionUseCase
import com.habitrpg.android.habitica.interactors.DisplayItemDropUseCase
import com.habitrpg.android.habitica.interactors.NotifyUserUseCase
import com.habitrpg.android.habitica.interactors.ShareAvatarUseCase
import com.habitrpg.android.habitica.interactors.SharePetUseCase
import com.habitrpg.android.habitica.models.TutorialStep
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.models.user.UserQuestStatus
import com.habitrpg.android.habitica.ui.TutorialView
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainActivityViewModel
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
import com.habitrpg.android.habitica.ui.views.AppHeaderView
import com.habitrpg.android.habitica.ui.views.ComposableAvatarView
import com.habitrpg.common.habitica.views.ComposableAvatarView
import com.habitrpg.android.habitica.ui.views.GroupPlanMemberList
import com.habitrpg.android.habitica.ui.views.HabiticaButton
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar

View file

@ -50,7 +50,10 @@ import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskGroupPlan
import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.android.habitica.ui.theme.textPrimaryFor
import com.habitrpg.android.habitica.ui.theme.windowBackgroundFor
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.viewmodels.TaskFormViewModel
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog

View file

@ -50,7 +50,13 @@ import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.TaskDescriptionBuilder
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.android.habitica.ui.theme.contentBackgroundFor
import com.habitrpg.android.habitica.ui.theme.primaryBackgroundFor
import com.habitrpg.android.habitica.ui.theme.textPrimaryFor
import com.habitrpg.android.habitica.ui.theme.textSecondaryFor
import com.habitrpg.android.habitica.ui.theme.windowBackgroundFor
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.CompletedAt

View file

@ -35,7 +35,8 @@ import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.SegmentedControl
import com.habitrpg.android.habitica.ui.views.equipment.AvatarCustomizationOverviewView

View file

@ -28,7 +28,7 @@ import com.habitrpg.android.habitica.ui.activities.GiftGemsActivity
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.promo.BirthdayBanner
import com.habitrpg.common.habitica.extensions.isUsingNightModeResources

View file

@ -28,7 +28,7 @@ import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.promo.BirthdayBanner
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView

View file

@ -33,7 +33,7 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemDialogFragment
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewHolders.GroupMemberViewHolder
import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar

View file

@ -55,7 +55,8 @@ import com.habitrpg.android.habitica.databinding.FragmentComposeBinding
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.invitations.InviteResponse
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.LoadingButtonState

View file

@ -60,13 +60,14 @@ import com.habitrpg.android.habitica.helpers.HitType
import com.habitrpg.android.habitica.models.invitations.InviteResponse
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.LoadingButton
import com.habitrpg.android.habitica.ui.views.LoadingButtonState
import com.habitrpg.android.habitica.ui.views.LoadingButtonType
import com.habitrpg.android.habitica.ui.views.progress.HabiticaCircularProgressView
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import com.habitrpg.android.habitica.ui.views.progress.HabiticaPullRefreshIndicator
import com.habitrpg.android.habitica.ui.views.social.PartySeekingListItem
import com.habitrpg.common.habitica.helpers.launchCatching

View file

@ -1,222 +1,83 @@
package com.habitrpg.android.habitica.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Shapes
import androidx.compose.material.Typography
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
import com.google.accompanist.themeadapter.material.createMdcTheme
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.common.habitica.extensions.getThemeColor
import com.habitrpg.common.habitica.theme.HabiticaColors
import com.habitrpg.common.habitica.theme.HabiticaTheme
@Composable
fun HabiticaTheme(
content: @Composable () -> Unit
) {
val context = LocalContext.current
val layoutDirection = LocalLayoutDirection.current
val (colors, _, _) = createMdcTheme(
context = context,
layoutDirection = layoutDirection,
setTextColors = true
)
MaterialTheme(
colors = colors ?: MaterialTheme.colors,
typography = Typography(
defaultFontFamily = FontFamily.Default,
h1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 20.sp,
letterSpacing = (0.05).sp
),
h2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 28.sp,
letterSpacing = (0.05).sp
),
subtitle1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 16.sp
),
subtitle2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.1.sp
),
body1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 0.35.sp,
lineHeight = 16.sp
),
body2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 14.sp,
letterSpacing = 0.2.sp,
lineHeight = 16.sp
),
button = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 1.25.sp
),
caption = TextStyle(
fontWeight = FontWeight.Bold,
fontSize = 12.sp
),
overline = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 10.sp,
letterSpacing = 1.5.sp
)
),
shapes = Shapes(
RoundedCornerShape(4.dp),
RoundedCornerShape(8.dp),
RoundedCornerShape(12.dp)
),
content = content
)
fun HabiticaColors.textPrimaryFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.extraExtraLightTaskColor else task?.extraDarkTaskColor) ?: R.color.text_primary)
}
val Typography.caption1
get() = caption
val Typography.caption2
get() = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 12.sp,
letterSpacing = 0.4.sp
)
val Typography.caption3
get() = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 12.sp,
letterSpacing = 0.3.sp,
lineHeight = 14.sp
)
val Typography.caption4
get() = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 12.sp,
letterSpacing = 0.35.sp
)
val Typography.subtitle3
get() = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.15.sp
)
object HabiticaTheme {
val typography: Typography
@Composable
get() = MaterialTheme.typography
val shapes: Shapes
@Composable
get() = MaterialTheme.shapes
val colors: HabiticaColors
@Composable
get() {
val context = LocalContext.current
return HabiticaColors(
windowBackground = Color(context.getThemeColor(R.attr.colorWindowBackground)),
contentBackground = Color(context.getThemeColor(R.attr.colorContentBackground)),
contentBackgroundOffset = Color(context.getThemeColor(R.attr.colorContentBackgroundOffset)),
offsetBackground = Color(context.getThemeColor(R.attr.colorOffsetBackground)),
textPrimary = Color(context.getThemeColor(R.attr.textColorPrimary)),
textSecondary = Color(context.getThemeColor(R.attr.textColorSecondary)),
textTertiary = Color(ContextCompat.getColor(context, R.color.text_ternary)),
textQuad = Color(ContextCompat.getColor(context, R.color.text_quad)),
textDimmed = Color(ContextCompat.getColor(context, R.color.text_dimmed)),
tintedUiMain = Color(context.getThemeColor(R.attr.tintedUiMain)),
tintedUiSub = Color(context.getThemeColor(R.attr.tintedUiSub)),
tintedUiDetails = Color(context.getThemeColor(R.attr.tintedUiDetails)),
pixelArtBackground = Color(context.getThemeColor(R.attr.colorContentBackground)),
errorBackground = Color(ContextCompat.getColor(context, R.color.background_red)),
errorColor = Color(ContextCompat.getColor(context, R.color.text_red)),
successBackground = Color(ContextCompat.getColor(context, R.color.background_green)),
successColor = Color(ContextCompat.getColor(context, R.color.text_green))
)
}
@Composable
fun HabiticaColors.textSecondaryFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.extraLightTaskColor else task?.lowSaturationTaskColor) ?: R.color.brand_sub_text)
}
class HabiticaColors(
val windowBackground: Color,
val contentBackground: Color,
val contentBackgroundOffset: Color,
val offsetBackground: Color,
val textPrimary: Color,
val textSecondary: Color,
val textTertiary: Color,
val textQuad: Color,
val textDimmed: Color,
val tintedUiMain: Color,
val tintedUiSub: Color,
val tintedUiDetails: Color,
val pixelArtBackground: Color,
val errorBackground: Color,
val errorColor: Color,
val successBackground: Color,
val successColor: Color
) {
@Composable
fun HabiticaColors.primaryBackgroundFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.mediumTaskColor else task?.lightTaskColor) ?: R.color.brand_400)
}
@Composable
fun textPrimaryFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.extraExtraLightTaskColor else task?.extraDarkTaskColor) ?: R.color.text_primary)
}
@Composable
fun HabiticaColors.windowBackgroundFor(task: Task?): Color {
return (if (isSystemInDarkTheme()) task?.extraExtraDarkTaskColor else task?.extraExtraLightTaskColor)?.let { colorResource(it) } ?: windowBackground
}
@Composable
fun textSecondaryFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.extraLightTaskColor else task?.lowSaturationTaskColor) ?: R.color.brand_sub_text)
}
@Composable
fun HabiticaColors.contentBackgroundFor(task: Task?): Color {
return (if (isSystemInDarkTheme()) task?.darkestTaskColor else task?.lightestTaskColor)?.let { colorResource(it) } ?: windowBackground
}
@Composable
fun primaryBackgroundFor(task: Task?): Color {
return colorResource((if (isSystemInDarkTheme()) task?.mediumTaskColor else task?.lightTaskColor) ?: R.color.brand_400)
}
@Composable
fun windowBackgroundFor(task: Task?): Color {
return (if (isSystemInDarkTheme()) task?.extraExtraDarkTaskColor else task?.extraExtraLightTaskColor)?.let { colorResource(it) } ?: windowBackground
}
@Composable
fun contentBackgroundFor(task: Task?): Color {
return (if (isSystemInDarkTheme()) task?.darkestTaskColor else task?.lightestTaskColor)?.let { colorResource(it) } ?: windowBackground
}
@Composable
fun pixelArtBackground(hasIcon: Boolean): Color {
return if (isSystemInDarkTheme()) {
colorResource(if (hasIcon) R.color.gray_200 else R.color.gray_5)
} else {
colorResource(if (hasIcon) R.color.content_background else R.color.content_background_offset)
}
}
@Composable
fun basicTextColor(): Color {
return colorResource(R.color.gray200_gray400)
}
@Composable
fun basicButtonColor(): Color {
return colorResource(R.color.gray700_gray10)
@Composable
fun HabiticaColors.pixelArtBackground(hasIcon: Boolean): Color {
return if (isSystemInDarkTheme()) {
colorResource(if (hasIcon) R.color.gray_200 else R.color.gray_5)
} else {
colorResource(if (hasIcon) R.color.content_background else R.color.content_background_offset)
}
}
class HabiticaTypography
@Composable
fun HabiticaColors.basicTextColor(): Color {
return colorResource(R.color.gray200_gray400)
}
@Composable
fun HabiticaColors.basicButtonColor(): Color {
return colorResource(R.color.gray700_gray10)
}
val HabiticaTheme.colors: HabiticaColors
@Composable
get() {
val context = LocalContext.current
return HabiticaColors(
windowBackground = Color(context.getThemeColor(R.attr.colorWindowBackground)),
contentBackground = Color(context.getThemeColor(R.attr.colorContentBackground)),
contentBackgroundOffset = Color(context.getThemeColor(R.attr.colorContentBackgroundOffset)),
offsetBackground = Color(context.getThemeColor(R.attr.colorOffsetBackground)),
textPrimary = Color(context.getThemeColor(R.attr.textColorPrimary)),
textSecondary = Color(context.getThemeColor(R.attr.textColorSecondary)),
textTertiary = Color(ContextCompat.getColor(context, R.color.text_ternary)),
textQuad = Color(ContextCompat.getColor(context, R.color.text_quad)),
textDimmed = Color(ContextCompat.getColor(context, R.color.text_dimmed)),
tintedUiMain = Color(context.getThemeColor(R.attr.tintedUiMain)),
tintedUiSub = Color(context.getThemeColor(R.attr.tintedUiSub)),
tintedUiDetails = Color(context.getThemeColor(R.attr.tintedUiDetails)),
pixelArtBackground = Color(context.getThemeColor(R.attr.colorContentBackground)),
errorBackground = Color(ContextCompat.getColor(context, R.color.background_red)),
errorColor = Color(ContextCompat.getColor(context, R.color.text_red)),
successBackground = Color(ContextCompat.getColor(context, R.color.background_green)),
successColor = Color(ContextCompat.getColor(context, R.color.text_green))
)
}

View file

@ -62,7 +62,11 @@ import com.habitrpg.android.habitica.models.user.Purchases
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.SubscriptionPlan
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.basicButtonColor
import com.habitrpg.android.habitica.ui.theme.basicTextColor
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.ComposableAvatarView
import com.habitrpg.shared.habitica.models.Avatar
import kotlin.random.Random

View file

@ -32,7 +32,8 @@ import androidx.compose.ui.unit.dp
import androidx.fragment.app.Fragment
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

View file

@ -33,7 +33,9 @@ import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.user.Authentication
import com.habitrpg.android.habitica.models.user.Profile
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.ComposableAvatarView
import kotlin.random.Random
@Composable

View file

@ -16,7 +16,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.HabiticaTheme
@Composable
fun HabiticaButton(

View file

@ -42,7 +42,8 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.helpers.NumberAbbreviator
import java.text.NumberFormat

View file

@ -51,7 +51,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

View file

@ -19,6 +19,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.common.habitica.views.ComposableAvatarView
import com.habitrpg.shared.habitica.models.Avatar
@Composable

View file

@ -1,7 +1,12 @@
package com.habitrpg.android.habitica.ui.views.dialogs
import android.content.Context
import com.habitrpg.android.habitica.R
import androidx.compose.foundation.layout.size
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import com.habitrpg.common.habitica.extensions.dpToPx
class HabiticaProgressDialog(context: Context) : HabiticaAlertDialog(context) {
@ -13,7 +18,13 @@ class HabiticaProgressDialog(context: Context) : HabiticaAlertDialog(context) {
fun show(context: Context, title: String?, dialogWidth: Int = 300): HabiticaProgressDialog {
val dialog = HabiticaProgressDialog(context)
dialog.setAdditionalContentView(R.layout.circular_progress)
val composeView = ComposeView(context)
dialog.setAdditionalContentView(composeView)
composeView.setContent {
HabiticaTheme {
HabiticaCircularProgressView(Modifier.size(60.dp))
}
}
dialog.dialogWidth = dialogWidth.dpToPx(context)
dialog.setTitle(title)
dialog.enqueue()

View file

@ -26,8 +26,10 @@ import androidx.compose.ui.unit.dp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.user.Outfit
import com.habitrpg.android.habitica.models.user.Preferences
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.caption2
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.android.habitica.ui.theme.pixelArtBackground
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.theme.caption2
import com.habitrpg.android.habitica.ui.views.PixelArtView
@Composable

View file

@ -14,7 +14,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.HabiticaButton
@Composable

View file

@ -23,7 +23,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import java.lang.Float.min
@OptIn(ExperimentalMaterialApi::class)

View file

@ -35,9 +35,10 @@ import com.habitrpg.android.habitica.models.user.ContributorInfo
import com.habitrpg.android.habitica.models.user.Profile
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.fragments.social.party.InviteButton
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.ClassText
import com.habitrpg.android.habitica.ui.views.ComposableAvatarView
import com.habitrpg.common.habitica.views.ComposableAvatarView
import com.habitrpg.android.habitica.ui.views.ComposableUsernameLabel
import com.habitrpg.android.habitica.ui.views.LoadingButtonState
import com.habitrpg.common.habitica.extensions.toLocale

View file

@ -49,7 +49,8 @@ import androidx.compose.ui.unit.sp
import androidx.compose.ui.zIndex
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.interactors.ShareMountUseCase
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.HabiticaButton
import com.habitrpg.common.habitica.helpers.launchCatching

View file

@ -69,7 +69,8 @@ import com.habitrpg.android.habitica.interactors.ShareMountUseCase
import com.habitrpg.android.habitica.interactors.SharePetUseCase
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.HabiticaButton
import com.habitrpg.android.habitica.ui.views.PixelArtView

View file

@ -27,7 +27,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.Assignable
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.CompletedAt
import com.habitrpg.android.habitica.ui.views.UserRow
import java.util.Date

View file

@ -39,7 +39,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.extensions.getThemeColor
@Composable

View file

@ -41,7 +41,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.common.habitica.extensions.getThemeColor
import com.habitrpg.common.habitica.extensions.nameRes

View file

@ -33,7 +33,8 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.extensions.getThemeColor
data class LabeledValue<V>(val label: String, val value: V)

View file

@ -13,7 +13,7 @@ buildscript {
amplitude_version = '1.6.1'
appcompat_version = '1.6.1'
coil_version = '2.4.0'
compose_version = '1.5.2'
compose_version = '1.5.4'
core_ktx_version = '1.12.0'
coroutines_version = '1.7.2'
daggerhilt_version = '2.47'
@ -25,7 +25,7 @@ buildscript {
markwon_version = '4.6.2'
mockk_version = '1.13.4'
moshi_version = '1.15.0'
navigation_version = '2.7.3'
navigation_version = '2.7.4'
okhttp_version = '4.11.0'
paging_version = '3.2.1'
play_wearables_version = '18.1.0'

View file

@ -37,6 +37,11 @@ android {
buildFeatures {
viewBinding = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.3"
}
compileOptions {
@ -84,7 +89,9 @@ android {
}
val core_ktx_version: String by rootExtra
val accompanist_version: String by rootExtra
val appcompat_version: String by rootExtra
val compose_version: String by rootExtra
val markwon_version: String by rootExtra
val coil_version: String by rootExtra
val mockk_version: String by rootExtra
@ -111,7 +118,7 @@ dependencies {
implementation("androidx.recyclerview:recyclerview:1.3.1")
implementation("androidx.navigation:navigation-common-ktx:$navigation_version")
implementation("androidx.navigation:navigation-runtime-ktx:$navigation_version")
implementation("com.google.android.material:material:1.9.0")
implementation("com.google.android.material:material:1.10.0")
testImplementation("io.mockk:mockk:$mockk_version")
testImplementation("io.mockk:mockk-android:$mockk_version")
@ -124,6 +131,15 @@ dependencies {
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")
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")
implementation("androidx.compose.ui:ui-text-google-fonts:$compose_version")
implementation("androidx.compose.ui:ui-tooling:$compose_version")
implementation("androidx.compose.material3:material3:1.1.2")
implementation("com.google.accompanist:accompanist-themeadapter-material:$accompanist_version")
implementation(project(":shared"))
}

View file

@ -4,12 +4,18 @@ import android.view.View
import android.view.ViewGroup
import android.view.animation.AlphaAnimation
import android.widget.ProgressBar
import androidx.compose.foundation.layout.size
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.common.habitica.R
import com.habitrpg.common.habitica.databinding.EmptyItemBinding
import com.habitrpg.common.habitica.databinding.FailedItemBinding
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
data class EmptyItem(
var title: String,
@ -87,7 +93,8 @@ class RecyclerViewStateAdapter(val showLoadingAsEmpty: Boolean = false) : Recycl
animation1.duration = 300
animation1.startOffset = 500
animation1.fillAfter = true
view.findViewById<ProgressBar>(R.id.compose_view).setContent {
view.findViewById<ComposeView>(R.id.compose_view).startAnimation(animation1)
view.findViewById<ComposeView>(R.id.compose_view).setContent {
HabiticaTheme {
HabiticaCircularProgressView(Modifier.size(60.dp))
}

View file

@ -0,0 +1,146 @@
package com.habitrpg.common.habitica.theme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Shapes
import androidx.compose.material.Typography
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.accompanist.themeadapter.material.createMdcTheme
@Composable
fun HabiticaTheme(
content: @Composable () -> Unit
) {
val context = LocalContext.current
val layoutDirection = LocalLayoutDirection.current
val (colors, _, _) = createMdcTheme(
context = context,
layoutDirection = layoutDirection,
setTextColors = true
)
MaterialTheme(
colors = colors ?: MaterialTheme.colors,
typography = Typography(
defaultFontFamily = FontFamily.Default,
h1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 20.sp,
letterSpacing = (0.05).sp
),
h2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 28.sp,
letterSpacing = (0.05).sp
),
subtitle1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 16.sp
),
subtitle2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.1.sp
),
body1 = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 0.35.sp,
lineHeight = 16.sp
),
body2 = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 14.sp,
letterSpacing = 0.2.sp,
lineHeight = 16.sp
),
button = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 1.25.sp
),
caption = TextStyle(
fontWeight = FontWeight.Bold,
fontSize = 12.sp
),
overline = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 10.sp,
letterSpacing = 1.5.sp
)
),
shapes = Shapes(
RoundedCornerShape(4.dp),
RoundedCornerShape(8.dp),
RoundedCornerShape(12.dp)
),
content = content
)
}
val Typography.caption1
get() = caption
val Typography.caption2
get() = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 12.sp,
letterSpacing = 0.4.sp
)
val Typography.caption3
get() = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 12.sp,
letterSpacing = 0.3.sp,
lineHeight = 14.sp
)
val Typography.caption4
get() = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 12.sp,
letterSpacing = 0.35.sp
)
val Typography.subtitle3
get() = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.15.sp
)
object HabiticaTheme {
val typography: Typography
@Composable
get() = MaterialTheme.typography
val shapes: Shapes
@Composable
get() = MaterialTheme.shapes
}
class HabiticaColors(
val windowBackground: Color,
val contentBackground: Color,
val contentBackgroundOffset: Color,
val offsetBackground: Color,
val textPrimary: Color,
val textSecondary: Color,
val textTertiary: Color,
val textQuad: Color,
val textDimmed: Color,
val tintedUiMain: Color,
val tintedUiSub: Color,
val tintedUiDetails: Color,
val pixelArtBackground: Color,
val errorBackground: Color,
val errorColor: Color,
val successBackground: Color,
val successColor: Color
)
class HabiticaTypography

View file

@ -1,4 +1,4 @@
package com.habitrpg.android.habitica.ui.views
package com.habitrpg.common.habitica.views
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier

View file

@ -1,4 +1,4 @@
package com.habitrpg.android.habitica.ui.views.progress
package com.habitrpg.common.habitica.views
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.animateFloat
@ -28,7 +28,7 @@ import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.habitrpg.android.habitica.R
import com.habitrpg.common.habitica.R
@Composable
fun HabiticaCircularProgressView(

View file

@ -2,10 +2,10 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/loading_indicator"
<androidx.compose.ui.platform.ComposeView
android:id="@+id/compose_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</FrameLayout>
</FrameLayout>

View file

@ -162,5 +162,14 @@
<color name="material_card_background_inverse_color">@color/gray_5</color>
<color name="divider_color">@color/gray_500</color>
<color name="background_red">@color/red_100</color>
<color name="background_orange">@color/orange_100</color>
<color name="background_yellow">@color/yellow_100</color>
<color name="background_green">@color/green_100</color>
<color name="background_blue">@color/blue_100</color>
<color name="background_teal">@color/teal_100</color>
<color name="background_brand">@color/brand_300</color>
<color name="background_brand_30">#4D6033B5</color>
<color name="dim_background">#40BDA8FF</color>
</resources>

View file

@ -1,9 +1,10 @@
New in 4.3:
Its easier than ever to party up with our newest feature: Look for Party and Find Members!
- Solo players can let Party leaders know they want an invite by going to Menu > Party and tapping Look for Party
- Party leaders can see players looking for Party by tapping Find Members on the Party screen and send invites
- Can gift Gems by username
- Bailey notification will show title
- Selecting a class is more consistent
- Chat notifications open Party
- Other various fixes
- Pets just got cuter! Tap a Pet or Mount to see them in an environment that changes each month.
- Pets bounce when fed
- New Subscriber benefit: Buy one Armoire, get another free!
- New Subscriber benefit: Get a second chance at life once a day when you run out of HP!
- Tap your avatar to share your latest looks at any time
- See answers to common Quest mechanic questions under your active Quest
- Updated Quest interface
- The Quest shop now shows a check by completed Quests

View file

@ -1,2 +1,2 @@
NAME=4.3
CODE=6691
CODE=6701