diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index d73563a59..c75388bc2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -143,13 +143,12 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli path += user?.preferences?.background } return zipWithLiveUser(apiClient.unlockPath(path)) { unlockResponse, copiedUser -> - localRepository.modify(copiedUser) { copiedUser -> - copiedUser.preferences = unlockResponse.preferences - copiedUser.purchased = unlockResponse.purchased - copiedUser.items = unlockResponse.items - copiedUser.balance = copiedUser.balance - (customization.price ?: 0) / 4.0 - localRepository.saveUser(copiedUser, false) - } + val user = localRepository.getUnmanagedCopy(copiedUser) + user.preferences = unlockResponse.preferences + user.purchased = unlockResponse.purchased + user.items = unlockResponse.items + user.balance = copiedUser.balance - (customization.price ?: 0) / 4.0 + localRepository.saveUser(copiedUser, false) unlockResponse } } @@ -164,7 +163,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } path = path.substring(1) return Flowable.zip(apiClient.unlockPath(path), localRepository.getUser(userID).firstElement().toFlowable() - .map { localRepository.getLiveObject(it) } + .map { localRepository.getUnmanagedCopy(it) } .skipNil(), { unlockResponse, copiedUser -> copiedUser.preferences = unlockResponse.preferences copiedUser.purchased = unlockResponse.purchased diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt index 6bbf35254..bb800bed2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt @@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.models.BaseObject import io.realm.Realm import io.realm.RealmModel import io.realm.RealmObject +import io.realm.kotlin.isManaged import io.realm.kotlin.where abstract class RealmBaseLocalRepository internal constructor(override var realm: Realm) : BaseLocalRepository { @@ -72,7 +73,7 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: override fun modify(obj: T, transaction: (T) -> Unit) { if (isClosed) { return } - val liveObject = getLiveObject(obj) ?: return + val liveObject = getLiveObject(obj) ?: return realm.executeTransaction { transaction(liveObject) } @@ -88,6 +89,7 @@ abstract class RealmBaseLocalRepository internal constructor(override var realm: override fun getLiveObject(obj: T): T? { if (isClosed) return null + if (!obj.isManaged()) return obj val baseObject = obj as? BaseObject ?: return null return realm.where(baseObject.realmClass).equalTo(baseObject.primaryIdentifierName, baseObject.primaryIdentifier).findFirst() as? T } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt index a94ab90a1..ac9324e7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/PushNotificationManager.kt @@ -31,18 +31,17 @@ class PushNotificationManager(var apiClient: ApiClient, private val sharedPrefer } fun addPushDeviceUsingStoredToken() { - if (this.refreshedToken.isEmpty()) { - this.refreshedToken = FirebaseMessaging.getInstance().token.result - } + FirebaseMessaging.getInstance().token.addOnCompleteListener { + this.refreshedToken = it.result + if (this.refreshedToken.isEmpty() || this.user == null || this.userHasPushDevice() || !this.userIsSubscribedToNotifications()) { + return@addOnCompleteListener + } - if (this.refreshedToken.isEmpty() || this.user == null || this.userHasPushDevice() || !this.userIsSubscribedToNotifications()) { - return + val pushDeviceData = HashMap() + pushDeviceData["regId"] = this.refreshedToken + pushDeviceData["type"] = "android" + apiClient.addPushDevice(pushDeviceData).subscribe({ }, RxErrorHandler.handleEmptyError()) } - - val pushDeviceData = HashMap() - pushDeviceData["regId"] = this.refreshedToken - pushDeviceData["type"] = "android" - apiClient.addPushDevice(pushDeviceData).subscribe({ }, RxErrorHandler.handleEmptyError()) } fun removePushDeviceUsingStoredToken() {