2 Commits

Author SHA1 Message Date
renato97
2c65578bdd Update v9.4.2: Enhanced UI Theme & Visual Consistency
- Incremented version to 9.4.2 (versionCode: 94200)
- Added custom AlertDialog theme with white text styling
- Enhanced visual consistency for all dialog components
- Improved theme overlay for better readability
- Applied custom styling to update and blocked dialogs
- Better contrast and visual hierarchy in dialogs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 00:13:29 +01:00
renato97
6aef195f30 Update v9.4.1: Enhanced Playback & Device Management
- Incremented version to 9.4.1 (versionCode: 94100)
- Added keep screen on functionality during video playback
- Implemented device deletion in dashboard with confirmation
- Enhanced device management with delete capability
- Improved user experience during media playback
- Better device lifecycle management in dashboard
- Added confirmation dialog for device deletion

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 00:07:04 +01:00
7 changed files with 46 additions and 22 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId "com.streamplayer" applicationId "com.streamplayer"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 94000 versionCode 94200
versionName "9.4.0" versionName "9.4.2"
buildConfigField "String", "DEVICE_REGISTRY_URL", '"http://194.163.191.200:4000"' buildConfigField "String", "DEVICE_REGISTRY_URL", '"http://194.163.191.200:4000"'
} }

View File

@@ -244,7 +244,7 @@ public class MainActivity extends AppCompatActivity {
if (updateDialog != null && updateDialog.isShowing()) { if (updateDialog != null && updateDialog.isShowing()) {
updateDialog.dismiss(); updateDialog.dismiss();
} }
AlertDialog.Builder builder = new AlertDialog.Builder(this) AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.ThemeOverlay_StreamPlayer_AlertDialog)
.setTitle(mandatory ? R.string.update_required_title : R.string.update_available_title) .setTitle(mandatory ? R.string.update_required_title : R.string.update_available_title)
.setMessage(buildUpdateMessage(info)) .setMessage(buildUpdateMessage(info))
.setPositiveButton(R.string.update_action_download, .setPositiveButton(R.string.update_action_download,
@@ -333,7 +333,7 @@ public class MainActivity extends AppCompatActivity {
} else { } else {
tokenContainer.setVisibility(View.GONE); tokenContainer.setVisibility(View.GONE);
} }
AlertDialog.Builder builder = new AlertDialog.Builder(this) AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.ThemeOverlay_StreamPlayer_AlertDialog)
.setTitle(R.string.device_blocked_title) .setTitle(R.string.device_blocked_title)
.setView(dialogView) .setView(dialogView)
.setCancelable(false) .setCancelable(false)

View File

@@ -4,6 +4,7 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.StrictMode; import android.os.StrictMode;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
@@ -58,6 +59,7 @@ public class PlayerActivity extends AppCompatActivity {
); );
setContentView(R.layout.activity_player); setContentView(R.layout.activity_player);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Intent intent = getIntent(); Intent intent = getIntent();
if (intent == null) { if (intent == null) {
@@ -254,6 +256,7 @@ public class PlayerActivity extends AppCompatActivity {
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
releasePlayer(); releasePlayer();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} }
private void toggleOverlay() { private void toggleOverlay() {

View File

@@ -6,4 +6,10 @@
<item name="android:statusBarColor">@color/black</item> <item name="android:statusBarColor">@color/black</item>
<item name="android:navigationBarColor">@color/black</item> <item name="android:navigationBarColor">@color/black</item>
</style> </style>
</resources>
<style name="ThemeOverlay.StreamPlayer.AlertDialog" parent="ThemeOverlay.AppCompat.Dialog.Alert">
<item name="android:textColorPrimary">@color/white</item>
<item name="android:textColorSecondary">@color/white</item>
<item name="colorAccent">@color/white</item>
</style>
</resources>

View File

@@ -6,22 +6,21 @@
"model": "SM-S928B", "model": "SM-S928B",
"manufacturer": "Samsung", "manufacturer": "Samsung",
"osVersion": "16 (API 36)", "osVersion": "16 (API 36)",
"appVersionName": "9.3.1", "appVersionName": "9.4.1",
"appVersionCode": 93100, "appVersionCode": 94100,
"firstSeen": "2025-11-23T20:53:43.615Z", "firstSeen": "2025-11-23T22:31:13.359Z",
"lastSeen": "2025-11-23T21:57:09.997Z", "lastSeen": "2025-11-23T23:11:07.215Z",
"blocked": false, "blocked": false,
"notes": "no pagó", "notes": "",
"installs": 14, "installs": 7,
"blockedAt": "2025-11-23T20:54:05.413Z",
"ip": "181.23.253.20", "ip": "181.23.253.20",
"country": "AR", "country": "AR",
"verification": { "verification": {
"clientPart": "6e05a220abe0ed05", "clientPart": "1714c2bb93670c3f",
"adminPart": "19d6ee4c992ee1a0", "adminPart": "9924c7049211c58c",
"status": "verified", "status": "verified",
"createdAt": "2025-11-23T21:09:04.607Z", "createdAt": "2025-11-23T22:31:13.359Z",
"verifiedAt": "2025-11-23T21:57:05.081Z" "verifiedAt": "2025-11-23T22:33:11.942Z"
} }
} }
] ]

