fix various crashes

This commit is contained in:
Phillip Thelen 2020-07-13 17:28:19 +02:00
parent 901bd078fd
commit 241599a785
14 changed files with 95 additions and 64 deletions

View file

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

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -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)
}
}

View file

@ -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);
}
}
}

View file

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

View file

@ -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())

View file

@ -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) {

View file

@ -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()) {

View file

@ -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)))

View file

@ -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) }
}
}
}

View file

@ -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)
}
}

View file

@ -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)