mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Don’t look at this
This commit is contained in:
parent
18a665ca89
commit
9f8f42f139
16 changed files with 360 additions and 101 deletions
|
|
@ -1,10 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="@dimen/pet_image_width" android:layout_height="@dimen/pet_image_height"
|
||||
android:layout_gravity="center">
|
||||
android:layout_width="match_parent" android:layout_height="124dp"
|
||||
android:layout_gravity="center"
|
||||
android:background="@drawable/layout_rounded_bg_content"
|
||||
android:clipToPadding="true"
|
||||
android:clipChildren="true">
|
||||
<androidx.compose.ui.platform.ComposeView
|
||||
android:id="@+id/background_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<com.habitrpg.android.habitica.ui.views.stable.MountView
|
||||
android:id="@+id/mount_imageview"
|
||||
android:layout_width="68dp"
|
||||
android:layout_height="68dp"
|
||||
android:layout_width="81dp"
|
||||
android:layout_height="99dp"
|
||||
android:layout_gravity="center" />
|
||||
</FrameLayout>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="@dimen/pet_image_width" android:layout_height="@dimen/pet_image_height"
|
||||
android:layout_gravity="center">
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="124dp"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_gravity="center"
|
||||
android:background="@drawable/layout_rounded_bg_content"
|
||||
android:clipToPadding="true"
|
||||
android:clipChildren="true">
|
||||
<androidx.compose.ui.platform.ComposeView
|
||||
android:id="@+id/background_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<com.habitrpg.common.habitica.views.PixelArtView
|
||||
android:id="@+id/pet_imageview"
|
||||
android:layout_width="68dp"
|
||||
android:layout_height="68dp"
|
||||
android:layout_gravity="center" />
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="12dp"
|
||||
tools:background="@color/red_10"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
|
|
|||
|
|
@ -13,14 +13,14 @@ fun HabiticaAlertDialog.addOkButton(
|
|||
|
||||
fun HabiticaAlertDialog.addCloseButton(
|
||||
isPrimary: Boolean = false,
|
||||
listener: ((DialogInterface, Int) -> Unit)? = null
|
||||
listener: ((HabiticaAlertDialog, Int) -> Unit)? = null
|
||||
) {
|
||||
this.addButton(R.string.close, isPrimary, false, true, listener)
|
||||
}
|
||||
|
||||
fun HabiticaAlertDialog.addCancelButton(
|
||||
isPrimary: Boolean = false,
|
||||
listener: ((DialogInterface, Int) -> Unit)? = null
|
||||
listener: ((HabiticaAlertDialog, Int) -> Unit)? = null
|
||||
) {
|
||||
this.addButton(R.string.cancel, isPrimary, false, true, listener)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,48 +3,63 @@ package com.habitrpg.android.habitica.interactors
|
|||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.view.View
|
||||
import android.widget.FrameLayout
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.lifecycle.setViewTreeLifecycleOwner
|
||||
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
||||
import com.habitrpg.android.habitica.HabiticaBaseApplication
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.data.InventoryRepository
|
||||
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.android.habitica.ui.views.BackgroundScene
|
||||
import com.habitrpg.android.habitica.ui.views.SnackbarActivity
|
||||
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
|
||||
import com.habitrpg.android.habitica.ui.views.stable.MountView
|
||||
import com.habitrpg.common.habitica.extensions.loadImage
|
||||
import com.habitrpg.common.habitica.views.PixelArtView
|
||||
import com.habitrpg.common.habitica.extensions.dpToPx
|
||||
import com.habitrpg.common.habitica.extensions.layoutInflater
|
||||
import com.habitrpg.common.habitica.helpers.launchCatching
|
||||
import com.habitrpg.shared.habitica.models.responses.FeedResponse
|
||||
import kotlinx.coroutines.MainScope
|
||||
import javax.inject.Inject
|
||||
|
||||
class FeedPetUseCase @Inject
|
||||
constructor(
|
||||
private val inventoryRepository: InventoryRepository
|
||||
) : UseCase<FeedPetUseCase.RequestValues, FeedResponse?>() {
|
||||
override suspend fun run(requestValues: FeedPetUseCase.RequestValues): FeedResponse? {
|
||||
override suspend fun run(requestValues: RequestValues): FeedResponse? {
|
||||
val feedResponse = inventoryRepository.feedPet(requestValues.pet, requestValues.food)
|
||||
(requestValues.context as? SnackbarActivity)?.showSnackbar(content = feedResponse?.message)
|
||||
if (feedResponse?.value == -1) {
|
||||
val mountWrapper =
|
||||
View.inflate(
|
||||
requestValues.context,
|
||||
R.layout.mount_imageview,
|
||||
null
|
||||
) as? FrameLayout
|
||||
val mountImageView =
|
||||
mountWrapper?.findViewById(R.id.mount_imageview) as? MountView
|
||||
val mountWrapper = MountImageviewBinding.inflate(requestValues.context.layoutInflater)
|
||||
|
||||
mountImageView?.setMount("Mount_Icon_" + requestValues.pet.key)
|
||||
mountWrapper.mountImageview.setMount(requestValues.pet.key)
|
||||
val currentActivity =
|
||||
HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get()
|
||||
val dialog = HabiticaAlertDialog(requestValues.context)
|
||||
if (currentActivity != null) {
|
||||
mountWrapper.backgroundView.setContent {
|
||||
HabiticaTheme {
|
||||
BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large))
|
||||
}
|
||||
}
|
||||
dialog.window?.let {
|
||||
mountWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
mountWrapper.root.setViewTreeLifecycleOwner(currentActivity)
|
||||
it.decorView.setViewTreeLifecycleOwner(currentActivity)
|
||||
}
|
||||
}
|
||||
dialog.setTitle(
|
||||
requestValues.context.getString(
|
||||
R.string.evolved_pet_title,
|
||||
requestValues.pet.text
|
||||
)
|
||||
)
|
||||
dialog.setAdditionalContentView(mountWrapper)
|
||||
dialog.isCelebratory = true
|
||||
dialog.setAdditionalContentView(mountWrapper.root)
|
||||
dialog.addButton(R.string.onwards, true)
|
||||
dialog.addButton(R.string.share, false) { hatchingDialog, _ ->
|
||||
val message =
|
||||
|
|
@ -52,19 +67,11 @@ constructor(
|
|||
R.string.share_raised,
|
||||
requestValues.pet.text
|
||||
)
|
||||
val mountImageSideLength = 99
|
||||
val sharedImage = Bitmap.createBitmap(
|
||||
mountImageSideLength,
|
||||
mountImageSideLength,
|
||||
Bitmap.Config.ARGB_8888
|
||||
)
|
||||
val canvas = Canvas(sharedImage)
|
||||
mountImageView?.draw(canvas)
|
||||
(requestValues.context as? BaseActivity)?.shareContent(
|
||||
"raisedPet",
|
||||
message,
|
||||
sharedImage
|
||||
)
|
||||
MainScope().launchCatching {
|
||||
ShareMountUseCase().callInteractor(ShareMountUseCase.RequestValues(
|
||||
requestValues.pet.key, message, requestValues.context
|
||||
))
|
||||
}
|
||||
hatchingDialog.dismiss()
|
||||
}
|
||||
dialog.enqueue()
|
||||
|
|
|
|||
|
|
@ -1,21 +1,24 @@
|
|||
package com.habitrpg.android.habitica.interactors
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.view.View
|
||||
import android.widget.FrameLayout
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.lifecycle.setViewTreeLifecycleOwner
|
||||
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
||||
import com.habitrpg.android.habitica.HabiticaBaseApplication
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.data.InventoryRepository
|
||||
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.activities.BaseActivity
|
||||
import com.habitrpg.android.habitica.ui.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
|
||||
import com.habitrpg.common.habitica.extensions.loadImage
|
||||
import com.habitrpg.common.habitica.helpers.launchCatching
|
||||
import com.habitrpg.common.habitica.views.PixelArtView
|
||||
import kotlinx.coroutines.MainScope
|
||||
import javax.inject.Inject
|
||||
|
||||
|
|
@ -25,29 +28,58 @@ constructor(
|
|||
) : UseCase<HatchPetUseCase.RequestValues, Items?>() {
|
||||
override suspend fun run(requestValues: RequestValues): Items? {
|
||||
return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) {
|
||||
val petWrapper = View.inflate(requestValues.context, R.layout.pet_imageview, null) as? FrameLayout
|
||||
val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? PixelArtView
|
||||
|
||||
petImageView?.loadImage("stable_Pet-" + requestValues.egg.key + "-" + requestValues.potion.key)
|
||||
val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater)
|
||||
val petKey = requestValues.egg.key + "-" + requestValues.potion.key
|
||||
petWrapper.petImageview.loadImage("stable_Pet-" + petKey)
|
||||
val potionName = requestValues.potion.text
|
||||
val eggName = requestValues.egg.text
|
||||
val currentActivity =
|
||||
HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get()
|
||||
val dialog = HabiticaAlertDialog(requestValues.context)
|
||||
dialog.setTitle(requestValues.context.getString(R.string.hatched_pet_title, potionName, eggName))
|
||||
dialog.setAdditionalContentView(petWrapper)
|
||||
if (currentActivity != null) {
|
||||
petWrapper.backgroundView.setContent {
|
||||
HabiticaTheme {
|
||||
BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large))
|
||||
}
|
||||
}
|
||||
dialog.window?.let {
|
||||
petWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
it.decorView.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
petWrapper.root.setViewTreeLifecycleOwner(currentActivity)
|
||||
it.decorView.setViewTreeLifecycleOwner(currentActivity)
|
||||
}
|
||||
}
|
||||
dialog.isCelebratory = true
|
||||
dialog.setTitle(
|
||||
requestValues.context.getString(
|
||||
R.string.hatched_pet_title,
|
||||
potionName,
|
||||
eggName
|
||||
)
|
||||
)
|
||||
dialog.setAdditionalContentView(petWrapper.root)
|
||||
dialog.addButton(R.string.equip, true) { _, _ ->
|
||||
MainScope().launchCatching {
|
||||
inventoryRepository.equip("pet", requestValues.egg.key + "-" + requestValues.potion.key)
|
||||
inventoryRepository.equip(
|
||||
"pet",
|
||||
requestValues.egg.key + "-" + requestValues.potion.key
|
||||
)
|
||||
}
|
||||
}
|
||||
dialog.addButton(R.string.share, false) { hatchingDialog, _ ->
|
||||
val message = requestValues.context.getString(R.string.share_hatched, potionName, eggName)
|
||||
val petImageSideLength = 140
|
||||
val sharedImage = Bitmap.createBitmap(petImageSideLength, petImageSideLength, Bitmap.Config.ARGB_8888)
|
||||
val canvas = Canvas(sharedImage)
|
||||
petImageView?.drawable?.setBounds(0, 0, petImageSideLength, petImageSideLength)
|
||||
val bitmap = (petImageView?.drawable as? BitmapDrawable)?.bitmap ?: petImageView?.bitmap ?: return@addButton
|
||||
canvas.drawBitmap(bitmap, 0f, 0f, null)
|
||||
(requestValues.context as? BaseActivity)?.shareContent("hatchedPet", message, sharedImage)
|
||||
MainScope().launchCatching {
|
||||
SharePetUseCase().callInteractor(
|
||||
SharePetUseCase.RequestValues(
|
||||
petKey,
|
||||
requestValues.context.getString(
|
||||
R.string.share_hatched,
|
||||
potionName,
|
||||
eggName
|
||||
),
|
||||
requestValues.context
|
||||
)
|
||||
)
|
||||
}
|
||||
hatchingDialog.dismiss()
|
||||
}
|
||||
dialog.setExtraCloseButtonVisibility(View.VISIBLE)
|
||||
|
|
@ -55,5 +87,6 @@ constructor(
|
|||
}
|
||||
}
|
||||
|
||||
class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: Context) : UseCase.RequestValues
|
||||
class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: Context) :
|
||||
UseCase.RequestValues
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,7 @@ import com.habitrpg.common.habitica.views.AvatarView
|
|||
import com.habitrpg.shared.habitica.models.Avatar
|
||||
import javax.inject.Inject
|
||||
|
||||
class ShareAvatarUseCase @Inject
|
||||
constructor() : UseCase<ShareAvatarUseCase.RequestValues, Unit>() {
|
||||
class ShareAvatarUseCase @Inject constructor() : UseCase<ShareAvatarUseCase.RequestValues, Unit>() {
|
||||
override suspend fun run(requestValues: RequestValues) {
|
||||
val avatarView = AvatarView(requestValues.activity, showBackground = true, showMount = true, showPet = true)
|
||||
avatarView.setAvatar(requestValues.avatar)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
package com.habitrpg.android.habitica.interactors
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.core.view.doOnNextLayout
|
||||
import androidx.lifecycle.setViewTreeLifecycleOwner
|
||||
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.android.habitica.ui.views.BackgroundScene
|
||||
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
|
||||
import com.habitrpg.common.habitica.extensions.dpToPx
|
||||
import com.habitrpg.common.habitica.extensions.layoutInflater
|
||||
import com.habitrpg.common.habitica.extensions.loadImage
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
class ShareMountUseCase: UseCase<ShareMountUseCase.RequestValues, Unit>() {
|
||||
class RequestValues(val mountKey: String, val message: String, val context: Context) :
|
||||
UseCase.RequestValues
|
||||
|
||||
override suspend fun run(requestValues: RequestValues) {
|
||||
val mountWrapper = MountImageviewBinding.inflate(requestValues.context.layoutInflater)
|
||||
val width = if (mountWrapper.root.width > 0) mountWrapper.root.width else 300.dpToPx(requestValues.context)
|
||||
val height = 124.dpToPx(requestValues.context)
|
||||
mountWrapper.root.layout(0, 0, width, height)
|
||||
mountWrapper.mountImageview.setMount(requestValues.mountKey)
|
||||
val currentActivity =
|
||||
HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get()
|
||||
// Add the view to the decorView so that it can be layouted
|
||||
(currentActivity?.window?.decorView as? ViewGroup)?.addView(mountWrapper.root)
|
||||
if (currentActivity != null) {
|
||||
mountWrapper.backgroundView.setContent {
|
||||
HabiticaTheme {
|
||||
BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large))
|
||||
}
|
||||
}
|
||||
mountWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
mountWrapper.root.setViewTreeLifecycleOwner(currentActivity)
|
||||
}
|
||||
mountWrapper.backgroundView.layout(0, 0, width, height)
|
||||
mountWrapper.mountImageview.layout(0, 0, width, height)
|
||||
val sharedImage = Bitmap.createBitmap(
|
||||
width,
|
||||
height,
|
||||
Bitmap.Config.ARGB_8888
|
||||
)
|
||||
val canvas = Canvas(sharedImage)
|
||||
var attempts = 0
|
||||
while (!mountWrapper.mountImageview.hasLoadedImages && attempts < 200) {
|
||||
delay(100)
|
||||
attempts++
|
||||
}
|
||||
// Draw it to the canvas once it's layouted
|
||||
mountWrapper.root.doOnNextLayout {
|
||||
mountWrapper.root.draw(canvas)
|
||||
((requestValues.context as? BaseActivity) ?: HabiticaBaseApplication.getInstance(
|
||||
requestValues.context
|
||||
)?.currentActivity?.get())?.shareContent("pet", requestValues.message, sharedImage)
|
||||
currentActivity?.toolbar?.removeView(mountWrapper.root)
|
||||
}
|
||||
// trigger layout
|
||||
val m = FrameLayout.LayoutParams(width, height)
|
||||
mountWrapper.root.layoutParams = m
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
package com.habitrpg.android.habitica.interactors
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Rect
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.view.PixelCopy
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.platform.findViewTreeCompositionContext
|
||||
import androidx.core.view.doOnNextLayout
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.setViewTreeLifecycleOwner
|
||||
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
||||
import com.habitrpg.android.habitica.HabiticaBaseApplication
|
||||
import com.habitrpg.android.habitica.R
|
||||
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.android.habitica.ui.views.BackgroundScene
|
||||
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
|
||||
import com.habitrpg.common.habitica.extensions.dpToPx
|
||||
import com.habitrpg.common.habitica.extensions.layoutInflater
|
||||
import com.habitrpg.common.habitica.extensions.loadImage
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
class SharePetUseCase: UseCase<SharePetUseCase.RequestValues, Unit>() {
|
||||
class RequestValues(val petKey: String, val message: String, val context: Context) :
|
||||
UseCase.RequestValues
|
||||
|
||||
override suspend fun run(requestValues: RequestValues) {
|
||||
val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater)
|
||||
petWrapper.petImageview.loadImage("stable_Pet-" + requestValues.petKey)
|
||||
petWrapper.root.visibility = View.INVISIBLE
|
||||
val currentActivity =
|
||||
HabiticaBaseApplication.getInstance(requestValues.context)?.currentActivity?.get()
|
||||
(currentActivity?.window?.decorView as? ViewGroup)?.addView(petWrapper.root)
|
||||
if (currentActivity != null) {
|
||||
petWrapper.backgroundView.setContent {
|
||||
HabiticaTheme {
|
||||
BackgroundScene(Modifier.clip(HabiticaTheme.shapes.large))
|
||||
}
|
||||
}
|
||||
petWrapper.backgroundView.setParentCompositionContext(currentActivity.toolbar?.findViewTreeCompositionContext())
|
||||
petWrapper.root.setViewTreeSavedStateRegistryOwner(currentActivity)
|
||||
petWrapper.root.setViewTreeLifecycleOwner(currentActivity)
|
||||
}
|
||||
val width = if (petWrapper.root.width > 0) petWrapper.root.width else 300.dpToPx(requestValues.context)
|
||||
val height = 124.dpToPx(requestValues.context)
|
||||
val sharedImage = Bitmap.createBitmap(
|
||||
width,
|
||||
height,
|
||||
Bitmap.Config.ARGB_8888
|
||||
)
|
||||
val canvas = Canvas(sharedImage)
|
||||
var attempts = 0
|
||||
while (petWrapper.petImageview.bitmap == null && attempts < 200) {
|
||||
delay(100)
|
||||
attempts++
|
||||
}
|
||||
petWrapper.root.doOnNextLayout {
|
||||
petWrapper.root.draw(canvas)
|
||||
((requestValues.context as? BaseActivity) ?: HabiticaBaseApplication.getInstance(
|
||||
requestValues.context
|
||||
)?.currentActivity?.get())?.shareContent("pet", requestValues.message, sharedImage)
|
||||
currentActivity?.toolbar?.removeView(petWrapper.root)
|
||||
}
|
||||
val m = FrameLayout.LayoutParams(width, height)
|
||||
petWrapper.root.layoutParams = m
|
||||
}
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@ 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
|
||||
|
|
@ -29,12 +30,14 @@ 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
|
||||
|
|
@ -65,6 +68,7 @@ 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
|
||||
|
|
|
|||
|
|
@ -44,10 +44,10 @@ private fun getBackgroundPainter(): ImageBitmap {
|
|||
}
|
||||
|
||||
@Composable
|
||||
fun BackgroundScene() {
|
||||
fun BackgroundScene(modifier: Modifier = Modifier) {
|
||||
val image = getBackgroundPainter()
|
||||
Canvas(
|
||||
modifier = Modifier
|
||||
modifier = modifier
|
||||
.height(124.dp)
|
||||
.fillMaxWidth()
|
||||
.zIndex(1f), onDraw = {
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import androidx.core.view.ViewCompat
|
|||
import com.google.android.material.snackbar.BaseTransientBottomBar
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.databinding.SnackbarViewBinding
|
||||
import com.habitrpg.common.habitica.helpers.Animations
|
||||
import com.plattysoft.leonids.ParticleSystem
|
||||
|
||||
|
|
@ -28,18 +29,27 @@ class HabiticaSnackbar
|
|||
*/
|
||||
private constructor(parent: ViewGroup, content: View, callback: ContentViewCallback) :
|
||||
BaseTransientBottomBar<HabiticaSnackbar>(parent, content, callback) {
|
||||
val binding: SnackbarViewBinding = SnackbarViewBinding.bind(content)
|
||||
|
||||
fun setTitle(title: CharSequence?): HabiticaSnackbar {
|
||||
val textView = view.findViewById<View>(R.id.snackbar_title) as? TextView
|
||||
textView?.text = title
|
||||
textView?.visibility = if (title != null) View.VISIBLE else View.GONE
|
||||
binding.snackbarTitle.text = title
|
||||
binding.snackbarTitle.visibility = if (title != null) View.VISIBLE else View.GONE
|
||||
return this
|
||||
}
|
||||
|
||||
fun setText(text: CharSequence?): HabiticaSnackbar {
|
||||
val textView = view.findViewById<View>(R.id.snackbar_text) as? TextView
|
||||
textView?.text = text
|
||||
textView?.visibility = if (text != null) View.VISIBLE else View.GONE
|
||||
binding.snackbarText.text = text
|
||||
binding.snackbarText.visibility = if (text != null) View.VISIBLE else View.GONE
|
||||
return this
|
||||
}
|
||||
|
||||
fun setTitleColor(color: Int): HabiticaSnackbar {
|
||||
binding.snackbarTitle.setTextColor(color)
|
||||
return this
|
||||
}
|
||||
|
||||
fun setTextColor(color: Int): HabiticaSnackbar {
|
||||
binding.snackbarText.setTextColor(color)
|
||||
return this
|
||||
}
|
||||
|
||||
|
|
@ -47,20 +57,16 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb
|
|||
if (icon == null) {
|
||||
return this
|
||||
}
|
||||
val rightView = view.findViewById<View>(R.id.rightView)
|
||||
rightView.visibility = View.VISIBLE
|
||||
val rightIconView = view.findViewById<ImageView>(R.id.rightIconView)
|
||||
rightIconView.setImageDrawable(icon)
|
||||
val rightTextView = view.findViewById<TextView>(R.id.rightTextView)
|
||||
rightTextView.setTextColor(textColor)
|
||||
rightTextView.text = text
|
||||
binding.rightView.visibility = View.VISIBLE
|
||||
binding.rightIconView.setImageDrawable(icon)
|
||||
binding.rightTextView.setTextColor(textColor)
|
||||
binding.rightTextView.text = text
|
||||
return this
|
||||
}
|
||||
|
||||
fun setLeftIcon(image: Drawable?): HabiticaSnackbar {
|
||||
val imageView = view.findViewById<ImageView>(R.id.leftImageView)
|
||||
imageView.setImageDrawable(image)
|
||||
imageView.visibility = if (image != null) View.VISIBLE else View.GONE
|
||||
binding.leftImageView.setImageDrawable(image)
|
||||
binding.leftImageView.visibility = if (image != null) View.VISIBLE else View.GONE
|
||||
return this
|
||||
}
|
||||
|
||||
|
|
@ -70,16 +76,14 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb
|
|||
}
|
||||
|
||||
fun setBackgroundResource(resourceId: Int): HabiticaSnackbar {
|
||||
val snackbarView = view.findViewById<View>(R.id.snackbar_view)
|
||||
snackbarView.setBackgroundResource(resourceId)
|
||||
binding.snackbarView.setBackgroundResource(resourceId)
|
||||
view.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent))
|
||||
return this
|
||||
}
|
||||
|
||||
private fun setSpecialView(specialView: View?): HabiticaSnackbar {
|
||||
if (specialView != null) {
|
||||
val snackbarView = view.findViewById<View>(R.id.content_container) as? LinearLayout
|
||||
snackbarView?.addView(specialView)
|
||||
binding.contentContainer.addView(specialView)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
|
@ -261,14 +265,14 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb
|
|||
SnackbarDisplayType.FAILURE_BLUE, SnackbarDisplayType.BLUE -> snackbar.setBackgroundResource(
|
||||
R.drawable.snackbar_background_blue
|
||||
)
|
||||
|
||||
SnackbarDisplayType.DROP, SnackbarDisplayType.NORMAL -> snackbar.setBackgroundResource(
|
||||
R.drawable.snackbar_background_gray
|
||||
)
|
||||
|
||||
SnackbarDisplayType.SUCCESS -> snackbar.setBackgroundResource(R.drawable.snackbar_background_green)
|
||||
SnackbarDisplayType.SUBSCRIBER_BENEFIT -> {
|
||||
snackbar.setBackgroundResource(R.drawable.subscriber_benefit_snackbar_bg)
|
||||
snackbar.setTitleColor(ContextCompat.getColor(container.context, R.color.green_1))
|
||||
snackbar.setTextColor(ContextCompat.getColor(container.context, R.color.green_1))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -291,15 +295,15 @@ private constructor(parent: ViewGroup, content: View, callback: ContentViewCallb
|
|||
{
|
||||
ParticleSystem(
|
||||
container,
|
||||
200,
|
||||
300,
|
||||
ContextCompat.getDrawable(container.context, R.drawable.confetti_subs),
|
||||
500L
|
||||
800L
|
||||
)
|
||||
.setFadeOut(200L)
|
||||
.setSpeedRange(0.05f, 0.2f)
|
||||
.setScaleRange(0.8f, 1.2f)
|
||||
.setRotationSpeedRange(134f, 164f)
|
||||
.emit(snackbar.getView(), 150, 500)
|
||||
.emit(snackbar.getView(), 200, 600)
|
||||
}, 500L
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import android.view.View
|
|||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.habitrpg.android.habitica.HabiticaBaseApplication
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.databinding.DialogHatchPetButtonBinding
|
||||
import com.habitrpg.android.habitica.databinding.DialogPetSuggestHatchBinding
|
||||
|
|
@ -168,7 +169,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) {
|
|||
binding.currencyView.currency = "gems"
|
||||
binding.currencyView.setTextColor(ContextCompat.getColor(context, R.color.white))
|
||||
addButton(binding.root, true) { _, _ ->
|
||||
val activity = (getActivity() as? MainActivity) ?: return@addButton
|
||||
val activity = (getActivity() as? MainActivity) ?: (HabiticaBaseApplication.getInstance(context)?.currentActivity?.get() as? MainActivity) ?: return@addButton
|
||||
if ((userViewModel.user.value?.gemCount ?: hatchPrice) < hatchPrice) {
|
||||
InsufficientGemsDialog(activity, hatchPrice).show()
|
||||
Analytics.sendEvent("show insufficient gems modal", EventCategory.BEHAVIOUR, HitType.EVENT, mapOf("reason" to "pet suggest modal"))
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import androidx.compose.ui.draw.scale
|
|||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.StrokeCap
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.imageResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
|
|
@ -47,9 +48,12 @@ import androidx.compose.ui.unit.dp
|
|||
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.views.BackgroundScene
|
||||
import com.habitrpg.android.habitica.ui.views.HabiticaButton
|
||||
import com.habitrpg.common.habitica.helpers.launchCatching
|
||||
import kotlinx.coroutines.MainScope
|
||||
import java.util.Calendar
|
||||
import kotlin.math.sin
|
||||
|
||||
|
|
@ -146,6 +150,25 @@ fun MountBottomSheet(
|
|||
.zIndex(2f)
|
||||
)
|
||||
}
|
||||
val context = LocalContext.current
|
||||
HabiticaButton(
|
||||
background = HabiticaTheme.colors.tintedUiSub,
|
||||
color = Color.White,
|
||||
contentPadding = PaddingValues(12.dp),
|
||||
modifier = Modifier.padding(bottom = 16.dp),
|
||||
onClick = {
|
||||
MainScope().launchCatching {
|
||||
ShareMountUseCase().callInteractor(
|
||||
ShareMountUseCase.RequestValues(
|
||||
mount.key,
|
||||
"",
|
||||
context
|
||||
))
|
||||
}
|
||||
onDismiss()
|
||||
}) {
|
||||
Text(stringResource(id = R.string.share))
|
||||
}
|
||||
HabiticaButton(
|
||||
background = HabiticaTheme.colors.tintedUiSub,
|
||||
color = Color.White,
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@ class MountView @JvmOverloads constructor(
|
|||
context: Context, attrs: AttributeSet? = null
|
||||
) : FrameLayout(context, attrs) {
|
||||
|
||||
val hasLoadedImages: Boolean
|
||||
get() {
|
||||
return bodyView.bitmap != null && headView.bitmap != null
|
||||
}
|
||||
private val bodyView: PixelArtView = PixelArtView(context)
|
||||
private val headView: PixelArtView = PixelArtView(context)
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,8 @@ import androidx.compose.ui.unit.dp
|
|||
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.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
|
||||
|
|
@ -75,6 +77,7 @@ import com.habitrpg.common.habitica.extensions.getThemeColor
|
|||
import com.habitrpg.common.habitica.helpers.MainNavigationController
|
||||
import com.habitrpg.common.habitica.helpers.launchCatching
|
||||
import com.habitrpg.shared.habitica.models.responses.FeedResponse
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlin.math.sin
|
||||
|
||||
|
|
@ -310,6 +313,25 @@ fun PetBottomSheet(
|
|||
}
|
||||
}
|
||||
}
|
||||
val context = LocalContext.current
|
||||
HabiticaButton(
|
||||
background = HabiticaTheme.colors.tintedUiSub,
|
||||
color = Color.White,
|
||||
contentPadding = PaddingValues(12.dp),
|
||||
modifier = Modifier.padding(bottom = 16.dp),
|
||||
onClick = {
|
||||
MainScope().launchCatching {
|
||||
SharePetUseCase().callInteractor(
|
||||
SharePetUseCase.RequestValues(
|
||||
pet.key,
|
||||
"",
|
||||
context
|
||||
))
|
||||
}
|
||||
onDismiss()
|
||||
}) {
|
||||
Text(stringResource(id = R.string.share))
|
||||
}
|
||||
HabiticaButton(
|
||||
background = HabiticaTheme.colors.tintedUiSub,
|
||||
color = Color.White,
|
||||
|
|
|
|||
|
|
@ -154,16 +154,6 @@ class LoginViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
fun login(username: String, password: String, onResult: (Boolean) -> Unit) {
|
||||
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
|
||||
val response = apiClient.loginLocal(UserAuth(username, password)).responseData
|
||||
handleAuthResponse(response)
|
||||
onResult(response?.id != null)
|
||||
}.invokeOnCompletion {
|
||||
onResult(it == null)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1001
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue