Refactor: Full migration to Go backend and React TV-style frontend
This commit is contained in:
parent
908d6f05aa
commit
cbfdd34253
1635 changed files with 8747 additions and 74151 deletions
0
.agent/workflows/test-android-tv.md
Executable file → Normal file
0
.agent/workflows/test-android-tv.md
Executable file → Normal file
32
.dockerignore
Normal file
32
.dockerignore
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# Ignore for Docker build
|
||||
.git
|
||||
.github
|
||||
.vscode
|
||||
.agent
|
||||
.gemini
|
||||
*.log
|
||||
*.db
|
||||
|
||||
# Android TV build artifacts
|
||||
android-tv/
|
||||
release/
|
||||
|
||||
# Cache directories causing Synology Drive sync issues
|
||||
backend/cache/
|
||||
cache/
|
||||
*.pyc
|
||||
__pycache__/
|
||||
.venv/
|
||||
venv/
|
||||
node_modules/
|
||||
|
||||
# Build scripts and misc
|
||||
*.sh
|
||||
*.bat
|
||||
*.json
|
||||
!backend/requirements.txt
|
||||
!frontend/package.json
|
||||
|
||||
# Synology Drive
|
||||
@eaDir/
|
||||
.DS_Store
|
||||
0
.github/workflows/ci.yml
vendored
Executable file → Normal file
0
.github/workflows/ci.yml
vendored
Executable file → Normal file
0
.github/workflows/release.yml
vendored
Executable file → Normal file
0
.github/workflows/release.yml
vendored
Executable file → Normal file
0
.gitignore
vendored
Executable file → Normal file
0
.gitignore
vendored
Executable file → Normal file
97
Dockerfile
Executable file → Normal file
97
Dockerfile
Executable file → Normal file
|
|
@ -1,73 +1,56 @@
|
|||
# StreamFlow Docker Image - Unified Backend + Frontend
|
||||
# Multi-stage build for smaller image size
|
||||
# ===========================
|
||||
# Stage 1: Frontend Build
|
||||
# ===========================
|
||||
FROM node:20-alpine AS frontend-builder
|
||||
WORKDIR /app/frontend
|
||||
COPY frontend-react/package*.json ./
|
||||
RUN npm ci
|
||||
COPY frontend-react/ .
|
||||
RUN npm run build
|
||||
|
||||
# ====================
|
||||
# Stage 1: Dependencies
|
||||
# ====================
|
||||
FROM python:3.11-slim AS builder
|
||||
WORKDIR /build
|
||||
# ===========================
|
||||
# Stage 2: Backend Build
|
||||
# ===========================
|
||||
FROM golang:1.22-alpine AS backend-builder
|
||||
WORKDIR /app/backend
|
||||
|
||||
# Install build dependencies
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
# Install necessary build tools for CGO (SQLite)
|
||||
RUN apk add --no-cache gcc musl-dev
|
||||
|
||||
# Install Python dependencies to wheels
|
||||
COPY backend/requirements.txt .
|
||||
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
|
||||
COPY backend/go.mod backend/go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
COPY backend/ .
|
||||
# Build Linux binary
|
||||
RUN CGO_ENABLED=1 GOOS=linux go build -o server ./cmd/server/main.go
|
||||
|
||||
# ====================
|
||||
# Stage 2: Runtime
|
||||
# ====================
|
||||
FROM python:3.11-slim
|
||||
# ===========================
|
||||
# Stage 3: Runtime
|
||||
# ===========================
|
||||
FROM python:3.11-alpine
|
||||
WORKDIR /app
|
||||
|
||||
# Install runtime dependencies only
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ffmpeg \
|
||||
curl \
|
||||
libnss3 \
|
||||
libnspr4 \
|
||||
libatk1.0-0 \
|
||||
libatk-bridge2.0-0 \
|
||||
libcups2 \
|
||||
libdrm2 \
|
||||
libxkbcommon0 \
|
||||
libxcomposite1 \
|
||||
libxdamage1 \
|
||||
libxrandr2 \
|
||||
libgbm1 \
|
||||
libasound2 \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& apt-get clean
|
||||
# Install Runtime Dependencies
|
||||
# - ffmpeg: for yt-dlp media handling
|
||||
# - yt-dlp: via pip
|
||||
# - ca-certificates: for HTTPS
|
||||
RUN apk add --no-cache ffmpeg ca-certificates && \
|
||||
pip install --no-cache-dir yt-dlp
|
||||
|
||||
# Create non-root user for security
|
||||
RUN groupadd -r streamflow && useradd -r -g streamflow -d /app -s /sbin/nologin streamflow
|
||||
# Create non-root user
|
||||
RUN addgroup -S streamflow && adduser -S streamflow -G streamflow
|
||||
|
||||
# Install Python dependencies from wheels (faster)
|
||||
COPY --from=builder /wheels /wheels
|
||||
RUN pip install --no-cache-dir /wheels/* && rm -rf /wheels
|
||||
# Copy Frontend Build
|
||||
COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist
|
||||
|
||||
# Install Playwright browsers (needed for scraping)
|
||||
RUN playwright install chromium && playwright install-deps chromium
|
||||
# Copy Backend Binary
|
||||
COPY --from=backend-builder /app/backend/server /app/server
|
||||
|
||||
# Copy backend code
|
||||
COPY backend/ .
|
||||
# Setup Permissions
|
||||
RUN chown -R streamflow:streamflow /app
|
||||
|
||||
# Create data directory with correct ownership
|
||||
RUN mkdir -p /app/data && chown -R streamflow:streamflow /app
|
||||
|
||||
# Switch to non-root user
|
||||
USER streamflow
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8000
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8000/api/health || exit 1
|
||||
|
||||
# Start application
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
|
||||
CMD ["/app/server"]
|
||||
|
|
|
|||
204
README.md
Executable file → Normal file
204
README.md
Executable file → Normal file
|
|
@ -1,180 +1,62 @@
|
|||
# StreamFlow - Premium Cinema Experience 🎬
|
||||
# StreamFlow V2
|
||||
|
||||
[](https://hub.docker.com/r/vndangkhoa/streamflix)
|
||||
[](https://github.com/vndangkhoa/Streamflow)
|
||||
[](https://github.com/vndangkhoa/Streamflow/releases)
|
||||
StreamFlow is a high-performance video streaming web application featuring a pure Go backend and a modern React + Tailwind frontend.
|
||||
|
||||
StreamFlow is a high-fidelity movie streaming application designed for NAS enthusiasts and home cinema lovers. It combines a premium **Apple TV+ inspired aesthetic** with a lightweight, high-performance backend, now consolidated into a **single Docker image** for effortless deployment.
|
||||
## 🚀 Features
|
||||
|
||||
## 📋 Latest Release: v1.3.1
|
||||
- **Modern UI**: Built with React, TypeScript, and Tailwind CSS for a premium, responsive experience.
|
||||
- **High Performance**: Backend written in Go (Golang) for speed and concurrency.
|
||||
- **Smart Scraping**: Integrated scraping engine (Rophim) with automated episode extraction.
|
||||
- **HLS Streaming**: Native HLS playback support.
|
||||
- **Docker Ready**: Multi-stage Docker build for optimized deployment.
|
||||
|
||||
**What's New in v1.3.1:**
|
||||
- 📱 **Mobile Background Playback:** Added support for background playback and wake lock to prevent screen sleep.
|
||||
- 🚀 **Performance:** General stability improvements and version sync across platforms.
|
||||
## 🛠️ Tech Stack
|
||||
|
||||
**Previous (v1.3.0):**
|
||||
- 🔍 **Search Experience Overhaul:** Fixed UI rendering, added keyboard/voice support, and verified backend connectivity.
|
||||
- 🟥 **Solid Red Branding:** Pure solid red adaptive icon and banner for a cleaner TV home screen look.
|
||||
- ⚡ **Navigation Polish:** Smarter focus management and sidebar transitions.
|
||||
- 🐞 **Stability:** Fixed compilation errors and optimized network requests.
|
||||
- **Backend**: Go (Chi Router, GORM, GoQuery)
|
||||
- **Frontend**: React, TypeScript, Vite, Tailwind CSS
|
||||
- **Database**: SQLite
|
||||
- **Deployment**: Docker
|
||||
|
||||
**Previous (v1.2.0):**
|
||||
- 🎬 **Animated Splash Screen:** Premium logo animation on app launch
|
||||
- 📺 **Continue Watching:** Watch history persisted across sessions
|
||||
- ⭐ **My List:** Save favorite movies for quick access
|
||||
- ⚡ **Faster Loading:** Optimized splash screen (1.2s) and lazy loading
|
||||
- 🐛 **Bug Fixes:** Fixed video playback, improved stability
|
||||
- <20> **Bug Fixes:** Fixed video playback, improved stability
|
||||
## 📦 Installation
|
||||
|
||||
**Previous (v1.1.0):**
|
||||
- 📺 Native Android TV App with Leanback UI
|
||||
- 🎮 ExoPlayer Integration for HLS streaming
|
||||
- 🔍 Voice Search support
|
||||
### Prerequisites
|
||||
|
||||
---
|
||||
- Go 1.22+
|
||||
- Node.js 20+
|
||||
- Docker (optional)
|
||||
|
||||
### Local Development
|
||||
|
||||
## 📺 Native Android TV App
|
||||
1. **Backend**
|
||||
```bash
|
||||
cd backend
|
||||
go mod tidy
|
||||
go run ./cmd/server/main.go
|
||||
```
|
||||
Server runs at `http://localhost:8000`.
|
||||
|
||||
A dedicated native Android TV app built with Google's **Leanback** library for the optimal TV experience.
|
||||
2. **Frontend**
|
||||
```bash
|
||||
cd frontend-react
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
Frontend runs at `http://localhost:5173` (proxying to backend).
|
||||
|
||||
### Features
|
||||
| Feature | Description |
|
||||
|---------|-------------|
|
||||
| **Leanback UI** | Netflix-style horizontal rows with focus animations |
|
||||
| **ExoPlayer** | High-quality HLS video streaming with buffering |
|
||||
| **Voice Search** | Native Google voice search integration |
|
||||
| **D-Pad Navigation** | Seamless remote control navigation |
|
||||
| **Curated Home** | Personalized sections (Top Rated, New, Genres) |
|
||||
| **Splash Screen** | Animated logo with premium launch experience |
|
||||
| **Continue Watching** | Resume where you left off with watch history |
|
||||
| **My List** | Save favorite movies for quick access |
|
||||
|
||||
### Downloads
|
||||
- **[Download TV APK (v1.3.1)](https://github.com/vndangkhoa/Streamflow/releases/download/v1.3.1/StreamFlix-TV.apk)** - Direct Download
|
||||
- **[Download Mobile APK (v1.3.1)](https://github.com/vndangkhoa/Streamflow/releases/download/v1.3.1/StreamFlix.apk)** - Direct Download
|
||||
- **[All Releases](https://github.com/vndangkhoa/Streamflow/releases/tag/v1.3.1)** - View Release Page
|
||||
|
||||
### Installation
|
||||
### Docker Deployment
|
||||
|
||||
```bash
|
||||
# Install via ADB
|
||||
adb install StreamFlix-TV.apk
|
||||
docker-compose up -d --build
|
||||
```
|
||||
Access the application at `http://localhost:8000`.
|
||||
|
||||
### Project Structure
|
||||
```
|
||||
android-tv/
|
||||
├── app/src/main/java/com/streamflix/tv/
|
||||
│ ├── data/
|
||||
│ │ ├── api/ # Retrofit API client with HMAC auth
|
||||
│ │ ├── model/ # Movie, ApiResponse models
|
||||
│ │ ├── WatchHistoryManager.kt # Persistent watch history
|
||||
│ │ └── MyListManager.kt # User favorites
|
||||
│ └── ui/
|
||||
│ ├── browse/ # Main browse screen (Leanback)
|
||||
│ ├── details/ # Movie details with actions
|
||||
│ ├── playback/ # ExoPlayer video playback
|
||||
│ └── search/ # Voice + text search
|
||||
├── SplashActivity.kt # Animated splash screen
|
||||
└── gradle/
|
||||
```
|
||||
## 📂 Project Structure
|
||||
|
||||
- `backend/` - Go source code
|
||||
- `frontend-react/` - React source code
|
||||
- `Dockerfile` - Multi-stage build definition
|
||||
- `docker-compose.yml` - Deployment configuration
|
||||
|
||||
---
|
||||
## 📝 License
|
||||
|
||||
## 💎 Premium Features
|
||||
|
||||
### 🧊 Liquid Glass UI
|
||||
- **Immersive Design**: Deep frosted-glass effects (40px+ blur) with Apple-style deep occlusion.
|
||||
- **Micro-interactions**: 1px translucent borders, 3D card scaling, and smooth state transitions.
|
||||
- **Cinematic Hero**: Dynamic full-screen backdrops that change based on featured content.
|
||||
- **Dark Mode Perfected**: A custom OLED-friendly palette optimized for theater viewing.
|
||||
|
||||
### ⚡ Turbo-Charged Performance
|
||||
- **Parallel Crawler**: Fetches category data with concurrent workers, reducing initial load times by up to 60%.
|
||||
- **Multi-Layer Caching**: Advanced Redis-backed caching for movie metadata, catalog results, and stream extraction.
|
||||
- **Eager Prefetching**: Intelligent frontend prefetching of thumbnails and metadata before you even scroll to them.
|
||||
- **Instant Recovery**: Session-based client caching for near-instant navigation back to Home and Cinema views.
|
||||
|
||||
### 📱 Native PWA Experience
|
||||
- **Installable**: Full Progressive Web App (PWA) support. Add to Home Screen on iOS and Android.
|
||||
- **Native Feel**: Runs in standalone mode without browser chrome for a truly native app experience.
|
||||
- **Custom Icons**: High-resolution 'Liquid Glass' app icons for your home screen.
|
||||
|
||||
### 🐳 Unified NAS Architecture
|
||||
- **Single-Container Deployment**: Backend and Frontend are bundled into one efficient image.
|
||||
- **Low Overhead**: Zero-bypass streaming shifts heavy video load 100% to the client side.
|
||||
- **NAS-Optimized**: Designed to run smoothly on Synology, QNAP, and Unraid (linux/amd64).
|
||||
|
||||
### 🍅 Rich Metadata
|
||||
- **Rotten Tomatoes Ratings**: Real-time integration of "Fresh" and "Rotten" score badges.
|
||||
- **Watch History**: Cross-device history and "My List" bookmarks saved to Redis.
|
||||
- **Robust Player**: Hardened video overlay with instant context-aware closure (Escape key, Back button, and X support).
|
||||
|
||||
---
|
||||
|
||||
## 🚀 One-Step Deployment
|
||||
|
||||
Copy this into your `docker-compose.yml` and run `docker-compose up -d`:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# StreamFlow Unified (Backend + Frontend)
|
||||
app:
|
||||
image: vndangkhoa/streamflix:1.1.0
|
||||
platform: linux/amd64
|
||||
ports:
|
||||
- "3478:8000"
|
||||
environment:
|
||||
- REDIS_URL=redis://redis:6379
|
||||
- DATABASE_URL=sqlite:///./app/data/streamflow.db
|
||||
- PYTHONUNBUFFERED=1
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
depends_on:
|
||||
redis:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
|
||||
# Redis Cache & History
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
platform: linux/amd64
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- ./redis-data:/data
|
||||
restart: unless-stopped
|
||||
command: redis-server --appendonly yes
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 5
|
||||
```
|
||||
|
||||
### 🏁 Accessing the App
|
||||
- **UI & API**: [http://localhost:3478](http://localhost:3478)
|
||||
- **API Docs**: [http://localhost:3478/docs](http://localhost:3478/docs)
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Tech Stack
|
||||
- **Backend Core**: FastAPI (Python 3.11), SQLAlchemy, Redis
|
||||
- **Scraping Engine**: Playwright (Headless Chromium) & `aiohttp` for resilient data extraction
|
||||
- **Frontend Engine**: Vanilla JS (ES6+), Vite, ArtPlayer.js
|
||||
- **Android TV**: Kotlin, Leanback, ExoPlayer (Media3), Retrofit
|
||||
- **Styling**: Modern CSS with deep backdrop filters and Liquid Glass design tokens
|
||||
- **Architecture**: Multi-stage Docker Build (Debian-slim)
|
||||
|
||||
## 📝 Credits
|
||||
Movie data provided by `ophim` API.
|
||||
Designed with ❤️ by [vndangkhoa](https://github.com/vndangkhoa).
|
||||
|
||||
---
|
||||
|
||||
> [!TIP]
|
||||
> **Synology Tip**: Use the **Container Manager** (formerly Docker) on Synology. Create a new "Project" using the YAML above for the best management experience.
|
||||
MIT
|
||||
|
|
|
|||
3
android-tv/.idea/.gitignore
vendored
3
android-tv/.idea/.gitignore
vendored
|
|
@ -1,3 +0,0 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AndroidProjectSystem">
|
||||
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
|
||||
</component>
|
||||
</project>
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,123 +0,0 @@
|
|||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<JetCodeStyleSettings>
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</JetCodeStyleSettings>
|
||||
<codeStyleSettings language="XML">
|
||||
<option name="FORCE_REARRANGE_MODE" value="1" />
|
||||
<indentOptions>
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
</indentOptions>
|
||||
<arrangement>
|
||||
<rules>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:android</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:id</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:name</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>name</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>style</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>ANDROID_ATTRIBUTE_ORDER</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
</rules>
|
||||
</arrangement>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="kotlin">
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="21" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="CHOOSE_PER_TEST" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<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>
|
||||
</project>
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectMigrations">
|
||||
<option name="MigrateToGradleLocalJavaHome">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<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$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RunConfigurationProducerService">
|
||||
<option name="ignoredProducers">
|
||||
<set>
|
||||
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
|
||||
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
|
||||
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
|
||||
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
|
||||
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
|
||||
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
|
||||
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
|
||||
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'org.jetbrains.kotlin.kapt'
|
||||
}
|
||||
|
||||
android {
|
||||
namespace 'com.streamflix.tv'
|
||||
compileSdk 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.streamflix.tv"
|
||||
minSdk 23
|
||||
targetSdk 36
|
||||
versionCode 5
|
||||
versionName "1.3.2"
|
||||
|
||||
// Backend API URL - StreamFlix server
|
||||
buildConfigField "String", "API_BASE_URL", '"https://nf.khoavo.myds.me"'
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
debug {
|
||||
minifyEnabled false
|
||||
}
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
buildConfig true
|
||||
viewBinding true
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '17'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// AndroidX Core
|
||||
implementation 'androidx.core:core-ktx:1.17.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||
implementation 'androidx.activity:activity-ktx:1.12.2'
|
||||
implementation 'androidx.fragment:fragment-ktx:1.8.9'
|
||||
|
||||
// Leanback (TV UI Framework)
|
||||
implementation 'androidx.leanback:leanback:1.2.0'
|
||||
implementation 'androidx.leanback:leanback-preference:1.2.0'
|
||||
|
||||
// Lifecycle & ViewModel
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.10.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.10.0'
|
||||
|
||||
// Networking
|
||||
implementation 'com.squareup.retrofit2:retrofit:3.0.0'
|
||||
implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
|
||||
implementation 'com.squareup.okhttp3:okhttp:5.3.2'
|
||||
implementation 'com.squareup.okhttp3:logging-interceptor:5.3.2'
|
||||
|
||||
// Image Loading
|
||||
implementation 'com.github.bumptech.glide:glide:5.0.5'
|
||||
kapt 'com.github.bumptech.glide:compiler:5.0.5'
|
||||
|
||||
// Coroutines
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2'
|
||||
|
||||
// ExoPlayer (Video Playback with HLS support)
|
||||
implementation 'androidx.media3:media3-exoplayer:1.9.0'
|
||||
implementation 'androidx.media3:media3-exoplayer-hls:1.9.0'
|
||||
implementation 'androidx.media3:media3-ui:1.9.0'
|
||||
implementation 'androidx.media3:media3-ui-leanback:1.9.0'
|
||||
|
||||
// Testing
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.11.1'
|
||||
testImplementation 'androidx.test.ext:junit:1.1.5'
|
||||
testImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
// Generated by view binder compiler. Do not edit!
|
||||
package com.streamflix.tv.databinding;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
import com.streamflix.tv.R;
|
||||
import java.lang.NullPointerException;
|
||||
import java.lang.Override;
|
||||
|
||||
public final class ActivityDetailsBinding implements ViewBinding {
|
||||
@NonNull
|
||||
private final FrameLayout rootView;
|
||||
|
||||
@NonNull
|
||||
public final FrameLayout detailsFragment;
|
||||
|
||||
private ActivityDetailsBinding(@NonNull FrameLayout rootView,
|
||||
@NonNull FrameLayout detailsFragment) {
|
||||
this.rootView = rootView;
|
||||
this.detailsFragment = detailsFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public FrameLayout getRoot() {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityDetailsBinding inflate(@NonNull LayoutInflater inflater) {
|
||||
return inflate(inflater, null, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityDetailsBinding inflate(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup parent, boolean attachToParent) {
|
||||
View root = inflater.inflate(R.layout.activity_details, parent, false);
|
||||
if (attachToParent) {
|
||||
parent.addView(root);
|
||||
}
|
||||
return bind(root);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityDetailsBinding bind(@NonNull View rootView) {
|
||||
if (rootView == null) {
|
||||
throw new NullPointerException("rootView");
|
||||
}
|
||||
|
||||
FrameLayout detailsFragment = (FrameLayout) rootView;
|
||||
|
||||
return new ActivityDetailsBinding((FrameLayout) rootView, detailsFragment);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
// Generated by view binder compiler. Do not edit!
|
||||
package com.streamflix.tv.databinding;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
import com.streamflix.tv.R;
|
||||
import java.lang.NullPointerException;
|
||||
import java.lang.Override;
|
||||
|
||||
public final class ActivityMainBinding implements ViewBinding {
|
||||
@NonNull
|
||||
private final FrameLayout rootView;
|
||||
|
||||
@NonNull
|
||||
public final FrameLayout mainBrowseFragment;
|
||||
|
||||
private ActivityMainBinding(@NonNull FrameLayout rootView,
|
||||
@NonNull FrameLayout mainBrowseFragment) {
|
||||
this.rootView = rootView;
|
||||
this.mainBrowseFragment = mainBrowseFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public FrameLayout getRoot() {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
|
||||
return inflate(inflater, null, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup parent, boolean attachToParent) {
|
||||
View root = inflater.inflate(R.layout.activity_main, parent, false);
|
||||
if (attachToParent) {
|
||||
parent.addView(root);
|
||||
}
|
||||
return bind(root);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityMainBinding bind(@NonNull View rootView) {
|
||||
if (rootView == null) {
|
||||
throw new NullPointerException("rootView");
|
||||
}
|
||||
|
||||
FrameLayout mainBrowseFragment = (FrameLayout) rootView;
|
||||
|
||||
return new ActivityMainBinding((FrameLayout) rootView, mainBrowseFragment);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
// Generated by view binder compiler. Do not edit!
|
||||
package com.streamflix.tv.databinding;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
import com.streamflix.tv.R;
|
||||
import java.lang.NullPointerException;
|
||||
import java.lang.Override;
|
||||
|
||||
public final class ActivityPlaybackBinding implements ViewBinding {
|
||||
@NonNull
|
||||
private final FrameLayout rootView;
|
||||
|
||||
@NonNull
|
||||
public final FrameLayout playbackFragment;
|
||||
|
||||
private ActivityPlaybackBinding(@NonNull FrameLayout rootView,
|
||||
@NonNull FrameLayout playbackFragment) {
|
||||
this.rootView = rootView;
|
||||
this.playbackFragment = playbackFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public FrameLayout getRoot() {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityPlaybackBinding inflate(@NonNull LayoutInflater inflater) {
|
||||
return inflate(inflater, null, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityPlaybackBinding inflate(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup parent, boolean attachToParent) {
|
||||
View root = inflater.inflate(R.layout.activity_playback, parent, false);
|
||||
if (attachToParent) {
|
||||
parent.addView(root);
|
||||
}
|
||||
return bind(root);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivityPlaybackBinding bind(@NonNull View rootView) {
|
||||
if (rootView == null) {
|
||||
throw new NullPointerException("rootView");
|
||||
}
|
||||
|
||||
FrameLayout playbackFragment = (FrameLayout) rootView;
|
||||
|
||||
return new ActivityPlaybackBinding((FrameLayout) rootView, playbackFragment);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
// Generated by view binder compiler. Do not edit!
|
||||
package com.streamflix.tv.databinding;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
import com.streamflix.tv.R;
|
||||
import java.lang.NullPointerException;
|
||||
import java.lang.Override;
|
||||
|
||||
public final class ActivitySearchBinding implements ViewBinding {
|
||||
@NonNull
|
||||
private final FrameLayout rootView;
|
||||
|
||||
@NonNull
|
||||
public final FrameLayout searchFragment;
|
||||
|
||||
private ActivitySearchBinding(@NonNull FrameLayout rootView,
|
||||
@NonNull FrameLayout searchFragment) {
|
||||
this.rootView = rootView;
|
||||
this.searchFragment = searchFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public FrameLayout getRoot() {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySearchBinding inflate(@NonNull LayoutInflater inflater) {
|
||||
return inflate(inflater, null, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySearchBinding inflate(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup parent, boolean attachToParent) {
|
||||
View root = inflater.inflate(R.layout.activity_search, parent, false);
|
||||
if (attachToParent) {
|
||||
parent.addView(root);
|
||||
}
|
||||
return bind(root);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySearchBinding bind(@NonNull View rootView) {
|
||||
if (rootView == null) {
|
||||
throw new NullPointerException("rootView");
|
||||
}
|
||||
|
||||
FrameLayout searchFragment = (FrameLayout) rootView;
|
||||
|
||||
return new ActivitySearchBinding((FrameLayout) rootView, searchFragment);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
// Generated by view binder compiler. Do not edit!
|
||||
package com.streamflix.tv.databinding;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
import androidx.viewbinding.ViewBindings;
|
||||
import com.streamflix.tv.R;
|
||||
import java.lang.NullPointerException;
|
||||
import java.lang.Override;
|
||||
import java.lang.String;
|
||||
|
||||
public final class ActivitySplashBinding implements ViewBinding {
|
||||
@NonNull
|
||||
private final FrameLayout rootView;
|
||||
|
||||
@NonNull
|
||||
public final ImageView splashLogo;
|
||||
|
||||
@NonNull
|
||||
public final TextView splashTagline;
|
||||
|
||||
@NonNull
|
||||
public final TextView splashTitle;
|
||||
|
||||
private ActivitySplashBinding(@NonNull FrameLayout rootView, @NonNull ImageView splashLogo,
|
||||
@NonNull TextView splashTagline, @NonNull TextView splashTitle) {
|
||||
this.rootView = rootView;
|
||||
this.splashLogo = splashLogo;
|
||||
this.splashTagline = splashTagline;
|
||||
this.splashTitle = splashTitle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public FrameLayout getRoot() {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySplashBinding inflate(@NonNull LayoutInflater inflater) {
|
||||
return inflate(inflater, null, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySplashBinding inflate(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup parent, boolean attachToParent) {
|
||||
View root = inflater.inflate(R.layout.activity_splash, parent, false);
|
||||
if (attachToParent) {
|
||||
parent.addView(root);
|
||||
}
|
||||
return bind(root);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActivitySplashBinding bind(@NonNull View rootView) {
|
||||
// The body of this method is generated in a way you would not otherwise write.
|
||||
// This is done to optimize the compiled bytecode for size and performance.
|
||||
int id;
|
||||
missingId: {
|
||||
id = R.id.splash_logo;
|
||||
ImageView splashLogo = ViewBindings.findChildViewById(rootView, id);
|
||||
if (splashLogo == null) {
|
||||
break missingId;
|
||||
}
|
||||
|
||||
id = R.id.splash_tagline;
|
||||
TextView splashTagline = ViewBindings.findChildViewById(rootView, id);
|
||||
if (splashTagline == null) {
|
||||
break missingId;
|
||||
}
|
||||
|
||||
id = R.id.splash_title;
|
||||
TextView splashTitle = ViewBindings.findChildViewById(rootView, id);
|
||||
if (splashTitle == null) {
|
||||
break missingId;
|
||||
}
|
||||
|
||||
return new ActivitySplashBinding((FrameLayout) rootView, splashLogo, splashTagline,
|
||||
splashTitle);
|
||||
}
|
||||
String missingId = rootView.getResources().getResourceName(id);
|
||||
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
/**
|
||||
* Automatically generated file. DO NOT MODIFY
|
||||
*/
|
||||
package com.streamflix.tv;
|
||||
|
||||
public final class BuildConfig {
|
||||
public static final boolean DEBUG = Boolean.parseBoolean("true");
|
||||
public static final String APPLICATION_ID = "com.streamflix.tv";
|
||||
public static final String BUILD_TYPE = "debug";
|
||||
public static final int VERSION_CODE = 4;
|
||||
public static final String VERSION_NAME = "1.3.1";
|
||||
// Field from default config.
|
||||
public static final String API_BASE_URL = "https://nf.khoavo.myds.me";
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"compiler-5.0.5.jar (com.github.bumptech.glide:compiler:5.0.5)":"INCREMENTAL_AP"}
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
#- File Locator -
|
||||
listingFile=../../../../outputs/apk/debug/output-metadata.json
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
appMetadataVersion=1.1
|
||||
androidGradlePluginVersion=8.13.2
|
||||
Binary file not shown.
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"version": 3,
|
||||
"artifactType": {
|
||||
"type": "COMPATIBLE_SCREEN_MANIFEST",
|
||||
"kind": "Directory"
|
||||
},
|
||||
"applicationId": "com.streamflix.tv",
|
||||
"variantName": "debug",
|
||||
"elements": []
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_details" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_details.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/details_fragment"><Targets><Target id="@+id/details_fragment" tag="layout/activity_details_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/main_browse_fragment"><Targets><Target id="@+id/main_browse_fragment" tag="layout/activity_main_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_playback" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_playback.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/playback_fragment"><Targets><Target id="@+id/playback_fragment" tag="layout/activity_playback_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="51"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_search" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_search.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/search_fragment"><Targets><Target id="@+id/search_fragment" tag="layout/activity_search_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_splash" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_splash.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout"><Targets><Target tag="layout/activity_splash_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="44" endOffset="13"/></Target><Target id="@+id/splash_logo" view="ImageView"><Expressions/><location startLine="14" startOffset="8" endLine="19" endOffset="58"/></Target><Target id="@+id/splash_title" view="TextView"><Expressions/><location startLine="22" startOffset="8" endLine="30" endOffset="52"/></Target><Target id="@+id/splash_tagline" view="TextView"><Expressions/><location startLine="33" startOffset="8" endLine="40" endOffset="37"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_details" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_details.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/details_fragment"><Targets><Target id="@+id/details_fragment" tag="layout/activity_details_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/main_browse_fragment"><Targets><Target id="@+id/main_browse_fragment" tag="layout/activity_main_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_playback" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_playback.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/playback_fragment"><Targets><Target id="@+id/playback_fragment" tag="layout/activity_playback_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="51"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_search" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_search.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout" rootNodeViewId="@+id/search_fragment"><Targets><Target id="@+id/search_fragment" tag="layout/activity_search_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="5" endOffset="44"/></Target></Targets></Layout>
|
||||
|
|
@ -1 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_splash" modulePackage="com.streamflix.tv" filePath="app\src\main\res\layout\activity_splash.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.FrameLayout"><Targets><Target tag="layout/activity_splash_0" view="FrameLayout"><Expressions/><location startLine="1" startOffset="0" endLine="44" endOffset="13"/></Target><Target id="@+id/splash_logo" view="ImageView"><Expressions/><location startLine="14" startOffset="8" endLine="19" endOffset="58"/></Target><Target id="@+id/splash_title" view="TextView"><Expressions/><location startLine="22" startOffset="8" endLine="30" endOffset="52"/></Target><Target id="@+id/splash_tagline" view="TextView"><Expressions/><location startLine="33" startOffset="8" endLine="40" endOffset="37"/></Target></Targets></Layout>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
6
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":74,"crc":1112998917},{"key":"retrofit2/converter/gson/GsonRequestBodyConverter.class","name":"retrofit2/converter/gson/GsonRequestBodyConverter.class","size":3131,"crc":50547565},{"key":"retrofit2/converter/gson/GsonStreamingRequestBody.class","name":"retrofit2/converter/gson/GsonStreamingRequestBody.class","size":1512,"crc":-1861492101},{"key":"retrofit2/converter/gson/GsonConverterFactory.class","name":"retrofit2/converter/gson/GsonConverterFactory.class","size":2717,"crc":-1519560118},{"key":"retrofit2/converter/gson/package-info.class","name":"retrofit2/converter/gson/package-info.class","size":213,"crc":-992403999},{"key":"retrofit2/converter/gson/GsonResponseBodyConverter.class","name":"retrofit2/converter/gson/GsonResponseBodyConverter.class","size":2238,"crc":1302674763}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/viewbinding/ViewBinding.class","name":"androidx/viewbinding/ViewBinding.class","size":240,"crc":-1218689533},{"key":"androidx/viewbinding/ViewBindings.class","name":"androidx/viewbinding/ViewBindings.class","size":1150,"crc":2001315322},{"key":"META-INF/androidx.databinding_viewbinding.version","name":"META-INF/androidx.databinding_viewbinding.version","size":6,"crc":-1972360793}]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/androidx.activity_activity-ktx.version","name":"META-INF/androidx.activity_activity-ktx.version","size":7,"crc":1472946759}]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/versionedparcelable/CustomVersionedParcelable.class","name":"androidx/versionedparcelable/CustomVersionedParcelable.class","size":915,"crc":-363159068},{"key":"androidx/versionedparcelable/NonParcelField.class","name":"androidx/versionedparcelable/NonParcelField.class","size":676,"crc":1361393714},{"key":"androidx/versionedparcelable/ParcelField.class","name":"androidx/versionedparcelable/ParcelField.class","size":762,"crc":-355164638},{"key":"androidx/versionedparcelable/ParcelImpl$1.class","name":"androidx/versionedparcelable/ParcelImpl$1.class","size":1191,"crc":-60532325},{"key":"androidx/versionedparcelable/ParcelImpl.class","name":"androidx/versionedparcelable/ParcelImpl.class","size":1979,"crc":1919067054},{"key":"androidx/versionedparcelable/ParcelUtils.class","name":"androidx/versionedparcelable/ParcelUtils.class","size":5523,"crc":-1129855369},{"key":"androidx/versionedparcelable/VersionedParcel$1.class","name":"androidx/versionedparcelable/VersionedParcel$1.class","size":1546,"crc":-1038307129},{"key":"androidx/versionedparcelable/VersionedParcel$ParcelException.class","name":"androidx/versionedparcelable/VersionedParcel$ParcelException.class","size":538,"crc":1830934000},{"key":"androidx/versionedparcelable/VersionedParcel.class","name":"androidx/versionedparcelable/VersionedParcel.class","size":29325,"crc":142272959},{"key":"androidx/versionedparcelable/VersionedParcelParcel.class","name":"androidx/versionedparcelable/VersionedParcelParcel.class","size":7429,"crc":-328586236},{"key":"androidx/versionedparcelable/VersionedParcelStream$1.class","name":"androidx/versionedparcelable/VersionedParcelStream$1.class","size":1613,"crc":1775874054},{"key":"androidx/versionedparcelable/VersionedParcelStream$FieldBuffer.class","name":"androidx/versionedparcelable/VersionedParcelStream$FieldBuffer.class","size":1288,"crc":1505456534},{"key":"androidx/versionedparcelable/VersionedParcelStream.class","name":"androidx/versionedparcelable/VersionedParcelStream.class","size":13823,"crc":-1859752855},{"key":"androidx/versionedparcelable/VersionedParcelable.class","name":"androidx/versionedparcelable/VersionedParcelable.class","size":148,"crc":752656910},{"key":"androidx/versionedparcelable/VersionedParcelize.class","name":"androidx/versionedparcelable/VersionedParcelize.class","size":964,"crc":886842821},{"key":"META-INF/androidx.versionedparcelable_versionedparcelable.version","name":"META-INF/androidx.versionedparcelable_versionedparcelable.version","size":6,"crc":1557790284}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/customview/poolingcontainer/PoolingContainer.class","name":"androidx/customview/poolingcontainer/PoolingContainer.class","size":5411,"crc":1218352752},{"key":"androidx/customview/poolingcontainer/PoolingContainerListener.class","name":"androidx/customview/poolingcontainer/PoolingContainerListener.class","size":572,"crc":1704627172},{"key":"androidx/customview/poolingcontainer/PoolingContainerListenerHolder.class","name":"androidx/customview/poolingcontainer/PoolingContainerListenerHolder.class","size":2033,"crc":-1869864933},{"key":"META-INF/androidx.customview_customview-poolingcontainer.version","name":"META-INF/androidx.customview_customview-poolingcontainer.version","size":6,"crc":-42031000},{"key":"META-INF/customview-poolingcontainer_release.kotlin_module","name":"META-INF/customview-poolingcontainer_release.kotlin_module","size":82,"crc":-469476031}]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":108,"crc":1316044605},{"key":"META-INF/maven/com.google.guava/listenablefuture/pom.xml","name":"META-INF/maven/com.google.guava/listenablefuture/pom.xml","size":2278,"crc":-995907463},{"key":"META-INF/maven/com.google.guava/listenablefuture/pom.properties","name":"META-INF/maven/com.google.guava/listenablefuture/pom.properties","size":134,"crc":-629924229}]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/media3/ui/leanback/LeanbackPlayerAdapter$1.class","name":"androidx/media3/ui/leanback/LeanbackPlayerAdapter$1.class","size":267,"crc":-168594287},{"key":"androidx/media3/ui/leanback/LeanbackPlayerAdapter$PlayerListener.class","name":"androidx/media3/ui/leanback/LeanbackPlayerAdapter$PlayerListener.class","size":5107,"crc":-530037801},{"key":"androidx/media3/ui/leanback/LeanbackPlayerAdapter.class","name":"androidx/media3/ui/leanback/LeanbackPlayerAdapter.class","size":6590,"crc":-2009215651},{"key":"androidx/media3/ui/leanback/package-info.class","name":"androidx/media3/ui/leanback/package-info.class","size":218,"crc":823644272}]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/androidx.lifecycle_lifecycle-livedata-core-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-livedata-core-ktx.version","size":7,"crc":-31665453}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":25,"crc":-301826126},{"key":"androidx/arch/core/internal/FastSafeIterableMap.class","name":"androidx/arch/core/internal/FastSafeIterableMap.class","size":2907,"crc":2116950419},{"key":"androidx/arch/core/internal/SafeIterableMap$AscendingIterator.class","name":"androidx/arch/core/internal/SafeIterableMap$AscendingIterator.class","size":1775,"crc":-347866117},{"key":"androidx/arch/core/internal/SafeIterableMap$DescendingIterator.class","name":"androidx/arch/core/internal/SafeIterableMap$DescendingIterator.class","size":1779,"crc":1644932214},{"key":"androidx/arch/core/internal/SafeIterableMap$Entry.class","name":"androidx/arch/core/internal/SafeIterableMap$Entry.class","size":2378,"crc":1824924906},{"key":"androidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions.class","name":"androidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions.class","size":2551,"crc":1452189535},{"key":"androidx/arch/core/internal/SafeIterableMap$ListIterator.class","name":"androidx/arch/core/internal/SafeIterableMap$ListIterator.class","size":2977,"crc":-1002357144},{"key":"androidx/arch/core/internal/SafeIterableMap$SupportRemove.class","name":"androidx/arch/core/internal/SafeIterableMap$SupportRemove.class","size":1208,"crc":1494321347},{"key":"androidx/arch/core/internal/SafeIterableMap.class","name":"androidx/arch/core/internal/SafeIterableMap.class","size":7303,"crc":1636361416},{"key":"androidx/arch/core/util/Function.class","name":"androidx/arch/core/util/Function.class","size":280,"crc":896912248}]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":659,"crc":-964657996},{"key":"META-INF/versions/9/OSGI-INF/MANIFEST.MF","name":"META-INF/versions/9/OSGI-INF/MANIFEST.MF","size":145,"crc":-2032555199},{"key":"META-INF/versions/9/module-info.class","name":"META-INF/versions/9/module-info.class","size":187,"crc":-1570101292},{"key":"org/jspecify/annotations/NonNull.class","name":"org/jspecify/annotations/NonNull.class","size":434,"crc":247355667},{"key":"org/jspecify/annotations/NullMarked.class","name":"org/jspecify/annotations/NullMarked.class","size":498,"crc":-1397769612},{"key":"org/jspecify/annotations/NullUnmarked.class","name":"org/jspecify/annotations/NullUnmarked.class","size":488,"crc":1023765034},{"key":"org/jspecify/annotations/Nullable.class","name":"org/jspecify/annotations/Nullable.class","size":436,"crc":-794114223}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/androidx.lifecycle_lifecycle-livedata-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-livedata-ktx.version","size":7,"crc":-31665453}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/lifecycle/EmptyActivityLifecycleCallbacks.class","name":"androidx/lifecycle/EmptyActivityLifecycleCallbacks.class","size":2171,"crc":-1399262857},{"key":"androidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback.class","name":"androidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback.class","size":1649,"crc":-708890786},{"key":"androidx/lifecycle/LifecycleDispatcher.class","name":"androidx/lifecycle/LifecycleDispatcher.class","size":1966,"crc":-1443050188},{"key":"androidx/lifecycle/ProcessLifecycleInitializer.class","name":"androidx/lifecycle/ProcessLifecycleInitializer.class","size":3086,"crc":101263685},{"key":"androidx/lifecycle/ProcessLifecycleOwner$Api29Impl.class","name":"androidx/lifecycle/ProcessLifecycleOwner$Api29Impl.class","size":1687,"crc":-799258046},{"key":"androidx/lifecycle/ProcessLifecycleOwner$Companion.class","name":"androidx/lifecycle/ProcessLifecycleOwner$Companion.class","size":2005,"crc":171627555},{"key":"androidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1.class","name":"androidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1.class","size":1626,"crc":695325623},{"key":"androidx/lifecycle/ProcessLifecycleOwner$attach$1.class","name":"androidx/lifecycle/ProcessLifecycleOwner$attach$1.class","size":3186,"crc":-1170646171},{"key":"androidx/lifecycle/ProcessLifecycleOwner$initializationListener$1.class","name":"androidx/lifecycle/ProcessLifecycleOwner$initializationListener$1.class","size":1420,"crc":-238222058},{"key":"androidx/lifecycle/ProcessLifecycleOwner.class","name":"androidx/lifecycle/ProcessLifecycleOwner.class","size":6450,"crc":-1311709577},{"key":"META-INF/androidx.lifecycle_lifecycle-process.version","name":"META-INF/androidx.lifecycle_lifecycle-process.version","size":7,"crc":-31665453},{"key":"META-INF/lifecycle-process.kotlin_module","name":"META-INF/lifecycle-process.kotlin_module","size":24,"crc":-813369971}]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/exifinterface/media/ExifInterface$ExifAttribute.class","name":"androidx/exifinterface/media/ExifInterface$ExifAttribute.class","size":11514,"crc":-1972981072},{"key":"androidx/exifinterface/media/ExifInterface$IfdType.class","name":"androidx/exifinterface/media/ExifInterface$IfdType.class","size":644,"crc":-543493763},{"key":"androidx/exifinterface/media/ExifInterface$SeekableByteOrderedDataInputStream.class","name":"androidx/exifinterface/media/ExifInterface$SeekableByteOrderedDataInputStream.class","size":1531,"crc":-102911797},{"key":"androidx/exifinterface/media/ExifInterface$ExifTag.class","name":"androidx/exifinterface/media/ExifInterface$ExifTag.class","size":1128,"crc":-131589075},{"key":"androidx/exifinterface/media/ExifInterface$ExifStreamType.class","name":"androidx/exifinterface/media/ExifInterface$ExifStreamType.class","size":658,"crc":1489799236},{"key":"androidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream.class","name":"androidx/exifinterface/media/ExifInterface$ByteOrderedDataInputStream.class","size":6226,"crc":-1399089460},{"key":"androidx/exifinterface/media/ExifInterfaceUtils$Api23Impl.class","name":"androidx/exifinterface/media/ExifInterfaceUtils$Api23Impl.class","size":953,"crc":1528261698},{"key":"androidx/exifinterface/media/ExifInterface$ByteOrderedDataOutputStream.class","name":"androidx/exifinterface/media/ExifInterface$ByteOrderedDataOutputStream.class","size":2160,"crc":-435607009},{"key":"androidx/exifinterface/media/ExifInterfaceUtils.class","name":"androidx/exifinterface/media/ExifInterfaceUtils.class","size":4067,"crc":1301954974},{"key":"androidx/exifinterface/media/ExifInterface$Rational.class","name":"androidx/exifinterface/media/ExifInterface$Rational.class","size":1111,"crc":265595959},{"key":"META-INF/androidx.exifinterface_exifinterface.version","name":"META-INF/androidx.exifinterface_exifinterface.version","size":6,"crc":-1181638656},{"key":"androidx/exifinterface/media/ExifInterfaceUtils$Api21Impl.class","name":"androidx/exifinterface/media/ExifInterfaceUtils$Api21Impl.class","size":1173,"crc":-525432444},{"key":"androidx/exifinterface/media/ExifInterface$1.class","name":"androidx/exifinterface/media/ExifInterface$1.class","size":1788,"crc":1291903503},{"key":"androidx/exifinterface/media/ExifInterface.class","name":"androidx/exifinterface/media/ExifInterface.class","size":97867,"crc":-909828340}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/androidx.lifecycle_lifecycle-runtime-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-runtime-ktx.version","size":7,"crc":-31665453}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/cursoradapter/widget/CursorAdapter$ChangeObserver.class","name":"androidx/cursoradapter/widget/CursorAdapter$ChangeObserver.class","size":906,"crc":1405634495},{"key":"androidx/cursoradapter/widget/CursorAdapter$MyDataSetObserver.class","name":"androidx/cursoradapter/widget/CursorAdapter$MyDataSetObserver.class","size":896,"crc":-2032476167},{"key":"androidx/cursoradapter/widget/CursorAdapter.class","name":"androidx/cursoradapter/widget/CursorAdapter.class","size":7375,"crc":-1905321896},{"key":"androidx/cursoradapter/widget/CursorFilter$CursorFilterClient.class","name":"androidx/cursoradapter/widget/CursorFilter$CursorFilterClient.class","size":529,"crc":75882292},{"key":"androidx/cursoradapter/widget/CursorFilter.class","name":"androidx/cursoradapter/widget/CursorFilter.class","size":1945,"crc":-1461045051},{"key":"androidx/cursoradapter/widget/ResourceCursorAdapter.class","name":"androidx/cursoradapter/widget/ResourceCursorAdapter.class","size":2230,"crc":-600492707},{"key":"androidx/cursoradapter/widget/SimpleCursorAdapter$CursorToStringConverter.class","name":"androidx/cursoradapter/widget/SimpleCursorAdapter$CursorToStringConverter.class","size":365,"crc":-1150005494},{"key":"androidx/cursoradapter/widget/SimpleCursorAdapter$ViewBinder.class","name":"androidx/cursoradapter/widget/SimpleCursorAdapter$ViewBinder.class","size":333,"crc":-681646708},{"key":"androidx/cursoradapter/widget/SimpleCursorAdapter.class","name":"androidx/cursoradapter/widget/SimpleCursorAdapter.class","size":6154,"crc":1577064075},{"key":"META-INF/androidx.cursoradapter_cursoradapter.version","name":"META-INF/androidx.cursoradapter_cursoradapter.version","size":6,"crc":-42031000}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/arch/core/executor/ArchTaskExecutor.class","name":"androidx/arch/core/executor/ArchTaskExecutor.class","size":2950,"crc":-173664277},{"key":"androidx/arch/core/executor/DefaultTaskExecutor$1.class","name":"androidx/arch/core/executor/DefaultTaskExecutor$1.class","size":1445,"crc":-1550744660},{"key":"androidx/arch/core/executor/DefaultTaskExecutor$Api28Impl.class","name":"androidx/arch/core/executor/DefaultTaskExecutor$Api28Impl.class","size":834,"crc":1774766260},{"key":"androidx/arch/core/executor/DefaultTaskExecutor.class","name":"androidx/arch/core/executor/DefaultTaskExecutor.class","size":3293,"crc":-1256626107},{"key":"androidx/arch/core/executor/TaskExecutor.class","name":"androidx/arch/core/executor/TaskExecutor.class","size":1053,"crc":1399542030},{"key":"META-INF/androidx.arch.core_core-runtime.version","name":"META-INF/androidx.arch.core_core-runtime.version","size":67,"crc":1307063212}]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/customview/view/AbsSavedState$1.class","name":"androidx/customview/view/AbsSavedState$1.class","size":448,"crc":-314667774},{"key":"androidx/customview/view/AbsSavedState$2.class","name":"androidx/customview/view/AbsSavedState$2.class","size":1906,"crc":1283830698},{"key":"androidx/customview/view/AbsSavedState.class","name":"androidx/customview/view/AbsSavedState.class","size":2502,"crc":-779574498},{"key":"androidx/customview/widget/ExploreByTouchHelper$1.class","name":"androidx/customview/widget/ExploreByTouchHelper$1.class","size":1298,"crc":180507148},{"key":"androidx/customview/widget/ExploreByTouchHelper$2.class","name":"androidx/customview/widget/ExploreByTouchHelper$2.class","size":2100,"crc":-1919224779},{"key":"androidx/customview/widget/ExploreByTouchHelper$MyNodeProvider.class","name":"androidx/customview/widget/ExploreByTouchHelper$MyNodeProvider.class","size":1692,"crc":-102436609},{"key":"androidx/customview/widget/ExploreByTouchHelper.class","name":"androidx/customview/widget/ExploreByTouchHelper.class","size":18430,"crc":-1927369275},{"key":"androidx/customview/widget/FocusStrategy$BoundsAdapter.class","name":"androidx/customview/widget/FocusStrategy$BoundsAdapter.class","size":414,"crc":284941525},{"key":"androidx/customview/widget/FocusStrategy$CollectionAdapter.class","name":"androidx/customview/widget/FocusStrategy$CollectionAdapter.class","size":464,"crc":2038458753},{"key":"androidx/customview/widget/FocusStrategy$SequentialComparator.class","name":"androidx/customview/widget/FocusStrategy$SequentialComparator.class","size":2078,"crc":-375256635},{"key":"androidx/customview/widget/FocusStrategy.class","name":"androidx/customview/widget/FocusStrategy.class","size":8306,"crc":377655966},{"key":"androidx/customview/widget/ViewDragHelper$1.class","name":"androidx/customview/widget/ViewDragHelper$1.class","size":594,"crc":-1020873541},{"key":"androidx/customview/widget/ViewDragHelper$2.class","name":"androidx/customview/widget/ViewDragHelper$2.class","size":701,"crc":-592993749},{"key":"androidx/customview/widget/ViewDragHelper$Callback.class","name":"androidx/customview/widget/ViewDragHelper$Callback.class","size":2264,"crc":632691688},{"key":"androidx/customview/widget/ViewDragHelper.class","name":"androidx/customview/widget/ViewDragHelper.class","size":21899,"crc":-1974724746},{"key":"META-INF/androidx.customview_customview.version","name":"META-INF/androidx.customview_customview.version","size":6,"crc":-42031000}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/lifecycle/AbstractSavedStateViewModelFactory.class","name":"androidx/lifecycle/AbstractSavedStateViewModelFactory.class","size":6471,"crc":-2097998406},{"key":"androidx/lifecycle/LegacySavedStateHandleController$OnRecreation.class","name":"androidx/lifecycle/LegacySavedStateHandleController$OnRecreation.class","size":3259,"crc":-2029530684},{"key":"androidx/lifecycle/LegacySavedStateHandleController$tryToAddRecreator$1.class","name":"androidx/lifecycle/LegacySavedStateHandleController$tryToAddRecreator$1.class","size":2119,"crc":513061945},{"key":"androidx/lifecycle/LegacySavedStateHandleController.class","name":"androidx/lifecycle/LegacySavedStateHandleController.class","size":4255,"crc":-653620005},{"key":"androidx/lifecycle/SavedStateHandle$Companion.class","name":"androidx/lifecycle/SavedStateHandle$Companion.class","size":3469,"crc":-874916359},{"key":"androidx/lifecycle/SavedStateHandle$SavingStateLiveData.class","name":"androidx/lifecycle/SavedStateHandle$SavingStateLiveData.class","size":2419,"crc":-1181677572},{"key":"androidx/lifecycle/SavedStateHandle.class","name":"androidx/lifecycle/SavedStateHandle.class","size":10604,"crc":1187570877},{"key":"androidx/lifecycle/SavedStateHandleAttacher.class","name":"androidx/lifecycle/SavedStateHandleAttacher.class","size":2888,"crc":-615893069},{"key":"androidx/lifecycle/SavedStateHandleController.class","name":"androidx/lifecycle/SavedStateHandleController.class","size":4093,"crc":-203426938},{"key":"androidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1.class","name":"androidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1.class","size":1749,"crc":1696093380},{"key":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$1.class","name":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$1.class","size":1631,"crc":-1502300643},{"key":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$2.class","name":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$2.class","size":1626,"crc":391374074},{"key":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3.class","name":"androidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3.class","size":1605,"crc":-478930910},{"key":"androidx/lifecycle/SavedStateHandleSupport.class","name":"androidx/lifecycle/SavedStateHandleSupport.class","size":9586,"crc":457204076},{"key":"androidx/lifecycle/SavedStateHandle_androidKt.class","name":"androidx/lifecycle/SavedStateHandle_androidKt.class","size":1060,"crc":826534814},{"key":"androidx/lifecycle/SavedStateHandlesProvider.class","name":"androidx/lifecycle/SavedStateHandlesProvider.class","size":13047,"crc":1510513424},{"key":"androidx/lifecycle/SavedStateHandlesVM.class","name":"androidx/lifecycle/SavedStateHandlesVM.class","size":1199,"crc":535657692},{"key":"androidx/lifecycle/SavedStateViewModelFactory.class","name":"androidx/lifecycle/SavedStateViewModelFactory.class","size":9486,"crc":61427297},{"key":"androidx/lifecycle/SavedStateViewModelFactory_androidKt.class","name":"androidx/lifecycle/SavedStateViewModelFactory_androidKt.class","size":5046,"crc":-55354603},{"key":"androidx/lifecycle/internal/CanonicalName_jvmKt.class","name":"androidx/lifecycle/internal/CanonicalName_jvmKt.class","size":977,"crc":-1324123031},{"key":"androidx/lifecycle/internal/SavedStateHandleImpl.class","name":"androidx/lifecycle/internal/SavedStateHandleImpl.class","size":12697,"crc":-646202532},{"key":"androidx/lifecycle/internal/SavedStateHandleImpl_androidKt.class","name":"androidx/lifecycle/internal/SavedStateHandleImpl_androidKt.class","size":3636,"crc":245007066},{"key":"androidx/lifecycle/serialization/SavedStateHandleDelegate$UNINITIALIZED.class","name":"androidx/lifecycle/serialization/SavedStateHandleDelegate$UNINITIALIZED.class","size":899,"crc":1365410170},{"key":"androidx/lifecycle/serialization/SavedStateHandleDelegate.class","name":"androidx/lifecycle/serialization/SavedStateHandleDelegate.class","size":10527,"crc":1420152918},{"key":"androidx/lifecycle/serialization/SavedStateHandleDelegateKt.class","name":"androidx/lifecycle/serialization/SavedStateHandleDelegateKt.class","size":5394,"crc":-1759908637},{"key":"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version","name":"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version","size":7,"crc":-31665453},{"key":"META-INF/lifecycle-viewmodel-savedstate.kotlin_module","name":"META-INF/lifecycle-viewmodel-savedstate.kotlin_module","size":285,"crc":-792748792}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":25,"crc":-301826126},{"key":"com/bumptech/glide/annotation/GlideType.class","name":"com/bumptech/glide/annotation/GlideType.class","size":474,"crc":1846717252},{"key":"com/bumptech/glide/annotation/GlideExtension.class","name":"com/bumptech/glide/annotation/GlideExtension.class","size":407,"crc":-1257746846},{"key":"com/bumptech/glide/annotation/compiler/Index.class","name":"com/bumptech/glide/annotation/compiler/Index.class","size":499,"crc":1598067763},{"key":"com/bumptech/glide/annotation/GlideModule.class","name":"com/bumptech/glide/annotation/GlideModule.class","size":484,"crc":-1383570174},{"key":"com/bumptech/glide/annotation/GlideOption.class","name":"com/bumptech/glide/annotation/GlideOption.class","size":736,"crc":485057058},{"key":"com/bumptech/glide/annotation/Excludes.class","name":"com/bumptech/glide/annotation/Excludes.class","size":474,"crc":1790838999},{"key":"com/bumptech/glide/annotation/ksp/Index.class","name":"com/bumptech/glide/annotation/ksp/Index.class","size":464,"crc":-2104822793}]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
[{"key":"com/bumptech/glide/disklrucache/DiskLruCache$1.class","name":"com/bumptech/glide/disklrucache/DiskLruCache$1.class","size":1416,"crc":-1257635136},{"key":"com/bumptech/glide/disklrucache/DiskLruCache$DiskLruCacheThreadFactory.class","name":"com/bumptech/glide/disklrucache/DiskLruCache$DiskLruCacheThreadFactory.class","size":1135,"crc":-733935037},{"key":"com/bumptech/glide/disklrucache/DiskLruCache$Editor.class","name":"com/bumptech/glide/disklrucache/DiskLruCache$Editor.class","size":4432,"crc":-1879488777},{"key":"com/bumptech/glide/disklrucache/DiskLruCache$Entry.class","name":"com/bumptech/glide/disklrucache/DiskLruCache$Entry.class","size":4902,"crc":619838234},{"key":"com/bumptech/glide/disklrucache/DiskLruCache$Value.class","name":"com/bumptech/glide/disklrucache/DiskLruCache$Value.class","size":2177,"crc":1484272157},{"key":"com/bumptech/glide/disklrucache/DiskLruCache.class","name":"com/bumptech/glide/disklrucache/DiskLruCache.class","size":17956,"crc":651434575},{"key":"com/bumptech/glide/disklrucache/StrictLineReader$1.class","name":"com/bumptech/glide/disklrucache/StrictLineReader$1.class","size":1310,"crc":597280324},{"key":"com/bumptech/glide/disklrucache/StrictLineReader.class","name":"com/bumptech/glide/disklrucache/StrictLineReader.class","size":3107,"crc":-1222019899},{"key":"com/bumptech/glide/disklrucache/Util.class","name":"com/bumptech/glide/disklrucache/Util.class","size":2289,"crc":1639064455}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":25,"crc":-301826126}]
|
||||
|
|
@ -1 +0,0 @@
|
|||
[{"key":"androidx/vectordrawable/graphics/drawable/AndroidResources.class","name":"androidx/vectordrawable/graphics/drawable/AndroidResources.class","size":5706,"crc":1287350711},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCommon.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCommon.class","size":3791,"crc":2019582470},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$1.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$1.class","size":292,"crc":1037327728},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VClipPath.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VClipPath.class","size":2913,"crc":-733943055},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VFullPath.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VFullPath.class","size":7405,"crc":1401512004},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VGroup.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VGroup.class","size":7629,"crc":273816671},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VObject.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VObject.class","size":980,"crc":2115850583},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VPath.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VPath.class","size":3993,"crc":231598598},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VPathRenderer.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VPathRenderer.class","size":9837,"crc":-149456955},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState.class","size":5239,"crc":700163772},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState.class","size":2106,"crc":532388453},{"key":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.class","name":"androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.class","size":22461,"crc":1680903575},{"key":"META-INF/androidx.vectordrawable_vectordrawable.version","name":"META-INF/androidx.vectordrawable_vectordrawable.version","size":6,"crc":1170394893}]
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue