navigation

This commit is contained in:
Enrique Blasco 2020-05-06 14:01:03 +02:00
parent cb005b3837
commit a56613525b
15 changed files with 394 additions and 19 deletions

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,6 +1,7 @@
package es.verdnatura.di
import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesViewModel
import es.verdnatura.presentation.view.feature.articulo.fragment.ItemCardViewModel
import es.verdnatura.presentation.view.feature.login.fragment.LoginViewModel
import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
@ -17,6 +18,11 @@ val viewModelModule = module{
PasilleroViewModel()
}
// Pasilleros / Item Card
viewModel {
ItemCardViewModel()
}
// Ajustes
viewModel {
AjustesViewModel()

View File

@ -0,0 +1,15 @@
package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import retrofit2.Call
class GetItemCardUserCase : RestClient() {
fun getItemCard(usuario:String,password:String,itemFk:String,warehouseFk:String) : Call<ItemCardVO> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.getItemCard("json","1",usuario,password,"application/json",params = params)!!
}
}

View File

@ -2,6 +2,7 @@ package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.Header
@ -9,6 +10,7 @@ import retrofit2.http.POST
interface VerdnaturaService {
//LOGIN ========================================================================>
@POST("security/login")
fun login(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@ -27,6 +29,8 @@ interface VerdnaturaService {
@Body params: List<String>):
Call<Boolean>
//AJUSTES ========================================================================>
@POST("almacenv2/sector_get")
fun getSectors(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@ -35,4 +39,15 @@ interface VerdnaturaService {
@Header("Content-Type") content_type: String):
Call<List<SectorItemVO>>
//PASILLEROS ========================================================================>
@POST("almacenv2/item_card")
fun getItemCard(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<ItemCardVO>
}

View File

@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.ajustes.fragment
import android.app.AlertDialog
import android.content.DialogInterface
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
@ -16,6 +17,7 @@ import es.verdnatura.presentation.view.feature.ajustes.adapter.AjustesAdapter
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.ajustes.model.SectorListVO
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_ajustes.*
class AjustesFragment : BaseFragment<FragmentAjustesBinding,AjustesViewModel>(AjustesViewModel::class) {
@ -32,10 +34,16 @@ class AjustesFragment : BaseFragment<FragmentAjustesBinding,AjustesViewModel>(Aj
}
override fun getLayoutId(): Int = R.layout.fragment_ajustes
override fun init() {
override fun onCreate(savedInstanceState: Bundle?) {
prefs = activity!!.getSharedPreferences(PREFS_USER,0)
customDialog = CustomDialog(requireContext())
viewModel.inititializeDefaultAjusts(prefs!!.getString(SECTORDESCRIP,"Sin sector").toString(),prefs!!.getInt(SECTORFK,0),prefs!!.getInt(WAREHOUSEFK,0))
super.onCreate(savedInstanceState)
}
override fun init() {
activity!!.main_bottom_navigation.visibility = View.VISIBLE
user_text.setText(prefs!!.getString(USERFK,""))
val versionName = activity!!.packageManager.getPackageInfo(activity!!.packageName,0).versionName
item_version.setText(versionName)
@ -44,6 +52,7 @@ class AjustesFragment : BaseFragment<FragmentAjustesBinding,AjustesViewModel>(Aj
super.init()
}
override fun observeViewModel() {
with(viewModel){
ajustesAdapter = AjustesAdapter(ajustesitem,object: OnAjustesItemClickListener{

View File

@ -0,0 +1,72 @@
package es.verdnatura.presentation.view.feature.articulo.fragment
import android.content.SharedPreferences
import android.util.Log
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import es.verdnatura.R
import es.verdnatura.databinding.FragmentItemCardBinding
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesFragment
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_item_card.*
class ItemCardFragment : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>(ItemCardViewModel::class) {
companion object {
fun newInstance() = ItemCardFragment()
}
private lateinit var customDialog: CustomDialog
override fun getLayoutId(): Int = R.layout.fragment_item_card
override fun init() {
activity!!.main_bottom_navigation.visibility = View.GONE
setEvents()
customDialog = CustomDialog(requireContext())
super.init()
}
private fun setEvents(){
edit_itemFk.requestFocus()
edit_itemFk.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
getItemCard(edit_itemFk.text.toString())
return@setOnEditorActionListener true
}
false
}
}
private fun getItemCard(itemFk:String){
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
val user = prefs.getString(USER,"")
val password = prefs.getString(PASSWORD,"")
val warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
splash_progress.visibility = View.VISIBLE
viewModel.getItemCard(itemFk,warehouseFk,user!!,password!!)
}
override fun observeViewModel() {
with(viewModel){
itemcard.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
if (it.isError){
customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Cerrar"){
customDialog.hide()
}.show()
}else{
customDialog.setTitle("Perfecto!!!").setDescription("Tenemos datos para itemFk: "+it.id).setOkButton("Cerrar"){
customDialog.hide()
}.show()
}
})
}
}
}

View File

@ -0,0 +1,38 @@
package es.verdnatura.presentation.view.feature.articulo.fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetItemCardUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class ItemCardViewModel : BaseViewModel() {
private val getItemCardUserCase:GetItemCardUserCase = GetItemCardUserCase()
val version : String = "5.0.0";
private val _itemcard by lazy { MutableLiveData<ItemCardVO>() }
val itemcard: LiveData<ItemCardVO>
get() = _itemcard
fun getItemCard(itemFk:String,warehouseFk:String,user:String,password:String) {
getItemCardUserCase.getItemCard(user,password,itemFk,warehouseFk).enqueue(object :Callback<ItemCardVO>{
override fun onFailure(call: Call<ItemCardVO>, t: Throwable) {
_itemcard.value = ItemCardVO(isError = true,errorMessage = t.message!!)
}
override fun onResponse(call: Call<ItemCardVO>, response: Response<ItemCardVO>) {
if (response.body() != null){
_itemcard.value = response.body()!!
}else{
_itemcard.value = ItemCardVO(isError = true,errorMessage = "Error al llamar a vn.itemCard")
}
}
})
}
}

View File

@ -0,0 +1,31 @@
package es.verdnatura.presentation.view.feature.articulo.model
class ItemCardVO (
var id:String = "0",
var longNameString:String = "0",
var value5:String = "",
var value6:String = "0",
var value7:String = "0",
var image:String = "0",
var size:String = "0",
var stems:String = "0",
var category:String = "0",
var producer:String = "0",
var origin:String = "0",
var nicho:String = "0",
var reserva:String = "0",
var enNicho:String = "0",
var available:String = "0",
var enAltillo:String = "0",
var repo:String = "0",
var total:String = "0",
var min:String = "0",
var grouping:String = "0",
var packing:String = "0",
var barcodes:List<String> = listOf(),
var tag5:String = "",
var tag6:String = "",
var tag7:String = "",
var isError: Boolean = false,
var errorMessage:String = ""
)

View File

@ -1,9 +1,12 @@
package es.verdnatura.presentation.view.feature.main.activity
import android.content.SharedPreferences
import android.util.Log
import android.view.Menu
import android.view.View
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import es.verdnatura.R
import es.verdnatura.databinding.ActivityMainBinding
import es.verdnatura.domain.toast
@ -13,6 +16,7 @@ import es.verdnatura.presentation.common.TAG
import es.verdnatura.presentation.common.addFragment
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesFragment
import es.verdnatura.presentation.view.feature.articulo.fragment.ItemCardFragment
import es.verdnatura.presentation.view.feature.main.model.ItemMenuVO
import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroFragment
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
@ -26,19 +30,31 @@ class MainActivity : BaseActivity<ActivityMainBinding>() , OnPasillerosItemClick
private var lastBottomMenuItemSelected: ItemMenuVO? = null
private lateinit var customDialog: CustomDialog
val fm: FragmentManager = supportFragmentManager
override fun getLayoutId(): Int = R.layout.activity_main
override fun init() {
customDialog = CustomDialog(this)
setBottomMenu()
addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG)
if(haveSector()) addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG)
else addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, AjustesFragment.TAG)
}
private fun openFragment(fragment: Fragment) {
private fun haveSector() : Boolean{
val prefs: SharedPreferences = getSharedPreferences("es.verdnatura.user.prefs",0)
val sectorFk = prefs.getInt("sectorFk",-1)
return sectorFk != -1
}
private fun openFragment(fragment: Fragment,tagname:String) {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.main_frame_layout, fragment)
transaction.addToBackStack(null)
transaction.addToBackStack(tagname)
transaction.commit()
}
@ -69,11 +85,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>() , OnPasillerosItemClick
bottomMenu.menu.add(Menu.NONE, it.id, Menu.NONE, it.title).icon = it.defaultImage
}
// Select first item by default
val firstItem = bottomMenuItems.first()
bottomMenu.selectedItemId = firstItem.id
bottomMenu.menu.findItem(firstItem.id).icon = firstItem.selectedImage
lastBottomMenuItemSelected = firstItem
if(haveSector()){
// Select first item by default
val firstItem = bottomMenuItems.first()
bottomMenu.selectedItemId = firstItem.id
bottomMenu.menu.findItem(firstItem.id).icon = firstItem.selectedImage
lastBottomMenuItemSelected = firstItem
}else{
// Select last item by default
val lastItem = bottomMenuItems.last()
bottomMenu.selectedItemId = lastItem.id
bottomMenu.menu.findItem(lastItem.id).icon = lastItem.selectedImage
lastBottomMenuItemSelected = lastItem
}
bottomMenu.setOnNavigationItemSelectedListener { menuItem ->
// Get selected item from itemList and apply ui changes to menu view
@ -87,7 +113,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() , OnPasillerosItemClick
when (selectedItemMenu?.title) {
"Pasilleros" -> {
addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG)
fm.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE)
addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG,false)
true
}
"Sacadores" -> {
@ -99,7 +126,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() , OnPasillerosItemClick
true
}
"Ajustes" -> {
addFragment(AjustesFragment.newInstance(),R.id.main_frame_layout, AjustesFragment.TAG)
fm.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE)
addFragment(AjustesFragment.newInstance(),R.id.main_frame_layout, AjustesFragment.TAG,false)
true
}
@ -116,17 +144,28 @@ class MainActivity : BaseActivity<ActivityMainBinding>() , OnPasillerosItemClick
}
override fun onPasillerosItemClickListener(item: PasillerosItemVO) {
when (item.title){
"Consultar artículo" -> {
openFragment(ItemCardFragment(),"PASILLEROS")
}
}
Log.i("Item: ",item.title)
}
override fun onBackPressed() {
customDialog.setTitle("Error").setDescription("¿Estás seguro de cerrar la sesión?").setOkButton("Salir"){
customDialog.hide()
finish()
}.setKoButton("Cancelar") {
customDialog.hide()
}.show()
if (fm.backStackEntryCount > 0) {
super.onBackPressed()
} else {
customDialog.setTitle("Cerrar sesión").setDescription("¿Estás seguro de cerrar la sesión?").setOkButton("Salir"){
customDialog.hide()
finish()
}.setKoButton("Cancelar") {
customDialog.hide()
}.show()
}
}
}