View File

@@ -45,6 +45,7 @@ function renderTable(devices) {
actions.push('<button data-action="verify" class="primary">Verificar token</button>'); actions.push('<button data-action="verify" class="primary">Verificar token</button>');
} }
actions.push(device.blocked ? '<button data-action="unblock" class="primary">Desbloquear</button>' : '<button data-action="block" class="danger">Bloquear</button>'); actions.push(device.blocked ? '<button data-action="unblock" class="primary">Desbloquear</button>' : '<button data-action="block" class="danger">Bloquear</button>');
actions.push('<button data-action="delete" class="danger ghost">Borrar</button>');
tr.innerHTML = ` tr.innerHTML = `
<td> <td>
@@ -97,6 +98,19 @@ async function unblockDevice(deviceId) {
await fetchDevices(); await fetchDevices();
} }
async function deleteDevice(deviceId) {
const confirmation = confirm('¿Seguro que quieres borrar este dispositivo? Generará un nuevo token cuando se registre de nuevo.');
if (!confirmation) {
return;
}
const response = await fetch(`/api/devices/${encodeURIComponent(deviceId)}`, { method: 'DELETE' });
if (!response.ok) {
alert('No se pudo borrar el dispositivo');
return;
}
await fetchDevices();
}
async function verifyDevice(deviceId) { async function verifyDevice(deviceId) {
const clientTokenPart = prompt('Introduce el token que aparece en el dispositivo:'); const clientTokenPart = prompt('Introduce el token que aparece en el dispositivo:');
if (clientTokenPart === null) { if (clientTokenPart === null) {
@@ -154,6 +168,8 @@ tableBody.addEventListener('click', async (event) => {
await updateAlias(deviceId); await updateAlias(deviceId);
} else if (action === 'verify') { } else if (action === 'verify') {
await verifyDevice(deviceId); await verifyDevice(deviceId);
} else if (action === 'delete') {
await deleteDevice(deviceId);
} }
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@@ -1,10 +1,10 @@
{ {
"versionCode": 93100, "versionCode": 94100,
"versionName": "9.3.1", "versionName": "9.4.1",
"minSupportedVersionCode": 91000, "minSupportedVersionCode": 91000,
"forceUpdate": false, "forceUpdate": false,
"downloadUrl": "https://gitea.cbcren.online/renato97/app/releases/download/v9.3.1/StreamPlayer-v9.3.1.apk", "downloadUrl": "https://gitea.cbcren.online/renato97/app/releases/download/v9.4.1/StreamPlayer-v9.4.1.apk",
"fileName": "StreamPlayer-v9.3.1.apk", "fileName": "StreamPlayer-v9.4.1.apk",
"sizeBytes": 5943075, "sizeBytes": 5944680,
"notes": "StreamPlayer v9.3.1\n\nMejoras en esta versión:\n\n- Interfaz de usuario mejorada con nuevos controles\n- Funcionalidad de copiado mejorada\n- Diálogos más intuitivos y fáciles de usar\n- Mejor retroalimentación para el usuario\n- Configuración optimizada para mejor funcionamiento\n- Mayor estabilidad general de la aplicación\n- Correcciones menores de usabilidad\n\nEsta actualización mejora la experiencia de uso y facilita la interacción con las funcionalidades de verificación y seguridad." "notes": "StreamPlayer v9.4.1\n\nMejoras en esta versión:\n\n- Experiencia de reproducción optimizada e ininterrumpida\n- Mejores controles de administración y gestión de dispositivos\n- Funcionalidad de eliminación de registros con confirmación segura\n- Optimización de energía durante el uso de la aplicación\n- Interfaz administrativa mejorada con más opciones\n- Flujo de trabajo más eficiente para la gestión\n- Mejor respuesta y estabilidad general\n- Correcciones de usabilidad menores\n\nEsta actualización mejora tanto la experiencia de visualización como las herramientas de administración para un mejor control y uso de la aplicación."
} }