Refactor: Full migration to Go backend and React TV-style frontend

This commit is contained in:
vndangkhoa 2026-02-01 18:40:56 +07:00
parent 908d6f05aa
commit cbfdd34253
1635 changed files with 8747 additions and 74151 deletions

0
.agent/workflows/test-android-tv.md Executable file → Normal file
View file

32
.dockerignore Normal file
View 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
View file

0
.github/workflows/release.yml vendored Executable file → Normal file
View file

0
.gitignore vendored Executable file → Normal file
View file

97
Dockerfile Executable file → Normal file
View 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
View file

@ -1,180 +1,62 @@
# StreamFlow - Premium Cinema Experience 🎬
# StreamFlow V2
[![Docker Image](https://img.shields.io/docker/v/vndangkhoa/streamflix?label=DockerHub&logo=docker)](https://hub.docker.com/r/vndangkhoa/streamflix)
[![GitHub](https://img.shields.io/github/v/release/vndangkhoa/Streamflow?label=GitHub&logo=github)](https://github.com/vndangkhoa/Streamflow)
[![Version](https://img.shields.io/badge/version-1.3.1-blue)](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

View file

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View file

@ -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

View file

@ -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>

View file

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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'
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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";
}

View file

@ -1 +0,0 @@
{"compiler-5.0.5.jar (com.github.bumptech.glide:compiler:5.0.5)":"INCREMENTAL_AP"}

View file

@ -1,2 +0,0 @@
#- File Locator -
listingFile=../../../../outputs/apk/debug/output-metadata.json

View file

@ -1,2 +0,0 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.13.2

View file

@ -1,10 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "com.streamflix.tv",
"variantName": "debug",
"elements": []
}

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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}]

View file

@ -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}]

View file

@ -1 +0,0 @@
[{"key":"META-INF/androidx.activity_activity-ktx.version","name":"META-INF/androidx.activity_activity-ktx.version","size":7,"crc":1472946759}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -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}]

View file

@ -1 +0,0 @@
[{"key":"META-INF/MANIFEST.MF","name":"META-INF/MANIFEST.MF","size":25,"crc":-301826126}]

View file

@ -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}]

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