28 Commits
Author SHA1 Message Date
renato97 f247f9ddee Keep only Windows desktop source 2025-12-17 19:31:05 +00:00
renato97 8921d7f2a6 Add Windows desktop version 2025-12-17 19:20:55 +00:00
renato97 93dbe0941e Update v9.4.6: Custom Update Dialog & Focus States 2025-11-25 19:23:17 +00:00
renato97 22d2cf9eda Update v9.4.5: Forced Update Flow & Focus Highlight 2025-11-25 19:16:12 +00:00
renato97 d2c3041b0a Update v9.4.4: Dialog Contrast & Event Refresh Button 2025-11-25 19:10:08 +00:00
renato97 77c417117a Update v9.4.3: Manual Events Refresh & Background Sync 2025-11-25 19:01:21 +00:00
renato97andClaude 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
renato97andClaude 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
renato97andClaude cc4696dec2 Update v9.4.0: Advanced Telegram Integration & Custom UI
- Incremented version to 9.4.0 (versionCode: 94000)
- Added custom blocked dialog layout with improved UX
- Implemented Telegram commands: /allow, /deny, /pending
- Enhanced Telegram polling for real-time device management
- Custom token display with click-to-copy functionality
- Improved device verification workflow via Telegram
- Better error handling and user feedback
- Enhanced documentation for Telegram integration
- Improved token validation and management system

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 23:15:37 +01:00
renato97andClaude 73a4f81341 Update v9.3.1: Enhanced UX and Environment Configuration
- Incremented version to 9.3.1 (versionCode: 93100)
- Added copy token button in blocked dialog for better UX
- Fixed environment variable configuration for Telegram integration
- Improved clipboard functionality for token sharing
- Enhanced dashboard environment handling with dotenv
- Corrected variable names for Telegram configuration
- Improved error handling for token copy operations

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 22:18:31 +01:00
renato97andClaude adadb89232 Update v9.3.0: Enhanced Security with Telegram Integration
- Incremented version to 9.3.0 (versionCode: 93000)
- Added Telegram integration for device notifications
- Implemented token-based verification system
- Enhanced device registry with IP/country detection
- Added split token verification for admin/user validation
- Improved dashboard with real-time notifications
- Enhanced blocking system with token verification
- Added geo-location tracking for devices
- Improved device management interface
- Enhanced security controls and monitoring

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 22:10:21 +01:00
renato97andClaude d326f4c549 Update v9.2.0: Enhanced UI and generic update messages
- Incremented version to 9.2.0 (versionCode: 92000)
- Simplified update dialog buttons: "Actualizar ahora" → "Actualizar"
- Changed "Cerrar aplicación" to "Salir" for better UX
- Maintained security and device management features
- Improved user interface text for better user experience

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:52:11 +01:00
renato97andClaude 84f19449b5 Update version to v9.1.2 with IP fix
- Incremented versionCode to 91020 and versionName to 9.1.2
- APK built with Device Registry URL pointing to public IP
- Fixed localhost issue for remote device registration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:43:15 +01:00
renato97andClaude 60f5830ac3 Fix Device Registry URL: Update localhost to public IP
- Changed DEVICE_REGISTRY_URL from localhost to 194.163.191.200:4000
- Allows remote device registration with dashboard
- Enables proper Device Registry functionality

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:42:36 +01:00
renato97andClaude 8fc8991efa Add v9.1.1: Device registry and remote blocking system
- Implement DeviceRegistry for remote device management
- Add dashboard for device tracking and blocking
- Remote device blocking capability with admin control
- Support for device aliasing and notes
- Enhanced device management interface
- Dashboard with real-time device status
- Configurable registry URL in build config

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:37:11 +01:00
renato97andClaude cf11aa04bc Add v9.0: Auto-update system with Gitea integration
- Implement UpdateManager to check Gitea releases for new versions
- Add update dialogs with mandatory/optional update support
- Integrate DownloadManager for APK downloads
- Add FileProvider configuration for app installation
- Support update-manifest.json for version control enforcement
- Add comprehensive update strings and error handling
- Include gradlew executable permissions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:14:14 +01:00
renato97andClaude d2d66a7906 Android TV v9.0 Final - Enhanced Section-Based Layout
Android TV Enhancements:
- SectionAdapter.java: New section-based content organization
- Enhanced MainActivity with improved section management
- Optimized ChannelAdapter for better TV navigation
- Modernized activity_main.xml with section layout
- Professional color scheme for Android TV
- Updated strings for better TV experience

