Refactor code to use less events

This commit is contained in:
Phillip Thelen 2019-06-12 17:06:51 +02:00
parent 644b4d8840
commit 4461d10353
93 changed files with 410 additions and 587 deletions

View file

@ -25,7 +25,6 @@ import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.modules.UserModule
import com.habitrpg.android.habitica.modules.UserRepositoryModule
@ -186,7 +185,7 @@ abstract class HabiticaBaseApplication : MultiDexApplication() {
}
})
billing.notNull { checkout = Checkout.forApplication(it) }
billing?.let { checkout = Checkout.forApplication(it) }
}
private fun setupRemoteConfig() {

View file

@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.data.implementation
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.local.SocialLocalRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.inventory.Quest
@ -246,7 +245,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
override fun acceptQuest(user: User?, partyId: String): Flowable<Void> {
return apiClient.acceptQuest(partyId)
.doOnNext {
user.notNull {
user?.let {
localRepository.updateRSVPNeeded(it, false)
}
}
@ -255,7 +254,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
override fun rejectQuest(user: User?, partyId: String): Flowable<Void> {
return apiClient.rejectQuest(partyId)
.doOnNext { _ ->
user.notNull {
user?.let {
localRepository.updateRSVPNeeded(it, false)
}
}

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.data.local.implementation
import android.content.Context
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.*
import com.habitrpg.android.habitica.models.shops.ShopItem
@ -175,7 +174,7 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context)
}
override fun changeOwnedCount(item: OwnedItem, amountToAdd: Int?) {
amountToAdd.notNull { amount ->
amountToAdd?.let { amount ->
realm.executeTransaction { item.numberOwned = item.numberOwned + amount }
}
}

View file

@ -1,17 +0,0 @@
package com.habitrpg.android.habitica.events;
import com.habitrpg.android.habitica.models.TutorialStep;
import java.util.List;
/**
* Created by viirus on 26/01/16.
*/
public class DisplayTutorialEvent {
public TutorialStep step;
public String tutorialText;
public List<String> tutorialTexts;
public boolean canBeDeferred;
}

View file

@ -1,5 +0,0 @@
package com.habitrpg.android.habitica.events;
public class OpenMysteryItemEvent {
}

View file

@ -1,10 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
import com.habitrpg.android.habitica.models.tasks.ChecklistItem;
import com.habitrpg.android.habitica.models.tasks.Task;
public class ChecklistCheckedCommand {
public Task task;
public ChecklistItem item;
}

View file

@ -1,8 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
public class EquipCommand {
public String key;
public String type;
}

View file

@ -1,11 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
import com.habitrpg.android.habitica.models.inventory.Egg;
import com.habitrpg.android.habitica.models.inventory.HatchingPotion;
public class HatchingCommand {
public Egg usingEgg;
public HatchingPotion usingHatchingPotion;
}

View file

@ -1,12 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
import java.util.Map;
/**
* Created by viirus on 13/01/16.
*/
public class UpdateUserCommand {
public Map<String, Object> updateData;
}

View file

@ -1,11 +0,0 @@
package com.habitrpg.android.habitica.events.commands;
import com.habitrpg.android.habitica.models.Skill;
/**
* Created by viirus on 28/11/15.
*/
public class UseSkillCommand {
public Skill skill;
}

View file

@ -7,10 +7,6 @@ import java.util.concurrent.TimeUnit
* Created by phillip on 01.02.18.
*/
fun <T : Any> T?.notNull(f: (it: T) -> Unit) {
if (this != null) f(this)
}
fun runDelayed(interval: Long, timeUnit: TimeUnit, function: () -> Unit) {
Completable.complete().delay(interval, timeUnit)
.subscribe(function)

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.interactors
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.responses.TaskDirectionData
import com.habitrpg.android.habitica.models.tasks.Task
@ -133,7 +132,7 @@ class ScoreTaskLocallyInteractor {
val outfit = user.items?.gear?.equipped
val outfitList = ArrayList<String>()
outfit.notNull { thisOutfit ->
outfit?.let { thisOutfit ->
outfitList.add(thisOutfit.armor)
outfitList.add(thisOutfit.back)
outfitList.add(thisOutfit.body)

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.models.social
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.tasks.TasksOrder
import com.habitrpg.android.habitica.models.user.User
import io.realm.RealmObject
@ -40,19 +39,19 @@ open class Challenge : RealmObject() {
val map = HashMap<String, Array<String>>()
if (dailyList?.isNotEmpty() == true) {
dailyList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray().notNull { map[TASK_ORDER_DAILYS] }
dailyList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_DAILYS] }
}
if (habitList?.isNotEmpty() == true) {
habitList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray().notNull { map[TASK_ORDER_HABITS] }
habitList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_HABITS] }
}
if (rewardList?.isNotEmpty() == true) {
rewardList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray().notNull { map[TASK_ORDER_REWARDS] }
rewardList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_REWARDS] }
}
if (todoList?.isNotEmpty() == true) {
todoList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray().notNull { map[TASK_ORDER_TODOS] }
todoList?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()?.let { map[TASK_ORDER_TODOS] }
}
return map

View file

@ -17,7 +17,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ChallengeRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.Group
@ -348,10 +347,10 @@ class ChallengeFormActivity : BaseActivity() {
val taskList = ArrayList<Task>()
addHabit.notNull { taskList.add(it) }
addDaily.notNull { taskList.add(it) }
addTodo.notNull { taskList.add(it) }
addReward.notNull { taskList.add(it) }
addHabit?.let { taskList.add(it) }
addDaily?.let { taskList.add(it) }
addTodo?.let { taskList.add(it) }
addReward?.let { taskList.add(it) }
challengeTasks.setTasks(taskList)
compositeSubscription.add(challengeTasks.addItemObservable().subscribe(Consumer { t ->
@ -374,7 +373,7 @@ class ChallengeFormActivity : BaseActivity() {
}
private fun fillControlsByChallenge() {
challengeId.notNull {
challengeId?.let {
challengeRepository.getChallenge(it).subscribe(Consumer { challenge ->
groupID = challenge.groupId
editMode = true

View file

@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.UserStatComputer
@ -181,8 +180,8 @@ class FullProfileActivity : BaseActivity() {
blurbTextView.text = MarkdownParser.parseMarkdown(blurbText)
}
user.authentication?.timestamps?.createdAt.notNull { joinedView.text = dateFormatter.format(it) }
user.authentication?.timestamps?.lastLoggedIn.notNull { lastLoginView.text = dateFormatter.format(it) }
user.authentication?.timestamps?.createdAt?.let { joinedView.text = dateFormatter.format(it) }
user.authentication?.timestamps?.lastLoggedIn?.let { lastLoginView.text = dateFormatter.format(it) }
totalCheckinsView.text = user.loginIncentives.toString()
usernameText.text = user.username
@ -354,7 +353,7 @@ class FullProfileActivity : BaseActivity() {
}
}
user.stats.notNull { addNormalAddBuffAttributes(it) }
user.stats?.let { addNormalAddBuffAttributes(it) }
}
private fun gotCostume(obj: List<Equipment>) {

View file

@ -13,7 +13,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.ConsumablePurchasedEvent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.ABTest
@ -154,7 +153,7 @@ class GemPurchaseActivity : BaseActivity(), InAppMessageListener {
}
private fun setupCheckout() {
HabiticaBaseApplication.getInstance(this)?.billing.notNull {
HabiticaBaseApplication.getInstance(this)?.billing?.let {
activityCheckout = Checkout.forActivity(this, it)
activityCheckout?.start()
}

View file

@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.events.ConsumablePurchasedEvent
import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -87,7 +86,7 @@ class GiftIAPActivity: BaseActivity() {
giftedUsername = intent.getStringExtra("username")
subscriptionButton?.setOnClickListener {
selectedSubscriptionSku?.notNull { sku -> purchaseSubscription(sku) }
selectedSubscriptionSku?.let { sku -> purchaseSubscription(sku) }
}
giftOneGetOneContainer?.isVisible = appConfigManager.enableGiftOneGetOne()
@ -174,7 +173,7 @@ class GiftIAPActivity: BaseActivity() {
}
private fun setupCheckout() {
HabiticaBaseApplication.getInstance(this)?.billing.notNull {
HabiticaBaseApplication.getInstance(this)?.billing?.let {
activityCheckout = Checkout.forActivity(this, it)
activityCheckout?.start()
}
@ -236,7 +235,7 @@ class GiftIAPActivity: BaseActivity() {
if (giftedUserID?.isNotEmpty() != true) {
return
}
activityCheckout.notNull {
activityCheckout?.let {
HabiticaPurchaseVerifier.pendingGifts[sku.id.code] = giftedUserID
billingRequests?.purchase(ProductTypes.IN_APP, sku.id.code, null, it.purchaseFlow)
}

View file

@ -7,7 +7,6 @@ import android.view.View
import android.widget.*
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.ui.helpers.*
import com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
@ -39,7 +38,7 @@ class GroupFormActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent.extras.notNull {bundle ->
intent.extras?.let {bundle ->
groupID = bundle.getString("groupID")
groupType = bundle.getString("groupType")
groupName = bundle.getString("name")

View file

@ -15,7 +15,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.runDelayed
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
@ -164,7 +163,7 @@ class GroupInviteActivity : BaseActivity() {
val inviteData = HashMap<String, Any>()
val invites = ArrayList<String>()
userIdToInvite.notNull {
userIdToInvite?.let {
invites.add(it)
}
inviteData["uuids"] = invites

View file

@ -11,7 +11,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.modules.AppModule
@ -67,7 +66,7 @@ class HabitButtonWidgetActivity : BaseActivity() {
adapter = SkillTasksRecyclerViewAdapter(null, true)
adapter?.getTaskSelectionEvents()?.subscribe(Consumer { task -> taskSelected(task.id) },
RxErrorHandler.handleEmptyError())
.notNull { compositeSubscription.add(it) }
?.let { compositeSubscription.add(it) }
recyclerView.adapter = adapter
compositeSubscription.add(taskRepository.getTasks(Task.TYPE_HABIT, userId).firstElement().subscribe(Consumer { adapter?.updateData(it) }, RxErrorHandler.handleEmptyError()))

View file

@ -40,7 +40,6 @@ import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.KeyHelper
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -372,7 +371,7 @@ class LoginActivity : BaseActivity(), Consumer<UserAuthResponse> {
.subscribe(this@LoginActivity, Consumer { throwable ->
throwable.printStackTrace()
hideProgress()
throwable.cause.notNull {
throwable.cause?.let {
if (GoogleAuthException::class.java.isAssignableFrom(it.javaClass)) {
handleGoogleAuthException(throwable.cause as GoogleAuthException)
}

View file

@ -37,12 +37,12 @@ import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.api.MaintenanceApiService
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.*
import com.habitrpg.android.habitica.events.*
import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand
import com.habitrpg.android.habitica.events.ShareEvent
import com.habitrpg.android.habitica.events.ShowCheckinDialog
import com.habitrpg.android.habitica.events.ShowConnectionProblemEvent
import com.habitrpg.android.habitica.events.ShowSnackbarEvent
import com.habitrpg.android.habitica.events.commands.FeedCommand
import com.habitrpg.android.habitica.events.commands.HatchingCommand
import com.habitrpg.android.habitica.extensions.DateUtils
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.*
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager
@ -233,7 +233,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
// Set the drawer toggle as the DrawerListener
drawerToggle.notNull { drawerLayout.addDrawerListener(it) }
drawerToggle?.let { drawerLayout.addDrawerListener(it) }
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeButtonEnabled(true)
@ -358,8 +358,8 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
if (user != null) {
val preferences = user?.preferences
preferences?.language.notNull { apiClient.setLanguageCode(it) }
preferences?.sound.notNull { soundManager.soundTheme = it }
preferences?.language?.let { apiClient.setLanguageCode(it) }
preferences?.sound?.let { soundManager.soundTheme = it }
displayDeathDialogIfNeeded()
YesterdailyDialog.showDialogIfNeeded(this, user?.id, userRepository, taskRepository)
@ -422,55 +422,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
super.onDestroy()
}
@Subscribe
fun openMysteryItem(event: OpenMysteryItemEvent) {
compositeSubscription.add(inventoryRepository.openMysteryItem(user)
.flatMap { userRepository.retrieveUser(false) }
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
@Subscribe
fun onEvent(tutorialEvent: DisplayTutorialEvent) {
if (tutorialEvent.tutorialText != null) {
this.displayTutorialStep(tutorialEvent.step, tutorialEvent.tutorialText, tutorialEvent.canBeDeferred)
} else {
this.displayTutorialStep(tutorialEvent.step, tutorialEvent.tutorialTexts, tutorialEvent.canBeDeferred)
}
}
@Subscribe
fun onEvent(event: HatchingCommand) {
if (event.usingEgg == null || event.usingHatchingPotion == null) {
return
}
compositeSubscription.add(this.inventoryRepository.hatchPet(event.usingEgg, event.usingHatchingPotion) {
val petWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout
val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? SimpleDraweeView
DataBindingUtils.loadImage(petImageView, "Pet-" + event.usingEgg.key + "-" + event.usingHatchingPotion.key)
val potionName = event.usingHatchingPotion.text
val eggName = event.usingEgg.text
val dialog = HabiticaAlertDialog(this@MainActivity)
dialog.setTitle(getString(R.string.hatched_pet_title, potionName, eggName))
dialog.setAdditionalContentView(petWrapper)
dialog.addButton(R.string.onwards, true) { hatchingDialog, _ -> hatchingDialog.dismiss() }
dialog.addButton(R.string.share, false) { hatchingDialog, _ ->
val event1 = ShareEvent()
event1.sharedMessage = getString(R.string.share_hatched, potionName, eggName) + " https://habitica.com/social/hatch-pet"
val petImageSideLength = 140
val sharedImage = Bitmap.createBitmap(petImageSideLength, petImageSideLength, Bitmap.Config.ARGB_8888)
val canvas = Canvas(sharedImage)
canvas.drawColor(ContextCompat.getColor(this, R.color.brand_300))
petImageView?.drawable?.setBounds(0, 0, petImageSideLength, petImageSideLength)
petImageView?.drawable?.draw(canvas)
event1.shareImage = sharedImage
EventBus.getDefault().post(event1)
hatchingDialog.dismiss()
}
dialog.show()
}.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
@Subscribe
fun onEvent(event: FeedCommand) {
if (event.usingFood == null || event.usingPet == null) {
@ -537,7 +488,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
hpBarView?.setIcon(HabiticaIconsHelper.imageOfHeartLightBg())
val dialogAvatarView = customView.findViewById<View>(R.id.avatarView) as? AvatarView
user.notNull { dialogAvatarView?.setAvatar(it) }
user?.let { dialogAvatarView?.setAvatar(it) }
}
this.faintDialog = HabiticaAlertDialog(this)
@ -545,7 +496,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
faintDialog?.setAdditionalContentView(customView)
faintDialog?.addButton(R.string.faint_button, true) { _, _ ->
faintDialog = null
user.notNull {
user?.let {
userRepository.revive(it).subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}
}
@ -578,7 +529,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
}
private fun displayTutorialStep(step: TutorialStep, text: String, canBeDeferred: Boolean) {
fun displayTutorialStep(step: TutorialStep, text: String, canBeDeferred: Boolean) {
removeActiveTutorialView()
val view = TutorialView(this, step, this)
this.activeTutorialView = view
@ -594,7 +545,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
AmplitudeManager.sendEvent("tutorial", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData)
}
private fun displayTutorialStep(step: TutorialStep, texts: List<String>, canBeDeferred: Boolean) {
fun displayTutorialStep(step: TutorialStep, texts: List<String>, canBeDeferred: Boolean) {
removeActiveTutorialView()
val view = TutorialView(this, step, this)
this.activeTutorialView = view
@ -654,11 +605,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_using)))
}
@Subscribe
fun onEvent(event: ChecklistCheckedCommand) {
compositeSubscription.add(taskRepository.scoreChecklistItem(event.task.id ?: "", event.item.id ?: "").subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
private fun checkMaintenance() {
compositeSubscription.add(this.maintenanceService.maintenanceStatus
.subscribeOn(Schedulers.io())
@ -755,7 +701,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
companion object {
const val SELECT_CLASS_RESULT = 11
const val GEM_PURCHASE_REQUEST = 111
const val NOTIFICATION_CLICK = 222

View file

@ -5,17 +5,17 @@ import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.core.content.ContextCompat
import androidx.viewpager.widget.ViewPager
import androidx.appcompat.content.res.AppCompatResources
import androidx.preference.PreferenceManager
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.Button
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.preference.PreferenceManager
import androidx.viewpager.widget.ViewPager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.components.UserComponent
@ -23,9 +23,6 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.commands.EquipCommand
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
@ -38,7 +35,6 @@ import com.viewpagerindicator.IconPageIndicator
import com.viewpagerindicator.IconPagerAdapter
import io.reactivex.BackpressureStrategy
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.Subscribe
import java.util.*
import javax.inject.Inject
@ -125,18 +121,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
indicator.setViewPager(pager)
}
@Subscribe
fun onEvent(event: UpdateUserCommand) {
compositeSubscription.add(this.userRepository.updateUser(user, event.updateData)
.subscribe(Consumer<User> { this.onUserReceived(it) }, RxErrorHandler.handleEmptyError()))
}
@Subscribe
fun onEvent(event: EquipCommand) {
compositeSubscription.add(this.inventoryRepository.equip(user, event.type, event.key)
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
private fun nextClicked() {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
sharedPreferences.edit {
@ -148,7 +132,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
}
val newTasks = this.taskSetupFragment?.createSampleTasks()
this.completedSetup = true
newTasks.notNull {
newTasks?.let {
this.taskRepository.createTasks(it).subscribe(Consumer { onUserReceived(user) }, RxErrorHandler.handleEmptyError())
}
} else if (pager.currentItem == 0) {

View file

@ -8,7 +8,6 @@ import android.widget.*
import androidx.core.content.ContextCompat
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.inventory.CustomizationSet
@ -181,7 +180,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
return@addButton
}
customization.notNull {
customization?.let {
unlockCustomizationEvents.onNext(it)
}
}
@ -196,7 +195,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
return
}
customization.notNull {
customization?.let {
selectCustomizationEvents.onNext(it)
}
}
@ -247,7 +246,7 @@ class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerVi
.filter { !it.isUsable && it.customizationSet != null && it.customizationSet == set?.identifier }
.forEach { set?.customizations?.add(it) }
}
set.notNull {
set?.let {
unlockSetEvents.onNext(it)
}
}

View file

@ -8,7 +8,6 @@ import android.widget.Button
import android.widget.TextView
import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.FAQArticle
import com.habitrpg.android.habitica.ui.activities.MainActivity
@ -87,7 +86,7 @@ class FAQOverviewRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Ada
}
override fun onClick(v: View) {
article.notNull {
article?.let {
MainNavigationController.navigate(FAQOverviewFragmentDirections.openFAQDetail(it.position))
}
}

View file

@ -5,7 +5,6 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaEmojiTextView
@ -38,7 +37,7 @@ class SkillTasksRecyclerViewAdapter(data: OrderedRealmCollection<Task>?, autoUpd
}
override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
data.notNull {
data?.let {
holder.bindHolder(it[position])
}
}
@ -74,7 +73,7 @@ class SkillTasksRecyclerViewAdapter(data: OrderedRealmCollection<Task>?, autoUpd
override fun onClick(v: View) {
if (v == itemView) {
task.notNull {
task?.let {
taskSelectionEvents.onNext(it)
}
}

View file

@ -3,24 +3,27 @@ package com.habitrpg.android.habitica.ui.adapter
import android.content.Context
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.UseSkillCommand
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import org.greenrobot.eventbus.EventBus
import io.reactivex.BackpressureStrategy
import io.reactivex.subjects.PublishSubject
class SkillsRecyclerViewAdapter : RecyclerView.Adapter<SkillsRecyclerViewAdapter.SkillViewHolder>() {
private val useSkillSubject = PublishSubject.create<Skill>()
val useSkillEvents = useSkillSubject.toFlowable(BackpressureStrategy.DROP)
var mana: Double = 0.toDouble()
set(value) {
field = value
@ -33,7 +36,6 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter<SkillsRecyclerViewAdapter
this.notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SkillViewHolder {
return SkillViewHolder(parent.inflate(R.layout.skill_list_item))
}
@ -92,10 +94,7 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter<SkillsRecyclerViewAdapter
}
override fun onClick(v: View) {
val event = UseSkillCommand()
event.skill = this.skill
EventBus.getDefault().post(event)
skill?.let { useSkillSubject.onNext(it) }
}
}
}

View file

@ -11,7 +11,6 @@ import android.widget.FrameLayout
import android.widget.TextView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
@ -34,7 +33,7 @@ class EquipmentRecyclerViewAdapter(data: OrderedRealmCollection<Equipment>?, aut
}
override fun onBindViewHolder(holder: GearViewHolder, position: Int) {
data.notNull {
data?.let {
holder.bind(it[position])
}
}

View file

@ -8,11 +8,8 @@ import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.OpenMysteryItemEvent
import com.habitrpg.android.habitica.events.commands.FeedCommand
import com.habitrpg.android.habitica.events.commands.HatchingCommand
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.inventory.*
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedPet
@ -49,6 +46,9 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection<OwnedItem>?, autoUpdate:
private val sellItemEvents = PublishSubject.create<OwnedItem>()
private val questInvitationEvents = PublishSubject.create<QuestContent>()
private val openMysteryItemEvents = PublishSubject.create<Item>()
private val startHatchingSubject = PublishSubject.create<Item>()
private val hatchPetSubject = PublishSubject.create<Pair<HatchingPotion, Egg>>()
fun getSellItemFlowable(): Flowable<OwnedItem> {
return sellItemEvents.toFlowable(BackpressureStrategy.DROP)
@ -57,13 +57,19 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection<OwnedItem>?, autoUpdate:
fun getQuestInvitationFlowable(): Flowable<QuestContent> {
return questInvitationEvents.toFlowable(BackpressureStrategy.DROP)
}
fun getOpenMysteryItemFlowable(): Flowable<Item> {
return openMysteryItemEvents.toFlowable(BackpressureStrategy.DROP)
}
val startHatchingEvents = startHatchingSubject.toFlowable(BackpressureStrategy.DROP)
val hatchPetEvents = hatchPetSubject.toFlowable(BackpressureStrategy.DROP)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
return ItemViewHolder(parent.inflate(R.layout.item_item))
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
data.notNull {
data?.let {
val ownedItem = it[position]
holder.bind(ownedItem, items?.get(ownedItem.key))
}
@ -162,29 +168,21 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection<OwnedItem>?, autoUpdate:
}
}
menu.setSelectionRunnable { index ->
item.notNull { selectedItem ->
item?.let { selectedItem ->
if (!(selectedItem is QuestContent || selectedItem is SpecialItem) && index == 0) {
ownedItem?.let { selectedOwnedItem -> sellItemEvents.onNext(selectedOwnedItem) }
return@notNull
return@let
}
when (selectedItem) {
is Egg -> {
val event = HatchingCommand()
event.usingEgg = selectedItem
EventBus.getDefault().post(event)
}
is Egg -> item?.let { startHatchingSubject.onNext(it) }
is Food -> {
val event = FeedCommand()
event.usingFood = selectedItem
EventBus.getDefault().post(event)
}
is HatchingPotion -> {
val event = HatchingCommand()
event.usingHatchingPotion = selectedItem
EventBus.getDefault().post(event)
}
is HatchingPotion -> item?.let { startHatchingSubject.onNext(it) }
is QuestContent -> questInvitationEvents.onNext(selectedItem)
is SpecialItem -> EventBus.getDefault().post(OpenMysteryItemEvent())
is SpecialItem -> openMysteryItemEvents.onNext(selectedItem)
}
}
}
@ -193,16 +191,13 @@ class ItemRecyclerAdapter(data: OrderedRealmCollection<OwnedItem>?, autoUpdate:
if (!this.canHatch) {
return
}
if (item is Egg) {
val event = HatchingCommand()
event.usingEgg = item as Egg
event.usingHatchingPotion = hatchingItem as HatchingPotion?
EventBus.getDefault().post(event)
} else if (item is HatchingPotion) {
val event = HatchingCommand()
event.usingHatchingPotion = item as HatchingPotion
event.usingEgg = hatchingItem as Egg?
EventBus.getDefault().post(event)
val firstItem = item ?: return
if (firstItem is Egg) {
val potion = hatchingItem as HatchingPotion
hatchPetSubject.onNext(Pair(potion, firstItem))
} else if (firstItem is HatchingPotion) {
val egg = hatchingItem as Egg
hatchPetSubject.onNext(Pair(firstItem, egg))
}
fragment?.dismiss()
} else if (isFeeding) {

View file

@ -9,7 +9,6 @@ import android.widget.TextView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.user.OwnedMount
@ -44,7 +43,7 @@ class MountDetailRecyclerAdapter(data: OrderedRealmCollection<Mount>?, autoUpdat
}
override fun onBindViewHolder(holder: MountViewHolder, position: Int) {
data.notNull { holder.bind(it[position], ownedMounts?.get(it[position].key)) }
data?.let { holder.bind(it[position], ownedMounts?.get(it[position].key)) }
}
fun setOwnedMounts(ownedMounts: Map<String, OwnedMount>) {
@ -96,7 +95,7 @@ class MountDetailRecyclerAdapter(data: OrderedRealmCollection<Mount>?, autoUpdat
val menu = BottomSheetMenu(itemView.context)
menu.addMenuItem(BottomSheetMenuItem(resources.getString(R.string.use_animal)))
menu.setSelectionRunnable {
animal.notNull { equipEvents.onNext(it.key) }
animal?.let { equipEvents.onNext(it.key) }
}
menu.show()
}

View file

@ -10,7 +10,6 @@ import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.FeedCommand
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
@ -49,7 +48,7 @@ class PetDetailRecyclerAdapter(data: OrderedRealmCollection<Pet>?, autoUpdate: B
}
override fun onBindViewHolder(holder: PetViewHolder, position: Int) {
data.notNull {
data?.let {
holder.bind(it[position], ownedPets?.get(it[position]?.key ?: ""))
}
}
@ -138,7 +137,7 @@ class PetDetailRecyclerAdapter(data: OrderedRealmCollection<Pet>?, autoUpdate: B
}
menu.setSelectionRunnable { index ->
if (index == 0) {
animal.notNull {
animal?.let {
equipEvents.onNext(it.key)
}
} else if (index == 1) {

View file

@ -10,7 +10,6 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.shops.Shop
@ -109,13 +108,13 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<an
val obj = getItem(position)
if (obj != null) {
when (obj.javaClass) {
Shop::class.java -> (obj as? Shop).notNull { (holder as? ShopHeaderViewHolder)?.bind(it, shopSpriteSuffix) }
Shop::class.java -> (obj as? Shop)?.let { (holder as? ShopHeaderViewHolder)?.bind(it, shopSpriteSuffix) }
ShopCategory::class.java -> {
val category = obj as? ShopCategory
val sectionHolder = holder as? SectionViewHolder ?: return
sectionHolder.bind(category?.text ?: "")
if (gearCategories.contains(category)) {
context.notNull {context ->
context?.let {context ->
val adapter = HabiticaClassArrayAdapter(context, R.layout.class_spinner_dropdown_item, gearCategories.map { it.identifier })
sectionHolder.spinnerAdapter = adapter
sectionHolder.selectedItem = gearCategories.indexOf(category)

View file

@ -8,7 +8,6 @@ import android.view.ViewGroup
import android.widget.TextView
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Animal
@ -50,7 +49,7 @@ class StableRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<
if (obj.javaClass == String::class.java) {
(holder as? SectionViewHolder)?.bind(obj as? String ?: "")
} else {
(obj as? Animal).notNull { (holder as? StableViewHolder)?.bind(it) }
(obj as? Animal)?.let { (holder as? StableViewHolder)?.bind(it) }
}
}

View file

@ -2,22 +2,19 @@ package com.habitrpg.android.habitica.ui.adapter.setup
import android.content.Context
import android.graphics.PorterDuff
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.EquipCommand
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.SetupCustomization
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.helpers.bindView
import org.greenrobot.eventbus.EventBus
import java.util.*
import io.reactivex.BackpressureStrategy
import io.reactivex.subjects.PublishSubject
internal class CustomizationSetupAdapter : RecyclerView.Adapter<CustomizationSetupAdapter.CustomizationViewHolder>() {
@ -25,6 +22,11 @@ internal class CustomizationSetupAdapter : RecyclerView.Adapter<CustomizationSet
var user: User? = null
private var customizationList: List<SetupCustomization> = emptyList()
private val equipGearEventSubject = PublishSubject.create<String>()
val equipGearEvents = equipGearEventSubject.toFlowable(BackpressureStrategy.DROP)
private val updateUserEventsSubject = PublishSubject.create<HashMap<String, Any>>()
val updateUserEvents = updateUserEventsSubject.toFlowable(BackpressureStrategy.DROP)
fun setCustomizationList(newCustomizationList: List<SetupCustomization>) {
this.customizationList = newCustomizationList
this.notifyDataSetChanged()
@ -121,25 +123,19 @@ internal class CustomizationSetupAdapter : RecyclerView.Adapter<CustomizationSet
}
override fun onClick(v: View) {
customization.notNull { selectedCustomization ->
customization?.let { selectedCustomization ->
if (selectedCustomization.path == "glasses") {
val command = EquipCommand()
if (selectedCustomization.key.isEmpty()) {
command.key = user?.items?.gear?.equipped?.eyeWear
val key = if (selectedCustomization.key.isEmpty()) {
user?.items?.gear?.equipped?.eyeWear
} else {
command.key = selectedCustomization.key
selectedCustomization.key
}
command.type = "equipped"
EventBus.getDefault().post(command)
key?.let { equipGearEventSubject.onNext(it) }
} else {
val command = UpdateUserCommand()
val updateData = HashMap<String, Any>()
val updatePath = "preferences." + selectedCustomization.path
updateData[updatePath] = selectedCustomization.key
command.updateData = updateData
EventBus.getDefault().post(command)
updateUserEventsSubject.onNext(updateData)
}
}

View file

@ -11,7 +11,6 @@ import android.view.ViewGroup
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.ui.helpers.bindView
import java.util.*
@ -61,7 +60,7 @@ class TaskSetupAdapter : RecyclerView.Adapter<TaskSetupAdapter.TaskViewHolder>()
this.taskGroup = taskGroup
this.isChecked = isChecked
taskGroup.notNull {
taskGroup?.let {
textView.text = it[0]
}
if (this.isChecked == true) {

View file

@ -8,7 +8,6 @@ import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.ChallengeMembership
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeFilterOptions
@ -33,11 +32,11 @@ class ChallengesListViewAdapter(data: OrderedRealmCollection<Challenge>?, autoUp
}
override fun onBindViewHolder(holder: ChallengeViewHolder, position: Int) {
data?.get(position).notNull { challenge ->
data?.get(position)?.let { challenge ->
holder.bind(challenge, challengeMemberships?.first { challenge.id == it.challengeID } != null)
holder.itemView.setOnClickListener {
if (challenge.isManaged) {
challenge.id.notNull {
challenge.id?.let {
openChallengeFragmentEvents.onNext(it)
}
}
@ -75,7 +74,7 @@ class ChallengesListViewAdapter(data: OrderedRealmCollection<Challenge>?, autoUp
}
}
query.notNull {
query?.let {
this.updateData(it.findAll())
}
}

View file

@ -15,7 +15,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.user.User
@ -64,7 +63,7 @@ class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUp
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
data.notNull {
data?.let {
if (it[position].isSystemMessage) {
(holder as? SystemChatMessageViewHolder)?.bind(it[position])
} else {
@ -134,27 +133,27 @@ class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUp
itemView.setOnClickListener {
expandMessage()
}
tvLikes.setOnClickListener { chatMessage.notNull { likeMessageEvents.onNext(it) } }
tvLikes.setOnClickListener { chatMessage?.let { likeMessageEvents.onNext(it) } }
messageText.setOnClickListener { expandMessage() }
messageText.movementMethod = LinkMovementMethod.getInstance()
userLabel.setOnClickListener { chatMessage?.uuid.notNull {userLabelClickEvents.onNext(it) } }
avatarView.setOnClickListener { chatMessage?.uuid.notNull {userLabelClickEvents.onNext(it) } }
userLabel.setOnClickListener { chatMessage?.uuid?.let {userLabelClickEvents.onNext(it) } }
avatarView.setOnClickListener { chatMessage?.uuid?.let {userLabelClickEvents.onNext(it) } }
replyButton.setOnClickListener {
if (chatMessage?.username != null) {
chatMessage?.username.notNull { replyMessageEvents.onNext(it) }
chatMessage?.username?.let { replyMessageEvents.onNext(it) }
} else {
chatMessage?.user.notNull { replyMessageEvents.onNext(it) }
chatMessage?.user?.let { replyMessageEvents.onNext(it) }
}
}
replyButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReplyIcon()),
null, null, null)
copyButton.setOnClickListener { chatMessage.notNull { copyMessageEvents.onNext(it) } }
copyButton.setOnClickListener { chatMessage?.let { copyMessageEvents.onNext(it) } }
copyButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatCopyIcon()),
null, null, null)
reportButton.setOnClickListener { chatMessage.notNull { flagMessageEvents.onNext(it) } }
reportButton.setOnClickListener { chatMessage?.let { flagMessageEvents.onNext(it) } }
reportButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatReportIcon()),
null, null, null)
deleteButton.setOnClickListener { chatMessage.notNull { deleteMessageEvents.onNext(it) } }
deleteButton.setOnClickListener { chatMessage?.let { deleteMessageEvents.onNext(it) } }
deleteButton.setCompoundDrawablesWithIntrinsicBounds(BitmapDrawable(res, HabiticaIconsHelper.imageOfChatDeleteIcon()),
null, null, null)
}
@ -211,7 +210,7 @@ class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUp
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
if (dpWidth > 350) {
avatarView.visibility = View.VISIBLE
msg.userStyles.notNull {
msg.userStyles?.let {
avatarView.setAvatar(it)
}
} else {

View file

@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui.adapter.social
import android.view.ViewGroup
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.ui.viewHolders.GroupMemberViewHolder.GroupMemberViewHolder
import io.reactivex.BackpressureStrategy
@ -23,7 +22,7 @@ class PartyMemberRecyclerViewAdapter(data: OrderedRealmCollection<Member>?, auto
}
override fun onBindViewHolder(holder: GroupMemberViewHolder, position: Int) {
data.notNull {
data?.let {
holder.bind(it[position], leaderID)
holder.onClickEvent = {
userClickedEvents.onNext(it[position].id ?: "")

View file

@ -10,7 +10,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Group
@ -65,7 +64,7 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection<Group>?, auto
}
override fun onBindViewHolder(holder: GuildViewHolder, position: Int) {
data.notNull {
data?.let {
val guild = it[position]
val isInGroup = isInGroup(guild)
holder.bind(guild, isInGroup)
@ -94,7 +93,7 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection<Group>?, auto
}
override fun publishResults(constraint: CharSequence, results: FilterResults) {
unfilteredData.notNull {
unfilteredData?.let {
if (constraint.isNotEmpty()) {
updateData(it.where()
.contains("name", constraint.toString(), Case.INSENSITIVE)

View file

@ -7,7 +7,6 @@ import android.widget.Button
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.ui.adapter.tasks.SortableTasksRecyclerViewAdapter
@ -67,10 +66,10 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay
TYPE_HABIT -> HabitViewHolder(getContentView(parent, R.layout.habit_item_card), { _, _ -> }) { task ->
taskOpenEventsSubject.onNext(task)
}
TYPE_DAILY -> DailyViewHolder(getContentView(parent, R.layout.daily_item_card), { _, _ -> }) { task ->
TYPE_DAILY -> DailyViewHolder(getContentView(parent, R.layout.daily_item_card), { _, _ -> }, { _, _ -> }) { task ->
taskOpenEventsSubject.onNext(task)
}
TYPE_TODO -> TodoViewHolder(getContentView(parent, R.layout.todo_item_card), { _, _ -> }) { task ->
TYPE_TODO -> TodoViewHolder(getContentView(parent, R.layout.todo_item_card), { _, _ -> }, { _, _ -> }) { task ->
taskOpenEventsSubject.onNext(task)
}
TYPE_REWARD -> RewardViewHolder(getContentView(parent, R.layout.reward_item_card), { _, _ -> }) { task ->
@ -114,7 +113,7 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay
init {
addBtn.isClickable = true
addBtn.setOnClickListener { newTask.notNull { callback.onNext(it) } }
addBtn.setOnClickListener { newTask?.let { callback.onNext(it) } }
}
override fun bind(newTask: Task, position: Int) {

View file

@ -6,7 +6,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.ui.helpers.bindView
import java.util.*
@ -22,7 +21,7 @@ class ChallengesFilterRecyclerViewAdapter(entries: Collection<Group>) : Recycler
for (h in holderList) {
if (h.checkbox.isChecked) {
h.group.notNull {
h.group?.let {
result.add(it)
}
}

View file

@ -8,7 +8,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.tasks.Task
@ -35,7 +34,7 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(var t
this.setHasStableIds(true)
this.context = newContext.applicationContext
this.filteredContent = ArrayList()
HabiticaBaseApplication.userComponent.notNull { injectThis(it) }
HabiticaBaseApplication.userComponent?.let { injectThis(it) }
if (loadFromDatabase()) {
this.loadContent(true)
@ -88,7 +87,7 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(var t
filteredContent = content
} else {
filteredContent = ArrayList()
content.notNull {
content?.let {
filteredContent?.addAll(this.taskFilterHelper.filter(it))
}
}

View file

@ -11,7 +11,8 @@ import io.realm.OrderedRealmCollection
class DailiesRecyclerViewHolder(data: OrderedRealmCollection<Task>?, autoUpdate: Boolean, layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<DailyViewHolder>(data, autoUpdate, layoutResource, taskFilterHelper) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyViewHolder =
DailyViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }) {
DailyViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) },
{ task, item -> checklistItemScoreSubject.onNext(Pair(task, item))}) {
task -> taskOpenEventsSubject.onNext(task)
}
}

View file

@ -5,6 +5,7 @@ import android.view.View
import android.view.ViewGroup
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.ui.viewHolders.tasks.BaseTaskViewHolder
import io.reactivex.BackpressureStrategy
@ -50,11 +51,13 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(privat
private set
private var errorButtonEventsSubject = PublishSubject.create<String>()
override val errorButtonEvents = errorButtonEventsSubject.toFlowable(BackpressureStrategy.DROP)
override val errorButtonEvents: Flowable<String> = errorButtonEventsSubject.toFlowable(BackpressureStrategy.DROP)
protected var taskScoreEventsSubject = PublishSubject.create<Pair<Task, TaskDirection>>()
override val taskScoreEvents: Flowable<Pair<Task, TaskDirection>> = taskScoreEventsSubject.toFlowable(BackpressureStrategy.LATEST)
override val taskScoreEvents: Flowable<Pair<Task, TaskDirection>> = taskScoreEventsSubject.toFlowable(BackpressureStrategy.DROP)
protected var checklistItemScoreSubject = PublishSubject.create<Pair<Task, ChecklistItem>>()
override val checklistItemScoreEvents: Flowable<Pair<Task, ChecklistItem>> = checklistItemScoreSubject.toFlowable(BackpressureStrategy.DROP)
protected var taskOpenEventsSubject = PublishSubject.create<Task>()
override val taskOpenEvents: Flowable<Task> = taskOpenEventsSubject.toFlowable(BackpressureStrategy.LATEST)
override val taskOpenEvents: Flowable<Task> = taskOpenEventsSubject.toFlowable(BackpressureStrategy.DROP)
private val isDataValid: Boolean
get() = data?.isValid ?: false
@ -78,7 +81,6 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(privat
override fun onDetachedFromRecyclerView(recyclerView: androidx.recyclerview.widget.RecyclerView) {
super.onDetachedFromRecyclerView(recyclerView)
if (hasAutoUpdates && isDataValid) {
removeListener(data)
}
}
@ -89,18 +91,18 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(privat
fun getItem(index: Int): Task? = if (isDataValid) data?.get(index) else null
override fun updateData(data: OrderedRealmCollection<Task>?) {
override fun updateData(tasks: OrderedRealmCollection<Task>?) {
if (hasAutoUpdates) {
if (isDataValid) {
removeListener(this.data)
removeListener(tasks)
}
if (data != null) {
addListener(data)
if (tasks != null) {
addListener(tasks)
}
}
this.data = data
this.data = tasks
notifyDataSetChanged()
}

View file

@ -8,6 +8,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.viewHolders.ShopItemViewHolder
@ -24,6 +25,8 @@ class RewardsRecyclerViewAdapter(private var customRewards: OrderedRealmCollecti
override val errorButtonEvents = errorButtonEventsSubject.toFlowable(BackpressureStrategy.DROP)
private var taskScoreEventsSubject = PublishSubject.create<Pair<Task, TaskDirection>>()
override val taskScoreEvents: Flowable<Pair<Task, TaskDirection>> = taskScoreEventsSubject.toFlowable(BackpressureStrategy.LATEST)
protected var checklistItemScoreSubject = PublishSubject.create<Pair<Task, ChecklistItem>>()
override val checklistItemScoreEvents: Flowable<Pair<Task, ChecklistItem>> = checklistItemScoreSubject.toFlowable(BackpressureStrategy.DROP)
protected var taskOpenEventsSubject = PublishSubject.create<Task>()
override val taskOpenEvents: Flowable<Task> = taskOpenEventsSubject.toFlowable(BackpressureStrategy.LATEST)

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.adapter.tasks
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import io.reactivex.Flowable
import io.realm.OrderedRealmCollection
@ -22,5 +23,6 @@ interface TaskRecyclerViewAdapter {
fun updateUnfilteredData(data: OrderedRealmCollection<Task>?)
val taskScoreEvents: Flowable<Pair<Task, TaskDirection>>
val checklistItemScoreEvents: Flowable<Pair<Task, ChecklistItem>>
val taskOpenEvents: Flowable<Task>
}

View file

@ -11,7 +11,8 @@ import io.realm.OrderedRealmCollection
class TodosRecyclerViewAdapter(data: OrderedRealmCollection<Task>?, autoUpdate: Boolean, layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<TodoViewHolder>(data, autoUpdate, layoutResource, taskFilterHelper) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder =
TodoViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }) {
TodoViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) },
{ task, item -> checklistItemScoreSubject.onNext(Pair(task, item))}) {
task -> taskOpenEventsSubject.onNext(task)
}

View file

@ -16,7 +16,6 @@ import androidx.core.net.toUri
import com.google.firebase.analytics.FirebaseAnalytics
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.AppTestingLevel
import com.habitrpg.android.habitica.modules.AppModule
@ -66,14 +65,14 @@ class AboutFragment : BaseMainFragment() {
versionInfo.setOnClickListener {
versionNumberTappedCount += 1
when (versionNumberTappedCount) {
1 -> context.notNull { context ->
1 -> context?.let { context ->
Toast.makeText(context, "Oh! You tapped me!", Toast.LENGTH_SHORT).show()
}
in 5..7 -> context.notNull { context ->
in 5..7 -> context?.let { context ->
Toast.makeText(context, "Only ${8 - versionNumberTappedCount} taps left!", Toast.LENGTH_SHORT).show()
}
8 -> {
context.notNull { context ->
context?.let { context ->
Toast.makeText(context, "You were blessed with cats!", Toast.LENGTH_SHORT).show()
}
doTheThing()
@ -162,7 +161,7 @@ class AboutFragment : BaseMainFragment() {
context?.let { FirebaseAnalytics.getInstance(it).logEvent("found_easter_egg", null) }
DataBindingUtils.loadImage("Pet-Sabretooth-Base") {bitmap ->
activity?.runOnUiThread {
activity.notNull {
activity?.let {
ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)
@ -174,7 +173,7 @@ class AboutFragment : BaseMainFragment() {
}
DataBindingUtils.loadImage("Pet-Sabretooth-Golden") {bitmap ->
activity?.runOnUiThread {
activity.notNull {
activity?.let {
ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)
@ -186,7 +185,7 @@ class AboutFragment : BaseMainFragment() {
}
DataBindingUtils.loadImage("Pet-Sabretooth-Red") {bitmap ->
activity?.runOnUiThread {
activity.notNull {
activity?.let {
ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)

View file

@ -8,9 +8,8 @@ import androidx.fragment.app.DialogFragment
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.events.DisplayTutorialEvent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.activities.MainActivity
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.Consumer
@ -41,7 +40,7 @@ abstract class BaseFragment : DialogFragment() {
}
override fun onCreate(savedInstanceState: Bundle?) {
HabiticaBaseApplication.userComponent.notNull {
HabiticaBaseApplication.userComponent?.let {
injectFragment(it)
}
this.showsDialog = false
@ -76,15 +75,12 @@ abstract class BaseFragment : DialogFragment() {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { step ->
if (step != null && step.isValid && step.isManaged && step.shouldDisplay()) {
val event = DisplayTutorialEvent()
event.step = step
val mainActivity = activity as? MainActivity ?: return@Consumer
if (tutorialText != null) {
event.tutorialText = tutorialText
mainActivity.displayTutorialStep(step, tutorialText ?: "", tutorialCanBeDeferred)
} else {
event.tutorialTexts = tutorialTexts
mainActivity.displayTutorialStep(step, tutorialTexts, tutorialCanBeDeferred)
}
event.canBeDeferred = tutorialCanBeDeferred
EventBus.getDefault().post(event)
}
}, RxErrorHandler.handleEmptyError()))
}
@ -100,7 +96,7 @@ abstract class BaseFragment : DialogFragment() {
}
super.onDestroyView()
context.notNull {
context?.let {
val refWatcher = HabiticaBaseApplication.getInstance(it)?.refWatcher
refWatcher?.watch(this)
}

View file

@ -9,7 +9,6 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
@ -111,7 +110,7 @@ class GemsPurchaseFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
}
fun purchaseGems(sku: String) {
listener?.activityCheckout.notNull {
listener?.activityCheckout?.let {
billingRequests?.purchase(ProductTypes.IN_APP, sku, null, it.purchaseFlow)
}
}

View file

@ -17,7 +17,6 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.getThemeColor
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Quest
@ -82,7 +81,7 @@ class NavigationDrawerFragment : DialogFragment() {
val questContent = this.questContent
if (quest == null || questContent == null || !quest.active) {
questMenuView.visibility = View.GONE
context.notNull {
context?.let {
adapter.tintColor = it.getThemeColor(R.attr.colorPrimary)
adapter.backgroundTintColor = it.getThemeColor(R.attr.colorPrimaryOffset)
}
@ -150,7 +149,7 @@ class NavigationDrawerFragment : DialogFragment() {
// Indicate that this fragment would like to influence the set of actions in the action bar.
setHasOptionsMenu(true)
context?.notNull {recyclerView.setPadding(0, 0, 0, NavbarUtils.getNavbarHeight(it)) }
context?.let {recyclerView.setPadding(0, 0, 0, NavbarUtils.getNavbarHeight(it)) }
recyclerView.clipToPadding = false
}
@ -253,7 +252,7 @@ class NavigationDrawerFragment : DialogFragment() {
private fun initializeMenuItems() {
val items = ArrayList<HabiticaDrawerItem>()
context.notNull {context ->
context?.let {context ->
items.add(HabiticaDrawerItem(R.id.tasksFragment, SIDEBAR_TASKS, context.getString(R.string.sidebar_tasks)))
items.add(HabiticaDrawerItem(R.id.skillsFragment, SIDEBAR_SKILLS, context.getString(R.string.sidebar_skills)))
items.add(HabiticaDrawerItem(R.id.statsFragment, SIDEBAR_STATS, context.getString(R.string.sidebar_stats)))
@ -391,7 +390,7 @@ class NavigationDrawerFragment : DialogFragment() {
}
private fun setNotificationsSeen(allSeen: Boolean) {
context.notNull {
context?.let {
val colorId = if (allSeen) R.color.gray_200 else R.color.brand_400
val bg = notificationsBadge.background as? GradientDrawable

View file

@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.UserStatComputer
@ -77,7 +76,7 @@ class StatsFragment: BaseMainFragment() {
leftSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesLeft())
rightSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesRight())
context.notNull {
context?.let {
val color = ContextCompat.getColor(it, R.color.brand_200)
distributeEvenlyHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
distributeClassHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
@ -128,7 +127,7 @@ class StatsFragment: BaseMainFragment() {
}
private fun showBulkAllocateDialog() {
context.notNull { context ->
context?.let { context ->
val dialog = BulkAllocateStatsDialog(context, HabiticaBaseApplication.userComponent)
dialog.show()
}
@ -175,7 +174,7 @@ class StatsFragment: BaseMainFragment() {
intelligenceStatsView.canDistributePoints = canDistributePoints
constitutionStatsView.canDistributePoints = canDistributePoints
perceptionStatsView.canDistributePoints = canDistributePoints
context.notNull { context ->
context?.let { context ->
if (canDistributePoints) {
val points = user.stats?.points ?: 0
numberOfPointsTextView.text = getString(R.string.points_to_allocate, points)
@ -231,7 +230,7 @@ class StatsFragment: BaseMainFragment() {
val outfit = currentUser.items?.gear?.equipped
val outfitList = ArrayList<String>()
outfit.notNull { thisOutfit ->
outfit?.let { thisOutfit ->
outfitList.add(thisOutfit.armor)
outfitList.add(thisOutfit.back)
outfitList.add(thisOutfit.body)

View file

@ -13,7 +13,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.UserSubscribedEvent
import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseTypes
@ -222,13 +221,13 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
}
private fun purchaseSubscription() {
selectedSubscriptionSku?.id?.code.notNull { code ->
selectedSubscriptionSku?.id?.code?.let { code ->
billingRequests?.isPurchased(ProductTypes.SUBSCRIPTION, code, object : RequestListener<Boolean> {
override fun onSuccess(aBoolean: Boolean) {
if (!aBoolean) {
// no current product exist
val checkout = listener?.activityCheckout
checkout.notNull {
checkout?.let {
billingRequests?.purchase(ProductTypes.SUBSCRIPTION, code, null, it.purchaseFlow)
}
}
@ -262,7 +261,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
if (isSubscribed) {
this.subscriptionDetailsView?.visibility = View.VISIBLE
plan.notNull { this.subscriptionDetailsView?.setPlan(it) }
plan?.let { this.subscriptionDetailsView?.setPlan(it) }
this.subscribeBenefitsTitle?.setText(R.string.subscribe_prompt_thanks)
this.subscriptionOptions?.visibility = View.GONE
} else {
@ -283,7 +282,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
private fun showGiftSubscriptionDialog() {
val chooseRecipientDialogView = this.activity?.layoutInflater?.inflate(R.layout.dialog_choose_message_recipient, null)
this.activity.notNull { thisActivity ->
this.activity?.let { thisActivity ->
val alert = HabiticaAlertDialog(thisActivity)
alert.setTitle(getString(R.string.gift_title))
alert.addButton(getString(R.string.action_continue), true) { _, _ ->

View file

@ -10,7 +10,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.FAQRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
@ -36,7 +35,7 @@ class FAQDetailFragment : BaseMainFragment() {
resetViews()
arguments.notNull {
arguments?.let {
val args = FAQDetailFragmentArgs.fromBundle(it)
compositeSubscription.add(faqRepository.getArticle(args.position).subscribe(Consumer { faq ->
this.questionTextView?.text = faq.question

View file

@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.FAQRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.FAQOverviewRecyclerAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
@ -38,10 +37,10 @@ class FAQOverviewFragment : BaseMainFragment() {
resetViews()
adapter = FAQOverviewRecyclerAdapter()
adapter?.getResetWalkthroughEvents()?.subscribe(Consumer { this.userRepository.resetTutorial(user) }, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
adapter?.getResetWalkthroughEvents()?.subscribe(Consumer { this.userRepository.resetTutorial(user) }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) }
adapter?.activity = activity
recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity)
activity.notNull { recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(it, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL)) }
activity?.let { recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(it, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL)) }
recyclerView?.adapter = adapter
recyclerView?.itemAnimator = SafeDefaultItemAnimator()
this.loadArticles()

View file

@ -8,7 +8,6 @@ import androidx.recyclerview.widget.GridLayoutManager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.CustomizationRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Customization
@ -73,7 +72,7 @@ class AvatarCustomizationFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = AvatarCustomizationFragmentArgs.fromBundle(it)
type = args.type
if (args.category.isNotEmpty()) {
@ -126,7 +125,7 @@ class AvatarCustomizationFragment : BaseMainFragment() {
private fun setGridSpanCount(width: Int) {
var itemWidth = 0F
context?.resources?.notNull {
context?.resources?.let {
itemWidth = if (this.type != null && this.type == "background") {
context?.resources?.getDimension(R.dimen.avatar_width)
} else {

View file

@ -9,7 +9,6 @@ import android.view.ViewGroup
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.user.Items
@ -49,7 +48,7 @@ class EquipmentDetailFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = EquipmentDetailFragmentArgs.fromBundle(it)
type = args.type
isCostume = args.isCostume

View file

@ -1,16 +1,23 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.items
import android.graphics.Bitmap
import android.graphics.Canvas
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.Button
import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.facebook.drawee.view.SimpleDraweeView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.ShareEvent
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.*
@ -18,17 +25,18 @@ import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.RecyclerViewEmptySupport
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import com.habitrpg.android.habitica.ui.helpers.*
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.EventBus
import javax.inject.Inject
class ItemRecyclerFragment : BaseFragment() {
@Inject
lateinit var inventoryRepository: InventoryRepository
@Inject
lateinit var userRepository: UserRepository
val recyclerView: RecyclerViewEmptySupport? by bindView(R.id.recyclerView)
val emptyView: View? by bindView(R.id.emptyView)
val emptyTextView: TextView? by bindView(R.id.empty_text_view)
@ -93,7 +101,7 @@ class ItemRecyclerFragment : BaseFragment() {
}
recyclerView?.adapter = adapter
adapter?.notNull { adapter ->
adapter?.let { adapter ->
compositeSubscription.add(adapter.getSellItemFlowable()
.flatMap { item -> inventoryRepository.sellItem(user, item) }
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
@ -101,9 +109,15 @@ class ItemRecyclerFragment : BaseFragment() {
compositeSubscription.add(adapter.getQuestInvitationFlowable()
.flatMap { quest -> inventoryRepository.inviteToQuest(quest) }
.subscribe(Consumer { MainNavigationController.navigate(R.id.partyFragment) }, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(adapter.getOpenMysteryItemFlowable()
.flatMap { inventoryRepository.openMysteryItem(user) }
.flatMap { userRepository.retrieveUser(false) }
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(adapter.startHatchingEvents.subscribeWithErrorHandler(Consumer { showHatchingDialog(it) }))
compositeSubscription.add(adapter.hatchPetEvents.subscribeWithErrorHandler(Consumer { hatchPet(it.first, it.second) }))
}
}
activity.notNull {
activity?.let {
recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(it, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL))
}
recyclerView?.itemAnimator = SafeDefaultItemAnimator()
@ -146,6 +160,20 @@ class ItemRecyclerFragment : BaseFragment() {
this.loadItems()
}
private fun showHatchingDialog(item: Item) {
val fragment = ItemRecyclerFragment()
if (item is Egg) {
fragment.itemType = "hatchingPotions"
fragment.hatchingItem = item
} else {
fragment.itemType = "eggs"
fragment.hatchingItem = item
}
fragment.isHatching = true
fragment.isFeeding = false
fragment.show(fragmentManager, "hatchingDialog")
}
override fun onResume() {
if ((this.isHatching || this.isFeeding) && dialog?.window != null) {
val params = dialog?.window?.attributes
@ -162,6 +190,35 @@ class ItemRecyclerFragment : BaseFragment() {
outState.putString(ITEM_TYPE_KEY, this.itemType)
}
private fun hatchPet(potion: HatchingPotion, egg: Egg) {
compositeSubscription.add(this.inventoryRepository.hatchPet(egg, potion) {
val petWrapper = View.inflate(context, R.layout.pet_imageview, null) as? FrameLayout
val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? SimpleDraweeView
DataBindingUtils.loadImage(petImageView, "Pet-" + egg.key + "-" + potion.key)
val potionName = potion.text
val eggName = egg.text
val dialog = context?.let { HabiticaAlertDialog(it) }
dialog?.setTitle(getString(R.string.hatched_pet_title, potionName, eggName))
dialog?.setAdditionalContentView(petWrapper)
dialog?.addButton(R.string.onwards, true) { hatchingDialog, _ -> hatchingDialog.dismiss() }
dialog?.addButton(R.string.share, false) { hatchingDialog, _ ->
val event1 = ShareEvent()
event1.sharedMessage = getString(R.string.share_hatched, potionName, eggName) + " https://habitica.com/social/hatch-pet"
val petImageSideLength = 140
val sharedImage = Bitmap.createBitmap(petImageSideLength, petImageSideLength, Bitmap.Config.ARGB_8888)
val canvas = Canvas(sharedImage)
context?.let { canvas.drawColor(ContextCompat.getColor(it, R.color.brand_300)) }
petImageView?.drawable?.setBounds(0, 0, petImageSideLength, petImageSideLength)
petImageView?.drawable?.draw(canvas)
event1.shareImage = sharedImage
EventBus.getDefault().post(event1)
hatchingDialog.dismiss()
}
dialog?.show()
}.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
private fun loadItems() {
val itemClass: Class<out Item> = when (itemType) {
"eggs" -> Egg::class.java

View file

@ -1,21 +1,17 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.items
import android.os.Bundle
import com.google.android.material.tabs.TabLayout
import androidx.fragment.app.FragmentPagerAdapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.FragmentPagerAdapter
import com.google.android.material.tabs.TabLayout
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.events.commands.HatchingCommand
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import org.greenrobot.eventbus.Subscribe
class ItemsFragment : BaseMainFragment() {
private val viewPager: androidx.viewpager.widget.ViewPager? by bindView(R.id.viewPager)
@ -92,23 +88,4 @@ class ItemsFragment : BaseMainFragment() {
tabLayout?.setupWithViewPager(viewPager)
tabLayout?.tabMode = TabLayout.MODE_SCROLLABLE
}
@Subscribe
fun showHatchingDialog(event: HatchingCommand) {
if (event.usingEgg == null || event.usingHatchingPotion == null) {
val fragment = ItemRecyclerFragment()
if (event.usingEgg != null) {
fragment.itemType = "hatchingPotions"
fragment.hatchingItem = event.usingEgg
} else {
fragment.itemType = "eggs"
fragment.hatchingItem = event.usingHatchingPotion
}
fragment.isHatching = true
fragment.isFeeding = false
fragment.show(fragmentManager!!, "hatchingDialog")
}
}
}

View file

@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.GearPurchasedEvent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.shops.Shop
@ -212,7 +211,7 @@ class ShopFragment : BaseFragment() {
private fun setGridSpanCount(width: Int) {
var spanCount = 0
context.notNull { context ->
context?.let { context ->
val itemWidth: Float = context.resources.getDimension(R.dimen.reward_width)
spanCount = (width / itemWidth).toInt()

View file

@ -8,7 +8,6 @@ import android.view.ViewGroup
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.ui.adapter.inventory.MountDetailRecyclerAdapter
@ -49,7 +48,7 @@ class MountDetailRecyclerFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = MountDetailRecyclerFragmentArgs.fromBundle(it)
animalGroup = args.group
animalType = args.type
@ -69,7 +68,7 @@ class MountDetailRecyclerFragment : BaseMainFragment() {
this.loadItems()
adapter?.getEquipFlowable()?.flatMap { key -> inventoryRepository.equip(user, "mount", key) }
?.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
?.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) }
}
if (savedInstanceState != null) {
@ -87,7 +86,7 @@ class MountDetailRecyclerFragment : BaseMainFragment() {
private fun setGridSpanCount(width: Int) {
var spanCount = 0
context?.resources.notNull { resources
context?.resources?.let { resources
val itemWidth: Float = resources.getDimension(R.dimen.pet_width)
spanCount = (width / itemWidth).toInt()

View file

@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.events.commands.FeedCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
@ -61,7 +60,7 @@ class PetDetailRecyclerFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = MountDetailRecyclerFragmentArgs.fromBundle(it)
animalGroup = args.group
animalType = args.type

View file

@ -9,7 +9,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Animal
import com.habitrpg.android.habitica.models.user.*
@ -75,7 +74,7 @@ class StableRecyclerFragment : BaseFragment() {
}
}
recyclerView?.layoutManager = layoutManager
activity.notNull {
activity?.let {
recyclerView?.addItemDecoration(MarginDecoration(it))
}

View file

@ -13,7 +13,10 @@ import com.google.android.material.textfield.TextInputLayout
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.extensions.*
import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.extensions.layoutInflater
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -97,7 +100,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
val oldPasswordEditText = view?.findViewById<EditText>(R.id.editText)
val passwordEditText = view?.findViewById<EditText>(R.id.passwordEditText)
val passwordRepeatEditText = view?.findViewById<EditText>(R.id.passwordRepeatEditText)
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.change_password)
dialog.addButton(R.string.change, true) { _, _ ->
@ -120,7 +123,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
emailEditText?.setText(user?.authentication?.localAuthentication?.email)
view?.findViewById<TextInputLayout>(R.id.input_layout)?.hint = context?.getString(R.string.email)
val passwordEditText = view?.findViewById<EditText>(R.id.passwordEditText)
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.change_email)
dialog.addButton(R.string.change, true) { _, _ ->
@ -142,7 +145,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
val loginNameEditText = view?.findViewById<EditText>(R.id.editText)
loginNameEditText?.setText(user?.authentication?.localAuthentication?.username)
view?.findViewById<TextInputLayout>(R.id.input_layout)?.hint = context?.getString(R.string.username)
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.change_username)
dialog.addButton(R.string.save, true) { _, _ ->
@ -169,7 +172,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
editText?.inputType = InputType.TYPE_CLASS_TEXT
}
view?.findViewById<TextInputLayout>(R.id.input_layout)?.hint = context?.getString(R.string.confirm_deletion)
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.delete_account)
dialog.setMessage(deleteMessage)
@ -189,7 +192,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
val emailEditText = view?.findViewById<EditText>(R.id.editText)
val passwordEditText = view?.findViewById<EditText>(R.id.passwordEditText)
val passwordRepeatEditText = view?.findViewById<EditText>(R.id.passwordRepeatEditText)
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.add_local_authentication)
dialog.addButton(R.string.save, true) { thisDialog, _ ->
@ -214,7 +217,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
@Suppress("DEPRECATION")
val dialog = ProgressDialog.show(context, context?.getString(R.string.deleting_account), null, true)
compositeSubscription.add(userRepository.deleteAccount(password).subscribe({ _ ->
context.notNull { HabiticaBaseApplication.logout(it) }
context?.let { HabiticaBaseApplication.logout(it) }
activity?.finish()
}) { throwable ->
dialog.dismiss()
@ -223,7 +226,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
}
private fun showAccountResetConfirmation() {
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.reset_account)
dialog.setMessage(R.string.reset_account_description)
@ -237,7 +240,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
}
private fun showConfirmUsernameDialog() {
context.notNull { context ->
context?.let { context ->
val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.confirm_username_title)
dialog.setMessage(R.string.confirm_username_description)
@ -260,9 +263,9 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() {
}
private fun showSubscriptionStatusDialog() {
context.notNull { context ->
context?.let { context ->
val view = SubscriptionDetailsView(context)
user?.purchased?.plan?.notNull {
user?.purchased?.plan?.let {
view.setPlan(it)
}
val dialog = HabiticaAlertDialog(context)

View file

@ -15,7 +15,6 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.*
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager
import com.habitrpg.android.habitica.models.ContentResult
@ -85,7 +84,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
override fun onPreferenceTreeClick(preference: Preference): Boolean {
when(preference.key) {
"logout" -> {
context.notNull { HabiticaBaseApplication.logout(it) }
context?.let { HabiticaBaseApplication.logout(it) }
activity?.finish()
}
"choose_class" -> {
@ -96,7 +95,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
intent.putExtras(bundle)
if (user?.flags?.classSelected == true && user?.preferences?.disableClasses == false) {
context.notNull { context ->
context?.let { context ->
val builder = AlertDialog.Builder(context)
.setMessage(getString(R.string.change_class_confirmation))
.setNegativeButton(getString(R.string.dialog_go_back)) { dialog, _ -> dialog.dismiss() }

View file

@ -6,7 +6,6 @@ import androidx.preference.EditTextPreference
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
import io.reactivex.Flowable
@ -83,7 +82,7 @@ class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.O
}
else -> null
}
observable?.subscribe(Consumer {}, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
observable?.subscribe(Consumer {}, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) }
}
}

View file

@ -2,9 +2,6 @@ package com.habitrpg.android.habitica.ui.fragments.setup
import android.os.Build
import android.os.Bundle
import com.google.android.material.tabs.TabLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
@ -12,12 +9,16 @@ import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.RelativeLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.tabs.TabLayout
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SetupCustomizationRepository
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.models.SetupCustomization
import com.habitrpg.android.habitica.models.user.User
@ -29,7 +30,7 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import com.habitrpg.android.habitica.ui.views.setup.AvatarCategoryView
import org.greenrobot.eventbus.EventBus
import io.reactivex.functions.Consumer
import java.util.*
import javax.inject.Inject
@ -37,6 +38,10 @@ class AvatarSetupFragment : BaseFragment() {
@Inject
lateinit var customizationRepository: SetupCustomizationRepository
@Inject
lateinit var userRepository: UserRepository
@Inject
lateinit var inventoryRepository: InventoryRepository
var activity: SetupActivity? = null
var width: Int = 0
@ -78,6 +83,8 @@ class AvatarSetupFragment : BaseFragment() {
this.adapter = CustomizationSetupAdapter()
this.adapter?.userSize = this.user?.preferences?.size ?: "slim"
adapter?.updateUserEvents?.flatMap { userRepository.updateUser(user, it) }?.subscribeWithErrorHandler(Consumer {})?.let { compositeSubscription.add(it) }
adapter?.equipGearEvents?.flatMap { inventoryRepository.equip(user, "equipped", it) }?.subscribeWithErrorHandler(Consumer {})?.let { compositeSubscription.add(it) }
this.adapter?.user = this.user
this.layoutManager = LinearLayoutManager(activity)
@ -147,7 +154,7 @@ class AvatarSetupFragment : BaseFragment() {
}
private fun updateAvatar() {
user.notNull {
user?.let {
avatarView?.setAvatar(it)
}
}
@ -158,8 +165,8 @@ class AvatarSetupFragment : BaseFragment() {
this.activeCategory = "body"
this.subCategoryTabs?.removeAllTabs()
this.subcategories = Arrays.asList("size", "shirt")
subCategoryTabs?.newTab()?.setText(R.string.avatar_size).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_shirt).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_size)?.let { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_shirt)?.let { this.subCategoryTabs?.addTab(it) }
loadCustomizations()
}
@ -168,7 +175,7 @@ class AvatarSetupFragment : BaseFragment() {
this.activeCategory = "skin"
this.subCategoryTabs?.removeAllTabs()
this.subcategories = listOf("color")
subCategoryTabs?.newTab()?.setText(R.string.avatar_skin_color).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_skin_color)?.let { this.subCategoryTabs?.addTab(it) }
loadCustomizations()
}
@ -177,9 +184,9 @@ class AvatarSetupFragment : BaseFragment() {
this.activeCategory = "hair"
this.subCategoryTabs?.removeAllTabs()
this.subcategories = Arrays.asList("bangs", "color", "ponytail")
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_bangs).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_color).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_ponytail).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_bangs)?.let { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_color)?.let { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_hair_ponytail)?.let { this.subCategoryTabs?.addTab(it) }
loadCustomizations()
}
@ -188,15 +195,14 @@ class AvatarSetupFragment : BaseFragment() {
this.activeCategory = "extras"
this.subCategoryTabs?.removeAllTabs()
this.subcategories = Arrays.asList("glasses", "flower", "wheelchair")
subCategoryTabs?.newTab()?.setText(R.string.avatar_glasses).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_flower).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_wheelchair).notNull { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_glasses)?.let { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_flower)?.let { this.subCategoryTabs?.addTab(it) }
subCategoryTabs?.newTab()?.setText(R.string.avatar_wheelchair)?.let { this.subCategoryTabs?.addTab(it) }
loadCustomizations()
}
private fun randomizeCharacter() {
val user = this.user ?: return
val command = UpdateUserCommand()
val updateData = HashMap<String, Any>()
updateData["preferences.size"] = chooseRandomKey(customizationRepository.getCustomizations("body", "size", user), false)
updateData["preferences.shirt"] = chooseRandomKey(customizationRepository.getCustomizations("body", "shirt", user), false)
@ -206,9 +212,7 @@ class AvatarSetupFragment : BaseFragment() {
updateData["preferences.hair.bangs"] = chooseRandomKey(customizationRepository.getCustomizations("hair", "bangs", user), false)
updateData["preferences.hair.flower"] = chooseRandomKey(customizationRepository.getCustomizations("extras", "flower", user), true)
updateData["preferences.chair"] = chooseRandomKey(customizationRepository.getCustomizations("extras", "wheelchair", user), true)
command.updateData = updateData
EventBus.getDefault().post(command)
compositeSubscription.add(userRepository.updateUser(user, updateData).subscribeWithErrorHandler(Consumer {}))
}
@Suppress("ReturnCount")

View file

@ -10,7 +10,6 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
@ -69,7 +68,7 @@ class IntroFragment : BaseFragment() {
this.descriptionTextView?.text = this.description
}
backgroundColor.notNull {
backgroundColor?.let {
this.containerView?.setBackgroundColor(it)
}
}

View file

@ -9,7 +9,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.models.tasks.Days
import com.habitrpg.android.habitica.models.tasks.Task
@ -79,7 +78,7 @@ class TaskSetupFragment : BaseFragment() {
}
private fun updateAvatar() {
user.notNull {
user?.let {
avatarView?.setAvatar(it)
}
}

View file

@ -5,14 +5,13 @@ import android.app.ProgressDialog
import android.content.Intent
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import androidx.core.content.ContextCompat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.events.commands.UseSkillCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.models.responses.SkillResponse
@ -29,7 +28,6 @@ import io.reactivex.Flowable
import io.reactivex.Observable
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.fragment_skills.*
import org.greenrobot.eventbus.Subscribe
class SkillsFragment : BaseMainFragment() {
@ -50,6 +48,7 @@ class SkillsFragment : BaseMainFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
adapter = SkillsRecyclerViewAdapter()
adapter?.useSkillEvents?.subscribeWithErrorHandler(Consumer { onSkillSelected(it) })?.let { compositeSubscription.add(it) }
checkUserLoadSkills()
this.tutorialStepIdentifier = "skills"
@ -76,9 +75,7 @@ class SkillsFragment : BaseMainFragment() {
if (user == null || adapter == null) {
return
}
adapter?.mana = this.user?.stats?.mp ?: 0.toDouble()
user?.let { user ->
Observable.concat(userRepository.getSkills(user).firstElement().toObservable().flatMap { Observable.fromIterable(it) }, userRepository.getSpecialItems(user).firstElement().toObservable().flatMap { Observable.fromIterable(it) })
.toList()
@ -86,10 +83,7 @@ class SkillsFragment : BaseMainFragment() {
}
}
@Subscribe
fun onEvent(command: UseSkillCommand) {
val skill = command.skill
private fun onSkillSelected(skill: Skill) {
when {
"special" == skill.habitClass -> {
selectedSkill = skill
@ -112,7 +106,7 @@ class SkillsFragment : BaseMainFragment() {
if ("special" == usedSkill?.habitClass) {
showSnackbar(activity.snackbarContainer, context?.getString(R.string.used_skill_without_mana, usedSkill.text), HabiticaSnackbar.SnackbarDisplayType.BLUE)
} else {
context.notNull {
context?.let {
showSnackbar(activity.snackbarContainer, null,
context?.getString(R.string.used_skill_without_mana, usedSkill?.text),
BitmapDrawable(resources, HabiticaIconsHelper.imageOfMagic()),

View file

@ -15,7 +15,6 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.MainNavDirections
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -73,7 +72,7 @@ class ChatFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
}
chatAdapter = ChatRecyclerViewAdapter(null, true, null, true)
chatAdapter.notNull {adapter ->
chatAdapter?.let {adapter ->
compositeSubscription.add(adapter.getUserLabelClickFlowable().subscribe(Consumer { userId ->
FullProfileActivity.open(userId)
}, RxErrorHandler.handleEmptyError()))

View file

@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -120,7 +119,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
}
chatAdapter = ChatRecyclerViewAdapter(null, true, user, true)
chatAdapter.notNull {adapter ->
chatAdapter?.let {adapter ->
compositeSubscription.add(adapter.getUserLabelClickFlowable().subscribe(Consumer { userId ->
FullProfileActivity.open(userId)
}, RxErrorHandler.handleEmptyError()))
@ -139,7 +138,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
recyclerView.adapter = chatAdapter
recyclerView.itemAnimator = SafeDefaultItemAnimator()
groupId.notNull { id ->
groupId?.let { id ->
socialRepository.getGroupChat(id).firstElement()
.subscribe(Consumer<RealmResults<ChatMessage>> { this.setChatMessages(it) }, RxErrorHandler.handleEmptyError())
}
@ -220,7 +219,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
if (isUserInitiated) {
refreshLayout.isRefreshing = true
}
groupId.notNull {id ->
groupId?.let {id ->
socialRepository.retrieveGroupChat(id)
.doOnEvent { _, _ -> refreshLayout?.isRefreshing = false }.subscribe(Consumer {
if (isScrolledToTop && recyclerView != null) {
@ -238,7 +237,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
private fun markMessagesAsSeen() {
if (!isTavern && groupId?.isNotEmpty() == true && gotNewMessages && navigatedOnceToFragment) {
gotNewMessages = false
groupId.notNull {id ->
groupId?.let {id ->
socialRepository.markMessagesSeen(id)
}
}
@ -289,7 +288,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
}
private fun sendChatMessage(chatText: String) {
groupId.notNull {id ->
groupId?.let {id ->
socialRepository.postGroupChat(id, chatText).subscribe({
recyclerView?.scrollToPosition(0)
}, { throwable ->

View file

@ -19,7 +19,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -116,7 +115,7 @@ class GroupInformationFragment : BaseFragment() {
startActivityForResult(intent, GroupFormActivity.GROUP_FORM_ACTIVITY)
}
context.notNull { context ->
context?.let { context ->
DataBindingUtils.loadImage("timeTravelersShop_background_fall") {bitmap ->
val aspectRatio = bitmap.width / bitmap.height.toFloat()
val height = context.resources.getDimension(R.dimen.shop_height).toInt()

View file

@ -11,7 +11,6 @@ import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -84,7 +83,7 @@ class InboxFragment : BaseMainFragment(), androidx.swiperefreshlayout.widget.Swi
assert(this.activity != null)
this.chooseRecipientDialogView = this.activity?.layoutInflater?.inflate(R.layout.dialog_choose_message_recipient, null)
this.activity.notNull { thisActivity ->
this.activity?.let { thisActivity ->
val alert = HabiticaAlertDialog(thisActivity)
alert.setTitle(getString(R.string.choose_recipient_title))
alert.addButton(getString(R.string.action_continue), true) { _, _ ->

View file

@ -12,9 +12,8 @@ import com.habitrpg.android.habitica.MainNavDirections
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
@ -56,7 +55,7 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout
super.onViewCreated(view, savedInstanceState)
swipeRefreshLayout?.setOnRefreshListener(this)
arguments.notNull {
arguments?.let {
val args = InboxMessageListFragmentArgs.fromBundle(it)
setReceivingUser(args.username, args.userID)
}
@ -67,7 +66,7 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout
chatAdapter = ChatRecyclerViewAdapter(null, true, user, false)
recyclerView.adapter = chatAdapter
recyclerView.itemAnimator = SafeDefaultItemAnimator()
chatAdapter.notNull { adapter ->
chatAdapter?.let { adapter ->
compositeSubscription.add(adapter.getUserLabelClickFlowable().subscribe(Consumer<String> {
FullProfileActivity.open(it)
}, RxErrorHandler.handleEmptyError()))
@ -121,7 +120,7 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout
}
private fun sendMessage(chatText: String) {
replyToUserUUID?.notNull {userID ->
replyToUserUUID?.let {userID ->
socialRepository.postPrivateMessage(userID, chatText)
.delay(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())

View file

@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter
@ -75,14 +74,14 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
val searchItem = menu.findItem(R.id.action_guild_search)
val guildSearchView = searchItem?.actionView as? SearchView
val theTextArea = guildSearchView?.findViewById<SearchView.SearchAutoComplete>(R.id.search_src_text)
context.notNull { theTextArea?.setHintTextColor(ContextCompat.getColor(it, R.color.white)) }
context?.let { theTextArea?.setHintTextColor(ContextCompat.getColor(it, R.color.white)) }
guildSearchView?.queryHint = getString(R.string.guild_search_hint)
guildSearchView?.setOnQueryTextListener(this)
}
override fun onQueryTextSubmit(s: String): Boolean {
viewAdapter.filter.filter(s)
activity.notNull {
activity?.let {
KeyboardUtil.dismissKeyboard(it)
}
return true

View file

@ -15,7 +15,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
@ -76,7 +75,7 @@ class QuestDetailFragment : BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = QuestDetailFragmentArgs.fromBundle(it)
partyId = args.partyID
questKey = args.questKey
@ -108,11 +107,11 @@ class QuestDetailFragment : BaseMainFragment() {
party = group
quest = group.quest
setQuestParticipants(group.quest?.participants)
socialRepository.getMember(quest?.leader).firstElement().subscribe(Consumer { member ->
compositeSubscription.add(socialRepository.getMember(quest?.leader).firstElement().subscribe(Consumer { member ->
if (context != null && questLeaderView != null && member != null) {
questLeaderView?.text = context?.getString(R.string.quest_leader_header, member.displayName)
}
}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()))
if (questLeaderResponseWrapper != null) {
if (showParticipatantButtons()) {
@ -174,7 +173,7 @@ class QuestDetailFragment : BaseMainFragment() {
textView?.text = participant.displayName
val statusTextView = participantView?.findViewById<View>(R.id.status_view) as? TextView
if (quest?.active == false) {
context.notNull {
context?.let {
when {
participant.participatesInQuest == null -> {
statusTextView?.setText(R.string.pending)
@ -219,14 +218,14 @@ class QuestDetailFragment : BaseMainFragment() {
}
private fun onQuestAccept() {
partyId.notNull { partyID ->
partyId?.let { partyID ->
socialRepository.acceptQuest(user, partyID).subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}
}
private fun onQuestReject() {
partyId.notNull { partyID ->
partyId?.let { partyID ->
socialRepository.rejectQuest(user, partyID).subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}
}
@ -253,7 +252,7 @@ class QuestDetailFragment : BaseMainFragment() {
val alert = HabiticaAlertDialog(it)
alert.setMessage(R.string.quest_cancel_message)
alert.addButton(R.string.yes, true) { _, _ ->
partyId.notNull { partyID ->
partyId?.let { partyID ->
@Suppress("DEPRECATION")
socialRepository.cancelQuest(partyID)
.subscribe(Consumer { getActivity()?.fragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError())
@ -268,7 +267,7 @@ class QuestDetailFragment : BaseMainFragment() {
val builder = AlertDialog.Builder(getActivity())
.setMessage(R.string.quest_abort_message)
.setPositiveButton(R.string.yes) { _, _ ->
partyId.notNull { partyID ->
partyId?.let { partyID ->
@Suppress("DEPRECATION")
socialRepository.abortQuest(partyID)
.subscribe(Consumer { getActivity()?.fragmentManager?.popBackStack() }, RxErrorHandler.handleEmptyError())

View file

@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
@ -100,7 +99,7 @@ class TavernDetailFragment : BaseFragment() {
compositeSubscription.add(socialRepository.retrieveGroup(Group.TAVERN_ID).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
user.notNull { questProgressView.configure(it) }
user?.let { questProgressView.configure(it) }
}
override fun onDestroy() {
@ -112,7 +111,7 @@ class TavernDetailFragment : BaseFragment() {
private fun bindButtons() {
innButton.setOnClickListener {
user?.notNull { user -> userRepository.sleep(user).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) }
user?.let { user -> userRepository.sleep(user).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) }
}
guidelinesButton.setOnClickListener {
MainNavigationController.navigate(R.id.guidelinesActivity)
@ -147,7 +146,7 @@ class TavernDetailFragment : BaseFragment() {
private fun addPlayerTiers() {
for (tier in PlayerTier.getTiers()) {
context.notNull {
context?.let {
val container = FrameLayout(it)
container.background = ContextCompat.getDrawable(it, R.drawable.layout_rounded_bg_gray_700)
val label = UsernameLabel(context, null)

View file

@ -18,7 +18,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ChallengeRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.social.Challenge
@ -29,9 +28,9 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.HabiticaEmojiTextView
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.social.UsernameLabel
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
@ -79,7 +78,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments.notNull {
arguments?.let {
val args = ChallengeDetailFragmentArgs.fromBundle(it)
challengeID = args.challengeID
}
@ -93,7 +92,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
FullProfileActivity.open(leaderID)
}
challengeID.notNull {id ->
challengeID?.let {id ->
compositeSubscription.add(challengeRepository.getChallenge(id)
.doOnNext {
set(it)
@ -145,7 +144,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
}, RxErrorHandler.handleEmptyError()))
}
joinButton?.setOnClickListener { challenge.notNull { challenge -> challengeRepository.joinChallenge(challenge).subscribe(Consumer {}, RxErrorHandler.handleEmptyError()) } }
joinButton?.setOnClickListener { challenge?.let { challenge -> challengeRepository.joinChallenge(challenge).subscribe(Consumer {}, RxErrorHandler.handleEmptyError()) } }
leaveButton?.setOnClickListener { showChallengeLeaveDialog() }
refresh()
@ -179,7 +178,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
}
private fun refresh() {
challengeID.notNull {id ->
challengeID?.let {id ->
challengeRepository.retrieveChallenge(id)
.flatMap { challengeRepository.retrieveChallengeTasks(id) }
.subscribe(Consumer { }, RxErrorHandler.handleEmptyError(), Action { })
@ -227,7 +226,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
entry?.findViewById<ImageView>(R.id.lock_icon_plus)?.setImageBitmap(HabiticaIconsHelper.imageOfLocked(Color.parseColor("#DFDEDF")))
entry?.findViewById<ImageView>(R.id.lock_icon_minus)?.setImageBitmap(HabiticaIconsHelper.imageOfLocked(Color.parseColor("#DFDEDF")))
context.notNull {
context?.let {
if (task.up == true) {
entry?.findViewById<ImageView>(R.id.lock_icon_plus)?.setImageBitmap(HabiticaIconsHelper.imageOfLocked(Color.parseColor("#B3FFFFFF")))
entry?.findViewById<View>(R.id.lock_icon_background_plus)?.setBackgroundColor(ContextCompat.getColor(it, task.mediumTaskColor))
@ -265,7 +264,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
val title = entry?.findViewById(R.id.daily_title) as? TextView?
title?.text = EmojiParser.parseEmojis(task.text)
entry?.findViewById<ImageView>(R.id.lock_icon)?.setImageBitmap(HabiticaIconsHelper.imageOfLocked(Color.parseColor("#949494")))
context.notNull {
context?.let {
entry?.findViewById<View>(R.id.lock_icon_background)?.setBackgroundColor(ContextCompat.getColor(it, task.mediumTaskColor))
val drawable = ContextCompat.getDrawable(it, R.drawable.circle_white)
drawable?.colorFilter = PorterDuffColorFilter(ContextCompat.getColor(it, task.extraLightTaskColor), PorterDuff.Mode.MULTIPLY)
@ -299,7 +298,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
val title = entry?.findViewById(R.id.todo_title) as? TextView
title?.text = EmojiParser.parseEmojis(task.text)
entry?.findViewById<ImageView>(R.id.lock_icon)?.setImageBitmap(HabiticaIconsHelper.imageOfLocked(Color.parseColor("#949494")))
context.notNull {
context?.let {
entry?.findViewById<View>(R.id.lock_icon_background)?.setBackgroundColor(ContextCompat.getColor(it, task.mediumTaskColor))
val drawable = ContextCompat.getDrawable(it, R.drawable.circle_white)
drawable?.colorFilter = PorterDuffColorFilter(ContextCompat.getColor(it, task.extraLightTaskColor), PorterDuff.Mode.MULTIPLY)
@ -351,13 +350,13 @@ class ChallengeDetailFragment: BaseMainFragment() {
}
private fun showChallengeLeaveDialog() {
context.notNull { context ->
context?.let { context ->
val alert = HabiticaAlertDialog(context)
alert.setTitle(this.getString(R.string.challenge_leave_title))
alert.setMessage(this.getString(R.string.challenge_leave_text, challenge?.name ?: ""))
alert.addButton(R.string.yes, true) { dialog, _ ->
dialog.dismiss()
challenge.notNull { challenge ->
challenge?.let { challenge ->
showRemoveTasksDialog(Consumer { keepTasks ->
challengeRepository.leaveChallenge(challenge, keepTasks).subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
})
@ -371,7 +370,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
}
private fun showRemoveTasksDialog(callback: Consumer<String>) {
context.notNull {
context?.let {
val alert = HabiticaAlertDialog(it)
alert.setTitle(this.getString(R.string.challenge_remove_tasks_title))
alert.setMessage(this.getString(R.string.challenge_remove_tasks_text))

View file

@ -10,7 +10,6 @@ import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.ChallengeRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Challenge
@ -76,7 +75,7 @@ class ChallengeListFragment : BaseFragment(), androidx.swiperefreshlayout.widget
challengeAdapter = ChallengesListViewAdapter(null, true, viewUserChallengesOnly, userId)
challengeAdapter?.getOpenDetailFragmentFlowable()?.subscribe(Consumer { openDetailFragment(it) }, RxErrorHandler.handleEmptyError())
.notNull { compositeSubscription.add(it) }
?.let { compositeSubscription.add(it) }
swipeRefreshLayout?.setOnRefreshListener(this)
@ -155,7 +154,7 @@ class ChallengeListFragment : BaseFragment(), androidx.swiperefreshlayout.widget
}
internal fun showFilterDialog() {
activity.notNull {
activity?.let {
ChallengeFilterDialogHolder.showDialog(it,
challenges ?: emptyList(),
filterOptions, object : Action1<ChallengeFilterOptions> {

View file

@ -14,7 +14,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.QuestContent
@ -229,19 +228,19 @@ class PartyDetailFragment : BaseFragment() {
}
private fun onPartyInviteAccepted() {
viewModel?.getUserData()?.value?.invitations?.party?.id.notNull {
viewModel?.getUserData()?.value?.invitations?.party?.id?.let {
viewModel?.joinGroup(it)
}
}
private fun onPartyInviteRejected() {
viewModel?.getUserData()?.value?.invitations?.party?.id.notNull {
viewModel?.getUserData()?.value?.invitations?.party?.id?.let {
viewModel?.rejectGroupInvite(it)
}
}
private fun questDetailButtonClicked() {
viewModel?.getGroupData()?.value.notNull { party ->
viewModel?.getGroupData()?.value?.let { party ->
MainNavigationController.navigate(PartyFragmentDirections.openQuestDetail(party.id, party.quest?.key ?: ""))
}
}

View file

@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter
@ -45,7 +44,7 @@ class PartyMemberListFragment : BaseFragment() {
recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context)
adapter = PartyMemberRecyclerViewAdapter(null, true)
adapter?.getUserClickedEvents()?.subscribe(Consumer { userId -> FullProfileActivity.open(userId) }, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
adapter?.getUserClickedEvents()?.subscribe(Consumer { userId -> FullProfileActivity.open(userId) }, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) }
recyclerView?.adapter = adapter
recyclerView?.itemAnimator = SafeDefaultItemAnimator()

View file

@ -2,14 +2,13 @@ package com.habitrpg.android.habitica.ui.fragments.tasks
import android.content.Context
import android.os.Bundle
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.User
@ -40,7 +39,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() {
}
view.post { setGridSpanCount(view.width) }
context.notNull {
context?.let {
recyclerView.setBackgroundColor(ContextCompat.getColor(it, R.color.white))
}
recyclerView.itemAnimator = SafeDefaultItemAnimator()

View file

@ -17,12 +17,12 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.SoundManager
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.responses.TaskScoringResult
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.modules.AppModule
@ -72,44 +72,16 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
private fun setInnerAdapter() {
val adapter: androidx.recyclerview.widget.RecyclerView.Adapter<*>? = when (this.classType) {
Task.TYPE_HABIT -> {
val adapter = HabitsRecyclerViewAdapter(null, true, R.layout.habit_item_card, taskFilterHelper)
compositeSubscription.add(adapter.taskScoreEvents
.doOnNext { soundManager.loadAndPlayAudio(if (it.second == TaskDirection.UP) SoundManager.SoundPlusHabit else SoundManager.SoundMinusHabit) }
.flatMap { taskRepository.taskChecked(user, it.first, it.second == TaskDirection.UP, false) { result -> (activity as? MainActivity)?.displayTaskScoringResponse(result)} }
.subscribeWithErrorHandler(Consumer {}))
adapter
HabitsRecyclerViewAdapter(null, true, R.layout.habit_item_card, taskFilterHelper)
}
Task.TYPE_DAILY -> {
val adapter = DailiesRecyclerViewHolder(null, true, R.layout.daily_item_card, taskFilterHelper)
compositeSubscription.add(adapter.taskScoreEvents
.doOnNext { soundManager.loadAndPlayAudio(SoundManager.SoundDaily) }
.flatMap { taskRepository.taskChecked(user, it.first, it.second == TaskDirection.UP, false){ result -> (activity as? MainActivity)?.displayTaskScoringResponse(result)} }
.subscribeWithErrorHandler(Consumer {}))
adapter
DailiesRecyclerViewHolder(null, true, R.layout.daily_item_card, taskFilterHelper)
}
Task.TYPE_TODO -> {
val adapter = TodosRecyclerViewAdapter(null, true, R.layout.todo_item_card, taskFilterHelper)
compositeSubscription.add(adapter.taskScoreEvents
.doOnNext { soundManager.loadAndPlayAudio(SoundManager.SoundTodo) }
.flatMap { taskRepository.taskChecked(user, it.first, it.second == TaskDirection.UP, false){ result -> (activity as? MainActivity)?.displayTaskScoringResponse(result)} }
.subscribeWithErrorHandler(Consumer {}))
adapter
TodosRecyclerViewAdapter(null, true, R.layout.todo_item_card, taskFilterHelper)
}
Task.TYPE_REWARD -> {
val adapter = RewardsRecyclerViewAdapter(null, R.layout.reward_item_card, user)
compositeSubscription.add(adapter.taskScoreEvents
.doOnNext { soundManager.loadAndPlayAudio(SoundManager.SoundTodo) }
.flatMap { taskRepository.taskChecked(user, it.first, it.second == TaskDirection.UP, false) { _ ->
(activity as? MainActivity)?.let { activity ->
HabiticaSnackbar.showSnackbar(activity.snackbarContainer, null, getString(R.string.notification_purchase_reward),
BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()),
ContextCompat.getColor(activity, R.color.yellow_10),
"-" + it.first.value.toInt(),
HabiticaSnackbar.SnackbarDisplayType.DROP)
}
} }
.subscribeWithErrorHandler(Consumer {}))
adapter
RewardsRecyclerViewAdapter(null, R.layout.reward_item_card, user)
}
else -> null
}
@ -121,13 +93,6 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
recyclerAdapter = adapter as? TaskRecyclerViewAdapter
recyclerView.adapter = adapter
recyclerAdapter?.errorButtonEvents?.subscribe(Consumer {
taskRepository.syncErroredTasks().subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
recyclerAdapter?.taskOpenEvents?.subscribeWithErrorHandler(Consumer {
openTaskForm(it)
})
if (this.classType != null) {
compositeSubscription.add(taskRepository.getTasks(this.classType ?: "", userID).firstElement().subscribe(Consumer {
this.recyclerAdapter?.updateUnfilteredData(it)
@ -136,6 +101,31 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
}
}
private fun handleTaskResult(result: TaskScoringResult, value: Int) {
if (classType == Task.TYPE_REWARD) {
(activity as? MainActivity)?.let { activity ->
HabiticaSnackbar.showSnackbar(activity.snackbarContainer, null, getString(R.string.notification_purchase_reward),
BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()),
ContextCompat.getColor(activity, R.color.yellow_10),
"-$value",
HabiticaSnackbar.SnackbarDisplayType.DROP)
}
} else {
(activity as? MainActivity)?.displayTaskScoringResponse(result)
}
}
private fun playSound(direction: TaskDirection) {
val soundName = when (classType) {
Task.TYPE_HABIT -> if (direction == TaskDirection.UP) SoundManager.SoundPlusHabit else SoundManager.SoundMinusHabit
Task.TYPE_DAILY -> SoundManager.SoundDaily
Task.TYPE_TODO -> SoundManager.SoundTodo
Task.TYPE_REWARD -> SoundManager.SoundReward
else -> null
}
soundName?.let { soundManager.loadAndPlayAudio(it) }
}
private fun allowReordering() {
val itemTouchHelper = mItemTouchCallback?.let { ItemTouchHelper(it) }
itemTouchHelper?.attachToRecyclerView(recyclerView)
@ -241,6 +231,23 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
if (recyclerView.adapter == null) {
this.setInnerAdapter()
}
if (this.classType != null) {
recyclerAdapter?.errorButtonEvents
recyclerAdapter?.errorButtonEvents?.subscribe(Consumer {
taskRepository.syncErroredTasks().subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError())?.let { compositeSubscription.add(it) }
recyclerAdapter?.taskOpenEvents?.subscribeWithErrorHandler(Consumer {
openTaskForm(it)
})?.let { compositeSubscription.add(it) }
recyclerAdapter?.taskScoreEvents
?.doOnNext { playSound(it.second) }
?.flatMap { taskRepository.taskChecked(user, it.first, it.second == TaskDirection.UP, false) { result ->
handleTaskResult(result, it.first.value.toInt())
}}?.subscribeWithErrorHandler(Consumer {})?.let { compositeSubscription.add(it) }
recyclerAdapter?.checklistItemScoreEvents
?.flatMap { taskRepository.scoreChecklistItem(it.first.id ?: "", it.second.id ?: "")
}?.subscribeWithErrorHandler(Consumer {})?.let { compositeSubscription.add(it) }
}
val bottomPadding = (recyclerView.paddingBottom + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60f, resources.displayMetrics)).toInt()
recyclerView.setPadding(0, 0, 0, bottomPadding)
@ -308,7 +315,7 @@ open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayou
}
}
fun openTaskForm(task: Task) {
private fun openTaskForm(task: Task) {
if (TasksFragment.displayingTaskForm) {
return
}

View file

@ -4,7 +4,6 @@ import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.AvatarView
@ -38,7 +37,7 @@ class GroupMemberViewHolder(itemView: View) : androidx.recyclerview.widget.Recyc
fun bind(user: Member, leaderID: String?) {
avatarView.setAvatar(user)
user.stats.notNull {
user.stats?.let {
healthBar.set(it.hp ?: 0.0, it.maxHealth?.toDouble() ?: 50.0)
healthTextView.text = "${it.hp?.toInt()} / ${it.maxHealth?.toInt()}"
experienceBar.set(it.exp ?: 0.0, it.toNextLevel?.toDouble() ?: 0.0)

View file

@ -4,7 +4,6 @@ import android.content.Context
import android.view.View
import android.widget.*
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.Task
@ -134,9 +133,9 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc:
notesTextView?.text = data.parsedNotes
} else {
notesTextView?.text = data.notes
data.notes.notNull {notes ->
data.notes?.let {notes ->
if (notes.isEmpty()) {
return@notNull
return@let
}
Single.just(notes)
.map { MarkdownParser.parseMarkdown(it) }

View file

@ -13,7 +13,6 @@ import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
@ -25,9 +24,8 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.EventBus
abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task) -> Unit)) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc), CompoundButton.OnCheckedChangeListener {
abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), var scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task) -> Unit)) : BaseTaskViewHolder(itemView, scoreTaskFunc, openTaskFunc), CompoundButton.OnCheckedChangeListener {
private val checkboxHolder: ViewGroup by bindView(itemView, R.id.checkBoxHolder)
internal val checkbox: CheckBox by bindView(itemView, R.id.checkBox)
@ -94,10 +92,7 @@ abstract class ChecklistedViewHolder(itemView: View, scoreTaskFunc: ((Task, Task
}
checkbox?.isChecked = item.completed
checkbox?.setOnCheckedChangeListener { _, _ ->
val event = ChecklistCheckedCommand()
event.task = task
event.item = item
EventBus.getDefault().post(event)
task?.let { scoreChecklistItemFunc(it, item) }
}
val checkboxHolder = itemView?.findViewById<View>(R.id.checkBoxHolder) as? ViewGroup
expandCheckboxTouchArea(checkboxHolder, checkbox)

View file

@ -4,10 +4,11 @@ import android.view.View
import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.ui.helpers.bindView
class DailyViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task) -> Unit)) : ChecklistedViewHolder(itemView, scoreTaskFunc, openTaskFunc) {
class DailyViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task) -> Unit)) : ChecklistedViewHolder(itemView, scoreTaskFunc, scoreChecklistItemFunc, openTaskFunc) {
private val streakTextView: TextView by bindView(itemView, R.id.streakTextView)

View file

@ -2,12 +2,13 @@ package com.habitrpg.android.habitica.ui.viewHolders.tasks
import android.view.View
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import java.text.DateFormat
class TodoViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), openTaskFunc: ((Task) -> Unit)) : ChecklistedViewHolder(itemView, scoreTaskFunc, openTaskFunc) {
class TodoViewHolder(itemView: View, scoreTaskFunc: ((Task, TaskDirection) -> Unit), scoreChecklistItemFunc: ((Task, ChecklistItem) -> Unit), openTaskFunc: ((Task) -> Unit)) : ChecklistedViewHolder(itemView, scoreTaskFunc, scoreChecklistItemFunc, openTaskFunc) {
private val dateFormatter: DateFormat = android.text.format.DateFormat.getDateFormat(context)

View file

@ -6,7 +6,6 @@ import androidx.lifecycle.ViewModel
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User
import io.reactivex.android.schedulers.AndroidSchedulers
@ -25,7 +24,7 @@ abstract class BaseViewModel: ViewModel() {
}
init {
HabiticaBaseApplication.userComponent.notNull { inject(it) }
HabiticaBaseApplication.userComponent?.let { inject(it) }
}
abstract fun inject(component: UserComponent)

View file

@ -5,8 +5,10 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.*
import com.habitrpg.android.habitica.extensions.Optional
import com.habitrpg.android.habitica.extensions.asOptional
import com.habitrpg.android.habitica.extensions.filterMapEmpty
import com.habitrpg.android.habitica.extensions.filterOptionalDoOnEmpty
import com.habitrpg.android.habitica.helpers.NotificationsManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.members.Member
@ -179,7 +181,7 @@ open class GroupViewModel : BaseViewModel() {
}
fun markMessagesSeen() {
groupIDSubject.value?.value.notNull {
groupIDSubject.value?.value?.let {
if (groupViewType != GroupViewType.TAVERN && it.isNotEmpty() && gotNewMessages) {
socialRepository.markMessagesSeen(it)
}
@ -195,7 +197,7 @@ open class GroupViewModel : BaseViewModel() {
}
fun postGroupChat(chatText: String, onComplete: () -> Unit?) {
groupIDSubject.value?.value.notNull {
groupIDSubject.value?.value?.let {
socialRepository.postGroupChat(it, chatText).subscribe(Consumer {
onComplete()
}, RxErrorHandler.handleEmptyError())

View file

@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.extensions.filterOptionalDoOnEmpty
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.members.Member
import io.reactivex.BackpressureStrategy
@ -44,13 +43,13 @@ class PartyViewModel: GroupViewModel() {
}
fun acceptQuest() {
groupIDSubject.value?.value.notNull {
groupIDSubject.value?.value?.let {
disposable.add(socialRepository.acceptQuest(null, it).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
}
fun rejectQuest() {
groupIDSubject.value?.value.notNull {
groupIDSubject.value?.value?.let {
disposable.add(socialRepository.rejectQuest(null, it).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
}

View file

@ -3,15 +3,14 @@ package com.habitrpg.android.habitica.ui.views
import android.content.Context
import android.content.SharedPreferences
import android.graphics.drawable.ColorDrawable
import androidx.core.content.ContextCompat
import android.util.AttributeSet
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.ui.helpers.bindView
class CollapsibleSectionView(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) {
@ -106,7 +105,7 @@ class CollapsibleSectionView(context: Context?, attrs: AttributeSet?) : LinearLa
init {
View.inflate(context, R.layout.view_collapsible_section, this)
context.notNull {
context?.let {
caretColor = ContextCompat.getColor(it, R.color.black_50_alpha)
}
orientation = VERTICAL