
Instalar app de Medinako
Estos son los pasos para Instalar app de Medinako:
Descargar la aplicación: Descargamos e instalamos el apk de MediNako aqui o también podemos descargar el código aquí.
Verificar los requisitos del sistema: Antes de instalar la aplicación de MediNako, es importante verificar que su dispositivo móvil cumple con los requisitos mínimos del sistema, como la versión del sistema operativo y el espacio de almacenamiento disponible.
Instalar app de Medinako en nuestro teléfono.
Descargamos e instalamos el apk de MediNako aqui
Instalar app MediNako vía Código
programadornovato/medinako_android (github.com)
Configurar la app MediNako
Código
Configuracion.kt
package com.programadornovato.medinako
class Configuracion {
var localOremoto: String = "local"
var ipServidor = "192.168.100.2"
}
ConfiguracionServidor.kt
package com.programadornovato.medinako
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.TextView
import android.widget.Toast
class ConfiguracionServidor : AppCompatActivity() {
var txtIpServidor: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_configuracion_servidor)
//LLAMAOS LOS DATOS DE SHARED PREFERENCE
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
//OBTENEMOS LA IP DEL SEL SERVIDOR A DONDE SE ENVIARA EL AUDIO
val shareIpServidor = mGetSharedPreferences.getString("ipServidor", null)
txtIpServidor = findViewById(R.id.txtIpServidor)
//COLOCAMOS LA IP DEL SERVIDOR EN EL EDITTEXT
txtIpServidor?.text=shareIpServidor
}
fun clickGuardarIpServidor(view: View){
var mSharedPreferences=getSharedPreferences("medinako", Context.MODE_PRIVATE).edit()
mSharedPreferences.putString("ipServidor",txtIpServidor?.text.toString())
mSharedPreferences.commit()
Toast.makeText(this, "Ip guardada exitosamente ", Toast.LENGTH_LONG).show()
}
fun clickIrEntrenar(view: View){
//Abrir la actividad principal
var intent = Intent(this, Entrenar ::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickIrConfig(view: View){
//Abrir la actividad principal
var intent = Intent(this, CrearMedidor::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun irPrincipal(view: View){
val intent = Intent(this, Principal::class.java)
startActivity(intent)
finish()
}
}
CrearMedidor.kt
package com.programadornovato.medinako
import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.text.method.HideReturnsTransformationMethod
import android.text.method.PasswordTransformationMethod
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONException
import java.lang.Thread.sleep
class CrearMedidor : AppCompatActivity() {
var tlListaRedes: TableLayout? = null
var imgRedesWifi: VideoView? = null
var etPasswordWifi: TextView? = null
var btnGuadarWifi: Button? = null
var precargador: LinearLayout? = null
var btnCargarRedes: Button? = null
var btnBorrarMedidor: Button? = null
var rlContenedorPass: RelativeLayout? = null
var btnBuscarRedMedidor: Button? = null
var btnIrTomarMedidas: Button? = null
var tvIndicacion: TextView? = null
var ssidSeleccionado=""
var cantcargarRedes=0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.crear_medidor)
tlListaRedes = findViewById(R.id.tlListaRedes)
imgRedesWifi = findViewById(R.id.imgRedesWifi)
imgRedesWifi?.setOnPreparedListener { it.isLooping = true }
etPasswordWifi = findViewById(R.id.etPasswordWifi)
btnGuadarWifi = findViewById(R.id.btnGuadarWifi)
precargador = findViewById(R.id.precargador)
btnCargarRedes = findViewById(R.id.btnCargarRedes)
btnBorrarMedidor = findViewById(R.id.btnBorrarMedidor)
rlContenedorPass = findViewById(R.id.rlContenedorPass)
btnBuscarRedMedidor = findViewById(R.id.btnBuscarRedMedidor)
btnIrTomarMedidas = findViewById(R.id.btnIrTomarMedidas)
tvIndicacion = findViewById(R.id.tvIndicacion)
cargarRedes()
}
fun clickCargarRedes(view: View){
cargarRedes()
}
fun cargarRedes() {
if(cantcargarRedes==0){
precargador?.visibility = View.VISIBLE
}
tlListaRedes?.removeAllViews()
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ssidShared = mGetSharedPreferences.getString("ssid", null)
val PasswordWifiShared = mGetSharedPreferences.getString("PasswordWifi", null)
val ip = mGetSharedPreferences.getString("ip", null)
etPasswordWifi?.setText(PasswordWifiShared)
var queue = Volley.newRequestQueue(this)
var url="http://192.168.4.1/listawifi"
var jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
{ responseListaWifi ->
imgRedesWifi?.visibility = View.INVISIBLE
btnCargarRedes?.visibility = View.INVISIBLE
btnBuscarRedMedidor?.visibility = View.INVISIBLE
rlContenedorPass?.visibility = View.VISIBLE
btnGuadarWifi?.visibility = View.VISIBLE
tvIndicacion?.visibility = View.VISIBLE
btnBorrarMedidor?.visibility = View.VISIBLE
if(ip!=null){
btnIrTomarMedidas?.visibility = View.VISIBLE
textoAdvertencia("verde","Medidor conectado correctamente")
preguntaIrPrincipal()
}
btnBorrarMedidor?.visibility = View.VISIBLE
try {
var jsonArrayListaRedes = responseListaWifi.getJSONArray("data")
val cantRedes=jsonArrayListaRedes.length()
//Hacemos un ciclo para recorrer todos los elementos de la red y mostrarlos en el TableLayout
for (i in 0 until cantRedes-1) {
var jsonObject = jsonArrayListaRedes.getJSONObject(i)
val registro = LayoutInflater.from(this).inflate(R.layout.table_row_redes, null, false)
val colSSID = registro.findViewById<View>(R.id.colSSID) as TextView
val ssid = jsonObject.getString("ssid")
colSSID.text = ssid
tlListaRedes?.addView(registro)
if(ssid == ssidShared) {
registro.setBackgroundColor(registro.resources.getColor(R.color.teal_700))
ssidSeleccionado = ssid
}
}
btnCargarRedes?.visibility = View.INVISIBLE
btnBuscarRedMedidor?.visibility = View.INVISIBLE
precargador?.visibility = View.INVISIBLE
textoAdvertencia("","")
} catch (e: JSONException) {
e.printStackTrace()
precargador?.visibility = View.INVISIBLE
}
}, { errorListaWifis ->
imgRedesWifi?.visibility = View.VISIBLE
val path = "android.resource://" + packageName + "/" + R.raw.video
imgRedesWifi?.setVideoURI(Uri.parse(path))
imgRedesWifi?.start()
btnCargarRedes?.visibility = View.INVISIBLE
btnBuscarRedMedidor?.visibility = View.VISIBLE
precargador?.visibility = View.INVISIBLE
textoAdvertencia("amarillo","Verifique que esté conectado a la red WiFi Medidor")
}
)
queue.add(jsonObjectRequest)
}
fun clickBorrarMedidor(view: View){
precargador?.visibility = View.VISIBLE
var queue = Volley.newRequestQueue(this)
var mSharedPreferences=getSharedPreferences("medinako", Context.MODE_PRIVATE).edit()
mSharedPreferences.remove("ip").apply()
mSharedPreferences.remove("ssid").apply()
mSharedPreferences.remove("PasswordWifi").apply()
mSharedPreferences.remove("mac").apply()
var url="http://192.168.4.1/EEPROMborrar"
var stringRequest = StringRequest(Request.Method.GET, url,
{ response ->
if(response.equals("1")){
Toast.makeText(this, "Medidor borrado", Toast.LENGTH_SHORT).show()
var queueReset = Volley.newRequestQueue(this)
var urlReset = "http://192.168.4.1/ESPrestart"
var stringRequestReset = StringRequest(Request.Method.GET, urlReset,
{ responseReset ->
precargador?.visibility = View.INVISIBLE
etPasswordWifi?.text=""
//Colocamos todos los registros a color blanco
resetearColorLista()
notificar()
btnIrTomarMedidas?.visibility = View.VISIBLE
}, { error ->
println(error.toString())
precargador?.visibility = View.INVISIBLE
}
)
queueReset.add(stringRequestReset)
}else{
Toast.makeText(this, "Error al borrar el medidor", Toast.LENGTH_SHORT).show()
precargador?.visibility = View.INVISIBLE
}
}, { error ->
println(error.toString())
precargador?.visibility = View.INVISIBLE
}
)
queue.add(stringRequest)
}
fun irPrincipal(){
//Abrir la actividad principal
var intent = Intent(this, Principal::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickIrEntrenar(view: View){
//Abrir la actividad principal
var intent = Intent(this, Entrenar::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickReresar(view: View){
irPrincipal()
}
fun clickIrPrincipal(view: View){
irPrincipal()
}
fun clickDetalles(view: View){
precargador?.visibility = View.VISIBLE
var queueDetalle = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
val mac = mGetSharedPreferences.getString("mac", null)
var urlDetalles = "http://$ip/detalles"
var stringRequestDetalles = StringRequest(Request.Method.GET, urlDetalles,
{ responseDetalles ->
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("Detalles de su dispositivo")
setMessage(responseDetalles.replace("\\n","\n"))
setPositiveButton("Ok",
DialogInterface.OnClickListener { dialog, id ->
precargador?.visibility = View.INVISIBLE
textoAdvertencia("", "")
}
)
setIcon(R.drawable.icon_config_azul)
}
builder.create().show()
}, { error ->
Toast.makeText(this, "No se encontro el dispositivo "+error, Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro el dispositivo "+error)
precargador?.visibility = View.INVISIBLE
})
queueDetalle.add(stringRequestDetalles)
}
fun clickGuadarWifi(view: View){
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
//Llamamos a la funcion que guardara la ip que no entrega el dispositivo esp8266
var mSharedPreferences=getSharedPreferences("medinako", Context.MODE_PRIVATE).edit()
mSharedPreferences.putString("PasswordWifi",etPasswordWifi?.text.toString())
mSharedPreferences.putString("ssid",ssidSeleccionado)
mSharedPreferences.commit()
if(ssidSeleccionado.isEmpty()){
Toast.makeText(this, "Seleccione una red WiFi", Toast.LENGTH_SHORT).show()
return
}
if(etPasswordWifi?.text.toString().isEmpty()){
Toast.makeText(this, "Ingrese una contraseña", Toast.LENGTH_SHORT).show()
return
}
textoAdvertencia("","")
precargador?.visibility = View.VISIBLE
//Enviamos ssid y contraseña de la red seleccionada
var queue = Volley.newRequestQueue(this)
var url = "http://192.168.4.1/setting?pass="+etPasswordWifi?.text.toString()+"&ssid="+ssidSeleccionado
var jsonObjectRequest = StringRequest(Request.Method.GET, url,
{ responseSetting ->
if(responseSetting.equals("(IP unset)")) {
textoAdvertencia("rojo","Verifique que la contraseña sea correcta e intente de nuevo")
Toast.makeText(this, "Intente de nuevo", Toast.LENGTH_SHORT).show()
var queueReset = Volley.newRequestQueue(this)
var urlReset = "http://192.168.4.1/ESPrestart"
var stringRequestReset = StringRequest(Request.Method.GET, urlReset,
{ responseReset ->
precargador?.visibility = View.INVISIBLE
btnIrTomarMedidas?.visibility = View.VISIBLE
return@StringRequest
}, { error ->
println(error.toString())
sleep(3000)
btnIrTomarMedidas?.visibility = View.VISIBLE
precargador?.visibility = View.INVISIBLE
}
)
queueReset.add(stringRequestReset)
precargador?.visibility = View.INVISIBLE
}
//Guardamos la ip a la que nos vamos a conectar
mSharedPreferences.putString("ip",responseSetting.toString())
mSharedPreferences.commit()
precargador?.visibility = View.INVISIBLE
btnBorrarMedidor?.visibility = View.VISIBLE
var queueMAC = Volley.newRequestQueue(this)
var urlMAC="http://192.168.4.1/mac"
var stringRequestMAC = StringRequest(Request.Method.GET, urlMAC,
{ responseMAC ->
var mSharedPreferences=getSharedPreferences("medinako", Context.MODE_PRIVATE).edit()
mSharedPreferences.putString("mac",responseMAC.toString())
mSharedPreferences.commit()
var queueReset = Volley.newRequestQueue(this)
var urlReset="http://192.168.4.1/ESPrestart"
var stringRequestReset = StringRequest(Request.Method.GET, urlReset,
{ responseReset ->
precargador?.visibility = View.INVISIBLE
btnIrTomarMedidas?.visibility = View.VISIBLE
textoAdvertencia("verde","Medidor conectado correctamente")
preguntaIrPrincipal()
}, { errorReset ->
println(errorReset.toString())
sleep(3000)
btnIrTomarMedidas?.visibility = View.VISIBLE
precargador?.visibility = View.INVISIBLE
textoAdvertencia("verde","Medidor conectado correctamente")
preguntaIrPrincipal()
}
)
queueReset.add(stringRequestReset)
}, { errorNoHayMac ->
precargador?.visibility = View.INVISIBLE
Toast.makeText(this, "No se pudo obtener la MAC", Toast.LENGTH_SHORT).show()
textoAdvertencia("rojo","No se pudo obtener la MAC, intente de nuevo")
}
)
queueMAC.add(stringRequestMAC)
}, { errorSetting ->
precargador?.visibility = View.INVISIBLE
textoAdvertencia("rojo","No se pudo conectar a la red, intente de nuevo")
//Si ya esta guardada la ip mandamos hacia la activity principal
if(ip!=null) {
irPrincipal()
}
//Toast.makeText(this, error.toString(), Toast.LENGTH_SHORT).show()
println(errorSetting.toString())
}
)
queue.add(jsonObjectRequest)
}
//Colocamos todos los registros a color blanco
fun resetearColorLista(){
//Colocamos todos los registros a color blanco
for (i in 0 until tlListaRedes!!.childCount) {
val child = tlListaRedes!!.getChildAt(i)
if (child is TableRow) {
val row = child
for (x in 0 until row.childCount) {
val view = row.getChildAt(x)
view.setBackgroundColor(resources.getColor(R.color.white))
}
}
}
}
//Funcion que se ejecuta cuando se selecciona una red de la lista (en table_row_redes.xml)
fun clickListaRedes(view: View) {
//Colocamos todos los registros a color blanco
resetearColorLista()
//obtener texto de la caja de texto
var ssid = view.findViewById<View>(R.id.colSSID) as TextView
var ssidText=ssid.text
ssid.setBackgroundColor(resources.getColor(R.color.teal_700))
//Colocamos en la variable global el ssid seleccionado para despues gurdarlo en el esp8266
ssidSeleccionado=ssidText.toString()
}
fun ShowHidePass(view: View){
if(etPasswordWifi?.getTransformationMethod()!!.equals(PasswordTransformationMethod.getInstance())){
etPasswordWifi?.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
else{
etPasswordWifi?.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
fun clickBuscarRedMedidor(view: View){
startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
sleep(1500)
btnCargarRedes?.visibility = View.VISIBLE
}
fun preguntaIrPrincipal(){
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("Se a cofigurado exitosamente el medidor")
setMessage("¿Deseas ir a tomar medidas?")
setPositiveButton("Si",
DialogInterface.OnClickListener { dialog, id ->
irPrincipal()
}
)
setNegativeButton("No",
DialogInterface.OnClickListener { dialog, id ->
// User cancelled the dialog
}
)
setIcon(R.drawable.icon_inicio_azul)
}
builder.create().show()
}
fun clickSalir(view: MenuItem) {
finish()
}
fun textoAdvertencia(color:String="rojo",texto:String=""){
tvIndicacion?.text=texto
if(color=="rojo"){
tvIndicacion?.setBackgroundColor(Color.RED)
tvIndicacion?.setTextColor(Color.WHITE)
}else if(color=="verde"){
tvIndicacion?.setBackgroundColor(Color.GREEN)
tvIndicacion?.setTextColor(Color.BLACK)
}else if(color=="amarillo"){
tvIndicacion?.setBackgroundColor(Color.YELLOW)
tvIndicacion?.setTextColor(Color.BLACK)
} else if(color==""){
tvIndicacion?.setBackgroundColor(Color.WHITE)
tvIndicacion?.setTextColor(Color.BLACK)
}
}
fun notificar(){
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("Medidor eliminado exitosamente")
setPositiveButton("OK",
DialogInterface.OnClickListener { dialog, id ->
})
}
builder.create().show()
}
}
Entrenar.kt
package com.programadornovato.medinako
import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.*
import com.android.volley.DefaultRetryPolicy
import com.android.volley.Request
import com.android.volley.RetryPolicy
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONException
import java.lang.Thread.sleep
class Entrenar : AppCompatActivity() {
var lvEstados: ListView? = null
var tlListaEstados: TableLayout? = null
var trVacio: TableRow? = null
var trMedio: TableRow? = null
var trLleno: TableRow? = null
var precargador: LinearLayout? = null
var tvResultado: TextView? = null
var estado=""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_entrenar)
tlListaEstados = findViewById(R.id.tlListaEstados)
trVacio = findViewById(R.id.trVacio)
trMedio = findViewById(R.id.trMedio)
trLleno = findViewById(R.id.trLleno)
precargador = findViewById(R.id.precargador)
tvResultado = findViewById(R.id.tvResultado)
val ip = getSharedPreferences("medinako", Context.MODE_PRIVATE).getString("ip", null)
if(ip == null){
preguntaAbrirConfiguracion()
}
}
fun clickLeer(view: View) {
precargador?.visibility = View.VISIBLE
textoAdvertencia("amarillo","Tomando medida, espere 20 segundos para poder entrenar")
var queueEnciende = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
val mac = mGetSharedPreferences.getString("mac", null)
if(estado.isEmpty()){
textoAdvertencia("rojo","Selecciona un estado")
Toast.makeText(this, "Selecciona un estado", Toast.LENGTH_SHORT).show()
precargador?.visibility = View.INVISIBLE
return
}
//Hacemos que el esp82 vibre y mande los datos al servidor
var url = "http://$ip/entrenar?estado=$estado"
var stringRequestEncender = StringRequest(
Request.Method.GET, url,
{ responseEncender ->
textoAdvertencia("amarillo","Tomando medida, espere 20 segundos para poder entrenar")
precargador?.visibility = View.INVISIBLE
if(mac!=null){
precargador?.visibility = View.VISIBLE
sleep(25000)
precargador?.visibility = View.INVISIBLE
textoAdvertencia("verde","Se ha leido el estado $estado, lea otros esados para entrenar o proceda a ENTRENAR")
}else{
textoAdvertencia("rojo","No se encontro MAC del dispositivo porfavor reinicie la aplicacion")
}
}, { error ->
textoAdvertencia("rojo","No se ha podido conectar al medidor")
precargador?.visibility = View.INVISIBLE
preguntaAbrirConfiguracion()
})
queueEnciende.add(stringRequestEncender)
}
fun clickEntrenar(view: View) {
val configuracion = Configuracion()
precargador?.visibility = View.VISIBLE
var queueValidaArchivos = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val mac = mGetSharedPreferences.getString("mac", null)
if(mac==null){
precargador?.visibility = View.INVISIBLE
preguntaAbrirConfiguracion()
}
var urlValidaArchivos = "http://"+configuracion.ipServidor+":5000/listo-entrenar?mac=$mac"
var JsonObjectValidaArchivos = JsonObjectRequest(
Request.Method.GET, urlValidaArchivos,null,
{ responseValidaArchivos ->
try {
var jsonArrayEstados = responseValidaArchivos.getJSONArray("data")
var jsonObject = jsonArrayEstados.getJSONObject(0)
val Vacio = jsonObject.getInt("Vacio")
val Medio = jsonObject.getInt("Medio")
val Lleno = jsonObject.getInt("Lleno")
var mensaje = ""
if(Vacio<10){
mensaje = mensaje + "Vacio, "
}
if(Medio<10){
mensaje = mensaje +"Medio, "
}
if(Lleno<10){
mensaje = mensaje +"Lleno, "
}
if(mensaje.isEmpty()){
var queueEntrenar = Volley.newRequestQueue(this)
val retryPolicy: RetryPolicy = DefaultRetryPolicy(10000,3,3F)
//Nos conectamos al servidor python para que entrene el modelo
var urlEntrenar = "http://"+configuracion.ipServidor+":5000/entrenar?mac=$mac"
var stringEntrenar = StringRequest(
Request.Method.GET, urlEntrenar,
{ responseEntrenar ->
if(responseEntrenar=="1" || responseEntrenar=="1.0" ){
textoAdvertencia("verde","Entrenamiento finalizado EXITOSAMENTE")
precargador?.visibility = View.INVISIBLE
}else{
textoAdvertencia("rojo","No se ha podido entrenar el modelo (intentelo de nuevo)")
precargador?.visibility = View.INVISIBLE
}
}, { error ->
textoAdvertencia("rojo","No hay conexión a internet")
precargador?.visibility = View.INVISIBLE
})
stringEntrenar.retryPolicy = retryPolicy
queueEntrenar.add(stringEntrenar)
}else{
//Remover la ultima coma
mensaje = mensaje.substring(0, mensaje.length-2)
textoAdvertencia("rojo","Falta entrenar $mensaje")
precargador?.visibility = View.INVISIBLE
}
} catch (e: JSONException) {
e.printStackTrace()
precargador?.visibility = View.INVISIBLE
}
}, { error ->
textoAdvertencia("rojo","No se pudo entrenar (Falta subir archivos) "+error.toString())
precargador?.visibility = View.INVISIBLE
})
queueValidaArchivos.add(JsonObjectValidaArchivos)
}
fun clickRegistro(view: View){
trVacio?.setBackgroundColor(resources.getColor(R.color.white))
trMedio?.setBackgroundColor(resources.getColor(R.color.white))
trLleno?.setBackgroundColor(resources.getColor(R.color.white))
view.setBackgroundColor(resources.getColor(R.color.teal_700))
if (view.id == R.id.trVacio) {
estado = "Vacio"
} else if (view.id == R.id.trMedio) {
estado = "Medio"
} else if (view.id == R.id.trLleno) {
estado = "Lleno"
}
}
//Abrir la actividad de entrenar
fun abrirConfigurarMedidor(menu: MenuItem){
val intent = Intent(this, CrearMedidor::class.java)
startActivity(intent)
finish()
}
fun abrirPrincipal(menu:MenuItem){
val intent = Intent(this, Principal::class.java)
startActivity(intent)
finish()
}
fun Salir(menu:MenuItem){
finish()
}
fun preguntaAbrirConfiguracion(){
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("No se encontró el medidor")
setMessage("Revise que el dispositivo este funcionando.\n¿Desea abrir la cofiguración?")
setPositiveButton("Si",
DialogInterface.OnClickListener { dialog, id ->
abrirCrearMedidor("menu")
})
setNegativeButton("No",
DialogInterface.OnClickListener { dialog, id ->
})
}
builder.create().show()
}
fun abrirCrearMedidor(desde:String=""){
val intent = Intent(this, CrearMedidor::class.java)
if(desde=="menu") {
intent.putExtra("desde", "menu");
}
startActivity(intent)
finish()
}
fun clickIrConfig(view: View){
//Abrir la actividad principal
var intent = Intent(this, CrearMedidor::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickIrEntrenar(view: View){
//Abrir la actividad principal
var intent = Intent(this, Entrenar ::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun irPrincipal(view: View){
//Abrir la actividad principal
var intent = Intent(this, Principal::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickDetalles(view: View){
precargador?.visibility = View.VISIBLE
var queueDetalle = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
val mac = mGetSharedPreferences.getString("mac", null)
var urlDetalles = "http://$ip/detalles"
var stringRequestDetalles = StringRequest(Request.Method.GET, urlDetalles,
{ responseDetalles ->
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("Detalles de su dispositivo")
setMessage(responseDetalles.replace("\\n","\n"))
setPositiveButton("Ok",
DialogInterface.OnClickListener { dialog, id ->
precargador?.visibility = View.INVISIBLE
textoAdvertencia("", "")
}
)
setIcon(R.drawable.icon_config_azul)
}
builder.create().show()
}, { error ->
Toast.makeText(this, "No se encontro el dispositivo "+error, Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro el dispositivo "+error)
precargador?.visibility = View.INVISIBLE
})
queueDetalle.add(stringRequestDetalles)
}
fun textoAdvertencia(color:String="rojo",texto:String=""){
tvResultado?.text=texto
if(color=="rojo"){
tvResultado?.setBackgroundColor(Color.RED)
tvResultado?.setTextColor(Color.WHITE)
}else if(color=="verde"){
tvResultado?.setBackgroundColor(Color.GREEN)
tvResultado?.setTextColor(Color.BLACK)
}else if(color=="amarillo"){
tvResultado?.setBackgroundColor(Color.YELLOW)
tvResultado?.setTextColor(Color.BLACK)
} else if(color==""){
tvResultado?.setBackgroundColor(Color.WHITE)
tvResultado?.setTextColor(Color.BLACK)
}
}
}
Principal.kt
package com.programadornovato.medinako
import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONException
import java.lang.Thread.sleep
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*
class Principal : AppCompatActivity() {
var tlListaResultados: TableLayout?=null
var precargador: LinearLayout? = null
var tvRes: TextView? = null
lateinit var etDia: TextView
lateinit var calDia: CalendarView
var fecha = ""
var yaPreguntoCambiarWifi=false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_principal)
tlListaResultados=findViewById(R.id.tlListaResultados)
precargador = findViewById(R.id.precargador)
tvRes = findViewById(R.id.tvRes)
etDia = findViewById(R.id.etDia)
calDia = findViewById(R.id.calDia)
calDia.visibility = View.GONE
val configuracion=Configuracion()
//LLAMAOS LOS DATOS DE SHARED PREFERENCE
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
//OBTENEMOS LA IP DEL SEL SERVIDOR A DONDE SE ENVIARA EL AUDIO
val shareIpServidor = mGetSharedPreferences.getString("ipServidor", "")
if( shareIpServidor?.length!! > 0 ){
configuracion.ipServidor= shareIpServidor.toString()
}
//Si estamos conectados al wifi medidor preguntamos si queremos conectarnos a una red wifi especifica
validaSiRedMedidorEstaConectado()
//Si estamos conectados al wifi internet
validaSiRedInternetEstaConectado()
//Colocar en el textview (etDia) la fecha actual
colocarLaFechaHoy()
val ip = getSharedPreferences("medinako", Context.MODE_PRIVATE).getString("ip", null)
//Si no hau IP preguntar si se quiere ir al crear un medidor
if(ip == null){
preguntaAbrirConfiguracionMedidor()
}
//Si la ip no es nula validamos que exista conexion a internet
else{
//Leemos la mac del medidor para guardar su medicion
var queue = Volley.newRequestQueue(this)
var url = "http://"+configuracion.ipServidor+":5000/lista-mediciones"
var stringObjectRequest = StringRequest(Request.Method.GET, url,
{ responseHayInternet ->
//Si hay conexion a internet cargamos las tablas
cargaTabla()
},
{ errorHayInternet ->
//Si no hay conexion a internet preguntamos si podemos abrir wifi
if(yaPreguntoCambiarWifi==false) {
yaPreguntoCambiarWifi = true
preguntaAbrirConfiguracionWifi()
}
})
queue.add(stringObjectRequest)
}
//Click en el calendario colocamos la fecha en el textview
calDia.setOnDateChangeListener(
CalendarView.OnDateChangeListener { view, year, month, dayOfMonth ->
val mes=String.format("%02d", month+1)
val dia=String.format("%02d", dayOfMonth)
fecha = "$year-$mes-$dia"
etDia.text = "Resultados del dia "+fecha
cargaTabla()
calDia?.visibility = View.GONE
}
)
}
//Validamos si estamos conectados al wifi medidor y si es asi lo reseteamos y preguntamos si se quiere cambiar wifi
fun validaSiRedMedidorEstaConectado(){
var queue = Volley.newRequestQueue(this)
var url = "http://192.168.4.1/ESPrestart"
var stringObjectRequest = StringRequest(
Request.Method.GET, url,
{ responseResetMedidor ->
if(yaPreguntoCambiarWifi==false) {
yaPreguntoCambiarWifi=true
preguntaAbrirConfiguracionWifi()
}
},
{ errorResetMedidor ->
})
queue.add(stringObjectRequest)
}
fun validaSiRedInternetEstaConectado(){
var configuracion=Configuracion()
var queue = Volley.newRequestQueue(this)
var url="http://"+configuracion.ipServidor+":5000/lista-mediciones"
var stringObjectRequest = StringRequest(
Request.Method.GET, url,
{ response ->
},
{ error ->
if(yaPreguntoCambiarWifi==false) {
yaPreguntoCambiarWifi = true
preguntaAbrirConfiguracionWifi()
}
})
queue.add(stringObjectRequest)
}
fun colocarLaFechaHoy(){
val ahora = System.currentTimeMillis()
val hoy = Date(ahora)
val df: DateFormat = SimpleDateFormat("yyyy-MM-dd")
fecha = df.format(hoy)
etDia.text = "Resultados del dia "+fecha
}
fun clickRecargar(view: View){
val mac = getSharedPreferences("medinako", Context.MODE_PRIVATE).getString("mac", null)
if(mac!=null){
cargaTabla()
}else{
Toast.makeText(this, "No fue posible ontener la MAC", Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No fue posible ontener la MAC")
}
}
fun cargaTabla(){
textoAdvertencia("", "")
val configuracion=Configuracion()
precargador?.visibility = View.VISIBLE
tlListaResultados?.removeAllViews()
val mac= getSharedPreferences("medinako", Context.MODE_PRIVATE).getString("mac", null)
if(mac==null){
precargador?.visibility = View.INVISIBLE
preguntaAbrirConfiguracionMedidor()
return
}
var queueListaMediciones=Volley.newRequestQueue(this)
//var url="http://"+configuracion.ipServidor+"/medinako/listaMediciones.php?idDispositivo=$mac&fecha=$fecha"
var url="http://"+configuracion.ipServidor+":5000/lista-mediciones?mac=$mac&fecha=$fecha"
var jsonObjectRequest=JsonObjectRequest(Request.Method.GET,url,null,
{ responseMediciones ->
precargador?.visibility = View.INVISIBLE
try {
var jsonArray=responseMediciones.getJSONArray("data")
for(i in 0 until jsonArray.length() ){
var jsonObject=jsonArray.getJSONObject(i)
val registro= LayoutInflater.from(this).inflate(R.layout.table_row_np,null,false)
val colEstado=registro.findViewById<View>(R.id.colEstado) as TextView
val colFechaCreacion=registro.findViewById<View>(R.id.colSSID) as TextView
colFechaCreacion.text=jsonObject.getString("fechaCreacion")
colEstado.text=jsonObject.getString("estado")
//Cambiar el color de la fila dependiendo del estado
if(jsonObject.getString("estado")=="Vacio"){
colEstado.setBackgroundColor(Color.argb(100,179,0,0))
colEstado.setTextColor(Color.WHITE)
}else if(jsonObject.getString("estado")=="Medio"){
colEstado.setBackgroundColor(Color.argb(100,255,255,0))
colEstado.setTextColor(Color.BLACK)
}else if(jsonObject.getString("estado")=="Lleno"){
colEstado.setBackgroundColor(Color.argb(100,0,118,0))
colEstado.setTextColor(Color.WHITE)
}
tlListaResultados?.addView(registro)
}
if(jsonArray.length()==0){
textoAdvertencia("amarillo", " No hay resultados para la fecha seleccionada " +
"\n - Seleccione una nueva fecha " +
"\n - O haga click en Recargar " +
"\n - O en Tomar medida")
}
}catch (e: JSONException){
e.printStackTrace()
}
}, { errorMediciones ->
Toast.makeText(this,"No se encontro el servidor "+errorMediciones.toString(),Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro el servidor "+errorMediciones.toString())
precargador?.visibility = View.INVISIBLE
//Preguntamos si se quiere cambiar de red wifi
if(yaPreguntoCambiarWifi==false) {
yaPreguntoCambiarWifi = true
preguntaAbrirConfiguracionWifi()
}
}
)
queueListaMediciones.add(jsonObjectRequest)
}
fun clickIrMedidor(view: MenuItem) {
abrirCrearMedidor("menu")
}
fun abrirCrearMedidor(desde:String=""){
val intent = Intent(this, CrearMedidor::class.java)
if(desde=="menu") {
intent.putExtra("desde", "menu");
}
startActivity(intent)
finish()
}
fun abrirEntrenar(menu:MenuItem){
val intent = Intent(this, Entrenar::class.java)
startActivity(intent)
finish()
}
fun clickTomarMedida(view: View) {
precargador?.visibility = View.VISIBLE
var queueEnciende = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
val mac = mGetSharedPreferences.getString("mac", null)
var url = "http://$ip/encender"
var stringRequestEncender = StringRequest(Request.Method.GET, url,
{ responseEncender ->
Toast.makeText(this, "Tomando medida recargue en 20 segundos", Toast.LENGTH_LONG).show()
textoAdvertencia("amarillo", "Tomando medida recargue en 20 segundos")
sleep(18000)
textoAdvertencia("", "")
precargador?.visibility = View.INVISIBLE
if(mac!=null){
cargaTabla()
}else{
Toast.makeText(this, "No se encontro MAC del dispositivo porfavor reinicie la aplicacion", Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro MAC del dispositivo porfavor reinicie la aplicacion")
}
}, { error ->
Toast.makeText(this, "No se encontro el dispositivo "+error, Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro el dispositivo "+error)
precargador?.visibility = View.INVISIBLE
preguntaAbrirConfiguracionMedidor()
})
queueEnciende.add(stringRequestEncender)
}
fun preguntaAbrirConfiguracionMedidor(){
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("No se encontró el medidor")
setMessage("Revise que el dispositivo este funcionando.\n¿Desea abrir la cofiguración?")
setPositiveButton("Si",
DialogInterface.OnClickListener { dialog, id ->
abrirCrearMedidor("menu")
}
)
setNegativeButton("No",
DialogInterface.OnClickListener { dialog, id ->
}
)
setIcon(R.drawable.icon_config_azul)
}
builder.create().show()
}
fun preguntaAbrirConfiguracionWifi(){
val drawableID: Int = this.getResources().getIdentifier("icon_wifi", "drawable", this.getPackageName())
val ssid= getSharedPreferences("medinako", Context.MODE_PRIVATE).getString("ssid", null)
var ssidTexto=""
if(ssid!=null){
ssidTexto="Conéctese a la red "+ssid
}
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("No tiene acceso a internet")
setMessage(ssidTexto+"\n¿Desea abrir la cofiguración wifi?")
setPositiveButton("Si",
DialogInterface.OnClickListener { dialog, id ->
startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
}
)
setNegativeButton("No",
DialogInterface.OnClickListener { dialog, id ->
}
)
setIcon(R.drawable.icon_no_wifi_azul)
}
builder.create().show()
}
fun clickSalir(view: MenuItem) {
finish()
}
fun clickIrConfig(view: View){
//Abrir la actividad principal
var intent = Intent(this, CrearMedidor::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickDetalles(view: View){
precargador?.visibility = View.VISIBLE
var queueEnciende = Volley.newRequestQueue(this)
val mGetSharedPreferences = getSharedPreferences("medinako", Context.MODE_PRIVATE)
val ip = mGetSharedPreferences.getString("ip", null)
val mac = mGetSharedPreferences.getString("mac", null)
var urlDetalles = "http://$ip/detalles"
var stringRequestDetalles = StringRequest(Request.Method.GET, urlDetalles,
{ responseDetalles ->
val builder = AlertDialog.Builder(this)
builder.apply {
setTitle("Detalles de su dispositivo")
setMessage(responseDetalles.replace("\\n","\n"))
setPositiveButton("Ok",
DialogInterface.OnClickListener { dialog, id ->
precargador?.visibility = View.INVISIBLE
textoAdvertencia("", "")
}
)
setIcon(R.drawable.icon_config_azul)
}
builder.create().show()
}, { error ->
Toast.makeText(this, "No se encontro el dispositivo "+error, Toast.LENGTH_LONG).show()
textoAdvertencia("rojo", "No se encontro el dispositivo "+error)
precargador?.visibility = View.INVISIBLE
})
queueEnciende.add(stringRequestDetalles)
}
fun clickConfigServ(view: View){
//Abrir la actividad principal
var intent = Intent(this, ConfiguracionServidor::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickIrEntrenar(view: View){
//Abrir la actividad principal
var intent = Intent(this, Entrenar ::class.java)
startActivity(intent)
//Cerrar esta actividad
finish()
}
fun clickVerCalendario(view: View){
calDia?.visibility = View.VISIBLE
}
fun textoAdvertencia(color:String="rojo",texto:String=""){
tvRes?.text=texto
if(color=="rojo"){
tvRes?.setBackgroundColor(Color.RED)
tvRes?.setTextColor(Color.WHITE)
}else if(color=="verde"){
tvRes?.setBackgroundColor(Color.GREEN)
tvRes?.setTextColor(Color.BLACK)
}else if(color=="amarillo"){
tvRes?.setBackgroundColor(Color.YELLOW)
tvRes?.setTextColor(Color.BLACK)
} else if(color==""){
tvRes?.setBackgroundColor(Color.WHITE)
tvRes?.setTextColor(Color.BLACK)
}
}
}
Ave que vuela, a la cazuela.