diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 1b60f59b5..1d98ee1b4 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -84,7 +84,7 @@ dependencies { // IAP Handling / Verification implementation 'org.solovyev.android:checkout:1.2.1' //Facebook - implementation('com.facebook.android:facebook-android-sdk:4.19.0') { + implementation('com.facebook.android:facebook-android-sdk:4.30.0') { transitive = true } implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java index 4a9ede3fc..e39af4d95 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java @@ -35,7 +35,7 @@ public interface InventoryRepository extends ContentRepository { Observable> getInAppRewards(); Observable> retrieveInAppRewards(); - Observable> getOwnedEquipment(String type); + Observable> getOwnedEquipment(@NotNull String type); Observable> getOwnedEquipment(); Observable> getOwnedItems(Class itemClass, User user); @@ -48,16 +48,16 @@ public interface InventoryRepository extends ContentRepository { void saveEquipment(Equipment equipment); Observable> getMounts(); - Observable> getMounts(String type, String group); + Observable> getMounts(@NotNull String type, @NotNull String group); Observable> getOwnedMounts(); - Observable> getOwnedMounts(String animalType, String animalGroup); + Observable> getOwnedMounts(@NotNull String animalType, @NotNull String animalGroup); Observable> getPets(); - Observable> getPets(String type, String group); + Observable> getPets(@NotNull String type, @NotNull String group); Observable> getOwnedPets(); - Observable> getOwnedPets(String type, String group); + Observable> getOwnedPets(@NotNull String type, @NotNull String group); void updateOwnedEquipment(User user); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt index 1c7274438..1b7c7b711 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NumberAbbreviator.kt @@ -17,7 +17,7 @@ object NumberAbbreviator { usedNumber /= 1000 } - val formatter = DecimalFormat("###.##" + abbreviationForCounter(context, counter)) + val formatter = DecimalFormat("###.##" + abbreviationForCounter(context, counter).replace(".", "")) formatter.roundingMode = RoundingMode.FLOOR return formatter.format(usedNumber) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index b44ccbb84..4e4a6149c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -71,15 +71,6 @@ class AvatarCustomizationFragment : BaseMainFragment() { } .subscribe(Action1 { }, RxErrorHandler.handleEmptyError())) - layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (adapter.getItemViewType(position) == 0) { - layoutManager.spanCount - } else { - 1 - } - } - } return view } @@ -89,7 +80,16 @@ class AvatarCustomizationFragment : BaseMainFragment() { setGridSpanCount(view.width) if (recyclerView.layoutManager == null) { - recyclerView.layoutManager = layoutManager + recyclerView.layoutManager = GridLayoutManager(activity, 2) + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (adapter.getItemViewType(position) == 0) { + layoutManager.spanCount + } else { + 1 + } + } + } } recyclerView.addItemDecoration(MarginDecoration(context)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt index 9565fb3fc..9e5df2fcc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt @@ -52,7 +52,7 @@ class EquipmentDetailFragment : BaseMainFragment() { recyclerView.addItemDecoration(DividerItemDecoration(getActivity()!!, DividerItemDecoration.VERTICAL)) recyclerView.itemAnimator = SafeDefaultItemAnimator() - inventoryRepository.getOwnedEquipment(type).first().subscribe(Action1> { this.adapter.updateData(it) }, RxErrorHandler.handleEmptyError()) + type?.let { inventoryRepository.getOwnedEquipment(it).first().subscribe(Action1> { this.adapter.updateData(it) }, RxErrorHandler.handleEmptyError()) } } override fun onDestroy() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java index 92abcf230..4e4a1038b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java @@ -109,7 +109,9 @@ public class MountDetailRecyclerFragment extends BaseMainFragment { } private void loadItems() { - inventoryRepository.getMounts(animalType, animalGroup).first().subscribe(adapter::updateData, RxErrorHandler.handleEmptyError()); + if (animalType != null && animalGroup != null) { + inventoryRepository.getMounts(animalType, animalGroup).first().subscribe(adapter::updateData, RxErrorHandler.handleEmptyError()); + } } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java deleted file mode 100644 index 5b62f1d31..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.habitrpg.android.habitica.ui.fragments.inventory.stable; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.components.AppComponent; -import com.habitrpg.android.habitica.data.InventoryRepository; -import com.habitrpg.android.habitica.events.commands.FeedCommand; -import com.habitrpg.android.habitica.helpers.RxErrorHandler; -import com.habitrpg.android.habitica.models.user.User; -import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter; -import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment; -import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; -import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator; - -import org.greenrobot.eventbus.Subscribe; - -import javax.inject.Inject; - -public class PetDetailRecyclerFragment extends BaseMainFragment { - private static final String ANIMAL_TYPE_KEY = "ANIMAL_TYPE_KEY"; - - @Inject - InventoryRepository inventoryRepository; - - public RecyclerView recyclerView; - public PetDetailRecyclerAdapter adapter; - public String animalType; - public String animalGroup; - GridLayoutManager layoutManager = null; - - private View view; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - this.usesTabLayout = false; - super.onCreateView(inflater, container, savedInstanceState); - if (view == null) { - view = inflater.inflate(R.layout.fragment_recyclerview, container, false); - - recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); - - layoutManager = new GridLayoutManager(getActivity(), 2); - recyclerView.setLayoutManager(layoutManager); - recyclerView.addItemDecoration(new MarginDecoration(getActivity())); - - adapter = (PetDetailRecyclerAdapter) recyclerView.getAdapter(); - if (adapter == null) { - adapter = new PetDetailRecyclerAdapter(null, true); - adapter.context = this.getActivity(); - adapter.itemType = this.animalType; - recyclerView.setAdapter(adapter); - recyclerView.setItemAnimator(new SafeDefaultItemAnimator()); - this.loadItems(); - - getCompositeSubscription().add(adapter.getEquipEvents() - .flatMap(key -> inventoryRepository.equip(user, "pet", key)) - .subscribe(items -> {}, RxErrorHandler.handleEmptyError())); - } - } - - if (savedInstanceState != null) { - this.animalType = savedInstanceState.getString(ANIMAL_TYPE_KEY, ""); - } - - return view; - } - - @Override - public void onDestroy() { - inventoryRepository.close(); - super.onDestroy(); - } - - @Override - public void injectFragment(AppComponent component) { - component.inject(this); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - final View finalView = view; - finalView.post(() -> setGridSpanCount(finalView.getWidth())); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(ANIMAL_TYPE_KEY, this.animalType); - } - - private void setGridSpanCount(int width) { - int spanCount = 0; - if (getContext() != null && getContext().getResources() != null) { - float itemWidth; - itemWidth = getContext().getResources().getDimension(R.dimen.pet_width); - - spanCount = (int) (width / itemWidth); - } - if (spanCount == 0) { - spanCount = 1; - } - layoutManager.setSpanCount(spanCount); - layoutManager.requestLayout(); - } - - private void loadItems() { - inventoryRepository.getPets(animalType, animalGroup).first().subscribe(adapter::updateData, RxErrorHandler.handleEmptyError()); - inventoryRepository.getOwnedMounts(animalType, animalGroup).subscribe(adapter::setOwnedMounts, RxErrorHandler.handleEmptyError()); - } - - @Subscribe - public void showFeedingDialog(FeedCommand event) { - if (event.usingPet == null || event.usingFood == null) { - ItemRecyclerFragment fragment = new ItemRecyclerFragment(); - fragment.feedingPet = event.usingPet; - fragment.isFeeding = true; - fragment.isHatching = false; - fragment.itemType = "food"; - fragment.itemTypeText = getString(R.string.food); - fragment.show(getFragmentManager(), "feedDialog"); - } - } - - @Override - public void updateUserData(User user) { - super.updateUserData(user); - } - - @Override - public String customTitle() { - if (!isAdded()) { - return ""; - } - return getString(R.string.pets); - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt new file mode 100644 index 000000000..0ed6df24a --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt @@ -0,0 +1,130 @@ +package com.habitrpg.android.habitica.ui.fragments.inventory.stable + +import android.os.Bundle +import android.support.v7.widget.GridLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.components.AppComponent +import com.habitrpg.android.habitica.data.InventoryRepository +import com.habitrpg.android.habitica.events.commands.FeedCommand +import com.habitrpg.android.habitica.helpers.RxErrorHandler +import com.habitrpg.android.habitica.models.inventory.Mount +import com.habitrpg.android.habitica.models.inventory.Pet +import com.habitrpg.android.habitica.models.user.Items +import com.habitrpg.android.habitica.models.user.User +import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter +import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment +import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment +import com.habitrpg.android.habitica.ui.helpers.MarginDecoration +import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator +import io.realm.RealmResults +import kotlinx.android.synthetic.main.fragment_recyclerview.* + +import org.greenrobot.eventbus.Subscribe +import rx.functions.Action1 + +import javax.inject.Inject + +class PetDetailRecyclerFragment : BaseMainFragment() { + + @Inject + lateinit var inventoryRepository: InventoryRepository + + var adapter: PetDetailRecyclerAdapter = PetDetailRecyclerAdapter(null, true) + var animalType: String = "" + var animalGroup: String = "" + internal var layoutManager: GridLayoutManager? = null + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + this.usesTabLayout = false + super.onCreateView(inflater, container, savedInstanceState) + if (savedInstanceState != null) { + this.animalType = savedInstanceState.getString(ANIMAL_TYPE_KEY, "") + } + + return inflater.inflate(R.layout.fragment_recyclerview, container, false) + } + + override fun onDestroy() { + inventoryRepository.close() + super.onDestroy() + } + + override fun injectFragment(component: AppComponent) { + component.inject(this) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val finalView = view + + layoutManager = GridLayoutManager(getActivity(), 2) + recyclerView.layoutManager = layoutManager + recyclerView.addItemDecoration(MarginDecoration(getActivity())) + + adapter.context = this.getActivity() + adapter.itemType = this.animalType + recyclerView.adapter = adapter + recyclerView.itemAnimator = SafeDefaultItemAnimator() + this.loadItems() + + compositeSubscription.add(adapter.equipEvents + .flatMap { key -> inventoryRepository.equip(user, "pet", key) } + .subscribe(Action1 { }, RxErrorHandler.handleEmptyError())) + + finalView.post { setGridSpanCount(finalView.width) } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putString(ANIMAL_TYPE_KEY, this.animalType) + } + + private fun setGridSpanCount(width: Int) { + var spanCount = 0 + if (context != null && context!!.resources != null) { + val itemWidth: Float = context!!.resources.getDimension(R.dimen.pet_width) + + spanCount = (width / itemWidth).toInt() + } + if (spanCount == 0) { + spanCount = 1 + } + layoutManager?.spanCount = spanCount + layoutManager?.requestLayout() + } + + private fun loadItems() { + if (animalType.isNotEmpty() && animalGroup.isNotEmpty()) { + inventoryRepository.getPets(animalType, animalGroup).first().subscribe(Action1> { adapter.updateData(it) }, RxErrorHandler.handleEmptyError()) + inventoryRepository.getOwnedMounts(animalType, animalGroup).subscribe(Action1> { adapter.setOwnedMounts(it) }, RxErrorHandler.handleEmptyError()) + } + } + + @Subscribe + fun showFeedingDialog(event: FeedCommand) { + if (event.usingPet == null || event.usingFood == null) { + val fragment = ItemRecyclerFragment() + fragment.feedingPet = event.usingPet + fragment.isFeeding = true + fragment.isHatching = false + fragment.itemType = "food" + fragment.itemTypeText = getString(R.string.food) + fragment.show(fragmentManager, "feedDialog") + } + } + + override fun customTitle(): String { + return if (!isAdded) { + "" + } else getString(R.string.pets) + } + + companion object { + private val ANIMAL_TYPE_KEY = "ANIMAL_TYPE_KEY" + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index e1aafa40b..f24d68dcf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -72,8 +72,13 @@ class InboxMessageListFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefres communityGuidelinesView.visibility = View.GONE - view.invalidate() - view.forceLayout() + } + + override fun onAttach(context: Context?) { + view?.invalidate() + view?.forceLayout() + + super.onAttach(context) } private fun loadMessages() {