/
AdditiveFragmentHelper.kt
125 lines (116 loc) 路 5.34 KB
/
AdditiveFragmentHelper.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package openfoodfacts.github.scrachx.openfood.features.additives
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.DynamicDrawableSpan
import android.text.style.ImageSpan
import android.view.View
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.text.bold
import androidx.core.text.color
import androidx.core.text.inSpans
import androidx.fragment.app.FragmentActivity
import com.fasterxml.jackson.databind.JsonNode
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.features.search.ProductSearchActivity
import openfoodfacts.github.scrachx.openfood.features.shared.BaseFragment
import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName
import openfoodfacts.github.scrachx.openfood.network.WikiDataApiClient
import openfoodfacts.github.scrachx.openfood.utils.SearchType
import openfoodfacts.github.scrachx.openfood.utils.showBottomSheet
/**
* Helper class for additive fragment
*/
object AdditiveFragmentHelper {
/**
* Show names of all additives on the TextView
*
* @param additives list of additive names
* @param additivesView TextView which displays additive names
* @param apiClientForWikiData object of WikidataApiClient
*/
@JvmStatic
fun showAdditives(
additives: List<AdditiveName>,
additivesView: TextView,
apiClientForWikiData: WikiDataApiClient,
fragment: BaseFragment,
compositeDisposable: CompositeDisposable
) = additivesView.run {
movementMethod = LinkMovementMethod.getInstance()
isClickable = true
text = SpannableStringBuilder()
.bold { append(fragment.getString(R.string.txtAdditives)) }
.apply {
additives.forEach {
append("\n")
append(getAdditiveTag(it,
apiClientForWikiData,
fragment,
compositeDisposable))
}
}
}
/**
* Returns additive tag from additive name using WikidataApiClient
*
* @param additive name of the additive
* @param apiClientForWikiData object of WikidataApiClient
* @param fragment holds a reference to the calling fragment
*/
private fun getAdditiveTag(additive: AdditiveName,
apiClientForWikiData: WikiDataApiClient,
fragment: BaseFragment,
compositeDisposable: CompositeDisposable): CharSequence {
val activity = fragment.requireActivity()
val clickableSpan = object : ClickableSpan() {
override fun onClick(view: View) {
if (additive.isWikiDataIdPresent) {
apiClientForWikiData.doSomeThing(additive.wikiDataId).subscribe { result ->
getOnWikiResponse(activity, additive)(result)
}.addTo(compositeDisposable)
} else {
onWikiNoResponse(additive, activity)
}
}
}
return SpannableStringBuilder().also {
it.inSpans(clickableSpan) { append(additive.name) }
// if the additive has an overexposure risk ("high" or "moderate") then append the warning message to it
if (additive.hasOverexposureData()) {
val isHighRisk = additive.overexposureRisk.equals("high", true)
val riskIcon = (
if (isHighRisk) ContextCompat.getDrawable(activity, R.drawable.ic_additive_high_risk)
else ContextCompat.getDrawable(activity, R.drawable.ic_additive_moderate_risk)
)?.apply {
setBounds(0, 0, this.intrinsicWidth, this.intrinsicHeight)
}!!
val riskWarningStr =
if (isHighRisk) fragment.getString(R.string.overexposure_high)
else fragment.getString(R.string.overexposure_moderate)
val riskWarningColor =
if (isHighRisk) ContextCompat.getColor(activity, R.color.overexposure_high)
else ContextCompat.getColor(activity, R.color.overexposure_moderate)
it.append(" ")
it.inSpans(ImageSpan(riskIcon, DynamicDrawableSpan.ALIGN_BOTTOM)) { it.append("-") }
it.append(" ")
it.color(riskWarningColor) { append(riskWarningStr) }
}
}
}
private fun onWikiNoResponse(additive: AdditiveName, activity: FragmentActivity) {
if (additive.hasOverexposureData() && !activity.isFinishing) {
showBottomSheet(null, additive, activity.supportFragmentManager)
} else {
ProductSearchActivity.start(activity, SearchType.ADDITIVE, additive.additiveTag, additive.name)
}
}
private fun getOnWikiResponse(activity: FragmentActivity, additive: AdditiveName) = { result: JsonNode ->
if (!activity.isFinishing) {
showBottomSheet(result, additive, activity.supportFragmentManager)
}
}
}