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)