cl.gisred.android.LectorActivity.java Source code

Java tutorial

Introduction

Here is the source code for cl.gisred.android.LectorActivity.java

Source

package cl.gisred.android;

import android.Manifest;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.esri.android.map.Callout;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.Layer;
import com.esri.android.map.LocationDisplayManager;
import com.esri.android.map.LocationDisplayManager.AutoPanMode;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISDynamicMapServiceLayer;
import com.esri.android.map.ags.ArcGISFeatureLayer;
import com.esri.android.map.ags.ArcGISLayerInfo;
import com.esri.android.map.bing.BingMapsLayer;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.android.map.event.OnStatusChangedListener;
import com.esri.android.runtime.ArcGISRuntime;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.GeometryEngine;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.Polyline;
import com.esri.core.geometry.SpatialReference;
import com.esri.core.io.EsriSecurityException;
import com.esri.core.io.UserCredentials;
import com.esri.core.map.CallbackListener;
import com.esri.core.map.Feature;
import com.esri.core.map.FeatureEditResult;
import com.esri.core.map.FeatureResult;
import com.esri.core.map.Graphic;
import com.esri.core.runtime.LicenseLevel;
import com.esri.core.runtime.LicenseResult;
import com.esri.core.symbol.SimpleLineSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esri.core.tasks.identify.IdentifyParameters;
import com.esri.core.tasks.identify.IdentifyResult;
import com.esri.core.tasks.identify.IdentifyTask;
import com.esri.core.tasks.query.QueryParameters;
import com.esri.core.tasks.query.QueryTask;
import com.getbase.floatingactionbutton.FloatingActionButton;
import com.getbase.floatingactionbutton.FloatingActionsMenu;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

import cl.gisred.android.classes.GisEditText;
import cl.gisred.android.classes.GisTextView;
import cl.gisred.android.entity.BusqEquipoClass;
import cl.gisred.android.entity.BusqMedClass;
import cl.gisred.android.entity.CalloutTvClass;
import cl.gisred.android.util.Util;

public class LectorActivity extends AppCompatActivity {

    ArrayList<Integer> mSelectedItems = new ArrayList<Integer>();
    MapView myMapView = null;

    LocationDisplayManager ldm;
    public static Point mLocation = null;

    //INSTANCES
    UserCredentials credenciales;
    String usuar, passw, modulo, empresa;

    //url para token srv
    String urlToken;

    //variable para guardar spinner seleccionado en Dialog  de Busqueda
    int SpiBusqueda;
    String txtBusqueda;

    //ArrayList MapsType
    public String[] tipoMapas = { "Carreteras", "Aerea", "Aerea Detalles", "Chilquinta" };

    //ArrayList SearchFilter
    public String[] searchArray = { "Clientes", "SED", "Poste", "Medidor", "Direccin", "Equipo" };

    //ArrayList Layer
    public String[] listadoCapas = { "SED", "SSEE", "Salida Alimentador", "Postes", "Red MT", "Red BT", "Red AP",
            "Equipos Linea", "Equipos Puntos", "Luminarias", "Clientes", "Medidores", "Concesiones", "Direcciones",
            "Empalmes", "Red sTX", "Torres sTX", "ECSE Encuestados", "ECSE Reemplazos", "Electro Dependientes" };

    public String[] arrayTipoEdif = {};
    public String[] arrayTipoPoste = {};
    public String[] arrayTension = {};
    public String[] arrayMedidor = {};
    public String[] arrayEmpalme = {};
    public String[] arrayTecMedidor = {};
    public String[] arrayTipoCnr = {};
    public String[] arrayTipoFase = {};
    public String[] arrayEstado = {};
    public String[] arrayUserCosenza = {};

    public boolean fool[] = { false, false, false, false, false, false, false, false, false, false, false, false,
            false, false, false, false, false, false, false, false };

    //url para dinamyc layers
    String din_urlMapaBase, din_urlEquiposPunto, din_urlEquiposLinea, din_urlTramos, din_urlNodos,
            din_urlLuminarias, din_urlClientes, din_urlConcesiones, din_urlMedidores, din_urlDirecciones,
            din_urlStx, din_urlInterrupciones, din_urlECSE, din_urlElectroDep;
    //url para feature layers
    String srv_urlPostes, srv_urlDireccion, srv_urlClientes, srv_urlClientesCnr, srv_urlUnion012, srv_calles,
            srv_lectores;

    //Set bing Maps
    String BingKey = "Asrn2IMtRwnOdIRPf-7q30XVUrZuOK7K2tzhCACMg7QZbJ4EPsOcLk6mE9-sNvUe";
    final BingMapsLayer mAerialBaseMaps = new BingMapsLayer(BingKey, BingMapsLayer.MapStyle.AERIAL);
    final BingMapsLayer mAerialWLabelBaseMaps = new BingMapsLayer(BingKey,
            BingMapsLayer.MapStyle.AERIAL_WITH_LABELS);
    final BingMapsLayer mRoadBaseMaps = new BingMapsLayer(BingKey, BingMapsLayer.MapStyle.ROAD);

    ArcGISDynamicMapServiceLayer LySED, LySSEE, LySALIDAALIM, LyREDMT, LyREDBT, LyREDAP, LyPOSTES, LyEQUIPOSLINEA,
            LyEQUIPOSPTO, LyLUMINARIAS, LyCLIENTES, LyMEDIDORES, LyCONCESIONES, LyDIRECCIONES, LyEMPALMES,
            LyMapabase, LyREDSTX, LyTORRESSTX, LyENCUESTA, LyREEMPLAZO, LyELECTRODEP;
    ArcGISFeatureLayer LyAddPoste, LyAddDireccion, LyAddCliente, LyAddClienteCnr, LyAddUnion, LyAsocTramo,
            LyAsocCalle, LyAddLectores;

    //set Extent inicial
    Polygon mCurrentMapExtent = null;
    // Spatial references used for projecting points
    final SpatialReference wm = SpatialReference.create(102100);
    final SpatialReference egs = SpatialReference.create(4326);

    //Constantes
    private static final String modIngreso = "INGRESO_CLIENTES";
    private static final String modLectores = "LECTORES";

    //Sets
    ArrayList<String> arrayWidgets;
    ArrayList<String> arrayModulos;
    private int choices;
    ProgressDialog progress;

    BusqMedClass[] datosBusqMed;
    BusqEquipoClass[] datosBusqEquipo;

    ListView lstBusqMedidores;
    ListView lstBusqEquipos;

    boolean bAlertGps = false;

    GraphicsLayer mBusquedaLayer;
    GraphicsLayer mSeleccionLayer;
    GraphicsLayer mUbicacionLayer;
    private double iBusqScale;

    ShapeDrawable drawOk;
    ShapeDrawable drawNo;
    private boolean bVerData = false;
    private boolean bVerCapas = false;
    private boolean bMapTap = false;
    private boolean bCallOut = false;
    private int nIndentify = 0;
    private GisEditText oTxtAsoc;
    private GraphicsLayer oLyViewGraphs;
    private ArcGISFeatureLayer oLySelectAsoc;
    private ArcGISDynamicMapServiceLayer oLyExistAsoc;
    private ArcGISFeatureLayer oLyAddGraphs;
    private int idResLayoutSelect;
    private Point oUbicacion;
    private Point oUbicacionForm;

    private Graphic[] addsUnion = {};

    Dialog dialogCrear;
    Dialog dialogBusq;
    Dialog formCrear;
    Dialog dialogCur;
    boolean bIngCliente = true;
    ArrayList<View> arrayTouchs = null;
    ImageButton btnUbicacion = null;
    FloatingActionsMenu menuMultipleActions;
    FloatingActionsMenu menuLectorActions;
    FloatingActionButton fabShowDialog;
    FloatingActionButton fabShowForm;
    FloatingActionButton fabVerCapas;
    FloatingActionButton fabNavRoute;

    private static final String CLIENT_ID = "ZWIfL6Tqb4kRdgZ4";

    HashMap<Integer, String> layerDefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LicenseResult licenseResult = ArcGISRuntime.setClientId(CLIENT_ID);
        LicenseLevel licenseLevel = ArcGISRuntime.License.getLicenseLevel();

        if (licenseResult == LicenseResult.VALID && licenseLevel == LicenseLevel.BASIC) {
            //Toast.makeText(getApplicationContext(), "Licencia bsica vlida", Toast.LENGTH_SHORT).show();
        } else if (licenseResult == LicenseResult.VALID && licenseLevel == LicenseLevel.STANDARD) {
            //Toast.makeText(getApplicationContext(), "Licencia standard vlida", Toast.LENGTH_SHORT).show();
        }

        setContentView(R.layout.activity_lector);

        Toolbar toolbar = (Toolbar) findViewById(R.id.apptool);
        setSupportActionBar(toolbar);

        /*Get Credenciales String*/
        Bundle bundle = getIntent().getExtras();
        usuar = bundle.getString("usuario");
        passw = bundle.getString("password");
        modulo = bundle.getString("modulo");
        empresa = bundle.getString("empresa");

        //Set Credenciales
        setCredenciales(usuar, passw);

        //Set Mapa
        setMap(R.id.map, 0xffffff, 0xffffff, 10, 10, false, true);
        choices = 0;

        if (Build.VERSION.SDK_INT >= 23)
            verifPermisos();
        else
            initGeoposition();

        setLayersURL(this.getResources().getString(R.string.url_Mapabase), "MAPABASE");
        setLayersURL(this.getResources().getString(R.string.url_token), "TOKENSRV");
        setLayersURL(this.getResources().getString(R.string.url_EquiposLinea), "EQUIPOS_LINEA");
        setLayersURL(this.getResources().getString(R.string.url_TRAMOS), "TRAMOS");
        setLayersURL(this.getResources().getString(R.string.url_EquiposPTO), "EQUIPOS_PTO");
        setLayersURL(this.getResources().getString(R.string.url_Nodos), "NODOS");
        setLayersURL(this.getResources().getString(R.string.url_Luminarias), "LUMINARIAS");
        setLayersURL(this.getResources().getString(R.string.url_Clientes), "CLIENTES");
        setLayersURL(this.getResources().getString(R.string.url_Concesiones), "CONCESIONES");
        setLayersURL(this.getResources().getString(R.string.url_Direcciones), "DIRECCIONES");
        setLayersURL(this.getResources().getString(R.string.url_medidores), "MEDIDORES");
        setLayersURL(this.getResources().getString(R.string.url_Stx), "STX");
        setLayersURL(this.getResources().getString(R.string.url_ECSE_varios), "ECSE");
        setLayersURL(this.getResources().getString(R.string.url_Electrodependientes), "ELECTRODEP");

        //Agrega layers dinmicos.
        addLayersToMap(credenciales, "DYNAMIC", "MAPABASECHQ", din_urlMapaBase, null, true);
        addLayersToMap(credenciales, "DYNAMIC", "SED", din_urlEquiposPunto, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "SSEE", din_urlEquiposPunto, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "SALIDAALIM", din_urlEquiposPunto, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "REDMT", din_urlTramos, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "REDBT", din_urlTramos, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "REDAP", din_urlTramos, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "POSTES", din_urlNodos, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "EQUIPOS_LINEA", din_urlEquiposLinea, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "EQUIPOS_PTO", din_urlEquiposPunto, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "LUMINARIAS", din_urlLuminarias, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "CLIENTES", din_urlClientes, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "MEDIDORES", din_urlMedidores, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "CONCESIONES", din_urlConcesiones, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "DIRECCIONES", din_urlDirecciones, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "EMPALMES", din_urlClientes, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "REDSTX", din_urlStx, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "TORRESSTX", din_urlStx, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "ENCUESTADO", din_urlECSE, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "REEMPLAZO", din_urlECSE, null, false);
        addLayersToMap(credenciales, "DYNAMIC", "ELECTRODEP", din_urlElectroDep, null, false);

        //Aade Layer al Mapa
        myMapView.addLayer(mRoadBaseMaps, 0);
        myMapView.addLayer(LySED, 1);
        myMapView.addLayer(LySSEE, 2);
        myMapView.addLayer(LySALIDAALIM, 3);
        myMapView.addLayer(LyPOSTES, 4);
        myMapView.addLayer(LyREDMT, 5);
        myMapView.addLayer(LyREDBT, 6);
        myMapView.addLayer(LyREDAP, 7);
        myMapView.addLayer(LyEQUIPOSLINEA, 8);
        myMapView.addLayer(LyEQUIPOSPTO, 9);
        myMapView.addLayer(LyLUMINARIAS, 10);
        myMapView.addLayer(LyCLIENTES, 11);
        myMapView.addLayer(LyMEDIDORES, 12);
        myMapView.addLayer(LyCONCESIONES, 13);
        myMapView.addLayer(LyDIRECCIONES, 14);
        myMapView.addLayer(LyEMPALMES, 15);
        myMapView.addLayer(LyREDSTX, 16);
        myMapView.addLayer(LyTORRESSTX, 17);
        myMapView.addLayer(LyENCUESTA, 18);
        myMapView.addLayer(LyREEMPLAZO, 19);
        myMapView.addLayer(LyELECTRODEP, 20);

