Skip to content

Commit 7ab902e

Browse files
committed
varias mejoras 1.8
- carga la sesion al reconectar. - mejora del selector de acciones - arreglos varios
1 parent 56d5130 commit 7ab902e

File tree

9 files changed

+157
-94
lines changed

9 files changed

+157
-94
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ py SocketeDeck.py
5757
Aunque el proyecto para mí está terminado, ya que cumple la función por la que fue desarrollado, me gustaría agregarle algunas otras cosas.
5858

5959
- Iconos: Set de iconos preestablecidos (seguramente de Bootstrap o Font Awesome) que se puedan ver en la app móvil.*
60+
- Cantidad de botones: Actualmente la aplicación móvil controla la cantidad de botones, me gustaria que el servidor le dijiera cuantos botones debe renderizar.
6061

6162
> - ~~Padding de botones: Comandos vacíos para saltar botones en la app móvil.~~
6263
> - ~~Información de acciones: Darle un nombre y descripción, junto con el autor y versión de una acción.~~

SocketeDeck-app/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ android {
1111
minSdk 29
1212
targetSdk 34
1313
versionCode 1
14-
versionName "1.5"
14+
versionName "1.8"
1515

1616
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1717
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.crizacio.socketedeck.Clases;
2+
3+
import android.app.Activity;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.ArrayAdapter;
8+
import android.widget.TextView;
9+
10+
import com.crizacio.socketedeck.R;
11+
12+
import java.util.List;
13+
14+
public class AccionesListAdapter extends ArrayAdapter<Acciones> {
15+
16+
private Activity context;
17+
List<Acciones> acciones;
18+
19+
public AccionesListAdapter(Activity context, List<Acciones> acciones) {
20+
super(context, R.layout.lista_doble, acciones);
21+
this.context = context;
22+
this.acciones = acciones;
23+
}
24+
25+
@Override
26+
public View getView(int position, View convertView, ViewGroup parent) {
27+
LayoutInflater inflater = context.getLayoutInflater();
28+
View listViewItem = inflater.inflate(R.layout.lista_doble, null, true);
29+
30+
TextView textViewTitle = (TextView) listViewItem.findViewById(R.id.txtTitulo);
31+
TextView textViewSubtitle= (TextView) listViewItem.findViewById(R.id.txtSubtitulo);
32+
TextView textViewAuthor= (TextView) listViewItem.findViewById(R.id.txtAutor);
33+
TextView textViewVersion= (TextView) listViewItem.findViewById(R.id.txtVersion);
34+
35+
Acciones accion = acciones.get(position);
36+
37+
textViewTitle.setText(accion.getNombre());
38+
textViewSubtitle.setText(accion.getDescripcion());
39+
textViewAuthor.setText(accion.getAutor());
40+
textViewVersion.setText(accion.getVersion());
41+
42+
return listViewItem;
43+
}
44+
}

SocketeDeck-app/app/src/main/java/com/crizacio/socketedeck/MainActivity.java

Lines changed: 40 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,25 @@
77
import android.content.Context;
88
import android.content.Intent;
99
import android.content.SharedPreferences;
10-
import android.graphics.Typeface;
1110
import android.os.AsyncTask;
1211
import android.os.Bundle;
1312

1413
import android.util.TypedValue;
1514
import android.view.View;
1615
import android.view.ViewGroup;
17-
import android.widget.ArrayAdapter;
16+
import android.widget.AdapterView;
1817
import android.widget.Button;
1918
import android.widget.GridLayout;
2019

2120
import android.widget.HorizontalScrollView;
2221
import android.widget.LinearLayout;
23-
import android.widget.Spinner;
22+
import android.widget.ListView;
2423
import android.widget.Toast;
2524

2625
import androidx.appcompat.app.AppCompatActivity;
27-
import androidx.core.content.res.ResourcesCompat;
2826

2927
import com.crizacio.socketedeck.Clases.Acciones;
28+
import com.crizacio.socketedeck.Clases.AccionesListAdapter;
3029
import com.crizacio.socketedeck.Clases.Configuracion;
3130
import com.google.gson.Gson;
3231

@@ -50,7 +49,6 @@ public class MainActivity extends AppCompatActivity {
5049

5150
private Configuracion configuracion;
5251
private List<Button> botonesAccion = new ArrayList<>(); // Guarda los botones que ejecutan acciones
53-
private List<Button> botonesAcciones = new ArrayList<>(); // Guarda los botones que cambian las acciones
5452

5553
private String SERVER_IP;
5654
private int SERVER_PORT, BUTTON_COUNT, BUTTON_ROWS, BUTTON_COLUMNS;
@@ -105,67 +103,31 @@ public void onClick(View v) {
105103
}
106104
});
107105

