diff --git a/CHANGELOG-v10.1.4.md b/CHANGELOG-v10.1.4.md new file mode 100644 index 0000000..27baa3c --- /dev/null +++ b/CHANGELOG-v10.1.4.md @@ -0,0 +1,60 @@ +# StreamPlayer v10.1.4 - Mejoras de Interfaz + +## Correcciones Implementadas + +### 1. Botón de Actualización Más Visible +- **Archivo**: `app/src/main/res/drawable/btn_refresh_selector.xml` (nuevo) +- **Descripción**: El botón de actualizar eventos ahora cambia a un color ámbar brillante (#FFC107) con borde grueso cuando está enfocado, mejorando significativamente la visibilidad para control remoto. + +### 2. Prevención de Navegación Entre Secciones +- **Archivo**: `app/src/main/java/com/streamplayer/MainActivity.java` +- **Descripción**: Al hacer scroll después del último evento, la aplicación se detiene en lugar de pasar a la sección de canales, mejorando la experiencia de usuario. + +### 3. Barra de Indicador de Scroll +- **Archivos**: `app/src/main/res/layout/activity_main.xml`, `app/src/main/res/drawable/scrollbar_vertical.xml` (nuevo) +- **Descripción**: Agregada barra de scroll visual a la derecha de la lista de contenido como indicador de posición (no navegable). + +## Cambios Técnicos + +### Nuevo Archivo: btn_refresh_selector.xml +```xml + + + + + + + + + + +``` + +### Modificación: MainActivity.java +- Agregado `RecyclerView.OnScrollListener` en `showEvents()` para prevenir scroll más allá del último evento + +### Modificación: activity_main.xml +- Botón refresh usa `@drawable/btn_refresh_selector` +- RecyclerView ahora tiene `android:scrollbars="vertical"` y `scrollbarThumbVertical` + +### Nuevos Colores: colors.xml +- `refresh_button_default`: #2A2A2A +- `refresh_button_focused`: #FFC107 +- `refresh_button_focused_border`: #FFD54F +- `refresh_button_pressed`: #FF9800 + +## Compatibilidad +- Versión mínima de Android: API 21+ +- Compilado con SDK 34 +- Probado en Android TV con control remoto + +## Instalación +1. Descargar `StreamPlayer-10.1.4-debug.apk` +2. Habilitar "Fuentes desconocidas" en configuraciones de seguridad +3. Instalar el APK +4. Disfrutar las mejoras de interfaz + +## Notas de Desarrollo +- La barra de scroll es puramente visual (indicador) +- El foco del botón refresh ahora usa color ámbar de alto contraste +- El scroll se detiene correctamente al final de la lista de eventos diff --git a/app/src/main/java/com/streamplayer/MainActivity.java b/app/src/main/java/com/streamplayer/MainActivity.java index 9ebb02a..be64d11 100644 --- a/app/src/main/java/com/streamplayer/MainActivity.java +++ b/app/src/main/java/com/streamplayer/MainActivity.java @@ -14,6 +14,7 @@ import android.widget.TextView; import android.widget.Toast; import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; @@ -169,6 +170,8 @@ public class MainActivity extends AppCompatActivity { refreshButton.setVisibility(View.GONE); contentList.setLayoutManager(channelLayoutManager); contentList.setAdapter(channelAdapter); + // Clear any scroll listeners from Events section + contentList.clearOnScrollListeners(); loadingIndicator.setVisibility(View.GONE); channelAdapter.submitList(section.channels); if (section.channels.isEmpty()) { @@ -185,6 +188,26 @@ public class MainActivity extends AppCompatActivity { refreshButton.setVisibility(View.VISIBLE); contentList.setLayoutManager(eventLayoutManager); contentList.setAdapter(eventAdapter); + // Add scroll listener to prevent scrolling from Events to Channels section + contentList.clearOnScrollListeners(); + contentList.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + // Only prevent downward scroll when at the last item + if (dy > 0) { // Scrolling down + int visibleItemCount = eventLayoutManager.getChildCount(); + int totalItemCount = eventLayoutManager.getItemCount(); + int firstVisibleItemPosition = eventLayoutManager.findFirstVisibleItemPosition(); + + // Check if we're at the last item + if (firstVisibleItemPosition + visibleItemCount >= totalItemCount) { + // Prevent further scrolling by stopping the scroll + recyclerView.stopScroll(); + } + } + } + }); if (cachedEvents.isEmpty()) { loadEvents(false); } else { diff --git a/app/src/main/res/drawable/btn_refresh_selector.xml b/app/src/main/res/drawable/btn_refresh_selector.xml new file mode 100644 index 0000000..0a0ab15 --- /dev/null +++ b/app/src/main/res/drawable/btn_refresh_selector.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/scrollbar_vertical.xml b/app/src/main/res/drawable/scrollbar_vertical.xml new file mode 100644 index 0000000..2fd297c --- /dev/null +++ b/app/src/main/res/drawable/scrollbar_vertical.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a0de21d..36fbb13 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -97,7 +97,10 @@ android:textSize="12sp" android:visibility="gone" android:focusable="true" - android:focusableInTouchMode="true" /> + android:focusableInTouchMode="true" + android:background="@drawable/btn_refresh_selector" + android:textColor="@color/white" + android:elevation="2dp" /> @@ -125,6 +128,9 @@ android:layout_marginTop="16dp" android:layout_weight="1" android:overScrollMode="never" + android:scrollbars="vertical" + android:scrollbarStyle="outsideOverlay" + android:scrollbarThumbVertical="@drawable/scrollbar_vertical" android:nextFocusLeft="@id/section_list" tools:listitem="@layout/item_channel" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b281c05..9231426 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,11 @@ #FF000000 #FFFFFFFF #B3FFFFFF + + + #2A2A2A + #4A4A4A + #FFC107 + #FFD54F + #FF9800