feat: refs#8300 crashlyticsReview

This commit is contained in:
Sergio De la torre 2025-02-07 13:47:54 +01:00
parent ab262dc328
commit 568c3e687b
21 changed files with 283 additions and 215 deletions

View File

@ -15,8 +15,8 @@ android {
applicationId = "es.verdnatura" applicationId = "es.verdnatura"
minSdk = 26 minSdk = 26
targetSdk = 33 // se deja con target si no Play Protect la bloquea targetSdk = 33 // se deja con target si no Play Protect la bloquea
versionCode = 374 versionCode = 393 //JAF en informatica
versionName = "24.51" versionName = "25.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
@ -59,7 +59,14 @@ android {
} }
create("general") {} create("general") {}
} }
kapt {
correctErrorTypes = true
useBuildCache = true
kotlinOptions {
languageVersion = "1.9"
}
}
buildFeatures { buildFeatures {
viewBinding = true viewBinding = true
//compose = true //compose = true
@ -102,7 +109,9 @@ android {
implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.ktx)
implementation(libs.androidx.recyclerview) implementation(libs.androidx.recyclerview)
implementation(libs.androidx.room.ktx) implementation(libs.androidx.room.ktx)
kapt(libs.androidx.room.compiler) //kapt(libs.androidx.room.compiler)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
implementation(libs.ink) implementation(libs.ink)
implementation(libs.kotlin.stdlib.jdk7) implementation(libs.kotlin.stdlib.jdk7)
implementation(libs.androidx.appcompat) implementation(libs.androidx.appcompat)

View File

@ -6,6 +6,7 @@ import androidx.room.Database
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.ProvidedTypeConverter
import androidx.room.Query import androidx.room.Query
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
@ -46,7 +47,10 @@ abstract class DeliveryDatabase : RoomDatabase() {
return INSTANCE ?: synchronized(this) { return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder( val instance = Room.databaseBuilder(
context.applicationContext, DeliveryDatabase::class.java, "expedition_database" context.applicationContext, DeliveryDatabase::class.java, "expedition_database"
).fallbackToDestructiveMigration().build() ).fallbackToDestructiveMigration(true)
.addTypeConverter(MapTypeConverter())
.fallbackToDestructiveMigration(true)
.build()
INSTANCE = instance INSTANCE = instance
instance instance
} }
@ -113,7 +117,7 @@ interface RoutesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLoaded(routeLoaded: RouteLoaded) suspend fun insertLoaded(routeLoaded: RouteLoaded)
@Query("DELETE FROM routes WHERE dated != :today") @Query("DELETE FROM routes WHERE dated != :today")
suspend fun deleteLoaded(today: String) suspend fun deleteLoaded(today: String)
@ -135,6 +139,7 @@ interface ClientTicketDao {
} }
@ProvidedTypeConverter
class MapTypeConverter { class MapTypeConverter {
private val gson = Gson() private val gson = Gson()
@ -182,13 +187,24 @@ class MapTypeConverter {
} }
@TypeConverter @TypeConverter
fun fromTickets(tickets: MutableList<Ticket?>): String? { fun fromTickets(tickets: MutableList<Ticket>): String? {
return gson.toJson(tickets) return gson.toJson(tickets)
} }
@TypeConverter @TypeConverter
fun toTickets(json: String?): MutableList<Ticket?> { fun toTickets(json: String?): MutableList<Ticket> {
val type = object : TypeToken<MutableList<Ticket>>() {}.type val type = object : TypeToken<MutableList<Ticket>>() {}.type
return gson.fromJson(json, type) return gson.fromJson(json, type)
} }
@TypeConverter
fun fromNullableMap(map: MutableMap<String?, String?>): String {
return gson.toJson(map)
}
@TypeConverter
fun toNullableMap(json: String): MutableMap<String?, String?> {
val type = object : TypeToken<MutableMap<String?, String?>>() {}.type
return gson.fromJson(json, type)
}
} }

View File

@ -70,6 +70,8 @@ object ConstAndValues {
const val LIMITRECORDSSHELVINGLOG = 50 const val LIMITRECORDSSHELVINGLOG = 50
const val RESERVATIONMODE = "operatorReservationMode" const val RESERVATIONMODE = "operatorReservationMode"
const val MODELWORKERTYPEACTIVITY = "APP" const val MODELWORKERTYPEACTIVITY = "APP"
const val FLINGTHRESHOLDVELOCITY = 2000f
const val FLINGTHRESHOLDVERTICAL = 500f
} }

View File

