Skip to content

Commit

Permalink
ref: use coroutines in ProductPhotosFragment.kt
Browse files Browse the repository at this point in the history
ref: minor tweaks
  • Loading branch information
VaiTon committed Jun 6, 2021
1 parent 645c46b commit bb65483
Show file tree
Hide file tree
Showing 14 changed files with 488 additions and 395 deletions.

Large diffs are not rendered by default.

Expand Up @@ -9,6 +9,7 @@ import android.view.View
import android.view.WindowManager
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import androidx.core.content.pm.PackageInfoCompat
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
Expand All @@ -17,6 +18,7 @@ import androidx.recyclerview.widget.RecyclerView
import dagger.hilt.android.AndroidEntryPoint
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.analytics.SentryAnalytics
import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper
Expand All @@ -36,11 +38,10 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
private const val URL_CROWDIN = "https://crowdin.com/project/openfoodfacts"

fun newInstance(forceShow: Boolean): ChangelogDialog {
val args = Bundle().apply {
putBoolean(FORCE_SHOW_KEY, forceShow)
}
return ChangelogDialog().apply {
arguments = args
arguments = Bundle().apply {
putBoolean(FORCE_SHOW_KEY, forceShow)
}
}
}
}
Expand All @@ -54,9 +55,12 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
@Inject
lateinit var sharedPreferences: SharedPreferences

@Inject
lateinit var changelogService: ChangelogService

private lateinit var translationHelpLabel: TextView
private lateinit var recyclerView: RecyclerView
private val compositeDisposable = CompositeDisposable()
private val disp = CompositeDisposable()

override fun getTheme(): Int = R.style.OFFTheme_NoActionBar

Expand All @@ -73,7 +77,7 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
}

override fun onDestroyView() {
compositeDisposable.clear()
disp.clear()
super.onDestroyView()
}

Expand All @@ -84,7 +88,7 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
show(activity.supportFragmentManager, TAG)
} else {
try {
val lastVersionCode = getVersion()
val lastVersionCode = getSavedVersionCode()
val packageInfo = activity.packageManager.getPackageInfo(activity.packageName, 0)
val currentVersionCode = PackageInfoCompat.getLongVersionCode(packageInfo)
if (currentVersionCode >= 0 && currentVersionCode > lastVersionCode) {
Expand Down Expand Up @@ -122,26 +126,24 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
private fun setupRecyclerView() {
val layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
recyclerView.layoutManager = layoutManager
val changelogService = ChangelogService(requireContext(), localeManager)
compositeDisposable.add(
changelogService
.observeChangelog()
.map { changelog ->
val itemList = mutableListOf<ChangelogListItem>()
changelog.versions.forEach { version ->
itemList.add(ChangelogListItem.Header(version.name, version.date))
version.items.forEach { item ->
itemList.add(ChangelogListItem.Item("- $item"))
}
}
itemList
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ items -> recyclerView.adapter = ChangelogAdapter(items) },
{ throwable -> sentryAnalytics.record(throwable) }
)
)

changelogService
.observeChangelog()
.map { changelog ->
val itemList = mutableListOf<ChangelogListItem>()
changelog.versions.forEach { version ->
itemList.add(ChangelogListItem.Header(version.name, version.date))
version.items.forEach { item ->
itemList.add(ChangelogListItem.Item("- $item"))
}
}
itemList
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ items -> recyclerView.adapter = ChangelogAdapter(items) },
{ throwable -> sentryAnalytics.record(throwable) }
).addTo(disp)
}

private fun openDailyFoodFacts() {
Expand All @@ -150,23 +152,21 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) {
mayLaunchUrl(dailyFoodFactUri, null, null)
}
val customTabsIntent = CustomTabsHelper.getCustomTabsIntent(
requireActivity(),
customTabActivityHelper.session,
requireActivity(),
customTabActivityHelper.session,
)
CustomTabActivityHelper.openCustomTab(
requireActivity(),
customTabsIntent,
dailyFoodFactUri,
WebViewFallback()
requireActivity(),
customTabsIntent,
dailyFoodFactUri,
WebViewFallback()
)
}

private fun saveVersionCode(versionCode: Long) {
sharedPreferences
.edit()
.putLong(LAST_VERSION_CODE, versionCode)
.apply()
sharedPreferences.edit { putLong(LAST_VERSION_CODE, versionCode) }

}

private fun getVersion(): Long = sharedPreferences.getLong(LAST_VERSION_CODE, 0)
private fun getSavedVersionCode() = sharedPreferences.getLong(LAST_VERSION_CODE, 0)
}
Expand Up @@ -2,27 +2,32 @@ package openfoodfacts.github.scrachx.openfood.features.changelog

import android.content.Context
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import dagger.hilt.android.qualifiers.ApplicationContext
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers
import openfoodfacts.github.scrachx.openfood.models.Changelog
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import java.io.BufferedReader
import java.io.IOException
import javax.inject.Inject
import javax.inject.Singleton