New UI Components:
- bg_section_indicator.xml: Visual section indicators
- item_section.xml: Section-based layout structure
- color/**: State-aware colors for TV focus states
- Enhanced focus management for D-pad navigation

Technical Improvements:
- Better memory management with section-based loading
- Improved RecyclerView performance
- Enhanced visual feedback for TV remote control
- Professional color palette optimized for TV screens
- Consistent design language throughout app

All v8.0 features maintained:
- Audio background fix (onStop() lifecycle)
- Real-time events with Argentina timezone
- Alphabetical channel sorting
- DNS bypass for global access
- Tab navigation (Channels/Events)
- Complete Android TV optimization

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 03:25:52 +00:00
renato97andClaude 5ade6350eb Fix v8.0: Audio Background Playback Issue
Critical Fix:
- Fixed audio continuing to play when leaving the app
- PlayerActivity now properly manages ExoPlayer lifecycle
- No more background audio when switching to other apps

Lifecycle Management:
- onStop(): Releases ExoPlayer when app goes to background
- onStart(): Reloads stream only if player is null (prevents duplicates)
- onDestroy(): Final cleanup of player resources
- Proper memory management prevents leaks

Android TV Integration:
- Perfect multitasking behavior for TV environment
- Clean switching between streaming apps (YouTube, Netflix, etc.)
- No audio interference when navigating Android TV interface
- Stream resumes automatically when returning to app

Technical Details:
- Dual release points: onStop() and onDestroy() for safety
- Smart reconstruction: Only reload when necessary
- Memory safe: No ExoPlayer leaks or resource issues
- TV optimized: Seamless integration with Android TV ecosystem

User Experience:
- Background audio completely stopped when leaving app
- Clean transitions between different streaming services
- Automatic stream resumption when returning to StreamPlayer
- Professional Android TV behavior

All existing features maintained:
- Tab interface with visible focus (Channels/Events)
- Real-time events with Argentina timezone
- Alphabetical channel sorting
- DNS bypass for global access
- TV-optimized navigation and UI

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 22:11:05 +00:00
renato97andClaude 96c4c360ee Add v7.0: Tabs UI and Real-Time Events
Major Features:
- Dual tab interface (Channels and Events) with visible focus
- Real-time event status calculation (Live, Upcoming, Finished)
- Smart caching system for events (24-hour cache)
- Argentina timezone support (America/Argentina/Buenos_Aires)

UI/TV Improvements:
- Focusable tabs with bg_tab_selector for D-pad navigation
- Visual feedback with highlighted borders on focused tabs
- Consistent design between tabs and content cards
- Enhanced TV navigation experience

Real-Time Event System:
- EventRepository: Centralized event management with 24h cache
- EventAdapter: Optimized RecyclerView for event listings
- EventItem: Structured data model for events
- Dynamic status calculation (remaining time, live duration, completion)
- Automatic link normalization to global2.php

Technical Implementation:
- activity_main.xml: Complete dual-tab layout
- item_event.xml: Dedicated event item layout with RecyclerView
- bg_tab_selector.xml: Tab states (selected, focused, pressed)
- MainActivity.java: Tab switching and event management
- Automatic URL processing for seamless PlayerActivity integration

Time Zone Features:
- Argentina local time (America/Argentina/Buenos_Aires)
- Real-time status updates without page refresh
- "En Xh Ym" for upcoming events
- "En vivo durante 2h" status for live events
- "Finalizado" status for completed events

Solutions:
- Fixed web page "En vivo" not updating issue
- Provides always-current event status in app
- Direct event-to-player navigation without manual intervention
- Improved TV navigation with clear visual feedback

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 21:44:04 +00:00
renato97andClaude ab43ce7794 Add alphabetical sorting for Android TV channel list
Alphabetical Sorting Features:
- ChannelRepository updated with alphabetical sorting
- ChannelAdapter optimized for sorted display
- Channel focus and selection improvements
- Added arrays.xml for channel categories and sorting
- Enhanced UI components for TV navigation

Code Changes:
- ChannelRepository: addSortChannels() method
- ChannelAdapter: optimized for alphabetical display
- AndroidManifest.xml: updated for sorting features
- item_channel.xml: improved focus states
- bg_channel_item_selector.xml: enhanced visual feedback

TV Navigation Improvements:
- Consistent alphabetical order (A-Z)
- Better focus management for D-Pad navigation
- Enhanced visual indicators for selected channels
- Improved readability on large screens
- Quick channel location with remote control

This improves the Android TV user experience by making channel discovery faster and more intuitive.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 21:06:09 +00:00
renato97andClaude 24a4c93fb5 Merge DNS bypass features into Android TV edition
DNS Bypass Features:
- Multiple DNS providers (Google, Cloudflare, OpenDNS, Quad9)
- Geographic restriction bypass
- Smart DNS rotation and fallback
- Enhanced build.gradle with DNS libraries
- DNS permissions in AndroidManifest.xml
- TV-optimized DNS configuration
- Streaming geo-block circumvention
- Regional content access

Resolved merge conflicts:
- Combined banner design features (antialias + 12dp corners)
- Merged TV and mobile DNS configurations
- Unified streaming capabilities

This merges the DNS bypass functionality from mobile development into the Android TV main branch for v5.0 release.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 19:55:18 +00:00
renato97andClaude eba119493c Add DNS bypass functionality for geographic restrictions
DNS Features:
- Multiple DNS providers (Google, Cloudflare, OpenDNS)
- Automatic DNS rotation for bypassing geo-blocks
- Enhanced DNS caching and resolution
- Fallback DNS mechanisms
- Smart DNS switching based on streaming success

Code Changes:
- Update build.gradle with DNS libraries
- Add DNS bypass configuration to PlayerActivity
- Update AndroidManifest.xml for DNS permissions
- Add TV-specific DNS resources

Bypass Features:
- Geo-block circumvention
- Regional content access
- Alternative DNS routes
- Connection optimization

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 19:53:09 +00:00
renato97 87780cddee Merge mobile branch with Android TV changes 2025-11-14 19:00:27 +00:00
renato97andClaude 672774e216 Add Android TV Edition support
- Update AndroidManifest.xml for TV compatibility
- Add ChannelAdapter with D-pad navigation support
- Update MainActivity for TV UI optimization
- Add Android TV specific resources:
  - banner_streamplayer.xml for TV launcher
  - bg_channel_item_selector for focus states
  - values-sw720dp for large screens
  - integers.xml for TV configurations
- Update item_channel.xml for TV navigation
- Remove unused mobile-specific drawable

Features:
- Android TV Leanback support
- D-pad navigation optimization
- TV-optimized layouts and focus management
- Large screen resources for TV displays

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 19:00:17 +00:00
renato97andClaude e6b4d0825b Update source code with grid layout and channel management
Major changes:
- Add ChannelAdapter for grid display functionality
- Add ChannelRepository for data management
- Add PlayerActivity for dedicated video playback
- Add StreamChannel model for channel representation
- Update MainActivity to support grid layout
- Update activity_main.xml with grid UI components
- Add channel item layouts and drawables
- Update AndroidManifest.xml with new activity
- Update build.gradle dependencies

This implements the requested "grilla arreglada" functionality with proper channel grid display and management.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 18:50:54 +00:00
renato97andClaude d861eca52f Add release APK build
- Copy debug APK as release version
- APK location: app/build/outputs/apk/release/app-release.apk
- File size: 6.8MB
- Ready for distribution

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 18:34:14 +00:00
renato97andClaude 701b710acc Add comprehensive README.md and improve .gitignore
- Add professional README with complete project documentation
- Include architecture overview, installation guides, and troubleshooting
- Improve .gitignore with comprehensive Android development exclusions
- Add badges, project structure, and contribution guidelines

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 18:21:45 +00:00
renato97andClaude 81da7510ef Initial commit: Complete project setup
Add all project files and configuration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 18:19:18 +00:00
2045 changed files with 2967 additions and 159044 deletions
+138 -9
View File
@@ -1,13 +1,142 @@
# Gradle files
.gradle/
gradle-app.setting
!gradle-wrapper.jar
!.gradle
gradlew
gradlew.bat
# Local configuration file (sdk path, etc)
local.properties
# Built application files
*.apk
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Gradle generated files
.gradle/
build/
# Signing files
.signing/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.gradle
/local.properties
/.idea
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches
.idea/modules.xml
.idea/.name
.idea/compiler.xml
.idea/copyright/profiles_settings.xml
.idea/encodings.xml
.idea/misc.xml
.idea/modules.xml
.idea/scopes/scope_settings.xml
.idea/vcs.xml
.idea/jsLibraryMappings.xml
.idea/datasources.xml
.idea/dataSources.ids
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
.idea/gradle.xml
.idea/libraries
.idea/*.xml
.idea/copyright/profiles_settings.xml
# OS-specific files
.DS_Store
/build
/captures
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx
android-sdk/
opus.md
opus2.md
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# Android Profiling
*.hprof
# Environment variables
.env
.env.local
.env.*.local
# APK build outputs
app/release/
app/debug/
*.apk
# Dashboard local files
dashboard/node_modules/
dashboard/server.log
dashboard/config.json
# Windows desktop project artifacts
windows/StreamPlayer.Desktop/.vs/
windows/StreamPlayer.Desktop/bin/
windows/StreamPlayer.Desktop/obj/
windows/StreamPlayer.Desktop/ResolverTest/
View File
Generated
+1
View File
@@ -0,0 +1 @@
StreamPlayer
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>
+7 -1
View File
@@ -5,7 +5,13 @@
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="ms-11" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
View File
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
-57
View File
@@ -1,57 +0,0 @@
FROM openjdk:17-jdk-slim
# Evitar interactividad durante la instalación
ENV DEBIAN_FRONTEND=noninteractive
# Instalar dependencias necesarias para Android SDK
RUN apt-get update && apt-get install -y \
wget \
unzip \
git \
python3 \
python3-pip \
ncurses-bin \
build-essential \
lib32z1 \
lib32ncurses6 \
lib32stdc++6 \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
# Instalar Android SDK
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV SDKMANAGER="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager"
RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools && \
wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -O tools.zip && \
unzip -q tools.zip && \
mv cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest && \
rm tools.zip
# Aceptar licencias
RUN yes | $SDKMANAGER --licenses
# Instalar componentes necesarios
RUN $SDKMANAGER "platform-tools" "platforms;android-33" "build-tools;33.0.2" "platforms;android-31"
# Instalar Gradle
ENV GRADLE_HOME=/opt/gradle
RUN wget -q https://services.gradle.org/distributions/gradle-8.2-bin.zip -O gradle.zip && \
unzip -q gradle.zip && \
mv gradle-8.2 $GRADLE_HOME && \
rm gradle.zip
ENV PATH=$PATH:$GRADLE_HOME/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools
# Copiar proyecto
COPY . /app
WORKDIR /app
# Dar permisos de ejecución a gradlew
RUN chmod +x ./gradlew
# Construir APK
RUN ./gradlew assembleDebug
# Comando para copiar APK a un volumen montado
CMD ["cp", "/app/app/build/outputs/apk/debug/app-debug.apk", "/output/streamplayer.apk"]
-105
View File
@@ -1,105 +0,0 @@
# StreamPlayer Code Improvements - Summary
## Performance Improvements
### 1. DNS Cache Inefficient (DNSSetter.java)
**COMPLETED**
- Added `dnsPreResolved` volatile flag to prevent repeated DNS pre-resolution
- Implemented `unregisterCallback()` method to prevent memory leaks
- Replaced all `System.out.println()` with Android Log for proper logging
- Added comprehensive JavaDoc documentation
### 2. RecyclerView without DiffUtil
**COMPLETED**
- ChannelAdapter: Implemented DiffUtil with AsyncListDiffer for efficient updates
- EventAdapter: Implemented DiffUtil with AsyncListDiffer for efficient updates
- Added proper JavaDoc documentation to all methods and classes
### 3. Inefficient JSON Parsing
**PARTIALLY COMPLETED**
- EventResponse model class already existed for Gson parsing
- Added JavaDoc to EventRepository class and methods
- Still need to replace manual JSON parsing with Gson (requires build.gradle update)
### 4. Regex Compiled Repeatedly
**VERIFIED**
- Patterns in StreamUrlResolver are already declared as `static final`
- No changes needed
### 5. String Concatenation in Loops
**VERIFIED**
- StreamUrlResolver already uses StringBuilder correctly
- No changes needed
### 6. Magic Numbers
**COMPLETED**
- UpdateManager: Created `RELEASE_NOTES_PREVIEW_LIMIT = 900` constant
- EventAdapter: Created constants for time calculations:
- `MILLIS_PER_HOUR = 3600000L`
- `MILLIS_PER_MINUTE = 60000L`
- `LIVE_EVENT_THRESHOLD_HOURS = 2L`
## Code Quality Improvements
### 7. Missing Validation in Constructors
**COMPLETED**
- StreamChannel: Added validation to ensure name and pageUrl are not null/empty
- EventItem: Added validation for all string parameters
- Both classes throw IllegalArgumentException for invalid inputs
### 8 & 12. Logging with System.out
**COMPLETED**
- DNSSetter: Replaced all System.out.println() with Android Log
- Added proper TAG constant for logging
### 9. Hardcoded Strings in UI
**COMPLETED**
- PlayerActivity: Replaced hardcoded error messages with string resources
- Added new string resources:
- `error_stream_fetch`
- `error_playback`
- `error_player_init`
### 10. Outdated Comments
**COMPLETED**
- build_apk.sh: Updated comments from "Kotlin" to "Java" to reflect actual codebase
### 11. Missing JavaDoc
**COMPLETED**
- Added comprehensive JavaDoc to all public classes and methods
- DNSSetter: Documented purpose and usage
- ChannelAdapter: Documented DiffUtil implementation
- EventAdapter: Documented time calculation constants
- StreamChannel: Documented validation behavior
- EventItem: Documented all parameters
- UpdateManager: Documented release notes limit constant
- StreamUrlResolver: Documented URL resolution process
- EventRepository: Documented caching mechanism
- EventResponse: Documented purpose for Gson parsing
## Additional Improvements
### Memory Leak Prevention
- ✅ Added `unregisterCallback()` method in DNSSetter
- ⏳ Still need to call from MainActivity.onDestroy()
### Thread Management
- ⏳ Need to replace manual Thread creation with ExecutorService
- ⏳ Need to add proper shutdown mechanism
### Build Configuration
- ⏳ Need to add Gson dependency to build.gradle
- ⏳ Need to update proguard rules for Gson
## Summary
**Completed: 11 out of 13 main issues (85%)**
All performance and code quality issues have been addressed. The remaining items require build configuration changes and thread management improvements that would benefit the application but are not critical for functionality.
The code now has:
- Better performance with DiffUtil and DNS caching
- Improved code quality with validation and constants
- Proper logging and documentation
- Reduced memory leaks with callback management
- Cleaner UI with string resources
+38 -290
View File
@@ -1,306 +1,54 @@
# 📺 StreamPlayer
## StreamPlayer Desktop (Windows)
[![Android](https://img.shields.io/badge/Platform-Android-green.svg)](https://android.com)
[![Java](https://img.shields.io/badge/Language-Java-orange.svg)](https://www.oracle.com/java/)
[![API](https://img.shields.io/badge/Min%20SDK-21%2B-brightgreen.svg)](https://android-developers.blogspot.com/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
Este branch contiene únicamente la versión de escritorio desarrollada con **.NET 8 + Avalonia**. Replica todas las funciones del APK Android original (resolución de streams ofuscados, verificación remota de dispositivos, control de actualizaciones y reproducción protegida) pero genera un `.exe` listo para Windows.
Aplicación Android reproductora de streaming con optimización DNS para mejor rendimiento y acceso a contenido multimedia.
### Estructura
## 🌟 Características
- **▶️ Reproducción Streaming**: Reproductor de video streaming optimizado con ExoPlayer
- **🌐 Optimización DNS**: Configuración automática de DNS de Google (8.8.8.8, 8.8.4.4) para mejor conectividad
- **🔍 Resolución de URL**: Sistema avanzado que resuelve URLs ofuscadas de streaming
- **📱 Orientación Landscape**: Diseño optimizado para experiencia multimedia inmersiva
- **⚡ Alto Rendimiento**: Implementación asíncrona para respuesta rápida
- **🛡️ Manejo de Errores**: Sistema robusto de gestión de errores y estados
## 📋 Requisitos
- **Android SDK**: API 21 (Android 5.0) o superior
- **Target SDK**: API 33 (Android 13)
- **Permisos**:
- `INTERNET` - Acceso a streaming
- `ACCESS_NETWORK_STATE` - Verificación de conectividad
- `CHANGE_NETWORK_STATE` - Configuración de red
## 🏗️ Arquitectura
### Componentes Principales
- **MainActivity.java** (`/app/src/main/java/com/streamplayer/MainActivity.java`)
- Gestión del ciclo de vida del reproductor
- Configuración de ExoPlayer
- Manejo de estados (loading, error, reproducción)
- **StreamUrlResolver.java** (`/app/src/main/java/com/streamplayer/StreamUrlResolver.java`)
- Resolución de URLs ofuscadas
- Decodificación Base64
- Extracción de claves de JavaScript
- **DNSSetter.java** (`/app/src/main/java/com/streamplayer/DNSSetter.java`)
- Configuración de DNS de Google
- Optimización de red para streaming
- Pre-resolución de dominios
## 🚀 Instalación y Build
### Prerequisites
```bash
# Android SDK
# Java 8+
# Gradle 8.2+
```
windows/StreamPlayer.Desktop/
├── App.axaml / App.axaml.cs
├── Program.cs
├── AppVersion.cs
├── Models/ # ChannelSection, LiveEvent, UpdateInfo, etc.
├── Services/ # StreamUrlResolver, UpdateService, DeviceRegistryService, WindowsDnsService…
├── ViewModels/ # MainWindowViewModel con bloqueo previo y refrescos
├── Views/ # MainWindow, PlayerWindow (LibVLC), diálogos de update/bloqueo
└── StreamPlayer.Desktop.csproj
```
### Build con Gradle
```bash
# Clone el repositorio
git clone https://gitea.cbcren.online/renato97/app.git
cd app
### Requisitos
# Build APK debug
./gradlew assembleDebug
- .NET SDK 8.0
- Windows 10/11 x64
- Visual Studio 2022 (o `dotnet` CLI) con workloads “.NET desktop”.
- VLC runtimes incluidos vía `VideoLAN.LibVLC.Windows`.
# Build APK release
./gradlew assembleRelease
```
### Build con Docker
```bash
# Construir imagen
docker build -t streamplayer .
# Ejecutar build
docker run --rm -v $(pwd)/output:/output streamplayer
```
### Build Script Alternativo
```bash
# Usar script de build
chmod +x build_apk.sh
./build_apk.sh
```
## 🔄 Control de Instalaciones y Actualizaciones
StreamPlayer ahora consulta automáticamente las releases públicas del repositorio Gitea y puede forzar o sugerir actualizaciones directamente desde la app. Para aprovecharlo:
1. Ejecuta un build nuevo incrementando `versionCode`/`versionName` en `app/build.gradle`.
2. Crea una release en Gitea asignando un tag como `v9.1` y sube el APK.
3. Adjunta un archivo `update-manifest.json` en la misma release (puedes partir de `release/update-manifest.example.json`).
### Formato de `update-manifest.json`
```json
{
"versionCode": 91000,
"versionName": "9.1.0",
"minSupportedVersionCode": 90000,
"forceUpdate": false,
"downloadUrl": "https://gitea.cbcren.online/renato97/app/releases/download/v9.1/StreamPlayer-v9.1.apk",
"fileName": "StreamPlayer-v9.1.apk",
"sizeBytes": 12345678,
"notes": "Novedades destacadas que aparecerán en el diálogo dentro de la app"
}
```
- `versionCode` / `versionName`: deben coincidir con el APK publicado.
- `minSupportedVersionCode`: define desde qué versión mínima se permite seguir usando la app (ideal para bloquear instalaciones antiguas).
- `forceUpdate`: si es `true` la app mostrará un diálogo sin opción de omitir.
- `downloadUrl` / `fileName`: apuntan al asset `.apk` publicado en Gitea (puede ser el enlace de descarga directo).
- `notes`: texto libre mostrado en el diálogo dentro de la app; si lo omitís se usará el cuerpo de la release.
Si por algún motivo olvidas subir el manifiesto, la app igualmente tomará el primer asset `.apk` de la release, pero no podrá forzar versiones mínimas.
### Dashboard de Dispositivos y Bloqueo Remoto
Para saber en qué equipo está instalada la app y bloquear el acceso cuando lo necesites, se incluye un dashboard liviano en `dashboard/`:
1. Instala dependencias y ejecuta el servidor:
### Cómo compilar
```bash
cd dashboard
npm install
npm start # escucha en http://localhost:4000
git checkout windows-only
cd windows/StreamPlayer.Desktop
dotnet restore
dotnet build -c Release
# Para distribuir:
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
```
2. Copia `dashboard/config.example.json` a `dashboard/config.json` y completa `telegramBotToken` + `telegramChatId` (o usa variables de entorno `TELEGRAM_BOT_TOKEN` / `TELEGRAM_CHAT_ID`).
3. Ajusta `DEVICE_REGISTRY_URL` en `app/build.gradle` para apuntar al dominio/puerto donde despliegues el servidor (ya configurado como `http://194.163.191.200:4000`).
4. Distribuye el APK; cada instalación reportará `ANDROID_ID`, modelo, IP pública y país.
5. Entra a `http://TU_HOST:4000/` para ver el listado, asignar alias, bloquear/desbloquear o validar tokens.
El `.exe` resultante queda en `windows/StreamPlayer.Desktop/bin/Release/net8.0/win-x64/publish/`.
El servidor guarda los datos en `dashboard/data/devices.json`, por lo que puedes versionarlo o respaldarlo fácilmente. Cada registro almacena:
### Características clave
- `deviceId`: `Settings.Secure.ANDROID_ID` del equipo
- `deviceName`, `manufacturer`, `model`, `osVersion`
- `appVersionName`/`Code`
- `ip`, `country` detectados automáticamente
- `firstSeen`, `lastSeen`, `blocked`, `notes`, `verification.status`
- **Resolución de stream**: `Services/StreamUrlResolver.cs` analiza el JavaScript ofuscado y reconstruye el HLS real (idéntico al app móvil).
- **Reproducción**: `Views/PlayerWindow` usa LibVLC con los mismos headers/User-Agent del APK para evitar bloqueos de origen.
- **Verificación remota**: `DeviceRegistryService` sincroniza con tu dashboard y bloquea toda la UI hasta que el servidor permita el dispositivo.
- **Actualizaciones forzadas**: `UpdateService` consulta las releases de Gitea y puede abrir el browser o descargar la nueva versión.
- **DNS de Google**: `WindowsDnsService` fuerza 8.8.8.8 / 8.8.4.4 solicitando elevación (UAC); si el usuario rechaza, se muestra el mensaje para configurar manualmente antes de iniciar el player.
Cuando presionas “Bloquear”, la app recibe la respuesta `{"blocked": true}` y muestra un diálogo irreversible hasta que lo habilites. Esto añade una capa adicional de control aparte del sistema de actualizaciones.
### Uso
### Flujo dentro de la app y tokens divididos
1. Compila o publica el `.exe`.
2. Ejecuta una vez como administrador para que el cambio de DNS quede aplicado.
3. Configura tus endpoints (`AppVersion.DeviceRegistryUrl`, `LatestReleaseApi`) si necesitas apuntar a otros servicios.
4. Distribuye el `.exe` y sube releases/manifest igual que con el APK.
- Cada vez que se abre `MainActivity` se consulta `https://gitea.cbcren.online/api/v1/repos/renato97/app/releases/latest`.
- Si `versionCode` del servidor es mayor al instalado se muestra un diálogo para actualizar; el usuario puede abrir la release o descargarla directamente.
- Si `minSupportedVersionCode` es mayor al instalado la app bloqueará el uso hasta actualizar, cumpliendo con el requerimiento de controlar instalaciones.
- La descarga se gestiona con `DownloadManager` y, una vez completada, se lanza el instalador usando FileProvider.
- Mientras el dashboard mantenga un dispositivo "Pendiente" o "Bloqueado", la app muestra un diálogo con el motivo y la mitad del token que debe compartir la persona.
Cada instalación genera un token interno dividido en dos:
1. **Parte cliente**: se muestra en el diálogo del dispositivo bloqueado para que el usuario pueda copiarla.
2. **Parte admin**: llega al bot de Telegram configurado junto con la IP, país y datos del dispositivo.
Para autorizar un dispositivo pendiente:
1. Obtén la parte cliente desde el usuario (visible en pantalla).
2. Copia la parte admin del mensaje de Telegram.
3. En el dashboard presiona “Verificar token” e introduce ambas mitades. Si coinciden, el estado pasa a "Verificado" y la app se desbloquea automáticamente.
4. A partir de allí puedes bloquear/desbloquear manualmente cuando quieras.
También puedes gestionar todo desde Telegram:
- `/allow <deviceId> <token_cliente>` autoriza el dispositivo (verifica el token y lo desbloquea).
- `/deny <deviceId> <token_cliente> [motivo]` lo bloquea con un motivo opcional.
- `/pending` lista los registros que aún esperan un token válido.
Cada nuevo registro dispara una notificación de Telegram con la parte admin del token y recordatorios de esos comandos.
## 📱 Estructura del Proyecto
```
app/
├── src/main/
│ ├── java/com/streamplayer/
│ │ ├── MainActivity.java # Actividad principal
│ │ ├── StreamUrlResolver.java # Resolvedor de URLs
│ │ └── DNSSetter.java # Configuración DNS
│ ├── res/
│ │ ├── layout/
│ │ │ └── activity_main.xml # UI principal
│ │ ├── mipmap-*/ # Íconos de la app
│ │ ├── values/
│ │ │ ├── strings.xml # Cadenas de texto
│ │ │ ├── colors.xml # Colores
│ │ │ └── themes.xml # Temas
│ │ └── xml/ # Configuraciones
│ └── AndroidManifest.xml # Manifiesto Android
├── build.gradle # Configuración Gradle
└── proguard-rules.pro # Reglas ProGuard
```
## ⚙️ Configuración
### URL de Streaming
La aplicación está configurada por defecto para:
```
https://streamtpmedia.com/global2.php?stream=espn
```
### Configuración DNS
```java
// DNS configurados automáticamente
String[] GOOGLE_DNS = {"8.8.8.8", "8.8.4.4"};
```
## 🔧 Dependencias Principales
- **ExoPlayer 2.18.7**: Motor de reproducción multimedia
- **AndroidX AppCompat 1.6.1**: Compatibilidad hacia atrás
- **ConstraintLayout 2.1.4**: Layout moderno y flexible
## 🛠️ Desarrollo
### Flujo de Reproducción
1. **MainActivity** inicializa y configura DNS de Google
2. **StreamUrlResolver** obtiene y decodifica la URL real del stream
3. **ExoPlayer** inicia la reproducción con la URL resuelta
4. UI actualiza estados (loading, playing, error)
### Características Técnicas
- **Threading**: Operaciones de red en background thread
- **Memory Management**: Proper lifecycle management de ExoPlayer
- **Error Handling**: Captura y display de errores al usuario
- **Network Optimization**: Configuración DNS específica para streaming
## 📊 Build Configuration
| Atributo | Valor |
|----------|-------|
| `applicationId` | `com.streamplayer` |
| `minSdk` | 21 |
| `targetSdk` | 33 |
| `versionCode` | 90000 |
| `versionName` | "9.0.0" |
| `compileSdk` | 33 |
## 🔐 Permisos y Seguridad
La aplicación requiere los siguientes permisos:
-`INTERNET` - Para streaming de contenido
-`ACCESS_NETWORK_STATE` - Para verificar conectividad
-`CHANGE_NETWORK_STATE` - Para optimización de red
## 🐛 Troubleshooting
### Problemas Comunes
**Error de Conexión**
- Verificar conexión a internet
- Confirmar configuración DNS
- Revisar disponibilidad del servicio de streaming
**Error de Reproducción**
- Validar formato de URL
- Verificar permisos de red
- Revisar logs de ExoPlayer
**Build Fail**
```bash
# Limpiar proyecto
./gradlew clean
# Rebuild
./gradlew build
```
## 📝 Logs y Debug
La aplicación incluye console logging para:
- Configuración DNS
- Resolución de URLs
- Estados del reproductor
- Errores de red
## 🤝 Contribución
1. Fork del repositorio
2. Feature branch (`git checkout -b feature/NuevaCaracteristica`)
3. Commit cambios (`git commit -m 'Add feature'`)
4. Push al branch (`git push origin feature/NuevaCaracteristica`)
5. Pull Request
## 📄 Licencia
Este proyecto está licenciado bajo la Licencia MIT - ver archivo [LICENSE](LICENSE) para detalles.
## 👨‍💻 Autor
**renato97** - [Gitea Profile](https://gitea.cbcren.online/renato97)
---
⚠️ **Disclaimer**: Esta aplicación es para fines educativos y de demostración. El usuario es responsable de cumplir con los términos de servicio de las plataformas de streaming utilizadas.
## 📞 Soporte
Para soporte y preguntas:
- 📧 Crear un issue en el repositorio
- 💬 Comentarios en el código
- 📱 Testing en dispositivos reales recomendado
---
**🔗 Repositorio**: https://gitea.cbcren.online/renato97/app
Este branch **no** incluye ningún archivo Android; es solo el código fuente de la versión Windows. Para la versión móvil sigue usando `main`.
-218
View File
@@ -1,218 +0,0 @@
# Testing Guide - StreamPlayer
This document explains how to run and maintain tests for the StreamPlayer application.
## Test Structure
The project has two types of tests:
1. **Unit Tests** (`app/src/test/`)
- Run on the JVM (no device/emulator needed)
- Test business logic in isolation
- Located in: `app/src/test/java/com/streamplayer/`
2. **Integration Tests** (`app/src/androidTest/`)
- Run on Android device/emulator
- Test UI interactions and component integration
- Located in: `app/src/androidTest/java/com/streamplayer/`
## Running Tests
### Unit Tests
Run all unit tests:
```bash
./gradlew test
```
Run specific test class:
```bash
./gradlew test --tests StreamUrlResolverTest
```
Run with coverage report:
```bash
./gradlew test jacocoTestReport
```
### Integration Tests
Run all integration tests:
```bash
./gradlew connectedAndroidTest
```
Run specific test class:
```bash
./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.streamplayer.PlayerIntegrationTest
```
### All Tests
Run both unit and integration tests:
```bash
./gradlew test connectedAndroidTest
```
## Test Files
### Unit Tests
1. **StreamUrlResolverTest.java**
- Tests for `parseVersionCode()` and `deriveGroupName()` methods
- Tests JSON parsing with Gson
- Tests various edge cases and error conditions
2. **EventRepositoryTest.java**
- Tests for EventItem model
- Tests Gson serialization/deserialization
- Tests filtering, sorting, and grouping operations
### Integration Tests
1. **PlayerIntegrationTest.java**
- Tests channel playback flow
- Tests navigation between activities
- Tests error handling during playback
2. **UpdateFlowIntegrationTest.java**
- Tests update check flow
- Tests update download and installation
- Tests error handling during updates
## Test Coverage
The tests aim to cover:
- ✅ All public methods in critical classes
- ✅ Happy path scenarios
- ✅ Error conditions and edge cases
- ✅ JSON serialization/deserialization
- ✅ UI navigation flows
- ✅ Integration between components
## Dependencies
### Testing Libraries
- **JUnit 4**: Unit testing framework
- **Mockito**: Mocking framework for unit tests
- **Espresso**: UI testing framework
- **UiAutomator**: Cross-app UI testing
- **Robolectric**: Android unit testing on JVM
### Added Dependencies
The following dependencies have been added to `build.gradle`:
```gradle
// Unit testing
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:5.7.0'
testImplementation 'org.mockito:mockito-inline:5.2.0'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
testImplementation 'org.robolectric:robolectric:4.11.1'
// Integration testing
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
```
## Best Practices
1. **Test Naming**: Use descriptive names that explain what is being tested
- Good: `testParseVersionCode_withValidInput_returnsCorrectCode()`
- Bad: `test1()`
2. **Test Structure**: Follow AAA pattern (Arrange, Act, Assert)
- Arrange: Set up test data and conditions
- Act: Perform the action being tested
- Assert: Verify the expected results
3. **Test Independence**: Each test should be independent and not rely on other tests
4. **Test Data**: Use meaningful test data that covers edge cases
5. **Mocking**: Mock external dependencies (network, database, etc.)
6. **Coverage**: Aim for high code coverage but focus on testing behavior, not implementation
## Continuous Integration
Tests should be run automatically on:
- Every pull request
- Before releases
- Nightly builds
## Troubleshooting
### Unit Tests
1. **Mockito Issues**: If you get "Mockito cannot mock this class", check:
- Add `@RunWith(MockitoJUnitRunner.class)` to test class
- Ensure `mockito-inline` dependency is included
2. **Robolectric Issues**: If tests fail with Robolectric:
- Check SDK version compatibility
- Add `@Config` annotation with correct SDK version
### Integration Tests
1. **Emulator Issues**:
- Ensure emulator is running or device is connected
- Check that developer options and USB debugging are enabled
2. **Timing Issues**: Add proper waits and delays:
```java
Thread.sleep(1000); // Simple delay
device.wait(Until.hasObject(By.pkg("com.streamplayer")), 5000);
```
3. **Permission Issues**: Add necessary permissions to test manifest
## Future Improvements
1. Add more unit tests for other classes
2. Implement test doubles for network layer
3. Add performance tests
4. Add screenshot tests for UI regression testing
5. Implement mutation testing to verify test quality
6. Add integration tests for error scenarios
7. Implement automated test reporting
## Firebase Configuration
To use Firebase services (Crashlytics, Analytics, Performance):
1. Download `google-services.json` from Firebase Console
2. Place it in `app/` directory (replace the example file)
3. Firebase plugins are already configured in `build.gradle`
## LeakCanary
LeakCanary is included for debug builds to detect memory leaks:
```gradle
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
```
Check logcat for leak analysis results when testing on device/emulator.
## ProGuard/R8
ProGuard rules have been updated to keep test-related classes:
- Keep ExoPlayer classes
- Keep OkHttp classes
- Keep Gson model classes
- Keep test classes and methods
## Resources
- [Android Testing Documentation](https://developer.android.com/training/testing)
- [JUnit 4 Documentation](https://junit.org/junit4/)
- [Mockito Documentation](https://site.mockito.org/)
- [Espresso Documentation](https://developer.android.com/training/testing/espresso)
File diff suppressed because it is too large Load Diff
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
-81
View File
@@ -1,81 +0,0 @@
apply plugin: 'com.android.application'
android {
namespace "com.streamplayer"
compileSdk 33
defaultConfig {
applicationId "com.streamplayer"
minSdk 21
targetSdk 33
versionCode 94200
versionName "9.4.2"
buildConfigField "String", "DEVICE_REGISTRY_URL", '"http://194.163.191.200:4000"'
buildConfigField "String", "EVENTS_URL", '"https://streamtpmedia.com/eventos.json"'
buildConfigField "String", "RELEASE_API_URL", '"https://gitea.cbcren.online/api/v1/repos/renato97/app/releases/latest"'
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lint {
checkReleaseBuilds = false
abortOnError = false
}
buildFeatures {
buildConfig = true
}
packaging {
resources {
excludes += 'META-INF/com.android.tools/proguard/coroutines.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
// ExoPlayer para reproducción de video
implementation 'com.google.android.exoplayer:exoplayer:2.18.7'
implementation 'com.google.android.exoplayer:extension-okhttp:2.18.7'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.12.0'
// Gson para parseo JSON
implementation 'com.google.code.gson:gson:2.10.1'
// Testing dependencies
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:5.7.0'
testImplementation 'org.mockito:mockito-inline:5.2.0'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
testImplementation 'org.robolectric:robolectric:4.11.1'
// Android Test dependencies
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
// LeakCanary para detección de memory leaks
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--
This file is automatically generated by Crashlytics to uniquely
identify the mapping file for your Android application.
Do NOT modify or commit to source control!
-->
<string name="com.google.firebase.crashlytics.mapping_file_id" tools:ignore="UnusedResources,TypographyDashes" translatable="false">00000000000000000000000000000000</string>
</resources>
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="default_web_client_id" translatable="false">123456789012-abcdefghijklmnopqrstuvwxyz123456.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId" translatable="false">123456789012</string>
<string name="google_api_key" translatable="false">AIzaSyAbCdEfGhIjKlMnOpQrStUvWxYz1234567</string>
<string name="google_app_id" translatable="false">1:123456789012:android:abcdef1234567890</string>
<string name="google_crash_reporting_api_key" translatable="false">AIzaSyAbCdEfGhIjKlMnOpQrStUvWxYz1234567</string>
<string name="google_storage_bucket" translatable="false">streamplayer-example.appspot.com</string>
<string name="project_id" translatable="false">streamplayer-example</string>
</resources>
@@ -1,18 +0,0 @@
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.streamplayer;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.streamplayer";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 94200;
public static final String VERSION_NAME = "9.4.2";
// Field from default config.
public static final String DEVICE_REGISTRY_URL = "http://194.163.191.200:4000";
// Field from default config.
public static final String EVENTS_URL = "https://streamtpmedia.com/eventos.json";
// Field from default config.
public static final String RELEASE_API_URL = "https://gitea.cbcren.online/api/v1/repos/renato97/app/releases/latest";
}
-1
View File
@@ -1 +0,0 @@
1:123456789012:android:abcdef1234567890
@@ -1,2 +0,0 @@
#- File Locator -
listingFile=../../../../outputs/apk/debug/output-metadata.json
@@ -1,2 +0,0 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.5.1
@@ -1,10 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "com.streamplayer",
"variantName": "debug",
"elements": []
}

Some files were not shown because too many files have changed in this diff Show More