@ -1,13 +1,15 @@
package es.verdnatura.domain package es.verdnatura.domain
import android.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.os.Build import android.os.Build
import android.text.Html import android.text.Html
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import android.widget.FrameLayout
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
@ -41,30 +43,37 @@ fun Any.toast(
Html.fromHtml("<font color='$color' ><b>$this</b></font>", 0), Html.fromHtml("<font color='$color' ><b>$this</b></font>", 0),
duration duration
) )
//toast2.setGravity(Gravity.TOP, 0, 0)
toast.show() toast.show()
return toast.apply { show() } return toast.apply { show() }
} }
fun Context.showToastCenterWithBackground(textToShow: String) { fun Context.showToastCenterWithBackground(textToShow: String) {
val inflater = LayoutInflater.from(this) (this as? Activity)?.window?.decorView?.let { rootView ->
val layout = inflater.inflate(R.layout.ticket_toast_layout, null) TextView(this).apply {
val text = layout.findViewById<TextView>(R.id.toast_text) text = textToShow
text.text = "$textToShow" setTextColor(getColor(R.color.verdnatura_orange_salix))
text.setTextColor(this.getColor(R.color.verdnatura_orange_salix)) textSize = 22f
text.textSize = 22f gravity = Gravity.CENTER
setPadding(32, 16, 32, 16)
background = GradientDrawable().apply {
setColor(Color.BLACK)
cornerRadius = 16f
alpha = 220
}
layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply { gravity = Gravity.CENTER }
alpha = 0f
val background = GradientDrawable().apply { (rootView as ViewGroup).addView(this)
setColor(Color.parseColor("#000000"))
cornerRadius = 16f
}
layout.background = background
Toast(this).apply { animate().alpha(1f).setDuration(300).withEndAction {
duration = Toast.LENGTH_LONG animate().alpha(0f).setStartDelay(1000).setDuration(300)
view = layout .withEndAction { (rootView).removeView(this) }
setGravity(Gravity.CENTER, 0, 0) .start()
show() }.start()
}
} }
} }

View File