108-
Button btnRenderizar = new Button(this);
109-
btnRenderizar.setText("Renderizar");
110-
btnRenderizar.setId(View.generateViewId());
111-
btnRenderizar.setOnClickListener(new View.OnClickListener() {
112-
@Override
113-
public void onClick(View v) {
114-
cargarConfiguracion();
115-
crearLayout();
116-
}
117-
});
118-
119-
Button btnConectar = new Button(this);
120-
btnConectar.setText("Re/Conectar");
121-
btnConectar.setId(View.generateViewId());
122-
btnConectar.setOnClickListener(new View.OnClickListener() {
123-
@Override
124-
public void onClick(View v) {
125-
cargarConfiguracion();
126-
conectarServidor();
127-
}
128-
});
129-
130106
Dialog dialogAccions = new Dialog(MainActivity.this);
131107
Button btnAcciones = new Button(this);
132108
btnAcciones.setText("Acciones");
133109
btnAcciones.setId(View.generateViewId());
134110
btnAcciones.setOnClickListener(new View.OnClickListener() {
135111
@Override
136112
public void onClick(View v) {
137-
Spinner spnAcciones;
138-
Button btnAplicar;
113+
ListView lstAcciones;
139114

140115
dialogAccions.setContentView(R.layout.dialog_acciones);
141116
dialogAccions.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
142-
dialogAccions.setCancelable(false);
143-
// dialogAccions.getWindow().getAttributes().windowAnimations = R.style.animation;
117+
dialogAccions.setCancelable(true);
118+
dialogAccions.setCanceledOnTouchOutside(true);
144119

145-
spnAcciones = dialogAccions.findViewById(R.id.spnAcciones);
146-
btnAplicar = dialogAccions.findViewById(R.id.btnAplicar);
120+
lstAcciones = dialogAccions.findViewById(R.id.lstAcciones);
147121

148-
// Crear una lista de nombres de las acciones
149-
List<String> accionNames = new ArrayList<>();
150-
for (Acciones accion : configuracion.getAcciones()) {
151-
accionNames.add(accion.getNombre()); // Agregar el nombre de cada acción
152-
}
153-
// Crear un ArrayAdapter con los nombres de las acciones
154-
ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, accionNames);
155-
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Estilo del dropdown
156-
// Establecer el adapter en el spinner
157-
spnAcciones.setAdapter(adapter);
158-
spnAcciones.setSelection(accionNames.indexOf(configuracion.getAccion()));
159-
160-
btnAplicar.setOnClickListener(new View.OnClickListener() {
161-
@Override
162-
public void onClick(View v) {
163-
// Obtener el item seleccionado
164-
int selectedPosition = spnAcciones.getSelectedItemPosition(); // Obtiene la posicion seleccionada
165-
String selectedAccion = spnAcciones.getSelectedItem().toString(); // Obtiene el nombre de la accion seleccionada
122+
// Crea el adaptador y lo aplica
123+
AccionesListAdapter listaAccionesAdapter = new AccionesListAdapter(MainActivity.this, configuracion.getAcciones());
124+
lstAcciones.setAdapter(listaAccionesAdapter);
166125

126+
lstAcciones.setOnItemClickListener(new AdapterView.OnItemClickListener() {
127+
@Override
128+
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
167129
// Obtener la lista de acciones de la Accion seleccionada
168-
Acciones accionSeleccionada = configuracion.getAcciones().get(selectedPosition);
130+
Acciones accionSeleccionada = configuracion.getAcciones().get(i);
169131
configuracion.setAccion(accionSeleccionada.getNombre());
170132

171133
// Aplicar los textos segun la Accion selecionada
@@ -178,6 +140,7 @@ public void onClick(View v) {
178140
dialogAccions.dismiss();
179141
}
180142
});
143+
181144
dialogAccions.show();
182145
}
183146
});
@@ -193,8 +156,6 @@ public void onClick(View v) {}
193156
// Agregar los botones al LinearLayout dentro del HorizontalScrollView
194157
menuLayout.addView(btnConfiguracion);
195158
menuLayout.addView(btnAcciones);
196-
menuLayout.addView(btnConectar);
197-
menuLayout.addView(btnRenderizar);
198159
menuLayout.addView(btnHate);
199160

200161
// Agregar el LinearLayout al HorizontalScrollView
@@ -272,11 +233,9 @@ public void onClick(View v) {
272233

273234
void conectarServidor() {
274235
try {
275-
if (socket != null && !socket.isClosed()) {
276-
sendMessage("!D");
277-
socket.close();
236+
if (socket == null || socket.isClosed()) {
237+
new ConnectTask().execute();
278238
}
279-
new ConnectTask().execute();
280239
} catch (Exception e) {
281240
e.printStackTrace();
282241
}
@@ -302,26 +261,31 @@ private void procesarConfiguracion(String jsonResponse) {
302261
}
303262
}
304263
private void aplicarTextoAcciones(Acciones acciones) {
305-
// Asignar el texto de los botones segun la posicion de cada item en el array
306-
for (int i = 0; i < acciones.getTextos_acciones().size(); i++) {
307-
if (i < botonesAccion.size()) {
308-
String texto = acciones.getTextos_acciones().get(i);
309-
if (texto.isEmpty()) { // si no hay nada. deshabilitamos
310-
botonesAccion.get(i).setEnabled(false); botonesAccion.get(i).setVisibility(INVISIBLE);
311-
continue;
264+
runOnUiThread(new Runnable() {
265+
@Override
266+
public void run() {
267+
// Asignar el texto de los botones segun la posicion de cada item en el array
268+
for (int i = 0; i < acciones.getTextos_acciones().size(); i++) {
269+
if (i < botonesAccion.size()) {
270+
String texto = acciones.getTextos_acciones().get(i);
271+
if (texto.isEmpty()) { // si no hay nada. deshabilitamos
272+
botonesAccion.get(i).setEnabled(false); botonesAccion.get(i).setVisibility(INVISIBLE);
273+
continue;
274+
}
275+
// Actualizar el texto de los botones
276+
System.out.println("btn" + i + ": " + texto);
277+
botonesAccion.get(i).setText(texto);
278+
botonesAccion.get(i).setEnabled(true); botonesAccion.get(i).setVisibility(VISIBLE);
279+
botonesAccion.get(i).setAllCaps(false); botonesAccion.get(i).setTransformationMethod(null);
280+
}
281+
}
282+
// Ocultar los botones restantes
283+
for (int i = acciones.getTextos_acciones().size(); i < botonesAccion.size(); i++) {
284+
botonesAccion.get(i).setVisibility(INVISIBLE);
285+
botonesAccion.get(i).setEnabled(false);
312286
}
313-
// Actualizar el texto de los botones
314-
System.out.println("btn" + i + ": " + texto);
315-
botonesAccion.get(i).setText(texto);
316-
botonesAccion.get(i).setEnabled(true); botonesAccion.get(i).setVisibility(VISIBLE);
317-
botonesAccion.get(i).setAllCaps(false); botonesAccion.get(i).setTransformationMethod(null);
318287
}
319-
}
320-
// Ocultar los botones restantes
321-
for (int i = acciones.getTextos_acciones().size(); i < botonesAccion.size(); i++) {
322-
botonesAccion.get(i).setVisibility(View.INVISIBLE);
323-
botonesAccion.get(i).setEnabled(false);
324-
}
288+
});
325289
}
326290

327291

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
android:layout_width="match_parent"
4-
android:layout_height="match_parent"
4+
android:layout_height="wrap_content"
55
android:orientation="vertical"
6-
android:layout_margin="30dp" >
6+
android:layout_margin="10dp" >
77

88
<TextView
9-
android:text="Seleccion de acciones"
9+
android:text="Selección de acciones"
1010
android:textSize="30dp"
1111
android:layout_width="match_parent"
1212
android:layout_height="wrap_content"
1313
android:layout_marginBottom="20dp" />
1414

15-
<Spinner
16-
android:id="@+id/spnAcciones"
17-
android:layout_marginBottom="20dp"
15+
<ListView
16+
android:id="@+id/lstAcciones"
1817
android:layout_width="match_parent"
19-
android:layout_height="wrap_content" />
20-
21-
<Button
22-
android:id="@+id/btnAplicar"
23-
android:text="Aplicar"
24-
android:layout_width="match_parent"
25-
android:layout_height="wrap_content" />
26-
18+
android:layout_height="wrap_content"
19+
android:divider="@android:color/transparent"
20+
android:dividerHeight="15dp" />
2721
</LinearLayout>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
android:paddingVertical="10dp">
6+
7+
<LinearLayout
8+
android:id="@+id/leftContainer"
9+
android:orientation="vertical"
10+
android:layout_width="wrap_content"
11+
android:layout_height="wrap_content"
12+
android:layout_alignParentStart="true">
13+
14+
<TextView
15+
android:id="@+id/txtTitulo"
16+
android:layout_width="wrap_content"
17+
android:layout_height="wrap_content"
18+
android:text="Título"
19+
android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />
20+
<TextView
21+
android:id="@+id/txtSubtitulo"
22+
android:layout_width="wrap_content"
23+
android:layout_height="wrap_content"
24+
android:text="Descripción"
25+
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />
26+
</LinearLayout>
27+
28+
<TextView
29+
android:id="@+id/txtAutor"
30+
android:layout_width="wrap_content"
31+
android:layout_height="wrap_content"
32+
android:text="Autor"
33+
android:textAlignment="viewEnd"
34+
android:layout_alignParentTop="true"
35+
android:layout_alignParentEnd="true"
36+
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small" />
37+
<TextView
38+
android:id="@+id/txtVersion"
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content"
41+
android:text="Versión"
42+
android:textAlignment="viewEnd"
43+
android:layout_below="@id/txtAutor"
44+
android:layout_alignEnd="@id/txtAutor"
45+
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small" />
46+
47+
</RelativeLayout>

SocketeDeck.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
PORT = 16100
88
ADDR = (SERVER, PORT)
99

10+
clientes_config = {}
11+
1012
class Cliente:
1113
HEADER = 1024
1214
FORMAT = "utf-8"
@@ -18,16 +20,26 @@ def __init__(self, conn: socket.socket, addr):
1820
self.config = None
1921
self.connected = True
2022

21-
# Cargar configuracion inicial
2223
self.cargar_configuracion()
2324

2425
def cargar_configuracion(self):
26+
global clientes_config
27+
if self.addr[0] in clientes_config:
28+
self.config, self.accion = clientes_config[self.addr[0]]
29+
else:
30+
self.cargar_configuracion_inicial()
31+
32+
def cargar_configuracion_inicial(self):
2533
contenido = {}
2634
with open('config.json') as f:
2735
contenido = json.load(f)
2836
self.accion = configuracion.obtener_modulo(contenido["configuracion"]["acciones"])
2937
self.config = configuracion.obtener_configuracion(contenido["configuracion"]["acciones"])
3038

39+
def guardar_configuracion(self):
40+
global clientes_config
41+
clientes_config[self.addr[0]] = (self.config, self.accion)
42+
3143
def atender_cliente(self):
3244
print(f"[{self.addr}] conectado!")
3345
try:
@@ -53,6 +65,7 @@ def atender_cliente(self):
5365
except Exception as ex:
5466
print(f"[ERROR] {self.addr} {ex}")
5567
finally:
68+
self.guardar_configuracion()
5669
print(f"[{self.addr}] desconectado!")
5770
self.conn.close()
5871

acciones/obs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def accion(id: int)-> str:
4141

4242
about = {
4343
"nombre": "OBS Studio Controller",
44-
"descripcion": "",
44+
"descripcion": "Basic OBS Studio controller though sockets",
4545
"autor": "Urfenox",
4646
"version": "2.0"
4747
}

0 commit comments

Comments
 (0)