Initial upload: immich-tv-viewer

This commit is contained in:
Abderrahim-Mouhcine
2026-08-16 19:57:59 +01:00
commit 613017c870
180 changed files with 11728 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
+45
View File
@@ -0,0 +1,45 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "924134a44c189315be2148659913dda1671cbe99"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: android
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: ios
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: linux
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: macos
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: web
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
- platform: windows
create_revision: 924134a44c189315be2148659913dda1671cbe99
base_revision: 924134a44c189315be2148659913dda1671cbe99
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
+11
View File
@@ -0,0 +1,11 @@
Place tes fichiers MP3 ici.
Exemples :
Music/chanson1.mp3
Music/chanson2.mp3
Le dossier est déclaré dans pubspec.yaml avec :
assets:
- Music/
Ne supprime pas ce dossier.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+17
View File
@@ -0,0 +1,17 @@
# immich_tv_viewer
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)
- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
+49
View File
@@ -0,0 +1,49 @@
# Immich TV Viewer - V1
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers inclus
- lib/main.dart
- android/app/src/main/AndroidManifest.xml
- android/app/src/main/res/xml/network_security_config.xml
## Avant de lancer
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API Immich locale.
L'URL serveur est déjà configurée :
```dart
const String immichBaseUrl = 'http://192.168.1.29:2283/api';
```
## Dépendance déjà ajoutée
Tu as déjà exécuté :
```powershell
flutter pub add http
```
## Test Windows
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d windows
```
## Test Google TV / Android TV
```powershell
flutter devices
flutter run -d TON_DEVICE_ANDROID
```
+50
View File
@@ -0,0 +1,50 @@
# Immich TV Viewer - V1.3 Photos Only
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés
- lib/main.dart
## Objectif de cette version
Cette version corrige le problème suivant :
- Les vidéos apparaissaient dans V1.2 mais ne se lisaient pas.
- Certaines personnes sans photo restaient visibles dans la grille.
## Changements
- Les vidéos sont exclues.
- La recherche utilise de nouveau `type: IMAGE`.
- L'écran principal affiche uniquement les personnes qui ont au moins une photo.
- Avant d'afficher une personne, l'app teste rapidement si Immich renvoie au moins une photo pour cette personne.
- Les photos d'une personne sont paginées.
- Les miniatures gardent le fallback :
1. `thumbnail?size=preview`
2. puis `thumbnail?size=thumbnail`
3. puis message clair si la miniature est indisponible.
## Attention
Le premier chargement est plus long, car l'app vérifie les personnes une par une par petits groupes.
C'est volontaire pour éviter d'afficher des personnes sans photos.
## Après extraction
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API Immich locale.
## Commande de test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+55
View File
@@ -0,0 +1,55 @@
# Immich TV Viewer - V1.4 Debug Tools
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- tools/immich_debug_person.ps1
- tools/immich_debug_people_sample.ps1
- README_V1_4_DEBUG_TOOLS.txt
## Changements dans l'app
- Affiche les 8 premiers caractères de l'ID personne sous chaque visage.
- Affiche aussi l'ID court dans le titre de l'écran photos.
- Ajoute des logs Flutter `IMMICH_DEBUG` dans la console quand on ouvre une personne et quand on charge les photos.
- Corrige la boucle de pagination photos pour ne pas refaire deux fois la même requête par page.
## Test manuel d'une personne précise
Dans PowerShell :
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
$env:IMMICH_KEY = "TA_CLE_API"
.\tools\immich_debug_person.ps1 -PersonId "ID_PERSONNE_ICI"
```
Le script crée :
- `debug_person_xxxxxxxx.json`
- `person_xxxxxxxx.jpg`
- `asset_preview_xxxxxxxx.jpg`
- `asset_thumb_xxxxxxxx.jpg`
## Test global rapide
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
$env:IMMICH_KEY = "TA_CLE_API"
.\tools\immich_debug_people_sample.ps1
```
Le script crée :
- `immich_people_photo_debug.csv`
## Lancer l'app
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+71
View File
@@ -0,0 +1,71 @@
# Immich TV Viewer - V1.5 Authenticated Images
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- tools/immich_debug_person.ps1
- tools/immich_debug_people_sample.ps1
- README_V1_5_AUTHENTICATED_IMAGES.txt
## Pourquoi cette version existe
Le test manuel PowerShell a prouvé que pour la personne :
8d3a46fe-5100-4785-bab6-b6fdf062fe69
Immich renvoie bien :
- 20 images sur la première page
- nextPage = 2
- une miniature preview valide
- une miniature thumbnail valide
Donc le problème n'est pas l'API Immich.
Le problème probable vient de l'affichage Flutter avec `Image.network`.
## Correction V1.5
- Remplacement de `Image.network` par un téléchargement manuel avec `http.get`.
- L'app envoie elle-même le header `x-api-key`.
- L'image est ensuite affichée via `Image.memory`.
- Ajout de logs `IMMICH_IMAGE_FETCH` dans la console Flutter :
- status HTTP
- taille en bytes
- URL testée
- Cache mémoire simple pour éviter de retélécharger la même image trop souvent.
## Après extraction
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API Immich locale.
## Commande de test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
## Ce qu'il faut regarder dans PowerShell
Quand tu cliques sur une personne, cherche :
```text
IMMICH_DEBUG selected person ...
IMMICH_DEBUG person=... page=1 rawItems=...
IMMICH_DEBUG person=... totalPhotos=...
IMMICH_IMAGE_FETCH status=200 bytes=...
```
Si `IMMICH_IMAGE_FETCH status=200 bytes=287000` apparaît mais rien ne s'affiche, alors le problème est le décodage image Flutter/TV.
Si `status=401`, c'est la clé API.
Si `status=404`, l'URL ou l'asset pose problème.
+71
View File
@@ -0,0 +1,71 @@
# Immich TV Viewer - V1.6 TV Select Fix
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- tools/immich_debug_person.ps1
- tools/immich_debug_people_sample.ps1
- README_V1_6_TV_SELECT_FIX.txt
## Diagnostic
Le test manuel PowerShell a montré que la personne :
8d3a46fe-5100-4785-bab6-b6fdf062fe69
renvoie bien 20 images sur la première page, avec miniatures valides.
Mais dans l'app, cliquer cette personne ne produit aucun log Flutter.
Donc `onPressed` n'est pas déclenché.
## Correction V1.6
Le composant `TvCard` ne dépend plus seulement de `InkWell`.
Il intercepte directement les touches TV :
- select
- enter
- numpadEnter
- space
- gameButtonA
- labels possibles : ok, center, select, enter
## Logs ajoutés
Quand une carte personne reçoit le focus :
```text
IMMICH_DEBUG focus person ...
```
Quand elle est activée :
```text
IMMICH_DEBUG activate person ...
IMMICH_DEBUG selected person ...
```
## Test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
Sur la Mi Box :
1. Va sur la carte `8d3a46fe`
2. Regarde si la console affiche `IMMICH_DEBUG focus person ...`
3. Appuie sur OK
4. Regarde si la console affiche `IMMICH_DEBUG activate person ...`
## Interprétation
- Si `focus` apparaît mais pas `activate` : touche OK non reconnue.
- Si ni `focus` ni `activate` n'apparaissent : la carte n'a pas le focus réel.
- Si `activate` apparaît mais pas `selected` : bug dans le callback.
- Si `selected` apparaît puis `rawItems=20` : l'écran photos doit s'ouvrir.
+37
View File
@@ -0,0 +1,37 @@
# Immich TV Viewer - V2.1 Auto Zapping
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés
- lib/main.dart
- README_V2_1_AUTO_ZAPPING.txt
## Nouvelle fonctionnalité
Dans la visionneuse photo :
- Si l'utilisateur reste sur une image pendant 1 minute sans action, le zapping automatique démarre.
- Une fois lancé, l'app passe automatiquement à la photo suivante toutes les 10 secondes.
- À la fin de la liste, le zapping revient à la première photo.
- Appuyer sur gauche, droite, OK, entrée ou retour coupe/réinitialise le zapping.
- Un indicateur `Zapping auto • 10s` apparaît en bas à gauche pendant le mode automatique.
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+39
View File
@@ -0,0 +1,39 @@
# Immich TV Viewer - V2.2 Surprends-moi
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés
- lib/main.dart
- README_V2_2_SURPRENDS_MOI.txt
## Nouvelle fonctionnalité
Ajout d'un menu gauche :
- Photos
- Explorer
- Surprends-moi
## Surprends-moi
Ce menu charge les photos, mélange la liste aléatoirement et lance un zapping automatique avec changement toutes les 10 secondes.
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+56
View File
@@ -0,0 +1,56 @@
# Immich TV Viewer - V2.3.1 Fix maxPages
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- android/app/src/main/kotlin/com/example/immich_tv_viewer/MainActivity.kt
- README_V2_3_1_FIX_MAXPAGES.txt
## Correction
Corrige l'erreur Dart :
```text
The argument type 'int?' can't be assigned to the parameter type 'int'
```
Cause :
- `getRandomTimelinePhotos({int? maxPages})`
- appelait `getAllTimelinePhotos(maxPages: maxPages)`
- mais `getAllTimelinePhotos` attendait encore un `int`
Correction :
- `getAllTimelinePhotos({int? maxPages})`
- si `maxPages == null`, l'app charge toutes les pages jusqu'à `nextPage == null`
## Fonctionnalités conservées
- Menu Photos
- Menu Explorer
- Menu Surprends-moi
- Zapping automatique après 1 minute dans la visionneuse
- Zapping aléatoire toutes les 10 secondes
- Écran gardé allumé via `FLAG_KEEP_SCREEN_ON`
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+30
View File
@@ -0,0 +1,30 @@
# Immich TV Viewer - V2.3.2 Fix maxPages call
Correction de compilation ligne 157.
## Fichiers modifiés
- lib/main.dart
## Correction
L'appel problématique :
```dart
getAllTimelinePhotos(maxPages: maxPages)
```
est remplacé par :
```dart
final photos = maxPages == null
? await getAllTimelinePhotos()
: await getAllTimelinePhotos(maxPages: maxPages);
```
## Test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+26
View File
@@ -0,0 +1,26 @@
# Immich TV Viewer - V2.3.3 Fix maxPages simple
Correction de compilation.
## Fichiers modifiés
- lib/main.dart
## Correction
`maxPages` n'est plus nullable.
Les fonctions utilisent maintenant :
```dart
int maxPages = 9999
```
Cela veut dire : charger toutes les pages disponibles jusqu'à ce qu'Immich renvoie `nextPage == null`.
## Test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+66
View File
@@ -0,0 +1,66 @@
# Immich TV Viewer - V2.3.4 Photos All Pages
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- tools/immich_count_all_photos.ps1
- android/app/src/main/kotlin/com/example/immich_tv_viewer/MainActivity.kt
- README_V2_3_4_PHOTOS_ALL_PAGES.txt
## Correction
La rubrique Photos était encore limitée à :
```dart
ImmichApi.getAllTimelinePhotos(maxPages: 8)
```
Donc elle affichait environ :
```text
8 pages × 250 = 2000 photos
```
Alors que Surprends-moi chargeait toutes les pages.
Maintenant :
```dart
ImmichApi.getAllTimelinePhotos()
```
est utilisé dans Photos et Surprends-moi.
## Résultat attendu
- Photos doit afficher le même ordre de grandeur que Surprends-moi
- Si Surprends-moi affiche 13000+, Photos doit afficher 13000+ aussi
## Script manuel pour compter les photos
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
$env:IMMICH_KEY = "TA_CLE_API"
powershell -ExecutionPolicy Bypass -File .\tools\immich_count_all_photos.ps1
```
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+62
View File
@@ -0,0 +1,62 @@
# Immich TV Viewer - V2.3 Keep Awake + Toutes les photos
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- android/app/src/main/kotlin/com/example/immich_tv_viewer/MainActivity.kt
- README_V2_3_KEEP_AWAKE_ALL_PHOTOS.txt
## Corrections
### 1. Écran de veille Mi Box / Google TV
Ajout de `FLAG_KEEP_SCREEN_ON` dans `MainActivity.kt`.
Résultat :
- l'écran de veille ne devrait plus se déclencher pendant l'application
- utile pendant le zapping automatique
- pas besoin d'ajouter un package Flutter
### 2. Nombre de photos incohérent
Avant :
- Photos chargeait environ 2000 photos
- Surprends-moi chargeait environ 3000 photos
Cause :
- Photos utilisait `maxPages: 8`
- Surprends-moi utilisait `maxPages: 12`
Correction :
- Les deux modes chargent maintenant toutes les pages jusqu'à `nextPage == null`
- Le nombre affiché doit donc être cohérent entre Photos et Surprends-moi
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
## Note
Le chargement initial peut être plus long si ta bibliothèque contient beaucoup de photos.
C'est normal : cette version cherche le total réel en parcourant toutes les pages.
+66
View File
@@ -0,0 +1,66 @@
# Immich TV Viewer - V2.4.1 Fix Music Manifest
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés
- lib/main.dart
- pubspec.yaml
- README_V2_4_1_FIX_MUSIC_MANIFEST.txt
## Correction
La V2.4 cherchait les musiques via :
```dart
rootBundle.loadString('AssetManifest.json')
```
Sur ta version Flutter / Android TV, ce fichier n'est pas disponible comme asset texte :
```text
Unable to load asset: "AssetManifest.json"
```
La V2.4.1 utilise maintenant l'API moderne Flutter :
```dart
AssetManifest.loadFromAssetBundle(rootBundle)
```
## Résultat attendu
Au lancement de la visionneuse photo ou de Surprends-moi, tu dois voir :
```text
IMMICH_MUSIC found X tracks
IMMICH_MUSIC play Music/nom_du_fichier.mp3
```
## Vérification du dossier Music
Tes fichiers doivent être ici :
```text
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer\Music
```
Exemples :
```text
Music\track01.mp3
Music\track02.mp3
```
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
`flutter clean` est important ici, parce que les assets audio doivent être réembarqués dans l'APK.
+88
View File
@@ -0,0 +1,88 @@
# Immich TV Viewer - V2.4 Musique aléatoire
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés / ajoutés
- lib/main.dart
- pubspec.yaml
- Music/README_PLACE_MP3_HERE.txt
- README_V2_4_RANDOM_MUSIC.txt
## Nouvelle fonctionnalité
La visionneuse photo lance une musique de fond aléatoire à partir du dossier :
```text
Music/
```
Formats acceptés par le filtre de l'app :
- .mp3
- .m4a
- .aac
- .wav
- .ogg
## Fonctionnement
- Quand tu ouvres une photo en plein écran, la musique démarre.
- Pendant Surprends-moi, la musique démarre aussi automatiquement.
- Quand un morceau finit, un autre morceau est choisi aléatoirement.
- Quand tu quittes la visionneuse photo, la musique s'arrête.
## Important : fichiers MP3
Tes fichiers doivent être dans :
```text
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer\Music
```
Exemple :
```text
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer\Music\track01.mp3
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer\Music\track02.mp3
```
## Pubspec
Cette version ajoute :
```yaml
dependencies:
just_audio: ^0.9.42
flutter:
assets:
- Music/
```
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Logs utiles
Dans PowerShell, tu peux voir :
```text
IMMICH_MUSIC found X tracks
IMMICH_MUSIC play Music/nom_du_fichier.mp3
```
Si tu vois :
```text
IMMICH_MUSIC no music files found in Music/
```
alors les fichiers ne sont pas inclus dans le build, ou le dossier n'est pas déclaré dans `pubspec.yaml`.
@@ -0,0 +1,81 @@
# Immich TV Viewer - V2.5.1 Glass Overlay + Location Fix
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.5.
## Fichiers modifiés
- lib/main.dart
- README_V2_5_1_GLASS_OVERLAY_LOCATION_FIX.txt
## Corrections
### 1. Lieu de la photo
Avant, l'overlay utilisait principalement les données renvoyées par `/search/metadata`.
Cet endpoint ne contient pas toujours les détails EXIF complets.
Maintenant, pour l'overlay, l'app appelle :
```text
/api/assets/{assetId}
```
et lit :
```text
exifInfo.city
exifInfo.state
exifInfo.country
exifInfo.latitude
exifInfo.longitude
```
Si ville/région/pays sont absents mais que les coordonnées GPS existent, l'app affiche :
```text
GPS 48.8566, 2.3522
```
Si rien n'est disponible :
```text
Lieu inconnu
```
### 2. Overlay plus discret
L'overlay est maintenant :
- plus petit
- placé en bas à gauche
- transparent
- style glass / brillant
- fond flouté via `BackdropFilter`
- disparition douce après 3 secondes
## Logs utiles
Dans PowerShell :
```text
IMMICH_LOCATION asset=... location="..." date="..."
```
Si le log affiche toujours `Lieu inconnu`, alors Immich ne renvoie pas de ville/GPS pour cette photo dans `/api/assets/{id}`.
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
Ne pas oublier de remettre ta clé API dans `lib/main.dart` si le fichier est remplacé.
+66
View File
@@ -0,0 +1,66 @@
# Immich TV Viewer - V2.5 Overlay date + position
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.4.1 validée :
- Photos OK
- Explorer OK
- Surprends-moi OK
- Zapping auto OK
- Écran gardé allumé OK
- Musique aléatoire OK
## Fichiers modifiés
- lib/main.dart
- README_V2_5_OVERLAY_DATE_POSITION.txt
## Nouvelle fonctionnalité
Dans la visionneuse photo :
- affichage d'un overlay avec :
- position de la photo : ville, région, pays si disponibles
- date de la photo
- l'overlay reste visible 3 secondes
- puis il disparaît doucement
- l'overlay réapparaît à chaque changement de photo
## Suppression
L'affichage fixe du bas a été retiré :
- compteur `42 / 13865`
- badge `Zapping auto • 10s`
- nom du fichier photo
## Remarques
La position dépend des données EXIF / géolocalisation renvoyées par Immich.
Si Immich ne renvoie pas de ville/région/pays, l'app affiche :
```text
Lieu inconnu
```
Si la date est absente, l'app affiche :
```text
Date inconnue
```
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
Ne pas oublier de remettre ta clé API dans `lib/main.dart` si le fichier est remplacé.
+72
View File
@@ -0,0 +1,72 @@
# Immich TV Viewer - V2.6.1 Fix Kotlin Video Build
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.6 Vidéos.
## Problème corrigé
Erreur :
```text
Execution failed for task ':video_player_android:compileDebugKotlin'
Could not close incremental caches
this and base files have different roots:
C:\Users\...\Pub\Cache\...
D:\07-Logiciels\...\android
```
C'est un problème Kotlin / Gradle sous Windows avec le cache incrémental du plugin `video_player_android`.
## Correction
Ajout / modification de :
```text
android/gradle.properties
```
avec :
```properties
kotlin.incremental=false
kotlin.compiler.execution.strategy=in-process
```
Cela désactive le cache Kotlin incrémental et évite le daemon Kotlin pour ce projet.
## Commandes recommandées
Important : arrête les vieux daemons Gradle et nettoie les caches de build.
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
.\android\gradlew --stop
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\android\.gradle -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\.dart_tool -ErrorAction SilentlyContinue
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Nouvelle rubrique conservée
Menu :
- Photos
- Vidéos
- Explorer
- Surprends-moi
## Note
La première compilation après cette correction peut être plus lente.
C'est normal : on force Kotlin à arrêter ses petits tours de cache cassé.
@@ -0,0 +1,67 @@
# Immich TV Viewer - V2.6.2 Skip Incompatible Videos
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.6.1.
## Problème observé
Erreur sur Mi Box :
```text
PlatformException(VideoError...)
MediaCodecVideoRenderer error
format_supported=NO_EXCEEDS_CAPABILITIES
video/avc
3840x2160
60 fps
```
Cela signifie que la vidéo dépasse les capacités du décodeur vidéo matériel de la Mi Box.
## Correction
Au lieu d'afficher un gros écran rouge :
- l'app détecte les erreurs `NO_EXCEEDS_CAPABILITIES`, `MediaCodec`, `VideoRenderer`
- affiche `Vidéo incompatible Mi Box`
- attend 2 secondes
- passe automatiquement à la vidéo suivante
## Navigation conservée
- flèche droite : vidéo suivante
- flèche gauche : vidéo précédente
- OK / entrée : pause / lecture
- fin d'une vidéo compatible : passage automatique à la suivante
- vidéo incompatible : passage automatique à la suivante
## Important
Cette correction ne rend pas lisible une vidéo que le matériel ne sait pas décoder.
Elle évite seulement que le zapping vidéo se bloque dessus.
Pour lire les vidéos 4K 60 H.264 sur Mi Box, il faudra :
- soit que Immich serve une version transcodée compatible
- soit convertir/transcoder les vidéos côté serveur
- soit filtrer les vidéos trop lourdes dans l'app
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
.\android\gradlew --stop
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\android\.gradle -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\.dart_tool -ErrorAction SilentlyContinue
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
+71
View File
@@ -0,0 +1,71 @@
# Immich TV Viewer - V2.6 Vidéos
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.5.1 validée.
## Fichiers modifiés
- lib/main.dart
- pubspec.yaml
- README_V2_6_VIDEOS.txt
## Nouvelle rubrique
Ajout d'un menu gauche :
- Photos
- Vidéos
- Explorer
- Surprends-moi
## Fonctionnalités vidéo
La rubrique `Vidéos` :
- charge toutes les vidéos du serveur Immich via `/search/metadata` avec `type: VIDEO`
- affiche une grille de miniatures vidéo
- permet d'ouvrir une vidéo en plein écran
- lecture via endpoint Immich :
```text
/api/assets/{assetId}/video/playback
```
- flèche droite : vidéo suivante
- flèche gauche : vidéo précédente
- OK / Entrée : pause / lecture
- fin d'une vidéo : passage automatique à la vidéo suivante
- à la fin de la liste : retour à la première vidéo
## Dépendance ajoutée
```yaml
dependencies:
video_player: ^2.9.2
```
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Logs utiles
```text
IMMICH_VIDEO play ...
IMMICH_VIDEO error ...
```
## Note
La lecture dépend des formats vidéo pris en charge par Android TV / ExoPlayer.
Si certaines vidéos HEVC/H.265 ne se lisent pas, il faudra activer/forcer le transcodage côté Immich ou ajouter une stratégie de fallback.
+88
View File
@@ -0,0 +1,88 @@
# Immich TV Viewer - V2.7.1 Fix Android Embedding
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.7 :
- nom : Imedia Photos
- icône personnalisée
- banner TV
- vidéos avec skip des vidéos incompatibles
## Problème corrigé
Erreur :
```text
Build failed due to use of deleted Android v1 embedding.
```
Cause probable :
Le fichier AndroidManifest.xml ne déclarait plus correctement :
```xml
<meta-data
android:name="flutterEmbedding"
android:value="2" />
```
## Correction
Manifest Android restauré proprement avec :
- `android:name="${applicationName}"`
- `android:label="@string/app_name"`
- `android:icon="@mipmap/ic_launcher"`
- `android:banner="@drawable/tv_banner"`
- `android:usesCleartextTraffic="true"`
- `MainActivity`
- `LAUNCHER`
- `LEANBACK_LAUNCHER`
- `flutterEmbedding = 2`
## Fichiers modifiés / ajoutés
- android/app/src/main/AndroidManifest.xml
- android/app/src/main/res/values/strings.xml
- android/app/src/main/res/values/styles.xml
- android/app/src/main/kotlin/com/example/immich_tv_viewer/MainActivity.kt
- tools/check_android_manifest.ps1
- README_V2_7_1_FIX_ANDROID_EMBEDDING.txt
## Installation propre
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
.\android\gradlew --stop
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\android\.gradle -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\.dart_tool -ErrorAction SilentlyContinue
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Vérification rapide
```powershell
powershell -ExecutionPolicy Bypass -File .\tools\check_android_manifest.ps1
```
Tu dois voir :
```text
flutterEmbedding
MainActivity
LEANBACK_LAUNCHER
@string/app_name
@mipmap/ic_launcher
@drawable/tv_banner
```
+87
View File
@@ -0,0 +1,87 @@
# Immich TV Viewer - V2.7.2 Performance Thumbnails
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.7.1 :
- Imedia Photos
- icône personnalisée
- Android embedding v2 corrigé
- vidéos conservées
- musique conservée
- overlay conservé
## Problème observé
La console affichait :
```text
Skipped 824 frames
The application may be doing too much work on its main thread
```
et des miniatures chargées en `size=preview` avec parfois plus de 1 Mo :
```text
thumbnail?size=preview bytes=1385699
```
Sur Mi Box, afficher une grille avec autant d'images lourdes provoque des ralentissements.
## Correction
### Grilles
Les grilles utilisent maintenant :
```text
thumbnail?size=thumbnail
```
pour :
- Photos
- Vidéos
- Surprends-moi
### Plein écran
La visionneuse garde :
```text
thumbnail?size=preview
```
pour conserver une meilleure qualité quand une photo est affichée seule.
### Cache
Le cache image est limité à environ 180 entrées pour éviter de saturer la mémoire.
### Logs
Les logs d'images sont réduits :
- les previews sont encore logguées
- les erreurs sont logguées
- les petites miniatures de grille ne floodent plus la console
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
.\android\gradlew --stop
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\android\.gradle -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force .\.dart_tool -ErrorAction SilentlyContinue
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
+52
View File
@@ -0,0 +1,52 @@
# Immich TV Viewer - V2.7.3 Confirmation de sortie
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.7.2 :
- Imedia Photos
- icône personnalisée
- performances miniatures améliorées
- vidéos
- musique
- overlay date / lieu
## Nouvelle fonctionnalité
Quand l'utilisateur appuie sur retour depuis l'écran principal, l'app n'est plus fermée brusquement.
Une confirmation apparaît :
```text
Quitter Imedia Photos ?
Tu veux vraiment fermer l’application ?
```
Boutons :
- Annuler
- Quitter
## Comportement
- Depuis l'écran principal : confirmation avant fermeture
- Depuis les écrans internes : retour normal vers l'écran précédent
- Si l'utilisateur confirme : fermeture via `SystemNavigator.pop()`
## Fichier modifié
- lib/main.dart
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
+78
View File
@@ -0,0 +1,78 @@
# Immich TV Viewer - V2.7 Imedia Photos
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.6.2.
## Changements
### Nom de l'application
L'application est renommée :
```text
Imedia Photos
```
Modifications :
- `MaterialApp.title`
- `android:label`
- ressource Android `@string/app_name`
### Icône
Ajout d'une icône personnalisée :
- fond sombre moderne
- carte photo
- symbole lecture / média
- style adapté TV / photos
Fichiers générés :
```text
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
android/app/src/main/res/drawable/tv_banner.png
assets/generated/imedia_photos_icon_1024.png
```
## Fichiers modifiés / ajoutés
- lib/main.dart
- android/app/src/main/AndroidManifest.xml
- android/app/src/main/res/values/strings.xml
- android/app/src/main/res/mipmap-*/ic_launcher.png
- android/app/src/main/res/drawable/tv_banner.png
- assets/generated/imedia_photos_icon_1024.png
- README_V2_7_IMEDIA_PHOTOS_NAME_ICON.txt
## Installation / test
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Si l'ancienne icône reste affichée
Android TV garde parfois l'icône en cache. Dans ce cas :
```powershell
adb connect 192.168.1.8:5555
adb shell pm clear com.example.immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
Ou désinstalle puis réinstalle l'application.
+41
View File
@@ -0,0 +1,41 @@
# Imedia Photos - V2.8.1 Fix Const Delay
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.8 Settings.
## Problème corrigé
Erreur build :
```text
Constant evaluation error
The invocation of 'autoDelaySeconds' is not allowed in a constant expression.
```
Cause :
Le texte dynamique suivant était dans un `const Row` :
```dart
Text('${AppSettings.autoDelaySeconds} secondes par photo')
```
## Correction
Le `Row` n'est plus `const`.
Les widgets internes qui peuvent rester constants gardent leur `const`.
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
+79
View File
@@ -0,0 +1,79 @@
# Imedia Photos - V2.8.2 TV Settings UI Fix
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.8.1.
## Problèmes corrigés
### 1. Barres jaunes dans Paramètres
Les barres jaunes venaient d'un overflow Flutter dans le menu gauche.
Correction :
- largeur du menu gauche réduite à 178 px
- icônes réduites
- textes réduits
- espacements réduits
- libellés raccourcis :
- Surprends-moi -> Surprise
- Paramètres -> Réglages
### 2. Clavier qui cache la clé API
L'écran Paramètres est maintenant séparé en 3 onglets :
- Serveur
- Clé API
- Zapping
La clé API est seule sur sa page, donc le clavier ne recouvre plus tout le formulaire.
### 3. OK / clavier TV
Les champs de texte ont été améliorés pour Android TV :
- focus dédié par champ
- appui OK / Entrée pris en charge
- affichage forcé du clavier
- scroll automatique vers le champ actif
- validation clavier ferme le clavier
### 4. Menus diminués
Le menu gauche est réduit d'environ 50% visuellement.
## Fichiers modifiés
- lib/main.dart
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Utilisation
Dans Paramètres :
1. Onglet Serveur
- IP Immich
- Port
2. Onglet Clé API
- colle la clé API
3. Onglet Zapping
- délai entre deux photos
Ensuite bouton Enregistrer.
+69
View File
@@ -0,0 +1,69 @@
# Imedia Photos - V2.8.3 TV Settings Dialogs
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.8.2.
## Problème corrigé
Sur Android TV, les champs texte de la page Réglages pouvaient piéger le focus :
- impossible de sortir proprement du champ
- retour affichait la confirmation de sortie de l'application
- le clavier pouvait rester coincé ou ne plus se rouvrir correctement
## Nouvelle solution
La page Réglages n'utilise plus de champs texte directement.
Chaque paramètre est maintenant une ligne-bouton :
- Adresse IP
- Port
- Clé API Immich
- Délai auto
Quand on appuie sur OK :
- une fenêtre d'édition s'ouvre
- le clavier s'affiche dans cette fenêtre
- OK valide
- Annuler annule
- Retour ferme la fenêtre / le clavier, pas l'application
## Autre correction
Le bouton Retour de l'écran principal vérifie maintenant si un champ texte est actif.
Si oui :
- il ferme le clavier
- il quitte le champ
- il n'affiche pas la confirmation de sortie de l'application
## Fichiers modifiés
- lib/main.dart
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Utilisation
Dans Réglages :
1. Sélectionne une ligne avec la télécommande.
2. Appuie sur OK.
3. Modifie la valeur dans la fenêtre.
4. Valide avec OK.
5. Appuie sur Enregistrer en bas.
@@ -0,0 +1,59 @@
# Imedia Photos - V2.8.4 TV Focus Back Navigation
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.8.3.
## Problème corrigé
Sur Android TV, après ouverture d'une zone texte :
- impossible de sortir correctement du focus
- bouton Retour affichait la confirmation de sortie de l'application
- haut/bas ne permettaient pas de naviguer vers les boutons
## Nouvelle logique
### Page Réglages
Les paramètres sont des lignes-boutons :
- Adresse IP
- Port
- Clé API Immich
- Délai auto
OK ouvre une fenêtre d'édition.
### Fenêtre d'édition
Dans la zone texte :
- Bas ou Droite : ferme le clavier et met le focus sur OK
- Haut ou Gauche : ferme le clavier et met le focus sur Annuler
- Retour : ferme le clavier et met le focus sur OK
- OK clavier : valide la valeur
Hors zone texte :
- Retour : ferme la fenêtre
- OK sur OK : valide
- OK sur Annuler : annule
## Fichiers modifiés
- lib/main.dart
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
@@ -0,0 +1,64 @@
# Imedia Photos - V2.8.5 Direct TV Focus Settings
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.8.4.
## Navigation demandée
### Onglet Serveur
Depuis le champ Adresse IP :
- flèche haut : bouton Serveur
- flèche bas : champ Port
Depuis le champ Port :
- flèche haut : champ Adresse IP
- flèche bas : bouton Enregistrer
Depuis le bouton Serveur :
- flèche bas : champ Adresse IP
- flèche droite : bouton Clé API
### Onglet Clé API
Depuis le champ Clé API :
- flèche haut : bouton Clé API
- flèche bas : bouton Enregistrer
### Onglet Zapping
Depuis le champ Délai :
- flèche haut : bouton Zapping
- flèche bas : bouton Enregistrer
## Bouton Retour
Si le focus est dans un champ de réglage :
- Retour ferme le clavier
- Retour renvoie le focus au bouton de l'onglet actif
- La confirmation de sortie de l'application ne s'affiche pas
## Fichiers modifiés
- lib/main.dart
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
+85
View File
@@ -0,0 +1,85 @@
# Imedia Photos - V2.8 Paramètres
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Base
Cette version part de la V2.7.3.
## Nouvelle rubrique
Ajout d'un menu gauche :
- Photos
- Vidéos
- Explorer
- Surprends-moi
- Paramètres
## Paramètres disponibles
### Serveur Immich
- Adresse IP du serveur Immich
- Port de connexion Immich
L'application construit automatiquement :
```text
http://IP:PORT/api
```
Exemple :
```text
192.168.1.29
2283
```
### Clé API Immich
L'application utilise la clé API via le header :
```text
x-api-key
```
Elle n'a pas besoin du compte/mot de passe Immich.
### Zapping photo
- Délai entre deux photos en mode auto
- Valeur acceptée : 3 à 300 secondes
- Valeur par défaut : 10 secondes
## Stockage local
Les paramètres sont sauvegardés localement avec `shared_preferences`.
## Dépendance ajoutée
```yaml
shared_preferences: ^2.3.5
```
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter clean
flutter pub get
flutter run -d 192.168.1.8:5555
```
## Important
Après avoir changé l'IP, le port ou la clé API, retourne dans Photos / Explorer / Surprends-moi et utilise Rafraîchir si nécessaire.
## Réponse à la question compte/mot de passe
Non, l'application n'a pas besoin du login/mot de passe Immich.
Elle a seulement besoin d'une clé API générée dans Immich.
C'est plus propre et plus sûr que de stocker le mot de passe utilisateur.
+37
View File
@@ -0,0 +1,37 @@
# Immich TV Viewer - V2 UI Photos + Explorer
Projet cible :
D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
## Fichiers modifiés
- lib/main.dart
- README_V2_UI_PHOTOS_EXPLORER.txt
## Nouveautés
- Interface type Immich avec menu gauche.
- Menu limité à `Photos` et `Explorer`.
- `Photos` affiche les photos de la bibliothèque Immich.
- `Explorer` affiche les personnes.
- Sélection d'une personne = affichage de ses photos.
- Vidéos exclues pour l'instant.
- Images chargées avec `http.get` + `Image.memory`, pas `Image.network`.
## Important
Dans `lib/main.dart`, remplace :
```dart
const String immichApiKey = 'COLLE_TA_CLE_API_ICI';
```
par ta vraie clé API.
## Installation
```powershell
cd D:\07-Logiciels\17-IMMICH-TV\immich_tv_viewer
flutter run -d 192.168.1.8:5555
```
+28
View File
@@ -0,0 +1,28 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
+14
View File
@@ -0,0 +1,14 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/
# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks
+45
View File
@@ -0,0 +1,45 @@
plugins {
id("com.android.application")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
android {
namespace = "com.example.immich_tv_viewer"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.immich_tv_viewer"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
}
}
}
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
}
}
flutter {
source = "../.."
}
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
+36
View File
@@ -0,0 +1,36 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="${applicationName}"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:banner="@drawable/tv_banner"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
@@ -0,0 +1,12 @@
package com.example.immich_tv_viewer
import android.os.Bundle
import android.view.WindowManager
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Imedia Photos</string>
</resources>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
</style>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
+24
View File
@@ -0,0 +1,24 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
val newBuildDir: Directory =
rootProject.layout.buildDirectory
.dir("../../build")
.get()
rootProject.layout.buildDirectory.value(newBuildDir)
subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
+11
View File
@@ -0,0 +1,11 @@
# Fix Windows/Kotlin cache issue with video_player_android
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
kotlin.incremental=false
kotlin.compiler.execution.strategy=in-process
# This builtInKotlin flag was added automatically by Flutter migrator
android.builtInKotlin=false
# This newDsl flag was added automatically by Flutter migrator
android.newDsl=false
+5
View File
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip
+26
View File
@@ -0,0 +1,26 @@
pluginManagement {
val flutterSdkPath =
run {
val properties = java.util.Properties()
file("local.properties").inputStream().use { properties.load(it) }
val flutterSdkPath = properties.getProperty("flutter.sdk")
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
flutterSdkPath
}
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "9.0.1" apply false
id("org.jetbrains.kotlin.android") version "2.3.20" apply false
}
include(":app")
Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

File diff suppressed because it is too large Load Diff
+34
View File
@@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
</dict>
</plist>
+1
View File
@@ -0,0 +1 @@
#include "Generated.xcconfig"
+1
View File
@@ -0,0 +1 @@
#include "Generated.xcconfig"
+644
View File
@@ -0,0 +1,644 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */; };
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */,
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
packageProductDependencies = (
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
);
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
packageReferences = (
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
);
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.immichTvViewer;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCLocalSwiftPackageReference section */
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
};
/* End XCLocalSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
isa = XCSwiftPackageProductDependency;
productName = FlutterGeneratedPluginSwiftPackage;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<PreActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Prepare Flutter Framework Script"
scriptText = "/bin/sh &quot;$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh&quot; prepare&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
</PreActions>
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
+16
View File
@@ -0,0 +1,16 @@
import Flutter
import UIKit
@main
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
}
}
@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

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