@ -16,7 +16,7 @@ import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemDetails import es.verdnatura.presentation.view.feature.articulo.model.ItemDetails
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.articulo.model.ItemProposal import es.verdnatura.presentation.view.feature.articulo.model.ItemProposal
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO import es.verdnatura.presentation.view.feature.buscaritem.model.ItemShelvings
import es.verdnatura.presentation.view.feature.calidad.model.Buyer import es.verdnatura.presentation.view.feature.calidad.model.Buyer
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.claim.fragment.reubication.model.Reubication import es.verdnatura.presentation.view.feature.claim.fragment.reubication.model.Reubication
@ -36,9 +36,7 @@ import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
import es.verdnatura.presentation.view.feature.diadeventa.model.ItemShelvingSaleDate import es.verdnatura.presentation.view.feature.diadeventa.model.ItemShelvingSaleDate
import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO
import es.verdnatura.presentation.view.feature.historicoshelving.model.ItemShelvingLog
import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.ShelvingLogSalix import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.ShelvingLogSalix
import es.verdnatura.presentation.view.feature.historicovehiculo.model.ItemHistoricoVehiculo
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventoryParking import es.verdnatura.presentation.view.feature.inventario.model.ItemInventoryParking
import es.verdnatura.presentation.view.feature.login.model.AccessConfigSalix import es.verdnatura.presentation.view.feature.login.model.AccessConfigSalix
@ -415,6 +413,11 @@ interface SalixService {
fun collectionAssigned( fun collectionAssigned(
): Call<Int> ): Call<Int>
@GET("ItemShelvings")
fun itemShelvingsGet(
@Query("filter") filter: String
): Call<List<ItemShelvings>>
@POST("ItemShelvings/updateFromSale") @POST("ItemShelvings/updateFromSale")
fun itemShelvingUpdateFromSale( fun itemShelvingUpdateFromSale(
@Body params: Any @Body params: Any
@ -435,16 +438,6 @@ interface SalixService {
@Body params: Any @Body params: Any
): Call<Any> ): Call<Any>
@POST("MachineWorkers/updateInTime")
fun machineWorkerUpdateInTime(
@Body params: Any
): Call<Any>
@POST("MachineWorkers/add")
fun machineWorkerAdd(
@Query("plate") plate: Any
): Call<Any>
@POST("SaleTrackings/updateTracking") @POST("SaleTrackings/updateTracking")
fun saleTrackingUpdate( fun saleTrackingUpdate(
@Body params: Any @Body params: Any
@ -481,11 +474,6 @@ interface SalixService {
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<List<PlacementSupplyVO>> ): Call<List<PlacementSupplyVO>>
@POST("Applications/machineWorker_getHistorical/execute-proc")
fun machineWorkerGetHistorical(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<List<ItemHistoricoVehiculo>>
@POST("Applications/expedition_getFromRoute/execute-proc") @POST("Applications/expedition_getFromRoute/execute-proc")
fun expeditionGetFromRoute( fun expeditionGetFromRoute(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
@ -531,18 +519,6 @@ interface SalixService {
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<Any> ): Call<Any>
@GET("ItemShelvings/getListItemNewer")
fun getListItemNewer(
@Query("shelvingFk") shelvingFkIn: Any, @Query("parking") parking: Any? = null
): Call<List<ItemShelvingNewer>>
@GET("ItemShelvings/getListItemNewer")
fun getListItemNewerNew(
@Query("shelvingFk") shelvingFkIn: Any,
@Query("parking") parking: Any? = null,
@Query("itemFk") itemFk: Any? = null
): Call<List<ItemShelvingNewer>>
@GET("ItemShelvings/getItemsByReviewOrder") @GET("ItemShelvings/getItemsByReviewOrder")
fun getItemsByReviewOrder( fun getItemsByReviewOrder(
@Query("shelving") shelvingFkIn: Any, @Query("shelving") shelvingFkIn: Any,
@ -565,11 +541,6 @@ interface SalixService {
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<Any> ): Call<Any>
/* @POST("Applications/machine_getWorkerPlate/execute-proc")
fun machineGetWorkerPlate(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<List<JsonObject>>*/
@POST("Applications/sectorCollection_get/execute-proc") @POST("Applications/sectorCollection_get/execute-proc")
fun sectorCollectionGet( fun sectorCollectionGet(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
@ -640,11 +611,6 @@ interface SalixService {
@Query("filter") filter: Any, @Query("schema") schema: String = "vn" @Query("filter") filter: Any, @Query("schema") schema: String = "vn"
): Call<List<TicketPickupResponse>> ): Call<List<TicketPickupResponse>>
@POST("Applications/workerMachinery_isRegistered/execute-func")
fun workerMachineryIsRegistered(
@Query("params") params: Any, @Query("schema") schema: String = "vn"
): Call<String>
@POST("Applications/ticket_printLabelPrevious/execute-proc") @POST("Applications/ticket_printLabelPrevious/execute-proc")
fun ticketPrintLabelPrevious( fun ticketPrintLabelPrevious(
@Query("params") params: Any, @Query("schema") schema: String = "vn" @Query("params") params: Any, @Query("schema") schema: String = "vn"
@ -712,17 +678,6 @@ interface SalixService {
@Query("params") params: Any, @Query("params") params: Any,
): Call<Any> ): Call<Any>
@GET("ItemShelvingLogs")
fun itemShelvingLogGet(
@Query("filter") filter: String,
): Call<List<ItemShelvingLog>>
@POST("Applications/itemshelving_getInfo/execute-proc")
fun itemshelvingGetInfo(
@Query("schema") schema: String = "vn",
@Query("params") params: Any,
): Call<List<ItemLocationVO>>
@POST("Applications/itemShelving_get/execute-proc") @POST("Applications/itemShelving_get/execute-proc")
fun itemShelvingListNew( fun itemShelvingListNew(
@Query("schema") schema: String = "vn", @Query("schema") schema: String = "vn",

View File

@ -17,6 +17,7 @@ import es.verdnatura.MobileApplication
import es.verdnatura.R import es.verdnatura.R
import es.verdnatura.databinding.ToolbarFragmentBinding import es.verdnatura.databinding.ToolbarFragmentBinding
import es.verdnatura.db.DeliveryDatabase import es.verdnatura.db.DeliveryDatabase
import es.verdnatura.db.MapTypeConverter
import es.verdnatura.presentation.view.feature.main.activity.MainActivity import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import kotlin.reflect.KClass import kotlin.reflect.KClass
@ -170,7 +171,8 @@ fun database(myContext: Context): DeliveryDatabase {
return Room.databaseBuilder( return Room.databaseBuilder(
myContext, myContext,
DeliveryDatabase::class.java, "expediciones.db" DeliveryDatabase::class.java, "expediciones.db"
).build() ).addTypeConverter(MapTypeConverter())
.build()
} }

View File

@ -12,7 +12,6 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.InputType
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
@ -169,7 +168,7 @@ fun Context.hideKeyboard(view: View) {
fun Context.showKeyboard() { fun Context.showKeyboard() {
val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager? val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.toggleSoftInput(InputType.TYPE_CLASS_NUMBER, 0) imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
} }

View File

@ -1,14 +1,11 @@
package es.verdnatura.presentation.view.commom package es.verdnatura.presentation.view.commom
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.print.PrintAttributes
import android.print.PrintManager
import android.view.GestureDetector
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
@ -18,12 +15,13 @@ import android.webkit.WebViewClient
import android.widget.ImageView import android.widget.ImageView
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.OnBackPressedDispatcher import androidx.activity.OnBackPressedDispatcher
import androidx.core.view.GestureDetectorCompat
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R import es.verdnatura.R
import es.verdnatura.databinding.FragmentWebBinding import es.verdnatura.databinding.FragmentWebBinding
import es.verdnatura.domain.ConstAndValues.FLINGTHRESHOLDVELOCITY
import es.verdnatura.domain.ConstAndValues.FLINGTHRESHOLDVERTICAL
import es.verdnatura.presentation.common.OnBackPressedListener import es.verdnatura.presentation.common.OnBackPressedListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip import es.verdnatura.presentation.common.ToolBarAdapterTooltip
@ -32,15 +30,14 @@ import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import org.json.JSONObject import org.json.JSONObject
import kotlin.math.abs import kotlin.math.abs
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class WebFragment( class WebFragment(
var entryPoint: String = "" var entryPoint: String = ""
) : Fragment(), OnBackPressedListener { ) : Fragment(), OnBackPressedListener {
private lateinit var gestureDetector: GestureDetectorCompat
fun getLayoutId(): Int = R.layout.fragment_web fun getLayoutId(): Int = R.layout.fragment_web
private lateinit var customDialog: CustomDialog private lateinit var customDialog: CustomDialog
private lateinit var backDispatcher: OnBackPressedDispatcher private lateinit var backDispatcher: OnBackPressedDispatcher
private lateinit var binding: FragmentWebBinding private lateinit var binding: FragmentWebBinding
private var velocityTracker: VelocityTracker? = null
companion object { companion object {
fun newInstance(entryPoint: String) = WebFragment(entryPoint) fun newInstance(entryPoint: String) = WebFragment(entryPoint)
@ -50,7 +47,6 @@ class WebFragment(
customDialog = CustomDialog(requireContext()) customDialog = CustomDialog(requireContext())
setToolbar() setToolbar()
setWeb() setWeb()
} }
override fun onCreateView( override fun onCreateView(
@ -63,7 +59,6 @@ class WebFragment(
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner,
@ -76,57 +71,69 @@ class WebFragment(
} }
}) })
gestureDetector = GestureDetectorCompat(requireActivity(),
object : GestureDetector.SimpleOnGestureListener() {
override fun onFling(
e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float
): Boolean {
val deltaX = (e2.x - e1?.x!!)
val deltaY = (e2.y - e1.y)
val deltaAbsX = abs(deltaX)
val deltaAbsY = abs(deltaY)
if (deltaAbsX > deltaAbsY) {
if (velocityX > 2000 && velocityY < 500 && velocityY >= 0) {
binding.webView.goBack()
return true
}
}
return false
}
})
init() init()
super.onViewCreated(view, savedInstanceState)
} }
@SuppressLint("ClickableViewAccessibility", "SetJavaScriptEnabled") @SuppressLint("ClickableViewAccessibility", "javaScriptEnabled")
private fun setWeb() { private fun setWeb() {
binding.webView.apply {
webChromeClient = WebChromeClient()
binding.webView.webChromeClient = WebChromeClient( settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
loadWithOverviewMode = true
useWideViewPort = true
builtInZoomControls = true
displayZoomControls = false
setSupportZoom(true)
allowFileAccess = true
}
) setOnTouchListener { _, event ->
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
velocityTracker?.clear()
velocityTracker = velocityTracker ?: VelocityTracker.obtain()
velocityTracker?.addMovement(event)
}
val webSettings = binding.webView.settings MotionEvent.ACTION_MOVE -> {
webSettings.javaScriptEnabled = true velocityTracker?.addMovement(event)
webSettings.domStorageEnabled = true }
webSettings.loadWithOverviewMode = true
webSettings.useWideViewPort = true
webSettings.builtInZoomControls = true
webSettings.displayZoomControls = false
webSettings.setSupportZoom(true)
webSettings.allowFileAccess = true
binding.webView.setOnTouchListener { v, event -> MotionEvent.ACTION_UP -> {
gestureDetector.onTouchEvent(event) velocityTracker?.let { tracker ->
} tracker.computeCurrentVelocity(1000) // velocidad en píxeles por segundo
binding.webView.webViewClient = object : WebViewClient() { val velocityX = tracker.xVelocity
override fun shouldOverrideUrlLoading( val velocityY = abs(tracker.yVelocity)
view: WebView?, request: WebResourceRequest?
): Boolean { if (velocityX > FLINGTHRESHOLDVELOCITY &&
binding.webView.loadUrl(request?.url.toString()) velocityY < FLINGTHRESHOLDVERTICAL
return true ) {
binding.webView.goBack()
return@setOnTouchListener true
}
}
}
MotionEvent.ACTION_CANCEL -> {
velocityTracker?.recycle()
velocityTracker = null
}
}
false
}
webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
request?.url?.toString()?.let { loadUrl(it) }
return true
}
} }
} }
@ -135,63 +142,33 @@ class WebFragment(
} }
private fun setToolbar() { private fun setToolbar() {
binding.mainToolbar.toolbarTitle.text = buildString { binding.mainToolbar.toolbarTitle.text = buildString {
append(getString(R.string.item)) append(getString(R.string.item))
append(JSONObject(entryPoint).get("entryPoint").toString()) append(JSONObject(entryPoint).get("entryPoint").toString())
} }
val listIcons: ArrayList<ImageView> = ArrayList() val listIcons: ArrayList<ImageView> = ArrayList()
val iconPrint = ImageView(context)
iconPrint.setImageResource(R.drawable.ic_print_black_24dp)
iconPrint.tooltipText = getString(R.string.print)
binding.mainToolbar.toolbarIcons.adapter = binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener { ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) { override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconPrint.drawable -> createWebPrintJob(binding.webView)
}
} }
}) })
binding.mainToolbar.toolbarIcons.layoutManager = binding.mainToolbar.toolbarIcons.layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun createWebPrintJob(webView: WebView) {
// Get a PrintManager instance
(activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->
val jobName = "${getString(R.string.app_name)} Document"
// Get a print adapter instance
val printAdapter = webView.createPrintDocumentAdapter(jobName)
// Create a print job with name and adapter instance
printManager.print(
jobName, printAdapter, PrintAttributes.Builder().build()
).also { printJob ->
println("job printed")
// Save the job object for later status checking
// printJobs += printJob
}
}
} }
override fun onBackPressedHandled(): Boolean { override fun onBackPressedHandled(): Boolean {
if (binding.webView.canGoBack()) { if (binding.webView.canGoBack()) {
binding.webView.goBack() binding.webView.goBack()
} else { } else {
(context as MainActivity).onMyBackPressed() (context as MainActivity).onMyBackPressed()
} }
return true return true
} }
} override fun onDestroy() {
super.onDestroy()
velocityTracker?.recycle()
velocityTracker = null
}
}

View File

@ -100,15 +100,15 @@ class CustomDialogInput(context: Context) : Dialog(context, R.style.DialogTheme)
fun setFocusText() { fun setFocusText() {
binding.customDialogValue.requestFocus() binding.customDialogValue.requestFocus()
} }
fun setFocusTextTwo() { fun setFocusTextTwo() {
binding.customDialogValueTwo.requestFocus() binding.customDialogValueTwo.requestFocus()
} }
fun plusTextButton(view: View) { private fun plusTextButton(view: View) {
var sum = 0
try { try {
sum = getValue().toInt() + Integer.parseInt(view.tag.toString()) val sum = getValue().toInt() + Integer.parseInt(view.tag.toString())
setValue(sum.toString()) setValue(sum.toString())
} catch (ex: Exception) { } catch (ex: Exception) {
setValue(view.tag.toString()) setValue(view.tag.toString())

View File

@ -503,8 +503,4 @@ class SaleAdapter(
notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado
} }
fun orderSales(newSales: List<SaleVO>) {
notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado
}
} }

View File

@ -5,9 +5,9 @@ import es.verdnatura.R
import es.verdnatura.presentation.common.convertToDateString import es.verdnatura.presentation.common.convertToDateString
import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyVO
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Locale
fun CollectionVO.map(context: Context): CollectionVO { fun CollectionVO.map(context: Context): CollectionVO {
try { try {
@ -86,17 +86,8 @@ fun CollectionTicket.map(context: Context): CollectionTicket {
} }
private fun getCalendarFromDate(date: String, context: Context): Calendar { private fun getCalendarFromDate(date: String, context: Context): Calendar {
val sdf = SimpleDateFormat(context.getString(R.string.dateFormat)) val sdf = SimpleDateFormat(context.getString(R.string.dateFormat), Locale.getDefault())
val cal = Calendar.getInstance() val cal = Calendar.getInstance()
cal.time = sdf.parse(date)!! cal.time = sdf.parse(date)!!
return cal return cal
} }
// para cuando se pase a Salix el modelo
//Tarea 5134
fun PlacementSupplyVO.proposal(context: Context): PlacementSupplyVO {
try {
} catch (ex: Exception) {
}
return this
}

View File

@ -273,7 +273,7 @@ class LoadUnloadFragment(
ma.onMyBackPressed() ma.onMyBackPressed()
} }
binding.scanInput.setOnEditorActionListener { v, actionId, event -> binding.scanInput.setOnEditorActionListener { _, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == EditorInfo.IME_ACTION_NEXT) { if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == EditorInfo.IME_ACTION_NEXT) {
if (!binding.scanInput.text.isNullOrEmpty()) { if (!binding.scanInput.text.isNullOrEmpty()) {

View File

@ -0,0 +1,81 @@
package es.verdnatura.presentation.view.feature.indoor
import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import es.verdnatura.R
class MainActivityIndoor : AppCompatActivity(), LocationListener {
private lateinit var locationManager: LocationManager
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.indoor_activity_main)
textView = findViewById(R.id.textViewLocation)
locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
// Verificar permisos
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), 1
)
} else {
startLocationUpdates()
}
}
private fun startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED
) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
5000, // Tiempo mínimo de actualización (5 segundos)
10f, // Distancia mínima de actualización (10 metros)
this
)
}
}
override fun onLocationChanged(location: Location) {
val latitude = location.latitude
val longitude = location.longitude
textView.text = "Lat: $latitude\nLon: $longitude"
println(" $latitude:$longitude")
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 1 && grantResults.isNotEmpty()
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
startLocationUpdates()
}
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
override fun onProviderEnabled(provider: String) {}
override fun onProviderDisabled(provider: String) {}
}

