Skip to content

Commit

Permalink
fix: bold labels in SummaryProductFragment.kt,
Browse files Browse the repository at this point in the history
ref: use androidx instead of custom methods
fix: bold allergens in ingredients list
ref: deduplicate
  • Loading branch information
VaiTon committed Apr 3, 2021
1 parent 029ccfd commit b11db2c
Show file tree
Hide file tree
Showing 26 changed files with 360 additions and 361 deletions.
Expand Up @@ -116,7 +116,6 @@ class HomeFragment : NavigationBaseFragment() {
}

productsApi.signIn(login, password, "Sign-in")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError { Log.e(LOG_TAG, "Cannot check user credentials.", it) }
.subscribe { response ->
Expand All @@ -126,8 +125,7 @@ class HomeFragment : NavigationBaseFragment() {
Log.e(LOG_TAG, "I/O Exception while checking user saved credentials.", e)
return@subscribe
}
if (htmlBody.contains("Incorrect user name or password.")
|| htmlBody.contains("See you soon!")) {
if (LoginActivity.isHtmlNotValid(htmlBody)) {
Log.w(LOG_TAG, "Cannot validate login, deleting saved credentials and asking the user to log back in.")
settings.edit {
putString("user", "")
Expand Down
Expand Up @@ -28,7 +28,7 @@ import androidx.activity.result.contract.ActivityResultContract
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
import io.reactivex.android.schedulers.AndroidSchedulers
Expand Down Expand Up @@ -99,15 +99,14 @@ class LoginActivity : BaseActivity() {
binding.passInput.error = getString(R.string.error_field_required)
binding.passInput.requestFocus()
return
}
if (password.length < 6) {
} else if (password.length < 6) {
binding.passInput.error = getText(R.string.error_invalid_password)
binding.passInput.requestFocus()
return
}
// End checks

val snackbar = Snackbar.make(binding.loginLinearlayout, R.string.toast_retrieving, BaseTransientBottomBar.LENGTH_LONG)
val snackbar = Snackbar.make(binding.loginLinearlayout, R.string.toast_retrieving, LENGTH_LONG)
.apply { show() }
binding.btnLogin.isClickable = false

Expand All @@ -129,10 +128,8 @@ class LoginActivity : BaseActivity() {
return@subscribe
}
val pref = this@LoginActivity.getSharedPreferences("login", 0)
if (htmlNoParsed == null
|| htmlNoParsed.contains("Incorrect user name or password.")
|| htmlNoParsed.contains("See you soon!")) {
Snackbar.make(binding.loginLinearlayout, R.string.errorLogin, BaseTransientBottomBar.LENGTH_LONG).show()
if (isHtmlNotValid(htmlNoParsed)) {
Snackbar.make(binding.loginLinearlayout, R.string.errorLogin, LENGTH_LONG).show()
binding.passInput.setText("")
binding.txtInfoLogin.setTextColor(ContextCompat.getColor(this, R.color.red))
binding.txtInfoLogin.setText(R.string.txtInfoLoginNo)
Expand All @@ -151,7 +148,7 @@ class LoginActivity : BaseActivity() {
break
}
}
Snackbar.make(binding.loginLinearlayout, R.string.connection, BaseTransientBottomBar.LENGTH_LONG).show()
Snackbar.make(binding.loginLinearlayout, R.string.connection, LENGTH_LONG).show()
pref.edit {
putString("user", login)
putString("pass", password)
Expand Down Expand Up @@ -248,5 +245,9 @@ class LoginActivity : BaseActivity() {

override fun parseResult(resultCode: Int, intent: Intent?) = resultCode == RESULT_OK
}

internal fun isHtmlNotValid(html: String?) = (html == null
|| html.contains("Incorrect user name or password.")
|| html.contains("See you soon!"))
}
}
@@ -1,15 +1,16 @@
package openfoodfacts.github.scrachx.openfood.features.additives

import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.DynamicDrawableSpan
import android.text.style.ForegroundColorSpan
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
Expand All @@ -20,7 +21,6 @@ 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.bold
import openfoodfacts.github.scrachx.openfood.utils.showBottomSheet

/**
Expand All @@ -31,28 +31,30 @@ object AdditiveFragmentHelper {
* Show names of all additives on the TextView
*
* @param additives list of additive names
* @param additiveProduct TextView which displays additive names
* @param additivesView TextView which displays additive names
* @param apiClientForWikiData object of WikidataApiClient
*/
@JvmStatic
fun showAdditives(
additives: List<AdditiveName>,
additiveProduct: TextView,
additivesView: TextView,
apiClientForWikiData: WikiDataApiClient,
fragment: BaseFragment,
compositeDisposable: CompositeDisposable
) = additiveProduct.run {
text = bold(fragment.getString(R.string.txtAdditives))
) = additivesView.run {
movementMethod = LinkMovementMethod.getInstance()
append(" ")
append("\n")
isClickable = true
movementMethod = LinkMovementMethod.getInstance()
additives.dropLast(1).forEach {
append(getAdditiveTag(it, apiClientForWikiData, fragment, compositeDisposable))
append("\n")
}
append(getAdditiveTag(additives.last(), apiClientForWikiData, fragment, compositeDisposable))
text = SpannableStringBuilder()
.bold { append(fragment.getString(R.string.txtAdditives)) }
.apply {
additives.forEach {
append("\n")
append(getAdditiveTag(it,
apiClientForWikiData,
fragment,
compositeDisposable))
}
}
}

/**
Expand All @@ -62,7 +64,10 @@ object AdditiveFragmentHelper {
* @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 {
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) {
Expand All @@ -77,30 +82,29 @@ object AdditiveFragmentHelper {
}

return SpannableStringBuilder().also {
it.append(additive.name)
it.setSpan(clickableSpan, 0, it.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
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", ignoreCase = true)
val isHighRisk = additive.overexposureRisk.equals("high", true)

val riskIcon =
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)

riskIcon!!.setBounds(0, 0, riskIcon.intrinsicWidth, riskIcon.intrinsicHeight)
val iconSpan = ImageSpan(riskIcon, DynamicDrawableSpan.ALIGN_BOTTOM)
it.append(" - ") // this will be replaced with the risk icon
it.setSpan(iconSpan, it.length - 2, it.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
it.append(riskWarningStr)
it.setSpan(ForegroundColorSpan(riskWarningColor), it.length - riskWarningStr.length, it.length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
it.append(" ")
it.inSpans(ImageSpan(riskIcon, DynamicDrawableSpan.ALIGN_BOTTOM)) { it.append("-") }
it.append(" ")
it.color(riskWarningColor) { append(riskWarningStr) }
}
}
}
Expand Down
Expand Up @@ -19,6 +19,7 @@ import android.Manifest.permission
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Build
import android.text.SpannableStringBuilder
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
Expand All @@ -29,6 +30,7 @@ import android.widget.TextView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.text.bold
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog
Expand Down Expand Up @@ -148,15 +150,19 @@ class ProductCompareAdapter(

// Quantity
if (!product.quantity.isNullOrBlank()) {
holder.binding.productComparisonQuantity.text = "${bold(activity.getString(R.string.compare_quantity))} ${product.quantity}"
holder.binding.productComparisonQuantity.text = "${
SpannableStringBuilder()
.bold { append(activity.getString(R.string.compare_quantity)) }
} ${product.quantity}"
} else {
holder.binding.productComparisonQuantity.visibility = View.INVISIBLE
}

// Brands
val brands = product.brands
if (!brands.isNullOrBlank()) {
holder.binding.productComparisonBrand.text = bold(activity.getString(R.string.compare_brands))
holder.binding.productComparisonBrand.text = SpannableStringBuilder()
.bold { append(activity.getString(R.string.compare_brands)) }
holder.binding.productComparisonBrand.append(" ")
val brandsList = brands.split(",")
brandsList.dropLast(1).forEach { brand ->
Expand Down Expand Up @@ -237,7 +243,8 @@ class ProductCompareAdapter(
.doOnError { Log.e(ProductCompareAdapter::class.simpleName, "loadAdditives", it) }
.subscribe { additives ->
if (additives.isNotEmpty()) {
val additivesBuilder = StringBuilder(bold(activity.getString(R.string.compare_additives)))
val additivesBuilder = StringBuilder(SpannableStringBuilder()
.bold { append(activity.getString(R.string.compare_additives)) })
.append(" ").append("\n")
additives.dropLast(1).forEach { additive ->
additivesBuilder.append(additive.name).append("\n")
Expand Down
@@ -1,24 +1,20 @@
package openfoodfacts.github.scrachx.openfood.features.product

import androidx.annotation.StringRes
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import openfoodfacts.github.scrachx.openfood.features.shared.BaseFragment
import openfoodfacts.github.scrachx.openfood.models.ProductState

class ProductFragmentPagerAdapter(private val fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
class ProductFragmentPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
private val fragments = mutableListOf<BaseFragment>()
private val tabsTitles = mutableListOf<String>()

fun add(fragment: BaseFragment, tabTitle: String) {
fragments.add(fragment)
tabsTitles.add(tabTitle)
operator fun plusAssign(entry: Pair<BaseFragment, String>) {
fragments += entry.first
tabsTitles += entry.second
}

fun add(fragment: BaseFragment, @StringRes tabTitleRes: Int) {
fragments.add(fragment)
tabsTitles.add(fragmentActivity.getString(tabTitleRes))
}
fun add(entry: Pair<BaseFragment, String>) = plusAssign(entry)

override fun createFragment(i: Int) = fragments[i]

Expand Down
Expand Up @@ -233,25 +233,26 @@ class ProductEditActivity : AppCompatActivity() {

private fun setupViewPager(viewPager: ViewPager2) {
// Initialize fragments
val adapterResult = ProductFragmentPagerAdapter(this)
fragmentsBundle.putSerializable("product", mProduct)

editOverviewFragment.arguments = fragmentsBundle
ingredientsFragment.arguments = fragmentsBundle

adapterResult.add(editOverviewFragment, R.string.overview)
adapterResult.add(ingredientsFragment, R.string.ingredients)
val adapterResult = ProductFragmentPagerAdapter(this).apply {
this += editOverviewFragment to getString(R.string.overview)
this += ingredientsFragment to getString(R.string.ingredients)
}

// If on off or opff, add Nutrition Facts fragment
when {
isFlavors(OFF, OPFF) -> {
nutritionFactsFragment.arguments = fragmentsBundle
adapterResult.add(nutritionFactsFragment, R.string.nutrition_facts)
adapterResult += nutritionFactsFragment to getString(R.string.nutrition_facts)
}
isFlavors(OBF, OPF) -> {
binding.textNutritionFactsIndicator.setText(R.string.photos)
addProductPhotosFragment.arguments = fragmentsBundle
adapterResult.add(addProductPhotosFragment, R.string.photos)
adapterResult += addProductPhotosFragment to getString(R.string.photos)
}
}

Expand Down

0 comments on commit b11db2c

Please sign in to comment.