diff --git a/Habitica/res/drawable/rounded_purple_square.xml b/Habitica/res/drawable/rounded_purple_square.xml
index 0dc0c7e65..eebd55800 100644
--- a/Habitica/res/drawable/rounded_purple_square.xml
+++ b/Habitica/res/drawable/rounded_purple_square.xml
@@ -5,7 +5,7 @@
+ android:color="@color/brand_300" >
diff --git a/Habitica/res/layout/activity_gift_gems.xml b/Habitica/res/layout/activity_gift_gems.xml
index 52ec41986..faa1191b7 100644
--- a/Habitica/res/layout/activity_gift_gems.xml
+++ b/Habitica/res/layout/activity_gift_gems.xml
@@ -1,127 +1,56 @@
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:minHeight="?attr/actionBarSize"
+ android:theme="@style/Toolbar"
+ app:layout_scrollFlags="scroll|enterAlways"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/>
+
+
+
+
+
+
+
+
diff --git a/Habitica/res/layout/fragment_gift_gem_balance.xml b/Habitica/res/layout/fragment_gift_gem_balance.xml
new file mode 100644
index 000000000..4527d0f13
--- /dev/null
+++ b/Habitica/res/layout/fragment_gift_gem_balance.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_gift_gem_purchase.xml b/Habitica/res/layout/fragment_gift_gem_purchase.xml
new file mode 100644
index 000000000..22d720b7f
--- /dev/null
+++ b/Habitica/res/layout/fragment_gift_gem_purchase.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 3ac26cedd..30ba08eca 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -724,7 +724,6 @@
While this promotion is active, you’ll receive a matching subscription automatically after sending your gift.
Choose the subscription you’d like to gift below! This purchase won’t automatically renew.
Choose the gem packet you’d like to gift below!
- Send Gift
Server
Your gift was sent!
You sent %s a %s-month Habitica subscription and the same subscription was applied to your account for our Gift One Get One promotion!
@@ -871,4 +870,9 @@
Want to bestow a shiny haul of Gems to someone else?
Habitica will never require you to gift gems to other players. Begging people for gems is a violation of the Community Guidelines and should be reported to admin@habitica.com.
Get more out of Habitica
+ Purchase
+ From Balance
+ Enter how many of your Gems you\'d like to send below or switch tabs to purchase Gems to gift
+ Gems to gift
+ Send Gift
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt
index d5b8b45a0..e90af8750 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt
@@ -371,4 +371,7 @@ interface ApiService {
@POST("user/allocate-bulk")
fun bulkAllocatePoints(@Body stats: Map>): Flowable>
+
+ @POST("members/transfer-gems")
+ fun transferGems(@Body data: Map): Flowable>
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
index 6386caa38..04daef05a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
@@ -42,11 +42,13 @@ import com.habitrpg.android.habitica.ui.adapter.tasks.RewardsRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.adapter.tasks.TodosRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.AboutFragment;
import com.habitrpg.android.habitica.ui.fragments.AchievementsFragment;
-import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
+import com.habitrpg.android.habitica.ui.fragments.purchases.GemsPurchaseFragment;
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment;
import com.habitrpg.android.habitica.ui.fragments.NewsFragment;
import com.habitrpg.android.habitica.ui.fragments.StatsFragment;
-import com.habitrpg.android.habitica.ui.fragments.SubscriptionFragment;
+import com.habitrpg.android.habitica.ui.fragments.purchases.GiftBalanceGemsFragment;
+import com.habitrpg.android.habitica.ui.fragments.purchases.GiftPurchaseGemsFragment;
+import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment;
import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment;
@@ -322,4 +324,8 @@ public interface UserComponent {
void inject(@NotNull InsufficientGemsDialog insufficientGemsDialog);
void inject(@NotNull GiftGemsActivity giftGemsActivity);
+
+ void inject(@NotNull GiftPurchaseGemsFragment giftPurchaseGemsFragment);
+
+ void inject(@NotNull GiftBalanceGemsFragment giftBalanceGemsFragment);
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt
index ad6d5104b..3ecd884f3 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt
@@ -252,4 +252,6 @@ interface ApiClient {
fun verifyUsername(username: String): Flowable
fun updateServerUrl(newAddress: String?)
fun findUsernames(username: String, context: String?, id: String?): Flowable>
+
+ fun transferGems(giftedID: String, amount: Int): Flowable
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt
index 5b940f098..16d23b99b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt
@@ -82,6 +82,8 @@ interface SocialRepository : BaseRepository {
fun getMemberAchievements(userId: String?): Flowable>
+ fun transferGems(giftedID: String, amount: Int): Flowable
+
fun getGroupMembership(id: String): Flowable
fun getGroupMemberships(): Flowable>
fun getChatmessage(messageID: String): Flowable
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
index df8c3cf4e..550e3383b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
@@ -742,6 +742,10 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener;
return apiService.allocatePoint(stat).compose(configureApiCallObserver())
}
+ override fun transferGems(giftedID: String, amount: Int): Flowable {
+ return apiService.transferGems(mapOf(Pair("toUserId", giftedID), Pair("gemAmount", amount))).compose(configureApiCallObserver())
+ }
+
override fun bulkAllocatePoints(strength: Int, intelligence: Int, constitution: Int, perception: Int): Flowable {
val body = HashMap>()
val stats = HashMap()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt
index b7d32595e..2e127c94e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt
@@ -320,4 +320,8 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
Flowable.empty()
} else apiClient.getMemberAchievements(userId)
}
+
+ override fun transferGems(giftedID: String, amount: Int): Flowable {
+ return apiClient.transferGems(giftedID, amount)
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
index 6ac3899d0..3fb4b3e5d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
@@ -65,10 +65,10 @@ fun Long.getRemainingString(res: Resources): String {
return when {
diffMonths != 0f -> if (round(diffMonths) == 1f) {
res.getString(R.string.remaining_1month)
- } else res.getString(R.string.remaining_months, round(diffMonths))
+ } else res.getString(R.string.remaining_months, round(diffMonths).toInt())
diffWeeks != 0f -> if (round(diffWeeks) == 1f) {
res.getString(R.string.remaining_1week)
- } else res.getString(R.string.remaining_weeks, round(diffWeeks))
+ } else res.getString(R.string.remaining_weeks, round(diffWeeks).toInt())
diffDays != 0L -> if (diffDays == 1L) {
res.getString(R.string.remaining_1day)
} else res.getString(R.string.remaining_days, diffDays)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
index 647016084..adaa6937f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
@@ -10,10 +10,6 @@ class AppConfigManager {
private val remoteConfig = FirebaseRemoteConfig.getInstance()
- fun newShopsEnabled(): Boolean {
- return true
- }
-
fun shopSpriteSuffix(): String {
return remoteConfig.getString("shopSpriteSuffix")
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
index 78a50c8b3..a04a7a8f0 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt
@@ -13,8 +13,8 @@ import com.habitrpg.android.habitica.events.ConsumablePurchasedEvent
import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
-import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment
-import com.habitrpg.android.habitica.ui.fragments.SubscriptionFragment
+import com.habitrpg.android.habitica.ui.fragments.purchases.GemsPurchaseFragment
+import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.Subscribe
import javax.inject.Inject
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt
index b2a6c9f3d..9266c2a55 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt
@@ -3,11 +3,12 @@ package com.habitrpg.android.habitica.ui.activities
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
-import android.view.View
-import android.widget.TextView
import androidx.appcompat.widget.Toolbar
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
import androidx.navigation.navArgs
-import com.habitrpg.android.habitica.HabiticaPurchaseVerifier
+import androidx.viewpager.widget.ViewPager
+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.SocialRepository
@@ -15,14 +16,12 @@ import com.habitrpg.android.habitica.events.ConsumablePurchasedEvent
import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseHandler
-import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
-import com.habitrpg.android.habitica.ui.AvatarView
-import com.habitrpg.android.habitica.ui.GemPurchaseOptionsView
+import com.habitrpg.android.habitica.ui.fragments.purchases.GiftBalanceGemsFragment
+import com.habitrpg.android.habitica.ui.fragments.purchases.GiftPurchaseGemsFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
-import com.habitrpg.android.habitica.ui.views.social.UsernameLabel
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.Subscribe
import javax.inject.Inject
@@ -39,19 +38,15 @@ class GiftGemsActivity : BaseActivity() {
private var purchaseHandler: PurchaseHandler? = null
private val toolbar: Toolbar by bindView(R.id.toolbar)
-
- private val avatarView: AvatarView by bindView(R.id.avatar_view)
- private val displayNameTextView: UsernameLabel by bindView(R.id.display_name_textview)
- private val usernameTextView: TextView by bindView(R.id.username_textview)
-
- private val gems4View: GemPurchaseOptionsView? by bindView(R.id.gems_4_view)
- private val gems21View: GemPurchaseOptionsView? by bindView(R.id.gems_21_view)
- private val gems42View: GemPurchaseOptionsView? by bindView(R.id.gems_42_view)
- private val gems84View: GemPurchaseOptionsView? by bindView(R.id.gems_84_view)
+ internal val tabLayout: TabLayout by bindView(R.id.tab_layout)
+ internal val viewPager: ViewPager by bindView(R.id.viewPager)
private var giftedUsername: String? = null
private var giftedUserID: String? = null
+ private var purchaseFragment: GiftPurchaseGemsFragment? = null
+ private var balanceFragment: GiftBalanceGemsFragment? = null
+
override fun getLayoutResId(): Int {
return R.layout.activity_gift_gems
}
@@ -76,35 +71,20 @@ class GiftGemsActivity : BaseActivity() {
giftedUsername = navArgs().value.username
}
- compositeSubscription.add(socialRepository.getMember(giftedUsername ?: giftedUserID).subscribe(Consumer {
- avatarView.setAvatar(it)
- displayNameTextView.username = it.profile?.name
- displayNameTextView.tier = it.contributor?.level ?: 0
- usernameTextView.text = "@${it.username}"
+ setViewPagerAdapter()
+
+ compositeSubscription.add(socialRepository.getMember(giftedUsername ?: giftedUserID).firstElement().subscribe(Consumer {
giftedUserID = it.id
giftedUsername = it.username
+ purchaseFragment?.giftedMember = it
+ balanceFragment?.giftedMember = it
}, RxErrorHandler.handleEmptyError()))
-
}
override fun onStart() {
super.onStart()
purchaseHandler = PurchaseHandler(this, crashlyticsProxy)
purchaseHandler?.startListening()
-
- purchaseHandler?.getAllGemSKUs { skus ->
- for (sku in skus) {
- updateButtonLabel(sku.id.code, sku.price)
- }
- }
- }
-
- override fun onResume() {
- super.onResume()
- gems4View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase4Gems) })
- gems21View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase21Gems) })
- gems42View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase42Gems) })
- gems84View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase84Gems) })
}
override fun onStop() {
@@ -125,18 +105,42 @@ class GiftGemsActivity : BaseActivity() {
return super.onOptionsItemSelected(item)
}
- private fun updateButtonLabel(sku: String, price: String) {
- val matchingView: GemPurchaseOptionsView? = when (sku) {
- PurchaseTypes.Purchase4Gems -> gems4View
- PurchaseTypes.Purchase21Gems -> gems21View
- PurchaseTypes.Purchase42Gems -> gems42View
- PurchaseTypes.Purchase84Gems -> gems84View
- else -> return
- }
- if (matchingView != null) {
- matchingView.setPurchaseButtonText(price)
- matchingView.sku = sku
+ private fun setViewPagerAdapter() {
+ val fragmentManager = supportFragmentManager
+
+ viewPager.adapter = object : FragmentPagerAdapter(fragmentManager) {
+
+ override fun getItem(position: Int): Fragment {
+ return if (position == 0) {
+ val fragment = GiftPurchaseGemsFragment()
+ fragment.setPurchaseHandler(purchaseHandler)
+ fragment.setupCheckout()
+ purchaseFragment = fragment
+ fragment
+ } else {
+ val fragment = GiftBalanceGemsFragment()
+ fragment.onCompleted = {
+ displayConfirmationDialog()
+ }
+ balanceFragment = fragment
+ fragment
+ }
+ }
+
+ override fun getCount(): Int {
+ return 2
+ }
+
+ override fun getPageTitle(position: Int): CharSequence? {
+ return when (position) {
+ 0 -> getString(R.string.purchase)
+ 1 -> getString(R.string.from_balance)
+ else -> ""
+ }
+ }
}
+
+ tabLayout.setupWithViewPager(viewPager)
}
@Subscribe
@@ -158,10 +162,4 @@ class GiftGemsActivity : BaseActivity() {
}
alert.enqueue()
}
-
-
- fun purchaseGems(identifier: String) {
- HabiticaPurchaseVerifier.pendingGifts[identifier] = giftedUserID
- purchaseHandler?.purchaseGems(identifier)
- }
}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt
index 55fa17b14..b4542aa1c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt
@@ -118,7 +118,6 @@ class GroupInviteActivity : BaseActivity() {
viewPager.adapter = object : FragmentPagerAdapter(fragmentManager) {
override fun getItem(position: Int): Fragment {
-
val fragment = PartyInviteFragment()
fragment.isEmailInvite = position == 1
if (fragments.size > position) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
similarity index 97%
rename from Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt
rename to Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
index fc89b906e..a923bd72d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
@@ -1,4 +1,4 @@
-package com.habitrpg.android.habitica.ui.fragments
+package com.habitrpg.android.habitica.ui.fragments.purchases
import android.content.Intent
import android.graphics.drawable.BitmapDrawable
@@ -21,6 +21,7 @@ import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
import com.habitrpg.android.habitica.ui.GemPurchaseOptionsView
import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity
import com.habitrpg.android.habitica.ui.activities.GiftGemsActivity
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt
new file mode 100644
index 000000000..9591267ae
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt
@@ -0,0 +1,69 @@
+package com.habitrpg.android.habitica.ui.fragments.purchases
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.EditText
+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.inflate
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.members.Member
+import com.habitrpg.android.habitica.ui.AvatarView
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment
+import com.habitrpg.android.habitica.ui.helpers.bindView
+import com.habitrpg.android.habitica.ui.views.social.UsernameLabel
+import io.reactivex.functions.Consumer
+import javax.inject.Inject
+
+class GiftBalanceGemsFragment : BaseFragment() {
+
+ @Inject
+ lateinit var socialRepository: SocialRepository
+
+ private val avatarView: AvatarView by bindView(R.id.avatar_view)
+ private val displayNameTextView: UsernameLabel by bindView(R.id.display_name_textview)
+ private val usernameTextView: TextView by bindView(R.id.username_textview)
+ private val giftEditText: EditText by bindView(R.id.gift_edit_text)
+ private val giftButton: Button by bindView(R.id.gift_button)
+
+ var giftedMember: Member? = null
+ set(value) {
+ field = value
+ field?.let {
+ avatarView.setAvatar(it)
+ displayNameTextView.username = it.profile?.name
+ displayNameTextView.tier = it.contributor?.level ?: 0
+ usernameTextView.text = "@${it.username}"
+ }
+ }
+
+ var onCompleted: (() -> Unit)? = null
+
+ override fun injectFragment(component: UserComponent) {
+ component.inject(this)
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ super.onCreateView(inflater, container, savedInstanceState)
+ return container?.inflate(R.layout.fragment_gift_gem_balance)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ giftButton.setOnClickListener { sendGift() }
+ }
+
+ private fun sendGift() {
+ val amount = giftEditText.text.toString().toInt()
+ giftedMember?.id?.let {
+ compositeSubscription.add(socialRepository.transferGems(it, amount).subscribe(Consumer {
+ onCompleted?.invoke()
+ }, RxErrorHandler.handleEmptyError()))
+ }
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt
new file mode 100644
index 000000000..07f869bc5
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt
@@ -0,0 +1,105 @@
+package com.habitrpg.android.habitica.ui.fragments.purchases
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import com.habitrpg.android.habitica.HabiticaPurchaseVerifier
+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.helpers.PurchaseHandler
+import com.habitrpg.android.habitica.helpers.PurchaseTypes
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.members.Member
+import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
+import com.habitrpg.android.habitica.ui.AvatarView
+import com.habitrpg.android.habitica.ui.GemPurchaseOptionsView
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment
+import com.habitrpg.android.habitica.ui.helpers.bindView
+import com.habitrpg.android.habitica.ui.views.social.UsernameLabel
+import io.reactivex.functions.Consumer
+import javax.inject.Inject
+
+class GiftPurchaseGemsFragment : BaseFragment() {
+
+ @Inject
+ lateinit var crashlyticsProxy: CrashlyticsProxy
+ @Inject
+ lateinit var socialRepository: SocialRepository
+
+ private val avatarView: AvatarView by bindView(R.id.avatar_view)
+ private val displayNameTextView: UsernameLabel by bindView(R.id.display_name_textview)
+ private val usernameTextView: TextView by bindView(R.id.username_textview)
+ private val gems4View: GemPurchaseOptionsView? by bindView(R.id.gems_4_view)
+ private val gems21View: GemPurchaseOptionsView? by bindView(R.id.gems_21_view)
+ private val gems42View: GemPurchaseOptionsView? by bindView(R.id.gems_42_view)
+ private val gems84View: GemPurchaseOptionsView? by bindView(R.id.gems_84_view)
+
+ var giftedMember: Member? = null
+ set(value) {
+ field = value
+ field?.let {
+ avatarView.setAvatar(it)
+ displayNameTextView.username = it.profile?.name
+ displayNameTextView.tier = it.contributor?.level ?: 0
+ usernameTextView.text = "@${it.username}"
+ }
+ }
+
+ private var purchaseHandler: PurchaseHandler? = null
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View? {
+
+ super.onCreateView(inflater, container, savedInstanceState)
+
+ return container?.inflate(R.layout.fragment_gift_gem_purchase)
+ }
+
+ override fun injectFragment(component: UserComponent) {
+ component.inject(this)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ gems4View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase4Gems) })
+ gems21View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase21Gems) })
+ gems42View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase42Gems) })
+ gems84View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase84Gems) })
+ }
+
+ fun setupCheckout() {
+ purchaseHandler?.getAllGemSKUs { skus ->
+ for (sku in skus) {
+ updateButtonLabel(sku.id.code, sku.price)
+ }
+ }
+ }
+
+ fun setPurchaseHandler(handler: PurchaseHandler?) {
+ this.purchaseHandler = handler
+ }
+
+ private fun updateButtonLabel(sku: String, price: String) {
+ val matchingView: GemPurchaseOptionsView? = when (sku) {
+ PurchaseTypes.Purchase4Gems -> gems4View
+ PurchaseTypes.Purchase21Gems -> gems21View
+ PurchaseTypes.Purchase42Gems -> gems42View
+ PurchaseTypes.Purchase84Gems -> gems84View
+ else -> return
+ }
+ if (matchingView != null) {
+ matchingView.setPurchaseButtonText(price)
+ matchingView.sku = sku
+ }
+ }
+
+ private fun purchaseGems(identifier: String) {
+ HabiticaPurchaseVerifier.pendingGifts[identifier] = giftedMember?.id
+ purchaseHandler?.purchaseGems(identifier)
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
similarity index 96%
rename from Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt
rename to Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
index f2a456f9c..f978a03d6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
@@ -1,4 +1,4 @@
-package com.habitrpg.android.habitica.ui.fragments
+package com.habitrpg.android.habitica.ui.fragments.purchases
import android.content.Intent
import android.graphics.drawable.BitmapDrawable
@@ -21,6 +21,7 @@ import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.proxy.CrashlyticsProxy
import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity
import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity
+import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard