v1.7.4 - Android permissions and build documentation

Changes:
- AndroidManifest.xml: Added all required permissions
  - Network: INTERNET, ACCESS_NETWORK_STATE
  - Media: CAMERA, RECORD_AUDIO
  - Location: ACCESS_FINE/COARSE_LOCATION
  - Storage: READ_MEDIA_* (Android 13+), READ_EXTERNAL_STORAGE (≤12)
- Added android:usesCleartextTraffic=true for HTTP
- Added docs/BUILD-v1.7.4.md with full build report
- Added CHANGELOG.md

Build: Flutter 3.38.5 / Dart 3.10.4 / Java 17
APK: 49MB | SHA-256: 7f57bee3edec...
This commit is contained in:
Architect
2025-12-23 18:19:45 +00:00
parent 17c54c1356
commit 92f55be026
3 changed files with 205 additions and 12 deletions

32
CHANGELOG.md Normal file
View File

@@ -0,0 +1,32 @@
# Changelog
## [1.7.4] - 2025-12-23
### Added
- Permisos completos de Android en AndroidManifest.xml:
- INTERNET, ACCESS_NETWORK_STATE
- CAMERA, RECORD_AUDIO
- ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION
- READ_MEDIA_IMAGES/VIDEO/AUDIO (Android 13+)
- READ_EXTERNAL_STORAGE (Android ≤12)
- Configuración `android:usesCleartextTraffic="true"` para HTTP
### Build Info
- Flutter 3.38.5 (stable)
- Dart 3.10.4
- Java OpenJDK 17.0.17
- APK Size: 49 MB
- SHA-256: `7f57bee3edec7342d6ca78d789704fec3827e3bf85f11ac362dcbacc8371ef1a`
## [1.0.0] - 2025-12-21
### Added
- Release inicial
- 5 pantallas: Captura, Etiquetas, Packs, Pendientes, Config
- Arquitectura Clean con BLoC
- Soporte offline con cola de reintentos
- Integración con backend via API REST
- Sistema de etiquetas desde bibliotecas remotas
- Captura multimedia (fotos, video, audio, archivos)
- GPS location
- Hash SHA-256 para contenedores

View File

@@ -1,8 +1,29 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Network permissions -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- Camera and audio permissions -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- Location permissions -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- Media permissions for Android 13+ (API 33+) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<!-- Storage permission for Android 12 and below -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<application <application
android:label="packet" android:label="packet"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
@@ -12,10 +33,6 @@
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme"
@@ -25,17 +42,10 @@
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data <meta-data
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
</application> </application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries> <queries>
<intent> <intent>
<action android:name="android.intent.action.PROCESS_TEXT"/> <action android:name="android.intent.action.PROCESS_TEXT"/>

151
docs/BUILD-v1.7.4.md Normal file
View File

@@ -0,0 +1,151 @@
# Packet v1.7.4 - Build Report
**Fecha:** 2025-12-23
**Compilado por:** Claude Code
**Plataforma:** macOS Darwin 25.1.0
## Artefacto
| Campo | Valor |
|-------|-------|
| Archivo | `packet-v1.7.4.apk` |
| Tamaño | 49 MB |
| SHA-256 | `7f57bee3edec7342d6ca78d789704fec3827e3bf85f11ac362dcbacc8371ef1a` |
| Firmado | Debug keys |
## Entorno de Compilación
### Flutter
| Componente | Versión |
|------------|---------|
| Flutter | 3.38.5 (stable) |
| Dart | 3.10.4 |
| DevTools | 2.51.1 |
| Engine | c108a94d7a |
### Android
| Componente | Valor |
|------------|-------|
| Java | OpenJDK 17.0.17 |
| Package Name | `me.tzzr.packet` |
| Label | packet |
## Permisos Android
```xml
<!-- Network -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- Camera and Audio -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- Location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- Media (Android 13+ / API 33+) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<!-- Storage (Android 12 and below) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32"/>
```
**Configuración adicional:**
```xml
<application android:usesCleartextTraffic="true">
```
## Dependencias
### Runtime
| Paquete | Versión | Propósito |
|---------|---------|-----------|
| flutter_bloc | ^9.0.0 | State management |
| equatable | ^2.0.7 | Value equality |
| sqflite | ^2.4.2 | SQLite local DB |
| path_provider | ^2.1.5 | File paths |
| dio | ^5.7.0 | HTTP client |
| crypto | ^3.0.6 | SHA-256 hashing |
| image_picker | ^1.1.2 | Captura fotos/video |
| record | ^6.0.0 | Grabación audio |
| file_picker | ^8.1.7 | Selección archivos |
| geolocator | ^13.0.2 | GPS location |
| permission_handler | ^11.4.0 | Runtime permissions |
| uuid | ^4.5.1 | UUID generation |
| intl | ^0.20.2 | Internacionalización |
| cached_network_image | ^3.4.1 | Cache de imágenes |
### Dev
| Paquete | Versión |
|---------|---------|
| flutter_test | SDK |
| flutter_lints | ^6.0.0 |
## Estructura del Proyecto
```
lib/ (3,505 líneas Dart)
├── main.dart # Entry point
├── core/
│ ├── constants/ # AppConstants, RetryDelays
│ ├── errors/ # Excepciones
│ ├── utils/ # hash_utils, retry_utils
│ └── theme/ # AppTheme
├── data/
│ ├── datasources/ # BackendApi, BibliotecaApi, LocalDatabase
│ └── repositories/ # Config, Etiqueta, Contenedor repos
├── domain/
│ └── entities/ # Contenedor, Etiqueta, Pack, Destino
└── presentation/
├── app.dart # PacketApp, MainScreen
├── bloc/ # Cubits
├── pages/ # 5 pantallas
└── widgets/ # Componentes
```
## Pantallas
| # | Pantalla | Icono | Función |
|---|----------|-------|---------|
| 1 | Captura | 📷 | Montar contenedor multimedia |
| 2 | Etiquetas | 🏷️ | Seleccionar tags |
| 3 | Packs | 📦 | Conjuntos de etiquetas |
| 4 | Pendientes | ⏳ | Cola de reintentos (máx 20) |
| 5 | Config | ⚙️ | URLs, llaves, bibliotecas |
## Constantes
| Constante | Valor |
|-----------|-------|
| maxPendientes | 20 |
| maxReintentos | 20 |
| hashLength | 64 (SHA-256) |
| chunkSize | 512 KB |
| httpTimeout | 30s |
| retryCheckInterval | 30s |
## Backoff de Reintentos (72h total)
| Rango | Espera |
|-------|--------|
| 1-3 | 1, 2, 5 min |
| 4-6 | 10, 20, 30 min |
| 7-10 | 1, 2, 3, 4 h |
| 11-14 | 5, 6, 6, 6 h |
| 15-19 | 8, 8, 8, 8, 6 h |
| 20 | STOP |
## Comandos de Build
```bash
export JAVA_HOME=/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home
cd /tmp/packet-app
flutter clean
flutter build apk --release
cp build/app/outputs/flutter-apk/app-release.apk ~/Downloads/packet-v1.7.4.apk
```