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