View File

@ -44,7 +44,7 @@ class InventaryFragment :
private lateinit var itemClicked: ItemInventaryVO private lateinit var itemClicked: ItemInventaryVO
private var buyerId: Number = -1 private var buyerId: Number = -1
private var filterItemType: String? = null private var filterItemType: String? = null
private var myListBuyers = listOf<Buyer>() private var myListBuyers = mutableListOf<Buyer>()
companion object { companion object {
fun newInstance() = InventaryFragment() fun newInstance() = InventaryFragment()
@ -82,6 +82,7 @@ class InventaryFragment :
} }
.distinct() .distinct()
.sortedBy { it.name } .sortedBy { it.name }
setSearchable(distinctPackingTypes as MutableList<NameWithId>) setSearchable(distinctPackingTypes as MutableList<NameWithId>)
binding.searchableRecyclerView.visibility = View.VISIBLE binding.searchableRecyclerView.visibility = View.VISIBLE
binding.searchableRecyclerView.setSearchHint(getString(R.string.BuyerSearch)) binding.searchableRecyclerView.setSearchHint(getString(R.string.BuyerSearch))
@ -235,11 +236,11 @@ class InventaryFragment :
with(viewModel) { with(viewModel) {
buyersByItemPackingList.observe(viewLifecycleOwner) { list -> buyersByItemPackingList.observe(viewLifecycleOwner) { list ->
myListBuyers = list.list myListBuyers = list.list.toMutableList()
val distinctPackingTypes = val distinctPackingTypes =
list?.list?.map { list?.list?.map {
NameWithId( NameWithId(
1, it.itemPackingTypeFk ?: getString(R.string.allText) 1, it.itemPackingTypeFk.ifEmpty { getString(R.string.allText) }
) )
} }
?.distinct() ?.distinct()

View File

@ -365,7 +365,7 @@ class EndSacadorFragment(
responseCode.observe(viewLifecycleOwner, Observer { responseCode.observe(viewLifecycleOwner, Observer {
if (!goBack2) { if (!goBack2) {
if (it==null) { if (it == null) {
customDialog.setTitle(getString(R.string.error)) customDialog.setTitle(getString(R.string.error))
.setDescription(getString(R.string.itemNotValid)) .setDescription(getString(R.string.itemNotValid))
.setKoButton(getString(R.string.close)) { .setKoButton(getString(R.string.close)) {
@ -609,7 +609,6 @@ class EndSacadorFragment(
private fun findSale(txtscan: String, position: Int) { private fun findSale(txtscan: String, position: Int) {
var index = 0 var index = 0
var isBreak = false
var isOk = false var isOk = false
val saleVO = sales[position] val saleVO = sales[position]
@ -622,7 +621,6 @@ class EndSacadorFragment(
if (mpok != null) mpok!!.start() if (mpok != null) mpok!!.start()
isOk = true isOk = true
showShelving(position, shelvingIndex) showShelving(position, shelvingIndex)
isBreak = true
break break
} }
shelvingIndex += 1 shelvingIndex += 1
@ -1005,11 +1003,10 @@ class EndSacadorFragment(
increaseQuantity(position, customDialogThreeButtons.getValue().toInt()) increaseQuantity(position, customDialogThreeButtons.getValue().toInt())
scanRequest() scanRequest()
customDialogThreeButtons.dismiss() customDialogThreeButtons.dismiss()
}catch (_:Exception){ } catch (_: Exception) {
getString(R.string.errorInput).toast(requireContext()) getString(R.string.errorInput).toast(requireContext())
} }
}.setKoButton(getString(R.string.cancel)) { }.setKoButton(getString(R.string.cancel)) {
scanRequest() scanRequest()
customDialogThreeButtons.dismiss() customDialogThreeButtons.dismiss()

View File

@ -2,6 +2,7 @@ package es.verdnatura.presentation.view.feature.sacador.fragment
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle
import android.text.InputType import android.text.InputType
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
@ -22,9 +23,7 @@ import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.feature.sacador.adapter.CollectionAdapter import es.verdnatura.presentation.view.feature.sacador.adapter.CollectionAdapter
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
class SacadorFragment( class SacadorFragment :
var type: String
) :
BaseFragment<FragmentSacadorBinding, SacadorViewModel>(SacadorViewModel::class) { BaseFragment<FragmentSacadorBinding, SacadorViewModel>(SacadorViewModel::class) {
private var onCollectionSelectedListener: OnCollectionSelectedListener? = null private var onCollectionSelectedListener: OnCollectionSelectedListener? = null
@ -34,9 +33,16 @@ class SacadorFragment(
private lateinit var customDialogInput: CustomDialogInput private lateinit var customDialogInput: CustomDialogInput
private var collectionsList: ArrayList<CollectionVO> = ArrayList() private var collectionsList: ArrayList<CollectionVO> = ArrayList()
private var adapter: CollectionAdapter? = null private var adapter: CollectionAdapter? = null
private var type: String = ""
companion object { companion object {
fun newInstance(type: String) = SacadorFragment(type) private const val ARG_TYPE = "arg_type"
fun newInstance(type: String) = SacadorFragment().apply {
arguments = Bundle().apply {
putString(ARG_TYPE, type)
}
}
} }
override fun onAttach(context: Context) { override fun onAttach(context: Context) {
@ -44,6 +50,11 @@ class SacadorFragment(
if (context is OnCollectionSelectedListener) onCollectionSelectedListener = context if (context is OnCollectionSelectedListener) onCollectionSelectedListener = context
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
type = arguments?.getString(ARG_TYPE) ?: ""
}
override fun getLayoutId(): Int = R.layout.fragment_sacador override fun getLayoutId(): Int = R.layout.fragment_sacador
override fun init() { override fun init() {
@ -130,7 +141,7 @@ class SacadorFragment(
} }
} }
iconPrint.drawable -> { iconPrint.drawable -> {
showPrintPrevious() showPrintPrevious()
} }

View File

@ -1212,7 +1212,7 @@ class UbicadorFragment : BaseFragment<FragmentUbicadorBinding, UbicadorViewModel
customDialogTwoButtons.dismiss() customDialogTwoButtons.dismiss()
} else { } else {
printItem( printItem(
item.buyFk!!, labelType, packing, copies item.buyFk, labelType, packing, copies
) )
customDialogTwoButtons.dismiss() customDialogTwoButtons.dismiss()
} }

View File

@ -280,7 +280,7 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
Action.PARKINEAR -> setParking(shelving, parking!!) Action.PARKINEAR -> setParking(shelving, parking!!)
Action.TRANSFERIR -> { Action.TRANSFERIR -> {
itemShelvingTransfer(itemShelvingFk!!, shelving!!) itemShelvingTransfer(itemShelvingFk!!, shelving)
} }
null -> d("", "No action") null -> d("", "No action")

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:id="@+id/textViewLocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Esperando ubicación..."
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>

View File

@ -27,9 +27,7 @@ allprojects {
maven { maven {
url = uri("https://jitpack.io") url = uri("https://jitpack.io")
} }
maven {
url = uri("https://maven.mozilla.org/maven2/")
}
} }
} }

View File

@ -1,17 +1,18 @@
[versions] [versions]
androidImagePicker = "3.0.0-beta5" androidImagePicker = "3.0.0-beta5"
appcompat = "1.7.0" appcompat = "1.7.0"
composeBom = "2024.11.00" composeBom = "2025.01.01"
constraintlayout = "2.2.0" constraintlayout = "2.2.0"
converterGson = "2.0.2" converterGson = "2.0.2"
core = "3.4.1" core = "3.4.1"
coreKtx = "1.13.0" coreKtx = "1.15.0"
datastorePreferences = "1.1.1" datastorePreferences = "1.1.2"
firebaseAnalyticsKtx = "22.1.2" firebaseAnalyticsKtx = "22.2.0"
firebaseCrashlyticsKtx = "19.2.1" firebaseCrashlyticsKtx = "19.4.0"
fragmentKtx = "1.8.5" fragmentKtx = "1.8.5"
geckoviewVersion = "133.0.20241209150345" geckoviewVersion = "133.0.20241209150345"
glide = "4.16.0" glide = "4.16.0"
googleWebrtc = "1.0.32006"
ink = "1.0.0" ink = "1.0.0"
koin = "2.1.6" koin = "2.1.6"
kotlinStdlibJdk7 = "2.0.0" kotlinStdlibJdk7 = "2.0.0"
@ -20,20 +21,24 @@ lifecycleExtensions = "2.2.0"
lifecycleViewmodelKtx = "2.8.7" lifecycleViewmodelKtx = "2.8.7"
lottieVersion = "3.4.0" lottieVersion = "3.4.0"
material = "1.12.0" material = "1.12.0"
navigationFragmentKtx = "2.8.3" navigationFragmentKtx = "2.8.6"
navigationUiKtx = "2.8.3" navigationUiKtx = "2.8.6"
pjsipAndroid = "2.12.1"
playServicesLocation = "21.3.0" playServicesLocation = "21.3.0"
recyclerview = "1.3.2" recyclerview = "1.4.0"
retrofit = "2.3.0" retrofit = "2.3.0"
roomCompiler = "2.6.1" roomCompiler = "2.7.0-alpha13"
swiperefreshlayout = "1.1.0" swiperefreshlayout = "1.1.0"
zxingAndroidEmbedded = "4.3.0" zxingAndroidEmbedded = "4.3.0"
googleDevtoolsKsp = "2.0.20-1.0.25" googleDevtoolsKsp = "2.0.20-1.0.25"
#cambiar ide para subir version #cambiar ide para subir version
androidGradlePlugin = "8.7.2" androidGradlePlugin = "8.7.3"
kotlin = "2.0.20" kotlin = "2.0.20"
googleServices = "4.4.2" googleServices = "4.4.2"
firebaseCrashlytics = "3.0.2" firebaseCrashlytics = "3.0.2"
protoliteWellKnownTypes = "18.0.0"
junit = "4.12"
material3Android = "1.3.1"
[libraries] [libraries]
#pickerImage #pickerImage
@ -58,11 +63,11 @@ androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompiler" } androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompiler" }
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomCompiler" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomCompiler" }
#ui #ui
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomCompiler" }
converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" } converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" }
converter-scalars = { module = "com.squareup.retrofit2:converter-scalars", version.ref = "retrofit" } converter-scalars = { module = "com.squareup.retrofit2:converter-scalars", version.ref = "retrofit" }
#qr #qr
core = { module = "com.google.zxing:core", version.ref = "core" } core = { module = "com.google.zxing:core", version.ref = "core" }
geckoview = { module = "org.mozilla.geckoview:geckoview", version.ref = "geckoviewVersion" }
zxing-android-embedded = { module = "com.journeyapps:zxing-android-embedded", version.ref = "zxingAndroidEmbedded" } zxing-android-embedded = { module = "com.journeyapps:zxing-android-embedded", version.ref = "zxingAndroidEmbedded" }
#analytics #analytics
firebase-analytics = { module = "com.google.firebase:firebase-analytics", version.ref = "firebaseAnalyticsKtx" } firebase-analytics = { module = "com.google.firebase:firebase-analytics", version.ref = "firebaseAnalyticsKtx" }
@ -93,6 +98,9 @@ androidGradlePlugin = { module = "com.android.tools.build:gradle", version.ref =
kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
googleServices = { module = "com.google.gms:google-services", version.ref = "googleServices" } googleServices = { module = "com.google.gms:google-services", version.ref = "googleServices" }
firebaseCrashlyticsGradle = { module = "com.google.firebase:firebase-crashlytics-gradle", version.ref = "firebaseCrashlytics" } firebaseCrashlyticsGradle = { module = "com.google.firebase:firebase-crashlytics-gradle", version.ref = "firebaseCrashlytics" }
protolite-well-known-types = { group = "com.google.firebase", name = "protolite-well-known-types", version.ref = "protoliteWellKnownTypes" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-material3-android = { group = "androidx.compose.material3", name = "material3-android", version.ref = "material3Android" }
[plugins] [plugins]
google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "googleDevtoolsKsp" } google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "googleDevtoolsKsp" }