diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 89040842d..beb6c6f61 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -162,7 +162,7 @@ android {
multiDexEnabled true
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 2462
+ versionCode 2466
versionName "2.7"
}
diff --git a/Habitica/res/layout/activity_adventure_guide.xml b/Habitica/res/layout/activity_adventure_guide.xml
index 7674b7f6c..5feab0ad1 100644
--- a/Habitica/res/layout/activity_adventure_guide.xml
+++ b/Habitica/res/layout/activity_adventure_guide.xml
@@ -89,7 +89,6 @@
android:layout_marginBottom="@dimen/spacing_medium"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:progressBackgroundTint="@color/gray_600"
- android:progressBackgroundTintMode="src_over"
android:progressTint="@color/yellow_50"/>
\ No newline at end of file
diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml
index 7b7f43b96..44fe19c92 100644
--- a/Habitica/res/values/styles.xml
+++ b/Habitica/res/values/styles.xml
@@ -309,7 +309,10 @@
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
index ada17a27b..296dc705e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
@@ -6,6 +6,7 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
import org.solovyev.android.checkout.*
import java.util.*
+import javax.annotation.Nonnull
class PurchaseHandler(activity: Activity, val crashlyticsProxy: CrashlyticsProxy) {
private val billing = HabiticaBaseApplication.getInstance(activity.applicationContext)?.billing
@@ -73,20 +74,25 @@ class PurchaseHandler(activity: Activity, val crashlyticsProxy: CrashlyticsProxy
}
private fun getProduct(type: String, identifiers: List, onSuccess: ((Inventory.Product) -> Unit)) {
- inventory?.load(Inventory.Request.create()
- .loadAllPurchases().loadSkus(type, identifiers)) { products ->
+ loadInventory(type, identifiers, Inventory.Callback { products ->
val purchases = products.get(type)
- if (!purchases.supported) return@load
+ if (!purchases.supported) return@Callback
onSuccess(purchases)
- }
+ })
}
private fun getSKU(type: String, identifier: String, onSuccess: ((Sku) -> Unit)) {
- inventory?.load(Inventory.Request.create()
- .loadAllPurchases().loadSkus(type, listOf(identifier))) { products ->
+ loadInventory(type, listOf(identifier), Inventory.Callback { products ->
val purchases = products.get(type)
- if (!purchases.supported) return@load
+ if (!purchases.supported) return@Callback
purchases.skus.firstOrNull()?.let { onSuccess(it) }
+ })
+ }
+
+ private fun loadInventory(type: String, skus: List, callback: Inventory.Callback) {
+ val request = Inventory.Request.create().loadAllPurchases().loadSkus(type, skus)
+ if (request != null) {
+ inventory?.load(request, callback)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java
deleted file mode 100644
index 008888d84..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.habitrpg.android.habitica.helpers.notifications;
-
-import com.google.firebase.iid.FirebaseInstanceId;
-import com.google.firebase.messaging.FirebaseMessagingService;
-import com.google.firebase.messaging.RemoteMessage;
-import com.habitrpg.android.habitica.HabiticaApplication;
-
-import java.util.Objects;
-
-import javax.inject.Inject;
-
-/**
- * Created by keithholliday on 6/24/16.
- */
-public class HabiticaFirebaseMessagingService extends FirebaseMessagingService {
-
- @Inject
- public PushNotificationManager pushNotificationManager;
-
- @Override
- public void onMessageReceived(RemoteMessage remoteMessage) {
- Objects.requireNonNull(HabiticaApplication.Companion.getUserComponent()).inject(this);
- pushNotificationManager.displayNotification(remoteMessage);
- }
-
- @Override
- public void onNewToken(String s) {
- super.onNewToken(s);
- Objects.requireNonNull(HabiticaApplication.Companion.getUserComponent()).inject(this);
- String refreshedToken = FirebaseInstanceId.getInstance().getToken();
- if (refreshedToken != null) {
- pushNotificationManager.setRefreshedToken(refreshedToken);
- }
- }
-}
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
new file mode 100644
index 000000000..c8cc4127e
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt
@@ -0,0 +1,33 @@
+package com.habitrpg.android.habitica.helpers.notifications
+
+import com.google.firebase.iid.FirebaseInstanceId
+import com.google.firebase.messaging.FirebaseMessagingService
+import com.google.firebase.messaging.RemoteMessage
+import com.habitrpg.android.habitica.HabiticaApplication
+import com.habitrpg.android.habitica.HabiticaBaseApplication
+import com.habitrpg.android.habitica.components.UserComponent
+import java.util.*
+import javax.inject.Inject
+
+class HabiticaFirebaseMessagingService : FirebaseMessagingService() {
+
+ private val userComponent: UserComponent?
+ get() = HabiticaBaseApplication.userComponent
+
+ @Inject
+ internal lateinit var pushNotificationManager: PushNotificationManager
+
+ override fun onMessageReceived(remoteMessage: RemoteMessage) {
+ userComponent?.inject(this)
+ pushNotificationManager.displayNotification(remoteMessage)
+ }
+
+ override fun onNewToken(s: String) {
+ super.onNewToken(s)
+ userComponent?.inject(this)
+ val refreshedToken = FirebaseInstanceId.getInstance().token
+ if (refreshedToken != null) {
+ pushNotificationManager.refreshedToken = refreshedToken
+ }
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
index df1bef019..7553900bc 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
@@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.activities
import android.graphics.Paint
+import android.graphics.PorterDuff
import android.os.Build
import android.os.Bundle
import android.text.Html
@@ -94,6 +95,9 @@ class AdventureGuideActivity : BaseActivity() {
val completed = achievements.count { it.earned }
binding.progressBar.max = achievements.size
binding.progressBar.progress = completed
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
+ binding.progressBar.progressBackgroundTintMode = PorterDuff.Mode.SRC_OVER
+ }
if (completed > 0) {
binding.progressTextview.text = getString(R.string.percent_completed, ((completed / achievements.size.toFloat()) * 100).toInt())
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
index c407e8d7e..51e65a860 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
@@ -31,6 +31,7 @@ import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability
import com.google.android.gms.common.GooglePlayServicesUtil
import com.google.android.gms.common.Scopes
+import com.google.firebase.analytics.FirebaseAnalytics
import com.habitrpg.android.habitica.BuildConfig
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
@@ -369,6 +370,10 @@ class LoginActivity : BaseActivity(), Consumer {
HabiticaBaseApplication.reloadUserComponent()
+ if (isRegistering) {
+ FirebaseAnalytics.getInstance(this).logEvent("user_registered", null)
+ }
+
compositeSubscription.add(userRepository.retrieveUser(true)
.subscribe(Consumer {
if (userAuthResponse.newUser) {
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 09092169f..7be8e44b6 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
@@ -159,7 +159,11 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
@SuppressLint("ObsoleteSdkInt")
public override fun onCreate(savedInstanceState: Bundle?) {
- launchTrace = FirebasePerformance.getInstance().newTrace("MainActivityLaunch")
+ try {
+ launchTrace = FirebasePerformance.getInstance().newTrace("MainActivityLaunch")
+ } catch (_: IllegalStateException) {
+
+ }
launchTrace?.start()
super.onCreate(savedInstanceState)
@@ -358,11 +362,15 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
val quest = user?.party?.quest
if (quest?.completed?.isNotBlank() == true) {
- compositeSubscription.add(inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe {
+ compositeSubscription.add(inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe(Consumer {
QuestCompletedDialog.showWithQuest(this, it)
userRepository.updateUser(user, "party.quest.completed", "").subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
- })
+ }, RxErrorHandler.handleEmptyError()))
+ }
+
+ if (user?.flags?.welcomed == false) {
+ compositeSubscription.add(userRepository.updateUser(user, "flags.welcomed", true).subscribe(Consumer {}, RxErrorHandler.handleEmptyError()))
}
if (appConfigManager.enableAdventureGuide()) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
index 88487a78b..b917f88c7 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
@@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.adapter.inventory
import android.content.Context
+import android.graphics.PorterDuff
import android.graphics.drawable.BitmapDrawable
import android.view.View
import android.view.ViewGroup
@@ -107,10 +108,14 @@ class PetDetailRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: B
this.trainedProgressbar.visibility = View.GONE
this.imageView.alpha = 0.1f
}
+ if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
+ trainedProgressbar.progressBackgroundTintMode = PorterDuff.Mode.SRC_OVER
+ }
imageView.background = null
val trained = ownedPet?.trained ?: 0
DataBindingUtils.loadImage(imageName) {
- val drawable = BitmapDrawable(context?.resources, if (trained == 0) it.extractAlpha() else it)
+ val resources = context?.resources ?: return@loadImage
+ val drawable = BitmapDrawable(resources, if (trained == 0) it.extractAlpha() else it)
Observable.just(drawable)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
@@ -125,6 +130,7 @@ class PetDetailRecyclerAdapter(data: OrderedRealmCollection?, autoUpdate: B
}
val context = context ?: return
val menu = BottomSheetMenu(context)
+ menu.setTitle(animal?.text)
menu.addMenuItem(BottomSheetMenuItem(itemView.resources.getString(R.string.equip)))
if (canRaiseToMount) {
menu.addMenuItem(BottomSheetMenuItem(itemView.resources.getString(R.string.feed)))
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 c0d783c4e..4245d0ed5 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
@@ -55,19 +55,23 @@ class StableRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
val obj = this.itemList[position]
- if (obj == "header") {
- (holder as? StableHeaderViewHolder)?.bind()
- } else if (obj.javaClass == String::class.java) {
- if (obj == "Standard") {
- var params = holder.itemView.layoutParams as GridLayoutManager.LayoutParams
- params.height = 135
- holder.itemView.layoutParams = params
+ when {
+ obj == "header" -> {
+ (holder as? StableHeaderViewHolder)?.bind()
}
- (holder as? SectionViewHolder)?.bind(obj as? String ?: "")
+ obj.javaClass == String::class.java -> {
+ if (obj == "Standard") {
+ val params = holder.itemView.layoutParams as GridLayoutManager.LayoutParams
+ params.height = 135
+ holder.itemView.layoutParams = params
+ }
+ (holder as? SectionViewHolder)?.bind(obj as? String ?: "")
- } else {
- (obj as? Animal)?.let { (holder as? StableViewHolder)?.bind(it) }
+ }
+ else -> {
+ (obj as? Animal)?.let { (holder as? StableViewHolder)?.bind(it) }
+ }
}
}
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 17ffb9a41..f8625df1c 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
@@ -265,9 +265,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style.
if (dialogQueue.firstOrNull() == currentDialog) {
dialogQueue.removeAt(0)
}
- Log.i("SHOWNEXT", dialogQueue.toString())
if (dialogQueue.size > 0) {
- Log.i("FOUNDONE", dialogQueue[0].toString())
if ((dialogQueue[0].context as? Activity) == null || (dialogQueue[0].context as? Activity)?.isFinishing == false) {
dialogQueue[0].show()
}
@@ -277,9 +275,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style.
private fun addToQueue(dialog: HabiticaAlertDialog) {
if (dialogQueue.isEmpty()) {
dialog.show()
- Log.i("SHOWIMMEDIATELY", dialog.toString())
}
- Log.i("ADDTOQUEUE", dialog.toString())
dialogQueue.add(dialog)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt
index e980ea7ff..2c9ea4ebc 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt
@@ -36,6 +36,9 @@ abstract class TaskListFactory internal constructor(val context: Context, intent
}
private fun loadData() {
+ if (!this::taskRepository.isInitialized) {
+ return
+ }
val mainHandler = Handler(context.mainLooper)
mainHandler.post {
taskRepository.getCurrentUserTasks(taskType)