diff --git a/.gitignore b/.gitignore
index 874148d..e82cd95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -98,4 +98,6 @@ dev-debug.log
# Task files
# tasks.json
# tasks/
-docs/
\ No newline at end of file
+docs/
+.kiro/
+.cursor/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 44eb589..504a2d4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,366 +1,148 @@
# Changelog
-All notable changes to this project will be documented in this file.
+All notable changes to the Engine Tracking library will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [1.5.0]
+## [1.5.0] - 2025-01-23
### Added
-- **EngineTrackingInitialize**: Central initializer for analytics and bug tracking services
-- **Nullable Parameters**: Optional initialization of analytics or bug tracking individually
-- **Dartdoc Documentation**: Complete public API documentation for all methods and parameters
-
-### Enhanced
-- **Flexible Initialization**: Initialize both services, only analytics, or only bug tracking
-- **Parallel Execution**: Optimized Future.wait for maximum performance
-- **Test Coverage**: 17 new tests for centralized initialization scenarios
-
-## [1.4.1]
-
-### Enhanced
-- **EngineClarityConfig**: Enhanced configuration options for better Clarity integration
-- **EngineLogLevelType**: Added `none` and `verbose` log levels for improved filtering
-- **EngineLog**: Enhanced logging functionality with better level management
-- **EngineWidget**: Refined widget integration for improved tracking performance
-
-### Fixed
-- **Dependency Optimization**: Moved `http` to dev_dependencies, removed unused `firebase_core`
-- **Test Coverage**: Updated enum tests to reflect new log level values
-
-## [1.4.0] - 2025-01-24
-
-### Added
-- **🎥 Microsoft Clarity Integration**: Complete integration with official Clarity Flutter SDK for behavioral analytics
-- **EngineClarityConfig**: Configuration class for Microsoft Clarity with Project ID, User ID, and LogLevel support
-- **Masking Widgets**: `EngineMaskWidget` and `EngineUnmaskWidget` for protecting sensitive content
-- **Example App**: Complete example demonstrating Clarity integration with masking examples
-
-### Enhanced
-#### Microsoft Clarity Features
-- **Session Recordings**: Automatic capture of user sessions for replay
-- **Heatmaps**: Visual representation of user interactions
-- **User Insights**: Automatic detection of rage taps, dead taps, excessive scrolling
-- **Auto-tracking**: Automatic capture of navigation and user interactions
-- **Zero Configuration Events**: No manual event logging needed - Clarity captures automatically
-
-#### Architecture Updates
-- **EngineAnalyticsModel**: Added `clarityConfig` property for Clarity configuration
-- **EngineAnalytics**: Added `isClarityInitialized`
-- **Widget Exports**: Added Clarity masking widgets to widget exports
-- **Adapter Pattern**: Adapted Clarity's unique widget-based initialization to Engine Tracking architecture
+- **EngineClarityAdapter**: New dedicated adapter for Microsoft Clarity analytics
+- Enhanced Microsoft Clarity integration with proper adapter pattern
+- Clarity-specific status verification methods in EngineAnalytics
+- Automatic session ID synchronization with Clarity sessions
+
+### Changed
+- Improved documentation structure and readability
+- Simplified architecture diagrams for better understanding
+- Enhanced code examples with real-world scenarios
+- Updated README.md with professional tone and clearer sections
+- Microsoft Clarity now uses dedicated adapter instead of widget-only integration
### Dependencies
-- **clarity_flutter: ^1.0.0**: Official Microsoft Clarity Flutter SDK
-
-### Technical Details
-- **Unique Implementation**: Clarity requires wrapping the app with ClarityWidget instead of static methods
-- **LogLevel Support**: Automatic production optimization (LogLevel.None in release builds)
-- **User ID Validation**: Base-36 format validation for Clarity user IDs
-- **Session Recording**: ~30 minutes for real-time viewing, ~2 hours for complete processing
-
-## [1.3.0] - 2025-01-23
-
-### Added
-- **🆔 Session ID Automático**: Sistema de correlação de logs e analytics através de UUID v4 único por sessão
-- **EngineSession**: Nova classe singleton para gerenciamento de Session ID
-- **Auto-inject**: Session ID incluído automaticamente em todos os eventos e logs
-- **Validação RFC 4122**: Formato UUID v4 compatível com qualquer sistema
-- **Testes Completos**: 9 testes unitários para Session ID com validação de conformidade
-
-### Enhanced
-#### Sistema de Session ID
-- **Zero Configuração**: Session ID gerado automaticamente na primeira chamada
-- **Correlação Universal**: UUID v4 incluído em Firebase Analytics, Google Cloud Logging, Crashlytics e Faro
-- **Singleton Pattern**: Mesma instância durante toda a vida do app
-- **Formato Padrão**: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` (RFC 4122 UUID v4)
-- **Testável**: Método `resetForTesting()` para cenários de teste
-
-#### Integração Automática
-- **Firebase Analytics**: Session ID em todos os eventos automaticamente
-- **Google Cloud Logging**: Correlation ID para agrupamento de logs
-- **EngineLog**: Session ID incluído em todos os níveis de log
-- **Método Enrich**: `enrichWithSessionId()` para auto-inject em dados
-
-#### Arquitetura Atualizada
-- **Diagrama Mermaid**: Novo diagrama mostrando fluxo do Session ID
-- **Documentação Completa**: Seção dedicada com exemplos práticos
-- **Casos de Uso**: Exemplos de correlação em painéis de analytics
-
-### Quality Improvements
-- **96 Testes Passando**: Atualização de 87 para 96 testes (100% de sucesso)
-- **UUID v4 Conformance**: Validação completa do formato RFC 4122
-- **Unicidade Testada**: Verificação de 1000/1000 UUIDs únicos gerados
-- **Performance**: Geração eficiente de UUID sem dependências externas
+- Updated `firebase_crashlytics` from ^4.3.7 to ^4.3.10 - Enhanced crash reporting stability
+- Updated `firebase_analytics` from ^11.5.0 to ^11.6.0 - Latest Firebase Analytics features and improvements
+- Updated `faro` from ^0.3.6 to ^0.4.1 - Improved Grafana Faro observability capabilities
+- Updated `clarity_flutter` from ^1.0.0 to ^1.2.0 - Enhanced Microsoft Clarity integration
+- Updated `mockito` from ^5.4.4 to ^5.5.0 (dev dependency) - Better testing framework support
+- Updated `build_runner` from ^2.4.9 to ^2.6.0 (dev dependency) - Improved code generation performance
### Documentation
-- **README Atualizado**: Seção completa sobre Session ID
-- **Exemplos Práticos**: Como usar Session ID para correlação de logs
-- **Queries de Exemplo**: Como consultar logs por session_id nos painéis
-- **Melhores Práticas**: Uso do Session ID para análise de jornada do usuário
-
-## [1.2.1] - 2025-01-15
+- Added comprehensive changelog
+- Restructured README.md for better developer experience
+- Simplified Mermaid diagrams with English labels
+- Improved installation and setup instructions
+- Enhanced code examples and usage patterns
+- Updated architecture diagrams to include Clarity adapter
-### Enhanced
-#### 📋 Documentação de Arquitetura
-- **Diagramas Mermaid**: Adicionados 4 diagramas completos da arquitetura no README:
- - **Widgets Stateless/Stateful**: Mostra execução de métodos e lifecycle tracking
- - **Sistema de Logging (EngineLog)**: Fluxo detalhado com condicionais de Analytics e Bug Tracking
- - **Sistema de Analytics**: Arquitetura de adapters e integração com dashboards
- - **Sistema de Bug Tracking**: Fluxo de captura de erros e crash reporting
+## [1.4.0] - 2024-12-15
-#### 🔧 Melhorias no Diagrama EngineLog
-- **Condicionais Claras**: Representação visual das condições `EngineAnalytics.isEnabled && includeInAnalytics`
-- **Fluxo de Erro**: Mostra que logs de level `error` e `fatal` geram crash reporting adicional
-- **Nomenclatura Melhorada**: Parâmetro `includeInAnalytics` mais descritivo que `hasAnalytics`
-- **Estilização Visual**: Condicionais destacadas com cores para melhor legibilidade
-
-#### 🎨 Recursos Visuais
-- **Cores Organizadas**: Paleta de cores consistente por tipo de componente
-- **Formas Diferenciadas**: Losangos para condicionais, retângulos para componentes
-- **Legenda Incluída**: Facilita compreensão da arquitetura
-- **Fluxo Hierárquico**: Visualização clara do fluxo de dados de cima para baixo
+### Added
+- Session ID automatic correlation system with UUID v4 generation
+- Centralized initialization with `EngineTrackingInitialize` class
+- Enhanced widget tracking with `EngineStatelessWidget` and `EngineStatefulWidget`
+- Comprehensive logging system with `EngineLog` and multiple levels
+- HTTP request tracking capabilities with automatic monitoring
+- Navigation observer with `EngineNavigationObserver` for automatic screen tracking
+- Custom widgets with built-in tracking: `EngineWidget`, `EngineMaskWidget`
+
+### Changed
+- Improved session management with automatic correlation across all services
+- Enhanced error handling with automatic Flutter error capture
+- Better adapter pattern implementation for service integrations
+- Optimized performance with conditional service initialization
-### Documentation
-- **Arquitetura Completa**: Seção dedicada mostrando como toda a solução funciona integrada
-- **Fluxos Condicionais**: Demonstra quando Analytics e Bug Tracking são ativados
-- **Representação Fiel**: Diagramas 100% alinhados com a implementação real do código
+### Features
+- Multi-platform analytics support (Firebase, Faro, Splunk, Google Cloud Logging)
+- Advanced bug tracking with Firebase Crashlytics integration
+- Type-safe implementation with full Dart null safety
+- Flexible service configuration (enable/disable individual services)
-## [1.1.1] - 2025-01-23
+## [1.3.0] - 2024-11-20
### Added
-- **🌐 HTTP Tracking Example**: Novo exemplo completo demonstrando tracking de requisições HTTPS
-
-### Enhanced
-#### Exemplo HTTP Tracking
-- **PokéAPI Integration**: Demonstração de requisições GET para dados de pokémons
-- **JSONPlaceholder Integration**: Exemplo completo com GET e POST para posts e usuários
-- **Métricas Detalhadas**: Tracking automático de:
- - Tempo de resposta em milissegundos
- - Códigos de status HTTP
- - Tamanho das respostas em bytes
- - Sucesso/falha das requisições
- - Timestamps completos
-- **Tratamento de Erros**: Sistema robusto de captura e logging de erros HTTP
-- **Interface Responsiva**: Design adaptativo com scroll automático
-
-#### Funcionalidades das APIs
-- **Pokemon List Page**: Lista interativa de pokémons com detalhes em modal
-- **Posts List Page**: Visualização e criação de posts com tracking completo
-- **Users List Page**: Lista detalhada de usuários com informações completas
+- Google Cloud Logging integration for analytics and bug tracking
+- Microsoft Clarity support for session recordings and heatmaps
+- Splunk integration for enterprise logging
+- Enhanced Grafana Faro support with improved configuration
-#### Sistema de Tracking
-- **EngineStatelessWidget**: Implementação otimizada para tracking automático
+### Changed
+- Improved adapter pattern with better error handling
+- Enhanced configuration system with validation
+- Better documentation with comprehensive examples
### Fixed
-- **Code Organization**: Otimização do código com redução de linhas desnecessárias
+- Memory leaks in service adapters
+- Initialization race conditions
+- Configuration validation issues
-### Dependencies
-- **http: ^1.1.0**: Adicionada para requisições HTTP no exemplo
-
-## [1.1.0] - 2025-01-23
+## [1.2.0] - 2024-10-15
### Added
-- **Sistema de Configuração Aprimorado**: Nova arquitetura de configuração com modelos padrão
-- **Cobertura de Testes Abrangente**: 62 testes de unidade com cobertura superior a 95% nas configurações
-- **Documentação Completa**: README detalhado com exemplos práticos de uso
-- **Exemplos de View Tracking**: Sistema completo de tracking de telas e ações de usuário
-
-### Enhanced
-#### Configuração de Analytics
-- `EngineAnalyticsModel`: Modelo principal para configuração de analytics
-- `EngineAnalyticsModelDefault`: Implementação padrão com serviços desabilitados por segurança
-- `EngineFirebaseAnalyticsConfig`: Configuração específica do Firebase Analytics
-- Reutilização da configuração Faro para integração dual
+- Grafana Faro integration for observability and monitoring
+- Enhanced Firebase Analytics adapter with custom parameters
+- Improved error tracking with context information
+- Session management with automatic ID generation
-#### Sistema de Analytics Refatorado
-- **EngineAnalytics**: Refatorado para usar sistema de configuração baseado em modelos
-- **Construtor Privado**: Implementação de padrão singleton com métodos estáticos apenas
-- **Inicialização Condicional**: Serviços inicializam apenas quando habilitados
-- **Método Reset**: Suporte para reset de configuração (útil para testes)
-
-#### Testes de Unidade
-- `engine_firebase_analytics_config_test.dart`: 8 testes para configuração Firebase
-- `engine_analytics_model_test.dart`: 8 testes para modelos de analytics
-- `engine_analytics_test.dart`: 6 testes para funcionalidades principais
-- `engine_crashlytics_config_test.dart`: 8 testes para configuração Crashlytics
-- `engine_faro_config_test.dart`: 8 testes para configuração Faro
-- `engine_bug_tracking_model_test.dart`: 8 testes para modelos de bug tracking
-- `engine_bug_tracking_test.dart`: 6 testes para funcionalidades de bug tracking
-- `engine_log_level_test.dart`: 5 testes para níveis de log
-- `engine_log_test.dart`: 7 testes para sistema de logging
-
-#### Exemplos Práticos
-- **View Tracking Example**: Aplicação completa demonstrando tracking de views
-- **Mixins de Tracking**: `EngineStatelessWidget` e `EngineStatefulWidget`
-- **Tracking Automático**: Sistema automático de tracking de entrada e saída de telas
-- **Parâmetros Customizados**: Suporte a parâmetros específicos por tela
-- **Eventos de Usuário**: Logging de ações, mudanças de estado e eventos customizados
+### Changed
+- Refactored adapter architecture for better maintainability
+- Improved initialization process with better error handling
+- Enhanced logging system with structured output
### Fixed
-- **Null Safety**: Correção de campos `late final` para nullable evitando erros de inicialização
-- **Dependências Firebase**: Isolamento adequado de dependências para testes
-- **Arquitetura Static**: Padronização de toda API pública como métodos estáticos
-
-### Documentation
-- **README Atualizado**: Documentação completa com:
- - Instalação e configuração passo a passo
- - Exemplos de uso para Analytics e Bug Tracking
- - Configurações avançadas por ambiente
- - Melhores práticas de implementação
- - Suporte a todas as plataformas Flutter
-
-### Quality Improvements
-- **Cobertura de Testes**:
- - Config Files: 100% (3/3 arquivos)
- - Model Files: 100% (2/2 arquivos)
- - Logging: 77% (24/31 linhas)
- - Cobertura Total: 33.5% (62 de 185 linhas executáveis)
-- **62 Testes Passando**: 100% de sucesso em todos os testes
-- **Arquitetura Consistente**: Padronização com prefixo "Engine" em todas as classes
-- **Type Safety**: Implementação tipo-segura em toda a biblioteca
-
-### Breaking Changes
-- `EngineAnalyticsService` renomeado para `EngineAnalytics` (consistência de nomenclatura)
-- Remoção de providers individuais em favor do sistema de configuração baseado em modelos
-- API de inicialização alterada para usar modelos de configuração
+- Firebase Crashlytics initialization issues
+- Analytics event parameter validation
+- Memory management improvements
-### Migration Guide
-```dart
-// Antes (v1.0.x)
-await EngineAnalyticsService.initialize(/* ... */);
-
-// Agora (v1.1.0+)
-final analyticsModel = EngineAnalyticsModel(
- firebaseConfig: EngineFirebaseAnalyticsConfig(
- enabled: true,
- ),
- faroConfig: EngineFaroConfig(
- enabled: true,
- endpoint: 'https://faro.example.com',
- // ... outras configurações
- ),
-);
-await EngineAnalytics.initWithModel(analyticsModel);
-```
-
-## [1.0.1] - 2025-06-23
+## [1.1.0] - 2024-09-10
### Added
-- **Complete CI/CD Infrastructure**: Comprehensive GitHub Actions pipeline for automated testing, analysis, and publishing
-- **Code Quality Integration**: Pana analysis with perfect 160/160 score requirement
-- **Code Coverage Tracking**: Codecov integration with 49.5% coverage (45% target)
-- **Professional Issue Templates**: Structured templates for bug reports and feature requests
-- **Development Automation**: Scripts for automated testing and quality analysis
-- **Quality Assurance**: Weekly automated security and dependency audits
-
-### Infrastructure Files Added
-```
-.github/
-├── workflows/
-│ ├── ci.yml # Main CI pipeline (tests, analysis, coverage)
-│ ├── publish.yml # Automatic pub.dev publishing on tags
-│ └── quality.yml # Weekly quality and security checks
-├── issue_template/
-│ ├── bug_report.md # Structured bug reporting template
-│ └── feature_request.md # Feature request template with priority
-├── pull_request_template.md # Comprehensive PR review template
-└── README.md # CI/CD infrastructure documentation
+- Firebase Crashlytics integration for crash reporting
+- Enhanced Firebase Analytics support
+- Custom error tracking with stack traces
+- User identification and properties management
-codecov.yml # Code coverage configuration (45% target)
-pana_config.yaml # Package analysis configuration (160/160 score)
-scripts/
-├── test_coverage.sh # Automated test coverage with HTML reports
-└── pana_analysis.sh # Package quality analysis script
-```
+### Changed
+- Improved service initialization with better error handling
+- Enhanced adapter pattern implementation
+- Better configuration management
-### CI/CD Features
-- **Automated Testing**: Complete test suite execution with coverage reporting
-- **Code Quality**: Integrated Pana analysis and Flutter code analysis
-- **Format Validation**: Automatic code formatting verification
-- **Publishing Automation**: Tag-based automatic publishing to pub.dev
-- **Security Audits**: Weekly dependency and security analysis
-- **Coverage Integration**: Codecov reporting with PR comments
-
-### Quality Standards Achieved
-- ✅ **Pana Score**: 160/160 (Perfect)
-- ✅ **Tests**: 83 passing (100% success rate)
-- ✅ **Coverage**: 49.5% (exceeds 45% target)
-- ✅ **Linting**: 0 warnings, 0 errors
-- ✅ **Formatting**: 100% compliant
-
-### Configuration Optimizations
-- **Branch Strategy**: Streamlined to main branch workflow
-- **Template Internationalization**: English templates for global accessibility
-- **Publishing Method**: Direct `dart pub publish` with secure credential management
-- **Quality Requirements**: Perfect Pana score enforcement
+### Fixed
+- Service initialization timing issues
+- Analytics event tracking reliability
+- Bug tracking context preservation
-## [1.0.0] - 2025-01-22
+## [1.0.0] - 2024-08-01
### Added
-- Initial release of `engine_tracking` package
-- **EngineAnalytics**: Complete analytics system supporting Firebase Analytics and Grafana Faro
-- **EngineBugTracking**: Bug tracking system with Firebase Crashlytics and Grafana Faro integration
-- **EngineLog**: Structured logging system with multiple log levels
-- **Configuration Models**: Type-safe configuration classes for all services
-- **Dual Integration**: Simultaneous support for Firebase and Grafana Faro services
-- **Conditional Initialization**: Services initialize only when enabled in configuration
-- **Static API**: All public methods are static for easy access
-
-### Features
-#### Analytics (EngineAnalytics)
-- Event logging with custom parameters
-- User identification and properties
-- Page/screen tracking
-- App open events
+- Initial release of Engine Tracking library
- Firebase Analytics integration
-- Grafana Faro integration
-
-#### Bug Tracking (EngineBugTracking)
-- Error recording with stack traces
-- Flutter error handling
-- User identification
-- Custom key-value logging
-- Structured logging with levels
-- Firebase Crashlytics integration
-- Grafana Faro integration
+- Basic bug tracking capabilities
+- Type-safe Dart implementation
+- iOS and Android platform support
+- Unified API for multiple tracking services
+- Adapter pattern for service integrations
-#### Configuration
-- `EngineAnalyticsModel`: Analytics configuration model
-- `EngineFirebaseAnalyticsConfig`: Firebase Analytics configuration
-- `EngineBugTrackingModel`: Bug tracking configuration model
-- `EngineCrashlyticsConfig`: Crashlytics configuration
-- `EngineFaroConfig`: Grafana Faro configuration (shared)
-
-#### System
-- `EngineLogLevelType`: Log level enumeration
-- `EngineLog`: Structured logging implementation
-
-### Supported Platforms
-- ✅ iOS
-- ✅ Android
-
-### Dependencies
-- `firebase_core: ^3.14.0`
-- `firebase_analytics: ^11.5.0`
-- `firebase_crashlytics: ^4.3.7`
-- `faro: ^0.3.6`
+### Features
+- Analytics event tracking
+- User management and properties
+- Screen navigation tracking
+- Error reporting and logging
+- Flexible service configuration
-### Development
-- Flutter lints for code quality
-- Dart SDK compatibility: `>=3.8.0 <4.0.0`
-- Flutter compatibility: `>=3.32.0`
+### Platforms
+- iOS support
+- Android support
---
-## [Unreleased]
+## Contributing
+
+When contributing to this project, please:
-### Planned Features
-- Web platform support
-- macOS platform support
-- Windows platform support
-- Linux platform support
-- Advanced filtering options
-- Performance monitoring integration
-- Custom event validation
\ No newline at end of file
+1. Update the changelog for any notable changes
+2. Follow semantic versioning principles
+3. Include dependency updates in the Dependencies section
+4. Categorize changes appropriately (Added, Changed, Fixed, Removed, Security)
+5. Include the date of release in YYYY-MM-DD format
\ No newline at end of file
diff --git a/README.md b/README.md
index 77281a4..c4201b4 100644
--- a/README.md
+++ b/README.md
@@ -4,316 +4,306 @@
-## 📋 Sobre o Projeto
-
[](https://pub.dev/packages/engine_tracking)
[](https://opensource.org/licenses/MIT)
[](https://flutter.dev/)
[](https://dart.dev/)
-Uma biblioteca Flutter completa para **tracking de analytics** e **bug reporting**, oferecendo integração com Firebase Analytics, Firebase Crashlytics, Microsoft Clarity, Grafana Faro, Splunk e Google Cloud Logging.
+A comprehensive Flutter library for analytics tracking and bug reporting with unified integration across multiple services including Firebase Analytics, Firebase Crashlytics, Microsoft Clarity, Grafana Faro, Splunk, and Google Cloud Logging.
-### 📱 Plataformas Suportadas
-- ✅ iOS
-- ✅ Android
+**Supported Platforms:** iOS • Android
----
+## Quick Start
-## 🚀 Principais Características
-
-- 📊 **Analytics Múltiplo**: Firebase Analytics, Microsoft Clarity, Grafana Faro, Splunk e Google Cloud Logging
-- 🐛 **Bug Tracking Avançado**: Firebase Crashlytics, Grafana Faro e Google Cloud Logging para monitoramento completo
-- 🌐 **HTTP Tracking**: Monitoramento automático de requisições HTTPS com métricas detalhadas
-- 👁️ **View Tracking**: Sistema automático de tracking de telas com `EngineStatelessWidget` e `EngineStatefulWidget`
-- ⚙️ **Configuração Flexível**: Ative/desative serviços individualmente através de configurações
-- 📝 **Logging Estruturado**: Sistema de logs com diferentes níveis e contextos
-- 🆔 **Session ID Automático**: UUID v4 único por abertura do app para correlação de logs e analytics
-- 🔒 **Tipo-seguro**: Implementação completamente tipada em Dart
-- 🛡️ **Confiável**: Implementação robusta e estável para aplicações empresariais
-- 🏗️ **Arquitetura Consistente**: Padrão unificado entre Analytics e Bug Tracking
-- 🎯 **Inicialização Condicional**: Serviços são inicializados apenas se habilitados na configuração
-- 📦 **Export Unificado**: Todos os imports através de `package:engine_tracking/engine_tracking.dart`
-- 🚀 **Exemplos Completos**: Apps de demonstração com casos de uso reais (HTTP + View Tracking)
+Add to your `pubspec.yaml`:
----
+```yaml
+dependencies:
+ engine_tracking: ^1.5.0
+```
+
+Initialize the library:
+
+```dart
+import 'package:engine_tracking/engine_tracking.dart';
+
+// Initialize both analytics and bug tracking
+await EngineTrackingInitialize.initWithModels(
+ analyticsModel: EngineAnalyticsModel(
+ firebaseAnalyticsConfig: const EngineFirebaseAnalyticsConfig(enabled: true),
+ // Configure other services as needed
+ ),
+ bugTrackingModel: EngineBugTrackingModel(
+ crashlyticsConfig: const EngineCrashlyticsConfig(enabled: true),
+ // Configure other services as needed
+ ),
+);
+
+// Start tracking events
+await EngineAnalytics.logEvent('app_opened');
+```
+
+## Features
+
+**Analytics Integration**
+- Firebase Analytics for comprehensive user behavior tracking
+- Microsoft Clarity with dual integration (adapter + widget) for session recordings, heatmaps, and custom events
+- Grafana Faro for observability and monitoring
+- Splunk for enterprise logging and analytics
+- Google Cloud Logging for centralized log management
-## 🗺️ Arquitetura da Solução
+**Bug Tracking & Monitoring**
+- Firebase Crashlytics for crash reporting
+- Automatic Flutter error handling
+- Custom error tracking with context
+- Structured logging with multiple severity levels
-### 🆔 Sistema de Session ID (Correlação Automática)
+**Developer Experience**
+- Type-safe implementation with full null safety
+- Automatic session ID correlation across all services
+- Flexible service configuration (enable/disable individually)
+- Custom widgets with built-in tracking capabilities
+- HTTP request monitoring
+- Single import entry point
+
+## Architecture
+
+Engine Tracking uses an adapter pattern to provide unified interfaces for multiple analytics and bug tracking services. Each service can be enabled or disabled independently through configuration.
+
+### Session Management
+
+```mermaid
+graph LR
+ A[App Start] --> B[Generate UUID]
+ B --> C[Session ID]
+ C --> D[Analytics Events]
+ C --> E[Bug Reports]
+ C --> F[Log Entries]
+```
+
+All tracking events automatically include a unique session ID for correlation across services.
+
+### Analytics Flow
```mermaid
graph TD
- A["App Initialization"] --> B["EngineSession.instance"]
- B --> C["Generate UUID v4"]
- C --> D["xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"]
-
- D --> E["Session ID em Memória"]
- E --> F["Auto-inject Automático"]
-
- G["EngineAnalytics.logEvent()"] --> F
- H["EngineBugTracking.log()"] --> F
- I["EngineLog.info()"] --> F
- J["Firebase Analytics"] --> F
- K["Google Cloud Logging"] --> F
- L["Crashlytics"] --> F
-
- F --> M["Enrich Data"]
- M --> N["session_id: UUID v4"]
-
- N --> O["Firebase Analytics"]
- N --> P["Google Cloud Logging"]
- N --> Q["Grafana Faro"]
- N --> R["Splunk"]
- N --> S["Crashlytics"]
-
- U["Correlação de Logs"] --> V["Mesmo session_id"]
- V --> W["Jornada Completa do Usuário"]
+ A[Your App] --> B[EngineAnalytics]
+ B --> C[Adapters]
+ C --> D[Firebase Analytics]
+ C --> E[Microsoft Clarity]
+ C --> F[Grafana Faro]
+ C --> G[Splunk]
+ C --> H[Google Cloud Logging]
```
-### 📱 Widgets Stateless e Stateful com Tracking Automático
+### Bug Tracking Flow
```mermaid
graph TD
- A["App"] --> B["EngineStatelessWidget"]
- A --> C["EngineStatefulWidget"]
-
- B --> D["buildWithTracking()"]
- C --> E["buildWithTracking()"]
-
- B --> F["Métodos Executáveis"]
- C --> G["Métodos Executáveis"]
-
- F --> H["logUserAction()"]
- F --> I["logCustomEvent()"]
- F --> J["logScreenError()"]
-
- G --> K["logUserAction()"]
- G --> L["logCustomEvent()"]
- G --> M["logScreenError()"]
- G --> N["logStateChange()"]
-
- H --> O["EngineLog.debug()"]
- I --> O
- J --> P["EngineLog.error()"]
- K --> O
- L --> O
- M --> P
- N --> O
-
- B --> Q["Lifecycle Tracking"]
- C --> R["Lifecycle Tracking"]
-
- Q --> S["screen_initialized"]
- Q --> T["screen_viewed"]
- Q --> U["screen_closed"]
-
- R --> V["screen_initialized"]
- R --> W["screen_viewed"]
- R --> X["screen_closed"]
-
- S --> O
- T --> O
- U --> O
- V --> O
- W --> O
- X --> O
+ A[Flutter Errors] --> B[EngineBugTracking]
+ A2[Custom Errors] --> B
+ B --> C[Adapters]
+ C --> D[Firebase Crashlytics]
+ C --> E[Grafana Faro]
+ C --> F[Google Cloud Logging]
```
-### 📝 Sistema de Logging (EngineLog)
+### EngineLog - Unified Logging System
+
+`EngineLog` is the central logging system that automatically abstracts and unifies calls to both Analytics and Bug Tracking services. It's the recommended way to log events as it handles service routing automatically.
```mermaid
graph TD
- A["Aplicação"] --> B["EngineLog"]
-
- B --> C["debug()"]
- B --> D["info()"]
- B --> E["warning()"]
- B --> F["error()"]
- B --> G["fatal()"]
-
- C --> H["_logWithLevel()"]
- D --> H
- E --> H
- F --> H
- G --> H
-
- H --> I["developer.log()"]
- H --> J{{"EngineAnalytics.isEnabled && includeInAnalytics?"}}
- H --> K{{"EngineBugTracking.isEnabled?"}}
-
- J -->|Sim| L["EngineAnalytics.logEvent()"]
- J -->|Não| M["Skip Analytics"]
-
- K -->|Sim| N["EngineBugTracking.log()"]
- K -->|Não| O["Skip Bug Tracking"]
-
- L --> P["Firebase Analytics"]
- L --> Q["Grafana Faro"]
- L --> R["Splunk"]
-
- N --> T["Firebase Crashlytics"]
- N --> U["Grafana Faro Bug Tracking"]
-
- K -->|Sim| V{{"level == error || fatal?"}}
- V -->|Sim| W["EngineBugTracking.recordError()"]
- V -->|Não| X["Apenas log normal"]
-
- W --> Y["Crash Reporting"]
- Y --> T
- Y --> U
+ A[Your App] --> B[EngineLog]
+ B --> C{Log Level}
+ C -->|debug/info| D[Developer Console]
+ C -->|warning/error/fatal| E[Developer Console + Services]
+ E --> F[EngineAnalytics]
+ E --> G[EngineBugTracking]
+ F --> H[All Analytics Services]
+ G --> I[All Bug Tracking Services]
```
-### 📊 Sistema de Analytics (EngineAnalytics)
+**Key Benefits:**
+- **Single API**: One method call routes to multiple services
+- **Automatic Service Detection**: Only calls enabled services
+- **Level-based Routing**: Different log levels go to appropriate services
+- **Context Preservation**: Maintains session ID and metadata across all services
+- **Performance Optimized**: No-op when services are disabled
+
+### Widget Tracking System
+
+Engine Tracking provides custom widgets that automatically track user interactions and screen lifecycle events.
```mermaid
graph TD
- A["Aplicação"] --> B["EngineAnalytics"]
-
- B --> C["init()"]
- B --> D["logEvent()"]
- B --> E["setUserId()"]
- B --> F["setUserProperty()"]
- B --> G["setPage()"]
- B --> H["logAppOpen()"]
-
- C --> I["EngineAnalyticsModel"]
- I --> J["Firebase Analytics Config"]
- I --> K["Faro Config"]
- I --> L["Splunk Config"]
- I --> M["Google Logging Config"]
-
- D --> O["Adapters"]
- E --> O
- F --> O
- G --> O
- H --> O
-
- O --> P["EngineFirebaseAnalyticsAdapter"]
- O --> Q["EngineFaroAnalyticsAdapter"]
- O --> R["EngineSplunkAnalyticsAdapter"]
- O --> S["EngineGoogleLoggingAnalyticsAdapter"]
+ A[EngineStatelessWidget] --> B[buildWithTracking]
+ C[EngineStatefulWidget] --> D[buildWithTracking]
+ B --> E[Automatic Screen Tracking]
+ D --> E
+ E --> F[screen_initialized]
+ E --> G[screen_viewed]
+ E --> H[screen_disposed]
- P --> T["Firebase Analytics SDK"]
- Q --> U["Grafana Faro SDK"]
- R --> V["Splunk SDK"]
- S --> W["Google Cloud Logging API"]
+ I[User Actions] --> J[logUserAction]
+ K[State Changes] --> L[logStateChange]
+ M[Custom Events] --> N[logCustomEvent]
- T --> X["Google Analytics Dashboard"]
- U --> Y["Grafana Dashboard"]
- V --> Z["Splunk Dashboard"]
- W --> AA["Google Cloud Console"]
+ J --> O[EngineLog]
+ L --> O
+ N --> O
+```
+
+### Navigation Observer
+
+Automatic navigation tracking with `EngineNavigationObserver`:
+
+```mermaid
+graph LR
+ A[Navigator] --> B[EngineNavigationObserver]
+ B --> C[Route Changes]
+ C --> D[EngineAnalytics.setPage]
+ D --> E[All Analytics Services]
```
-### 🐛 Sistema de Bug Tracking (EngineBugTracking)
+### HTTP Tracking System
+
+Engine Tracking provides comprehensive HTTP request/response logging through `EngineHttpOverride` and `EngineHttpTracking`.
```mermaid
graph TD
- A["Aplicação"] --> B["EngineBugTracking"]
-
- B --> C["init()"]
- B --> D["log()"]
- B --> E["recordError()"]
- B --> F["recordFlutterError()"]
- B --> G["setCustomKey()"]
- B --> H["setUserIdentifier()"]
- B --> I["testCrash()"]
-
- C --> J["EngineBugTrackingModel"]
- J --> K["Crashlytics Config"]
- J --> L["Faro Config"]
- J --> M["Google Logging Config"]
-
- D --> N["Adapters"]
- E --> N
- F --> N
- G --> N
- H --> N
- I --> N
-
- N --> O["EngineCrashlyticsAdapter"]
- N --> P["EngineFaroBugTrackingAdapter"]
- N --> Q["EngineGoogleLoggingBugTrackingAdapter"]
-
- O --> R["Firebase Crashlytics SDK"]
- P --> S["Grafana Faro SDK"]
- Q --> T["Google Cloud Logging API"]
-
- R --> U["Firebase Console"]
- S --> V["Grafana Dashboard"]
- T --> W["Google Cloud Console"]
-
- X["Flutter Error Handler"] --> F
- Y["Platform Error Handler"] --> E
-
- Z["Custom Errors"] --> E
- AA["Logging Events"] --> D
+ A[HTTP Requests] --> B[EngineHttpOverride]
+ B --> C[Request Logging]
+ B --> D[Response Logging]
+ B --> E[Error Logging]
+ C --> F[EngineLog.debug]
+ D --> F
+ E --> G[EngineLog.error]
+ F --> H[All Tracking Services]
+ G --> H
```
----
+**Key Features:**
+- **Automatic HTTP Logging**: Intercepts all HTTP requests/responses
+- **Configurable Logging**: Control what gets logged (headers, body, timing)
+- **Error Tracking**: Automatic error logging for failed requests
+- **Performance Metrics**: Request timing and performance data
+- **Chain-friendly**: Works with existing HttpOverrides (like FaroHttpOverrides)
+- **Multiple Configurations**: Development, production, and error-only presets
-## 📦 Instalação
+**Configuration Options:**
+```dart
+// Development configuration (verbose logging)
+const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: true,
+ enableBodyLogging: true,
+ maxBodyLogLength: 2000,
+ logName: 'HTTP_TRACKING_DEV',
+)
+
+// Production configuration (minimal logging)
+const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false, // Be careful with sensitive data
+ enableBodyLogging: false, // Be careful with sensitive data
+ maxBodyLogLength: 500,
+ logName: 'HTTP_TRACKING_PROD',
+)
+
+// Error-only configuration (only log failures)
+const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: false,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false,
+ enableBodyLogging: false,
+ maxBodyLogLength: 0,
+ logName: 'HTTP_ERRORS',
+)
+
+// Custom configuration
+const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false, // Be careful with sensitive data
+ enableBodyLogging: false, // Be careful with sensitive data
+ maxBodyLogLength: 1000,
+ logName: 'CUSTOM_HTTP',
+)
+```
+
+## Installation
-Adicione ao seu `pubspec.yaml`:
+Add to your `pubspec.yaml`:
```yaml
dependencies:
- engine_tracking: ^1.4.0
+ engine_tracking: ^1.5.0
```
-Execute:
+Run:
```bash
flutter pub get
```
----
-
-## 🚀 Exemplos de Uso
+## Usage Examples
-### 📱 Exemplos Inclusos
+### Complete Examples
-O pacote inclui exemplos completos demonstrando todas as funcionalidades:
+The package includes complete examples demonstrating all functionality:
```bash
cd example && flutter run
```
-- **📱 Exemplo Principal**: Inicialização, tracking de eventos, propriedades de usuário e navegação
-- **🌐 Exemplo HTTP Tracking**: Requisições com PokéAPI e JSONPlaceholder
-- **👁️ Exemplo View Tracking**: Sistema automático de tracking de telas
+Available examples:
+- **Main Example**: Initialization, event tracking, user properties, and navigation
+- **HTTP Tracking**: Requests with PokéAPI and JSONPlaceholder
+- **View Tracking**: Automatic screen tracking system
-### 🚀 Inicialização Centralizada (Recomendado)
+### Centralized Initialization (Recommended)
-**Novo!** Use o `EngineTrackingInitialize` para inicializar Analytics e Bug Tracking de uma só vez:
+Use `EngineTrackingInitialize` to initialize both Analytics and Bug Tracking:
```dart
import 'package:engine_tracking/engine_tracking.dart';
-// Ambos os serviços
+// Both services
await EngineTrackingInitialize.initWithModels(
analyticsModel: EngineAnalyticsModel(/* configs */),
bugTrackingModel: EngineBugTrackingModel(/* configs */),
);
-// Apenas Analytics
+// Analytics only
await EngineTrackingInitialize.initWithModels(
analyticsModel: EngineAnalyticsModel(/* configs */),
bugTrackingModel: null,
);
-// Apenas Bug Tracking
+// Bug tracking only
await EngineTrackingInitialize.initWithModels(
analyticsModel: null,
bugTrackingModel: EngineBugTrackingModel(/* configs */),
);
-// Com Adapters (controle granular)
+// With adapters (granular control)
await EngineTrackingInitialize.initWithAdapters(
analyticsAdapters: [EngineFirebaseAnalyticsAdapter(/* config */)],
bugTrackingAdapters: null, // Skip bug tracking
);
-// Inicialização rápida (ambos desabilitados)
+// Quick initialization (both disabled)
await EngineTrackingInitialize.initWithDefaults();
// Status
@@ -324,7 +314,84 @@ bool anyEnabled = EngineTrackingInitialize.isEnabled;
await EngineTrackingInitialize.dispose();
```
-### 🎯 Configuração Básica (Método Individual)
+### Microsoft Clarity Integration
+
+Engine Tracking provides two ways to integrate with Microsoft Clarity:
+
+#### 1. Adapter-based Integration (Recommended)
+
+The `EngineClarityAdapter` integrates Clarity into the unified analytics system:
+
+```dart
+final analyticsModel = EngineAnalyticsModel(
+ clarityConfig: const EngineClarityConfig(
+ enabled: true,
+ projectId: 'your-clarity-project-id',
+ ),
+ // ... other configs
+);
+
+await EngineAnalytics.initWithModel(analyticsModel);
+
+// All analytics calls now include Clarity
+await EngineAnalytics.logEvent('user_action');
+await EngineAnalytics.setUserId('user_123');
+await EngineAnalytics.setPage('home_screen');
+```
+
+#### 2. Widget-based Integration (For Session Recordings)
+
+Use `EngineWidget` to automatically enable session recordings and heatmaps. The widget automatically detects if Clarity has been initialized through the analytics system - no manual configuration required:
+
+```dart
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+
+ // Initialize analytics with Clarity configuration
+ final analyticsModel = EngineAnalyticsModel(
+ clarityConfig: EngineClarityConfig(
+ enabled: true,
+ projectId: 'your-clarity-project-id',
+ ),
+ // ... other configurations
+ );
+
+ await EngineAnalytics.initWithModel(analyticsModel);
+
+ // EngineWidget automatically detects and uses Clarity configuration
+ // No need to pass clarityConfig manually!
+ runApp(EngineWidget(app: MyApp()));
+}
+```
+
+#### Combined Usage (Best Practice)
+
+For complete Clarity integration, initialize analytics and use EngineWidget:
+
+```dart
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+
+ final clarityConfig = EngineClarityConfig(
+ enabled: true,
+ projectId: 'your-clarity-project-id',
+ );
+
+ // Initialize analytics with Clarity adapter
+ await EngineAnalytics.initWithModel(
+ EngineAnalyticsModel(
+ clarityConfig: clarityConfig,
+ // ... other configs
+ ),
+ );
+
+ // EngineWidget automatically detects Clarity configuration
+ // No manual configuration needed!
+ runApp(EngineWidget(app: MyApp()));
+}
+```
+
+### Individual Service Configuration
```dart
import 'package:engine_tracking/engine_tracking.dart';
@@ -334,31 +401,31 @@ Future setupTracking() async {
firebaseAnalyticsConfig: const EngineFirebaseAnalyticsConfig(enabled: true),
clarityConfig: const EngineClarityConfig(
enabled: true,
- projectId: 'seu-projeto-clarity',
+ projectId: 'your-clarity-project-id',
),
faroConfig: const EngineFaroConfig(
enabled: true,
endpoint: 'https://faro-collector.grafana.net/collect',
- appName: 'MeuApp',
+ appName: 'YourApp',
appVersion: '1.0.0',
environment: 'production',
- apiKey: 'sua-chave-api-faro',
+ apiKey: 'your-faro-api-key',
),
googleLoggingConfig: const EngineGoogleLoggingConfig(
enabled: true,
- projectId: 'seu-projeto-gcp',
+ projectId: 'your-gcp-project',
logName: 'engine-tracking',
credentials: {
"type": "service_account",
- "project_id": "seu-projeto-gcp",
+ "project_id": "your-gcp-project",
"private_key_id": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
- "client_email": "sua-service-account@seu-projeto-gcp.iam.gserviceaccount.com",
- // ... resto das credenciais
+ "client_email": "your-service-account@your-gcp-project.iam.gserviceaccount.com",
+ // ... rest of credentials
},
resource: {
'type': 'global',
- 'labels': {'project_id': 'seu-projeto-gcp'},
+ 'labels': {'project_id': 'your-gcp-project'},
},
),
splunkConfig: const EngineSplunkConfig(enabled: false),
@@ -369,10 +436,10 @@ Future setupTracking() async {
faroConfig: const EngineFaroConfig(
enabled: true,
endpoint: 'https://faro-collector.grafana.net/collect',
- appName: 'MeuApp',
+ appName: 'YourApp',
appVersion: '1.0.0',
environment: 'production',
- apiKey: 'sua-chave-api-faro',
+ apiKey: 'your-faro-api-key',
),
googleLoggingConfig: const EngineGoogleLoggingConfig(enabled: true, /* configs */),
);
@@ -382,104 +449,130 @@ Future setupTracking() async {
}
```
-### 📈 Tracking de Eventos
+### Event Tracking
```dart
-// Evento simples (Session ID incluído automaticamente)
+// Simple event (Session ID included automatically)
await EngineAnalytics.logEvent('button_clicked');
-// Evento com parâmetros
+// Event with parameters
await EngineAnalytics.logEvent('purchase_completed', {
'item_id': 'premium_plan',
'value': 29.99,
- 'currency': 'BRL',
+ 'currency': 'USD',
'category': 'subscription',
});
-// Evento de abertura do app
+// App open event
await EngineAnalytics.logAppOpen();
```
-### 👤 Gerenciamento de Usuário
+### User Management
```dart
-// Definir ID do usuário
+// Set user ID
await EngineAnalytics.setUserId('user_12345');
-// Com informações completas (para Faro/Clarity)
+// With complete information (for Faro/Clarity)
await EngineAnalytics.setUserId(
'user_12345',
- 'usuario@exemplo.com',
- 'João Silva',
+ 'user@example.com',
+ 'John Doe',
);
-// Propriedades do usuário
+// User properties
await EngineAnalytics.setUserProperty('user_type', 'premium');
await EngineAnalytics.setUserProperty('plan', 'monthly');
```
-### 🧭 Navegação de Telas
+### Screen Navigation
```dart
-// Tela simples
+// Simple screen
await EngineAnalytics.setPage('HomeScreen');
-// Com contexto completo
+// With complete context
await EngineAnalytics.setPage(
- 'ProductScreen', // Tela atual
- 'HomeScreen', // Tela anterior
- 'ECommerceApp', // Classe da tela
+ 'ProductScreen', // Current screen
+ 'HomeScreen', // Previous screen
+ 'ECommerceApp', // Screen class
);
```
-### 🐛 Bug Tracking
+### Bug Tracking
```dart
-// Log estruturado
-await EngineBugTracking.log('Usuário realizou compra', {
+// Structured logging
+await EngineBugTracking.log('User completed purchase', {
'user_id': '12345',
'product_id': 'abc-123',
'amount': 29.99,
});
-// Capturar erros
+// Capture errors
try {
- // código que pode falhar
+ // code that might fail
} catch (error, stackTrace) {
await EngineBugTracking.recordError(
error,
stackTrace,
- reason: 'Falha no processamento de pagamento',
+ reason: 'Payment processing failure',
);
}
-// Definir contexto do usuário
-await EngineBugTracking.setUserIdentifier('user_12345');
+// Set user context
+await EngineBugTracking.setUserIdentifier('user_12345', 'user@example.com', 'John Doe');
await EngineBugTracking.setCustomKey('subscription_plan', 'premium');
```
-### 📝 Sistema de Logging
+### Logging System
```dart
-// Diferentes níveis de log
-EngineLog.debug('Debug information');
-EngineLog.info('Informational message');
-EngineLog.warning('Warning message');
-EngineLog.error('Error occurred');
-EngineLog.fatal('Fatal error');
-
-// Com contexto adicional
-EngineLog.info('User action', context: {
+// Different log levels
+await EngineLog.debug('Debug information');
+await EngineLog.info('Informational message');
+await EngineLog.warning('Warning message');
+await EngineLog.error('Error occurred');
+await EngineLog.fatal('Fatal error');
+
+// With additional data
+await EngineLog.info('User action', data: {
'action': 'button_click',
'screen': 'home',
'user_id': '12345',
});
-// Incluir em analytics (padrão: false para debug/info)
-EngineLog.warning('Important warning', includeInAnalytics: true);
+// Custom log name and include in analytics
+await EngineLog.warning('Important warning',
+ logName: 'USER_ACTION',
+ includeInAnalytics: true,
+);
+
+// Error logging with exception and stack trace
+try {
+ // risky operation
+} catch (error, stackTrace) {
+ await EngineLog.error('Operation failed',
+ error: error,
+ stackTrace: stackTrace,
+ data: {'operation': 'user_registration'},
+ );
+}
+
+// Fatal error with complete context
+await EngineLog.fatal('Critical system failure',
+ logName: 'SYSTEM',
+ error: exception,
+ stackTrace: stackTrace,
+ data: {
+ 'component': 'payment_processor',
+ 'user_id': 'user_123',
+ 'transaction_id': 'tx_456',
+ },
+);
```
-### 👁️ View Tracking com Widgets
+### View Tracking with Widgets
```dart
class HomePage extends EngineStatelessWidget {
@@ -544,7 +637,7 @@ class _ShoppingCartPageState extends EngineStatefulWidgetState
@override
Widget buildWithTracking(BuildContext context) {
return Scaffold(
- appBar: AppBar(title: const Text('Carrinho')),
+ appBar: AppBar(title: const Text('Shopping Cart')),
body: ListView.builder(
itemCount: _products.length,
itemBuilder: (context, index) {
@@ -591,62 +684,498 @@ class _ShoppingCartPageState extends EngineStatefulWidgetState
}
```
-### ✅ Verificação de Status
+### Custom Widgets
+
+Engine Tracking provides several specialized widgets for enhanced tracking capabilities:
+
+#### EngineWidget - Root App Wrapper
+
+Automatically wraps your app to enable Microsoft Clarity session recordings when Clarity is initialized. The widget intelligently detects if Clarity has been configured through the analytics system and automatically enables session recordings without requiring manual configuration:
```dart
-// Verificar se analytics está habilitado
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+
+ // Initialize analytics with Clarity configuration
+ await EngineAnalytics.initWithModel(
+ EngineAnalyticsModel(
+ clarityConfig: EngineClarityConfig(
+ enabled: true,
+ projectId: 'your-clarity-project-id',
+ ),
+ firebaseAnalyticsConfig: const EngineFirebaseAnalyticsConfig(enabled: true),
+ // ... other configs
+ ),
+ );
+
+ // EngineWidget automatically detects and enables Clarity session recordings
+ // No manual clarityConfig parameter needed!
+ runApp(EngineWidget(app: MyApp()));
+}
+
+class MyApp extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: HomePage(),
+ navigatorObservers: [EngineNavigationObserver()],
+ );
+ }
+}
+
+class HomePage extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Column(
+ children: [
+ ElevatedButton(
+ onPressed: () async {
+ // This event goes to all analytics services including Clarity
+ await EngineAnalytics.logEvent('button_clicked', {
+ 'button_type': 'primary',
+ 'screen': 'home',
+ });
+ },
+ child: Text('Track Event'),
+ ),
+
+ // Mask sensitive content in Clarity recordings
+ EngineMaskWidget(
+ child: Text('Sensitive user data'),
+ ),
+ ],
+ ),
+ );
+ }
+}
+```
+
+#### EngineMaskWidget - Privacy Protection
+
+Masks sensitive content in session recordings:
+
+```dart
+class PaymentScreen extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Column(
+ children: [
+ Text('Order Summary'),
+
+ // Mask sensitive payment information
+ EngineMaskWidget(
+ child: Column(
+ children: [
+ Text('Credit Card: **** **** **** 1234'),
+ Text('CVV: 123'),
+
+ // Unmask non-sensitive info within masked area
+ EngineUnmaskWidget(
+ child: Text('Expires: 12/25'),
+ ),
+ ],
+ ),
+ ),
+
+ ElevatedButton(
+ onPressed: () => processPayment(),
+ child: Text('Pay Now'),
+ ),
+ ],
+ ),
+ );
+ }
+}
+```
+
+#### EngineStatelessWidget - Enhanced Stateless Widgets
+
+Provides automatic screen tracking and user action logging:
+
+```dart
+class ProductListPage extends EngineStatelessWidget {
+ ProductListPage({super.key});
+
+ @override
+ String get screenName => 'product_list';
+
+ @override
+ Map? get screenParameters => {
+ 'category': 'electronics',
+ 'sort_by': 'price',
+ };
+
+ @override
+ Widget buildWithTracking(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: Text('Products')),
+ body: ListView.builder(
+ itemBuilder: (context, index) {
+ return ListTile(
+ title: Text('Product $index'),
+ onTap: () {
+ // Automatically tracked user action
+ logUserAction('product_selected', parameters: {
+ 'product_id': index,
+ 'product_name': 'Product $index',
+ });
+
+ // Navigate to product details
+ Navigator.push(context,
+ MaterialPageRoute(builder: (_) => ProductDetailPage()));
+ },
+ );
+ },
+ ),
+ floatingActionButton: FloatingActionButton(
+ onPressed: () {
+ // Log custom events
+ logCustomEvent('filter_opened');
+ },
+ child: Icon(Icons.filter_list),
+ ),
+ );
+ }
+}
+```
+
+#### EngineStatefulWidget - Enhanced Stateful Widgets
+
+Includes state change tracking in addition to all EngineStatelessWidget features:
+
+```dart
+class ShoppingCartPage extends StatefulWidget {
+ @override
+ State createState() => _ShoppingCartPageState();
+}
+
+class _ShoppingCartPageState extends EngineStatefulWidgetState {
+ List _items = [];
+
+ @override
+ String get screenName => 'shopping_cart';
+
+ @override
+ Map? get screenParameters => {
+ 'initial_item_count': _items.length,
+ 'cart_value': _calculateTotal(),
+ };
+
+ @override
+ Widget buildWithTracking(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: Text('Shopping Cart')),
+ body: ListView.builder(
+ itemCount: _items.length,
+ itemBuilder: (context, index) {
+ return ListTile(
+ title: Text(_items[index].name),
+ trailing: IconButton(
+ icon: Icon(Icons.remove),
+ onPressed: () => _removeItem(index),
+ ),
+ );
+ },
+ ),
+ );
+ }
+
+ void _removeItem(int index) {
+ final removedItem = _items[index];
+
+ setState(() {
+ _items.removeAt(index);
+ });
+
+ // Track user action
+ logUserAction('item_removed', parameters: {
+ 'item_id': removedItem.id,
+ 'remaining_items': _items.length,
+ });
+
+ // Track state change
+ logStateChange('cart_updated', additionalData: {
+ 'action': 'item_removal',
+ 'new_total': _calculateTotal(),
+ });
+ }
+
+ double _calculateTotal() {
+ return _items.fold(0.0, (sum, item) => sum + item.price);
+ }
+}
+```
+
+### Navigation Observer
+
+Automatic navigation tracking with `EngineNavigationObserver`:
+
+```dart
+class MyApp extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'My App',
+ // Add the navigation observer for automatic screen tracking
+ navigatorObservers: [
+ EngineNavigationObserver(),
+ ],
+ home: HomePage(),
+ routes: {
+ '/products': (context) => ProductListPage(),
+ '/cart': (context) => ShoppingCartPage(),
+ '/profile': (context) => ProfilePage(),
+ },
+ );
+ }
+}
+```
+
+The `EngineNavigationObserver` automatically:
+- Tracks route changes and screen transitions
+- Calls `EngineAnalytics.setPage()` with screen names
+- Provides navigation context for analytics
+- Works seamlessly with both named routes and direct navigation
+
+### HTTP Request Tracking
+
+Engine Tracking provides comprehensive HTTP request/response logging:
+
+```dart
+import 'package:engine_tracking/engine_tracking.dart';
+import 'package:http/http.dart' as http;
+
+void main() async {
+ // Initialize Engine Tracking
+ await EngineTrackingInitialize.initWithModels(
+ analyticsModel: myAnalyticsModel,
+ bugTrackingModel: myBugTrackingModel,
+ // Add HTTP tracking configuration
+ httpTrackingConfig: const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: true,
+ enableBodyLogging: true,
+ maxBodyLogLength: 2000,
+ logName: 'HTTP_TRACKING_DEV',
+ ),
+ );
+
+ runApp(MyApp());
+}
+
+// HTTP requests are now automatically logged
+class ApiService {
+ Future getUser(String userId) async {
+ // This request will be automatically logged with:
+ // - Request details (method, URL, headers, timing)
+ // - Response details (status, headers, timing)
+ // - Error details (if request fails)
+ final response = await http.get(
+ Uri.parse('https://api.example.com/users/$userId'),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+
+ if (response.statusCode == 200) {
+ return User.fromJson(json.decode(response.body));
+ } else {
+ throw ApiException('Failed to load user');
+ }
+ }
+
+ Future updateUser(User user) async {
+ // POST requests are also automatically tracked
+ final response = await http.post(
+ Uri.parse('https://api.example.com/users/${user.id}'),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ body: json.encode(user.toJson()),
+ );
+
+ if (response.statusCode != 200) {
+ throw ApiException('Failed to update user');
+ }
+ }
+}
+```
+
+**Configuration Examples:**
+
+```dart
+// Development: Full logging with headers and body
+const devConfig = EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: true,
+ enableBodyLogging: true,
+ maxBodyLogLength: 2000,
+ logName: 'API_DEV',
+);
+
+// Production: Minimal logging, no sensitive data
+const prodConfig = EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false, // Disable for security
+ enableBodyLogging: false, // Disable for security
+ maxBodyLogLength: 500,
+ logName: 'API_PROD',
+);
+
+// Error-only: Only log failed requests
+const errorConfig = EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: false,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false,
+ enableBodyLogging: false,
+ maxBodyLogLength: 0,
+ logName: 'API_ERRORS',
+);
+
+// Custom configuration
+const customConfig = EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false, // Disable for security
+ enableBodyLogging: false, // Disable for security
+ maxBodyLogLength: 500,
+ logName: 'CUSTOM_API',
+);
+```
+
+**Advanced Usage:**
+
+```dart
+// Temporarily use different configuration
+await EngineHttpTracking.withConfig(
+ const EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: true,
+ enableBodyLogging: true,
+ maxBodyLogLength: 2000,
+ logName: 'DEBUG_HTTP',
+ ),
+ () async {
+ // All HTTP requests in this block use development config
+ await apiService.debugEndpoint();
+ },
+);
+
+// Temporarily disable HTTP tracking
+final restore = EngineHttpTracking.temporaryDisable();
+await sensitiveApiCall(); // This won't be logged
+restore(); // Re-enable with previous config
+
+// Chain with existing HttpOverrides (like FaroHttpOverrides)
+final config = EngineHttpTrackingConfig(
+ enabled: true,
+ enableRequestLogging: true,
+ enableResponseLogging: true,
+ enableTimingLogging: true,
+ enableHeaderLogging: false,
+ enableBodyLogging: false,
+ maxBodyLogLength: 500,
+ logName: 'HTTP_TRACKING_PROD',
+ baseOverride: FaroHttpOverrides(existingOverride),
+);
+EngineHttpTracking.initialize(config);
+
+// Log custom HTTP-related events
+await EngineHttpTracking.logCustomEvent(
+ 'API rate limit reached',
+ data: {
+ 'endpoint': '/api/users',
+ 'retry_after': 60,
+ 'request_count': 100,
+ },
+);
+
+// Get HTTP tracking statistics
+final stats = EngineHttpTracking.getStats();
+print('HTTP Tracking enabled: ${stats['is_enabled']}');
+```
+
+### Status Verification
+
+```dart
+// Check if analytics is enabled
if (EngineAnalytics.isEnabled) {
- print('✅ Analytics está ativo');
+ print('✅ Analytics is active');
+}
+
+// Check specific services
+if (EngineAnalytics.isFirebaseInitialized) {
+ print('🔥 Firebase Analytics active');
+}
+
+if (EngineAnalytics.isClarityInitialized) {
+ print('👁️ Microsoft Clarity active');
}
-// Verificar serviços específicos
-if (EngineAnalytics.isFirebaseAnalyticsEnabled) {
- print('🔥 Firebase Analytics ativo');
+if (EngineAnalytics.isFaroInitialized) {
+ print('📊 Grafana Faro active');
}
-if (EngineAnalytics.isFaroEnabled) {
- print('📊 Faro Analytics ativo');
+if (EngineAnalytics.isSplunkInitialized) {
+ print('🔍 Splunk active');
}
if (EngineAnalytics.isGoogleLoggingInitialized) {
- print('☁️ Google Cloud Logging ativo');
+ print('☁️ Google Cloud Logging active');
}
```
---
-## 🤝 Como Contribuir
+## Contributing
-Contribuições são bem-vindas! Por favor:
+Contributions are welcome! Please:
-1. Fork o projeto
-2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
-3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
-4. Push para a branch (`git push origin feature/AmazingFeature`)
-5. Abra um Pull Request
+1. Fork the project
+2. Create a feature branch (`git checkout -b feature/AmazingFeature`)
+3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
+4. Push to the branch (`git push origin feature/AmazingFeature`)
+5. Open a Pull Request
-### 📋 Diretrizes de Contribuição
+### Contribution Guidelines
-- Siga o padrão de código existente
-- Documente novas funcionalidades
-- Valide em Android e iOS
-- Atualize o CHANGELOG.md
+- Follow existing code patterns
+- Document new features
+- Test on both Android and iOS
+- Update the CHANGELOG.md
-### 📄 Licença
+### License
-Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
+This project is licensed under the MIT License - see the LICENSE file for details.
---
-## 🏢 Sobre a STMR
+## About STMR
-Desenvolvido pela **STMR** - Especialistas em soluções móveis.
+Developed by **STMR** - Mobile solutions specialists.
-A STMR é uma empresa focada no desenvolvimento de soluções tecnológicas inovadoras para dispositivos móveis, especializando-se em arquiteturas robustas, performance otimizada e experiências de usuário excepcionais.
+STMR is a company focused on developing innovative technology solutions for mobile devices, specializing in robust architectures, optimized performance, and exceptional user experiences.
-### 🎯 Nossa Missão
-Fornecer ferramentas e bibliotecas Flutter de alta qualidade que aceleram o desenvolvimento de aplicações móveis enterprise, mantendo os mais altos padrões de segurança, performance e usabilidade.
+### Our Mission
+To provide high-quality Flutter tools and libraries that accelerate enterprise mobile application development while maintaining the highest standards of security, performance, and usability.
---
-**💡 Dica v1.4.0**: Para máxima eficiência, configure apenas os serviços que você realmente utiliza. A biblioteca é otimizada para funcionar com qualquer combinação de serviços habilitados ou desabilitados. Com **Session ID automático**, você agora tem correlação completa de logs e centralização avançada! 🆔🔥
\ No newline at end of file
+**Tip**: For maximum efficiency, configure only the services you actually use. The library is optimized to work with any combination of enabled or disabled services. With automatic Session ID, you now have complete log correlation and advanced centralization!
\ No newline at end of file
diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml
index f9b3034..a09a058 100644
--- a/example/analysis_options.yaml
+++ b/example/analysis_options.yaml
@@ -1 +1,208 @@
include: package:flutter_lints/flutter.yaml
+
+formatter:
+ page_width: 120
+ trailing_commas: preserve
+
+analyzer:
+ exclude:
+ - lib/generated/**
+ - lib/translations/**
+ - lib/l10n/**
+ - lib/**/*.g.dart
+ - test/_data/**
+ - example/**
+ - examples/**
+ - build/**
+ - .dart_tool/**
+
+ # Language settings for modern Dart features
+ language:
+ strict-casts: true
+ strict-inference: true
+ strict-raw-types: true
+
+ errors:
+ # Security and runtime safety
+ invalid_assignment: error
+ missing_required_param: error
+ missing_return: error
+ dead_code: error
+ unreachable_from_main: error
+
+ # Performance warnings
+ unused_local_variable: warning
+ unused_element: warning
+ unused_field: warning
+ unused_import: warning
+ unused_shown_name: warning
+
+ # Null safety enforcement
+ receiver_of_type_never: error
+ null_check_on_nullable_type_parameter: error
+
+ # Records and patterns (Dart 3.0+)
+ record_literal_one_positional_no_trailing_comma: error
+
+ # Collections best practices
+ collection_methods_unrelated_type: error
+ unrelated_type_equality_checks: error
+
+linter:
+ rules:
+ # === SECURITY & SAFETY (2025 Critical) ===
+ # Modern security practices
+ avoid_dynamic_calls: true
+ avoid_type_to_string: true
+ avoid_web_libraries_in_flutter: true
+ secure_pubspec_urls: true
+
+ # Null safety enforcement
+ avoid_null_checks_in_equality_operators: true
+ null_check_on_nullable_type_parameter: true
+ unnecessary_null_checks: true
+ unnecessary_null_aware_assignments: true
+ unnecessary_null_aware_operator_on_extension_on_nullable: true
+ unnecessary_nullable_for_final_variable_declarations: true
+
+ # === PERFORMANCE (2025 Focus) ===
+ # Memory and performance optimization
+ avoid_unnecessary_containers: true
+ avoid_function_literals_in_foreach_calls: true
+ avoid_slow_async_io: true
+ prefer_const_constructors: true
+ prefer_const_constructors_in_immutables: true
+ prefer_const_declarations: true
+ prefer_const_literals_to_create_immutables: true
+ use_colored_box: true
+ use_decorated_box: true
+ sized_box_for_whitespace: true
+ sized_box_shrink_expand: true
+
+ # Async/Future optimization
+ avoid_void_async: true
+ unawaited_futures: true
+ discarded_futures: true
+ await_only_futures: true
+ unnecessary_await_in_return: true
+
+ # === MODERN DART FEATURES (3.0+) ===
+ # Records and patterns support
+ use_super_parameters: true
+ matching_super_parameters: true
+ use_enums: true
+
+ # === CODING STANDARDS ===
+ # Imports and organization
+ always_use_package_imports: true
+ avoid_relative_lib_imports: true
+ depend_on_referenced_packages: true
+ directives_ordering: true
+
+ # Code style consistency
+ always_declare_return_types: true
+ annotate_overrides: true
+ prefer_single_quotes: true
+ prefer_final_fields: true
+ prefer_final_locals: true
+ prefer_final_parameters: true
+ prefer_final_in_for_each: true
+
+ # === FLUTTER SPECIFIC (2025) ===
+ # Widget best practices
+ use_key_in_widget_constructors: true
+ use_full_hex_values_for_flutter_colors: true
+ sort_child_properties_last: true
+ no_logic_in_create_state: true
+ use_build_context_synchronously: true
+
+ # === ERROR PREVENTION ===
+ # Runtime error prevention
+ avoid_empty_else: true
+ avoid_returning_null_for_void: true
+ avoid_shadowing_type_parameters: true
+ avoid_types_as_parameter_names: true
+ control_flow_in_finally: true
+ empty_statements: true
+ exhaustive_cases: true
+ no_duplicate_case_values: true
+ throw_in_finally: true
+
+ # Logic and flow
+ avoid_bool_literals_in_conditional_expressions: true
+ no_literal_bool_comparisons: true
+ prefer_conditional_assignment: true
+ prefer_if_null_operators: true
+ prefer_null_aware_operators: true
+ prefer_null_aware_method_calls: true
+
+ # === READABILITY & MAINTAINABILITY ===
+ # Code organization
+ library_names: true
+ library_prefixes: true
+ file_names: true
+ package_names: true
+ constant_identifier_names: true
+ non_constant_identifier_names: true
+
+ # Documentation and comments
+ slash_for_doc_comments: true
+ comment_references: true
+ flutter_style_todos: true
+
+ # Code structure
+ curly_braces_in_flow_control_structures: true
+ empty_constructor_bodies: true
+ prefer_collection_literals: true
+ prefer_contains: true
+ prefer_expression_function_bodies: true
+ prefer_foreach: true
+ prefer_function_declarations_over_variables: true
+ prefer_if_elements_to_conditional_expressions: true
+ prefer_initializing_formals: true
+ prefer_inlined_adds: true
+ prefer_interpolation_to_compose_strings: true
+ prefer_is_empty: true
+ prefer_is_not_empty: true
+ prefer_is_not_operator: true
+ prefer_spread_collections: true
+ prefer_typing_uninitialized_variables: true
+
+ # === MODERN CLEANUP ===
+ # Remove redundancy
+ unnecessary_brace_in_string_interps: true
+ unnecessary_const: true
+ unnecessary_constructor_name: true
+ unnecessary_getters_setters: true
+ unnecessary_lambdas: true
+ unnecessary_late: true
+ unnecessary_new: true
+ unnecessary_overrides: true
+ unnecessary_parenthesis: true
+ unnecessary_raw_strings: true
+ unnecessary_statements: true
+ unnecessary_string_escapes: true
+ unnecessary_string_interpolations: true
+ unnecessary_this: true
+ unnecessary_to_list_in_spreads: true
+
+ # === PROFESSIONAL STANDARDS ===
+ # Trailing commas for better diffs
+ require_trailing_commas: true
+
+ # Parameter organization
+ avoid_positional_boolean_parameters: true
+ avoid_unused_constructor_parameters: true
+
+ # Type safety
+ avoid_equals_and_hash_code_on_mutable_classes: true
+ hash_and_equals: true
+ test_types_in_equals: true
+
+ # === DISABLED RULES (with reasons) ===
+ # Disabled: Conflicting with our style
+ # always_specify_types: false # We prefer type inference where clear
+ # public_member_api_docs: false # Internal packages don't need full docs
+ # avoid_print: false # Useful in development (use debugPrint in production)
+ # lines_longer_than_80_chars: false # We use 120 chars
+ # sort_constructors_first: false # We prefer logical grouping
diff --git a/example/lib/adapters_example.dart b/example/lib/adapters_example.dart
index d8bcaa6..ebd840a 100644
--- a/example/lib/adapters_example.dart
+++ b/example/lib/adapters_example.dart
@@ -1,3 +1,4 @@
+import 'dart:async';
import 'dart:io';
import 'package:engine_tracking/engine_tracking.dart';
@@ -11,13 +12,11 @@ class AdaptersExampleApp extends StatelessWidget {
const AdaptersExampleApp({super.key});
@override
- Widget build(BuildContext context) {
- return MaterialApp(
- title: 'Engine Tracking Adapters Demo',
- theme: ThemeData(primarySwatch: Colors.purple),
- home: const AdaptersExamplePage(title: 'Adapters Pattern Demo'),
- );
- }
+ Widget build(final BuildContext context) => MaterialApp(
+ title: 'Engine Tracking Adapters Demo',
+ theme: ThemeData(primarySwatch: Colors.purple),
+ home: const AdaptersExamplePage(title: 'Adapters Pattern Demo'),
+ );
}
class AdaptersExamplePage extends StatefulWidget {
@@ -38,7 +37,7 @@ class _AdaptersExamplePageState extends State {
@override
void initState() {
super.initState();
- _initializeServices();
+ unawaited(_initializeServices());
}
Future _initializeServices() async {
@@ -46,7 +45,6 @@ class _AdaptersExamplePageState extends State {
await _initializeBugTracking();
}
- // Configurações compartilhadas - Boa prática de reaproveitamento
static final _sharedFaroConfig = EngineFaroConfig(
enabled: true,
endpoint: 'https://faro-collector-prod-sa-east-1.grafana.net/collect',
@@ -58,9 +56,9 @@ class _AdaptersExamplePageState extends State {
platform: Platform.isAndroid ? 'android' : 'ios',
);
- static const _firebaseAnalyticsConfig = EngineFirebaseAnalyticsConfig(enabled: false);
- static const _crashlyticsConfig = EngineCrashlyticsConfig(enabled: false);
- static const _splunkConfig = EngineSplunkConfig(
+ static final _firebaseAnalyticsConfig = EngineFirebaseAnalyticsConfig(enabled: false);
+ static final _crashlyticsConfig = EngineCrashlyticsConfig(enabled: false);
+ static final _splunkConfig = EngineSplunkConfig(
enabled: false,
endpoint: 'https://splunk.example.com:8088/services/collector',
token: 'demo-token',
@@ -71,10 +69,9 @@ class _AdaptersExamplePageState extends State {
Future _initializeAnalytics() async {
try {
- // Exemplo 1: Inicialização direta com adapters
- final analyticsAdapters = [
+ final analyticsAdapters = [
EngineFirebaseAnalyticsAdapter(_firebaseAnalyticsConfig),
- EngineFaroAnalyticsAdapter(_sharedFaroConfig), // Config compartilhada
+ EngineFaroAnalyticsAdapter(_sharedFaroConfig),
EngineSplunkAnalyticsAdapter(_splunkConfig),
];
@@ -95,10 +92,9 @@ class _AdaptersExamplePageState extends State {
Future _initializeBugTracking() async {
try {
- // Exemplo 2: Inicialização com modelo tradicional reutilizando configs
final bugTrackingModel = EngineBugTrackingModel(
crashlyticsConfig: _crashlyticsConfig,
- faroConfig: _sharedFaroConfig, // Mesma config do analytics!
+ faroConfig: _sharedFaroConfig,
);
await EngineBugTracking.initWithModel(bugTrackingModel);
@@ -117,204 +113,191 @@ class _AdaptersExamplePageState extends State {
}
@override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: Text(widget.title), backgroundColor: Theme.of(context).colorScheme.inversePrimary),
- body: SingleChildScrollView(
- padding: const EdgeInsets.all(16),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- const Text(
- '🎯 Demo do Padrão Adapter',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- textAlign: TextAlign.center,
- ),
- const SizedBox(height: 20),
-
- // Analytics Status
- _buildStatusCard(
- title: '📊 Analytics Adapters',
- status: _analyticsStatus,
- isInitialized: _analyticsInitialized,
- adapters: ['Firebase Analytics Adapter', 'Grafana Faro Analytics Adapter', 'Splunk Analytics Adapter'],
- ),
-
- const SizedBox(height: 16),
-
- // Bug Tracking Status
- _buildStatusCard(
- title: '🐛 Bug Tracking Adapters',
- status: _bugTrackingStatus,
- isInitialized: _bugTrackingInitialized,
- adapters: ['Firebase Crashlytics Adapter', 'Grafana Faro Bug Tracking Adapter'],
- ),
-
- const SizedBox(height: 30),
-
- const Text('🚀 Teste as Funcionalidades:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)),
- const SizedBox(height: 16),
-
- // Analytics Actions
- _buildActionSection(
- title: 'Analytics Actions',
- actions: [
- _buildActionButton(
- 'Enviar Evento Personalizado',
- Icons.analytics,
- Colors.blue,
- _includeInAnalyticsEvent,
- ),
- _buildActionButton('Definir Propriedade do Usuário', Icons.person_add, Colors.green, _setUserProperty),
- _buildActionButton('Rastrear Tela', Icons.pageview, Colors.orange, _trackScreen),
- ],
- ),
-
- const SizedBox(height: 20),
-
- // Bug Tracking Actions
- _buildActionSection(
- title: 'Bug Tracking Actions',
- actions: [
- _buildActionButton('Log de Informação', Icons.info, Colors.cyan, _logInfo),
- _buildActionButton('Simular Erro', Icons.error, Colors.red, _simulateError),
- _buildActionButton('Definir Chave Personalizada', Icons.key, Colors.purple, _setCustomKey),
- ],
- ),
-
- const SizedBox(height: 30),
-
- // Advantages Card
- const Card(
- child: Padding(
- padding: EdgeInsets.all(16.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text('✨ Vantagens do Padrão Adapter', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
- SizedBox(height: 12),
- Text(
- '• Flexibilidade total na escolha de provedores\n'
- '• Inicialização independente de cada adapter\n'
- '• Fácil adição de novos sistemas de tracking\n'
- '• Código SOLID e extensível\n'
- '• Interface consistente para todos os adapters\n'
- '• Reaproveitamento de configurações (ex: Faro)\n'
- '• Dois métodos de inicialização: adapters direto ou modelos',
- style: TextStyle(fontSize: 14),
- ),
- ],
- ),
+ Widget build(final BuildContext context) => Scaffold(
+ appBar: AppBar(title: Text(widget.title), backgroundColor: Theme.of(context).colorScheme.inversePrimary),
+ body: SingleChildScrollView(
+ padding: const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ const Text(
+ '🎯 Demo do Padrão Adapter',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ textAlign: TextAlign.center,
+ ),
+ const SizedBox(height: 20),
+
+ _buildStatusCard(
+ title: '📊 Analytics Adapters',
+ status: _analyticsStatus,
+ isInitialized: _analyticsInitialized,
+ adapters: ['Firebase Analytics Adapter', 'Grafana Faro Analytics Adapter', 'Splunk Analytics Adapter'],
+ ),
+
+ const SizedBox(height: 16),
+
+ _buildStatusCard(
+ title: '🐛 Bug Tracking Adapters',
+ status: _bugTrackingStatus,
+ isInitialized: _bugTrackingInitialized,
+ adapters: ['Firebase Crashlytics Adapter', 'Grafana Faro Bug Tracking Adapter'],
+ ),
+
+ const SizedBox(height: 30),
+
+ const Text('🚀 Teste as Funcionalidades:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)),
+ const SizedBox(height: 16),
+
+ _buildActionSection(
+ title: 'Analytics Actions',
+ actions: [
+ _buildActionButton(
+ 'Enviar Evento Personalizado',
+ Icons.analytics,
+ Colors.blue,
+ _includeInAnalyticsEvent,
),
- ),
-
- const SizedBox(height: 16),
-
- // Config Sharing Example Card
- const Card(
- color: Color(0xFFF3E5F5),
- child: Padding(
- padding: EdgeInsets.all(16.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- '🔄 Reaproveitamento de Configurações',
- style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
- ),
- SizedBox(height: 12),
- Text(
- 'Demonstração:\n'
- '• Analytics: Inicializado com adapters diretos\n'
- '• Bug Tracking: Inicializado com modelo tradicional\n'
- '• Ambos compartilham a mesma config do Faro\n'
- '• Economia de configuração e consistência',
- style: TextStyle(fontSize: 14),
- ),
- ],
- ),
+ _buildActionButton('Definir Propriedade do Usuário', Icons.person_add, Colors.green, _setUserProperty),
+ _buildActionButton('Rastrear Tela', Icons.pageview, Colors.orange, _trackScreen),
+ ],
+ ),
+
+ const SizedBox(height: 20),
+
+ _buildActionSection(
+ title: 'Bug Tracking Actions',
+ actions: [
+ _buildActionButton('Log de Informação', Icons.info, Colors.cyan, _logInfo),
+ _buildActionButton('Simular Erro', Icons.error, Colors.red, _simulateError),
+ _buildActionButton('Definir Chave Personalizada', Icons.key, Colors.purple, _setCustomKey),
+ ],
+ ),
+
+ const SizedBox(height: 30),
+
+ const Card(
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('✨ Vantagens do Padrão Adapter', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
+ SizedBox(height: 12),
+ Text(
+ '• Flexibilidade total na escolha de provedores\n'
+ '• Inicialização independente de cada adapter\n'
+ '• Fácil adição de novos sistemas de tracking\n'
+ '• Código SOLID e extensível\n'
+ '• Interface consistente para todos os adapters\n'
+ '• Reaproveitamento de configurações (ex: Faro)\n'
+ '• Dois métodos de inicialização: adapters direto ou modelos',
+ style: TextStyle(fontSize: 14),
+ ),
+ ],
),
),
- ],
- ),
- ),
- );
- }
+ ),
- Widget _buildStatusCard({
- required String title,
- required String status,
- required bool isInitialized,
- required List adapters,
- }) {
- return Card(
- elevation: 2,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
- const SizedBox(height: 8),
- Container(
- padding: const EdgeInsets.all(12),
- decoration: BoxDecoration(
- color: isInitialized ? Colors.green[50] : Colors.orange[50],
- border: Border.all(color: isInitialized ? Colors.green : Colors.orange),
- borderRadius: BorderRadius.circular(8),
- ),
- child: Row(
+ const SizedBox(height: 16),
+
+ const Card(
+ color: Color(0xFFF3E5F5),
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Icon(
- isInitialized ? Icons.check_circle : Icons.info,
- color: isInitialized ? Colors.green : Colors.orange,
+ Text(
+ '🔄 Reaproveitamento de Configurações',
+ style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
+ ),
+ SizedBox(height: 12),
+ Text(
+ 'Demonstração:\n'
+ '• Analytics: Inicializado com adapters diretos\n'
+ '• Bug Tracking: Inicializado com modelo tradicional\n'
+ '• Ambos compartilham a mesma config do Faro\n'
+ '• Economia de configuração e consistência',
+ style: TextStyle(fontSize: 14),
),
- const SizedBox(width: 8),
- Expanded(child: Text(status, style: const TextStyle(fontSize: 14))),
],
),
),
- const SizedBox(height: 12),
- const Text('Adapters disponíveis:', style: TextStyle(fontWeight: FontWeight.w500)),
- const SizedBox(height: 4),
- ...adapters.map(
- (adapter) => Padding(
- padding: const EdgeInsets.only(left: 16, top: 2),
- child: Text('• $adapter', style: const TextStyle(fontSize: 12, color: Colors.grey)),
- ),
+ ),
+ ],
+ ),
+ ),
+ );
+
+ Widget _buildStatusCard({
+ required final String title,
+ required final String status,
+ required final bool isInitialized,
+ required final List adapters,
+ }) => Card(
+ elevation: 2,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
+ const SizedBox(height: 8),
+ Container(
+ padding: const EdgeInsets.all(12),
+ decoration: BoxDecoration(
+ color: isInitialized ? Colors.green[50] : Colors.orange[50],
+ border: Border.all(color: isInitialized ? Colors.green : Colors.orange),
+ borderRadius: BorderRadius.circular(8),
),
- ],
- ),
+ child: Row(
+ children: [
+ Icon(
+ isInitialized ? Icons.check_circle : Icons.info,
+ color: isInitialized ? Colors.green : Colors.orange,
+ ),
+ const SizedBox(width: 8),
+ Expanded(child: Text(status, style: const TextStyle(fontSize: 14))),
+ ],
+ ),
+ ),
+ const SizedBox(height: 12),
+ const Text('Adapters disponíveis:', style: TextStyle(fontWeight: FontWeight.w500)),
+ const SizedBox(height: 4),
+ ...adapters.map(
+ (final adapter) => Padding(
+ padding: const EdgeInsets.only(left: 16, top: 2),
+ child: Text('• $adapter', style: const TextStyle(fontSize: 12, color: Colors.grey)),
+ ),
+ ),
+ ],
),
- );
- }
+ ),
+ );
- Widget _buildActionSection({required String title, required List actions}) {
- return Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)),
- const SizedBox(height: 12),
- ...actions.map((action) => Padding(padding: const EdgeInsets.only(bottom: 8), child: action)),
- ],
- );
- }
+ Widget _buildActionSection({required final String title, required final List actions}) => Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)),
+ const SizedBox(height: 12),
+ ...actions.map((final action) => Padding(padding: const EdgeInsets.only(bottom: 8), child: action)),
+ ],
+ );
- Widget _buildActionButton(String label, IconData icon, Color color, VoidCallback onPressed) {
- return SizedBox(
- width: double.infinity,
- child: ElevatedButton.icon(
- onPressed: onPressed,
- icon: Icon(icon),
- label: Text(label),
- style: ElevatedButton.styleFrom(
- backgroundColor: color,
- foregroundColor: Colors.white,
- padding: const EdgeInsets.symmetric(vertical: 12),
+ Widget _buildActionButton(final String label, final IconData icon, final Color color, final VoidCallback onPressed) =>
+ SizedBox(
+ width: double.infinity,
+ child: ElevatedButton.icon(
+ onPressed: onPressed,
+ icon: Icon(icon),
+ label: Text(label),
+ style: ElevatedButton.styleFrom(
+ backgroundColor: color,
+ foregroundColor: Colors.white,
+ padding: const EdgeInsets.symmetric(vertical: 12),
+ ),
),
- ),
- );
- }
+ );
Future _includeInAnalyticsEvent() async {
await EngineAnalytics.logEvent('adapter_demo_event', {
@@ -365,35 +348,32 @@ class _AdaptersExamplePageState extends State {
_showSnackBar('Chave personalizada definida!', Colors.purple);
}
- void _showSnackBar(String message, Color color) {
+ void _showSnackBar(final String message, final Color color) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(message), backgroundColor: color, duration: const Duration(seconds: 2)));
}
}
-void adaptersFlexibleExample() async {
- // Exemplo 1: Usando apenas Firebase Analytics
- final firebaseAnalyticsAdapter = EngineFirebaseAnalyticsAdapter(const EngineFirebaseAnalyticsConfig(enabled: true));
+Future adaptersFlexibleExample() async {
+ final firebaseAnalyticsAdapter = EngineFirebaseAnalyticsAdapter(EngineFirebaseAnalyticsConfig(enabled: true));
await EngineAnalytics.init([firebaseAnalyticsAdapter]);
- // Exemplo 2: Configurações compartilhadas entre Analytics e Bug Tracking
- // Esta é uma prática recomendada para reaproveitar configurações
final sharedFaroConfig = EngineFaroConfig(
enabled: true,
endpoint: 'https://faro-collector.grafana.net/collect',
appName: 'MyApp',
appVersion: '1.0.0',
environment: 'production',
- apiKey: 'your-shared-faro-api-key', // Mesma chave para analytics e bug tracking
+ apiKey: 'your-shared-faro-api-key',
namespace: 'exemple',
platform: Platform.isAndroid ? 'android' : 'ios',
);
- const firebaseAnalyticsConfig = EngineFirebaseAnalyticsConfig(enabled: true);
- const crashlyticsConfig = EngineCrashlyticsConfig(enabled: true);
- const splunkConfig = EngineSplunkConfig(
+ final firebaseAnalyticsConfig = EngineFirebaseAnalyticsConfig(enabled: true);
+ final crashlyticsConfig = EngineCrashlyticsConfig(enabled: true);
+ final splunkConfig = EngineSplunkConfig(
enabled: true,
endpoint: 'https://splunk-hec.example.com:8088/services/collector',
token: 'your-hec-token',
@@ -402,50 +382,49 @@ void adaptersFlexibleExample() async {
index: 'main',
);
- // Analytics adapters usando configurações compartilhadas
- final analyticsAdapters = [
+ final analyticsAdapters = [
EngineFirebaseAnalyticsAdapter(firebaseAnalyticsConfig),
- EngineFaroAnalyticsAdapter(sharedFaroConfig), // Reutilizando config
+ EngineFaroAnalyticsAdapter(sharedFaroConfig),
EngineSplunkAnalyticsAdapter(splunkConfig),
];
- // Bug tracking adapters reutilizando a mesma config do Faro
- final bugTrackingAdapters = [
+ final bugTrackingAdapters = [
EngineCrashlyticsAdapter(crashlyticsConfig),
- EngineFaroBugTrackingAdapter(sharedFaroConfig), // Mesma config reutilizada!
+ EngineFaroBugTrackingAdapter(sharedFaroConfig),
];
- // Inicialização simultânea dos serviços
- await Future.wait([EngineAnalytics.init(analyticsAdapters), EngineBugTracking.init(bugTrackingAdapters)]);
+ await Future.wait([
+ EngineAnalytics.init(analyticsAdapters),
+ EngineBugTracking.init(bugTrackingAdapters),
+ ]);
- // Exemplo 3: Usando modelos tradicionais com configurações compartilhadas
final analyticsModel = EngineAnalyticsModel(
firebaseAnalyticsConfig: firebaseAnalyticsConfig,
- faroConfig: sharedFaroConfig, // Reutilizando mesma config
+ faroConfig: sharedFaroConfig,
splunkConfig: splunkConfig,
+ clarityConfig: null,
+ googleLoggingConfig: null,
);
final bugTrackingModel = EngineBugTrackingModel(
crashlyticsConfig: crashlyticsConfig,
- faroConfig: sharedFaroConfig, // Mesma config compartilhada
+ faroConfig: sharedFaroConfig,
);
- // Reinicialização usando modelos (demonstra flexibilidade)
await EngineAnalytics.dispose();
await EngineBugTracking.dispose();
await Future.wait([EngineAnalytics.initWithModel(analyticsModel), EngineBugTracking.initWithModel(bugTrackingModel)]);
- // Exemplo de uso após inicialização
await EngineAnalytics.logEvent('adapter_demo', {'demo': 'true'});
await EngineBugTracking.log('Demo app started');
}
-class CustomAnalyticsAdapter implements IEngineAnalyticsAdapter {
+class CustomAnalyticsAdapter implements IEngineAnalyticsAdapter {
final bool _enabled;
bool _isInitialized = false;
- CustomAnalyticsAdapter({required bool enabled}) : _enabled = enabled;
+ CustomAnalyticsAdapter({required final bool enabled}) : _enabled = enabled;
@override
String get adapterName => 'Custom Analytics';
@@ -460,64 +439,71 @@ class CustomAnalyticsAdapter implements IEngineAnalyticsAdapter {
Future initialize() async {
if (!isEnabled || _isInitialized) return;
- print('Inicializando Custom Analytics Adapter...');
+ debugPrint('Inicializando Custom Analytics Adapter...');
_isInitialized = true;
}
@override
Future dispose() async {
- print('Finalizando Custom Analytics Adapter...');
+ debugPrint('Finalizando Custom Analytics Adapter...');
_isInitialized = false;
}
@override
- Future logEvent(String name, [Map? parameters]) async {
+ Future logEvent(final String name, [final Map? parameters]) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - Evento: $name, Parâmetros: $parameters');
+ debugPrint('Custom Analytics - Evento: $name, Parâmetros: $parameters');
}
@override
- Future setUserId(String? userId, [String? email, String? name]) async {
+ Future setUserId(final String? userId, [final String? email, final String? name]) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - Usuário: $userId, Email: $email, Nome: $name');
+ debugPrint('Custom Analytics - Usuário: $userId, Email: $email, Nome: $name');
}
@override
- Future setUserProperty(String name, String? value) async {
+ Future setUserProperty(final String name, final String? value) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - Propriedade: $name = $value');
+ debugPrint('Custom Analytics - Propriedade: $name = $value');
}
@override
- Future setPage(String screenName, [String? previousScreen, Map? parameters]) async {
+ Future setPage(
+ final String screenName, [
+ final String? previousScreen,
+ final Map? parameters,
+ ]) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - Página: $screenName');
+ debugPrint('Custom Analytics - Página: $screenName');
}
@override
- Future logAppOpen([Map? parameters]) async {
+ Future logAppOpen([final Map? parameters]) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - App aberto');
+ debugPrint('Custom Analytics - App aberto');
}
@override
Future reset() async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Analytics - Reset');
+ debugPrint('Custom Analytics - Reset');
}
+
+ @override
+ IEngineConfig get config => throw UnimplementedError();
}
-class CustomBugTrackingAdapter implements IEngineBugTrackingAdapter {
+class CustomBugTrackingAdapter implements IEngineBugTrackingAdapter {
final bool _enabled;
bool _isInitialized = false;
- CustomBugTrackingAdapter({required bool enabled}) : _enabled = enabled;
+ CustomBugTrackingAdapter({required final bool enabled}) : _enabled = enabled;
@override
String get adapterName => 'Custom Bug Tracking';
@@ -532,68 +518,75 @@ class CustomBugTrackingAdapter implements IEngineBugTrackingAdapter {
Future initialize() async {
if (!isEnabled || _isInitialized) return;
- print('Inicializando Custom Bug Tracking Adapter...');
+ debugPrint('Inicializando Custom Bug Tracking Adapter...');
_isInitialized = true;
}
@override
Future dispose() async {
- print('Finalizando Custom Bug Tracking Adapter...');
+ debugPrint('Finalizando Custom Bug Tracking Adapter...');
_isInitialized = false;
}
@override
- Future setCustomKey(String key, Object value) async {
+ Future setCustomKey(final String key, final Object value) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Bug Tracking - Chave personalizada: $key = $value');
+ debugPrint('Custom Bug Tracking - Chave personalizada: $key = $value');
}
@override
- Future setUserIdentifier(String id, String email, String name) async {
+ Future setUserIdentifier(final String id, final String email, final String name) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Bug Tracking - Usuário: $id, Email: $email, Nome: $name');
+ debugPrint('Custom Bug Tracking - Usuário: $id, Email: $email, Nome: $name');
}
@override
- Future log(String message, {String? level, Map? attributes, StackTrace? stackTrace}) async {
+ Future log(
+ final String message, {
+ final String? level,
+ final Map? attributes,
+ final StackTrace? stackTrace,
+ }) async {
if (!isEnabled || !_isInitialized) return;
- print('Custom Bug Tracking - Log: $message [Level: $level]');
+ debugPrint('Custom Bug Tracking - Log: $message [Level: $level]');
}
@override
Future recordError(
- dynamic exception,
- StackTrace? stackTrace, {
- String? reason,
- Iterable