diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index a36793af0..81a52524a 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -99,9 +99,13 @@
android:label="@string/app_name">
+
+
diff --git a/Habitica/res/drawable-xhdpi/icon_gift_gems.png b/Habitica/res/drawable-xhdpi/icon_gift_gems.png
new file mode 100644
index 000000000..40175d0ec
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/icon_gift_gems.png differ
diff --git a/Habitica/res/drawable-xhdpi/icon_gift_subscription.png b/Habitica/res/drawable-xhdpi/icon_gift_subscription.png
new file mode 100644
index 000000000..cef67e8c5
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/icon_gift_subscription.png differ
diff --git a/Habitica/res/drawable-xhdpi/icon_messages.png b/Habitica/res/drawable-xhdpi/icon_messages.png
new file mode 100644
index 000000000..0e377aad8
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/icon_messages.png differ
diff --git a/Habitica/res/drawable/layout_rounded_bg_light_gray.xml b/Habitica/res/drawable/layout_rounded_bg_light_gray.xml
index 2bbaf940d..cfa64aed6 100644
--- a/Habitica/res/drawable/layout_rounded_bg_light_gray.xml
+++ b/Habitica/res/drawable/layout_rounded_bg_light_gray.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Habitica/res/layout/activity_full_profile.xml b/Habitica/res/layout/activity_full_profile.xml
index efead96d4..899137d69 100644
--- a/Habitica/res/layout/activity_full_profile.xml
+++ b/Habitica/res/layout/activity_full_profile.xml
@@ -138,13 +138,12 @@
-
+ tools:text="Blurb" />
+ fresco:actualImageScaleType="fitCenter"
+ android:visibility="gone"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Habitica/res/layout/activity_gift_iap.xml b/Habitica/res/layout/activity_gift_subscription.xml
similarity index 100%
rename from Habitica/res/layout/activity_gift_iap.xml
rename to Habitica/res/layout/activity_gift_subscription.xml
diff --git a/Habitica/res/navigation/navigation.xml b/Habitica/res/navigation/navigation.xml
index 15bd80aec..1bbfe1853 100644
--- a/Habitica/res/navigation/navigation.xml
+++ b/Habitica/res/navigation/navigation.xml
@@ -149,6 +149,32 @@
app:argType="boolean"
android:defaultValue="false" />
+
+
+
+
+
+
+
+
PER:
visit website
Want to give the benefits of a subscription to someone else?
- Gift a Subscription
+ Gift Subscription
Gift a sub and get a sub free event going on now!
Who would you like to gift to?
Gift one, Get one!
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!
- You sent %s a %s-month Habitica subscription.
+ You sent %s a %s-month Habitica subscription and the same subscription was applied to your account for our Gift One Get One promotion!
+ You sent %s a %s-month Habitica subscription.
+ You sent %s %s gems.
Discover
Damage paused
Important Announcements
@@ -848,4 +850,8 @@
Need Gems?
Become a Subscriber to buy Gems with gold, get monthly mystery items, increased drop caps and more!
See other Options
+ Gift Gems
+ Send\nMessage
+ Gift\nGems
+ Gift\nSubscription
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 ab5e56840..6386caa38 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
@@ -18,7 +18,8 @@ import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity;
import com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity;
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity;
import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity;
-import com.habitrpg.android.habitica.ui.activities.GiftIAPActivity;
+import com.habitrpg.android.habitica.ui.activities.GiftGemsActivity;
+import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity;
import com.habitrpg.android.habitica.ui.activities.GroupFormActivity;
import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity;
import com.habitrpg.android.habitica.ui.activities.HabitButtonWidgetActivity;
@@ -302,7 +303,7 @@ public interface UserComponent {
void inject(@NotNull ChatFragment chatFragment);
- void inject(@NotNull GiftIAPActivity giftIAPActivity);
+ void inject(@NotNull GiftSubscriptionActivity giftSubscriptionActivity);
void inject(@NotNull AboutFragment aboutFragment);
@@ -319,4 +320,6 @@ public interface UserComponent {
void inject(@NotNull InboxViewModel inboxViewModel);
void inject(@NotNull InsufficientGemsDialog insufficientGemsDialog);
+
+ void inject(@NotNull GiftGemsActivity giftGemsActivity);
}
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 3ee0ea7d1..e3c3cad28 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
@@ -16,6 +16,8 @@ import io.reactivex.Single
import io.reactivex.functions.BiFunction
import io.reactivex.functions.Consumer
import io.realm.RealmResults
+import java.util.*
+import kotlin.collections.HashMap
class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl(localRepository, apiClient, userID), SocialRepository {
override fun transferGroupOwnership(groupID: String, userID: String): Flowable {
@@ -247,13 +249,17 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
override fun getMember(userId: String?): Flowable {
return if (userId == null) {
Flowable.empty()
- } else apiClient.getMember(userId)
+ } else {
+ try {
+ apiClient.getMember(UUID.fromString(userId).toString())
+ } catch(_: IllegalArgumentException) {
+ apiClient.getMemberWithUsername(userId)
+ }
+ }
}
override fun getMemberWithUsername(username: String?): Flowable {
- return if (username == null) {
- Flowable.empty()
- } else apiClient.getMemberWithUsername(username)
+ return getMember(username)
}
override fun findUsernames(username: String, context: String?, id: String?): Flowable> {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
index fec1c9133..ed260fd65 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/PurchaseHandler.kt
@@ -162,9 +162,8 @@ class PurchaseHandler(activity: Activity, val crashlyticsProxy: CrashlyticsProxy
}
}
- fun purchaseGiftedSubscription(sku: Sku, giftedUserID: String?) {
+ fun purchaseNoRenewSubscription(sku: Sku) {
checkout?.let {
- HabiticaPurchaseVerifier.pendingGifts[sku.id.code] = giftedUserID
billingRequests?.purchase(ProductTypes.IN_APP, sku.id.code, null, it.createOneShotPurchaseFlow(object : RequestListener {
override fun onSuccess(result: Purchase) {
billingRequests?.consume(result.token, object : RequestListener {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
index 4c5ac8972..2ca8b2775 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
@@ -3,11 +3,15 @@ package com.habitrpg.android.habitica.ui.activities
import android.content.Context
import android.graphics.Typeface
import android.os.Bundle
-import android.view.*
+import android.view.LayoutInflater
+import android.view.MenuItem
+import android.view.View
+import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
+import androidx.core.os.bundleOf
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.controller.BaseControllerListener
import com.facebook.drawee.view.SimpleDraweeView
@@ -77,6 +81,9 @@ class FullProfileActivity : BaseActivity() {
private val joinedView: TextView by bindView(R.id.joined_view)
private val lastLoginView: TextView by bindView(R.id.last_login_view)
private val totalCheckinsView: TextView by bindView(R.id.total_checkins_view)
+ private val sendMessageButton: Button by bindView(R.id.send_message_button)
+ private val giftGemsButton: Button by bindView(R.id.gift_gems_button)
+ private val giftSubscriptionButton: Button by bindView(R.id.gift_subscription_button)
private var userID = ""
private var userName: String? = null
@@ -110,6 +117,10 @@ class FullProfileActivity : BaseActivity() {
attributesCardView.setOnClickListener { toggleAttributeDetails() }
avatarWithBars = AvatarWithBarsViewModel(this, avatarWithStatsView)
+
+ sendMessageButton.setOnClickListener { showSendMessageToUserDialog() }
+ giftGemsButton.setOnClickListener { MainNavigationController.navigate(R.id.giftGemsActivity, bundleOf(Pair("userID", userID), Pair("username", null))) }
+ giftSubscriptionButton.setOnClickListener { MainNavigationController.navigate(R.id.giftSubscriptionActivity, bundleOf(Pair("userID", userID), Pair("username", null))) }
}
override fun onDestroy() {
@@ -119,10 +130,6 @@ class FullProfileActivity : BaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
- R.id.private_message -> {
- showSendMessageToUserDialog()
- true
- }
android.R.id.home -> {
// app icon in action bar clicked; goto parent activity.
this.finish()
@@ -452,12 +459,6 @@ class FullProfileActivity : BaseActivity() {
component?.inject(this)
}
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- // Inflate the menu; this adds items to the action bar if it is present.
- menuInflater.inflate(R.menu.menu_full_profile, menu)
- return true
- }
-
companion object {
fun open(userId: String) {
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
new file mode 100644
index 000000000..b856e3501
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt
@@ -0,0 +1,162 @@
+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.navigation.navArgs
+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.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.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
+
+class GiftGemsActivity : BaseActivity() {
+
+ @Inject
+ lateinit var crashlyticsProxy: CrashlyticsProxy
+ @Inject
+ lateinit var socialRepository: SocialRepository
+ @Inject
+ lateinit var appConfigManager: AppConfigManager
+
+ 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)
+
+ private var giftedUsername: String? = null
+ private var giftedUserID: String? = null
+
+ override fun getLayoutResId(): Int {
+ return R.layout.activity_gift_gems
+ }
+
+ override fun injectActivity(component: UserComponent?) {
+ component?.inject(this)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setTitle(R.string.gift_gems)
+ setSupportActionBar(toolbar)
+
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ supportActionBar?.setDisplayShowHomeEnabled(true)
+
+ giftedUserID = intent.getStringExtra("userID") ?: navArgs().value.userID
+ giftedUsername = intent.getStringExtra("username") ?: 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}"
+ giftedUserID = it.id
+ giftedUsername = it.username
+ }, RxErrorHandler.handleEmptyError()))
+
+ purchaseHandler?.getAllGemSKUs { skus ->
+ for (sku in skus) {
+ updateButtonLabel(sku.id.code, sku.price)
+ }
+ }
+ }
+
+ override fun onStart() {
+ super.onStart()
+ purchaseHandler = PurchaseHandler(this, crashlyticsProxy)
+ purchaseHandler?.startListening()
+ }
+
+ 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() {
+ purchaseHandler?.stopListening()
+ super.onStop()
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ purchaseHandler?.onResult(requestCode, resultCode, data)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ if (item.itemId == android.R.id.home) {
+ finish()
+ }
+
+ 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
+ }
+ }
+
+ @Subscribe
+ fun onConsumablePurchased(event: ConsumablePurchasedEvent) {
+ purchaseHandler?.consumePurchase(event.purchase)
+ runOnUiThread {
+ displayConfirmationDialog()
+ }
+ }
+
+ private fun displayConfirmationDialog() {
+ val message = getString(R.string.gift_confirmation_text_gems, giftedUsername, "1")
+ val alert = HabiticaAlertDialog(this)
+ alert.setTitle(R.string.gift_confirmation_title)
+ alert.setMessage(message)
+ alert.addOkButton { dialog, _ ->
+ dialog.dismiss()
+ finish()
+ }
+ 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/GiftIAPActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt
similarity index 90%
rename from Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftIAPActivity.kt
rename to Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt
index 38576bc15..c9f59d842 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftIAPActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt
@@ -9,6 +9,8 @@ import android.widget.Button
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.core.view.isVisible
+import androidx.navigation.navArgs
+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
@@ -32,7 +34,7 @@ import org.solovyev.android.checkout.Sku
import javax.inject.Inject
-class GiftIAPActivity: BaseActivity() {
+class GiftSubscriptionActivity : BaseActivity() {
@Inject
lateinit var crashlyticsProxy: CrashlyticsProxy
@@ -65,7 +67,7 @@ class GiftIAPActivity: BaseActivity() {
private var skus: List = emptyList()
override fun getLayoutResId(): Int {
- return R.layout.activity_gift_iap
+ return R.layout.activity_gift_subscription
}
override fun injectActivity(component: UserComponent?) {
@@ -81,7 +83,8 @@ class GiftIAPActivity: BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
- giftedUsername = intent.getStringExtra("username")
+ giftedUserID = intent.getStringExtra("userID") ?: navArgs().value.userID
+ giftedUsername = intent.getStringExtra("username") ?: navArgs().value.username
subscriptionButton?.setOnClickListener {
selectedSubscriptionSku?.let { sku -> purchaseSubscription(sku) }
@@ -89,12 +92,13 @@ class GiftIAPActivity: BaseActivity() {
giftOneGetOneContainer?.isVisible = appConfigManager.enableGiftOneGetOne()
- compositeSubscription.add(socialRepository.getMemberWithUsername(giftedUsername).subscribe(Consumer {
+ 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}"
giftedUserID = it.id
+ giftedUsername = it.username
}, RxErrorHandler.handleEmptyError()))
}
@@ -179,7 +183,8 @@ class GiftIAPActivity: BaseActivity() {
if (giftedUserID?.isNotEmpty() != true) {
return
}
- purchaseHandler?.purchaseGiftedSubscription(sku, giftedUserID)
+ HabiticaPurchaseVerifier.pendingGifts[sku.id.code] = giftedUserID
+ purchaseHandler?.purchaseNoRenewSubscription(sku)
}
@@ -203,9 +208,9 @@ class GiftIAPActivity: BaseActivity() {
private fun displayConfirmationDialog() {
val message = getString(if (appConfigManager.enableGiftOneGetOne()){
- R.string.gift_confirmation_text_g1g1
+ R.string.gift_confirmation_text_sub_g1g1
} else {
- R.string.gift_confirmation_text
+ R.string.gift_confirmation_text_sub
}, giftedUsername, selectedDurationString())
val alert = HabiticaAlertDialog(this)
alert.setTitle(R.string.gift_confirmation_title)
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/SubscriptionFragment.kt
index 02e4a70fc..b8cc975f9 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/SubscriptionFragment.kt
@@ -20,7 +20,7 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler
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.GiftIAPActivity
+import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
@@ -247,7 +247,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
alert.setTitle(getString(R.string.gift_title))
alert.addButton(getString(R.string.action_continue), true) { _, _ ->
val usernameEditText = chooseRecipientDialogView?.findViewById(R.id.uuidEditText) as? EditText
- val intent = Intent(thisActivity, GiftIAPActivity::class.java).apply {
+ val intent = Intent(thisActivity, GiftSubscriptionActivity::class.java).apply {
putExtra("username", usernameEditText?.text.toString())
}
startActivity(intent)