Skip to content

Commit

Permalink
Update question form
Browse files Browse the repository at this point in the history
  • Loading branch information
Hafizzle committed Jul 11, 2023
1 parent f5159e1 commit 6f40e63
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 2 deletions.
1 change: 1 addition & 0 deletions Habitica/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,7 @@
<string name="new_reminder">New reminder</string>
<string name="streak">Streak</string>
<string name="update_available">Update available: %1$s (%2$d)</string>
<string name="need_help_description">You can contact us and a member of our team will do their best to help!</string>
<string name="need_help_header_description">Post a message in the %s to have your questions answered by a fellow player.</string>
<string name="need_more_help">Need more help?</string>
<string name="become_x">Become a %s</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.habitrpg.android.habitica.ui.fragments.support

import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
Expand All @@ -20,21 +28,32 @@ import com.habitrpg.android.habitica.databinding.SupportFaqItemBinding
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.UsernameLabel
import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.helpers.AppTestingLevel
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.helpers.setMarkdown
import com.habitrpg.common.habitica.models.PlayerTier
import com.jaredrummler.android.device.DeviceName
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject

@AndroidEntryPoint
class FAQOverviewFragment : BaseMainFragment<FragmentFaqOverviewBinding>() {

private var deviceInfo: DeviceName.DeviceInfo? = null
override var binding: FragmentFaqOverviewBinding? = null

@Inject
lateinit var appConfigManager: AppConfigManager
@Inject
lateinit var userViewModel: MainUserViewModel

override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFaqOverviewBinding {
return FragmentFaqOverviewBinding.inflate(inflater, container, false)
}
Expand All @@ -44,6 +63,25 @@ class FAQOverviewFragment : BaseMainFragment<FragmentFaqOverviewBinding>() {
@Inject
lateinit var configManager: AppConfigManager

private val versionName: String by lazy {
try {
mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionName
?: ""
} catch (e: PackageManager.NameNotFoundException) {
""
}
}

private val versionCode: Int by lazy {
try {
@Suppress("DEPRECATION")
mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionCode
?: 0
} catch (e: PackageManager.NameNotFoundException) {
0
}
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -62,6 +100,12 @@ class FAQOverviewFragment : BaseMainFragment<FragmentFaqOverviewBinding>() {
binding?.npcHeader?.namePlate?.setText(R.string.tavern_owner)
binding?.npcHeader?.descriptionView?.isVisible = false

lifecycleScope.launch(ExceptionHandler.coroutine()) {
DeviceName.with(context).request { info, _ ->
deviceInfo = info
}
}

binding?.healthSection?.findViewById<ImageView>(R.id.icon_view)?.setImageBitmap(
HabiticaIconsHelper.imageOfHeartLarge()
)
Expand All @@ -87,8 +131,23 @@ class FAQOverviewFragment : BaseMainFragment<FragmentFaqOverviewBinding>() {
binding?.contribTierSection?.findViewById<ImageView>(R.id.icon_view)?.setImageResource(R.drawable.contributor_icon)
addPlayerTiers()

binding?.moreHelpTextView?.setMarkdown(context?.getString(R.string.need_help_header_description, "[Habitica Help Guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)"))
binding?.moreHelpTextView?.setOnClickListener { MainNavigationController.navigate(R.id.guildFragment, bundleOf("groupID" to "5481ccf3-5d2d-48a9-a871-70a7380cee5a")) }
val fullText = getString(R.string.need_help_description)
val clickableText = "contact us"
val spannableString = SpannableStringBuilder(fullText)
val clickableSpan = object : ClickableSpan() {
override fun onClick(textView: View) {
sendEmail("[Android] Question")
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
}
val startIndex = fullText.indexOf(clickableText)
val endIndex = startIndex + clickableText.length
spannableString.setSpan(clickableSpan, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

binding?.moreHelpTextView?.text = spannableString
binding?.moreHelpTextView?.movementMethod = LinkMovementMethod.getInstance()

this.loadArticles()
Expand Down Expand Up @@ -122,6 +181,56 @@ class FAQOverviewFragment : BaseMainFragment<FragmentFaqOverviewBinding>() {
}
}

private fun sendEmail(subject: String) {
val version = Build.VERSION.SDK_INT
val deviceName = deviceInfo?.name ?: DeviceName.getDeviceName()
val manufacturer = deviceInfo?.manufacturer ?: Build.MANUFACTURER
val newLine = "%0D%0A"
var bodyOfEmail = Uri.encode("Device: $manufacturer $deviceName") +
newLine + Uri.encode("Android Version: $version") +
newLine + Uri.encode("AppVersion: " + getString(
R.string.version_info,
versionName,
versionCode
)
)

if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) {
bodyOfEmail += " " + Uri.encode(appConfigManager.testingLevel().name)
}
bodyOfEmail += newLine + Uri.encode("User ID: ${userViewModel.userID}")

userViewModel.user.value?.let { user ->
bodyOfEmail += newLine + Uri.encode("Level: " + (user.stats?.lvl ?: 0)) +
newLine + Uri.encode(
"Class: " + (
if (user.preferences?.disableClasses == true) "Disabled" else (
user.stats?.habitClass
?: "None"
)
)
) +
newLine + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) +
newLine + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) +
newLine + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) +
newLine + Uri.encode(
"Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0)
)
}

bodyOfEmail += "%0D%0ADetails:%0D%0A%0D%0A"

mainActivity?.let {
val emailIntent = Intent(Intent.ACTION_SENDTO)
val mailto = "mailto:" + appConfigManager.supportEmail() +
"?subject=" + Uri.encode(subject) +
"&body=" + bodyOfEmail
emailIntent.data = Uri.parse(mailto)

startActivity(Intent.createChooser(emailIntent, "Choose an Email client:"))
}
}

private fun addPlayerTiers() {
val tiers = PlayerTier.getTiers()
for (tier in tiers) {
Expand Down

0 comments on commit 6f40e63

Please sign in to comment.