        final FloatingActionButton btnGps = (FloatingActionButton) findViewById(R.id.action_gps);
        btnGps.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                    alertNoGps();
                }
                toogleGps(v);
            }
        });

        btnGps.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(getApplicationContext(), "Funcin Gps", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        final FloatingActionButton btnVerData = (FloatingActionButton) findViewById(R.id.action_ver_data);
        btnVerData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toogleData(v);
            }
        });

        btnVerData.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(getApplicationContext(), "Ver Datos", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        drawOk = new ShapeDrawable(new OvalShape());
        drawOk.getPaint().setColor(getResources().getColor(R.color.colorPrimary));

        drawNo = new ShapeDrawable(new OvalShape());
        drawNo.getPaint().setColor(getResources().getColor(R.color.black_overlay));

        menuLectorActions = (FloatingActionsMenu) findViewById(R.id.lector_actions);
        menuMultipleActions = (FloatingActionsMenu) findViewById(R.id.multiple_actions);

        fabShowDialog = (FloatingActionButton) findViewById(R.id.action_show_dialog);
        if (fabShowDialog != null)
            fabShowDialog.setVisibility(View.GONE);

        fabShowForm = (FloatingActionButton) findViewById(R.id.action_show_form);
        if (fabShowForm != null)
            fabShowForm.setVisibility(View.GONE);

        fabVerCapas = (FloatingActionButton) findViewById(R.id.action_ver_capa);
        if (fabVerCapas != null)
            fabVerCapas.setVisibility(View.GONE);

        fabNavRoute = (FloatingActionButton) findViewById(R.id.action_nav_route);
        if (fabNavRoute != null) {
            fabNavRoute.setVisibility(View.GONE);
            fabNavRoute.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (myMapView != null && myMapView.getCallout().isShowing()) {
                        Point p = (Point) GeometryEngine.project(myMapView.getCallout().getCoordinates(), wm, egs);
                        Util.QueryNavigation(LectorActivity.this, p);
                    }
                }
            });

            fabNavRoute.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Toast.makeText(getApplicationContext(), "Ir a Ruta", Toast.LENGTH_SHORT).show();
                    return true;
                }
            });
        }
        if (modulo.replace(" ", "_").equals(modLectores)) {

            setLayersURL(this.getResources().getString(R.string.srv_Lectores), "SRV_LECTORES");
            setLayersURL(this.getResources().getString(R.string.srv_Postes), "SRV_POSTES");
            setLayersURL(this.getResources().getString(R.string.srv_Direcciones), "SRV_DIRECCIONES");

            addLayersToMap(credenciales, "FEATURE", "ADDLECTOR", srv_lectores, null, true);
            addLayersToMap(credenciales, "FEATURE", "ADDPOSTE", srv_urlPostes, null, true);
            addLayersToMap(credenciales, "FEATURE", "ADDADDRESS", srv_urlDireccion, null, true);

            myMapView.addLayer(LyAddLectores, 21);
            myMapView.addLayer(LyAddPoste, 22);
            myMapView.addLayer(LyAddDireccion, 23);

            arrayTipoEdif = getResources().getStringArray(R.array.tipo_edificacion);
            arrayEstado = getResources().getStringArray(R.array.estado_lectura);
            arrayUserCosenza = getResources().getStringArray(R.array.user_cosenza);

            arrayWidgets = bundle.getStringArrayList("widgets");
            arrayModulos = bundle.getStringArrayList("modulos");

            formCrear = new Dialog(LectorActivity.this);
            fabShowForm.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    bMapTap = false;
                    bCallOut = false;
                    myMapView.getCallout().hide();

                    if (oUbicacion != null) {
                        btnUbicacion.setColorFilter(Color.BLACK);
                        setEnabledDialog(true);
                    }
                    formCrear.show();
                }
            });

            FloatingActionButton oFabForm = (FloatingActionButton) findViewById(R.id.action_form);
            oFabForm.setIconDrawable(drawOk);
            oFabForm.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    abrirFormIngreso(v);
                }
            });

            FloatingActionButton oFabDenuncio = (FloatingActionButton) findViewById(R.id.action_denuncio);
            oFabDenuncio.setIconDrawable(drawNo);
            oFabDenuncio.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //abrirFormDenuncio(v);
                    Snackbar.make(v, "No tiene acceso a sta opcin", Snackbar.LENGTH_SHORT).show();
                    menuLectorActions.collapse();
                }
            });

            if (arrayModulos != null && arrayModulos.size() > 0
                    && arrayModulos.contains(empresa + "@" + modIngreso)) {

                arrayTipoPoste = getResources().getStringArray(R.array.tipo_poste);
                arrayTension = getResources().getStringArray(R.array.tipo_tension);
                arrayTipoEdif = getResources().getStringArray(R.array.tipo_edificacion);
                arrayMedidor = getResources().getStringArray(R.array.tipo_medidor);
                arrayEmpalme = getResources().getStringArray(R.array.tipo_empalme);
                arrayTecMedidor = getResources().getStringArray(R.array.tec_medidor);
                arrayTipoCnr = getResources().getStringArray(R.array.tipo_cnr);
                arrayTipoFase = getResources().getStringArray(R.array.fase_conexion);

                dialogCrear = new Dialog(LectorActivity.this);

                fabShowDialog.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        bMapTap = false;
                        bCallOut = false;
                        myMapView.getCallout().hide();

                        if (oUbicacion != null) {
                            btnUbicacion.setColorFilter(Color.BLACK);
                            setEnabledDialog(true);
                        }
                        dialogCrear.show();
                        if (mSeleccionLayer != null && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
                            myMapView.removeLayer(mSeleccionLayer);
                    }
                });

                fabVerCapas.setVisibility(View.VISIBLE);
                fabVerCapas.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        toogleCapas(v);
                    }
                });

                fabVerCapas.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        Toast.makeText(getApplicationContext(), "Ver Capas de Ingreso", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });

                final FloatingActionButton actionA = (FloatingActionButton) findViewById(R.id.action_a);
                final FloatingActionButton actionB = (FloatingActionButton) findViewById(R.id.action_b);
                final FloatingActionButton actionC = (FloatingActionButton) findViewById(R.id.action_c);
                final FloatingActionButton actionD = (FloatingActionButton) findViewById(R.id.action_d);

                setOpcion(actionA, null);
                setOpcion(actionB, null);
                setOpcion(actionC, modIngreso + "_TECNO");
                setOpcion(actionD, modIngreso + "_CNR");

                setLayersURL(this.getResources().getString(R.string.srv_Clientes), "SRV_CLIENTES");
                setLayersURL(this.getResources().getString(R.string.srv_Union_012), "SRV_UNIONES");
                setLayersURL(din_urlTramos, "TRAMOS");
                setLayersURL(this.getResources().getString(R.string.url_Mapabase), "SRV_CALLES");
                setLayersURL(this.getResources().getString(R.string.srv_ClientesCnr), "SRV_CLIENTESCNR");

                addLayersToMap(credenciales, "FEATURE", "ADDCLIENTE", srv_urlClientes, null, true);
                addLayersToMap(credenciales, "FEATURE", "ADDUNION", srv_urlUnion012, null, true);
                addLayersToMap(credenciales, "FEATURE", "ASOCTRAMO", LyREDBT.getUrl(), null, false);
                addLayersToMap(credenciales, "FEATURE", "ASOCCALLE", srv_calles, null, false);
                addLayersToMap(credenciales, "FEATURE", "ADDCLIENTECNR", srv_urlClientesCnr, null, true);

                myMapView.addLayer(LyAddCliente, 24);
                myMapView.addLayer(LyAddUnion, 25);
                myMapView.addLayer(LyAsocTramo, 26);
                myMapView.addLayer(LyAsocCalle, 27);
                myMapView.addLayer(LyAddClienteCnr, 28);

                setLayerAddToggle(false);
            } else {
                bIngCliente = false;
                menuMultipleActions.setVisibility(View.GONE);
                //Informar al usuario que carece de permisos para ver y usar la capa de ingreso clientes comun
            }

        } else {
            menuLectorActions.setVisibility(View.GONE);
        }
    }

    private void verifPermisos() {
        if (ContextCompat.checkSelfPermission(LectorActivity.this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(LectorActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION)) {

            } else {
                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions(LectorActivity.this,
                        new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
                        Util.REQUEST_ACCESS_FINE_LOCATION);
            }
        } else {
            initGeoposition();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.map_menu, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.

        boolean retVal;
        switch (item.getItemId()) {

        case R.id.action_layers:
            alertMultipleChoiceItems();
            return true;

        case R.id.action_search:
            dialogBusqueda();
            return true;

        case R.id.action_maps:
            choiceMaps(choices);
            return true;

        default:
            retVal = super.onOptionsItemSelected(item);
            break;
        }

        return retVal;
    }

    private void setOpcion(Object o, String widget) {
        if (o != null) {
            if (widget != null) {
                FloatingActionButton oFab = (FloatingActionButton) o;
                if (arrayWidgets.contains(empresa + "@" + widget)) {
                    oFab.setIconDrawable(drawOk);
                    oFab.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            abrirDialogCrear(v);
                        }
                    });
                } else {
                    oFab.setIconDrawable(drawNo);
                    oFab.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Snackbar.make(v, "No tiene acceso a sta opcin", Snackbar.LENGTH_SHORT).show();
                            menuMultipleActions.collapse();
                        }
                    });
                }
            } else {
                FloatingActionButton oFab = (FloatingActionButton) o;
                oFab.setIconDrawable(drawOk);
                oFab.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        abrirDialogCrear(v);
                    }
                });
            }
        }
    }

    private void setEnabledDialog(boolean bEnable) {
        View vDialog = getLayoutValidate(btnUbicacion);

        if (!bEnable) {
            for (View view : vDialog.getTouchables()) {
                if (view.getId() != R.id.btnUbicacion && view.getId() != R.id.btnCancelar
                        && view.getId() != R.id.txtNis && view.getId() != R.id.btnVerifNis)
                    arrayTouchs.add(view);
            }
        }

        for (View touch : arrayTouchs) {
            touch.setEnabled(bEnable);
        }

    }

    private int recorrerForm(View v) {
        int contRequeridos = 0;

        for (View view : v.getTouchables()) {

            if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                EditText oText = (EditText) view;

                TextInputLayout oTextInput = (TextInputLayout) oText.getParentForAccessibility();
                if (oTextInput.getHint() != null && oTextInput.getHint().toString().contains("*")) {
                    if (oText.getText().toString().trim().isEmpty()) {
                        contRequeridos++;
                        oText.setError("Campo obligatorio");
                    } else {
                        oText.setError(null);
                    }
                }

            } // Validacion especial para estado lectores
            else if (view.getClass().getGenericSuperclass().equals(Spinner.class)) {
                Spinner oSpinner = (Spinner) view;
                if (oSpinner.getSelectedItem().toString().isEmpty())
                    contRequeridos++;
            }
        }

        return contRequeridos;
    }

    private int recorrerDialog(View v) {
        int contRequeridos = 0;

        for (View view : v.getTouchables()) {

            if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                EditText oText = (EditText) view;
                TextInputLayout oTextInput = (TextInputLayout) oText.getParentForAccessibility();
                if (oTextInput.getHint() != null && oTextInput.getHint().toString().contains("*")) {
                    if (oText.getText().toString().trim().isEmpty())
                        contRequeridos++;
                }
            } else if (view.getClass().getGenericSuperclass().equals(Spinner.class)) {
            }
        }

        return contRequeridos;
    }

    private View getLayoutChkNis(View v) {
        if (v.getId() == R.id.llCliente) {
            return (View) v.getParent();
        } else {
            return getLayoutChkNis((View) v.getParent());
        }
    }

    private View getLayoutValidate(View v) {
        if (v.getId() == R.id.actionDialog) {
            return (View) v.getParent();
        } else {
            return getLayoutValidate((View) v.getParent());
        }
    }

    private View getLayoutContenedor(View v) {
        if (v.getClass().equals(LinearLayout.class))
            return v;
        else
            return getLayoutContenedor((View) v.getParent());
    }

    private void setValueToAsoc(View v) {
        for (View view : v.getTouchables()) {
            if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                oTxtAsoc = (GisEditText) view;
            }
        }
    }

    private String getValueNis(View v) {
        String sResp = "";
        for (View view : v.getTouchables()) {
            if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                sResp = ((EditText) view).getText().toString();
                break;
            }
        }
        return sResp;
    }

    private void setValuesByNis(View v) {
        for (View view : v.getTouchables()) {
            if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                oTxtAsoc = (GisEditText) view;
            }
        }
    }

    public void getTramoToDialog(Point oSelect) {

        if (oSelect != null) {
            IdentifyParameters params = new IdentifyParameters();
            // Add to Identify Parameters based on tapped location
            params.setTolerance(20);
            params.setDPI(98);
            params.setLayers(new int[] { 1 });
            params.setLayerMode(IdentifyParameters.VISIBLE_LAYERS);
            params.setGeometry(oSelect);
            params.setSpatialReference(myMapView.getSpatialReference());
            params.setMapHeight(myMapView.getHeight());
            params.setMapWidth(myMapView.getWidth());
            params.setReturnGeometry(false);

            // add the area of extent to identify parameters
            Envelope env = new Envelope();
            myMapView.getExtent().queryEnvelope(env);
            params.setMapExtent(env);

            String urlTest = oLySelectAsoc.getUrl();

            // execute the identify task off UI thread
            IdentifyResults mTask = new IdentifyResults("id_tramo", oSelect, urlTest, credenciales);
            mTask.execute(params);
        }
    }

    public void getInfoObject(Point oSelect, ArcGISDynamicMapServiceLayer[] aLayers) {

        if (oSelect != null) {
            IdentifyParameters params = new IdentifyParameters();
            // Add to Identify Parameters based on tapped location
            params.setTolerance(20);
            params.setDPI(98);
            params.setLayerMode(IdentifyParameters.VISIBLE_LAYERS);
            params.setGeometry(oSelect);
            params.setSpatialReference(myMapView.getSpatialReference());
            params.setMapHeight(myMapView.getHeight());
            params.setMapWidth(myMapView.getWidth());
            params.setReturnGeometry(true);

            // add the area of extent to identify parameters
            Envelope env = new Envelope();
            myMapView.getExtent().queryEnvelope(env);
            params.setMapExtent(env);

            // execute the identify task off UI thread
            IdentifyResults mTask = new IdentifyResults(oSelect, aLayers, credenciales);
            mTask.execute(params);
        }
    }

    public void getAsocObject(Point oSelect) {

        if (oSelect != null) {
            IdentifyParameters params = new IdentifyParameters();
            // Add to Identify Parameters based on tapped location
            params.setTolerance(20);
            params.setDPI(98);
            params.setLayerMode(IdentifyParameters.ALL_LAYERS);
            params.setGeometry(oSelect);
            params.setSpatialReference(myMapView.getSpatialReference());
            params.setMapHeight(myMapView.getHeight());
            params.setMapWidth(myMapView.getWidth());
            params.setReturnGeometry(true);

            // add the area of extent to identify parameters
            Envelope env = new Envelope();
            myMapView.getExtent().queryEnvelope(env);
            params.setMapExtent(env);

            // execute the identify task off UI thread
            IdentifyResults mTask = new IdentifyResults(oSelect, new String[] { oLyExistAsoc.getUrl() },
                    credenciales, true);
            mTask.execute(params);
        }
    }

    public void getCalleToDialog(Point oSelect) {
        if (oSelect != null) {
            IdentifyParameters params = new IdentifyParameters();
            params.setTolerance(20);
            params.setDPI(98);
            params.setLayers(new int[] { 2 });
            params.setLayerMode(IdentifyParameters.ALL_LAYERS);
            params.setGeometry(oSelect);
            params.setSpatialReference(myMapView.getSpatialReference());
            params.setMapHeight(myMapView.getHeight());
            params.setMapWidth(myMapView.getWidth());
            params.setReturnGeometry(false);

            Envelope env = new Envelope();
            myMapView.getExtent().queryEnvelope(env);
            params.setMapExtent(env);

            String urlTest = oLySelectAsoc.getUrl();

            // execute the identify task off UI thread
            IdentifyResults mTask = new IdentifyResults("nombre", oSelect, urlTest, credenciales);
            mTask.execute(params);
        }
    }

    private void cerrarFormCrear(boolean bSave, View v) {
        if (bSave) {

            final AtomicReference<String> resp = new AtomicReference<>("");

            if (!validarForm(v)) {
                DialogoConfirmacion oDialog = new DialogoConfirmacion();
                oDialog.show(getFragmentManager(), "tagAlert");
                return;
            } else {
                View vAction = getLayoutValidate(v);
                Map<String, Object> objectMap = new HashMap<>();
                for (View view : vAction.getTouchables()) {

                    if (view.getClass().getGenericSuperclass().equals(EditText.class)) {
                        EditText oText = (EditText) view;

                        if (oText.getId() == R.id.txtNroMedidor) {
                            String oVal = (oText.getText().toString().isEmpty()) ? "0" : oText.getText().toString();
                            objectMap.put("nro_medidor", oVal);
                        }
                        if (oText.getId() == R.id.txtLectura) {
                            String oVal = (oText.getText().toString().isEmpty()) ? "0" : oText.getText().toString();
                            objectMap.put("lectura_actual", oVal);
                        }
                        if (oText.getId() == R.id.txtPoste)
                            objectMap.put("poste", oText.getText().toString());
                        if (oText.getId() == R.id.txtDireccion)
                            objectMap.put("direccion", oText.getText().toString());

                    } else if (view.getClass().getGenericSuperclass().equals(Spinner.class)) {
                        Spinner oSpinner = (Spinner) view;
                        String sValue = oSpinner.getSelectedItem().toString();

                        if (oSpinner.getId() == R.id.spinnerEstado)
                            objectMap.put("estado", sValue);
                        else if (oSpinner.getId() == R.id.spinnerTipoEdific)
                            objectMap.put("tipo_edificacion", sValue);
                        else if (oSpinner.getId() == R.id.spinnerUser)
                            objectMap.put("lector", sValue);
                    }
                }

                Graphic newFeatureGraphic = new Graphic(oUbicacion, null, objectMap);
                Graphic[] adds = { newFeatureGraphic };
                LyAddLectores.applyEdits(adds, null, null, new CallbackListener<FeatureEditResult[][]>() {
                    @Override
                    public void onCallback(FeatureEditResult[][] featureEditResults) {
                        if (featureEditResults[0] != null) {
                            if (featureEditResults[0][0] != null && featureEditResults[0][0].isSuccess()) {

                                resp.set("Guardado Correctamente Id: " + featureEditResults[0][0].getObjectId());

                                runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        Util.showConfirmation(LectorActivity.this, resp.get());
                                    }
                                });
                            }
                        }
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        resp.set("Error al ingresar: " + throwable.getLocalizedMessage());
                        Log.w("onError", resp.get());

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Toast.makeText(LectorActivity.this, resp.get(), Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });
            }
        }

        bMapTap = false;
        oUbicacion = null;

        if (mBusquedaLayer != null && myMapView.getLayerByID(mBusquedaLayer.getID()) != null)
            myMapView.removeLayer(mBusquedaLayer);

        if (mUbicacionLayer != null && myMapView.getLayerByID(mUbicacionLayer.getID()) != null)
            myMapView.removeLayer(mUbicacionLayer);

        if (mSeleccionLayer != null && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
            myMapView.removeLayer(mSeleccionLayer);

        if (bVerCapas)
            toogleCapas(fabVerCapas);

        if (bIngCliente)
            menuMultipleActions.setVisibility(View.VISIBLE);
        menuLectorActions.setVisibility(View.VISIBLE);
        fabShowForm.setVisibility(View.GONE);
        formCrear.dismiss();

        if (LyAddLectores != null)
            LyAddLectores.setVisible(true);
    }

    private void cerrarDialogCrear(boolean bSave, @Nullable View viewDialog) {
        final AtomicReference<String> resp = new AtomicReference<>("");

        if (bSave) {
            if (!validarVista(viewDialog)) {
                DialogoConfirmacion oDialog = new DialogoConfirmacion();
                oDialog.show(getFragmentManager(), "tagAlert");
                return;
            } else {
                switch (idResLayoutSelect) {
                case R.layout.dialog_poste:
                    oLyAddGraphs = LyAddPoste;
                    break;
                case R.layout.dialog_direccion:
                    oLyAddGraphs = LyAddDireccion;
                    break;
                case R.layout.dialog_cliente:
                    oLyAddGraphs = LyAddCliente;
                    break;
                case R.layout.dialog_cliente_cnr:
                    oLyAddGraphs = LyAddClienteCnr;
                    break;
                }

                if (oLyAddGraphs != null) {
                    View oView = getLayoutValidate(viewDialog);
                    Util oUtil = new Util(oUbicacion);

                    ArrayList<Map<String, Object>> oAttrToSave = oUtil.getAttrAddByView(oView, idResLayoutSelect,
                            empresa);

                    Map<String, Object> attributes = oAttrToSave.get(0);
                    Graphic newFeatureGraphic = new Graphic(oUbicacion, null, attributes);
                    Graphic[] adds = { newFeatureGraphic };

                    if (idResLayoutSelect == R.layout.dialog_cliente_cnr
                            || idResLayoutSelect == R.layout.dialog_cliente) {
                        addsUnion = Util.addAttrUnionPoint(oAttrToSave, oUbicacion);
                    }

                    oLyAddGraphs.applyEdits(adds, null, null, new CallbackListener<FeatureEditResult[][]>() {

                        @Override
                        public void onCallback(FeatureEditResult[][] featureEditResults) {
                            if (featureEditResults[0] != null) {
                                if (featureEditResults[0][0] != null && featureEditResults[0][0].isSuccess()) {

                                    resp.set(
                                            "Guardado Correctamente Id: " + featureEditResults[0][0].getObjectId());

                                    if (idResLayoutSelect == R.layout.dialog_cliente_cnr
                                            || idResLayoutSelect == R.layout.dialog_cliente)
                                        LyAddUnion.applyEdits(addsUnion, null, null, callBackUnion());

                                    runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            Util.showConfirmation(LectorActivity.this, resp.get());
                                        }
                                    });
                                }
                            }
                        }

                        @Override
                        public void onError(Throwable throwable) {
                            resp.set("Error al grabar: " + throwable.getLocalizedMessage());
                            Log.w("onError", resp.get());

                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    Toast.makeText(LectorActivity.this, resp.get(), Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

                    });
                }
            }
        } else {
            resp.set("Cancelado");
            Toast.makeText(LectorActivity.this, resp.get(), Toast.LENGTH_LONG).show();
        }

        bMapTap = false;

        if (mBusquedaLayer != null && myMapView.getLayerByID(mBusquedaLayer.getID()) != null)
            myMapView.removeLayer(mBusquedaLayer);

        if (mUbicacionLayer != null && myMapView.getLayerByID(mUbicacionLayer.getID()) != null)
            myMapView.removeLayer(mUbicacionLayer);

        if (mSeleccionLayer != null && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
            myMapView.removeLayer(mSeleccionLayer);

        oUbicacion = null;
        if (bVerCapas)
            toogleCapas(fabVerCapas);
        //setLayerAddToggle(false);
        if (bIngCliente)
            menuMultipleActions.setVisibility(View.VISIBLE);
        menuLectorActions.setVisibility(View.VISIBLE);
        fabShowDialog.setVisibility(View.GONE);
        dialogCrear.dismiss();
        if (oLyAddGraphs != null)
            oLyAddGraphs.setVisible(true);
    }

    private CallbackListener<FeatureEditResult[][]> callBackUnion() {

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(LectorActivity.this, "Aplicando uniones", Toast.LENGTH_SHORT).show();
            }
        });

        return null;
    }

    class AdaptBusqMedidor extends ArrayAdapter<BusqMedClass> {

        public AdaptBusqMedidor(Context context, BusqMedClass[] datos) {
            super(context, R.layout.list_item_busq_med, datos);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View item = inflater.inflate(R.layout.list_item_busq_med, null);

            TextView lblNis = (TextView) item.findViewById(R.id.LblSerieNis);
            lblNis.setText(datosBusqMed[position].getSerieNis());

            TextView lblMarca = (TextView) item.findViewById(R.id.LblMarca);
            lblMarca.setText(datosBusqMed[position].getMarca());

            TextView lblModelo = (TextView) item.findViewById(R.id.LblModelo);
            lblModelo.setText(datosBusqMed[position].getModelo());

            return (item);
        }
    }

    class AdaptBusqEquipo extends ArrayAdapter<BusqEquipoClass> {

        public AdaptBusqEquipo(Context context, BusqEquipoClass[] datos) {
            super(context, R.layout.list_item_busq_med, datos);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View item = inflater.inflate(R.layout.list_item_busq_equipo, null);

            TextView lblId = (TextView) item.findViewById(R.id.LblIdEquipo);
            lblId.setText(datosBusqEquipo[position].getIdEquipo());

            TextView lblNombre = (TextView) item.findViewById(R.id.LblNombre);
            lblNombre.setText(datosBusqEquipo[position].getNombre());

            TextView lblAlimentador = (TextView) item.findViewById(R.id.LblAlimentador);
            lblAlimentador.setText(datosBusqEquipo[position].getAlimentador());

            return (item);
        }
    }

    private void abrirBusqMedidores() {

        lstBusqMedidores.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                SpiBusqueda = 0;
                callQuery(datosBusqMed[position].getNis(), getValueByEmp("CLIENTES_XY_006.nis"),
                        LyCLIENTES.getUrl().concat("/0"));
                if (LyCLIENTES.getLayers() != null && LyCLIENTES.getLayers().length > 0)
                    iBusqScale = LyCLIENTES.getLayers()[0].getLayerServiceInfo().getMinScale();
                dialogBusq.dismiss();
            }
        });

        dialogBusq = new Dialog(this);
        dialogBusq.setTitle("Lista Bsqueda");
        dialogBusq.addContentView(lstBusqMedidores, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        dialogBusq.show();
    }

    private void abrirBusqEquipos() {

        lstBusqEquipos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                ArcGISDynamicMapServiceLayer oDLEquipo = (datosBusqEquipo[position].getTipo().equals("POINT"))
                        ? LyEQUIPOSPTO
                        : LyEQUIPOSLINEA;
                int iNumCapa = (datosBusqEquipo[position].getTipo().equals("POINT")) ? 3 : 0;

                callQuery(datosBusqEquipo[position].getIdEquipo(), getValueByEmp("id_equipo"),
                        oDLEquipo.getUrl().concat("/" + iNumCapa));
                if (oDLEquipo.getLayers() != null && oDLEquipo.getLayers().length > iNumCapa)
                    iBusqScale = oDLEquipo.getLayers()[iNumCapa].getLayerServiceInfo().getMinScale();
                dialogBusq.dismiss();
            }
        });

        dialogBusq = new Dialog(this);
        dialogBusq.setTitle("Lista Bsqueda");
        dialogBusq.addContentView(lstBusqEquipos, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        dialogBusq.show();
    }

    private void abrirFormDenuncio(View view) {

        FloatingActionButton fabTemp = (FloatingActionButton) view;
        if (bIngCliente) {
            menuMultipleActions.collapse();
            menuMultipleActions.setVisibility(View.GONE);
        }

        menuLectorActions.collapse();
        menuLectorActions.setVisibility(View.GONE);
        fabShowForm.setVisibility(View.VISIBLE);

        setActionsForm(R.layout.form_denuncio, fabTemp.getTitle());

        if (!bVerCapas)
            toogleCapas(fabVerCapas);
    }

    private void abrirFormIngreso(View view) {

        FloatingActionButton fabTemp = (FloatingActionButton) view;
        if (bIngCliente) {
            menuMultipleActions.collapse();
            menuMultipleActions.setVisibility(View.GONE);
        }

        menuLectorActions.collapse();
        menuLectorActions.setVisibility(View.GONE);
        fabShowForm.setVisibility(View.VISIBLE);

        setActionsForm(R.layout.form_lectores, fabTemp.getTitle());

        if (!bVerCapas)
            toogleCapas(fabVerCapas);
    }

    private void abrirDialogCrear(View view) {

        FloatingActionButton fabTemp = (FloatingActionButton) view;
        menuMultipleActions.collapse();
        menuMultipleActions.setVisibility(View.GONE);

        menuLectorActions.collapse();
        menuLectorActions.setVisibility(View.GONE);
        fabShowDialog.setVisibility(View.VISIBLE);

        switch (view.getId()) {
        case R.id.action_a:
            setActionsDialog(R.layout.dialog_poste, fabTemp.getTitle());
            break;
        case R.id.action_b:
            setActionsDialog(R.layout.dialog_direccion, fabTemp.getTitle());
            break;
        case R.id.action_c:
            setActionsDialog(R.layout.dialog_cliente, fabTemp.getTitle());
            break;
        case R.id.action_d:
            setActionsDialog(R.layout.dialog_cliente_cnr, fabTemp.getTitle());
            break;
        }

        if (!bVerCapas)
            toogleCapas(fabVerCapas);
        //setLayerAddToggle(true);
    }

    private boolean validarForm(View view) {
        if (oUbicacion == null) {
            return false;
        }

        View vAction = getLayoutValidate(view);
        int iReq = recorrerForm(vAction);
        return (iReq == 0);
    }

    private boolean validarVista(View view) {
        if (oUbicacion == null) {
            return false;
        }
        View vAction = getLayoutValidate(view);
        return (recorrerDialog(vAction) == 0);
    }

    public static class DialogoConfirmacion extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            builder.setMessage("Debe ingresar todos los campos obligatorios").setTitle("Advertencia")
                    .setCancelable(false).setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });

            return builder.create();
        }
    }

    private void toogleGps(View view) {
        if (ldm != null) {
            if (ldm.isStarted()) {
                ldm.stop();
                ((FloatingActionButton) view).setIcon(R.drawable.ic_gps_off_white_24dp);
            } else {
                ldm.start();
                ((FloatingActionButton) view).setIcon(R.drawable.ic_gps_fixed_white_24dp);
                myMapView.setExtent(ldm.getPoint());
                myMapView.setScale(4000, true);
            }

        } else {
            initGeoposition();
        }
    }

    private void toogleData(View view) {
        if (bVerData) {
            ((FloatingActionButton) view).setIcon(R.drawable.ic_pencil_off_white_24dp);
        } else {
            ((FloatingActionButton) view).setIcon(R.drawable.ic_pencil_white_24dp);
        }

        bVerData = !bVerData;
        fabNavRoute.setVisibility(View.GONE);
        myMapView.getCallout().hide();
    }

    private void toogleCapas(View view) {
        if (bVerCapas) {
            ((FloatingActionButton) view).setIcon(R.drawable.ic_eye_off_white_24dp);
        } else {
            ((FloatingActionButton) view).setIcon(R.drawable.ic_eye_white_24dp);
        }

        bVerCapas = !bVerCapas;
        setLayerAddToggle(bVerCapas);
    }

    private void initGeoposition() {
        ldm = myMapView.getLocationDisplayManager();
        ldm.setLocationListener(new MyLocationListener());
        ldm.start();
        ldm.setAutoPanMode(AutoPanMode.LOCATION);
    }

    private int calcRadio() {
        if (myMapView.getScale() < 1000) {
            return 50;
        } else if (myMapView.getScale() < 5000) {
            return 40;
        } else if (myMapView.getScale() < 8000) {
            return 35;
        } else if (myMapView.getScale() < 10000) {
            return 30;
        } else if (myMapView.getScale() < 20000) {
            return 20;
        } else if (myMapView.getScale() < 30000) {
            return 10;
        } else if (myMapView.getScale() < 50000) {
            return 5;
        } else if (myMapView.getScale() < 200000) {
            return 3;
        } else if (myMapView.getScale() < 1000000) {
            return 2;
        } else {
            return 1;
        }
    }

    public void setMap(int idMapa, int color1, int color2, int gridSize, int gridLine, boolean logoVisible,
            boolean wrapAround) {

        try {
            myMapView = (MapView) findViewById(idMapa);
            myMapView.setMapBackground(color1, color2, gridSize, gridLine);
            myMapView.setEsriLogoVisible(logoVisible);
            myMapView.enableWrapAround(wrapAround);

            layerDefs = new HashMap<>();
            layerDefs.put(0, "ARCGIS.DBO.ECSE.ano = " + Calendar.getInstance().get(Calendar.YEAR));
            layerDefs.put(1, "ARCGIS.DBO.ECSE.ano = 2016");

            //Set eventos mapa
            singleTapOnMap();
            changesOnMap();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setCredenciales(String usuario, String password) {
        credenciales = new UserCredentials();
        credenciales.setUserAccount(usuario, password);
    }

    public void dialogBusqueda() {

        AlertDialog.Builder dialogBusqueda = new AlertDialog.Builder(this);
        dialogBusqueda.setTitle("Busqueda");
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v = inflater.inflate(R.layout.dialog_busqueda, null);
        dialogBusqueda.setView(v);

        Spinner spinner = (Spinner) v.findViewById(R.id.spinnerBusqueda);
        final LinearLayout llBuscar = (LinearLayout) v.findViewById(R.id.llBuscar);
        final LinearLayout llDireccion = (LinearLayout) v.findViewById(R.id.llBuscarDir);

        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this,
                R.layout.support_simple_spinner_dropdown_item, searchArray);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                SpiBusqueda = position;

                if (position != 4) {
                    if (llDireccion != null)
                        llDireccion.setVisibility(View.GONE);
                    if (llBuscar != null)
                        llBuscar.setVisibility(View.VISIBLE);
                } else {
                    if (llDireccion != null)
                        llDireccion.setVisibility(View.VISIBLE);
                    if (llBuscar != null)
                        llBuscar.setVisibility(View.GONE);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                Toast.makeText(getApplicationContext(), "Nada seleccionado", Toast.LENGTH_SHORT).show();
            }
        });

        final EditText eSearch = (EditText) v.findViewById(R.id.txtBuscar);
        final EditText eStreet = (EditText) v.findViewById(R.id.txtCalle);
        final EditText eNumber = (EditText) v.findViewById(R.id.txtNum);

        dialogBusqueda.setPositiveButton("Buscar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                if (SpiBusqueda == 4) {
                    txtBusqueda = new String();
                    if (!eStreet.getText().toString().isEmpty())
                        txtBusqueda = (eNumber.getText().toString().trim().isEmpty()) ? "0 "
                                : eNumber.getText().toString().trim() + " ";
                    txtBusqueda = txtBusqueda + eStreet.getText().toString();
                } else {
                    if (SpiBusqueda > 1)
                        txtBusqueda = eSearch.getText().toString();
                    else
                        txtBusqueda = Util.extraerNum(eSearch.getText().toString());
                }

                if (txtBusqueda.trim().isEmpty()) {
                    Toast.makeText(myMapView.getContext(), "Debe ingresar un valor", Toast.LENGTH_SHORT).show();
                } else {
                    // Escala de calle para busquedas por default

                    iBusqScale = 4000;
                    switch (SpiBusqueda) {
                    case 0:
                        callQuery(txtBusqueda, getValueByEmp("CLIENTES_XY_006.nis"),
                                LyCLIENTES.getUrl().concat("/0"));
                        if (LyCLIENTES.getLayers() != null && LyCLIENTES.getLayers().length > 0)
                            iBusqScale = LyCLIENTES.getLayers()[0].getLayerServiceInfo().getMinScale();
                        break;
                    case 1:
                        callQuery(txtBusqueda, "codigo", LySED.getUrl().concat("/1"));
                        if (LySED.getLayers() != null && LySED.getLayers().length > 1)
                            iBusqScale = LySED.getLayers()[1].getLayerServiceInfo().getMinScale();
                        break;
                    case 2:
                        callQuery(txtBusqueda, "rotulo", LyPOSTES.getUrl().concat("/0"));
                        if (LyPOSTES.getLayers() != null && LyPOSTES.getLayers().length > 0)
                            iBusqScale = LyPOSTES.getLayers()[0].getLayerServiceInfo().getMinScale();
                        break;
                    case 3:
                        callQuery(txtBusqueda, "serie_medidor", LyMEDIDORES.getUrl().concat("/1"));
                        if (LyMEDIDORES.getLayers() != null && LyMEDIDORES.getLayers().length > 1)
                            iBusqScale = LyMEDIDORES.getLayers()[1].getLayerServiceInfo().getMinScale();
                        break;
                    case 4:
                        iBusqScale = 5000;
                        String[] sBuscar = { eStreet.getText().toString(), eNumber.getText().toString() };
                        String[] sFields = { "nombre_calle", "numero" };
                        callQuery(sBuscar, sFields, LyDIRECCIONES.getUrl().concat("/0"));
                        break;
                    case 5:
                        callQuery(txtBusqueda, new String[] { "id_equipo", "nombre" },
                                LyEQUIPOSLINEA.getUrl().concat("/0"));
                        if (LyEQUIPOSLINEA.getLayers() != null && LyEQUIPOSLINEA.getLayers().length > 0)
                            iBusqScale = LyEQUIPOSLINEA.getLayers()[0].getLayerServiceInfo().getMinScale();
                        break;
                    }
                }
            }
        });

        dialogBusqueda.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        dialogBusqueda.show();
    }

    private String getValueByEmp(String s) {

        switch (empresa) {
        case "litoral":
            s = s.replace("006", "009");
            break;
        case "casablanca":
            s = s.replace("006", "028");
            break;
        case "linares":
            s = s.replace("006", "031");
            break;
        case "parral":
            s = s.replace("006", "032");
            break;
        }

        return s;
    }

    public void setActionsForm(final int idRes, String sNombre) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(idRes, null);

        final int topeWidth = 650;
        ArrayAdapter<CharSequence> adapter;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int widthSize = displayMetrics.widthPixels;
        int widthScale = (widthSize * 3) / 4;
        if (topeWidth < widthScale)
            widthScale = topeWidth;

        v.setMinimumWidth(widthScale);

        formCrear.setTitle(sNombre);
        formCrear.setContentView(v);
        idResLayoutSelect = idRes;

        if (idRes == R.layout.form_lectores) {
            Spinner spUserCosenza = (Spinner) v.findViewById(R.id.spinnerUser);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayUserCosenza);
            spUserCosenza.setAdapter(adapter);
        }

        Spinner spEstado = (Spinner) v.findViewById(R.id.spinnerEstado);
        adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item, arrayEstado);
        spEstado.setAdapter(adapter);

        Spinner spTipoEdif = (Spinner) v.findViewById(R.id.spinnerTipoEdific);
        adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                arrayTipoEdif);
        spTipoEdif.setAdapter(adapter);

        ImageButton btnIdentPoste = (ImageButton) v.findViewById(R.id.btnPoste);
        btnIdentPoste.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                formCrear.hide();
                bMapTap = true;
                bCallOut = true;
                oLySelectAsoc = LyAddPoste;
                oLyExistAsoc = LyPOSTES;
                oLyExistAsoc.setVisible(true);
                myMapView.zoomToScale(ldm.getPoint(), oLyExistAsoc.getMinScale() * 0.9);
                setValueToAsoc(getLayoutContenedor(view));
            }
        });

        ImageButton btnIdentDireccion = (ImageButton) v.findViewById(R.id.btnDireccion);
        btnIdentDireccion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                formCrear.hide();
                bMapTap = true;
                bCallOut = true;
                oLySelectAsoc = LyAddDireccion;
                oLyExistAsoc = LyDIRECCIONES;
                oLyExistAsoc.setVisible(true);
                myMapView.zoomToScale(ldm.getPoint(), oLyExistAsoc.getMinScale() * 0.9);
                setValueToAsoc(getLayoutContenedor(v));
            }
        });

        btnUbicacion = (ImageButton) v.findViewById(R.id.btnUbicacion);
        btnUbicacion.setColorFilter(Color.RED);
        btnUbicacion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bMapTap = true;
                formCrear.hide();
            }
        });

        ImageButton btnClose = (ImageButton) v.findViewById(R.id.btnCancelar);
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cerrarFormCrear(false, v);
            }
        });

        ImageButton btnOk = (ImageButton) v.findViewById(R.id.btnConfirmar);
        btnOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cerrarFormCrear(true, v);
            }
        });

        arrayTouchs = new ArrayList<>();
        setEnabledDialog(false);

        formCrear.show();
        dialogCur = formCrear;
    }

    public void setActionsDialog(final int idRes, String sNombre) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(idRes, null);

        v.setMinimumWidth(400);

        dialogCrear.setTitle(sNombre);
        dialogCrear.setContentView(v);
        idResLayoutSelect = idRes;

        setSpinnerDialog(idRes, v);

        if (idRes != R.layout.dialog_poste) {
            setButtonAsociacion(v);
        }

        btnUbicacion = (ImageButton) v.findViewById(R.id.btnUbicacion);
        btnUbicacion.setColorFilter(Color.RED);
        btnUbicacion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bMapTap = true;
                dialogCrear.hide();
            }
        });

        ImageButton btnClose = (ImageButton) v.findViewById(R.id.btnCancelar);
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cerrarDialogCrear(false, null);
            }
        });

        ImageButton btnOk = (ImageButton) v.findViewById(R.id.btnConfirmar);
        btnOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cerrarDialogCrear(true, v);
            }
        });

        arrayTouchs = new ArrayList<>();
        setEnabledDialog(false);

        dialogCrear.show();
        dialogCur = dialogCrear;
    }

    private void setSpinnerDialog(int idLayout, View v) {

        ArrayAdapter<CharSequence> adapter;

        switch (idLayout) {
        case R.layout.dialog_poste:
            Spinner spTipoPoste = (Spinner) v.findViewById(R.id.spinnerTipoPoste);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTipoPoste);
            spTipoPoste.setAdapter(adapter);

            Spinner spTipoTension = (Spinner) v.findViewById(R.id.spinnerTension);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTension);
            spTipoTension.setAdapter(adapter);
            break;
        case R.layout.dialog_direccion:
            //Setear Spinner y recuperar valores
            Spinner spTipoEdif = (Spinner) v.findViewById(R.id.spinnerTipoEdif);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTipoEdif);
            spTipoEdif.setAdapter(adapter);
            break;
        case R.layout.dialog_cliente:
            Spinner spTipoMedidor = (Spinner) v.findViewById(R.id.spinnerTipoMedidor);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayMedidor);
            spTipoMedidor.setAdapter(adapter);

            Spinner spTecMedidor = (Spinner) v.findViewById(R.id.spinnerTecMedidor);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTecMedidor);
            spTecMedidor.setAdapter(adapter);

            Spinner spEmpalme = (Spinner) v.findViewById(R.id.spinnerTipoEmpalme);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayEmpalme);
            spEmpalme.setAdapter(adapter);

            Spinner spTipoFase = (Spinner) v.findViewById(R.id.spinnerFaseConex);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTipoFase);
            spTipoFase.setAdapter(adapter);
            break;
        case R.layout.dialog_cliente_cnr:
            Spinner spTipoMedidorCnr = (Spinner) v.findViewById(R.id.spinnerTipoMedidor);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayMedidor);
            spTipoMedidorCnr.setAdapter(adapter);

            Spinner spTecMedidorCnr = (Spinner) v.findViewById(R.id.spinnerTecMedidor);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTecMedidor);
            spTecMedidorCnr.setAdapter(adapter);

            Spinner spEmpalmeCnr = (Spinner) v.findViewById(R.id.spinnerTipoEmpalme);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayEmpalme);
            spEmpalmeCnr.setAdapter(adapter);

            Spinner spTipoCnr = (Spinner) v.findViewById(R.id.spinnerTipoCNR);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTipoCnr);
            spTipoCnr.setAdapter(adapter);

            Spinner spTipoFaseCnr = (Spinner) v.findViewById(R.id.spinnerFaseConex);
            adapter = new ArrayAdapter<CharSequence>(this, R.layout.support_simple_spinner_dropdown_item,
                    arrayTipoFase);
            spTipoFaseCnr.setAdapter(adapter);
            break;
        }
    }

    private void setButtonAsociacion(View v) {

        if (idResLayoutSelect == R.layout.dialog_direccion) {

            ImageButton btnAsocCalle = (ImageButton) v.findViewById(R.id.btnAsocCalle);
            btnAsocCalle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialogCrear.hide();
                    bMapTap = true;
                    bCallOut = true;
                    nIndentify = 1; //1 = valor para calle
                    oLySelectAsoc = LyAsocCalle;
                    //myMapView.zoomToScale(oUbicacion, 700.0f);
                    setValueToAsoc(getLayoutContenedor(v));
                }
            });
            return;
        }

        ImageButton btnVerifNis = (ImageButton) v.findViewById(R.id.btnVerifNis);
        btnVerifNis.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String sUrl = (idResLayoutSelect == R.layout.dialog_cliente) ? srv_urlClientes : srv_urlClientesCnr;
                String sNis = getValueNis(getLayoutContenedor(v));
                if (!sNis.isEmpty()) {
                    verifNisQuery(sNis, "nis", sUrl, v);
                } else {
                    Toast.makeText(getApplicationContext(), "El campo NIS est vaco", Toast.LENGTH_SHORT).show();
                }
            }
        });

        ImageButton btnAsocDireccion = (ImageButton) v.findViewById(R.id.btnAsocDireccion);
        btnAsocDireccion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialogCrear.hide();
                bMapTap = true;
                bCallOut = true;
                oLySelectAsoc = LyAddDireccion;
                oLyExistAsoc = LyDIRECCIONES;
                setValueToAsoc(getLayoutContenedor(v));
            }
        });

        ImageButton btnAsocPoste = (ImageButton) v.findViewById(R.id.btnAsocPoste);
        btnAsocPoste.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialogCrear.hide();
                bMapTap = true;
                bCallOut = true;
                oLySelectAsoc = LyAddPoste;
                oLyExistAsoc = LyPOSTES;
                setValueToAsoc(getLayoutContenedor(v));
            }
        });

        if (idResLayoutSelect == R.layout.dialog_cliente_cnr) {
            ImageButton btnAsocTramo = (ImageButton) v.findViewById(R.id.btnAsocTramo);
            btnAsocTramo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialogCrear.hide();
                    bMapTap = true;
                    bCallOut = true;
                    nIndentify = 2; //2 = valor para tramo
                    oLySelectAsoc = LyAsocTramo;
                    setValueToAsoc(getLayoutContenedor(v));
                }
            });
        }
    }

    public void verifNisQuery(String txtBusqueda, String nomCampo, String dirUrl, View v) {
        String sWhere = String.format("%s = %s", nomCampo, txtBusqueda);

        NisVerifResult queryTask = new NisVerifResult(getLayoutChkNis(v));
        queryTask.execute(sWhere, dirUrl);
    }

    public void callQuery(String txtBusqueda, String nomCampo, String dirUrl) {
        String sWhere = String.format("%s = '%s'", nomCampo, txtBusqueda);

        AsyncQueryTask queryTask = new AsyncQueryTask();
        queryTask.execute(sWhere, dirUrl);
    }

    public void callQuery(String[] sBusqueda, String[] sCampos, String dirUrl) {
        String sWhere = String.format("%s = '%s'", sCampos[0], sBusqueda[0]);
        if (!sBusqueda[1].isEmpty()) {
            sWhere += String.format(" AND %s = '%s'", sCampos[1], sBusqueda[1]);
        }

        AsyncQueryTask queryTask = new AsyncQueryTask();
        queryTask.execute(sWhere, dirUrl);
    }

    public void callQuery(String sBusqueda, String[] sCampos, String dirUrl) {
        String sIdEquipo = Util.extraerNum(sBusqueda);
        String sWhere = String.format("%s = '%s'", sCampos[0], (sIdEquipo.isEmpty()) ? "0" : sIdEquipo);
        if (!sBusqueda.isEmpty()) {
            sWhere += String.format(" OR %s LIKE '%s'", sCampos[1], "%" + sBusqueda + "%");
        }

        AsyncQueryTask queryTask = new AsyncQueryTask();
        queryTask.execute(sWhere, dirUrl);
    }

    public void choiceMaps(int pos) {
        AlertDialog.Builder builder = new AlertDialog.Builder(LectorActivity.this);

        // set the dialog title
        builder.setTitle("Mapas").setSingleChoiceItems(tipoMapas, pos, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                switch (which) {
                case 0:
                    myMapView.removeLayer(0);
                    myMapView.addLayer(mRoadBaseMaps, 0);
                    break;
                case 1:
                    myMapView.removeLayer(0);
                    myMapView.addLayer(mAerialBaseMaps, 0);
                    break;
                case 2:
                    myMapView.removeLayer(0);
                    myMapView.addLayer(mAerialWLabelBaseMaps, 0);
                    break;
                case 3:
                    myMapView.removeLayer(0);
                    myMapView.addLayer(LyMapabase, 0);
                    break;
                }

                choices = which;
                dialog.dismiss();
            }
        }).show();
    }

    public void alertMultipleChoiceItems() {

        mSelectedItems = new ArrayList<>();

        for (int i = 0; i < listadoCapas.length; i++) {
            fool[i] = myMapView.getLayer(i + 1).isVisible();

            if (fool[i]) {
                mSelectedItems.add(i);
            } else if (mSelectedItems.contains(i)) {
                mSelectedItems.remove(Integer.valueOf(i));
            }
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(LectorActivity.this);

        builder.setTitle("Capas")

                .setMultiChoiceItems(listadoCapas, fool, new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                        if (isChecked) {
                            mSelectedItems.add(which);
                        } else if (mSelectedItems.contains(which)) {
                            mSelectedItems.remove(Integer.valueOf(which));
                        }
                    }
                })

                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {

                        setLayerOff();

                        for (Integer i : mSelectedItems) {
                            myMapView.getLayer(i + 1).setVisible(true);
                        }
                    }
                })

                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        // removes the AlertDialog in the screen
                    }
                })

                .show();
    }

    public void setLayerAddToggle(boolean visible) {
        LyAddPoste.setVisible(visible);
        LyAddDireccion.setVisible(visible);
        LyAddLectores.setVisible(visible);

        if (bIngCliente) {
            LyAddCliente.setVisible(visible);
            LyAddUnion.setVisible(visible);
            LyAddClienteCnr.setVisible(visible);
            LyAsocTramo.setVisible(false);
            LyAsocCalle.setVisible(false);
        }

        if (fabShowDialog.getVisibility() == View.VISIBLE) {
            if (idResLayoutSelect == R.layout.dialog_cliente_cnr)
                LyAsocTramo.setVisible(visible);
            if (idResLayoutSelect == R.layout.dialog_direccion)
                LyAsocCalle.setVisible(visible);
        }
    }

    public void setLayerOff() {

        for (int i = 0; i < listadoCapas.length; i++) {
            myMapView.getLayer(i + 1).setVisible(false);
        }
    }

    public void setLayersURL(String layerURL, String tipo) {
        layerURL = getValueByEmp(layerURL);

        switch (tipo) {
        case "MAPABASE":
            din_urlMapaBase = layerURL;
            break;
        //token srv
        case "TOKENSRV":
            urlToken = layerURL;
            break;
        case "EQUIPOS_LINEA":
            din_urlEquiposLinea = layerURL;
            break;
        case "TRAMOS":
            din_urlTramos = layerURL;
            break;
        case "EQUIPOS_PTO":
            din_urlEquiposPunto = layerURL;
            break;
        case "NODOS":
            din_urlNodos = layerURL;
            break;
        case "LUMINARIAS":
            din_urlLuminarias = layerURL;
            break;
        case "CLIENTES":
            din_urlClientes = layerURL;
            break;
        case "DIRECCIONES":
            din_urlDirecciones = layerURL;
            break;
        case "MEDIDORES":
            din_urlMedidores = layerURL;
            break;
        case "CONCESIONES":
            din_urlConcesiones = layerURL;
            break;
        case "STX":
            din_urlStx = layerURL;
            break;
        case "PO":
            din_urlInterrupciones = layerURL;
            break;
        case "ECSE":
            din_urlECSE = layerURL;
            break;
        case "ELECTRODEP":
            din_urlElectroDep = layerURL;
            break;
        case "SRV_POSTES":
            srv_urlPostes = layerURL;
            break;
        case "SRV_DIRECCIONES":
            srv_urlDireccion = layerURL;
            break;
        case "SRV_CLIENTES":
            srv_urlClientes = layerURL;
            break;
        case "SRV_CLIENTESCNR":
            srv_urlClientesCnr = layerURL;
            break;
        case "SRV_UNIONES":
            srv_urlUnion012 = layerURL;
            break;
        case "SRV_CALLES":
            srv_calles = layerURL;
            break;
        case "SRV_LECTORES":
            srv_lectores = layerURL;
            break;
        default:
            Toast.makeText(LectorActivity.this, "Problemas inicializando layers url", Toast.LENGTH_SHORT).show();
            break;
        }
    }

    public void addLayersToMap(UserCredentials credencial, String tipoLayer, String nombreCapa, String url,
            String mode, boolean visibilidad) {

        // tipo layer feature
        if (tipoLayer.equals("FEATURE")) {

            switch (nombreCapa) {
            case "ALIMENTADORES":

                if (mode.equals("SNAPSHOT")) {
                    // LyAlimentadores = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.SNAPSHOT, credencial);
                } else if (mode.equals("ONDEMAND")) {
                    // LyAlimentadores = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                } else if (mode.equals("SELECTION")) {
                    // LyAlimentadores = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.SELECTION, credencial);
                } else {
                    Toast.makeText(LectorActivity.this, "FeatureLayer debe tener un modo.", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
                break;
            case "ADDPOSTE":
                LyAddPoste = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddPoste.setDefinitionExpression(String.format("EMPRESA = '%s'", empresa));
                LyAddPoste.setMinScale(8000);
                LyAddPoste.setVisible(visibilidad);
                break;
            case "ADDADDRESS":
                LyAddDireccion = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddDireccion.setDefinitionExpression(String.format("EMPRESA = '%s'", empresa));
                LyAddDireccion.setMinScale(4500);
                LyAddDireccion.setVisible(visibilidad);
                break;
            case "ADDCLIENTE":
                LyAddCliente = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddCliente.setDefinitionExpression(String.format("EMPRESA = '%s' AND ESTADO IS null", empresa));
                LyAddCliente.setMinScale(6000);
                LyAddCliente.setVisible(visibilidad);
                break;
            case "ADDCLIENTECNR":
                LyAddClienteCnr = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddClienteCnr
                        .setDefinitionExpression(String.format("EMPRESA = '%s' AND ESTADO IS null", empresa));
                LyAddClienteCnr.setMinScale(6000);
                LyAddClienteCnr.setVisible(visibilidad);
                break;
            case "ADDUNION":
                LyAddUnion = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddUnion.setDefinitionExpression(String.format("EMPRESA = '%s'", empresa));
                LyAddUnion.setMinScale(4500);
                LyAddUnion.setVisible(visibilidad);
                break;
            case "ASOCTRAMO":
                LyAsocTramo = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAsocTramo.setMinScale(6000);
                LyAsocTramo.setVisible(visibilidad);
                break;
            case "ASOCCALLE":
                LyAsocCalle = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                //LyAsocCalle.setDefinitionExpression("where ESTADO IS null");
                LyAsocCalle.setMinScale(6000);
                LyAsocCalle.setVisible(visibilidad);
                break;
            case "ADDLECTOR":
                LyAddLectores = new ArcGISFeatureLayer(url, ArcGISFeatureLayer.MODE.ONDEMAND, credencial);
                LyAddLectores.setMinScale(8000);
                LyAddLectores.setVisible(visibilidad);
                break;
            default:
                Toast.makeText(LectorActivity.this, "Problemas agregando layers url", Toast.LENGTH_SHORT).show();
                break;
            }

        } else {
            if (mode != null) {
                Toast.makeText(LectorActivity.this, "Layer dinmico no tiene mode, debe ser null",
                        Toast.LENGTH_SHORT).show();
            } else {
                switch (nombreCapa) {
                case "SED":
                    int array1[]; //declaracion arreglo de tipo numerico
                    array1 = new int[1];
                    array1[0] = 1;
                    LySED = new ArcGISDynamicMapServiceLayer(url, array1, credencial);
                    LySED.setVisible(visibilidad);
                    break;
                case "SSEE":
                    int array2[]; //declaracion arreglo de tipo numerico
                    array2 = new int[1];
                    array2[0] = 0;
                    LySSEE = new ArcGISDynamicMapServiceLayer(url, array2, credencial);
                    LySSEE.setVisible(false);
                    break;
                case "REDMT":
                    int array3[]; //declaracion arreglo de tipo numerico
                    array3 = new int[1];
                    array3[0] = 0;
                    LyREDMT = new ArcGISDynamicMapServiceLayer(url, array3, credencial);
                    LyREDMT.setVisible(visibilidad);
                    break;
                case "REDBT":
                    int array4[]; //declaracion arreglo de tipo numerico
                    array4 = new int[1];
                    array4[0] = 1;
                    LyREDBT = new ArcGISDynamicMapServiceLayer(url, array4, credencial);
                    LyREDBT.setVisible(visibilidad);
                    break;
                case "REDAP":
                    int array5[]; //declaracion arreglo de tipo numerico
                    array5 = new int[1];
                    array5[0] = 2;
                    LyREDAP = new ArcGISDynamicMapServiceLayer(url, array5, credencial);
                    LyREDAP.setVisible(visibilidad);
                    break;
                case "POSTES":
                    int array6[]; //declaracion arreglo de tipo numerico
                    array6 = new int[1];
                    array6[0] = 0;
                    LyPOSTES = new ArcGISDynamicMapServiceLayer(url, array6, credencial);
                    LyPOSTES.setVisible(visibilidad);
                    break;
                case "EQUIPOS_LINEA":
                    int array7[]; //declaracion arreglo de tipo numerico
                    array7 = new int[1];
                    array7[0] = 0;
                    LyEQUIPOSLINEA = new ArcGISDynamicMapServiceLayer(url, array7, credencial);
                    LyEQUIPOSLINEA.setVisible(visibilidad);
                    break;
                case "EQUIPOS_PTO":
                    int array8[]; //declaracion arreglo de tipo numerico
                    array8 = new int[1];
                    array8[0] = 3;
                    LyEQUIPOSPTO = new ArcGISDynamicMapServiceLayer(url, array8, credencial);
                    LyEQUIPOSPTO.setVisible(visibilidad);
                    break;
                case "LUMINARIAS":
                    int array9[]; //declaracion arreglo de tipo numerico
                    array9 = new int[1];
                    array9[0] = 0;
                    LyLUMINARIAS = new ArcGISDynamicMapServiceLayer(url, array9, credencial);
                    LyLUMINARIAS.setVisible(visibilidad);
                    break;
                case "CLIENTES":
                    int array10[]; //declaracion arreglo de tipo numerico
                    array10 = new int[1];
                    array10[0] = 0;
                    LyCLIENTES = new ArcGISDynamicMapServiceLayer(url, array10, credencial);
                    LyCLIENTES.setVisible(visibilidad);
                    break;
                case "MEDIDORES":
                    int array11[]; //declaracion arreglo de tipo numerico
                    array11 = new int[1];
                    array11[0] = 1;
                    LyMEDIDORES = new ArcGISDynamicMapServiceLayer(url, array11, credencial);
                    LyMEDIDORES.setVisible(visibilidad);
                    break;
                case "CONCESIONES":
                    int array12[]; //declaracion arreglo de tipo numerico
                    array12 = new int[2];
                    array12[0] = 0;
                    array12[1] = 1;
                    LyCONCESIONES = new ArcGISDynamicMapServiceLayer(url, array12, credencial);
                    LyCONCESIONES.setVisible(visibilidad);
                    LyCONCESIONES.setOpacity(0.4f);
                    break;
                case "DIRECCIONES":
                    int array13[];
                    array13 = new int[1];
                    array13[0] = 0;
                    LyDIRECCIONES = new ArcGISDynamicMapServiceLayer(url, array13, credencial);
                    LyDIRECCIONES.setVisible(visibilidad);
                    break;
                case "EMPALMES":
                    int array14[]; //declaracion arreglo de tipo numerico
                    array14 = new int[1];
                    array14[0] = 1;
                    LyEMPALMES = new ArcGISDynamicMapServiceLayer(url, array14, credencial);
                    LyEMPALMES.setVisible(visibilidad);
                    break;
                case "MAPABASECHQ":
                    LyMapabase = new ArcGISDynamicMapServiceLayer(url, null, credencial);
                    LyMapabase.setVisible(visibilidad);
                    break;
                case "SALIDAALIM":
                    int array15[]; //declaracion arreglo de tipo numerico
                    array15 = new int[1];
                    array15[0] = 2;
                    LySALIDAALIM = new ArcGISDynamicMapServiceLayer(url, array15, credencial);
                    LySALIDAALIM.setVisible(visibilidad);
                    break;
                case "REDSTX":
                    int array16[];
                    array16 = new int[1];
                    array16[0] = 1;
                    LyREDSTX = new ArcGISDynamicMapServiceLayer(url, array16, credencial);
                    LyREDSTX.setVisible(visibilidad);
                    break;
                case "TORRESSTX":
                    int array17[];
                    array17 = new int[1];
                    array17[0] = 0;
                    LyTORRESSTX = new ArcGISDynamicMapServiceLayer(url, array17, credencial);
                    LyTORRESSTX.setVisible(visibilidad);
                    break;
                case "ENCUESTADO":
                    int array18[];
                    array18 = new int[1];
                    array18[0] = 0;
                    LyENCUESTA = new ArcGISDynamicMapServiceLayer(url, array18, credencial);
                    LyENCUESTA.setLayerDefinitions(layerDefs);
                    LyENCUESTA.setVisible(visibilidad);
                    break;
                case "REEMPLAZO":
                    int array19[];
                    array19 = new int[1];
                    array19[0] = 1;
                    LyREEMPLAZO = new ArcGISDynamicMapServiceLayer(url, array19, credencial);
                    LyREEMPLAZO.setLayerDefinitions(layerDefs);
                    LyREEMPLAZO.setVisible(visibilidad);
                    break;
                case "ELECTRODEP":
                    int array20[];
                    array20 = new int[1];
                    array20[0] = 0;
                    LyELECTRODEP = new ArcGISDynamicMapServiceLayer(url, array20, credencial);
                    LyELECTRODEP.setVisible(visibilidad);
                    break;
                default:
                    Toast.makeText(LectorActivity.this, "Problemas agregando layers dinmicos.",
                            Toast.LENGTH_SHORT).show();
                    break;
                }
            }
        }
    }

    private void singleTapOnMap() {
        myMapView.setOnSingleTapListener(new OnSingleTapListener() {
            @Override
            public void onSingleTap(float x, float y) {

                if (bMapTap) {

                    Point oPoint = myMapView.toMapPoint(x, y);

                    if (mBusquedaLayer != null && myMapView.getLayerByID(mBusquedaLayer.getID()) != null)
                        myMapView.removeLayer(mBusquedaLayer);

                    if (mSeleccionLayer != null && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
                        myMapView.removeLayer(mSeleccionLayer);

                    if (bCallOut) {

                        if (nIndentify > 0) {

                            mSeleccionLayer = new GraphicsLayer();
                            SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.GREEN, 12,
                                    SimpleMarkerSymbol.STYLE.CIRCLE);
                            Graphic resultLocGraphic = new Graphic(oPoint, resultSymbol);
                            mSeleccionLayer.addGraphic(resultLocGraphic);

                            myMapView.addLayer(mSeleccionLayer);

                            switch (nIndentify) {
                            case 1:
                                getCalleToDialog(oPoint);
                                break;
                            case 2:
                                getTramoToDialog(oPoint);
                                break;
                            }

                        } else {
                            mSeleccionLayer = new GraphicsLayer();
                            int[] selectedFeatures = oLySelectAsoc.getGraphicIDs(x, y, calcRadio(), 1000);

                            // select the features
                            oLySelectAsoc.clearSelection();
                            oLySelectAsoc.setSelectedGraphics(selectedFeatures, true);

                            if (selectedFeatures.length > 0) {
                                Graphic[] results = oLySelectAsoc.getSelectedFeatures();
                                Callout mapCallout = myMapView.getCallout();
                                mapCallout.hide();

                                for (Graphic graphic : results) {

                                    Map<String, Object> attr = graphic.getAttributes();
                                    Util oUtil = new Util();
                                    CalloutTvClass oCall = oUtil.getCalloutValues(attr);

                                    GisTextView tv = new GisTextView(LectorActivity.this);
                                    tv.setText(oCall.getVista());
                                    tv.setHint(oCall.getValor());
                                    tv.setIdObjeto(oCall.getIdObjeto());
                                    tv.setPoint((Point) graphic.getGeometry());
                                    tv.setTipo("nueva");
                                    tv.setTextColor(Color.WHITE);

                                    tv.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View v) {
                                            oTxtAsoc.setIdObjeto(((GisTextView) v).getIdObjeto());
                                            oTxtAsoc.setText(((GisTextView) v).getHint());
                                            oTxtAsoc.setTipo(((GisTextView) v).getTipo());
                                            oTxtAsoc.setPoint(myMapView.getCallout().getCoordinates());
                                            bCallOut = false;
                                            bMapTap = false;
                                            myMapView.getCallout().hide();
                                            oLySelectAsoc.clearSelection();
                                            dialogCur.show();
                                            if (mSeleccionLayer != null
                                                    && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
                                                myMapView.removeLayer(mSeleccionLayer);

                                            // LINE PRINT
                                            if (mUbicacionLayer != null && oUbicacion != null) {
                                                SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.BLUE, 4,
                                                        SimpleLineSymbol.STYLE.DASH);
                                                Polyline oLine = new Polyline();
                                                oLine.startPath(oUbicacion);
                                                oLine.lineTo(oTxtAsoc.getPoint());
                                                Graphic graphicDireccion = new Graphic(oLine, lineSymbol, null);
                                                mUbicacionLayer.addGraphic(graphicDireccion);
                                            }
                                        }
                                    });

                                    Point point = (Point) graphic.getGeometry();

                                    mapCallout.setOffset(0, -3);
                                    mapCallout.setCoordinates(point);
                                    mapCallout.setMaxHeight(100);
                                    mapCallout.setMaxWidth(400);
                                    mapCallout.setStyle(R.xml.mycalloutprefs);
                                    mapCallout.setContent(tv);

                                    mapCallout.show();
                                }
                            } else {
                                getAsocObject(oPoint);
                            }

                            SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.GREEN, 12,
                                    SimpleMarkerSymbol.STYLE.CIRCLE);
                            Graphic resultLocGraphic = new Graphic(oPoint, resultSymbol);
                            mSeleccionLayer.addGraphic(resultLocGraphic);

                            myMapView.addLayer(mSeleccionLayer);
                        }

                    } else {
                        if (mUbicacionLayer != null && myMapView.getLayerByID(mUbicacionLayer.getID()) != null)
                            myMapView.removeLayer(mUbicacionLayer);

                        oUbicacion = oPoint;
                        mUbicacionLayer = new GraphicsLayer();

                        SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.RED, 12,
                                SimpleMarkerSymbol.STYLE.DIAMOND);
                        Graphic resultLocGraphic = new Graphic(oPoint, resultSymbol);
                        mUbicacionLayer.addGraphic(resultLocGraphic);

                        myMapView.addLayer(mUbicacionLayer);

                        if (R.layout.dialog_poste == idResLayoutSelect) {
                            LyPOSTES.setVisible(true);
                            if (LyPOSTES.getMinScale() < myMapView.getScale())
                                myMapView.zoomToScale(oPoint, LyPOSTES.getMinScale() * 0.9);
                        } else if (R.layout.dialog_direccion == idResLayoutSelect) {
                            LyDIRECCIONES.setVisible(true);
                            if (LyDIRECCIONES.getMinScale() < myMapView.getScale())
                                myMapView.zoomToScale(oPoint, LyDIRECCIONES.getMinScale() * 0.9);
                        } else if (R.layout.dialog_cliente == idResLayoutSelect
                                || R.layout.dialog_cliente_cnr == idResLayoutSelect) {
                            LyPOSTES.setVisible(true);
                            LyDIRECCIONES.setVisible(true);
                            LyCLIENTES.setVisible(true);

                            if (idResLayoutSelect == R.layout.dialog_cliente_cnr)
                                LyREDBT.setVisible(true);

                            if (LyPOSTES.getMinScale() < myMapView.getScale())
                                myMapView.zoomToScale(oPoint, LyPOSTES.getMinScale() * 0.9);
                        } else if (R.layout.form_lectores == idResLayoutSelect) {
                            if (LyPOSTES.getMinScale() < myMapView.getScale())
                                myMapView.zoomToScale(oPoint, LyPOSTES.getMinScale() * 0.9);
                        }
                    }
                } else {
                    if (bVerData) {
                        double nExtendScale = myMapView.getScale();
                        double layerScala = 0;

                        ArrayList<ArcGISDynamicMapServiceLayer> arrayLay = new ArrayList<>();
                        Point oPoint = myMapView.toMapPoint(x, y);

                        if (oLyViewGraphs != null && myMapView.getLayerByID(oLyViewGraphs.getID()) != null)
                            myMapView.removeLayer(oLyViewGraphs);

                        oLyViewGraphs = new GraphicsLayer();
                        SimpleMarkerSymbol oMarketSymbol = new SimpleMarkerSymbol(Color.BLACK, 10,
                                SimpleMarkerSymbol.STYLE.CIRCLE);
                        oMarketSymbol.setOutline(new SimpleLineSymbol(Color.RED, 1, SimpleLineSymbol.STYLE.SOLID));
                        Graphic oGraph = new Graphic(oPoint, oMarketSymbol);
                        oLyViewGraphs.addGraphic(oGraph);

                        myMapView.addLayer(oLyViewGraphs);

                        for (Layer oLayer : myMapView.getLayers()) {

                            if ((oLayer.getName() != null && !oLayer.getName().equalsIgnoreCase("MapaBase"))
                                    && oLayer.isVisible()) {

                                if (oLayer.getClass().equals(ArcGISDynamicMapServiceLayer.class)) {
                                    for (ArcGISLayerInfo arcGISLayerInfo : ((ArcGISDynamicMapServiceLayer) oLayer)
                                            .getLayers()) {
                                        if (arcGISLayerInfo.isVisible()) {
                                            layerScala = (arcGISLayerInfo.getMinScale() > 0)
                                                    ? arcGISLayerInfo.getMinScale()
                                                    : 0;
                                            break;
                                        }
                                    }

                                    layerScala = (layerScala > 0) ? layerScala : nExtendScale;

                                    Log.w("layerScala " + layerScala, "nExtendScale " + nExtendScale);

                                    if (nExtendScale <= layerScala) {
                                        arrayLay.add((ArcGISDynamicMapServiceLayer) oLayer);
                                    }
                                }
                            }
                        }

                        if (arrayLay.size() > 0) {
                            ArcGISDynamicMapServiceLayer[] aLay = new ArcGISDynamicMapServiceLayer[arrayLay.size()];
                            aLay = arrayLay.toArray(aLay);
                            getInfoObject(oPoint, aLay);
                        } else {
                            Toast.makeText(getApplicationContext(), "No hay capas visibles", Toast.LENGTH_SHORT)
                                    .show();
                        }
                    }
                }
            }
        });
    }

    private void changesOnMap() {
        //Cambios en el mapa
        myMapView.setOnStatusChangedListener(new OnStatusChangedListener() {
            @Override
            public void onStatusChanged(Object o, STATUS status) {

                if (STATUS.LAYER_LOADED == status)
                    myMapView.setExtent(mCurrentMapExtent);

                if (STATUS.INITIALIZED.equals(status)) {
                    Point oPointEmp = getPointByEmp();
                    myMapView.centerAndZoom(oPointEmp.getX(), oPointEmp.getY(), 0.003f);
                    myMapView.zoomin(true);
                }

                if (status == STATUS.LAYER_LOADING_FAILED) {
                    // Check if a layer is failed to be loaded due to security
                    if ((status.getError()) instanceof EsriSecurityException) {
                        EsriSecurityException securityEx = (EsriSecurityException) status.getError();
                        if (securityEx.getCode() == EsriSecurityException.AUTHENTICATION_FAILED)
                            Toast.makeText(myMapView.getContext(),
                                    "Su cuenta tiene permisos limitados, contacte con el administrador para solicitar permisos faltantes",
                                    Toast.LENGTH_SHORT).show();
                        else if (securityEx.getCode() == EsriSecurityException.TOKEN_INVALID)
                            Toast.makeText(myMapView.getContext(), "Invalid Token! Resubmit!", Toast.LENGTH_SHORT)
                                    .show();
                        else if (securityEx.getCode() == EsriSecurityException.TOKEN_SERVICE_NOT_FOUND)
                            Toast.makeText(myMapView.getContext(), "Token Service Not Found! Resubmit!",
                                    Toast.LENGTH_SHORT).show();
                        else if (securityEx.getCode() == EsriSecurityException.UNTRUSTED_SERVER_CERTIFICATE)
                            Toast.makeText(myMapView.getContext(), "Untrusted Host! Resubmit!", Toast.LENGTH_SHORT)
                                    .show();

                        if (o instanceof ArcGISFeatureLayer) {
                            // Set user credential through username and password
                            UserCredentials creds = new UserCredentials();
                            creds.setUserAccount(usuar, passw);

                            LyMapabase.reinitializeLayer(creds);
                            LySED.reinitializeLayer(creds);
                            LySSEE.reinitializeLayer(creds);
                            LySALIDAALIM.reinitializeLayer(creds);
                            LyREDMT.reinitializeLayer(creds);
                            LyREDBT.reinitializeLayer(creds);
                            LyREDAP.reinitializeLayer(creds);
                            LyPOSTES.reinitializeLayer(creds);
                            LyEQUIPOSLINEA.reinitializeLayer(creds);
                            LyEQUIPOSPTO.reinitializeLayer(creds);
                            LyLUMINARIAS.reinitializeLayer(creds);
                            LyCLIENTES.reinitializeLayer(creds);
                            LyMEDIDORES.reinitializeLayer(creds);
                            LyCONCESIONES.reinitializeLayer(creds);
                            LyDIRECCIONES.reinitializeLayer(creds);
                            LyEMPALMES.reinitializeLayer(creds);
                            LyENCUESTA.reinitializeLayer(creds);
                            LyREEMPLAZO.reinitializeLayer(creds);
                            LyELECTRODEP.reinitializeLayer(creds);
                        }
                    }
                }
            }
        });
    }

    private Point getPointByEmp() {
        Point point = new Point(-33.035580, -71.626953);

        switch (empresa) {
        case "litoral":
            point = new Point(-33.398667, -71.698279);
            break;
        case "casablanca":
            point = new Point(-33.319037, -71.407631);
            break;
        case "linares":
            point = new Point(-35.846450, -71.599672);
            break;
        case "parral":
            point = new Point(-36.139971, -71.824429);
            break;
        }

        return point;
    }

    private class NisVerifResult extends AsyncTask<String, Void, FeatureResult> {

        View vLayout;

        public NisVerifResult(View v) {
            vLayout = v;
        }

        @Override
        protected void onPreExecute() {
            progress = new ProgressDialog(LectorActivity.this);
            progress = ProgressDialog.show(LectorActivity.this, "", "Verificando NIS.");
        }

        @Override
        protected FeatureResult doInBackground(String... params) {
            try {
                String whereClause = params[0];
                QueryParameters myParameters = new QueryParameters();
                myParameters.setWhere(whereClause);

                myParameters.setReturnGeometry(true);
                String[] outfields = new String[] { "*" };
                myParameters.setOutFields(outfields);

                String url = params[1];
                FeatureResult results;

                QueryTask queryTask = new QueryTask(url, credenciales);
                results = queryTask.execute(myParameters);

                return results;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(FeatureResult results) {
            if (results != null) {
                int numResult = (int) results.featureCount();

                if (numResult > 0) {
                    for (Object element : results) {
                        progress.incrementProgressBy(numResult / 100);

                        if (element instanceof Feature) {

                            Feature feature = (Feature) element;
                            myMapView.setExtent(feature.getGeometry(), 0, true);
                            Util oUtil = new Util();

                            oUbicacion = myMapView.getCenter();

                            oUtil.setAttrInView(idResLayoutSelect, vLayout, feature.getAttributes());

                            /*GisTextView tv = new GisTextView(MapsActivity.this);
                            tv.setText(outStr.toString());
                            tv.setPoint((Point) feature.getGeometry());*/

                            break;
                        }
                    }

                    myMapView.zoomin(true);
                } else {
                    Toast.makeText(LectorActivity.this, "NIS no registrado", Toast.LENGTH_SHORT).show();
                }

            } else {
                Toast.makeText(LectorActivity.this, "Fall la verificacin, intente nuevamente",
                        Toast.LENGTH_SHORT).show();
            }
            progress.dismiss();
        }
    }

    private class AsyncQueryTask extends AsyncTask<String, Void, FeatureResult> {

        FeatureResult oResultTramos;
        FeatureResult oResultNis;
        FeatureResult oResultEquipos;
        ArrayList<FeatureResult> aResults;
        int cantEquipos = 0;

        @Override
        protected void onPreExecute() {
            progress = new ProgressDialog(LectorActivity.this);
            progress = ProgressDialog.show(LectorActivity.this, "", "Espere por favor... Obteniendo resultados.");
        }

        @Override
        protected FeatureResult doInBackground(String... params) {

            try {
                String whereClause = params[0];
                QueryParameters myParameters = new QueryParameters();
                myParameters.setWhere(whereClause);

                myParameters.setReturnGeometry(true);
                String[] outfields = new String[] { "*" };
                myParameters.setOutFields(outfields);

                String url = params[1];
                FeatureResult results;

                QueryTask queryTask = new QueryTask(url, credenciales);
                results = queryTask.execute(myParameters);

                if (SpiBusqueda == 1) {
                    String cod = whereClause.replace("codigo", "sed");

                    QueryParameters oParam = new QueryParameters();
                    oParam.setWhere(cod);

                    oParam.setReturnGeometry(true);
                    oParam.setOutFields(new String[] { "sed" });

                    String urlTramos = LyREDBT.getUrl().concat("/1");

                    QueryTask oQueryTramos = new QueryTask(urlTramos, credenciales);
                    oResultTramos = oQueryTramos.execute(oParam);
                } else if (SpiBusqueda == 3) {

                    if (results != null && results.featureCount() == 1) {
                        for (Object element : results) {
                            Feature feature = (Feature) element;
                            String sNis = feature.getAttributeValue("nis").toString();

                            String sWhere = getValueByEmp("CLIENTES_XY_006.nis = '") + sNis + "'";

                            QueryParameters oParam = new QueryParameters();
                            oParam.setWhere(sWhere);

                            oParam.setReturnGeometry(true);
                            oParam.setOutFields(new String[] { "*" });

                            String urlClientes = LyCLIENTES.getUrl().concat("/0");

                            QueryTask oQueryNis = new QueryTask(urlClientes, credenciales);
                            oResultNis = oQueryNis.execute(oParam);

                            if (oResultNis.featureCount() > 0)
                                break;
                        }
                    }
                } else if (SpiBusqueda == 5) {
                    if (results != null) {
                        cantEquipos += results.featureCount();

                        aResults = new ArrayList<>();
                        aResults.add(results);

                        //Si encuentra resultados, omite la segunda busqueda
                        if (results.featureCount() < 1) {
                            QueryParameters oParam = new QueryParameters();
                            oParam.setWhere(whereClause);

                            oParam.setReturnGeometry(true);
                            oParam.setOutFields(new String[] { "*" });

                            String urlEquipos = LyEQUIPOSPTO.getUrl().concat("/3");

                            QueryTask oQueryTramos = new QueryTask(urlEquipos, credenciales);
                            oResultEquipos = oQueryTramos.execute(oParam);

                            if (oResultEquipos != null) {
                                cantEquipos += oResultEquipos.featureCount();
                                aResults.add(oResultEquipos);
                            }
                        }
                    }
                }

                return results;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }

        @Override
        protected void onPostExecute(FeatureResult results) {
            if ((results != null && results.featureCount() > 0) || cantEquipos > 0) {
                int numResult = (results != null) ? (int) results.featureCount() : 0;

                if (mBusquedaLayer != null && myMapView.getLayerByID(mBusquedaLayer.getID()) != null) {
                    myMapView.removeLayer(mBusquedaLayer);
                }

                mBusquedaLayer = new GraphicsLayer();
                myMapView.addLayer(mBusquedaLayer);

                myMapView.setScale(iBusqScale);

                if (SpiBusqueda == 3) {

                    try {

                        if (results.featureCount() > 1) {
                            lstBusqMedidores = new ListView(getApplicationContext());
                            datosBusqMed = new BusqMedClass[numResult];
                            int cont = 0;

                            for (Object element : results) {
                                Feature feature = (Feature) element;

                                String sNis = feature.getAttributeValue("nis").toString();
                                String sSerie = feature.getAttributeValue("serie_medidor").toString();
                                String sMarca = feature.getAttributeValue("marca_medidor").toString();
                                String sModelo = feature.getAttributeValue("modelo").toString();

                                BusqMedClass oMedidor = new BusqMedClass(sSerie + "-" + sNis, sMarca, sModelo);
                                datosBusqMed[cont] = oMedidor;
                                cont++;
                            }

                            AdaptBusqMedidor adaptador;
                            adaptador = new AdaptBusqMedidor(LectorActivity.this, datosBusqMed);

                            lstBusqMedidores.setAdapter(adaptador);

                            abrirBusqMedidores();

                        } else if (results.featureCount() == 1) {
                            for (Object oNis : oResultNis) {
                                Feature fNis = (Feature) oNis;

                                myMapView.setExtent(fNis.getGeometry(), 0, true);

                                SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.RED, 16,
                                        SimpleMarkerSymbol.STYLE.CROSS);
                                Graphic resultLocGraphic = new Graphic(fNis.getGeometry(), resultSymbol);
                                mBusquedaLayer.addGraphic(resultLocGraphic);

                                Callout mapCallout = myMapView.getCallout();
                                fabNavRoute.setVisibility(View.GONE);
                                mapCallout.hide();

                                StringBuilder outStr;
                                Util oUtil = new Util();
                                outStr = oUtil.getStringByAttrClass(0, fNis.getAttributes());
                                GisTextView tv = new GisTextView(LectorActivity.this);
                                tv.setText(outStr.toString());
                                tv.setPoint((Point) fNis.getGeometry());
                                tv.setTextColor(Color.WHITE);

                                tv.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        myMapView.getCallout().hide();
                                        fabNavRoute.setVisibility(View.GONE);
                                    }
                                });

                                mapCallout.setOffset(0, -3);
                                mapCallout.setCoordinates(tv.getPoint());
                                mapCallout.setMaxHeight(100);
                                mapCallout.setMaxWidth(400);
                                mapCallout.setStyle(R.xml.mycalloutprefs);
                                mapCallout.setContent(tv);

                                mapCallout.show();
                                fabNavRoute.setVisibility(View.VISIBLE);
                            }
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (SpiBusqueda == 5) {
                    try {

                        if (cantEquipos > 1) {
                            lstBusqEquipos = new ListView(getApplicationContext());
                            datosBusqEquipo = new BusqEquipoClass[cantEquipos];
                            int cont = 0;
                            Util oUtil = new Util();

                            for (FeatureResult oResult : aResults) {
                                for (Object element : oResult) {
                                    Feature feature = (Feature) element;

                                    String sTipo = feature.getGeometry().getType().name();
                                    String sId = oUtil.formatValCampoDB(feature.getAttributeValue("id_equipo"));
                                    String sNombre = feature.getAttributeValue("nombre").toString();
                                    String sAlimentador = feature.getAttributeValue("alimentador").toString();

                                    BusqEquipoClass oEquipo = new BusqEquipoClass(sId, sNombre, sAlimentador,
                                            sTipo);
                                    datosBusqEquipo[cont] = oEquipo;
                                    cont++;
                                }
                            }

                            AdaptBusqEquipo adaptador;
                            adaptador = new AdaptBusqEquipo(LectorActivity.this, datosBusqEquipo);

                            lstBusqEquipos.setAdapter(adaptador);

                            abrirBusqEquipos();

                        } else if (cantEquipos == 1) {
                            for (FeatureResult oResult : aResults) {
                                for (Object oEquipo : oResult) {
                                    Feature fEquipo = (Feature) oEquipo;

                                    myMapView.setExtent(fEquipo.getGeometry(), 0, true);

                                    Callout mapCallout = myMapView.getCallout();
                                    fabNavRoute.setVisibility(View.GONE);
                                    mapCallout.hide();

                                    StringBuilder outStr;
                                    Util oUtil = new Util();
                                    outStr = oUtil.getStringByAttrClass(SpiBusqueda, fEquipo.getAttributes());
                                    GisTextView tv = new GisTextView(LectorActivity.this);

                                    if (fEquipo.getGeometry().getClass() != Point.class) {
                                        if (fEquipo.getGeometry().getClass() == Polyline.class) {
                                            Polyline oPolyline = (Polyline) fEquipo.getGeometry();
                                            tv.setPoint(oUtil.calculateCenterPolyline(oPolyline));
                                            SimpleLineSymbol oLine = new SimpleLineSymbol(Color.RED, 1f,
                                                    SimpleLineSymbol.STYLE.SOLID);
                                            Graphic resGraph = new Graphic(fEquipo.getGeometry(), oLine);
                                            mBusquedaLayer.addGraphic(resGraph);
                                        }
                                    } else {
                                        SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.RED, 16,
                                                SimpleMarkerSymbol.STYLE.CROSS);
                                        Graphic resultLocGraphic = new Graphic(fEquipo.getGeometry(), resultSymbol);
                                        mBusquedaLayer.addGraphic(resultLocGraphic);
                                        tv.setPoint((Point) fEquipo.getGeometry());
                                    }

                                    tv.setText(outStr.toString());
                                    tv.setTextColor(Color.WHITE);

                                    tv.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View v) {
                                            myMapView.getCallout().hide();
                                            fabNavRoute.setVisibility(View.GONE);
                                        }
                                    });

                                    mapCallout.setOffset(0, -3);
                                    mapCallout.setCoordinates(tv.getPoint());
                                    mapCallout.setMaxHeight(100);
                                    mapCallout.setMaxWidth(400);
                                    mapCallout.setStyle(R.xml.mycalloutprefs);
                                    mapCallout.setContent(tv);

                                    mapCallout.show();
                                    fabNavRoute.setVisibility(View.VISIBLE);
                                    break;
                                }
                            }
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {

                    for (Object element : results) {
                        progress.incrementProgressBy(numResult / 100);

                        if (element instanceof Feature) {

                            Feature feature = (Feature) element;
                            myMapView.setExtent(feature.getGeometry(), 0, true);

                            if (feature.getSymbol() == null) {
                                SimpleMarkerSymbol resultSymbol = new SimpleMarkerSymbol(Color.RED, 16,
                                        SimpleMarkerSymbol.STYLE.CROSS);
                                Graphic resultLocGraphic = new Graphic(feature.getGeometry(), resultSymbol);
                                mBusquedaLayer.addGraphic(resultLocGraphic);

                                try {

                                    for (Object tramo : oResultTramos) {
                                        Feature oTramo = (Feature) tramo;

                                        SimpleLineSymbol oLine = new SimpleLineSymbol(Color.RED, 1f,
                                                SimpleLineSymbol.STYLE.SOLID);
                                        Graphic resGraph = new Graphic(oTramo.getGeometry(), oLine);

                                        mBusquedaLayer.addGraphic(resGraph);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }

                            } else {
                                Graphic resultLocGraphic = new Graphic(feature.getGeometry(), feature.getSymbol());
                                mBusquedaLayer.addGraphic(resultLocGraphic);
                            }

                            Callout mapCallout = myMapView.getCallout();
                            fabNavRoute.setVisibility(View.GONE);
                            mapCallout.hide();

                            StringBuilder outStr;
                            Util oUtil = new Util();
                            outStr = oUtil.getStringByAttrClass(SpiBusqueda, feature.getAttributes());
                            GisTextView tv = new GisTextView(LectorActivity.this);
                            tv.setText(outStr.toString());
                            tv.setPoint((Point) feature.getGeometry());
                            tv.setTextColor(Color.WHITE);

                            tv.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    myMapView.getCallout().hide();
                                    fabNavRoute.setVisibility(View.GONE);
                                }
                            });

                            mapCallout.setOffset(0, -3);
                            mapCallout.setCoordinates(tv.getPoint());
                            mapCallout.setMaxHeight(100);
                            mapCallout.setMaxWidth(400);
                            mapCallout.setStyle(R.xml.mycalloutprefs);
                            mapCallout.setContent(tv);

                            mapCallout.show();
                            fabNavRoute.setVisibility(View.VISIBLE);
                        }
                    }
                }

                myMapView.zoomin(true);
            } else {
                Toast.makeText(LectorActivity.this, "No se encontraron resultados", Toast.LENGTH_SHORT).show();
            }
            progress.dismiss();
        }
    }

    private class IdentifyResults extends AsyncTask<IdentifyParameters, Void, IdentifyResult[]> {

        Point oPoint;
        String[] aUrls;
        String sAttr;
        ProgressDialog progress;
        private ArcGISDynamicMapServiceLayer[] oCapas;
        private IdentifyResult[] oResult;
        UserCredentials oCredentials;
        boolean bMulticapa = false;
        boolean bAsoc = false;

        public IdentifyResults(String mAttr, Point mLocation, String mUrl, UserCredentials mCred) {
            oPoint = mLocation;
            aUrls = new String[] { mUrl };
            oCredentials = mCred;
            sAttr = mAttr;
        }

        public IdentifyResults(Point mLocation, String[] mUrls, UserCredentials mCred) {
            oPoint = mLocation;
            oCredentials = mCred;
            aUrls = mUrls;
            bMulticapa = true;
        }

        public IdentifyResults(Point mLocation, ArcGISDynamicMapServiceLayer[] mCapas, UserCredentials mCred) {
            oPoint = mLocation;
            oCredentials = mCred;
            //aUrls = mUrls;
            bMulticapa = true;
            oCapas = mCapas;
        }

        public IdentifyResults(Point mLocation, String[] mUrls, UserCredentials mCred, boolean mAsoc) {
            oPoint = mLocation;
            oCredentials = mCred;
            aUrls = mUrls;
            bMulticapa = true;
            bAsoc = mAsoc;
        }

        private int[] getLayersVisibles(ArcGISDynamicMapServiceLayer lay) {
            ArrayList<Integer> iCapas = new ArrayList<>();

            for (ArcGISLayerInfo gisLayerInfo : lay.getLayers()) {
                if (gisLayerInfo.isVisible())
                    iCapas.add(gisLayerInfo.getId());
            }

            int[] result = new int[iCapas.size()];

            for (int i = 0; i < iCapas.size(); i++) {
                result[i] = iCapas.get(i);
            }

            return result;
        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(LectorActivity.this, "Identificando sector", "Espere un momento ...");
            progress.setCancelable(true);
            progress.setCanceledOnTouchOutside(true);
        }

        @Override
        protected IdentifyResult[] doInBackground(IdentifyParameters... params) {

            if (params != null && params.length > 0) {
                IdentifyParameters mParams = params[0];

                if (oCapas != null) {
                    for (ArcGISDynamicMapServiceLayer lay : oCapas) {

                        int[] vis = getLayersVisibles(lay);
                        mParams.setLayers(vis);

                        try {
                            IdentifyTask oTask = new IdentifyTask(lay.getUrl(), oCredentials);
                            oResult = oTask.execute(mParams);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        if (oResult.length > 0)
                            break;
                    }

                } else {
                    for (String url : aUrls) {

                        try {
                            IdentifyTask oTask = new IdentifyTask(url, oCredentials);
                            oResult = oTask.execute(mParams);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        if (oResult.length > 0)
                            break;
                    }
                }
            }
            return getResultSet();
        }

        @Override
        protected void onPostExecute(IdentifyResult[] identifyResults) {
            //super.onPostExecute(identifyResults);
            String txt = "";
            if (identifyResults != null && identifyResults.length > 0) {
                if (bMulticapa) {
                    Util oUtil = new Util();

                    Callout mapCallout = myMapView.getCallout();
                    fabNavRoute.setVisibility(View.GONE);
                    mapCallout.hide();

                    for (IdentifyResult identifyResult : identifyResults) {

                        if (!bAsoc) {
                            StringBuilder outStr;
                            Log.w("identifyResult layer " + identifyResult.getLayerName() + " "
                                    + identifyResult.getLayerId(),
                                    " size Attr: " + identifyResult.getAttributes().size());
                            outStr = oUtil.getStringByClassAttr(identifyResult);

                            GisTextView tv = new GisTextView(LectorActivity.this);
                            tv.setText(outStr.toString());
                            tv.setTextColor(Color.WHITE);

                            if (identifyResult.getGeometry().getClass() != Point.class) {
                                if (identifyResult.getGeometry().getClass() == Polyline.class) {
                                    Polyline oPolyline = (Polyline) identifyResult.getGeometry();
                                    tv.setPoint(oUtil.calculateCenterPolyline(oPolyline));
                                } else
                                    tv.setPoint(oPoint);
                            } else
                                tv.setPoint((Point) identifyResult.getGeometry());

                            tv.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    myMapView.getCallout().hide();
                                    fabNavRoute.setVisibility(View.GONE);
                                }
                            });

                            mapCallout.setOffset(0, -3);
                            mapCallout.setCoordinates(tv.getPoint());
                            mapCallout.setMaxHeight(400);
                            mapCallout.setMaxWidth(400);
                            mapCallout.setStyle(R.xml.mycalloutprefs);
                            mapCallout.setContent(tv);

                            mapCallout.show();
                            fabNavRoute.setVisibility(View.VISIBLE);
                        } else {
                            Map<String, Object> attr = identifyResult.getAttributes();
                            CalloutTvClass oCall = oUtil.getCalloutValues(attr);

                            GisTextView tv = new GisTextView(LectorActivity.this);
                            tv.setText(oCall.getVista());
                            tv.setHint(oCall.getValor());
                            tv.setIdObjeto(oCall.getIdObjeto());
                            tv.setPoint((Point) identifyResult.getGeometry());
                            tv.setTipo("existente");
                            tv.setTextColor(Color.WHITE);

                            tv.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    oTxtAsoc.setIdObjeto(((GisTextView) v).getIdObjeto());
                                    oTxtAsoc.setText(((GisTextView) v).getHint());
                                    oTxtAsoc.setTipo(((GisTextView) v).getTipo());
                                    oTxtAsoc.setPoint(myMapView.getCallout().getCoordinates());
                                    bCallOut = false;
                                    bMapTap = false;
                                    myMapView.getCallout().hide();
                                    oLySelectAsoc.clearSelection();
                                    dialogCur.show();
                                    if (mSeleccionLayer != null
                                            && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
                                        myMapView.removeLayer(mSeleccionLayer);

                                    // LINE PRINT
                                    if (mUbicacionLayer != null && oUbicacion != null) {
                                        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.BLUE, 4,
                                                SimpleLineSymbol.STYLE.DASH);
                                        Polyline oLine = new Polyline();
                                        oLine.startPath(oUbicacion);
                                        oLine.lineTo(oTxtAsoc.getPoint());
                                        Graphic graphicDireccion = new Graphic(oLine, lineSymbol, null);
                                        mUbicacionLayer.addGraphic(graphicDireccion);
                                    }
                                }
                            });

                            Point point = (Point) identifyResult.getGeometry();

                            mapCallout.setOffset(0, -3);
                            mapCallout.setCoordinates(point);
                            mapCallout.setMaxHeight(100);
                            mapCallout.setMaxWidth(400);
                            mapCallout.setStyle(R.xml.mycalloutprefs);
                            mapCallout.setContent(tv);

                            mapCallout.show();
                        }

                        break;
                    }
                } else {
                    for (IdentifyResult identifyResult : identifyResults) {
                        Log.w("IdentifyResults", identifyResult.getValue().toString());
                        if (identifyResult.getAttributes().get(sAttr) != null) {
                            Log.w("IdentifyResults", identifyResult.getAttributes().get(sAttr).toString());
                            txt = identifyResult.getAttributes().get(sAttr).toString();
                        }
                    }

                    oTxtAsoc.setText(txt);

                    bCallOut = false;
                    bMapTap = false;
                    myMapView.getCallout().hide();
                    oLySelectAsoc.clearSelection();
                    dialogCrear.show();

                    if (mSeleccionLayer != null && myMapView.getLayerByID(mSeleccionLayer.getID()) != null)
                        myMapView.removeLayer(mSeleccionLayer);

                    nIndentify = 0;
                }
            } else {
                Toast.makeText(LectorActivity.this, "No hay datos", Toast.LENGTH_SHORT).show();
            }

            progress.dismiss();
        }

        public IdentifyResult[] getResultSet() {
            return oResult;
        }
    }

    private void alertNoGps() {
        final AlertDialog alertGps;
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("El sistema GPS esta desactivado, Desea activarlo?").setCancelable(false)
                .setPositiveButton("Si", new DialogInterface.OnClickListener() {
                    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog,
                            @SuppressWarnings("unused") final int id) {
                        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                    }
                });
        alertGps = builder.create();
        alertGps.show();
    }

    private class MyLocationListener implements LocationListener {

        public MyLocationListener() {
            super();
        }

        public void onLocationChanged(Location loc) {

            if (loc == null)
                return;

            boolean zoomToMe = (mLocation == null);
            mLocation = new Point(loc.getLongitude(), loc.getLatitude());
            Point p = (Point) GeometryEngine.project(mLocation, egs, wm);
            if (zoomToMe) {
                myMapView.zoomToResolution(p, 5.0);
            } else {
                if (loc.hasSpeed()) {
                    int speed = (int) ((loc.getSpeed() * 3600) / 1000);
                    if (speed > 10 && speed < 150) {
                        myMapView.centerAt(p, true);
                        if (speed > 120) {
                            Toast.makeText(getApplicationContext(),
                                    String.format("Velocidad max superada: %s Km/h", speed), Toast.LENGTH_SHORT)
                                    .show();
                        }
                    }
                }
            }
        }

        public void onProviderDisabled(String provider) {
            if (!bAlertGps) {
                Toast.makeText(getApplicationContext(), "GPS Deshabilitado", Toast.LENGTH_SHORT).show();
                alertNoGps();
                bAlertGps = true;
            }

        }

        public void onProviderEnabled(String provider) {
            Toast.makeText(getApplicationContext(), "GPS Habilitado", Toast.LENGTH_SHORT).show();
            bAlertGps = false;
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
        case Util.REQUEST_ACCESS_FINE_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

                initGeoposition();

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.

            }
            break;
        }

        // other 'case' lines to check for other
        // permissions this app might request
        }
    }
}