class ChangelogService(
private val context: Context,
private val localeManager: LocaleManager
@Singleton
class ChangelogService @Inject constructor(
@ApplicationContext private val context: Context,
private val localeManager: LocaleManager
) {

companion object {
private const val FOLDER = "changelog/"
}

private var mapper: ObjectMapper = ObjectMapper()
private val mapper = ObjectMapper()

fun observeChangelog(): Single<Changelog> = Single
.fromCallable { parseJsonFile() }
.subscribeOn(Schedulers.io())
fun observeChangelog() = Single
.fromCallable { parseJsonFile() }
.subscribeOn(Schedulers.io())

@Throws(IOException::class)
private fun parseJsonFile(): Changelog {
Expand All @@ -32,7 +37,7 @@ class ChangelogService(
} else {
getJsonStringFromAsset("changelog.json")
}
return mapper.readValue(jsonString, Changelog::class.java)
return mapper.readValue(jsonString)
}

@Throws(IOException::class)
Expand All @@ -45,8 +50,7 @@ class ChangelogService(

@Throws(IOException::class)
private fun translationExists(fileName: String): Boolean {
val versions = context.assets.list(FOLDER)
return versions?.toList()?.contains(fileName) ?: false

val files = context.assets.list(FOLDER)
return files?.contains(fileName) ?: false
}
}
Expand Up @@ -228,9 +228,7 @@ class ProductCompareAdapter(
.flatMap { categoryName ->
if (categoryName.isNull) {
productRepository.getAdditiveByTagAndDefaultLanguageCode(tag)
} else {
Single.just(categoryName)
}
} else Single.just(categoryName)
}
}
.filter { it.isNotNull }
Expand Down
Expand Up @@ -5,7 +5,6 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
import androidx.lifecycle.switchMap
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.rx2.await
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
Expand All @@ -27,11 +26,10 @@ class ContributorsViewModel @Inject constructor(
val languageCode = localeManager.getLanguage()

try {
emit(tags.map { productRepository.getStatesByTagAndLanguageCode(it, languageCode).await() })
emit(tags.map { productRepository.getStatesByTagAndLanguageCode(it, languageCode) })
} catch (err: Throwable) {
emit(null)
}

}
}
}
Expand Up @@ -20,12 +20,9 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
import androidx.lifecycle.switchMap
import dagger.hilt.android.lifecycle.HiltViewModel
import io.reactivex.Single
import io.reactivex.disposables.CompositeDisposable
import kotlinx.coroutines.rx2.await
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName
import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenName
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import javax.inject.Inject
Expand All @@ -38,24 +35,21 @@ class ProductIngredientsViewModel @Inject constructor(
private val productRepository: ProductRepository,
private val localeManager: LocaleManager
) : ViewModel() {
private val disp = CompositeDisposable()

val product = MutableLiveData<Product>()

val additives = product.switchMap { product ->
liveData {
liveData<List<AdditiveName>> {
val additivesTags = product.additivesTags
if (additivesTags.isEmpty()) {
emit(emptyList<AdditiveName>())
emit(emptyList())
} else {
val languageCode = localeManager.getLanguage()

additivesTags.map { tag ->
productRepository.getAdditiveByTagAndLanguageCode(tag, languageCode).flatMap { categoryName ->
if (categoryName.isNull) {
productRepository.getAdditiveByTagAndDefaultLanguageCode(tag)
} else Single.just(categoryName)
}.await()
productRepository.getAdditiveByTagAndLanguageCode(tag, languageCode).await()
.takeUnless { it.isNull }
?: productRepository.getAdditiveByTagAndDefaultLanguageCode(tag).await()
}.filter { it.isNotNull }.let { emit(it) }
}
}
Expand All @@ -65,17 +59,16 @@ class ProductIngredientsViewModel @Inject constructor(
liveData {
val allergenTags = product.allergensTags
if (allergenTags.isEmpty()) {
emit(emptyList<AllergenName>())
} else {
val languageCode = localeManager.getLanguage()
allergenTags.map { tag ->
productRepository.getAllergenByTagAndLanguageCode(tag, languageCode).flatMap { allergenName: AllergenName ->
if (allergenName.isNull) {
productRepository.getAllergenByTagAndDefaultLanguageCode(tag)
} else Single.just(allergenName)
}.await()
}.let { emit(it) }
emit(emptyList())
return@liveData
}

val languageCode = localeManager.getLanguage()
allergenTags.map { tag ->
productRepository.getAllergenByTagAndLanguageCode(tag, languageCode)
.takeUnless { it.isNull }
?: productRepository.getAllergenByTagAndDefaultLanguageCode(tag)
}.filter { it.isNotNull }.let { emit(it) }
}
}

Expand Down
@@ -1,6 +1,5 @@
package openfoodfacts.github.scrachx.openfood.features.product.view.photos

import android.content.Context
import android.util.Log
import android.view.View
import android.widget.Button
Expand All @@ -13,23 +12,24 @@ import openfoodfacts.github.scrachx.openfood.images.getImageUrl

class ProductPhotoViewHolder(itemView: View, private val picasso: Picasso) : RecyclerView.ViewHolder(itemView) {
private val editBtn: Button = itemView.findViewById(R.id.buttonOptions)
private val image: ImageView = itemView.findViewById(R.id.img)
private val imageView: ImageView = itemView.findViewById(R.id.img)

fun setImage(imageName: String, barcode: String, context: Context) {
fun setImage(barcode: String, imageName: String) {
val finalUrlString = getImageUrl(barcode, imageName, IMAGE_EDIT_SIZE_FILE)
Log.d(LOG_TAG, "Loading image $finalUrlString...")
picasso
.load(finalUrlString)
.resize(400, 400)
.centerInside()
.into(image)
picasso.load(finalUrlString)
.resize(400, 400)
.centerInside()
.into(imageView)
}

fun setOnImageListener(listener: (Int) -> Unit) = image.setOnClickListener { listener(adapterPosition) }
fun setOnImageClickListener(listener: (Int) -> Unit) =
imageView.setOnClickListener { listener(bindingAdapterPosition) }

fun setOnEditListener(listener: (Int) -> Unit) = editBtn.setOnClickListener { listener(adapterPosition) }
fun setOnEditClickListener(listener: (Int) -> Unit) =
editBtn.setOnClickListener { listener(bindingAdapterPosition) }

companion object {
private val LOG_TAG = this::class.simpleName!!
private val LOG_TAG = ProductPhotoViewHolder::class.simpleName!!
}
}

0 comments on commit bb65483

Please sign in to comment.