diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 480657a0e..4c085929c 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -106,6 +106,10 @@
android:name=".ui.activities.GiftGemsActivity"
android:label="@string/gift_gems">
+
+
diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 75a753f0f..0a8f0de1d 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -151,7 +151,7 @@ android {
multiDexEnabled true
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
- versionCode 2316
+ versionCode 2324
versionName "2.4"
}
diff --git a/Habitica/res/drawable/layout_rounded_bg_teal.xml b/Habitica/res/drawable/layout_rounded_bg_teal.xml
new file mode 100644
index 000000000..d7f9772b3
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_teal.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/activity_gift1get1_info.xml b/Habitica/res/layout/activity_gift1get1_info.xml
new file mode 100644
index 000000000..562718df5
--- /dev/null
+++ b/Habitica/res/layout/activity_gift1get1_info.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 982248fcd..b9a439aaf 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -917,4 +917,12 @@
Gift a subscription now and you’ll get the same sub for yourself free!
Gift One, Get One Event
Sale
+ In honor of the season of giving we\'re bringing back a very special promotion. Now when you gift somebody a subscription, you get the same sub for yourself for free!
+ Gift a Subscription
+ How it works
+ Tap ‘Gift a Subscription’ and type in the username of the account you’d like to gift to. From there, pick the sub length you’d like to gift and check out. Your account will automatically be rewarded with the same level of subscription you just gifted.
+ Limitations
+ This promotion only applies when you gift to another Habitican. If you or your gift recipient already have a subscription, the gifted subscription will add months of credit that will only be used after the current subscription is cancelled expires.
+ Limited event
+ Dec 17 to Jan 6
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
index 425fa408c..13034393e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt
@@ -49,8 +49,8 @@ class NotificationOpenHandler {
MainNavigationController.navigate(R.id.questDetailFragment, bundleOf("partyID" to partyId, "questKey" to questKey))
}
- private fun openGuildDetailScreen(groupID: String) {
- if (groupID.isEmpty()) {
+ private fun openGuildDetailScreen(groupID: String?) {
+ if (groupID?.isNotEmpty() != true) {
return
}
MainNavigationController.navigate(R.id.guildFragment, bundleOf("groupID" to groupID))
@@ -61,7 +61,7 @@ class NotificationOpenHandler {
MainNavigationController.navigate(R.id.prefsActivity)
}
- private fun handleChatMessage(type: String?, groupID: String) {
+ private fun handleChatMessage(type: String?, groupID: String?) {
when (type) {
"party" -> MainNavigationController.navigate(R.id.partyFragment)
"tavern" -> MainNavigationController.navigate(R.id.tavernFragment)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt
index 0ddffa912..9d0186081 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt
@@ -2,12 +2,14 @@ package com.habitrpg.android.habitica.ui.activities
import android.app.ProgressDialog
import android.os.Bundle
-import androidx.core.content.ContextCompat
import android.view.Menu
import android.view.MenuItem
+import android.view.View
+import androidx.core.content.ContextCompat
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.databinding.ActivityFixcharacterBinding
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User
@@ -16,12 +18,12 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.settings.FixValuesEditText
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
-import kotlinx.android.synthetic.main.activity_fixcharacter.*
import javax.inject.Inject
import javax.inject.Named
class FixCharacterValuesActivity: BaseActivity() {
+ private lateinit var binding: ActivityFixcharacterBinding
@Inject
lateinit var repository: UserRepository
@@ -30,6 +32,11 @@ class FixCharacterValuesActivity: BaseActivity() {
override fun getLayoutResId(): Int = R.layout.activity_fixcharacter
+ override fun getContentView(): View {
+ binding = ActivityFixcharacterBinding.inflate(layoutInflater)
+ return binding.root
+ }
+
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
@@ -38,7 +45,7 @@ class FixCharacterValuesActivity: BaseActivity() {
super.onCreate(savedInstanceState)
setTitle(R.string.fix_character_values)
- setupToolbar(toolbar)
+ setupToolbar(binding.toolbar)
repository.getUser(userId).firstElement().subscribe(Consumer {
user = it
@@ -57,12 +64,12 @@ class FixCharacterValuesActivity: BaseActivity() {
@Suppress("DEPRECATION")
val progressDialog = ProgressDialog.show(this, getString(R.string.saving), "")
val userInfo = HashMap()
- userInfo["stats.hp"] = healthEditText.getDoubleValue()
- userInfo["stats.exp"] = experienceEditText.getDoubleValue()
- userInfo["stats.gp"] = goldEditText.getDoubleValue()
- userInfo["stats.mp"] = manaEditText.getDoubleValue()
- userInfo["stats.lvl"] = levelEditText.getDoubleValue().toInt()
- userInfo["achievements.streak"] = streakEditText.getDoubleValue().toInt()
+ userInfo["stats.hp"] = binding.healthEditText.getDoubleValue()
+ userInfo["stats.exp"] = binding.experienceEditText.getDoubleValue()
+ userInfo["stats.gp"] = binding.goldEditText.getDoubleValue()
+ userInfo["stats.mp"] = binding.manaEditText.getDoubleValue()
+ userInfo["stats.lvl"] = binding.levelEditText.getDoubleValue().toInt()
+ userInfo["achievements.streak"] = binding.streakEditText.getDoubleValue().toInt()
repository.updateUser(user, userInfo).subscribe(Consumer {}, RxErrorHandler.handleEmptyError(), Action {
progressDialog.dismiss()
finish()
@@ -82,29 +89,29 @@ class FixCharacterValuesActivity: BaseActivity() {
}
private fun updateFields(user: User) {
- healthEditText.text = user.stats?.hp.toString()
- experienceEditText.text = user.stats?.exp.toString()
- goldEditText.text = user.stats?.gp.toString()
- manaEditText.text = user.stats?.mp.toString()
- levelEditText.text = user.stats?.lvl.toString()
- streakEditText.text = user.streakCount.toString()
+ binding.healthEditText.text = user.stats?.hp.toString()
+ binding.experienceEditText.text = user.stats?.exp.toString()
+ binding.goldEditText.text = user.stats?.gp.toString()
+ binding.manaEditText.text = user.stats?.mp.toString()
+ binding.levelEditText.text = user.stats?.lvl.toString()
+ binding.streakEditText.text = user.streakCount.toString()
when (user.stats?.habitClass) {
Stats.WARRIOR -> {
- levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.red_500)
- levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfWarriorLightBg())
+ binding.levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.red_500)
+ binding.levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfWarriorLightBg())
}
Stats.MAGE -> {
- levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.blue_500)
- levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfMageLightBg())
+ binding.levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.blue_500)
+ binding.levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfMageLightBg())
}
Stats.HEALER -> {
- levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.yellow_500)
- levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfHealerLightBg())
+ binding.levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.yellow_500)
+ binding.levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfHealerLightBg())
}
Stats.ROGUE -> {
- levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.brand_500)
- levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfRogueLightBg())
+ binding.levelEditText.iconBackgroundColor = ContextCompat.getColor(this, R.color.brand_500)
+ binding.levelEditText.setIconBitmap(HabiticaIconsHelper.imageOfRogueLightBg())
}
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftOneGetOneInfoActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftOneGetOneInfoActivity.kt
new file mode 100644
index 000000000..b3d9bf36c
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftOneGetOneInfoActivity.kt
@@ -0,0 +1,58 @@
+package com.habitrpg.android.habitica.ui.activities
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.EditText
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.components.UserComponent
+import com.habitrpg.android.habitica.databinding.ActivityGift1get1InfoBinding
+import com.habitrpg.android.habitica.extensions.addCancelButton
+import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
+
+class GiftOneGetOneInfoActivity : BaseActivity() {
+ private lateinit var binding: ActivityGift1get1InfoBinding
+
+ override fun getLayoutResId(): Int {
+ return R.layout.activity_gift1get1_info
+ }
+
+ override fun injectActivity(component: UserComponent?) {
+
+ }
+
+ override fun getContentView(): View {
+ binding = ActivityGift1get1InfoBinding.inflate(layoutInflater)
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding.cancelButton.setOnClickListener {
+ finish()
+ }
+
+ binding.giftButton.setOnClickListener {
+ showGiftSubscriptionDialog()
+ }
+ }
+
+ private fun showGiftSubscriptionDialog() {
+ val chooseRecipientDialogView = layoutInflater.inflate(R.layout.dialog_choose_message_recipient, null)
+
+ val alert = HabiticaAlertDialog(this)
+ 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(this, GiftSubscriptionActivity::class.java).apply {
+ putExtra("username", usernameEditText?.text.toString())
+ }
+ startActivity(intent)
+ finish()
+ }
+ alert.addCancelButton { _, _ ->
+ }
+ alert.setAdditionalContentView(chooseRecipientDialogView)
+ alert.show()
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt
index 9a020f77e..1e6f540b8 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt
@@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.ui.fragments
import android.content.Intent
import android.content.pm.PackageManager
-import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.Gravity
@@ -12,6 +11,7 @@ import android.view.ViewGroup
import android.view.animation.AccelerateInterpolator
import android.widget.TextView
import android.widget.Toast
+import androidx.core.app.ShareCompat
import androidx.core.net.toUri
import com.google.firebase.analytics.FirebaseAnalytics
import com.habitrpg.android.habitica.R
@@ -159,11 +159,13 @@ class AboutFragment : BaseMainFragment() {
bodyOfEmail += " \nDetails:\n"
- val emailIntent = Intent(Intent.ACTION_SENDTO, Uri.fromParts(
- "mailto", appConfigManager.supportEmail(), null))
- emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
- emailIntent.putExtra(Intent.EXTRA_TEXT, bodyOfEmail)
- startActivity(Intent.createChooser(emailIntent, "Send email..."))
+ ShareCompat.IntentBuilder.from(activity)
+ .setType("message/rfc822")
+ .addEmailTo(appConfigManager.supportEmail())
+ .setSubject(subject)
+ .setText(bodyOfEmail)
+ .setChooserTitle("Send email...")
+ .startChooser()
}
private fun doTheThing() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
index 7045adaca..9877b85a6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt
@@ -5,7 +5,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.EditText
import androidx.core.view.isVisible
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
@@ -13,7 +12,6 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentSubscriptionBinding
import com.habitrpg.android.habitica.events.UserSubscribedEvent
-import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.PurchaseTypes
@@ -21,11 +19,9 @@ 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.GiftSubscriptionActivity
+import com.habitrpg.android.habitica.ui.activities.GiftOneGetOneInfoActivity
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
-import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
-import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView
import io.reactivex.functions.Consumer
import org.greenrobot.eventbus.Subscribe
@@ -211,23 +207,7 @@ class SubscriptionFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
}
private fun showGiftSubscriptionDialog() {
- val chooseRecipientDialogView = this.activity?.layoutInflater?.inflate(R.layout.dialog_choose_message_recipient, null)
-
- this.activity?.let { thisActivity ->
- val alert = HabiticaAlertDialog(thisActivity)
- 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, GiftSubscriptionActivity::class.java).apply {
- putExtra("username", usernameEditText?.text.toString())
- }
- startActivity(intent)
- }
- alert.addCancelButton { _, _ ->
- thisActivity.dismissKeyboard()
- }
- alert.setAdditionalContentView(chooseRecipientDialogView)
- alert.show()
- }
+ val intent = Intent(context, GiftOneGetOneInfoActivity::class.java)
+ context?.startActivity(intent)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GiftOneGetOnePromoMenuView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GiftOneGetOnePromoMenuView.kt
index 32f6f548c..a42f3a142 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GiftOneGetOnePromoMenuView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/GiftOneGetOnePromoMenuView.kt
@@ -1,13 +1,13 @@
package com.habitrpg.android.habitica.ui.viewHolders
import android.content.Context
+import android.content.Intent
import android.util.AttributeSet
import android.widget.RelativeLayout
import androidx.core.content.ContextCompat
-import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate
-import com.habitrpg.android.habitica.helpers.MainNavigationController
+import com.habitrpg.android.habitica.ui.activities.GiftOneGetOneInfoActivity
import kotlinx.android.synthetic.main.promo_subscription_buy_gems.view.*
class GiftOneGetOnePromoMenuView @JvmOverloads constructor(
@@ -20,6 +20,11 @@ class GiftOneGetOnePromoMenuView @JvmOverloads constructor(
clipToPadding = false
clipChildren = false
clipToOutline = false
- button.setOnClickListener { MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", true))) }
+ button.setOnClickListener {
+ val intent = Intent(context, GiftOneGetOneInfoActivity::class.java)
+ context.startActivity(intent)
+ }
}
+
+
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt
index e65d8a611..7ce98ab5f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt
@@ -130,6 +130,8 @@ class TaskListDeserializer : JsonDeserializer {
}
} catch (ignored: ClassCastException) {
+ } catch (ignored: java.lang.UnsupportedOperationException) {
+
}
}
diff --git a/build.gradle b/build.gradle
index 3300f2bec..b47a9b5e4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,7 +11,7 @@ buildscript {
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.0-beta02'
+ classpath 'com.android.tools.build:gradle:3.6.0-beta05'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.google.gms:google-services:4.3.2'
classpath "io.realm:realm-gradle-plugin:5.15.0"