mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
fix various crashes
This commit is contained in:
parent
901bd078fd
commit
241599a785
14 changed files with 95 additions and 64 deletions
|
|
@ -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"
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
||||
<LinearLayout
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
android:id="@+id/trainedProgressBar"
|
||||
android:progressTint="@color/green_100"
|
||||
android:progressBackgroundTint="@color/gray_600"
|
||||
android:progressBackgroundTintMode="src_over"
|
||||
android:layout_marginTop="4dp"
|
||||
android:max="50" />
|
||||
</LinearLayout>
|
||||
|
|
@ -309,7 +309,10 @@
|
|||
</style>
|
||||
|
||||
<style name="BottomMenuItem">
|
||||
<item name="android:padding">@dimen/bottom_menu_padding</item>
|
||||
<item name="android:paddingStart">@dimen/bottom_menu_padding</item>
|
||||
<item name="android:paddingEnd">@dimen/bottom_menu_padding</item>
|
||||
<item name="android:paddingTop">@dimen/spacing_large</item>
|
||||
<item name="android:paddingBottom">@dimen/spacing_large</item>
|
||||
<item name="android:background">@drawable/selection_highlight</item>
|
||||
</style>
|
||||
|
||||
|
|
|
|||
|
|
@ -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<String>, 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<String>, callback: Inventory.Callback) {
|
||||
val request = Inventory.Request.create().loadAllPurchases().loadSkus(type, skus)
|
||||
if (request != null) {
|
||||
inventory?.load(request, callback)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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<UserAuthResponse> {
|
|||
|
||||
HabiticaBaseApplication.reloadUserComponent()
|
||||
|
||||
if (isRegistering) {
|
||||
FirebaseAnalytics.getInstance(this).logEvent("user_registered", null)
|
||||
}
|
||||
|
||||
compositeSubscription.add(userRepository.retrieveUser(true)
|
||||
.subscribe(Consumer {
|
||||
if (userAuthResponse.newUser) {
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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<Pet>?, 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<Pet>?, 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)))
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue