From e72cc072f1ecf73ffd6033b5c8be67cc5d2ed5d5 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 20 Apr 2020 15:45:22 +0200 Subject: [PATCH] Fix intro screens --- Habitica/build.gradle | 10 +- .../res/layout/fragment_support_bug_fix.xml | 11 ++- Habitica/res/layout/fragment_support_main.xml | 7 +- .../ui/activities/GroupInviteActivity.kt | 3 +- .../ui/activities/GuidelinesActivity.kt | 3 +- .../habitica/ui/activities/IntroActivity.kt | 97 ++++++++++--------- .../ui/activities/NotificationsActivity.kt | 37 ++++--- .../habitica/ui/activities/PrefsActivity.kt | 3 +- .../ui/activities/SkillMemberActivity.kt | 3 +- .../ui/activities/SkillTasksActivity.kt | 3 +- .../ui/fragments/support/BugFixFragment.kt | 2 +- .../fragments/support/SupportMainFragment.kt | 2 +- 12 files changed, 101 insertions(+), 80 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 958b749ca..9f73511ad 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -64,7 +64,7 @@ dependencies { compileOnly 'com.github.pengrad:jdk9-deps:1.0' //App Compatibility and Material Design implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.legacy:legacy-preference-v14:1.0.0' // Emojis @@ -132,9 +132,9 @@ dependencies { implementation 'androidx.core:core-ktx:1.2.0' implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0" - implementation 'androidx.navigation:navigation-fragment-ktx:2.2.1' - implementation 'androidx.navigation:navigation-ui-ktx:2.2.1' - implementation "androidx.paging:paging-runtime-ktx:2.1.1" + implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2' + implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' + implementation "androidx.paging:paging-runtime-ktx:2.1.2" implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' @@ -162,7 +162,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 2407 + versionCode 2408 versionName "2.6" } diff --git a/Habitica/res/layout/fragment_support_bug_fix.xml b/Habitica/res/layout/fragment_support_bug_fix.xml index fe09f89b7..bab44c9fc 100644 --- a/Habitica/res/layout/fragment_support_bug_fix.xml +++ b/Habitica/res/layout/fragment_support_bug_fix.xml @@ -1,8 +1,12 @@ - + + android:background="@color/white" + android:layout_marginBottom="@dimen/spacing_large"> - \ No newline at end of file + + \ No newline at end of file diff --git a/Habitica/res/layout/fragment_support_main.xml b/Habitica/res/layout/fragment_support_main.xml index 08f827823..5d98b294c 100644 --- a/Habitica/res/layout/fragment_support_main.xml +++ b/Habitica/res/layout/fragment_support_main.xml @@ -1,4 +1,8 @@ + - \ No newline at end of file + + \ 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 a66da7f3f..7bd208b61 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 @@ -24,7 +24,6 @@ import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import io.reactivex.functions.Consumer -import kotlinx.android.synthetic.main.activity_prefs.* import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -54,7 +53,7 @@ class GroupInviteActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(findViewById(R.id.toolbar)) viewPager.currentItem = 0 supportActionBar?.title = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt index 07b4a905d..a94ee1ea2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt @@ -6,7 +6,6 @@ import android.widget.TextView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.ui.helpers.setMarkdown -import kotlinx.android.synthetic.main.activity_prefs.* import okhttp3.* import java.io.BufferedReader import java.io.IOException @@ -20,7 +19,7 @@ class GuidelinesActivity: BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(findViewById(R.id.toolbar)) val client = OkHttpClient() val request = Request.Builder().url("https://s3.amazonaws.com/habitica-assets/mobileApp/endpoint/community-guidelines.md").build() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt index 9445b55e8..ac0ad6d55 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt @@ -3,46 +3,47 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Intent import android.os.Bundle import android.view.View -import android.widget.Button +import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter +import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ContentRepository +import com.habitrpg.android.habitica.databinding.ActivityIntroBinding import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment -import com.habitrpg.android.habitica.ui.helpers.bindView -import com.viewpagerindicator.IconPageIndicator import com.viewpagerindicator.IconPagerAdapter import io.reactivex.functions.Consumer import javax.inject.Inject + class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { + private lateinit var binding: ActivityIntroBinding @Inject lateinit var contentRepository: ContentRepository - private val pager: ViewPager by bindView(R.id.viewPager) - private val indicator: IconPageIndicator by bindView(R.id.view_pager_indicator) - private val skipButton: Button by bindView(R.id.skipButton) - private val finishButton: Button by bindView(R.id.finishButton) - override fun getLayoutResId(): Int { return R.layout.activity_intro } + override fun getContentView(): View { + binding = ActivityIntroBinding.inflate(layoutInflater) + return binding.root + } + public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setupIntro() - indicator.setViewPager(pager) + //binding.viewPagerIndicator.setViewPager(binding.viewPager) - this.skipButton.setOnClickListener(this) - this.finishButton.setOnClickListener(this) + binding.skipButton.setOnClickListener(this) + binding.finishButton.setOnClickListener(this) compositeSubscription.add(contentRepository.retrieveContent(this).subscribe(Consumer { }, RxErrorHandler.handleEmptyError())) } @@ -52,11 +53,9 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan } private fun setupIntro() { - val fragmentManager = supportFragmentManager + binding.viewPager.adapter = PagerAdapter(supportFragmentManager) - pager.adapter = PagerAdapter(fragmentManager) - - pager.addOnPageChangeListener(this) + binding.viewPager.addOnPageChangeListener(this) } override fun onClick(v: View) { @@ -76,43 +75,19 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan override fun onPageSelected(position: Int) { if (position == 2) { - this.finishButton.visibility = View.VISIBLE + binding.finishButton.visibility = View.VISIBLE } else { - this.finishButton.visibility = View.GONE + binding.finishButton.visibility = View.GONE } } override fun onPageScrollStateChanged(state: Int) { /* no-on */ } - private inner class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter { + private inner class PagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter { override fun getItem(position: Int): Fragment { val fragment = IntroFragment() - - when (position) { - 0 -> { - fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1, null)) - fragment.setSubtitle(getString(R.string.intro_1_subtitle)) - fragment.setTitleImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1_title, null)) - fragment.setDescription(getString(R.string.intro_1_description, getString(R.string.habitica_user_count))) - fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.brand_300)) - } - 1 -> { - fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_2, null)) - fragment.setSubtitle(getString(R.string.intro_2_subtitle)) - fragment.setTitle(getString(R.string.intro_2_title)) - fragment.setDescription(getString(R.string.intro_2_description)) - fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.blue_10)) - } - 2 -> { - fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_3, null)) - fragment.setSubtitle(getString(R.string.intro_3_subtitle)) - fragment.setTitle(getString(R.string.intro_3_title)) - fragment.setDescription(getString(R.string.intro_3_description)) - fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.red_100)) - } - } - + configureFragment(fragment, position) return fragment } @@ -123,5 +98,39 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan override fun getCount(): Int { return 3 } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val item = super.instantiateItem(container, position) + if (item is IntroFragment) { + configureFragment(item, position) + } + return item + } + } + + private fun configureFragment(fragment: IntroFragment, position: Int) { + when (position) { + 0 -> { + fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1, null)) + fragment.setSubtitle(getString(R.string.intro_1_subtitle)) + fragment.setTitleImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_1_title, null)) + fragment.setDescription(getString(R.string.intro_1_description, getString(R.string.habitica_user_count))) + fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.brand_300)) + } + 1 -> { + fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_2, null)) + fragment.setSubtitle(getString(R.string.intro_2_subtitle)) + fragment.setTitle(getString(R.string.intro_2_title)) + fragment.setDescription(getString(R.string.intro_2_description)) + fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.blue_10)) + } + 2 -> { + fragment.setImage(ResourcesCompat.getDrawable(resources, R.drawable.intro_3, null)) + fragment.setSubtitle(getString(R.string.intro_3_subtitle)) + fragment.setTitle(getString(R.string.intro_3_title)) + fragment.setDescription(getString(R.string.intro_3_description)) + fragment.setBackgroundColor(ContextCompat.getColor(this@IntroActivity, R.color.red_100)) + } + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 01c822893..158cdd770 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -13,6 +13,8 @@ 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.databinding.ActivityIntroBinding +import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Notification import com.habitrpg.android.habitica.models.inventory.QuestContent @@ -20,11 +22,11 @@ import com.habitrpg.android.habitica.models.notifications.* import com.habitrpg.android.habitica.ui.activities.MainActivity.Companion.NOTIFICATION_CLICK import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel import io.reactivex.functions.Consumer -import kotlinx.android.synthetic.main.activity_notifications.* import javax.inject.Inject class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { + private lateinit var binding: ActivityNotificationsBinding @Inject lateinit var inventoryRepository: InventoryRepository @Inject @@ -36,12 +38,17 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget override fun getLayoutResId(): Int = R.layout.activity_notifications + override fun getContentView(): View { + binding = ActivityNotificationsBinding.inflate(layoutInflater) + return binding.root + } + private var notifications: List = emptyList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(binding.toolbar) inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater @@ -53,7 +60,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget viewModel.markNotificationsAsSeen(it) }, RxErrorHandler.handleEmptyError())) - notifications_refresh_layout?.setOnRefreshListener(this) + binding.notificationsRefreshLayout.setOnRefreshListener(this) } override fun injectActivity(component: UserComponent?) { @@ -69,21 +76,21 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } override fun onRefresh() { - notifications_refresh_layout.isRefreshing = true + binding.notificationsRefreshLayout.isRefreshing = true compositeSubscription.add(viewModel.refreshNotifications().subscribe(Consumer { - notifications_refresh_layout.isRefreshing = false + binding.notificationsRefreshLayout.isRefreshing = false }, RxErrorHandler.handleEmptyError())) } private fun setNotifications(notifications: List) { this.notifications = notifications - if (notification_items == null) { + if (binding.notificationItems == null) { return } - notification_items.removeAllViewsInLayout() + binding.notificationItems.removeAllViewsInLayout() if (notifications.isEmpty()) { displayNoNotificationsView() @@ -93,15 +100,15 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } private fun displayNoNotificationsView() { - notification_items.showDividers = LinearLayout.SHOW_DIVIDER_NONE + binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_NONE - notification_items.addView(inflater?.inflate(R.layout.no_notifications, notification_items, false)) + binding.notificationItems.addView(inflater?.inflate(R.layout.no_notifications, binding.notificationItems, false)) } private fun displayNotificationsListView(notifications: List) { - notification_items.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END + binding.notificationItems.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE or LinearLayout.SHOW_DIVIDER_END - notification_items.addView( + binding.notificationItems.addView( createNotificationsHeaderView(notifications.count()) ) @@ -121,13 +128,13 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } if (item != null) { - notification_items.addView(item) + binding.notificationItems.addView(item) } } } private fun createNotificationsHeaderView(notificationCount: Int): View? { - val header = inflater?.inflate(R.layout.notifications_header, notification_items, false) + val header = inflater?.inflate(R.layout.notifications_header, binding.notificationItems, false) val badge = header?.findViewById(R.id.notifications_title_badge) as? TextView badge?.text = notificationCount.toString() @@ -237,7 +244,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget imageResourceId: Int? = null, textColor: Int? = null ): View? { - val item = inflater?.inflate(R.layout.notification_item, notification_items, false) + val item = inflater?.inflate(R.layout.notification_item, binding.notificationItems, false) val container = item?.findViewById(R.id.notification_item) as? View container?.setOnClickListener { @@ -337,7 +344,7 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget notification: Notification, messageText: CharSequence, openable: Boolean = false): View? { - val item = inflater?.inflate(R.layout.notification_item_actionable, notification_items, false) + val item = inflater?.inflate(R.layout.notification_item_actionable, binding.notificationItems, false) if (openable) { val container = item?.findViewById(R.id.notification_item) as? View diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt index 74bd3fe44..8e1d9dd5f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt @@ -6,7 +6,6 @@ import androidx.preference.PreferenceScreen import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.ui.fragments.preferences.* -import kotlinx.android.synthetic.main.activity_prefs.* class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback { @@ -15,7 +14,7 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(findViewById(R.id.toolbar)) supportFragmentManager.beginTransaction() .add(R.id.fragment_container, PreferencesFragment()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt index cc693b826..09d6ce46f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt @@ -13,7 +13,6 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter import com.habitrpg.android.habitica.ui.helpers.bindView import io.reactivex.functions.Consumer -import kotlinx.android.synthetic.main.activity_prefs.* import javax.inject.Inject class SkillMemberActivity : BaseActivity() { @@ -36,7 +35,7 @@ class SkillMemberActivity : BaseActivity() { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(findViewById(R.id.toolbar)) loadMemberList() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt index a417f5b2b..795c005d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt @@ -18,7 +18,6 @@ import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment import com.habitrpg.android.habitica.ui.helpers.bindView import io.reactivex.functions.Consumer -import kotlinx.android.synthetic.main.activity_prefs.* import javax.inject.Inject import javax.inject.Named @@ -40,7 +39,7 @@ class SkillTasksActivity : BaseActivity() { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupToolbar(toolbar) + setupToolbar(findViewById(R.id.toolbar)) loadTaskLists() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt index f5512c9ab..1c13c57d4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt @@ -100,7 +100,7 @@ class BugFixFragment: BaseMainFragment() { activity?.let { val emailIntent = Intent(Intent.ACTION_SENDTO) val mailto = "mailto:" + appConfigManager.supportEmail() + - "&subject=" + Uri.encode(subject) + + "?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(bodyOfEmail) emailIntent.data = Uri.parse(mailto); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt index 3b43d6b69..384dab4ff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt @@ -118,7 +118,7 @@ class SupportMainFragment : BaseMainFragment() { activity?.let { val emailIntent = Intent(Intent.ACTION_SENDTO) val mailto = "mailto:" + appConfigManager.supportEmail() + - "&subject=" + Uri.encode(subject) + + "?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(bodyOfEmail) emailIntent.data = Uri.parse(mailto);