/
EnvironmentProductFragment.kt
248 lines (212 loc) 路 9.93 KB
/
EnvironmentProductFragment.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
package openfoodfacts.github.scrachx.openfood.features.product.view.environment
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.text.HtmlCompat
import androidx.core.text.HtmlCompat.FROM_HTML_MODE_COMPACT
import androidx.core.text.bold
import com.squareup.picasso.Picasso
import dagger.hilt.android.AndroidEntryPoint
import io.reactivex.rxkotlin.addTo
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.databinding.FragmentEnvironmentProductBinding
import openfoodfacts.github.scrachx.openfood.features.FullScreenActivityOpener
import openfoodfacts.github.scrachx.openfood.features.ImagesManageActivity
import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditActivity
import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditActivity.Companion.KEY_STATE
import openfoodfacts.github.scrachx.openfood.features.product.view.ProductViewActivity
import openfoodfacts.github.scrachx.openfood.features.shared.BaseFragment
import openfoodfacts.github.scrachx.openfood.images.ProductImage
import openfoodfacts.github.scrachx.openfood.models.Nutriments
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.ProductState
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient
import openfoodfacts.github.scrachx.openfood.utils.*
import java.io.File
import javax.inject.Inject
@AndroidEntryPoint
class EnvironmentProductFragment : BaseFragment() {
private lateinit var productState: ProductState
@Inject
lateinit var client: OpenFoodAPIClient
@Inject
lateinit var picasso: Picasso
private var _binding: FragmentEnvironmentProductBinding? = null
private val binding get() = _binding!!
private lateinit var product: Product
/**
* boolean to determine if image should be loaded or not
*/
private var isLowBatteryMode = false
private var mUrlImage: String? = null
private val photoReceiverHandler by lazy {
PhotoReceiverHandler(requireContext()) { loadPackagingPhoto(it) }
}
/**boolean to determine if labels prompt should be shown*/
private var showLabelsPrompt = false
/**boolean to determine if origins prompt should be shown*/
private var showOriginsPrompt = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentEnvironmentProductBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val langCode = LocaleHelper.getLanguage(context)
productState = requireProductState()
binding.imageViewPackaging.setOnClickListener { openFullScreen() }
// If Battery Level is low and the user has checked the Disable Image in Preferences , then set isLowBatteryMode to true
if (requireContext().isDisableImageLoad() && requireContext().isBatteryLevelLow()) {
isLowBatteryMode = true
}
product = productState.product!!
val nutriments = product.nutriments
val imagePackagingUrl = product.getImagePackagingUrl(langCode)
if (!imagePackagingUrl.isNullOrBlank()) {
binding.packagingImagetipBox.setTipMessage(getString(R.string.onboarding_hint_msg, getString(R.string.image_edit_tip)))
binding.packagingImagetipBox.loadToolTip()
binding.addPhotoLabel.visibility = View.GONE
// Load Image if isLowBatteryMode is false
if (!isLowBatteryMode) {
picasso.load(imagePackagingUrl).into(binding.imageViewPackaging)
} else {
binding.imageViewPackaging.visibility = View.GONE
}
mUrlImage = imagePackagingUrl
}
val carbonFootprintNutriment = nutriments[Nutriments.CARBON_FOOTPRINT]
if (carbonFootprintNutriment != null) {
binding.textCarbonFootprint.text = SpannableStringBuilder()
.bold { append(getString(R.string.textCarbonFootprint)) }
.append(carbonFootprintNutriment.for100gInUnits)
.append(carbonFootprintNutriment.unit)
} else {
binding.carbonFootprintCv.visibility = View.GONE
}
val environmentInfoCard = product.environmentInfoCard
if (!environmentInfoCard.isNullOrEmpty()) {
binding.environmentInfoText.append(HtmlCompat.fromHtml(environmentInfoCard, FROM_HTML_MODE_COMPACT))
binding.environmentInfoText.movementMethod = LinkMovementMethod.getInstance()
} else {
binding.environmentInfoCv.visibility = View.GONE
}
val packaging = product.packaging
if (!packaging.isNullOrEmpty()) {
binding.packagingText.text = SpannableStringBuilder()
.bold { append(getString(R.string.packaging_environmentTab)) }
.append(" ")
.append(packaging.replace(",", ", "))
} else {
binding.packagingCv.visibility = View.GONE
}
val recyclingInstructionsToDiscard = product.recyclingInstructionsToDiscard
if (!recyclingInstructionsToDiscard.isNullOrEmpty()) {
// TODO: 02/03/2021 i18n
binding.recyclingInstructionToDiscard.text = SpannableStringBuilder()
.bold { append("Recycling instructions - To discard: ") }
.append(recyclingInstructionsToDiscard)
} else {
binding.recyclingInstructionsDiscardCv.visibility = View.GONE
}
val recyclingInstructionsToRecycle = product.recyclingInstructionsToRecycle
if (!recyclingInstructionsToRecycle.isNullOrEmpty()) {
// TODO: 02/03/2021 i18n
binding.recyclingInstructionToRecycle.text = SpannableStringBuilder()
.bold { append("Recycling instructions - To recycle: ") }
.append(recyclingInstructionsToRecycle)
} else {
binding.recyclingInstructionsRecycleCv.visibility = View.GONE
}
refreshView(productState)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun refreshView(productState: ProductState) {
super.refreshView(productState)
this.productState = productState
refreshTagsPrompt()
}
private fun openFullScreen() {
if (mUrlImage != null && productState.product != null) {
FullScreenActivityOpener.openForUrl(
this,
client,
productState.product!!,
ProductImageField.PACKAGING,
mUrlImage,
binding.imageViewPackaging,
)
} else {
newPackagingImage()
}
}
private fun newPackagingImage() {
doChooseOrTakePhotos()
}
private fun loadPackagingPhoto(photoFile: File) {
// Create a new instance of ProductImage so we can load to server
val image = ProductImage(productState.product!!.code, ProductImageField.PACKAGING, photoFile, LocaleHelper.getLanguage(context))
image.filePath = photoFile.absolutePath
// Load to server
client.postImg(image).subscribe().addTo(disp)
// Load into view
binding.addPhotoLabel.visibility = View.GONE
mUrlImage = photoFile.absolutePath
picasso
.load(photoFile)
.fit()
.into(binding.imageViewPackaging)
}
//checks the product states_tags to determine which prompt to be shown
private fun refreshTagsPrompt() {
val statesTags = product.statesTags
showLabelsPrompt = ApiFields.StateTags.LABELS_TO_BE_COMPLETED in statesTags
showOriginsPrompt = ApiFields.StateTags.ORIGINS_TO_BE_COMPLETED in statesTags
binding.addLabelOriginPrompt.visibility = View.VISIBLE
when {
showLabelsPrompt && showOriginsPrompt -> {
binding.addLabelOriginPrompt.text = getString(R.string.add_labels_origins_prompt_text)
}
showLabelsPrompt -> {
binding.addLabelOriginPrompt.text = getString(R.string.add_labels_prompt_text)
}
showOriginsPrompt -> {
binding.addLabelOriginPrompt.text = getString(R.string.add_origins_prompt_text)
}
else -> binding.addLabelOriginPrompt.visibility = View.GONE
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// TODO: 15/11/2020 find a way to use ActivityResultApi
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data)
if (requestCode == EDIT_PRODUCT_AFTER_LOGIN_REQUEST_CODE && resultCode == Activity.RESULT_OK && requireActivity().isUserSet()) {
startEditProduct()
}
if (ImagesManageActivity.isImageModified(requestCode, resultCode)) {
(activity as? ProductViewActivity)?.onRefresh()
}
}
private fun startEditProduct() {
startActivity(Intent(activity, ProductEditActivity::class.java).apply {
putExtra(ProductEditActivity.KEY_EDIT_PRODUCT, productState.product)
})
}
companion object {
fun newInstance(productState: ProductState) = EnvironmentProductFragment().apply {
arguments = Bundle().apply {
putSerializable(KEY_STATE, productState)
}
}
private const val EDIT_PRODUCT_AFTER_LOGIN_REQUEST_CODE = 1
}
}