diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 57106fc31..a93426315 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -150,7 +150,7 @@ android {
buildConfigField "String", "TESTING_LEVEL", "\"production\""
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
- versionCode 2647
+ versionCode 2653
versionName "3.1"
}
diff --git a/Habitica/res/drawable-night-hdpi/challenge_won_gem_confetti.png b/Habitica/res/drawable-night-hdpi/challenge_won_gem_confetti.png
new file mode 100644
index 000000000..6eff51109
Binary files /dev/null and b/Habitica/res/drawable-night-hdpi/challenge_won_gem_confetti.png differ
diff --git a/Habitica/res/drawable-night-mdpi/challenge_won_gem_confetti.png b/Habitica/res/drawable-night-mdpi/challenge_won_gem_confetti.png
new file mode 100644
index 000000000..4e00ffce3
Binary files /dev/null and b/Habitica/res/drawable-night-mdpi/challenge_won_gem_confetti.png differ
diff --git a/Habitica/res/drawable-night-xhdpi/challenge_won_gem_confetti.png b/Habitica/res/drawable-night-xhdpi/challenge_won_gem_confetti.png
new file mode 100644
index 000000000..6573424b6
Binary files /dev/null and b/Habitica/res/drawable-night-xhdpi/challenge_won_gem_confetti.png differ
diff --git a/Habitica/res/drawable-night-xxhdpi/challenge_won_gem_confetti.png b/Habitica/res/drawable-night-xxhdpi/challenge_won_gem_confetti.png
new file mode 100644
index 000000000..1340361ea
Binary files /dev/null and b/Habitica/res/drawable-night-xxhdpi/challenge_won_gem_confetti.png differ
diff --git a/Habitica/res/drawable-night-xxxhdpi/challenge_won_gem_confetti.png b/Habitica/res/drawable-night-xxxhdpi/challenge_won_gem_confetti.png
new file mode 100644
index 000000000..6c66fb945
Binary files /dev/null and b/Habitica/res/drawable-night-xxxhdpi/challenge_won_gem_confetti.png differ
diff --git a/Habitica/res/drawable-night-xxxhdpi/won_challenge_icon.png b/Habitica/res/drawable-night-xxxhdpi/won_challenge_icon.png
new file mode 100644
index 000000000..92f26055e
Binary files /dev/null and b/Habitica/res/drawable-night-xxxhdpi/won_challenge_icon.png differ
diff --git a/Habitica/res/layout/activity_intro.xml b/Habitica/res/layout/activity_intro.xml
index f5b3f090a..b6e1f23c1 100644
--- a/Habitica/res/layout/activity_intro.xml
+++ b/Habitica/res/layout/activity_intro.xml
@@ -27,7 +27,7 @@
android:layout_alignParentEnd="true"
android:layout_marginEnd="6dp"
android:layout_alignParentTop="true"
- android:layout_marginTop="30dp"
+ android:layout_marginTop="40dp"
android:textColor="@android:color/white"
android:background="@color/transparent" />
diff --git a/Habitica/res/layout/dialog_hatch_pet_button.xml b/Habitica/res/layout/dialog_hatch_pet_button.xml
new file mode 100644
index 000000000..08a194429
--- /dev/null
+++ b/Habitica/res/layout/dialog_hatch_pet_button.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/widget_avatar_stats.xml b/Habitica/res/layout/widget_avatar_stats.xml
index c7aa396ed..b3caffceb 100644
--- a/Habitica/res/layout/widget_avatar_stats.xml
+++ b/Habitica/res/layout/widget_avatar_stats.xml
@@ -193,7 +193,7 @@
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="14sp"
- android:textColor="@color/textColorSecondaryDark" />
+ android:textColor="?textColorSecondaryDark" />
@@ -226,7 +226,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
- android:textColor="@color/textColorSecondaryDark"
+ android:textColor="?textColorSecondaryDark"
style="@style/CurrencyTextView"
/>
@@ -239,7 +239,7 @@
android:id="@+id/gold_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/textColorSecondaryDark"
+ android:textColor="?textColorSecondaryDark"
style="@style/CurrencyTextView"
/>
diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml
index 0f6b6c80a..afc84de5c 100644
--- a/Habitica/res/values/colors.xml
+++ b/Habitica/res/values/colors.xml
@@ -72,11 +72,6 @@
@color/yellow_100
@color/blue_100
- @color/brand_300
- @color/brand_50
-
- @color/brand_500
-
#66000000
@color/text_ternary
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 63e467978..1fd53f09f 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -1125,7 +1125,7 @@
Hurray!
You won a Challenge
Congratulations!
- %s selected you as the winner! Your win has been recorded in your Achievements.
+ %s selected you as the winner! Your win has been recorded in your Achievements.]]>
You were selected as the winner! Your win has been recorded in your Achievements.
Claim %d Gems
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt
index 9491f28d4..5a2b168cf 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt
@@ -138,6 +138,7 @@ override fun getUser(userID: String): Flowable {
val habitClass = if (user.preferences?.disableClasses == true) "none" else user.stats?.habitClass
return RxJavaBridge.toV3Flowable(realm.where(Skill::class.java)
.equalTo("habitClass", habitClass)
+ .sort("lvl")
.findAll()
.asFlowable()
.filter { it.isLoaded })
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt
index d73dc9926..b9971cebe 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt
@@ -5,6 +5,8 @@ import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.components.UserComponent
+import com.habitrpg.android.habitica.data.UserRepository
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
import javax.inject.Inject
class HabiticaFirebaseMessagingService : FirebaseMessagingService() {
@@ -15,10 +17,17 @@ class HabiticaFirebaseMessagingService : FirebaseMessagingService() {
@Inject
internal lateinit var pushNotificationManager: PushNotificationManager
+ @Inject
+ internal lateinit var userRepository: UserRepository
+
override fun onMessageReceived(remoteMessage: RemoteMessage) {
userComponent?.inject(this)
if (this::pushNotificationManager.isInitialized) {
pushNotificationManager.displayNotification(remoteMessage)
+
+ if (remoteMessage.data["identifier"]?.contains(PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY) == true) {
+ userRepository.retrieveUser(true).subscribe({}, RxErrorHandler.handleEmptyError())
+ }
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
index 0303757a8..4846ba925 100755
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
@@ -47,6 +47,7 @@ import com.habitrpg.android.habitica.models.Notification
import com.habitrpg.android.habitica.models.TutorialStep
import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
+import com.habitrpg.android.habitica.models.notifications.ChallengeWonData
import com.habitrpg.android.habitica.models.notifications.LoginIncentiveData
import com.habitrpg.android.habitica.models.responses.MaintenanceResponse
import com.habitrpg.android.habitica.models.responses.TaskScoringResult
@@ -76,6 +77,10 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.functions.Consumer
import io.reactivex.rxjava3.schedulers.Schedulers
import io.realm.kotlin.isValid
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import java.util.*
@@ -377,6 +382,23 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
if (binding.toolbarTitle.text?.isNotBlank() != true) {
navigationController.currentDestination?.let { updateToolbarTitle(it, null) }
}
+
+ val alert1 = HabiticaAlertDialog(this)
+ alert1.setTitle("1")
+ alert1.addCloseButton()
+ alert1.enqueue()
+ val alert2 = HabiticaAlertDialog(this)
+ alert2.setTitle("2")
+ alert2.addCloseButton()
+ alert2.enqueue()
+ GlobalScope.launch(context = Dispatchers.Main) {
+ delay(500L)
+ val alert3 = HabiticaAlertDialog(this@MainActivity)
+ alert3.setTitle("3")
+ alert3.addCloseButton()
+ alert3.enqueue()
+ }
+
}
override fun onPause() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
index c3685c80a..700dde378 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt
@@ -180,7 +180,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() {
val animal = this.animal
if (animal != null) {
val color = if (animal.type == "special") animal.color else null
- if (animal.numberOwned > 0 || ownedEggs?.containsKey(animal.animal) == true) {
+ if (animal.numberOwned > 0) {
if (itemType == "pets") {
MainNavigationController.navigate(StableFragmentDirections.openPetDetail(animal.animal, animal.type ?: "", color))
} else {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt
index c03c274d2..4d3f1faf9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt
@@ -290,7 +290,7 @@ open class TaskRecyclerViewFragment : BaseFragment
+ taskRepository.getTasksForChallenge(task.challengeID).firstElement().subscribe({ tasks ->
val taskCount = tasks.size
val dialog = HabiticaAlertDialog(it)
dialog.setTitle(R.string.broken_challenge)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt
index 061bf6205..ac5ceca28 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt
@@ -13,8 +13,14 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.layoutInflater
+import com.habitrpg.android.habitica.helpers.MainNavigationController
+import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragmentDirections
import com.habitrpg.android.habitica.ui.views.login.LockableScrollView
import com.plattysoft.leonids.ParticleSystem
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
import java.lang.ref.WeakReference
@@ -269,8 +275,11 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style.
dialogQueue.removeAt(0)
}
if (dialogQueue.size > 0) {
- if ((dialogQueue[0].context as? Activity)?.isFinishing == false) {
- dialogQueue[0].show()
+ if ((dialogQueue[0].context as? Activity)?.isFinishing != true) {
+ GlobalScope.launch(context = Dispatchers.Main) {
+ delay(500L)
+ dialogQueue[0].show()
+ }
}
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt
index 48b81a10b..5a0175070 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt
@@ -4,12 +4,15 @@ import android.content.Context
import android.graphics.drawable.BitmapDrawable
import android.view.LayoutInflater
import android.view.View
+import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.DialogPetSuggestHatchBinding
import com.habitrpg.android.habitica.extensions.dpToPx
+import com.habitrpg.android.habitica.extensions.getThemeColor
+import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Animal
import com.habitrpg.android.habitica.models.inventory.Egg
@@ -109,18 +112,11 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) {
addButton(R.string.close, true)
if (hatchPrice > 0) {
- val linearLayout = LinearLayout(context)
- val label = TextView(context)
- label.setText(R.string.hatch)
- label.setTextColor(ContextCompat.getColor(context, R.color.colorPrimary))
- linearLayout.addView(label)
- val layoutParams: LinearLayout.LayoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT)
- layoutParams.setMargins(0, 0, 4.dpToPx(context), 0)
- label.layoutParams = layoutParams
- val priceView = CurrencyView(context, "gems", true)
- priceView.value = hatchPrice.toDouble()
- linearLayout.addView(priceView)
+ val linearLayout = layoutInflater.inflate(R.layout.dialog_hatch_pet_button, null) as? LinearLayout ?: return
+
+ val priceView = linearLayout.findViewById(R.id.currencyView)
+ priceView?.value = hatchPrice.toDouble()
+ priceView?.currency = "gems"
addButton(linearLayout, true) { _, _ ->
val activity = (getActivity() as? MainActivity) ?: return@addButton
val thisPotion = potion ?: return@addButton
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt
index 5f262a179..b69442ce6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt
@@ -13,6 +13,9 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
class WonChallengeDialog(context: Context) : HabiticaAlertDialog(context) {
fun configure(data: ChallengeWonData?) {
+ val imageView = additionalContentView?.findViewById(R.id.achievement_view);
+ DataBindingUtils.loadImage(imageView, "achievement-karaoke-2x")
+
if (data?.name != null) {
additionalContentView?.findViewById(R.id.description_view)?.text = context.getString(R.string.won_achievement_description, data.name).fromHtml()
}
@@ -30,9 +33,6 @@ class WonChallengeDialog(context: Context) : HabiticaAlertDialog(context) {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater
val view = inflater?.inflate(R.layout.dialog_won_challenge, null)
setTitle(R.string.you_won_challenge)
-
- DataBindingUtils.loadImage(view?.findViewById(R.id.achievement_view), "achievement-karaoke2x")
-
setAdditionalContentView(view)
}
}
diff --git a/Habitica/staff/release/output-metadata.json b/Habitica/staff/release/output-metadata.json
index e7456f95f..a053a10b5 100644
--- a/Habitica/staff/release/output-metadata.json
+++ b/Habitica/staff/release/output-metadata.json
@@ -10,7 +10,7 @@
{
"type": "SINGLE",
"filters": [],
- "versionCode": 2644,
+ "versionCode": 2650,
"versionName": "3.1",
"outputFile": "Habitica-staff-release.apk"
}