View File

@ -1,12 +1,15 @@
package es.verdnatura.presentation.view.feature.pasillero.fragment
import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentPasilleroBinding
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.feature.pasillero.adapter.PasillerosAdapter
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_pasillero.*
class PasilleroFragment : BaseFragment<FragmentPasilleroBinding,PasilleroViewModel>(PasilleroViewModel::class){
@ -25,10 +28,16 @@ class PasilleroFragment : BaseFragment<FragmentPasilleroBinding,PasilleroViewMod
override fun getLayoutId(): Int = R.layout.fragment_pasillero
override fun init() {
viewModel.inititializeDefaultData()
activity!!.main_bottom_navigation.visibility = View.VISIBLE
super.init()
}
override fun onCreate(savedInstanceState: Bundle?) {
viewModel.inititializeDefaultData()
super.onCreate(savedInstanceState)
}
override fun observeViewModel() {

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="270"
android:centerY="40%"
android:type="linear"
android:startColor="@color/verdnatura_black"
android:centerColor="#AE000000"
android:endColor="@android:color/transparent" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<data>
<variable
name="viewModel"
type="es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/main_toolbar"
layout="@layout/toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/edit_itemFk"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/verdnatura_white"
android:inputType="number"
android:maxLines="1"
android:padding="@dimen/layout_margin_1"
android:textColor="@color/verdnatura_black"
android:textSize="@dimen/body1"
android:hint="Escanea o introduce item"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/main_toolbar" />
<LinearLayout
android:id="@+id/splash_progress"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/verdnatura_black_8_alpha_6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:gravity="center">
<com.airbnb.lottie.LottieAnimationView
android:layout_width="wrap_content"
android:layout_height="@dimen/verdnatura_logo_large_height"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/orange_loading"
app:lottie_speed="2" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -12,7 +12,8 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/verdnatura_black">
<androidx.recyclerview.widget.RecyclerView

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tool="http://schemas.android.com/tools">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@drawable/background_gradient">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/toolbar_title_separator"
android:layout_width="2dp"
android:layout_height="@dimen/toolbar_icon_height"
android:layout_marginTop="@dimen/default_layout_margin"
android:layout_marginBottom="@dimen/default_layout_margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/verdnatura_pumpkin_orange" />
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_layout_margin"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/verdnatura_white"
android:textSize="@dimen/h6"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/toolbar_title_separator"
app:layout_constraintTop_toTopOf="parent"
android:text="ItemCard" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/toolbar_icons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/layout_margin_1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.Toolbar>
</layout>