Skip to content

Commit

Permalink
refactor(hilt): convert util classes to hilt services (#4520)
Browse files Browse the repository at this point in the history
* chore(hilt): convert PreferencesManager.kt to hilt DI

* chore(hilt): convert InstallationUtils to a hilt service

* chore(hilt): convert PhotoReceiverHandler to hilt service

refactor: use helper method to create Intent in kotlin style

* fix: compile error
  • Loading branch information
VaiTon committed Mar 13, 2022
1 parent 0c048a3 commit 6e46cc3
Show file tree
Hide file tree
Showing 20 changed files with 279 additions and 239 deletions.
Expand Up @@ -7,7 +7,7 @@ import androidx.preference.PreferenceManager
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import openfoodfacts.github.scrachx.openfood.utils.PrefManager
import openfoodfacts.github.scrachx.openfood.utils.PreferencesManager
import org.apache.commons.lang3.StringUtils
import org.junit.Assert

Expand All @@ -28,7 +28,7 @@ class ScreenshotActivityTestRule<T : Activity?>
override fun beforeActivityLaunched() {
try {
runOnUiThread {
PrefManager(context).isFirstTimeLaunch = firstTimeLaunched
PreferencesManager(context).isFirstTimeLaunch = firstTimeLaunched
localeManager.saveLanguageToPrefs(
InstrumentationRegistry.getInstrumentation().targetContext,
screenshotParameter!!.locale,
Expand Down
Expand Up @@ -142,6 +142,9 @@ class MainActivity : BaseActivity(), NavigationDrawerListener {
@Inject
lateinit var localeManager: LocaleManager

@Inject
lateinit var prefManager: PreferencesService

private val contributeUri: Uri by lazy { Uri.parse(getString(R.string.website_contribute)) }
private val discoverUri: Uri by lazy { Uri.parse(getString(R.string.website_discover)) }
private fun getUserContributeUri(): Uri = Uri.parse(getString(R.string.website_contributor) + getUserLogin())
Expand All @@ -153,7 +156,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener {
private lateinit var customTabActivityHelper: CustomTabActivityHelper
private lateinit var drawerResult: Drawer
private lateinit var headerResult: AccountHeader
private val prefManager: PrefManager by lazy { PrefManager(this) }


private var searchMenuItem: MenuItem? = null
private var userSettingsURI: Uri? = null
Expand Down
Expand Up @@ -32,13 +32,18 @@ import openfoodfacts.github.scrachx.openfood.listeners.CommonBottomListenerInsta
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.Intent
import openfoodfacts.github.scrachx.openfood.utils.PhotoReceiverHandler
import openfoodfacts.github.scrachx.openfood.utils.isHardwareCameraInstalled
import javax.inject.Inject

@AndroidEntryPoint
class ProductCompareActivity : BaseActivity() {

private lateinit var binding: ActivityProductComparisonBinding

private val viewModel: ProductCompareViewModel by viewModels()

@Inject
lateinit var client: ProductRepository

Expand All @@ -51,10 +56,8 @@ class ProductCompareActivity : BaseActivity() {
@Inject
lateinit var productViewActivityStarter: ProductViewActivityStarter

private lateinit var binding: ActivityProductComparisonBinding
private lateinit var photoReceiverHandler: PhotoReceiverHandler

private val viewModel: ProductCompareViewModel by viewModels()
@Inject
lateinit var photoReceiverHandler: PhotoReceiverHandler

private val scanProductContract = registerForActivityResult(SimpleScanActivityContract()) { barcode ->
barcode?.let { viewModel.barcodeDetected(it) }
Expand All @@ -75,36 +78,35 @@ class ProductCompareActivity : BaseActivity() {
}

lifecycleScope.launch {
viewModel.sideEffectFlow
.flowWithLifecycle(lifecycle)
.collect {
when (it) {
is SideEffect.ProductAlreadyAdded -> showProductAlreadyAddedDialog()
is SideEffect.ProductNotFound -> showProductNotFoundDialog()
is SideEffect.ConnectionError -> showConnectionErrorDialog()
launch {
viewModel.sideEffectFlow
.flowWithLifecycle(lifecycle)
.collect {
when (it) {
is SideEffect.ProductAlreadyAdded -> showProductAlreadyAddedDialog()
is SideEffect.ProductNotFound -> showProductNotFoundDialog()
is SideEffect.ConnectionError -> showConnectionErrorDialog()
}
}
}
}
lifecycleScope.launch {
viewModel.productsFlow
.flowWithLifecycle(lifecycle)
.distinctUntilChanged()
.collect { products ->
createAdapter(products)
}
}
lifecycleScope.launch {
viewModel.loadingVisibleFlow
.flowWithLifecycle(lifecycle)
.distinctUntilChanged()
.collect {
binding.comparisonProgressView.isVisible = it
}
}
launch {
viewModel.productsFlow
.flowWithLifecycle(lifecycle)
.distinctUntilChanged()
.collect { createAdapter(it) }
}
launch {
viewModel.loadingVisibleFlow
.flowWithLifecycle(lifecycle)
.distinctUntilChanged()
.collect {
binding.comparisonProgressView.isVisible = it
}
}
}

binding.productComparisonButton.setOnClickListener {
openScanActivity()
}

binding.productComparisonButton.setOnClickListener { openScanActivity() }
}

override fun startScanActivity() {
Expand All @@ -119,7 +121,9 @@ class ProductCompareActivity : BaseActivity() {

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data)
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data) {
(binding.productComparisonRv.adapter as ProductCompareAdapter).onImageReturned(it)
}
}

private fun createAdapter(products: List<ProductCompareViewModel.CompareProduct>) {
Expand Down Expand Up @@ -155,10 +159,6 @@ class ProductCompareActivity : BaseActivity() {
binding.productComparisonRv.layoutManager = LinearLayoutManager(this@ProductCompareActivity, HORIZONTAL, false)
binding.productComparisonRv.adapter = productComparisonAdapter

// Set activity result handler
photoReceiverHandler = PhotoReceiverHandler(sharedPreferences) {
productComparisonAdapter.onImageReturned(it)
}
}

private fun openScanActivity() {
Expand Down Expand Up @@ -215,13 +215,10 @@ class ProductCompareActivity : BaseActivity() {
const val KEY_PRODUCTS_TO_COMPARE = "products_to_compare"

@JvmStatic
fun start(context: Context, product: Product) {
context.startActivity(Intent(context, ProductCompareActivity::class.java).apply {
putExtra(KEY_PRODUCTS_TO_COMPARE, product)
fun start(context: Context, product: Product? = null) {
context.startActivity(Intent<ProductCompareActivity>(context) {
if (product != null) putExtra(KEY_PRODUCTS_TO_COMPARE, product)
})
}

@JvmStatic
fun start(context: Context) = context.startActivity(Intent(context, ProductCompareActivity::class.java))
}
}
Expand Up @@ -17,7 +17,6 @@ package openfoodfacts.github.scrachx.openfood.features.images.manage

import android.Manifest
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
Expand Down Expand Up @@ -46,8 +45,8 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.databinding.ActivityFullScreenImageBinding
import openfoodfacts.github.scrachx.openfood.features.images.select.ImagesSelectActivity
import openfoodfacts.github.scrachx.openfood.features.adapters.LanguageDataAdapter
import openfoodfacts.github.scrachx.openfood.features.images.select.ImagesSelectActivity
import openfoodfacts.github.scrachx.openfood.features.login.LoginActivity
import openfoodfacts.github.scrachx.openfood.features.shared.BaseActivity
import openfoodfacts.github.scrachx.openfood.images.*
Expand Down Expand Up @@ -84,10 +83,10 @@ class ImagesManageActivity : BaseActivity() {
lateinit var picasso: Picasso

@Inject
lateinit var sharedPreferences: SharedPreferences
lateinit var localeManager: LocaleManager

@Inject
lateinit var localeManager: LocaleManager
lateinit var photoReceiverHandler: PhotoReceiverHandler

private var lastViewedImage: File? = null
private lateinit var attacher: PhotoViewAttacher
Expand Down Expand Up @@ -493,6 +492,9 @@ class ImagesManageActivity : BaseActivity() {

private fun requireProduct() = getProduct() ?: error("Cannot start $LOG_TAG without product.")

private fun getSelectedType(): ProductImageField = intent.getSerializableExtra(IMAGE_TYPE) as ProductImageField?
?: error("Cannot initialize $LOG_TAG without IMAGE_TYPE")

private fun onLanguageChanged() {
val data = binding.comboLanguages.selectedItem as LanguageData
val product = requireProduct()
Expand All @@ -505,9 +507,6 @@ class ImagesManageActivity : BaseActivity() {
updateSelectDefaultLanguageAction()
}

private fun getSelectedType(): ProductImageField = intent.getSerializableExtra(IMAGE_TYPE) as ProductImageField?
?: error("Cannot initialize $LOG_TAG without IMAGE_TYPE")

private fun onImageTypeChanged() {
getProduct()?.let {
val newTypeSelected = ApiFields.Keys.TYPE_IMAGE[binding.comboImageType.selectedItemPosition]
Expand Down Expand Up @@ -543,6 +542,7 @@ class ImagesManageActivity : BaseActivity() {
startActivityForResult(activityBuilder.getIntent(this, CropImageActivity::class.java), REQUEST_EDIT_IMAGE)
}


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val isResultOk = resultCode == RESULT_OK
Expand All @@ -552,8 +552,8 @@ class ImagesManageActivity : BaseActivity() {
REQUEST_ADD_IMAGE_AFTER_LOGIN -> if (isResultOk) addImage()
REQUEST_CHOOSE_IMAGE_AFTER_LOGIN -> if (isResultOk) selectImage()
REQUEST_UNSELECT_IMAGE_AFTER_LOGIN -> if (isResultOk) unSelectImage()
else -> PhotoReceiverHandler(sharedPreferences) { onPhotoReturned(it) }
.onActivityResult(this, requestCode, resultCode, data)
else -> photoReceiverHandler
.onActivityResult(this, requestCode, resultCode, data) { onPhotoReturned(it) }
}
}

Expand Down
Expand Up @@ -37,10 +37,7 @@ import openfoodfacts.github.scrachx.openfood.images.IMG_ID
import openfoodfacts.github.scrachx.openfood.images.PRODUCT_BARCODE
import openfoodfacts.github.scrachx.openfood.images.extractImagesNameSortedByUploadTimeDesc
import openfoodfacts.github.scrachx.openfood.network.services.ProductsAPI
import openfoodfacts.github.scrachx.openfood.utils.MY_PERMISSIONS_REQUEST_STORAGE
import openfoodfacts.github.scrachx.openfood.utils.PhotoReceiverHandler
import openfoodfacts.github.scrachx.openfood.utils.isAllGranted
import openfoodfacts.github.scrachx.openfood.utils.isUserSet
import openfoodfacts.github.scrachx.openfood.utils.*
import pl.aprilapps.easyphotopicker.EasyImage
import java.io.File
import javax.inject.Inject
Expand All @@ -59,6 +56,9 @@ class ImagesSelectActivity : BaseActivity() {
@Inject
lateinit var sharedPreferences: SharedPreferences

@Inject
lateinit var photoReceiverHandler: PhotoReceiverHandler

private lateinit var adapter: ProductImagesSelectionAdapter

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -143,12 +143,12 @@ class ImagesSelectActivity : BaseActivity() {

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
PhotoReceiverHandler(sharedPreferences) { newPhotoFile ->
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data) { newPhotoFile ->
setResult(RESULT_OK, Intent().apply {
putExtra(IMAGE_FILE, newPhotoFile)
})
finish()
}.onActivityResult(this, requestCode, resultCode, data)
}
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
Expand All @@ -161,7 +161,6 @@ class ImagesSelectActivity : BaseActivity() {

companion object {
const val TOOLBAR_TITLE = "TOOLBAR_TITLE"
private val LOG_TAG = ImagesSelectActivity::class.simpleName

@JvmStatic
fun start(context: Context, toolbarTitle: String, productCode: String) = context.startActivity(Intent(context, this::class.java).apply {
Expand All @@ -172,11 +171,12 @@ class ImagesSelectActivity : BaseActivity() {
class SelectImageContract(
private val toolbarTitle: String
) : ActivityResultContract<String, Pair<String?, File?>>() {
override fun createIntent(context: Context, barcode: String) = Intent(context, ImagesSelectActivity::class.java).apply {
override fun createIntent(context: Context, input: String) = Intent<ImagesSelectActivity>(context) {
putExtra(TOOLBAR_TITLE, toolbarTitle)
putExtra(PRODUCT_BARCODE, barcode)
putExtra(PRODUCT_BARCODE, input)
}


override fun parseResult(resultCode: Int, intent: Intent?) =
if (resultCode != RESULT_OK) null to null
else intent?.getStringExtra(IMG_ID) to intent?.getSerializableExtra(IMAGE_FILE) as File?
Expand Down
Expand Up @@ -66,16 +66,8 @@ class ProductEditPhotosFragment : ProductEditFragment() {
@Inject
lateinit var picasso: Picasso

private val photoReceiverHandler by lazy {
PhotoReceiverHandler(sharedPreferences) { newPhotoFile ->
photoFile = newPhotoFile
val image = ProductImage(code!!, ProductImageField.OTHER, newPhotoFile, localeManager.getLanguage())
image.filePath = photoFile!!.toURI().path
if (activity is ProductEditActivity) {
(activity as ProductEditActivity).savePhoto(image, 4)
}
}
}
@Inject
lateinit var photoReceiverHandler: PhotoReceiverHandler
private var code: String? = null
private var photoFile: File? = null

Expand Down Expand Up @@ -134,7 +126,14 @@ class ProductEditPhotosFragment : ProductEditFragment() {

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data)
photoReceiverHandler.onActivityResult(this, requestCode, resultCode, data) { newPhotoFile ->
photoFile = newPhotoFile
val image = ProductImage(code!!, ProductImageField.OTHER, newPhotoFile, localeManager.getLanguage())
image.filePath = photoFile!!.toURI().path
if (activity is ProductEditActivity) {
(activity as ProductEditActivity).savePhoto(image, 4)
}
}
}

override fun showImageProgress() {
Expand Down Expand Up @@ -168,9 +167,9 @@ class ProductEditPhotosFragment : ProductEditFragment() {
layoutParams = lp
}
picasso.load(photoFile!!)
.resize(requireContext().dpsToPixel(100), requireContext().dpsToPixel(100))
.centerInside()
.into(imageView)
.resize(requireContext().dpsToPixel(100), requireContext().dpsToPixel(100))
.centerInside()
.into(imageView)
row.addView(imageView)
binding.tableLayout.addView(row)
}
Expand Down

0 comments on commit 6e46cc3

Please sign in to comment.