From 3cb32a4d69162ad45014f5886e44810834308af9 Mon Sep 17 00:00:00 2001 From: Robertus Date: Wed, 27 May 2026 19:36:01 +0700 Subject: [PATCH] Update UI + Agora Call --- .gitignore | 4 + Exam Guide.md | 411 +++ walkguide-backend/demo/backend-run.err.log | 7 + walkguide-backend/demo/backend-run.log | 2867 +++++++++++++++++ walkguide-backend/demo/pom.xml | 7 + .../com/walkguide/config/FirebaseConfig.java | 52 + .../walkguide/controller/CallController.java | 70 +- .../exception/GlobalExceptionHandler.java | 8 + .../service/CallNotificationService.java | 131 +- .../com/walkguide/service/FcmService.java | 146 +- .../com/walkguide/service/PairingService.java | 88 +- .../com/walkguide/service/SosService.java | 17 +- .../websocket/LocationBroadcaster.java | 59 +- .../src/main/resources/application-dev.yml | 15 +- .../src/main/resources/application.properties | 14 +- .../com/walkguide/service/SosServiceTest.java | 52 +- .../android/app/build.gradle.kts | 4 + .../walkguide_app/android/gradle.properties | 7 +- .../walkguide_app/android/settings.gradle.kts | 1 + .../walkguide_app/lib/app/app.dart | 75 +- .../lib/app/injection_container.dart | 22 +- .../walkguide_app/lib/app/router.dart | 21 +- .../lib/core/constants/app_constants.dart | 6 +- .../lib/core/errors/friendly_error.dart | 4 + .../lib/core/services/call_service.dart | 161 +- .../lib/core/services/fcm_service.dart | 51 +- .../incoming_call_polling_service.dart | 45 + .../lib/core/services/websocket_service.dart | 55 +- .../lib/core/theme/app_colors.dart | 11 +- .../lib/features/auth/login_screen.dart | 50 +- .../lib/features/auth/splash_screen.dart | 2 + .../lib/features/call/call_screen.dart | 767 +++-- .../guardian_dashboard_screen.dart | 933 +++--- .../lib/features/pairing/pairing_screens.dart | 189 +- .../server_connect/server_connect_server.dart | 401 ++- .../lib/features/sos/sos_screen.dart | 206 +- .../walk_guide/walk_guide_screen.dart | 702 +++- walkguide-mobile/walkguide_app/lib/main.dart | 10 +- .../lib/shared/widgets/app_shells.dart | 48 +- .../lib/shared/widgets/feature_page.dart | 81 +- .../walkguide_app/walkguide_now.png | Bin 0 -> 463385 bytes walkguide-mobile/walkguide_app/web/index.html | 1 + 42 files changed, 6516 insertions(+), 1285 deletions(-) create mode 100644 Exam Guide.md create mode 100644 walkguide-backend/demo/backend-run.err.log create mode 100644 walkguide-backend/demo/backend-run.log create mode 100644 walkguide-backend/demo/src/main/java/com/walkguide/config/FirebaseConfig.java create mode 100644 walkguide-mobile/walkguide_app/lib/core/services/incoming_call_polling_service.dart create mode 100644 walkguide-mobile/walkguide_app/walkguide_now.png diff --git a/.gitignore b/.gitignore index 49b8309..ed227fa 100644 --- a/.gitignore +++ b/.gitignore @@ -40,8 +40,12 @@ build/ .env *.env +walkguide-backend/demo/secrets.properties walkguide-backend/demo/hs_err_pid*.log +walkguide-backend/demo/src/main/resources/firebase/*.json +walkguide-mobile/walkguide_app/android/app/google-services.json +walkguide-mobile/walkguide_app/ios/Runner/GoogleService-Info.plist # Android SDK path (generated by Android Studio) walkguide-mobile/walkguide_app/android/local.properties diff --git a/Exam Guide.md b/Exam Guide.md new file mode 100644 index 0000000..2cb48ca --- /dev/null +++ b/Exam Guide.md @@ -0,0 +1,411 @@ +# 📱 Final Exam: Integrated Mobile Application Project +### Flutter × Spring Boot × Object-Oriented Analysis and Design +#### Group Assignment (3 Members) — Industry-Grade Level + +--- + +## Overview + +This final exam requires your group to design, develop, and deliver a **fully integrated mobile application system** consisting of: + +- A **Flutter mobile frontend** that consumes a RESTful API +- A **Spring Boot backend** that exposes the API with proper layering, security, and persistence +- A rigorous **OOAD process** — designed before coding, then verified against the final implementation + +The project is evaluated across three distinct dimensions with different grade weights. This is intentional: **design thinking (OOAD) is the foundation**, engineering quality (Flutter + Spring Boot) is the execution. + +--- + +## Group Formation & Role Distribution + +Each group consists of **exactly 3 members**. Each member owns one primary pillar but all members must understand and contribute to all three. + +| Role | Primary Pillar | Core Responsibilities | +|---|---|---| +| **OOAD Lead** | Object-Oriented Analysis & Design | Leads all design artifacts (use case, class, sequence, state diagrams), enforces design pattern compliance across both codebases, owns the design traceability matrix | +| **Flutter Engineer** | Mobile Frontend | Clean Architecture implementation, state management, UI/UX, performance benchmarking | +| **Backend Engineer** | Spring Boot API | REST API design, service/repository layers, database schema, security (JWT), API documentation, backend testing | + +> **Important:** Role ownership means accountability, not isolation. All members must commit code to both repositories. The OOAD Lead reviews both codebases for pattern compliance — this is a graded responsibility. + +--- + +## Project Topic + +Your group is free to choose any application domain, provided it: + +- Models a real-world problem with identifiable actors, use cases, and entities +- Requires meaningful backend logic (not just CRUD — include at least one business rule or workflow) +- Has a clear primary user and at least one secondary actor (admin, system, or external service) + +**Example domains** *(create your own — do not copy)*: +- Hospital appointment and queue management +- Campus asset borrowing and return tracking +- Community marketplace with seller verification flow +- Event ticketing with seat allocation logic +- Employee attendance with approval workflow + +--- + +## Pillar 1 — Object-Oriented Analysis & Design (OOAD) + +OOAD is evaluated in **two phases**: design artifacts produced before coding, and a traceability audit conducted against the final code. + +### Phase 1A: Pre-Development Design Artifacts + +All diagrams must be produced using **PlantUML, draw.io, or StarUML** and submitted as part of the Week 2–3 checkpoint. Diagrams drawn by hand are not accepted. + +| Artifact | Diagram Type | Requirement | +|---|---|---| +| Requirements model | Use Case Diagram | All actors, use cases, include/extend relationships | +| Structural model | Class Diagram | All domain classes with attributes, methods, visibility, and relationships (association, aggregation, composition, inheritance) | +| Behavioral model | Sequence Diagrams | At least 3 key interactions (e.g., login, create resource, approval flow) showing object collaboration | +| State model | State Machine Diagram | At least 1 entity with meaningful state transitions (e.g., Order: PENDING → CONFIRMED → COMPLETED → CANCELLED) | +| Data model | ERD (Crow's Foot notation) | All entities, PKs/FKs, cardinality — must align with the class diagram | +| Architecture model | Component Diagram | Flutter app, Spring Boot layers, database, and external services as components with interfaces | + +### Phase 1B: Design Pattern Compliance + +Your system must implement **at least 4 GoF design patterns** across the full stack, with at least 1 from each category: + +| Category | Required Count | Examples | +|---|---|---| +| Creational | ≥ 1 | Factory Method, Builder, Singleton | +| Structural | ≥ 1 | Adapter, Facade, Decorator, Proxy | +| Behavioral | ≥ 2 | Strategy, Observer, Command, Template Method, Chain of Responsibility | + +Each pattern must be documented with: +1. Pattern name and category +2. Which class/component implements it (with file path) +3. UML class diagram showing the pattern in context +4. Justification — why this pattern was chosen over alternatives + +### Phase 1C: Design Traceability Audit (Post-Development) + +After development is complete, the OOAD Lead conducts a **traceability audit** comparing the pre-development design to the final code: + +- For each class in the original class diagram: does it exist in code? If not, explain why. +- For each design pattern: show the exact code that implements it (file + line reference). +- For each sequence diagram: trace the method call chain in the actual code. +- Document all **design deviations** — cases where implementation diverged from design — with a written rationale for each deviation. + +> A perfect match between design and code is not required. Thoughtful, documented deviations are acceptable. Undocumented deviations are penalized. + +--- + +## Pillar 2 — Flutter Mobile Frontend + +### Technical Requirements + +| Category | Requirement | +|---|---| +| **Flutter Version** | Flutter 3.x (Stable channel) | +| **Architecture** | Clean Architecture — strict 4-layer separation: `domain / data / application / presentation` | +| **State Management** | BLoC or Riverpod (consistent throughout; mixing is not allowed) | +| **Navigation** | Go Router with at least 6 distinct screens and route guards for authenticated routes | +| **API Communication** | `Dio` with interceptors for JWT token injection, refresh token handling, and error normalization | +| **Local Persistence** | Hive or SQLite for offline caching of at least one core data entity | +| **Authentication** | JWT-based login/register consuming the Spring Boot auth endpoint | +| **UI/UX** | Custom widget library (min. 5 reusable widgets), responsive layout, consistent design system | +| **Error Handling** | Typed failure classes using `Either` (dartz) or equivalent; no raw `try/catch` in UI layer | + +### Folder Structure (Enforced) + +``` +lib/ +├── core/ # shared utilities, theme, constants, error types +├── features/ +│ └── [feature]/ +│ ├── domain/ # entities, repository interfaces, use cases +│ ├── data/ # repository implementations, DTOs, data sources +│ └── presentation/ # BLoC/Cubit, pages, widgets +└── main.dart +``` + +Any structure deviating from feature-first modular layout must be approved in writing before Week 4. + +### Advanced Features (Choose at least 2) + +- Real-time updates via WebSocket or Server-Sent Events from Spring Boot +- Push notifications triggered by backend events (FCM) +- Offline-first with background sync to Spring Boot API +- Animated transitions using custom `PageRouteBuilder` or Lottie +- Internationalization (i18n) with at least 2 languages +- Biometric authentication (fingerprint/face ID) as second factor + +### Flutter Testing & Benchmarking + +#### Functional Testing + +| Type | Tool | Minimum | +|---|---|---| +| Unit Testing | `flutter_test` | All use cases and repository implementations | +| Widget Testing | `flutter_test` | At least 5 core UI components | +| Integration Testing | `integration_test` | At least 3 end-to-end flows against the live Spring Boot API | + +#### Performance Benchmarking + +Run all benchmarks on a **physical Android device in profile mode** (`flutter run --profile`). Emulator results alone are not accepted. + +| Metric | Tool | Pass Threshold | +|---|---|---| +| Memory — baseline | DevTools → Memory tab | Report heap at launch (MB) | +| Memory — leak check | DevTools → Memory tab | No steady growth over 10 repeated navigations | +| Frame rate / jank | DevTools → Performance tab | ≥ 90% frames < 16ms (60fps target) | +| CPU profile | DevTools → CPU Profiler | Flame graph for top 3 CPU-heavy operations | +| API latency (client-side) | Dio interceptor logs | All core endpoints < 1500ms | +| Cold start time | `--trace-startup --profile` | `timeToFirstFrame` < 3000ms | +| APK size | `flutter build apk --analyze-size` | Release APK < 50MB | + +Each benchmark must be reported with: objective, tool, method, results table, threshold comparison, and DevTools screenshot. + +**Regression requirement:** Run benchmarks at Week 5 (mid-sprint) and at Week 7 (final). Submit a delta table comparing both runs. Any metric that degrades > 20% must include a root cause analysis and remediation. + +--- + +## Pillar 3 — Spring Boot Backend + +### Technical Requirements + +| Category | Requirement | +|---|---| +| **Java Version** | Java 17+ | +| **Framework** | Spring Boot 3.x | +| **Architecture** | Layered: `Controller → Service → Repository` (no logic in Controller, no DB calls in Service) | +| **Database** | PostgreSQL or MySQL with JPA/Hibernate; schema migrations via Flyway | +| **Security** | Spring Security with JWT (access token + refresh token); role-based access control (RBAC) | +| **API Design** | RESTful conventions; versioned endpoints (`/api/v1/...`); proper HTTP status codes | +| **Validation** | Bean Validation (`@Valid`) on all request DTOs; global exception handler via `@ControllerAdvice` | +| **Documentation** | Swagger/OpenAPI 3.0 via `springdoc-openapi`; all endpoints documented with schemas | +| **Configuration** | Environment-separated configs (`application-dev.yml`, `application-prod.yml`); no hardcoded secrets | + +### API Contract Requirements + +- Minimum **10 distinct REST endpoints** covering the full application domain +- All endpoints must return a **consistent response envelope**: + +```json +{ + "success": true, + "data": {}, + "message": "Operation successful", + "timestamp": "2025-01-01T00:00:00Z" +} +``` + +- Error responses must include: `success: false`, `errorCode`, `message`, and `timestamp` +- API contract must be defined as an **OpenAPI 3.0 YAML file** committed to the repository before development begins (design-first) + +### Backend Testing & Benchmarking + +#### Functional Testing + +| Type | Tool | Minimum | +|---|---|---| +| Unit Testing | JUnit 5 + Mockito | All service classes; mock repository layer | +| Integration Testing | `@SpringBootTest` + MockMvc | All controller endpoints; test DB via Testcontainers | +| Code Coverage | JaCoCo | ≥ 70% line coverage on `service` and `controller` packages | + +#### Load Benchmarking + +| Metric | Tool | Pass Threshold | +|---|---|---| +| API throughput | Apache JMeter or k6 | ≥ 100 req/s under 50 concurrent users | +| p95 latency | JMeter or k6 | < 500ms under load | +| Error rate under load | JMeter or k6 | < 1% at 50 concurrent users | +| DB query performance | Spring Actuator + slow query log | No query > 200ms for standard operations | +| JVM memory under load | Actuator `/actuator/metrics` | No heap exhaustion during 5-min load test | + +Load test scenario: simulate 50 concurrent users performing a realistic user journey (login → fetch list → create resource → logout) for 5 minutes. Export JMeter `.jtl` report or k6 summary as evidence. + +--- + +## Deliverables + +### 1. 📁 GitHub Repositories (2 repos) + +**Flutter Repository** (`[GroupName]-[AppName]-mobile-final`): +- Feature-first clean architecture folder structure +- GitHub Actions workflow (`.github/workflows/flutter.yml`) — green at submission +- `README.md`: setup instructions, environment variables, APK download link +- All 3 members must have commits; branching strategy enforced + +**Spring Boot Repository** (`[GroupName]-[AppName]-backend`): +- Layered package structure (`controller`, `service`, `repository`, `domain`, `dto`, `config`) +- Flyway migration scripts in `resources/db/migration/` +- OpenAPI YAML committed before Week 4 +- `README.md`: setup instructions, environment variables, how to run locally +- JaCoCo HTML coverage report committed or published via CI + +### 2. 📦 APK File + +- Release build named `[GroupName]_[AppName]_FinalExam.apk` +- Must connect to a **live, publicly deployed** Spring Boot backend (not localhost) +- Acceptable deployment platforms: Railway, Render, Fly.io, or any public URL + +### 3. 📄 Written Report + +Format: PDF, minimum **25 pages** (excluding cover and references). Language: English or Bahasa Indonesia. + +| # | Section | Description | +|---|---|---| +| 1 | Cover Page | System name, group name, member names & student IDs, course name, date | +| 2 | Abstract | 200–250 words covering the system, tech stack, and key findings | +| 3 | Introduction | Problem background, objectives, target users, scope and limitations | +| 4 | OOAD — Pre-Development | All design artifacts (use case, class, sequence, state, ERD, component diagrams) | +| 5 | OOAD — Design Patterns | Documentation of all 4+ patterns with UML and code references | +| 6 | OOAD — Traceability Audit | Design-to-code mapping table; documented deviations with rationale | +| 7 | System Architecture | Flutter Clean Architecture, Spring Boot layers, API communication flow diagram | +| 8 | API Contract | OpenAPI summary, endpoint table, request/response examples | +| 9 | Flutter Implementation | Key features, state management flow, custom widgets, advanced features | +| 10 | Spring Boot Implementation | Service layer logic, security config, DB schema, Flyway migrations | +| 11 | Flutter Testing & Benchmarking | Test results, all 7 benchmark metrics with evidence and delta table | +| 12 | Backend Testing & Benchmarking | JUnit/integration test results, JMeter/k6 load test report | +| 13 | Team Contribution | Per-member task table with percentage, cross-verified with Git commit history | +| 14 | Conclusion | Achievements, design lessons learned, challenges, future improvements | +| 15 | References | IEEE format | + +### 4. Presentation + +- Duration: **15–20 minutes** +- Structure: + - Team introduction + system overview (2 min) + - OOAD design walkthrough — diagrams and pattern explanation (4–5 min) + - Flutter app live demo — all major flows (5–6 min) + - Spring Boot API demo — Swagger UI + one live API call (3 min) + - Benchmark results summary (2 min) +- All 3 members must present a section +- Upload to YouTube (unlisted) or Google Drive + +> **Live Session:** Each member will be questioned individually on the section they presented and on OOAD concepts. Individual scores may differ from the group score. + +--- + +## Timeline + +| Phase | Activity | Deadline | +|---|---|---| +| Week 1 | Group registration + topic proposal + actor/use case list | Day 7 | +| Week 2–3 | All OOAD Phase 1A artifacts submitted + OpenAPI YAML drafted | Day 21 | +| Week 4 | Architecture approved; development sprint begins | Day 28 | +| Week 5 | Mid-sprint benchmark run (Flutter + Backend) submitted | Day 35 | +| Week 6–7 | Feature freeze; Flutter ↔ Spring Boot integration testing | Day 49 | +| Week 7 | Final benchmark run; delta table completed | Day 49 | +| Week 8 | OOAD traceability audit completed; report writing + video | Day 56 | +| **Final** | **All deliverables submitted** | **Day 60, 23:59** | +| Final+1 | Live presentation & individual Q&A | Scheduled by lecturer | + +--- + +## Grading Rubric + +Each pillar is graded **independently out of 100 points**. Students receive three separate scores — one per pillar. There is no combined final grade: each score stands on its own and is recorded separately. + +--- + +### 🥇 Pillar 1 — OOAD Score (/ 100) + +| Component | Points | Criteria | +|---|---|---| +| Pre-development design artifacts | 35 | Completeness of all 6 required diagrams, correctness of notation, diagram tool used (no hand-drawn), submitted before coding begins | +| Design pattern implementation | 25 | Correct application of ≥ 4 GoF patterns (min 1 per category), UML documented per pattern, each traceable to code with file path | +| Traceability audit | 25 | Coverage of class-to-code mapping, quality and honesty of deviation documentation, sequence diagram trace accuracy | +| Cross-pillar design consistency | 15 | Alignment between class diagram, ERD, Flutter domain layer entities, and Spring Boot domain/entity classes | + +**OOAD Penalty:** + +| Violation | Deduction | +|---|---| +| OOAD artifacts submitted after Week 3 (after coding begins) | −20 points | +| Diagram produced with unpermitted tool (e.g., hand-drawn, screenshot of AI output) | −15 points | +| Design pattern claimed but not traceable in code | −8 points per pattern | +| Traceability audit missing for > 30% of class diagram classes | −10 points | + +--- + +### 🥈 Pillar 2 — Flutter Mobile Score (/ 100) + +| Component | Points | Criteria | +|---|---|---| +| Clean Architecture compliance | 25 | Strict 4-layer separation enforced, no cross-layer violations, feature-first folder structure correct, dependency direction correct | +| Features & UX quality | 20 | All required screens functional, JWT auth flow works against live API, custom widget library present, error states handled | +| Testing — unit & widget | 15 | All use cases and repositories covered, at least 5 widget tests, test quality (meaningful assertions, not just coverage padding) | +| Testing — integration | 10 | At least 3 end-to-end flows tested against live Spring Boot API, not mocked | +| Performance benchmarking | 20 | All 7 metrics reported on physical device in profile mode, DevTools screenshots provided, delta table (mid vs final), root cause for any regression > 20% | +| Report clarity | 10 | Report is complete and have clear explanation | + +**Flutter Penalty:** + +| Violation | Deduction | +|---|---| +| Responsive Design fail | −10 points | +| Benchmarks run on emulator only (no physical device) | −10 points | +| Missing delta table (mid-sprint vs final benchmark) | −8 points | +| State management inconsistency (mixing BLoC and Riverpod) | −10 points | +| Raw `try/catch` found in presentation layer | −5 points per occurrence (max −15) | +| APK connects to localhost instead of deployed backend | −15 points | + +--- + +### 🥉 Pillar 3 — Spring Boot Score (/ 100) + +| Component | Points | Criteria | +|---|---|---| +| API design & OpenAPI contract | 25 | ≥ 10 endpoints, consistent response envelope, versioned routes, OpenAPI 3.0 YAML committed before Week 4, Swagger UI accessible | +| Layered architecture & security | 25 | Strict Controller → Service → Repository separation, JWT with access + refresh token, RBAC with at least 2 roles, no hardcoded secrets | +| Testing — unit & integration | 25 | JUnit 5 + Mockito for all service classes, MockMvc + Testcontainers for all controllers, JaCoCo ≥ 70% on `service` and `controller` packages | +| Load benchmarking | 25 | All 5 metrics reported (throughput, p95 latency, error rate, DB query time, JVM heap), JMeter `.jtl` or k6 summary exported, analysis against pass thresholds | + +**Spring Boot Penalty:** + +| Violation | Deduction | +|---|---| +| Hardcoded secrets (API keys, DB passwords) in any file | −15 points | +| JaCoCo coverage below 70% | −10 points | +| No Flyway migrations (schema managed manually) | −8 points | +| OpenAPI YAML committed after Week 4 | −10 points | +| Load test run with < 50 concurrent users | −10 points | +| Business logic found directly in Controller class | −8 points per occurrence (max −16) | + +--- + +### Universal Penalty (Applied to All Three Pillar Scores) + +| Violation | Deduction | +|---|---| +| Late submission (per day, applied to all pillars) | −5 points per pillar | +| Missing deliverable | −15 points from the relevant pillar | +| Plagiarized code (any source) | 0 on all three pillars | +| Member with < 10% commits and no other contribution evidence | That member's individual pillar scores reduced by 20 points each | + +--- + +## Academic Integrity + +- All code must be original. Open-source libraries are permitted with proper attribution in both READMEs and the report. +- Use of AI coding assistants is **permitted but must be disclosed** in a dedicated "AI Tool Usage" section in the report, listing which tools were used, for which tasks, and how outputs were reviewed and understood. +- Design artifacts must be produced by the group. AI-generated diagrams submitted without annotation will be identified during the live Q&A. +- Plagiarism between groups or from public repositories results in **zero marks for all involved groups**. + +--- + +## Submission Checklist + +- [ ] Flutter GitHub repository (Actions pipeline green, branch protection active, 3+ merged PRs) +- [ ] Spring Boot GitHub repository (JaCoCo report committed, OpenAPI YAML present, Flyway migrations included) +- [ ] APK file connecting to live deployed backend (`[GroupName]_FinalExam.apk`) +- [ ] Written report PDF (≥ 25 pages, all 16 sections complete, benchmark delta table included) +- [ ] Demo video link (YouTube unlisted or Google Drive, all 3 members presenting) +- [ ] OOAD traceability matrix (Section 6 of report) +- [ ] Mid-sprint benchmark results (Sections 11 & 12 of report) +- [ ] JMeter/k6 load test export (appendix or Drive link) + +--- + +## Contact & Questions + +All questions must be submitted through the official course channel. Questions submitted at least **48 hours before any deadline** are guaranteed a response. Design artifact reviews (Week 2–3) require a scheduled appointment — contact the lecturer by Week 1 to book a slot. + +--- + +*Build systems you can defend, designs you can explain, and code that reflects your thinking. 🚀* diff --git a/walkguide-backend/demo/backend-run.err.log b/walkguide-backend/demo/backend-run.err.log new file mode 100644 index 0000000..a7fbef3 --- /dev/null +++ b/walkguide-backend/demo/backend-run.err.log @@ -0,0 +1,7 @@ +Set-Location : A positional parameter cannot be found that accepts argument 'PROGRAM'. +At line:1 char:1 ++ Set-Location C:\COBA PROGRAM SEMESTER 4\UAS FLUTTER FT. SPRINGBOOT da ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : InvalidArgument: (:) [Set-Location], ParameterBindingException + + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand + diff --git a/walkguide-backend/demo/backend-run.log b/walkguide-backend/demo/backend-run.log new file mode 100644 index 0000000..4af7315 --- /dev/null +++ b/walkguide-backend/demo/backend-run.log @@ -0,0 +1,2867 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] -------------------------< com.walkguide:demo >------------------------- +[INFO] Building walkguide 0.0.1-SNAPSHOT +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot:3.2.5:run (default-cli) > test-compile @ demo >>> +[INFO] +[INFO] --- jacoco:0.8.11:prepare-agent (default) @ demo --- +[INFO] argLine set to "-javaagent:C:\\Users\\Robertus\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.8.11\\org.jacoco.agent-0.8.11-runtime.jar=destfile=C:\\COBA PROGRAM SEMESTER 4\\UAS FLUTTER FT. SPRINGBOOT dan OOD\\Final-08-Evan-Jap-Bambang-WalkGuide-AI\\walkguide-backend\\demo\\target\\jacoco.exec" +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ demo --- +[INFO] Copying 3 resources from src\main\resources to target\classes +[INFO] Copying 20 resources from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.11.0:compile (default-compile) @ demo --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- resources:3.3.1:testResources (default-testResources) @ demo --- +[INFO] skip non existing resourceDirectory C:\COBA PROGRAM SEMESTER 4\UAS FLUTTER FT. SPRINGBOOT dan OOD\Final-08-Evan-Jap-Bambang-WalkGuide-AI\walkguide-backend\demo\src\test\resources +[INFO] +[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ demo --- +[INFO] Changes detected - recompiling the module! :source +[INFO] Compiling 28 source files with javac [debug release 21] to target\test-classes +[INFO] +[INFO] <<< spring-boot:3.2.5:run (default-cli) < test-compile @ demo <<< +[INFO] +[INFO] +[INFO] --- spring-boot:3.2.5:run (default-cli) @ demo --- +[INFO] Attaching agents: [] +Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v3.2.5) + +2026-05-27T19:15:04.478+07:00 INFO 14960 --- [ main] com.walkguide.WalkGuideApplication : Starting WalkGuideApplication using Java 21.0.9 with PID 14960 (C:\COBA PROGRAM SEMESTER 4\UAS FLUTTER FT. SPRINGBOOT dan OOD\Final-08-Evan-Jap-Bambang-WalkGuide-AI\walkguide-backend\demo\target\classes started by Robertus in C:\COBA PROGRAM SEMESTER 4\UAS FLUTTER FT. SPRINGBOOT dan OOD\Final-08-Evan-Jap-Bambang-WalkGuide-AI\walkguide-backend\demo) +2026-05-27T19:15:04.481+07:00 DEBUG 14960 --- [ main] com.walkguide.WalkGuideApplication : Running with Spring Boot v3.2.5, Spring v6.1.6 +2026-05-27T19:15:04.482+07:00 INFO 14960 --- [ main] com.walkguide.WalkGuideApplication : The following 1 profile is active: "dev" +2026-05-27T19:15:05.632+07:00 INFO 14960 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-27T19:15:05.781+07:00 INFO 14960 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 127 ms. Found 13 JPA repository interfaces. +2026-05-27T19:15:06.394+07:00 INFO 14960 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) +2026-05-27T19:15:06.419+07:00 INFO 14960 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-05-27T19:15:06.419+07:00 INFO 14960 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.20] +2026-05-27T19:15:06.507+07:00 INFO 14960 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2026-05-27T19:15:06.509+07:00 INFO 14960 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1964 ms +Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts +2026-05-27T19:15:06.564+07:00 DEBUG 14960 --- [ main] com.walkguide.security.JwtAuthFilter : Filter 'jwtAuthFilter' configured for use +2026-05-27T19:15:06.683+07:00 INFO 14960 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-27T19:15:06.741+07:00 INFO 14960 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.4.4.Final +2026-05-27T19:15:06.774+07:00 INFO 14960 --- [ main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled +2026-05-27T19:15:07.001+07:00 INFO 14960 --- [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-27T19:15:07.029+07:00 INFO 14960 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-05-27T19:15:09.789+07:00 INFO 14960 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-05-27T19:15:18.903+07:00 WARN 14960 --- [ main] org.hibernate.orm.deprecation : HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) +2026-05-27T19:15:20.462+07:00 INFO 14960 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-27T19:15:22.089+07:00 INFO 14960 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-27T19:15:22.497+07:00 INFO 14960 --- [ main] com.walkguide.config.FirebaseConfig : [FIREBASE] Firebase Admin initialized from classpath:firebase/google-services-admin.json +2026-05-27T19:15:23.016+07:00 WARN 14960 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-27T19:15:23.047+07:00 WARN 14960 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 95518d96-3ca0-4c5c-b99a-94ed7eb4c8e2 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-05-27T19:15:23.171+07:00 DEBUG 14960 --- [ main] o.s.w.s.s.s.WebSocketHandlerMapping : Patterns [/ws/**] in 'stompWebSocketHandlerMapping' +2026-05-27T19:15:23.336+07:00 INFO 14960 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@63b4a896, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3feeab43, org.springframework.security.web.context.SecurityContextHolderFilter@5f59b6c5, org.springframework.security.web.header.HeaderWriterFilter@566dc0c3, org.springframework.web.filter.CorsFilter@6178ac9d, org.springframework.security.web.authentication.logout.LogoutFilter@5096be74, com.walkguide.security.JwtAuthFilter@113ee1ce, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1872a7fe, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@70720b78, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7413c41, org.springframework.security.web.session.SessionManagementFilter@535b016, org.springframework.security.web.access.ExceptionTranslationFilter@50c462b8, org.springframework.security.web.access.intercept.AuthorizationFilter@6cb59aa] +2026-05-27T19:15:23.407+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + c.w.c.AuthController: + +2026-05-27T19:15:23.408+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + c.w.c.CallController: + +2026-05-27T19:15:23.409+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + c.w.c.GuardianController: + +2026-05-27T19:15:23.410+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + c.w.c.PairingController: + +2026-05-27T19:15:23.410+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + c.w.c.UserController: + +2026-05-27T19:15:23.411+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + o.s.b.a.w.s.e.BasicErrorController: + +2026-05-27T19:15:23.413+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + o.s.w.a.OpenApiWebMvcResource: + +2026-05-27T19:15:23.414+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + o.s.w.u.SwaggerWelcomeWebMvc: + +2026-05-27T19:15:23.415+07:00 DEBUG 14960 --- [ main] .WebSocketAnnotationMethodMessageHandler : + o.s.w.u.SwaggerConfigResource: + +2026-05-27T19:15:23.710+07:00 INFO 14960 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '' +2026-05-27T19:15:23.724+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : clientOutboundChannel added SubProtocolWebSocketHandler[StompSubProtocolHandler[v10.stomp, v11.stomp, v12.stomp]] +2026-05-27T19:15:23.725+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : clientInboundChannel added WebSocketAnnotationMethodMessageHandler[prefixes=[/app/]] +2026-05-27T19:15:23.726+07:00 INFO 14960 --- [ main] o.s.m.s.b.SimpleBrokerMessageHandler : Starting... +2026-05-27T19:15:23.726+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : clientInboundChannel added SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@61ee9672] +2026-05-27T19:15:23.726+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : brokerChannel added SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@61ee9672] +2026-05-27T19:15:23.728+07:00 INFO 14960 --- [ main] o.s.m.s.b.SimpleBrokerMessageHandler : BrokerAvailabilityEvent[available=true, SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@61ee9672]] +2026-05-27T19:15:23.729+07:00 INFO 14960 --- [ main] o.s.m.s.b.SimpleBrokerMessageHandler : Started. +2026-05-27T19:15:23.730+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : clientInboundChannel added UserDestinationMessageHandler[DefaultUserDestinationResolver[prefix=/user/]] +2026-05-27T19:15:23.730+07:00 DEBUG 14960 --- [ main] o.s.m.s.ExecutorSubscribableChannel : brokerChannel added UserDestinationMessageHandler[DefaultUserDestinationResolver[prefix=/user/]] +2026-05-27T19:15:23.737+07:00 INFO 14960 --- [ main] com.walkguide.WalkGuideApplication : Started WalkGuideApplication in 19.764 seconds (process running for 20.253) +Hibernate: + select + count(*) + from + users u1_0 +DataSeeder: Database sudah ada data, skip seeding. +2026-05-27T19:15:38.814+07:00 INFO 14960 --- [0.0-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-27T19:15:38.814+07:00 INFO 14960 --- [0.0-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-05-27T19:15:38.815+07:00 INFO 14960 --- [0.0-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2026-05-27T19:16:23.704+07:00 INFO 14960 --- [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0] +2026-05-27T19:18:42.664+07:00 WARN 14960 --- [0.0-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08001 +2026-05-27T19:18:42.676+07:00 ERROR 14960 --- [0.0-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : HikariPool-1 - Connection is not available, request timed out after 10011ms. +2026-05-27T19:18:42.676+07:00 ERROR 14960 --- [0.0-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : The connection attempt failed. +Hibernate: + select + rt1_0.id, + rt1_0.created_at, + rt1_0.expires_at, + rt1_0.token, + rt1_0.user_id + from + refresh_tokens rt1_0 + where + rt1_0.user_id is null +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.email=? +Hibernate: + select + rt1_0.id, + rt1_0.created_at, + rt1_0.expires_at, + rt1_0.token, + rt1_0.user_id + from + refresh_tokens rt1_0 + where + rt1_0.user_id=? +Hibernate: + insert + into + activity_logs + (created_at, description, log_type, metadata, user_id) + values + (?, ?, ?, ?, ?) +Hibernate: + insert + into + refresh_tokens + (created_at, expires_at, token, user_id) + values + (?, ?, ?, ?) +Hibernate: + delete + from + refresh_tokens + where + id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + update + users + set + display_name=?, + email=?, + fcm_token=?, + pairing_code=?, + pairing_code_expires_at=?, + password=?, + role=?, + unique_user_id=?, + updated_at=? + where + id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + lh1_0.id, + lh1_0.accuracy, + lh1_0.created_at, + lh1_0.heading, + lh1_0.lat, + lh1_0.lng, + lh1_0.speed, + lh1_0.user_id + from + location_history lh1_0 + where + lh1_0.user_id=? + order by + lh1_0.created_at desc + fetch + first ? rows only +2026-05-27T19:28:59.450+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:28:59.456+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(gn1_0.id) + from + guardian_notifications gn1_0 + where + gn1_0.user_id=? + and not(gn1_0.is_read) +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:29:04.606+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:04.607+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:09.779+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:09.786+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:14.951+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:14.951+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.email=? +Hibernate: + select + rt1_0.id, + rt1_0.created_at, + rt1_0.expires_at, + rt1_0.token, + rt1_0.user_id + from + refresh_tokens rt1_0 + where + rt1_0.user_id=? +Hibernate: + insert + into + activity_logs + (created_at, description, log_type, metadata, user_id) + values + (?, ?, ?, ?, ?) +Hibernate: + insert + into + refresh_tokens + (created_at, expires_at, token, user_id) + values + (?, ?, ?, ?) +Hibernate: + delete + from + refresh_tokens + where + id=? +2026-05-27T19:29:20.100+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:20.113+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + vcc1_0.id, + vcc1_0.command_key, + vcc1_0.enabled, + vcc1_0.guardian_id, + vcc1_0.trigger_phrase, + vcc1_0.updated_at, + vcc1_0.user_id + from + voice_command_configs vcc1_0 + where + vcc1_0.user_id=? +Hibernate: + select + hs1_0.id, + hs1_0.button_code, + hs1_0.button_name, + hs1_0.enabled, + hs1_0.guardian_id, + hs1_0.shortcut_key, + hs1_0.updated_at, + hs1_0.user_id + from + hardware_shortcuts hs1_0 + where + hs1_0.user_id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:29:22.109+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:22.110+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:29:27.233+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:27.234+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:32.402+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:32.414+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:37.567+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:37.579+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:42.732+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:42.744+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:47.899+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:47.911+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:29:53.062+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:53.063+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.email=? +Hibernate: + select + rt1_0.id, + rt1_0.created_at, + rt1_0.expires_at, + rt1_0.token, + rt1_0.user_id + from + refresh_tokens rt1_0 + where + rt1_0.user_id=? +Hibernate: + insert + into + activity_logs + (created_at, description, log_type, metadata, user_id) + values + (?, ?, ?, ?, ?) +Hibernate: + insert + into + refresh_tokens + (created_at, expires_at, token, user_id) + values + (?, ?, ?, ?) +Hibernate: + delete + from + refresh_tokens + where + id=? +2026-05-27T19:29:58.228+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:29:58.241+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + update + users + set + display_name=?, + email=?, + fcm_token=?, + pairing_code=?, + pairing_code_expires_at=?, + password=?, + role=?, + unique_user_id=?, + updated_at=? + where + id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + lh1_0.id, + lh1_0.accuracy, + lh1_0.created_at, + lh1_0.heading, + lh1_0.lat, + lh1_0.lng, + lh1_0.speed, + lh1_0.user_id + from + location_history lh1_0 + where + lh1_0.user_id=? + order by + lh1_0.created_at desc + fetch + first ? rows only +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:30:00.506+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:00.507+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(gn1_0.id) + from + guardian_notifications gn1_0 + where + gn1_0.user_id=? + and not(gn1_0.is_read) +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:30:03.397+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:03.408+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +2026-05-27T19:30:05.610+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:05.622+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:07.814+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2068 expires=1779888607 +2026-05-27T19:30:07.817+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.controller.CallController : [CALL] Token generated | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:30:08.564+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:08.565+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:10.773+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:10.785+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:13.728+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:13.739+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:15.944+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:15.956+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:30:18.908+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:18.919+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:21.106+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:21.117+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:24.059+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:24.098+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:26.273+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:26.274+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +2026-05-27T19:30:29.237+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:29.238+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + lh1_0.id, + lh1_0.accuracy, + lh1_0.created_at, + lh1_0.heading, + lh1_0.lat, + lh1_0.lng, + lh1_0.speed, + lh1_0.user_id + from + location_history lh1_0 + where + lh1_0.user_id=? + order by + lh1_0.created_at desc + fetch + first ? rows only +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(gn1_0.id) + from + guardian_notifications gn1_0 + where + gn1_0.user_id=? + and not(gn1_0.is_read) +2026-05-27T19:30:31.440+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:31.441+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:34.390+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:34.391+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:36.101+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2067 expires=1779888636 +2026-05-27T19:30:36.112+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.controller.CallController : [CALL] Token generated | caller=2067 receiver=2068 channel=call_2067_2068 +2026-05-27T19:30:36.606+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:36.618+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:39.554+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:39.555+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:41.778+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:41.790+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:44.718+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:44.724+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:46.928+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2068 expires=1779888646 +2026-05-27T19:30:46.939+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.controller.CallController : [CALL] Token generated | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:30:46.939+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:46.939+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:48.914+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"receiverId":"2067","channelName":"call_2067_2068","callerId":"2068","type":"IN...(truncated) +2026-05-27T19:30:48.920+07:00 INFO 14960 --- [0.0-8080-exec-1] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=INCOMING_CALL status=RINGING channel=call_2067_2068 +2026-05-27T19:30:49.898+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:49.899+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:52.103+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:52.115+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:53.589+07:00 INFO 14960 --- [0.0-8080-exec-1] com.walkguide.service.FcmService : [FCM] Sent high-priority notification successfully: projects/walkguide-549b3/messages/0:1779885052504510%084e7484084e7484 +2026-05-27T19:30:55.060+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:55.062+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:30:55.909+07:00 WARN 14960 --- [0.0-8080-exec-1] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +2026-05-27T19:30:55.909+07:00 INFO 14960 --- [0.0-8080-exec-1] c.w.service.CallNotificationService : [CALL] Incoming call notification sent | caller=2068 receiver=2067 channel=call_2067_2068 +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:57.011+07:00 INFO 14960 --- [0.0-8080-exec-7] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2067 expires=1779888657 +2026-05-27T19:30:57.023+07:00 INFO 14960 --- [0.0-8080-exec-7] c.walkguide.controller.CallController : [CALL] Token generated | caller=2067 receiver=2068 channel=call_2067_2068 +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:57.281+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:30:57.282+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:30:58.242+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"receiverId":"2067","receiverName":"suami kobo","channelName":"call_2067_2068",...(truncated) +2026-05-27T19:30:58.253+07:00 INFO 14960 --- [0.0-8080-exec-8] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:30:58.254+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"receiverId":"2067","receiverName":"suami kobo","channelName":"call_2067_2068",...(truncated) +2026-05-27T19:30:58.254+07:00 INFO 14960 --- [0.0-8080-exec-8] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:30:58.254+07:00 INFO 14960 --- [0.0-8080-exec-8] c.w.service.CallNotificationService : [CALL] Call accepted | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:31:00.222+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:00.224+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:02.443+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:02.453+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:05.389+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:05.401+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:07.637+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:07.648+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:10.554+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:10.566+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:12.771+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:12.782+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:15.726+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:15.737+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:17.935+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:17.947+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:20.889+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:20.901+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:23.105+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:23.112+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:26.058+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:26.070+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:28.271+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:28.283+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:31.219+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:31.231+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:33.436+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:33.437+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:36.382+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:36.393+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:38.600+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:38.601+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:41.551+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:41.564+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:43.769+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:43.781+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:46.718+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:46.719+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:48.933+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:48.935+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:51.884+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:51.885+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:52.614+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"otherId":"2068","receiverName":"suami kobo","endedBy":"2067","type":"CALL_ENDE...(truncated) +2026-05-27T19:31:52.626+07:00 INFO 14960 --- [0.0-8080-exec-4] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:31:52.627+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"otherId":"2068","receiverName":"suami kobo","endedBy":"2067","type":"CALL_ENDE...(truncated) +2026-05-27T19:31:52.628+07:00 INFO 14960 --- [0.0-8080-exec-4] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:31:54.122+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:54.135+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:31:56.658+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"otherId":"2068","receiverName":"suami kobo","endedBy":"2067","type":"CALL_ENDE...(truncated) +2026-05-27T19:31:56.670+07:00 INFO 14960 --- [0.0-8080-exec-1] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:31:56.671+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"otherId":"2068","receiverName":"suami kobo","endedBy":"2067","type":"CALL_ENDE...(truncated) +2026-05-27T19:31:56.671+07:00 INFO 14960 --- [0.0-8080-exec-1] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:31:57.050+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:57.052+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:59.268+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:31:59.280+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:31:59.991+07:00 INFO 14960 --- [0.0-8080-exec-4] com.walkguide.service.FcmService : [FCM] Sent normal notification successfully: projects/walkguide-549b3/messages/0:1779885120460350%084e7484084e7484 +2026-05-27T19:32:00.045+07:00 WARN 14960 --- [0.0-8080-exec-4] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:00.576+07:00 INFO 14960 --- [0.0-8080-exec-1] com.walkguide.service.FcmService : [FCM] Sent normal notification successfully: projects/walkguide-549b3/messages/0:1779885121120572%084e7484084e7484 +2026-05-27T19:32:00.777+07:00 WARN 14960 --- [0.0-8080-exec-1] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +Hibernate: + select + vcc1_0.id, + vcc1_0.command_key, + vcc1_0.enabled, + vcc1_0.guardian_id, + vcc1_0.trigger_phrase, + vcc1_0.updated_at, + vcc1_0.user_id + from + voice_command_configs vcc1_0 + where + vcc1_0.user_id=? +Hibernate: + select + hs1_0.id, + hs1_0.button_code, + hs1_0.button_name, + hs1_0.enabled, + hs1_0.guardian_id, + hs1_0.shortcut_key, + hs1_0.updated_at, + hs1_0.user_id + from + hardware_shortcuts hs1_0 + where + hs1_0.user_id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:02.214+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:02.226+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:04.463+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:04.465+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:07.397+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:07.399+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:09.446+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"otherId":"2067","receiverName":"suami kobo","endedBy":"2068","type":"CALL_ENDE...(truncated) +2026-05-27T19:32:09.447+07:00 INFO 14960 --- [0.0-8080-exec-4] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:32:09.447+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"otherId":"2067","receiverName":"suami kobo","endedBy":"2068","type":"CALL_ENDE...(truncated) +2026-05-27T19:32:09.447+07:00 INFO 14960 --- [0.0-8080-exec-4] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:32:09.599+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:09.600+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:11.061+07:00 INFO 14960 --- [0.0-8080-exec-4] com.walkguide.service.FcmService : [FCM] Sent normal notification successfully: projects/walkguide-549b3/messages/0:1779885131535053%084e7484084e7484 +2026-05-27T19:32:11.118+07:00 WARN 14960 --- [0.0-8080-exec-4] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +2026-05-27T19:32:12.550+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:12.551+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:14.805+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:14.817+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + lh1_0.id, + lh1_0.accuracy, + lh1_0.created_at, + lh1_0.heading, + lh1_0.lat, + lh1_0.lng, + lh1_0.speed, + lh1_0.user_id + from + location_history lh1_0 + where + lh1_0.user_id=? + order by + lh1_0.created_at desc + fetch + first ? rows only +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(gn1_0.id) + from + guardian_notifications gn1_0 + where + gn1_0.user_id=? + and not(gn1_0.is_read) +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:17.715+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:17.728+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:32:19.928+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:19.929+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:22.887+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:22.926+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:25.333+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:25.345+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:27.296+07:00 INFO 14960 --- [0.0-8080-exec-2] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2068 expires=1779888747 +2026-05-27T19:32:27.297+07:00 INFO 14960 --- [0.0-8080-exec-2] c.walkguide.controller.CallController : [CALL] Token generated | caller=2068 receiver=2067 channel=call_2067_2068 +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:28.047+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:28.048+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:28.525+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"receiverId":"2067","channelName":"call_2067_2068","callerId":"2068","type":"IN...(truncated) +2026-05-27T19:32:28.526+07:00 INFO 14960 --- [0.0-8080-exec-7] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=INCOMING_CALL status=RINGING channel=call_2067_2068 +2026-05-27T19:32:28.775+07:00 INFO 14960 --- [0.0-8080-exec-7] com.walkguide.service.FcmService : [FCM] Sent high-priority notification successfully: projects/walkguide-549b3/messages/0:1779885149223672%084e7484084e7484 +2026-05-27T19:32:28.822+07:00 WARN 14960 --- [0.0-8080-exec-7] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +2026-05-27T19:32:28.823+07:00 INFO 14960 --- [0.0-8080-exec-7] c.w.service.CallNotificationService : [CALL] Incoming call notification sent | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:32:30.510+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:30.511+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:33.210+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:33.211+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:35.696+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:35.697+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:37.382+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2067 expires=1779888757 +2026-05-27T19:32:37.394+07:00 INFO 14960 --- [0.0-8080-exec-4] c.walkguide.controller.CallController : [CALL] Token generated | caller=2067 receiver=2068 channel=call_2067_2068 +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:32:38.370+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:38.379+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:38.861+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"receiverId":"2067","receiverName":"suami kobo","channelName":"call_2067_2068",...(truncated) +2026-05-27T19:32:38.861+07:00 INFO 14960 --- [0.0-8080-exec-5] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:32:38.862+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"receiverId":"2067","receiverName":"suami kobo","channelName":"call_2067_2068",...(truncated) +2026-05-27T19:32:38.862+07:00 INFO 14960 --- [0.0-8080-exec-5] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:32:38.862+07:00 INFO 14960 --- [0.0-8080-exec-5] c.w.service.CallNotificationService : [CALL] Call accepted | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:32:40.845+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:40.857+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:43.541+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:43.554+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:46.009+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:46.021+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:48.719+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:48.721+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:51.268+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:51.270+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:53.878+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:53.879+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:56.431+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:56.433+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:32:59.043+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:32:59.044+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:01.751+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:01.752+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:04.236+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:04.238+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:06.926+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:06.928+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:09.387+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:09.389+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:10.594+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"otherId":"2067","receiverName":"suami kobo","endedBy":"2068","type":"CALL_ENDE...(truncated) +2026-05-27T19:33:10.595+07:00 INFO 14960 --- [0.0-8080-exec-7] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:33:10.596+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"otherId":"2067","receiverName":"suami kobo","endedBy":"2068","type":"CALL_ENDE...(truncated) +2026-05-27T19:33:10.596+07:00 INFO 14960 --- [0.0-8080-exec-7] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ENDED status=ENDED channel=call_2067_2068 +2026-05-27T19:33:12.096+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:12.097+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + vcc1_0.id, + vcc1_0.command_key, + vcc1_0.enabled, + vcc1_0.guardian_id, + vcc1_0.trigger_phrase, + vcc1_0.updated_at, + vcc1_0.user_id + from + voice_command_configs vcc1_0 + where + vcc1_0.user_id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + hs1_0.id, + hs1_0.button_code, + hs1_0.button_name, + hs1_0.enabled, + hs1_0.guardian_id, + hs1_0.shortcut_key, + hs1_0.updated_at, + hs1_0.user_id + from + hardware_shortcuts hs1_0 + where + hs1_0.user_id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +2026-05-27T19:33:13.056+07:00 INFO 14960 --- [0.0-8080-exec-7] com.walkguide.service.FcmService : [FCM] Sent normal notification successfully: projects/walkguide-549b3/messages/0:1779885193529669%084e7484084e7484 +2026-05-27T19:33:13.110+07:00 WARN 14960 --- [0.0-8080-exec-7] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:33:14.632+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:14.637+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users g1_0 + on g1_0.id=pr1_0.guardian_id + where + g1_0.id=? + and pr1_0.status=? +Hibernate: + select + lh1_0.id, + lh1_0.accuracy, + lh1_0.created_at, + lh1_0.heading, + lh1_0.lat, + lh1_0.lng, + lh1_0.speed, + lh1_0.user_id + from + location_history lh1_0 + where + lh1_0.user_id=? + order by + lh1_0.created_at desc + fetch + first ? rows only +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(gn1_0.id) + from + guardian_notifications gn1_0 + where + gn1_0.user_id=? + and not(gn1_0.is_read) +2026-05-27T19:33:17.259+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:17.260+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + al1_0.id, + al1_0.created_at, + al1_0.description, + al1_0.log_type, + al1_0.metadata, + al1_0.user_id + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? + order by + al1_0.created_at desc + offset + ? rows + fetch + first ? rows only +Hibernate: + select + count(al1_0.id) + from + activity_logs al1_0 + left join + users u1_0 + on u1_0.id=al1_0.user_id + where + u1_0.id=? +Hibernate: + select + se1_0.id, + se1_0.acknowledged_at, + se1_0.created_at, + se1_0.lat, + se1_0.lng, + se1_0.status, + se1_0.trigger_type, + se1_0.user_id + from + sos_events se1_0 + where + se1_0.user_id=? + order by + se1_0.created_at desc + offset + ? rows + fetch + first ? rows only +2026-05-27T19:33:19.819+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:19.822+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:22.428+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:22.431+07:00 DEBUG 14960 --- [0.0-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:24.965+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:24.966+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:27.589+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:27.594+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:30.077+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:30.081+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + pr1_0.id, + pr1_0.guardian_id, + pr1_0.invited_at, + pr1_0.responded_at, + pr1_0.status, + pr1_0.user_id + from + pairing_relations pr1_0 + left join + users u1_0 + on u1_0.id=pr1_0.user_id + where + u1_0.id=? +2026-05-27T19:33:32.755+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:32.756+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:33:35.214+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:35.217+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:35.438+07:00 INFO 14960 --- [0.0-8080-exec-3] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2067 expires=1779888815 +2026-05-27T19:33:35.441+07:00 INFO 14960 --- [0.0-8080-exec-3] c.walkguide.controller.CallController : [CALL] Token generated | caller=2067 receiver=2068 channel=call_2067_2068 +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:33:36.919+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"receiverId":"2068","channelName":"call_2067_2068","callerId":"2067","type":"IN...(truncated) +2026-05-27T19:33:36.920+07:00 INFO 14960 --- [0.0-8080-exec-5] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=INCOMING_CALL status=RINGING channel=call_2067_2068 +2026-05-27T19:33:37.163+07:00 INFO 14960 --- [0.0-8080-exec-5] com.walkguide.service.FcmService : [FCM] Sent high-priority notification successfully: projects/walkguide-549b3/messages/0:1779885217624637%084e7484084e7484 +2026-05-27T19:33:37.220+07:00 WARN 14960 --- [0.0-8080-exec-5] com.walkguide.service.FcmService : [FIRESTORE] Notification audit skipped: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud Firestore API has not been used in project walkguide-549b3 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/firestore.googleapis.com/overview?project=walkguide-549b3 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +2026-05-27T19:33:37.221+07:00 INFO 14960 --- [0.0-8080-exec-5] c.w.service.CallNotificationService : [CALL] Incoming call notification sent | caller=2067 receiver=2068 channel=call_2067_2068 +2026-05-27T19:33:37.919+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:37.920+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:40.376+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:40.379+07:00 DEBUG 14960 --- [0.0-8080-exec-2] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:33:43.099+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:43.100+07:00 DEBUG 14960 --- [0.0-8080-exec-3] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:43.804+07:00 INFO 14960 --- [.0-8080-exec-10] c.walkguide.service.AgoraTokenService : [AGORA] Token generated untuk channel=call_2067_2068 uid=2068 expires=1779888823 +2026-05-27T19:33:43.804+07:00 INFO 14960 --- [.0-8080-exec-10] c.walkguide.controller.CallController : [CALL] Token generated | caller=2068 receiver=2067 channel=call_2067_2068 +2026-05-27T19:33:45.613+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:45.615+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:48.293+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:48.295+07:00 DEBUG 14960 --- [0.0-8080-exec-8] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:49.690+07:00 WARN 14960 --- [0.0-8080-exec-9] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@2f6912a6 (This connection has been closed.). Possibly consider using a shorter maxLifetime value. +2026-05-27T19:33:50.729+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:50.731+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +Hibernate: + select + u1_0.id, + u1_0.created_at, + u1_0.display_name, + u1_0.email, + u1_0.fcm_token, + u1_0.pairing_code, + u1_0.pairing_code_expires_at, + u1_0.password, + u1_0.role, + u1_0.unique_user_id, + u1_0.updated_at + from + users u1_0 + where + u1_0.id=? +2026-05-27T19:33:53.427+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:53.429+07:00 DEBUG 14960 --- [0.0-8080-exec-6] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:53.890+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2067 session=null payload={"receiverId":"2068","receiverName":"GuardianRobert","channelName":"call_2067_20...(truncated) +2026-05-27T19:33:53.890+07:00 INFO 14960 --- [0.0-8080-exec-9] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2067 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:33:53.891+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.m.s.b.SimpleBrokerMessageHandler : Processing MESSAGE destination=/queue/call/2068 session=null payload={"receiverId":"2068","receiverName":"GuardianRobert","channelName":"call_2067_20...(truncated) +2026-05-27T19:33:53.892+07:00 INFO 14960 --- [0.0-8080-exec-9] c.w.websocket.LocationBroadcaster : [WS] Call broadcast -> /queue/call/2068 | type=CALL_ACCEPTED status=ACCEPTED channel=call_2067_2068 +2026-05-27T19:33:53.893+07:00 INFO 14960 --- [0.0-8080-exec-9] c.w.service.CallNotificationService : [CALL] Call accepted | caller=2067 receiver=2068 channel=call_2067_2068 +2026-05-27T19:33:55.880+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:55.880+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:33:58.584+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:33:58.585+07:00 DEBUG 14960 --- [.0-8080-exec-10] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:01.039+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:01.042+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:03.749+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:03.751+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:06.209+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:06.210+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:08.918+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:08.919+07:00 DEBUG 14960 --- [0.0-8080-exec-9] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:11.369+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:11.371+07:00 DEBUG 14960 --- [0.0-8080-exec-1] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:14.082+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:14.083+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:16.535+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:16.535+07:00 DEBUG 14960 --- [0.0-8080-exec-4] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws +2026-05-27T19:34:19.253+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.s.WebSocketHandlerMapping : Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@268eefe7 +2026-05-27T19:34:19.258+07:00 DEBUG 14960 --- [0.0-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService : Processing transport request: GET http://192.168.1.68:8080/ws diff --git a/walkguide-backend/demo/pom.xml b/walkguide-backend/demo/pom.xml index 624f7b5..1e0aeb2 100644 --- a/walkguide-backend/demo/pom.xml +++ b/walkguide-backend/demo/pom.xml @@ -104,6 +104,13 @@ + + + com.google.firebase + firebase-admin + 9.3.0 + + org.springframework.boot diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/config/FirebaseConfig.java b/walkguide-backend/demo/src/main/java/com/walkguide/config/FirebaseConfig.java new file mode 100644 index 0000000..c4af300 --- /dev/null +++ b/walkguide-backend/demo/src/main/java/com/walkguide/config/FirebaseConfig.java @@ -0,0 +1,52 @@ +package com.walkguide.config; + +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Component; + +import java.io.InputStream; + +@Component +@RequiredArgsConstructor +@Slf4j +public class FirebaseConfig { + + private final ResourceLoader resourceLoader; + + @Value("${firebase.credentials-path:classpath:firebase/google-services-admin.json}") + private String credentialsPath; + + @PostConstruct + void initializeFirebase() { + if (!FirebaseApp.getApps().isEmpty()) { + log.info("[FIREBASE] FirebaseApp already initialized"); + return; + } + + try { + Resource resource = resourceLoader.getResource(credentialsPath); + if (!resource.exists() || !resource.isReadable()) { + log.warn("[FIREBASE] Credential not found/readable at {}. FCM runs in log-only fallback.", credentialsPath); + return; + } + + try (InputStream in = resource.getInputStream()) { + FirebaseOptions options = FirebaseOptions.builder() + .setCredentials(GoogleCredentials.fromStream(in)) + .build(); + FirebaseApp.initializeApp(options); + } + + log.info("[FIREBASE] Firebase Admin initialized from {}", credentialsPath); + } catch (Exception e) { + log.warn("[FIREBASE] Failed to initialize Firebase Admin. FCM fallback active: {}", e.getMessage()); + } + } +} diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/controller/CallController.java b/walkguide-backend/demo/src/main/java/com/walkguide/controller/CallController.java index 36d35b5..fbeab8d 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/controller/CallController.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/controller/CallController.java @@ -14,9 +14,12 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @@ -36,35 +39,76 @@ public class CallController { @Operation(summary = "Generate Agora token", description = "Caller requests a token before joining Agora") public ResponseEntity> generateToken( @Valid @RequestBody CallTokenRequest req) { - Long callerId = SecurityHelper.getCurrentUserId(); AgoraTokenResponse response = agoraTokenService.generateToken(callerId, req.getReceiverId()); - log.info("[CALL] Token generated | caller={} receiver={} channel={}", callerId, req.getReceiverId(), response.getChannelName()); - return ResponseEntity.ok(ApiResponse.ok(response, "Token Agora berhasil digenerate")); } @PostMapping("/notify") @Operation(summary = "Notify receiver of incoming call") - public ResponseEntity> notifyCall( - @Valid @RequestBody CallNotifyRequest req) { - + public ResponseEntity> notifyCall(@Valid @RequestBody CallNotifyRequest req) { Long callerId = SecurityHelper.getCurrentUserId(); String message = callNotificationService.notifyIncomingCall(callerId, req); return ResponseEntity.ok(ApiResponse.ok(null, message)); } + @PostMapping("/accept") + @Operation(summary = "Receiver accepts incoming call") + public ResponseEntity>> acceptCall(@RequestBody Map body) { + Long receiverId = SecurityHelper.getCurrentUserId(); + Long callerId = Long.parseLong(body.get("callerId")); + String channelName = body.get("channelName"); + return ResponseEntity.ok(ApiResponse.ok( + callNotificationService.acceptCall(receiverId, callerId, channelName), + "Call accepted" + )); + } + + @GetMapping("/pending") + @Operation(summary = "Get pending incoming call for logged-in receiver") + public ResponseEntity>> pendingCall() { + Long receiverId = SecurityHelper.getCurrentUserId(); + return ResponseEntity.ok(ApiResponse.ok(callNotificationService.getPendingCall(receiverId), "Pending call")); + } + + @DeleteMapping("/pending") + @Operation(summary = "Clear pending incoming call for logged-in receiver") + public ResponseEntity> clearPendingCall() { + Long receiverId = SecurityHelper.getCurrentUserId(); + callNotificationService.clearPendingCall(receiverId); + return ResponseEntity.ok(ApiResponse.ok(null, "Pending call cleared")); + } + + @GetMapping("/accepted") + @Operation(summary = "Get accepted call for logged-in caller") + public ResponseEntity>> acceptedCall() { + Long callerId = SecurityHelper.getCurrentUserId(); + return ResponseEntity.ok(ApiResponse.ok(callNotificationService.getAcceptedCall(callerId), "Accepted call")); + } + + @DeleteMapping("/accepted") + @Operation(summary = "Clear accepted call for logged-in caller") + public ResponseEntity> clearAcceptedCall() { + Long callerId = SecurityHelper.getCurrentUserId(); + callNotificationService.clearAcceptedCall(callerId); + return ResponseEntity.ok(ApiResponse.ok(null, "Accepted call cleared")); + } + + @GetMapping("/state") + @Operation(summary = "Get call state by Agora channel") + public ResponseEntity>> callState(@RequestParam String channelName) { + return ResponseEntity.ok(ApiResponse.ok(callNotificationService.getCallState(channelName), "Call state")); + } + @PostMapping("/end") @Operation(summary = "Notify end of call") - public ResponseEntity> endCall( - @RequestBody Map body) { - + public ResponseEntity> endCall(@RequestBody Map body) { Long callerId = SecurityHelper.getCurrentUserId(); - Long otherId = body.get("otherId"); - callNotificationService.notifyCallEnded(callerId, otherId); - + Long otherId = Long.parseLong(body.get("otherId")); + String channelName = body.get("channelName"); + callNotificationService.notifyCallEnded(callerId, otherId, channelName); return ResponseEntity.ok(ApiResponse.ok(null, "Call ended")); } -} +} \ No newline at end of file diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/exception/GlobalExceptionHandler.java b/walkguide-backend/demo/src/main/java/com/walkguide/exception/GlobalExceptionHandler.java index 5d307bf..11740ba 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/exception/GlobalExceptionHandler.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/exception/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package com.walkguide.exception; import com.walkguide.dto.ApiResponse; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -29,6 +30,13 @@ public class GlobalExceptionHandler { .body(ApiResponse.error("VALIDATION_ERROR", msg)); } + + @ExceptionHandler(DataIntegrityViolationException.class) + public ResponseEntity> handleDataIntegrity(DataIntegrityViolationException ex) { + return ResponseEntity.status(HttpStatus.CONFLICT) + .body(ApiResponse.error("DATA_CONFLICT", + "Data pairing lama masih bentrok. Refresh status atau unpair dulu, lalu coba lagi.")); + } @ExceptionHandler(RuntimeException.class) public ResponseEntity> handleRuntime(RuntimeException ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/service/CallNotificationService.java b/walkguide-backend/demo/src/main/java/com/walkguide/service/CallNotificationService.java index fc45d02..2bb3924 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/service/CallNotificationService.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/service/CallNotificationService.java @@ -4,11 +4,14 @@ import com.walkguide.dto.request.CallNotifyRequest; import com.walkguide.entity.User; import com.walkguide.exception.ResourceNotFoundException; import com.walkguide.repository.UserRepository; +import com.walkguide.websocket.LocationBroadcaster; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Service @RequiredArgsConstructor @@ -17,29 +20,38 @@ public class CallNotificationService { private final FcmService fcmService; private final UserRepository userRepository; + private final LocationBroadcaster locationBroadcaster; + private final Map> pendingCalls = new ConcurrentHashMap<>(); + private final Map> acceptedCalls = new ConcurrentHashMap<>(); + private final Map> callStates = new ConcurrentHashMap<>(); public String notifyIncomingCall(Long callerId, CallNotifyRequest req) { User caller = userRepository.findById(callerId) .orElseThrow(() -> new ResourceNotFoundException("Caller not found")); - User receiver = userRepository.findById(req.getReceiverId()) .orElseThrow(() -> new ResourceNotFoundException("Receiver not found")); + String callerName = caller.getDisplayName() != null ? caller.getDisplayName() : caller.getEmail(); + Map payload = new HashMap<>(); + payload.put("type", "INCOMING_CALL"); + payload.put("status", "RINGING"); + payload.put("callerId", String.valueOf(callerId)); + payload.put("receiverId", String.valueOf(receiver.getId())); + payload.put("callerName", callerName); + payload.put("channelName", req.getChannelName()); + payload.put("agoraToken", req.getAgoraToken() != null ? req.getAgoraToken() : ""); + payload.put("receiverUid", String.valueOf(req.getReceiverUid())); + + pendingCalls.put(receiver.getId(), payload); + acceptedCalls.remove(callerId); + callStates.put(req.getChannelName(), payload); + locationBroadcaster.broadcastCall(receiver.getId(), payload); + if (receiver.getFcmToken() == null || receiver.getFcmToken().isBlank()) { log.warn("[CALL] Receiver {} has no FCM token; push notification skipped", req.getReceiverId()); - return "Panggilan dikirim (receiver mungkin tidak menerima push notification)"; + return "Panggilan dikirim via realtime fallback."; } - String callerName = caller.getDisplayName() != null ? caller.getDisplayName() : caller.getEmail(); - Map payload = Map.of( - "type", "INCOMING_CALL", - "callerId", String.valueOf(callerId), - "callerName", callerName, - "channelName", req.getChannelName(), - "agoraToken", req.getAgoraToken() != null ? req.getAgoraToken() : "", - "receiverUid", String.valueOf(req.getReceiverUid()) - ); - fcmService.sendHighPriority( receiver.getFcmToken(), "Panggilan Masuk", @@ -52,22 +64,111 @@ public class CallNotificationService { return "Notifikasi panggilan berhasil dikirim"; } + public Map acceptCall(Long receiverId, Long callerId, String channelName) { + User receiver = userRepository.findById(receiverId) + .orElseThrow(() -> new ResourceNotFoundException("Receiver not found")); + userRepository.findById(callerId) + .orElseThrow(() -> new ResourceNotFoundException("Caller not found")); + + pendingCalls.remove(receiverId); + String receiverName = receiver.getDisplayName() != null ? receiver.getDisplayName() : receiver.getEmail(); + Map payload = new HashMap<>(getCallState(channelName)); + payload.put("type", "CALL_ACCEPTED"); + payload.put("status", "ACCEPTED"); + payload.put("callerId", String.valueOf(callerId)); + payload.put("receiverId", String.valueOf(receiverId)); + payload.put("receiverName", receiverName); + payload.put("channelName", channelName != null ? channelName : ""); + payload.put("acceptedBy", String.valueOf(receiverId)); + payload.put("acceptedAt", String.valueOf(System.currentTimeMillis())); + + acceptedCalls.put(callerId, payload); + if (channelName != null && !channelName.isBlank()) { + callStates.put(channelName, payload); + } + locationBroadcaster.broadcastCall(callerId, payload); + locationBroadcaster.broadcastCall(receiverId, payload); + log.info("[CALL] Call accepted | caller={} receiver={} channel={}", callerId, receiverId, channelName); + return payload; + } + + public Map getPendingCall(Long receiverId) { + return pendingCalls.get(receiverId); + } + + public void clearPendingCall(Long receiverId) { + pendingCalls.remove(receiverId); + } + + public Map getAcceptedCall(Long callerId) { + return acceptedCalls.get(callerId); + } + + public void clearAcceptedCall(Long callerId) { + acceptedCalls.remove(callerId); + } + + public Map getCallState(String channelName) { + if (channelName == null || channelName.isBlank()) { + return new HashMap<>(); + } + return callStates.getOrDefault(channelName, new HashMap<>()); + } + public void notifyCallEnded(Long callerId, Long otherId) { + notifyCallEnded(callerId, otherId, null); + } + + public void notifyCallEnded(Long callerId, Long otherId, String channelName) { if (otherId == null) { return; } + clearPendingCall(otherId); + clearPendingCall(callerId); + clearAcceptedCall(callerId); + clearAcceptedCall(otherId); + + String resolvedChannel = channelName; + if (resolvedChannel == null || resolvedChannel.isBlank()) { + resolvedChannel = findActiveChannel(callerId, otherId); + } + Map payload = new HashMap<>(getCallState(resolvedChannel)); + payload.put("type", "CALL_ENDED"); + payload.put("status", "ENDED"); + payload.put("callerId", String.valueOf(callerId)); + payload.put("otherId", String.valueOf(otherId)); + payload.put("channelName", resolvedChannel != null ? resolvedChannel : ""); + payload.put("endedBy", String.valueOf(callerId)); + payload.put("endedAt", String.valueOf(System.currentTimeMillis())); + if (resolvedChannel != null && !resolvedChannel.isBlank()) { + callStates.put(resolvedChannel, payload); + } + + locationBroadcaster.broadcastCall(otherId, payload); + locationBroadcaster.broadcastCall(callerId, payload); + userRepository.findById(otherId).ifPresent(other -> { if (other.getFcmToken() == null || other.getFcmToken().isBlank()) { return; } - fcmService.sendToToken( other.getFcmToken(), "Panggilan Berakhir", "Panggilan telah berakhir", - Map.of("type", "CALL_ENDED", "callerId", String.valueOf(callerId)) + payload ); }); } -} + + private String findActiveChannel(Long userA, Long userB) { + String a = String.valueOf(userA); + String b = String.valueOf(userB); + return callStates.entrySet().stream() + .filter(e -> a.equals(e.getValue().get("callerId")) && b.equals(e.getValue().get("receiverId")) + || b.equals(e.getValue().get("callerId")) && a.equals(e.getValue().get("receiverId"))) + .map(Map.Entry::getKey) + .findFirst() + .orElse(null); + } +} \ No newline at end of file diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/service/FcmService.java b/walkguide-backend/demo/src/main/java/com/walkguide/service/FcmService.java index 466a707..b39bd6e 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/service/FcmService.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/service/FcmService.java @@ -1,50 +1,130 @@ package com.walkguide.service; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import com.google.cloud.Timestamp; +import com.google.cloud.firestore.Firestore; +import com.google.firebase.FirebaseApp; +import com.google.firebase.cloud.FirestoreClient; +import com.google.firebase.messaging.AndroidConfig; +import com.google.firebase.messaging.AndroidNotification; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.time.Instant; +import java.util.HashMap; import java.util.Map; /** - * FCM Service untuk push notification. - * Saat ini dalam mode LOG-ONLY agar tidak butuh Firebase credentials dulu. - * Untuk enable FCM nyata: uncomment bagian Firebase dan tambah dependency Firebase Admin SDK. + * FCM Service untuk push notification dan audit notifikasi ke Firestore. + * Jika Firebase credential belum tersedia, service tetap aman berjalan dalam mode log-only. */ @Service -@RequiredArgsConstructor -@Slf4j public class FcmService { - public void sendToToken(String fcmToken, String title, String body, Map data) { - if (fcmToken == null || fcmToken.isBlank()) { - log.warn("[FCM] Token kosong, skip notifikasi: {} - {}", title, body); - return; - } - // LOG ONLY untuk sekarang - log.info("[FCM] TO={} | TITLE={} | BODY={} | DATA={}", fcmToken, title, body, data); + private static final Logger log = LoggerFactory.getLogger(FcmService.class); - // TODO: uncomment ini setelah tambah Firebase Admin SDK ke pom.xml - // dan taruh google-services-admin.json di src/main/resources/firebase/ - // - // try { - // Message message = Message.builder() - // .setToken(fcmToken) - // .setNotification(Notification.builder().setTitle(title).setBody(body).build()) - // .putAllData(data != null ? data : Map.of()) - // .setAndroidConfig(AndroidConfig.builder() - // .setPriority(AndroidConfig.Priority.HIGH) - // .build()) - // .build(); - // String response = FirebaseMessaging.getInstance().send(message); - // log.info("[FCM] Sent successfully: {}", response); - // } catch (FirebaseMessagingException e) { - // log.error("[FCM] Failed to send: {}", e.getMessage()); - // } + public void sendToToken(String fcmToken, String title, String body, Map data) { + sendInternal(fcmToken, title, body, data, false); } public void sendHighPriority(String fcmToken, String title, String body, Map data) { - // SOS dan incoming call pakai ini - sama untuk sekarang - sendToToken(fcmToken, title, body, data); + sendInternal(fcmToken, title, body, data, true); + } + + @Value("${firebase.notifications-collection:notifications}") + private String notificationsCollection; + + private void sendInternal(String fcmToken, String title, String body, Map data, boolean highPriority) { + Map safeData = data != null ? data : Map.of(); + String status = "SKIPPED"; + String messageId = null; + + if (fcmToken == null || fcmToken.isBlank()) { + log.warn("[FCM] Token kosong, skip notifikasi: {} - {}", title, body); + saveNotificationAudit(fcmToken, title, body, safeData, highPriority, status, null); + return; + } + + if (FirebaseApp.getApps().isEmpty()) { + status = "LOG_ONLY"; + log.info("[FCM] LOG_ONLY TO={} | TITLE={} | BODY={} | DATA={}", + maskToken(fcmToken), title, body, safeData); + saveNotificationAudit(fcmToken, title, body, safeData, highPriority, status, null); + return; + } + + try { + AndroidConfig.Priority priority = highPriority + ? AndroidConfig.Priority.HIGH + : AndroidConfig.Priority.NORMAL; + + AndroidNotification androidNotification = AndroidNotification.builder() + .setChannelId(highPriority ? "walkguide_urgent" : "walkguide_alerts") + .setPriority(highPriority + ? AndroidNotification.Priority.MAX + : AndroidNotification.Priority.DEFAULT) + .build(); + + Message message = Message.builder() + .setToken(fcmToken) + .setNotification(Notification.builder() + .setTitle(title != null ? title : "WalkGuide") + .setBody(body != null ? body : "") + .build()) + .putAllData(safeData) + .setAndroidConfig(AndroidConfig.builder() + .setPriority(priority) + .setNotification(androidNotification) + .build()) + .build(); + + messageId = FirebaseMessaging.getInstance().send(message); + status = "SENT"; + log.info("[FCM] Sent {} notification successfully: {}", highPriority ? "high-priority" : "normal", messageId); + } catch (Exception e) { + status = "FAILED"; + log.error("[FCM] Failed to send notification: {}", e.getMessage()); + } finally { + saveNotificationAudit(fcmToken, title, body, safeData, highPriority, status, messageId); + } + } + + private void saveNotificationAudit(String fcmToken, String title, String body, Map data, + boolean highPriority, String status, String messageId) { + if (FirebaseApp.getApps().isEmpty()) { + return; + } + + try { + Firestore firestore = FirestoreClient.getFirestore(); + Map doc = new HashMap<>(); + doc.put("title", title); + doc.put("body", body); + doc.put("type", data.getOrDefault("type", "GENERAL")); + doc.put("data", data); + doc.put("priority", highPriority ? "HIGH" : "NORMAL"); + doc.put("status", status); + doc.put("messageId", messageId); + doc.put("recipientTokenMasked", maskToken(fcmToken)); + doc.put("createdAt", Timestamp.ofTimeSecondsAndNanos(Instant.now().getEpochSecond(), 0)); + + firestore.collection(notificationsCollection).add(doc).get(); + log.debug("[FIRESTORE] Notification audit saved | type={} status={}", doc.get("type"), status); + } catch (Exception e) { + log.warn("[FIRESTORE] Notification audit skipped: {}", e.getMessage()); + } + } + + private String maskToken(String token) { + if (token == null || token.isBlank()) { + return ""; + } + int visible = Math.min(6, token.length()); + return "***" + token.substring(token.length() - visible); } } + diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/service/PairingService.java b/walkguide-backend/demo/src/main/java/com/walkguide/service/PairingService.java index 69f0445..3a9f8e1 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/service/PairingService.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/service/PairingService.java @@ -7,7 +7,6 @@ import com.walkguide.enums.*; import com.walkguide.exception.PairingException; import com.walkguide.exception.ResourceNotFoundException; import com.walkguide.repository.*; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,7 +17,6 @@ import java.util.List; import java.util.Map; @Service -@RequiredArgsConstructor public class PairingService { private final PairingRelationRepository pairingRelationRepository; @@ -34,6 +32,22 @@ public class PairingService { private static final int PAIRING_CODE_TTL_MINUTES = 15; private static final SecureRandom RANDOM = new SecureRandom(); + public PairingService(PairingRelationRepository pairingRelationRepository, + UserRepository userRepository, + VoiceCommandConfigRepository voiceCommandConfigRepository, + HardwareShortcutRepository hardwareShortcutRepository, + AiConfigRepository aiConfigRepository, + ActivityLogService activityLogService, + FcmService fcmService) { + this.pairingRelationRepository = pairingRelationRepository; + this.userRepository = userRepository; + this.voiceCommandConfigRepository = voiceCommandConfigRepository; + this.hardwareShortcutRepository = hardwareShortcutRepository; + this.aiConfigRepository = aiConfigRepository; + this.activityLogService = activityLogService; + this.fcmService = fcmService; + } + @Transactional public PairingCodeResponse getOrCreatePairingCode(Long userId) { User user = userRepository.findById(userId) @@ -69,7 +83,6 @@ public class PairingService { @Transactional public PairingStatusResponse inviteUser(Long guardianId, String submittedCode) { - // Guardian tidak boleh punya pairing ACTIVE atau PENDING if (pairingRelationRepository.existsByGuardian_IdAndStatus(guardianId, PairingStatus.ACTIVE)) { throw new PairingException("Kamu sudah memiliki user yang dipair. Unpair dulu sebelum invite user baru."); } @@ -88,6 +101,52 @@ public class PairingService { throw new PairingException("User ini sudah dipair dengan Guardian lain."); } + var existingGuardianPairing = pairingRelationRepository.findByGuardian_Id(guardianId); + if (existingGuardianPairing.isPresent()) { + PairingRelation existing = existingGuardianPairing.get(); + if (existing.getStatus() == PairingStatus.ACTIVE) { + if (existing.getUser().getId().equals(user.getId())) { + return buildStatus(existing, guardian, existing.getUser(), "GUARDIAN"); + } + throw new PairingException( + "Guardian sudah pairing aktif dengan User lain. Unpair dulu sebelum invite User baru."); + } + if (existing.getStatus() == PairingStatus.PENDING) { + if (existing.getUser().getId().equals(user.getId())) { + sendPairingInviteNotification(existing, guardian, user); + return buildStatus(existing, guardian, user, "GUARDIAN"); + } + throw new PairingException( + "Guardian masih punya undangan pairing yang menunggu respons User."); + } + } + + var existingUserPairing = pairingRelationRepository.findByUser_Id(user.getId()); + if (existingUserPairing.isPresent()) { + PairingRelation existing = existingUserPairing.get(); + if (existing.getStatus() == PairingStatus.ACTIVE) { + throw new PairingException("User ini sudah dipair dengan Guardian lain."); + } + if (existing.getStatus() == PairingStatus.PENDING) { + if (existing.getGuardian().getId().equals(guardianId)) { + sendPairingInviteNotification(existing, guardian, user); + return buildStatus(existing, guardian, user, "GUARDIAN"); + } + throw new PairingException("User ini masih punya undangan pairing dari Guardian lain."); + } + } + + if (existingGuardianPairing.isPresent()) { + pairingRelationRepository.delete(existingGuardianPairing.get()); + pairingRelationRepository.flush(); + } + if (existingUserPairing.isPresent() + && (existingGuardianPairing.isEmpty() + || !existingUserPairing.get().getId().equals(existingGuardianPairing.get().getId()))) { + pairingRelationRepository.delete(existingUserPairing.get()); + pairingRelationRepository.flush(); + } + PairingRelation pairing = PairingRelation.builder() .guardian(guardian) .user(user) @@ -99,11 +158,7 @@ public class PairingService { user.setPairingCodeExpiresAt(null); userRepository.save(user); - // Kirim FCM ke user - fcmService.sendToToken(user.getFcmToken(), - "Pairing Request", - "Guardian " + guardian.getDisplayName() + " mengundang kamu untuk terhubung", - Map.of("type", "PAIRING_INVITE", "guardianName", guardian.getDisplayName())); + sendPairingInviteNotification(pairing, guardian, user); activityLogService.createLog(guardian, ActivityLogType.PAIRING_INVITE_SENT, "Guardian mengirim invite ke " + user.getDisplayName(), null); @@ -195,6 +250,13 @@ public class PairingService { // ========== PRIVATE ========== private void seedDefaults(Long guardianId, Long userId) { + voiceCommandConfigRepository.deleteByUserId(userId); + hardwareShortcutRepository.deleteByUserId(userId); + aiConfigRepository.findByUserId(userId).ifPresent(aiConfigRepository::delete); + voiceCommandConfigRepository.flush(); + hardwareShortcutRepository.flush(); + aiConfigRepository.flush(); + // Voice commands default List defaults = List.of( vc(guardianId, userId, VoiceCommandKey.OPEN_WALKGUIDE, "Open Walkguide"), @@ -261,6 +323,15 @@ public class PairingService { return user; } + private void sendPairingInviteNotification(PairingRelation pairing, User guardian, User user) { + fcmService.sendToToken(user.getFcmToken(), + "Pairing Request", + "Guardian " + guardian.getDisplayName() + " mengundang kamu untuk terhubung", + Map.of( + "type", "PAIRING_INVITE", + "pairingId", pairing.getId().toString(), + "guardianName", guardian.getDisplayName())); + } private void assignNewPairingCode(User user, LocalDateTime now) { String candidate; do { @@ -307,3 +378,4 @@ public class PairingService { .build(); } } + diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/service/SosService.java b/walkguide-backend/demo/src/main/java/com/walkguide/service/SosService.java index bd68ab0..6210717 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/service/SosService.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/service/SosService.java @@ -7,6 +7,7 @@ import com.walkguide.entity.User; import com.walkguide.enums.ActivityLogType; import com.walkguide.enums.PairingStatus; import com.walkguide.enums.SosStatus; +import com.walkguide.exception.PairingException; import com.walkguide.exception.ResourceNotFoundException; import com.walkguide.repository.*; import com.walkguide.websocket.LocationBroadcaster; @@ -36,6 +37,14 @@ public class SosService { @Transactional public SosEventResponse triggerSos(Long userId, SosRequest req) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ResourceNotFoundException("User tidak ditemukan")); + + var activePairing = pairingRelationRepository + .findByUser_IdAndStatus(userId, PairingStatus.ACTIVE) + .orElseThrow(() -> new PairingException( + "SOS hanya bisa dikirim setelah User terhubung dengan Guardian aktif.")); + SosEvent sos = SosEvent.builder() .userId(userId) .triggerType(req.getTriggerType() != null ? req.getTriggerType() : "MANUAL") @@ -46,18 +55,13 @@ public class SosService { sos = sosEventRepository.save(sos); final SosEvent savedSos = sos; - User user = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException("User tidak ditemukan")); - activityLogService.createLog(user, ActivityLogType.SOS_TRIGGERED, "SOS dikirim via " + sos.getTriggerType(), null); SosEventResponse sosResponse = toResponse(savedSos); // Kirim ke Guardian via FCM (background) + WebSocket (foreground) - pairingRelationRepository.findByUser_IdAndStatus(userId, PairingStatus.ACTIVE) - .ifPresent(pairing -> { - User guardian = pairing.getGuardian(); + User guardian = activePairing.getGuardian(); String guardianFcm = guardian.getFcmToken(); String locStr = req.getLat() != null ? String.format("Lat:%.4f,Lng:%.4f", req.getLat(), req.getLng()) @@ -78,7 +82,6 @@ public class SosService { log.info("[SOS] Alert sent to Guardian={} for User={} | trigger={}", guardian.getId(), userId, savedSos.getTriggerType()); - }); return sosResponse; } diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/websocket/LocationBroadcaster.java b/walkguide-backend/demo/src/main/java/com/walkguide/websocket/LocationBroadcaster.java index a73d88d..3b4f83f 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/websocket/LocationBroadcaster.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/websocket/LocationBroadcaster.java @@ -3,68 +3,49 @@ package com.walkguide.websocket; import com.walkguide.dto.response.LocationResponse; import com.walkguide.dto.response.NotificationResponse; import com.walkguide.dto.response.SosEventResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; -/** - * Service untuk broadcast pesan real-time via WebSocket (STOMP). - * - * Dipakai oleh: - * - LocationService → broadcast GPS ke Guardian - * - SosService → broadcast SOS ke Guardian - * - NotificationService→ broadcast notif ke User - * - * PATTERN: Observer — Guardian/User subscribe ke topic, - * LocationBroadcaster push data saat ada update. - */ +import java.util.Map; + @Service -@RequiredArgsConstructor -@Slf4j public class LocationBroadcaster { + private static final Logger log = LoggerFactory.getLogger(LocationBroadcaster.class); + private final SimpMessagingTemplate messagingTemplate; - /** - * Broadcast lokasi GPS user ke Guardian yang subscribe. - * Guardian Flutter subscribe ke: /topic/location/{userId} - * - * @param userId ID dari ROLE_USER (bukan guardian) - * @param location Response lokasi terbaru - */ + public LocationBroadcaster(SimpMessagingTemplate messagingTemplate) { + this.messagingTemplate = messagingTemplate; + } + public void broadcastLocation(Long userId, LocationResponse location) { String destination = "/topic/location/" + userId; messagingTemplate.convertAndSend(destination, location); - log.debug("[WS] Location broadcast → {} | lat={} lng={}", + log.debug("[WS] Location broadcast -> {} | lat={} lng={}", destination, location.getLat(), location.getLng()); } - /** - * Broadcast SOS event ke Guardian secara real-time. - * Guardian Flutter subscribe ke: /queue/sos/{guardianId} - * - * @param guardianId ID dari ROLE_GUARDIAN - * @param sos SOS event yang baru di-trigger - */ public void broadcastSos(Long guardianId, SosEventResponse sos) { String destination = "/queue/sos/" + guardianId; messagingTemplate.convertAndSend(destination, sos); - log.info("[WS] SOS broadcast → {} | userId={} status={}", + log.info("[WS] SOS broadcast -> {} | userId={} status={}", destination, sos.getUserId(), sos.getStatus()); } - /** - * Broadcast notifikasi dari Guardian ke User secara real-time. - * User Flutter subscribe ke: /queue/notif/{userId} - * - * @param userId ID dari ROLE_USER yang menerima notif - * @param notification Notifikasi yang baru dikirim Guardian - */ public void broadcastNotification(Long userId, NotificationResponse notification) { String destination = "/queue/notif/" + userId; messagingTemplate.convertAndSend(destination, notification); - log.debug("[WS] Notification broadcast → {} | type={}", + log.debug("[WS] Notification broadcast -> {} | type={}", destination, notification.getNotifType()); } + + public void broadcastCall(Long receiverId, Map payload) { + String destination = "/queue/call/" + receiverId; + messagingTemplate.convertAndSend(destination, payload); + log.info("[WS] Call broadcast -> {} | type={} status={} channel={}", + destination, payload.get("type"), payload.get("status"), payload.get("channelName")); + } } diff --git a/walkguide-backend/demo/src/main/resources/application-dev.yml b/walkguide-backend/demo/src/main/resources/application-dev.yml index 41a46e8..58e9101 100644 --- a/walkguide-backend/demo/src/main/resources/application-dev.yml +++ b/walkguide-backend/demo/src/main/resources/application-dev.yml @@ -8,7 +8,16 @@ spring: datasource: url: ${DB_URL:jdbc:postgresql://202.46.28.160:2002/uas_5803024001} username: ${DB_USERNAME:5803024001} - password: ${DB_PASSWORD:pw5803024001} + password: ${DB_PASSWORD:pw5803024001} + hikari: + maximum-pool-size: ${DB_POOL_MAX:1} + minimum-idle: ${DB_POOL_MIN_IDLE:0} + connection-timeout: ${DB_CONNECTION_TIMEOUT:10000} + idle-timeout: ${DB_IDLE_TIMEOUT:30000} + max-lifetime: ${DB_MAX_LIFETIME:120000} + + flyway: + enabled: ${FLYWAY_ENABLED:false} jpa: show-sql: true @@ -21,8 +30,8 @@ jwt: expiration: ${JWT_EXPIRATION:86400000} agora: - app-id: ${AGORA_APP_ID:} - app-certificate: ${AGORA_APP_CERTIFICATE:} + app-id: ${AGORA_APP_ID:e36c2b6592e34cfda1f6ea6432a5e68d} + app-certificate: ${AGORA_APP_CERTIFICATE:70a4288475734a8c92ff8686c66cbc77} logging: level: diff --git a/walkguide-backend/demo/src/main/resources/application.properties b/walkguide-backend/demo/src/main/resources/application.properties index c5cea7b..3fc8d3b 100644 --- a/walkguide-backend/demo/src/main/resources/application.properties +++ b/walkguide-backend/demo/src/main/resources/application.properties @@ -1,11 +1,19 @@ # ===== SERVER ===== +spring.config.import=optional:file:./secrets.properties server.port=${SERVER_PORT:8080} +server.address=${SERVER_ADDRESS:0.0.0.0} # ===== POSTGRESQL CONNECTION ===== spring.datasource.url=${DB_URL:jdbc:postgresql://202.46.28.160:2002/uas_5803024001} spring.datasource.username=${DB_USERNAME:5803024001} spring.datasource.password=${DB_PASSWORD:pw5803024001} spring.datasource.driver-class-name=org.postgresql.Driver +# ===== HIKARI POOL (keep DB classroom slots low) ===== +spring.datasource.hikari.maximum-pool-size=${DB_POOL_MAX:1} +spring.datasource.hikari.minimum-idle=${DB_POOL_MIN_IDLE:0} +spring.datasource.hikari.connection-timeout=${DB_CONNECTION_TIMEOUT:10000} +spring.datasource.hikari.idle-timeout=${DB_IDLE_TIMEOUT:30000} +spring.datasource.hikari.max-lifetime=${DB_MAX_LIFETIME:120000} # ===== JPA / HIBERNATE ===== spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect @@ -27,9 +35,13 @@ springdoc.swagger-ui.path=/swagger-ui.html springdoc.api-docs.path=/v3/api-docs # ===== AGORA RTC ===== -agora.app-id=${AGORA_APP_ID:} +agora.app-id=${AGORA_APP_ID:e36c2b6592e34cfda1f6ea6432a5e68d} agora.app-certificate=${AGORA_APP_CERTIFICATE:} +# ===== FIREBASE ===== +firebase.credentials-path=${FIREBASE_CREDENTIALS_PATH:classpath:firebase/google-services-admin.json} +firebase.notifications-collection=${FIREBASE_NOTIFICATIONS_COLLECTION:notifications} + # ===== WEBSOCKET ===== # WebSocket auto-dikonfigurasi oleh WebSocketConfig.java diff --git a/walkguide-backend/demo/src/test/java/com/walkguide/service/SosServiceTest.java b/walkguide-backend/demo/src/test/java/com/walkguide/service/SosServiceTest.java index 7bf6329..b33cb55 100644 --- a/walkguide-backend/demo/src/test/java/com/walkguide/service/SosServiceTest.java +++ b/walkguide-backend/demo/src/test/java/com/walkguide/service/SosServiceTest.java @@ -4,10 +4,11 @@ import com.walkguide.dto.request.SosRequest; import com.walkguide.dto.response.SosEventResponse; import com.walkguide.entity.PairingRelation; import com.walkguide.entity.SosEvent; -import com.walkguide.entity.User; -import com.walkguide.enums.PairingStatus; -import com.walkguide.enums.SosStatus; -import com.walkguide.exception.ResourceNotFoundException; +import com.walkguide.entity.User; +import com.walkguide.enums.PairingStatus; +import com.walkguide.enums.SosStatus; +import com.walkguide.exception.PairingException; +import com.walkguide.exception.ResourceNotFoundException; import com.walkguide.repository.*; import com.walkguide.websocket.LocationBroadcaster; import org.junit.jupiter.api.BeforeEach; @@ -79,10 +80,10 @@ class SosServiceTest { req.setLat(-7.257); req.setLng(112.752); - when(sosEventRepository.save(any(SosEvent.class))).thenReturn(savedSos); - when(userRepository.findById(2L)).thenReturn(Optional.of(user)); - when(pairingRelationRepository.findByUser_IdAndStatus(2L, PairingStatus.ACTIVE)) - .thenReturn(Optional.empty()); // tidak ada guardian → skip FCM + when(sosEventRepository.save(any(SosEvent.class))).thenReturn(savedSos); + when(userRepository.findById(2L)).thenReturn(Optional.of(user)); + when(pairingRelationRepository.findByUser_IdAndStatus(2L, PairingStatus.ACTIVE)) + .thenReturn(Optional.of(activePairing)); doNothing().when(activityLogService).createLog(any(), any(), any(), any()); SosEventResponse result = sosService.triggerSos(2L, req); @@ -103,10 +104,10 @@ class SosServiceTest { req.setLat(-7.257); req.setLng(112.752); - when(sosEventRepository.save(any(SosEvent.class))).thenReturn(savedSos); - when(userRepository.findById(2L)).thenReturn(Optional.of(user)); - when(pairingRelationRepository.findByUser_IdAndStatus(2L, PairingStatus.ACTIVE)) - .thenReturn(Optional.empty()); + when(sosEventRepository.save(any(SosEvent.class))).thenReturn(savedSos); + when(userRepository.findById(2L)).thenReturn(Optional.of(user)); + when(pairingRelationRepository.findByUser_IdAndStatus(2L, PairingStatus.ACTIVE)) + .thenReturn(Optional.of(activePairing)); doNothing().when(activityLogService).createLog(any(), any(), any(), any()); ArgumentCaptor captor = ArgumentCaptor.forClass(SosEvent.class); @@ -147,12 +148,27 @@ class SosServiceTest { SosRequest req = new SosRequest(); req.setTriggerType("MANUAL"); - when(sosEventRepository.save(any(SosEvent.class))).thenReturn(savedSos); - when(userRepository.findById(99L)).thenReturn(Optional.empty()); - - assertThatThrownBy(() -> sosService.triggerSos(99L, req)) - .isInstanceOf(ResourceNotFoundException.class); - } + when(userRepository.findById(99L)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> sosService.triggerSos(99L, req)) + .isInstanceOf(ResourceNotFoundException.class); + } + + @Test + @DisplayName("triggerSos - tanpa pairing aktif: harus throw PairingException dan tidak simpan SOS") + void triggerSos_unpaired_shouldThrowPairingException() { + SosRequest req = new SosRequest(); + req.setTriggerType("MANUAL"); + + when(userRepository.findById(2L)).thenReturn(Optional.of(user)); + when(pairingRelationRepository.findByUser_IdAndStatus(2L, PairingStatus.ACTIVE)) + .thenReturn(Optional.empty()); + + assertThatThrownBy(() -> sosService.triggerSos(2L, req)) + .isInstanceOf(PairingException.class) + .hasMessageContaining("Guardian aktif"); + verify(sosEventRepository, never()).save(any(SosEvent.class)); + } // ===== acknowledgeSos TESTS ===== diff --git a/walkguide-mobile/walkguide_app/android/app/build.gradle.kts b/walkguide-mobile/walkguide_app/android/app/build.gradle.kts index 24d296b..cfd2b78 100644 --- a/walkguide-mobile/walkguide_app/android/app/build.gradle.kts +++ b/walkguide-mobile/walkguide_app/android/app/build.gradle.kts @@ -5,6 +5,10 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +if (file("google-services.json").exists()) { + apply(plugin = "com.google.gms.google-services") +} + android { namespace = "com.example.walkguide_app" compileSdk = flutter.compileSdkVersion diff --git a/walkguide-mobile/walkguide_app/android/gradle.properties b/walkguide-mobile/walkguide_app/android/gradle.properties index 7ed25f5..d80fffc 100644 --- a/walkguide-mobile/walkguide_app/android/gradle.properties +++ b/walkguide-mobile/walkguide_app/android/gradle.properties @@ -1,4 +1,7 @@ -org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=1G -XX:ReservedCodeCacheSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.workers.max=2 +org.gradle.parallel=false +org.gradle.daemon=false android.useAndroidX=true android.enableJetifier=true -kotlin.incremental=false +kotlin.incremental=false \ No newline at end of file diff --git a/walkguide-mobile/walkguide_app/android/settings.gradle.kts b/walkguide-mobile/walkguide_app/android/settings.gradle.kts index fb605bc..a907d73 100644 --- a/walkguide-mobile/walkguide_app/android/settings.gradle.kts +++ b/walkguide-mobile/walkguide_app/android/settings.gradle.kts @@ -21,6 +21,7 @@ plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" id("com.android.application") version "8.9.1" apply false id("org.jetbrains.kotlin.android") version "2.1.0" apply false + id("com.google.gms.google-services") version "4.4.2" apply false } include(":app") diff --git a/walkguide-mobile/walkguide_app/lib/app/app.dart b/walkguide-mobile/walkguide_app/lib/app/app.dart index ebf00e5..b72fbdd 100644 --- a/walkguide-mobile/walkguide_app/lib/app/app.dart +++ b/walkguide-mobile/walkguide_app/lib/app/app.dart @@ -4,13 +4,14 @@ import 'package:google_fonts/google_fonts.dart'; import 'app_cubit.dart'; import 'router.dart'; +import '../core/theme/app_colors.dart'; class WalkGuideApp extends StatelessWidget { const WalkGuideApp({super.key}); @override Widget build(BuildContext context) { - const seed = Color(0xFF1A56DB); + const seed = AppColors.primary; return BlocProvider( create: (_) => AppCubit(), @@ -23,9 +24,15 @@ class WalkGuideApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed( seedColor: seed, brightness: Brightness.light, + primary: seed, + secondary: AppColors.accent, + error: AppColors.danger, + ), + scaffoldBackgroundColor: AppColors.surface, + textTheme: GoogleFonts.interTextTheme().apply( + bodyColor: AppColors.text, + displayColor: AppColors.text, ), - scaffoldBackgroundColor: const Color(0xFFF4F7FB), - textTheme: GoogleFonts.interTextTheme(), pageTransitionsTheme: const PageTransitionsTheme( builders: { TargetPlatform.android: ZoomPageTransitionsBuilder(), @@ -35,16 +42,41 @@ class WalkGuideApp extends StatelessWidget { ), appBarTheme: const AppBarTheme( centerTitle: false, - backgroundColor: Color(0xFFF4F7FB), - foregroundColor: Color(0xFF0F172A), + backgroundColor: AppColors.surface, + foregroundColor: AppColors.text, elevation: 0, surfaceTintColor: Colors.transparent, ), + cardTheme: CardThemeData( + elevation: 0, + color: AppColors.surfaceRaised, + surfaceTintColor: Colors.transparent, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide(color: AppColors.border), + ), + ), + dividerTheme: const DividerThemeData( + color: AppColors.border, + thickness: 1, + space: 1, + ), + iconButtonTheme: IconButtonThemeData( + style: IconButton.styleFrom( + foregroundColor: AppColors.text, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide(color: AppColors.border), + ), + ), + ), navigationBarTheme: NavigationBarThemeData( elevation: 0, height: 76, - backgroundColor: Colors.white.withValues(alpha: 0.96), - indicatorColor: const Color(0xFFE0E7FF), + backgroundColor: Colors.white, + indicatorColor: const Color(0xFFDDEAFE), + surfaceTintColor: Colors.transparent, labelTextStyle: WidgetStateProperty.resolveWith( (states) => TextStyle( fontSize: 12, @@ -61,7 +93,7 @@ class WalkGuideApp extends StatelessWidget { minimumSize: const Size(0, 50), textStyle: const TextStyle(fontWeight: FontWeight.w800), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(14), + borderRadius: BorderRadius.circular(10), ), ), ), @@ -70,27 +102,38 @@ class WalkGuideApp extends StatelessWidget { minimumSize: const Size(0, 50), foregroundColor: seed, textStyle: const TextStyle(fontWeight: FontWeight.w800), - side: const BorderSide(color: Color(0xFFCBD5E1)), + side: const BorderSide(color: AppColors.border), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(14), + borderRadius: BorderRadius.circular(10), ), ), ), + snackBarTheme: SnackBarThemeData( + behavior: SnackBarBehavior.floating, + backgroundColor: AppColors.text, + contentTextStyle: GoogleFonts.inter( + color: Colors.white, + fontWeight: FontWeight.w600, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), inputDecorationTheme: InputDecorationTheme( filled: true, - fillColor: const Color(0xFFF8FAFC), + fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFE2E8F0)), + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: AppColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFE2E8F0)), + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: AppColors.border), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: seed, width: 1.5), ), ), diff --git a/walkguide-mobile/walkguide_app/lib/app/injection_container.dart b/walkguide-mobile/walkguide_app/lib/app/injection_container.dart index d51cd1b..8550976 100644 --- a/walkguide-mobile/walkguide_app/lib/app/injection_container.dart +++ b/walkguide-mobile/walkguide_app/lib/app/injection_container.dart @@ -10,6 +10,7 @@ import '../core/services/haptic_service.dart'; import '../core/services/call_service.dart'; import '../core/services/fcm_service.dart'; import '../core/services/hardware_shortcut_listener.dart'; +import '../core/services/incoming_call_polling_service.dart'; import '../core/services/location_reporter_service.dart'; import '../core/services/offline_queue_service.dart'; import '../core/services/stt_service.dart'; @@ -39,17 +40,24 @@ Future initDependencies() async { sl.registerLazySingleton(() => SttService()); sl.registerLazySingleton(() => HapticService()); sl.registerLazySingleton( - () => TtsWithHapticObstacleAlertStrategy(sl(), sl()), + () => TtsWithHapticObstacleAlertStrategy( + sl(), sl()), ); sl.registerLazySingleton(() => ObstacleAnalyzer()); - sl.registerLazySingleton(() => YoloDetector(sl())); + sl.registerLazySingleton( + () => YoloDetector(sl())); sl.registerLazySingleton( () => OfflineQueueService(sl()), ); sl.registerLazySingleton(() => FcmService(sl())); - sl.registerLazySingleton(() => WebSocketService(sl())); - sl.registerLazySingleton(() => LocationReporterService(sl(), sl())); + sl.registerLazySingleton( + () => WebSocketService(sl())); + sl.registerLazySingleton(() => + LocationReporterService(sl(), sl())); sl.registerLazySingleton(() => CallService(sl())); + sl.registerLazySingleton( + () => IncomingCallPollingService(sl()), + ); sl.registerLazySingleton( () => HardwareShortcutListener(sl()), ); @@ -59,8 +67,10 @@ Future initDependencies() async { sl.registerLazySingleton( () => WalkGuideRepositoryImpl(sl(), sl()), ); - sl.registerFactory(() => WalkGuideCubit(sl())); - sl.registerLazySingleton(() => SosRepositoryImpl(sl())); + sl.registerFactory( + () => WalkGuideCubit(sl())); + sl.registerLazySingleton( + () => SosRepositoryImpl(sl())); sl.registerFactory(() => SosCubit(sl())); sl.registerLazySingleton( () => NotificationRepositoryImpl(sl(), sl()), diff --git a/walkguide-mobile/walkguide_app/lib/app/router.dart b/walkguide-mobile/walkguide_app/lib/app/router.dart index 5eada23..a022a66 100644 --- a/walkguide-mobile/walkguide_app/lib/app/router.dart +++ b/walkguide-mobile/walkguide_app/lib/app/router.dart @@ -29,7 +29,8 @@ import '../features/navigation_mode/presentation/screens/navigation_mode_screen. as nav; import '../features/notifications/presentation/screens/notification_screen.dart' as notifications; -import '../features/pairing/presentation/screens/pairing_screens.dart' as pairing; +import '../features/pairing/presentation/screens/pairing_screens.dart' + as pairing; import '../features/server_connect/server_connect_server.dart' as server_connect; import '../features/settings/presentation/screens/user_settings_screen.dart' @@ -96,7 +97,17 @@ final GoRouter appRouter = GoRouter( builder: (_, __) => const auth_register.RegisterScreen()), GoRoute( path: '/incoming-call', - builder: (_, __) => const call.IncomingCallScreen()), + builder: (_, state) { + final extra = state.extra is Map + ? Map.from(state.extra as Map) + : {}; + return call.IncomingCallScreen( + callerName: extra['callerName']?.toString() ?? 'Guardian', + callerId: int.tryParse(extra['callerId']?.toString() ?? ''), + channelName: extra['channelName']?.toString(), + agoraToken: extra['agoraToken']?.toString(), + ); + }), ShellRoute( builder: (_, __, child) => UserShell(child: child), routes: [ @@ -161,6 +172,12 @@ final GoRouter appRouter = GoRouter( path: '/guardian/settings', builder: (_, __) => const guardian_settings.GuardianSettingsScreen()), + GoRoute( + path: '/guardian/call', + builder: (_, __) => const call.CallScreen( + targetLabel: 'User', + returnRoute: '/guardian/dashboard', + )), GoRoute( path: '/guardian/benchmark', builder: (_, __) => const benchmark.AiBenchmarkScreen()), diff --git a/walkguide-mobile/walkguide_app/lib/core/constants/app_constants.dart b/walkguide-mobile/walkguide_app/lib/core/constants/app_constants.dart index cc6cbbf..c6d2de0 100644 --- a/walkguide-mobile/walkguide_app/lib/core/constants/app_constants.dart +++ b/walkguide-mobile/walkguide_app/lib/core/constants/app_constants.dart @@ -61,7 +61,7 @@ class AppConstants { await prefs.setString(_selectedYoloModelKey, path); } - // Agora App ID diisi saat build: --dart-define=AGORA_APP_ID=... - static const String agoraAppId = - String.fromEnvironment('AGORA_APP_ID', defaultValue: ''); + // Agora App ID tetap bisa dioverride saat build: --dart-define=AGORA_APP_ID=... + static const String agoraAppId = String.fromEnvironment('AGORA_APP_ID', + defaultValue: 'e36c2b6592e34cfda1f6ea6432a5e68d'); } diff --git a/walkguide-mobile/walkguide_app/lib/core/errors/friendly_error.dart b/walkguide-mobile/walkguide_app/lib/core/errors/friendly_error.dart index 14b264f..4334958 100644 --- a/walkguide-mobile/walkguide_app/lib/core/errors/friendly_error.dart +++ b/walkguide-mobile/walkguide_app/lib/core/errors/friendly_error.dart @@ -71,6 +71,10 @@ bool _looksTechnical(String message) { 'null check operator', 'nosuchmethod', 'formatexception', + 'could not execute statement', + 'duplicate key', + 'constraint', + 'sql [', ]; return blocked.any(lower.contains); } diff --git a/walkguide-mobile/walkguide_app/lib/core/services/call_service.dart b/walkguide-mobile/walkguide_app/lib/core/services/call_service.dart index c52e5f3..06b59c7 100644 --- a/walkguide-mobile/walkguide_app/lib/core/services/call_service.dart +++ b/walkguide-mobile/walkguide_app/lib/core/services/call_service.dart @@ -1,5 +1,8 @@ +import 'dart:async'; + import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:flutter/foundation.dart'; +import 'package:permission_handler/permission_handler.dart'; import '../constants/app_constants.dart'; import '../network/api_client.dart'; @@ -7,9 +10,19 @@ import '../network/api_client.dart'; class CallService { final ApiClient _apiClient; RtcEngine? _engine; + VoidCallback? _onRemoteUserJoined; + VoidCallback? _onRemoteUserOffline; CallService(this._apiClient); + void setRemoteUserJoinedCallback(VoidCallback? callback) { + _onRemoteUserJoined = callback; + } + + void setRemoteUserOfflineCallback(VoidCallback? callback) { + _onRemoteUserOffline = callback; + } + Future?> requestToken({required int receiverId}) async { final res = await _apiClient.dio.post( '/shared/call/token', @@ -41,29 +54,83 @@ class CallService { }); } - Future callPairedUser({int uid = 0}) async { + Future?> startPairedCall({int uid = 0}) async { final receiverId = await getPairedReceiverId(); - if (receiverId == null) return false; + if (receiverId == null) return null; final tokenData = await requestToken(receiverId: receiverId); final channelName = tokenData?['channelName']?.toString(); final token = tokenData?['token']?.toString(); - if (channelName == null || channelName.isEmpty) return false; + final localUid = (tokenData?['uid'] as num?)?.toInt() ?? uid; + if (channelName == null || channelName.isEmpty) return null; final joined = await joinChannel( channelName: channelName, token: token, - uid: uid, + uid: localUid, ); - if (joined) { - await notifyIncomingCall( - receiverId: receiverId, - channelName: channelName, - agoraToken: token, - receiverUid: uid, - ); - } - return joined; + if (!joined) return null; + + await notifyIncomingCall( + receiverId: receiverId, + channelName: channelName, + agoraToken: token, + receiverUid: 0, + ); + + return { + 'receiverId': receiverId, + 'channelName': channelName, + 'token': token, + 'uid': localUid, + }; + } + + Future callPairedUser({int uid = 0}) async { + return await startPairedCall(uid: uid) != null; + } + + Future acceptIncomingCall({ + required int callerId, + required String channelName, + }) async { + await _apiClient.dio.post('/shared/call/accept', data: { + 'callerId': callerId.toString(), + 'channelName': channelName, + }); + } + + Future?> getAcceptedCall() async { + final res = await _apiClient.dio.get('/shared/call/accepted'); + final data = res.data['data']; + return data is Map ? Map.from(data) : null; + } + + Future?> getCallState(String? channelName) async { + if (channelName == null || channelName.isEmpty) return null; + final res = await _apiClient.dio.get( + '/shared/call/state', + queryParameters: {'channelName': channelName}, + ); + final data = res.data['data']; + return data is Map ? Map.from(data) : null; + } + + Future clearAcceptedCall() async { + await _apiClient.dio.delete('/shared/call/accepted'); + } + + Future clearPendingCall() async { + await _apiClient.dio.delete('/shared/call/pending'); + } + + Future endCall(int? otherId, {String? channelName}) async { + if (otherId == null) return; + await _apiClient.dio.post('/shared/call/end', data: { + 'otherId': otherId.toString(), + if (channelName != null && channelName.isNotEmpty) + 'channelName': channelName, + }); } Future joinChannel({ @@ -71,32 +138,94 @@ class CallService { String? token, int uid = 0, }) async { + final joinCompleter = Completer(); try { if (AppConstants.agoraAppId.isEmpty) { debugPrint('Agora join skipped: AGORA_APP_ID is not configured'); return false; } + if (!await _ensureMicrophonePermission()) { + debugPrint('Agora join skipped: microphone permission denied'); + return false; + } + _engine ??= createAgoraRtcEngine(); - await _engine!.initialize(const RtcEngineContext(appId: AppConstants.agoraAppId)); + await _engine!.initialize( + const RtcEngineContext(appId: AppConstants.agoraAppId), + ); + _engine!.registerEventHandler( + RtcEngineEventHandler( + onJoinChannelSuccess: (_, __) { + if (!joinCompleter.isCompleted) joinCompleter.complete(true); + }, + onUserJoined: (_, remoteUid, __) { + debugPrint('Agora remote user joined: $remoteUid'); + _onRemoteUserJoined?.call(); + }, + onUserOffline: (_, remoteUid, reason) { + debugPrint('Agora remote user offline: $remoteUid $reason'); + _onRemoteUserOffline?.call(); + }, + onError: (type, msg) { + debugPrint('Agora error: $type $msg'); + if (!joinCompleter.isCompleted) joinCompleter.complete(false); + }, + ), + ); + await _engine!.setChannelProfile( + ChannelProfileType.channelProfileCommunication, + ); await _engine!.enableAudio(); + await _engine!.enableLocalAudio(true); + await _engine!.muteLocalAudioStream(false); + await _engine!.setEnableSpeakerphone(true); await _engine!.joinChannel( token: token ?? '', channelId: channelName, uid: uid, - options: const ChannelMediaOptions(), + options: const ChannelMediaOptions( + channelProfile: ChannelProfileType.channelProfileCommunication, + clientRoleType: ClientRoleType.clientRoleBroadcaster, + publishMicrophoneTrack: true, + autoSubscribeAudio: true, + ), + ); + return joinCompleter.future.timeout( + const Duration(seconds: 10), + onTimeout: () { + debugPrint('Agora join timeout for channel $channelName'); + return false; + }, ); - return true; } catch (e) { debugPrint('Agora join skipped: $e'); return false; } } + Future _ensureMicrophonePermission() async { + if (kIsWeb) return true; + final status = await Permission.microphone.request(); + return status.isGranted || status.isLimited; + } + + Future setMuted(bool muted) async { + await _engine?.muteLocalAudioStream(muted); + } + + Future setSpeakerEnabled(bool enabled) async { + await _engine?.setEnableSpeakerphone(enabled); + } + Future leave() async { + _onRemoteUserJoined = null; + _onRemoteUserOffline = null; await _engine?.leaveChannel(); } Future dispose() async { + _onRemoteUserJoined = null; + _onRemoteUserOffline = null; await _engine?.release(); _engine = null; } diff --git a/walkguide-mobile/walkguide_app/lib/core/services/fcm_service.dart b/walkguide-mobile/walkguide_app/lib/core/services/fcm_service.dart index 0ae0286..8c122d9 100644 --- a/walkguide-mobile/walkguide_app/lib/core/services/fcm_service.dart +++ b/walkguide-mobile/walkguide_app/lib/core/services/fcm_service.dart @@ -1,13 +1,17 @@ +import 'dart:convert'; + import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import '../../app/router.dart'; import '../network/api_client.dart'; class FcmService { final ApiClient _apiClient; final FirebaseMessaging _messaging = FirebaseMessaging.instance; - final FlutterLocalNotificationsPlugin _localNotifications = FlutterLocalNotificationsPlugin(); + final FlutterLocalNotificationsPlugin _localNotifications = + FlutterLocalNotificationsPlugin(); FcmService(this._apiClient); @@ -18,6 +22,14 @@ class FcmService { const InitializationSettings( android: AndroidInitializationSettings('@mipmap/ic_launcher'), ), + onDidReceiveNotificationResponse: (response) { + final payload = response.payload; + if (payload == null || payload.isEmpty) return; + try { + final data = Map.from(jsonDecode(payload) as Map); + _handlePayloadNavigation(data); + } catch (_) {} + }, ); await _messaging.requestPermission(alert: true, badge: true, sound: true); final token = await _messaging.getToken(); @@ -26,7 +38,16 @@ class FcmService { FirebaseMessaging.onMessage.listen((message) { debugPrint('FCM foreground: ${message.data}'); _showLocalNotification(message); + _handlePayloadNavigation(message.data); }); + FirebaseMessaging.onMessageOpenedApp.listen((message) { + _handlePayloadNavigation(message.data); + }); + final initialMessage = + await FirebaseMessaging.instance.getInitialMessage(); + if (initialMessage != null) { + _handlePayloadNavigation(initialMessage.data); + } } catch (e) { debugPrint('FCM init skipped: $e'); } @@ -42,8 +63,11 @@ class FcmService { Future _showLocalNotification(RemoteMessage message) async { final notification = message.notification; - final title = notification?.title ?? message.data['title']?.toString() ?? 'WalkGuide'; - final body = notification?.body ?? message.data['body']?.toString() ?? 'Ada update baru'; + final title = + notification?.title ?? message.data['title']?.toString() ?? 'WalkGuide'; + final body = notification?.body ?? + message.data['body']?.toString() ?? + 'Ada update baru'; await _localNotifications.show( DateTime.now().millisecondsSinceEpoch ~/ 1000, title, @@ -57,7 +81,26 @@ class FcmService { priority: Priority.high, ), ), - payload: message.data['type']?.toString(), + payload: jsonEncode(message.data), ); } + + void _handlePayloadNavigation(Map data) { + final type = data['type']?.toString(); + if (type == 'INCOMING_CALL') { + appRouter.go('/incoming-call', extra: data); + return; + } + if (type == 'SOS_ALERT') { + appRouter.go('/guardian/dashboard'); + return; + } + if (type == 'PAIRING_INVITE' || type == 'PAIRING_RESPONSE') { + appRouter.go('/user/pairing'); + return; + } + if (type == 'NOTIFICATION') { + appRouter.go('/user/notifications'); + } + } } diff --git a/walkguide-mobile/walkguide_app/lib/core/services/incoming_call_polling_service.dart b/walkguide-mobile/walkguide_app/lib/core/services/incoming_call_polling_service.dart new file mode 100644 index 0000000..361ee5b --- /dev/null +++ b/walkguide-mobile/walkguide_app/lib/core/services/incoming_call_polling_service.dart @@ -0,0 +1,45 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; + +import '../../app/router.dart'; +import '../network/api_client.dart'; + +class IncomingCallPollingService { + IncomingCallPollingService(this._apiClient); + + final ApiClient _apiClient; + Timer? _timer; + String? _lastChannel; + + void start() { + if (_timer != null) return; + _timer = Timer.periodic(const Duration(seconds: 2), (_) => _check()); + unawaited(_check()); + } + + void stop() { + _timer?.cancel(); + _timer = null; + _lastChannel = null; + } + + Future _check() async { + try { + final res = await _apiClient.dio + .get('/shared/call/pending') + .timeout(const Duration(seconds: 3)); + final data = res.data['data']; + if (data is! Map) return; + if (data['type']?.toString() != 'INCOMING_CALL') return; + + final channel = data['channelName']?.toString(); + if (channel == null || channel.isEmpty || channel == _lastChannel) return; + _lastChannel = channel; + + appRouter.go('/incoming-call', extra: Map.from(data)); + } catch (e) { + debugPrint('Incoming call polling skipped: $e'); + } + } +} \ No newline at end of file diff --git a/walkguide-mobile/walkguide_app/lib/core/services/websocket_service.dart b/walkguide-mobile/walkguide_app/lib/core/services/websocket_service.dart index dc435b6..aaa205e 100644 --- a/walkguide-mobile/walkguide_app/lib/core/services/websocket_service.dart +++ b/walkguide-mobile/walkguide_app/lib/core/services/websocket_service.dart @@ -13,9 +13,9 @@ import '../storage/secure_storage.dart'; /// Flutter connect pakai STOMP agar bisa subscribe ke topic spesifik per user. /// /// Subscriptions yang dipakai: -/// Guardian → /topic/location/{userId} live GPS update -/// Guardian → /queue/sos/{guardianId} SOS alert real-time -/// User → /queue/notif/{userId} notifikasi dari Guardian +/// Guardian → /topic/location/{userId} live GPS update +/// Guardian → /queue/sos/{guardianId} SOS alert real-time +/// User → /queue/notif/{userId} notifikasi dari Guardian class WebSocketService { final SecureStorage _storage; @@ -26,11 +26,13 @@ class WebSocketService { void Function(double lat, double lng)? _onLocation; void Function(Map sosData)? _onSos; void Function(Map notifData)? _onNotif; + void Function(Map callData)? _onCall; // Subscription frames (untuk unsubscribe) StompUnsubscribe? _locationUnsub; StompUnsubscribe? _sosUnsub; StompUnsubscribe? _notifUnsub; + StompUnsubscribe? _callUnsub; WebSocketService(this._storage); @@ -88,18 +90,18 @@ class WebSocketService { await completer.future.timeout(const Duration(seconds: 5)); } catch (e) { debugPrint('[WS] Connect timeout/error: $e'); - // Don't throw — let dashboard work without WS + // Don't throw — let dashboard work without WS } } /// Subscribe ke live GPS updates dari User. /// Guardian panggil ini setelah connect. /// [userId] = ID dari ROLE_USER yang dipair. - void subscribeLocation(String userId, - void Function(double lat, double lng) callback) { + void subscribeLocation( + String userId, void Function(double lat, double lng) callback) { _onLocation = callback; if (_client == null || !_connected) { - debugPrint('[WS] subscribeLocation skipped — not connected'); + debugPrint('[WS] subscribeLocation skipped — not connected'); return; } _locationUnsub?.call(); // unsubscribe sebelumnya jika ada @@ -107,8 +109,7 @@ class WebSocketService { destination: '/topic/location/$userId', callback: (frame) { try { - final data = - jsonDecode(frame.body ?? '{}') as Map; + final data = jsonDecode(frame.body ?? '{}') as Map; final lat = (data['lat'] as num?)?.toDouble(); final lng = (data['lng'] as num?)?.toDouble(); if (lat != null && lng != null) { @@ -135,8 +136,7 @@ class WebSocketService { destination: '/queue/sos/$guardianId', callback: (frame) { try { - final data = - jsonDecode(frame.body ?? '{}') as Map; + final data = jsonDecode(frame.body ?? '{}') as Map; _onSos?.call(data); } catch (e) { debugPrint('[WS] SOS parse error: $e'); @@ -147,7 +147,7 @@ class WebSocketService { }); } - /// Subscribe ke notifikasi Guardian → User. + /// Subscribe ke notifikasi Guardian → User. /// [userId] = ID dari ROLE_USER yang login. void subscribeNotification( void Function(Map notifData) callback) { @@ -161,8 +161,7 @@ class WebSocketService { destination: '/queue/notif/$userId', callback: (frame) { try { - final data = - jsonDecode(frame.body ?? '{}') as Map; + final data = jsonDecode(frame.body ?? '{}') as Map; _onNotif?.call(data); } catch (e) { debugPrint('[WS] Notif parse error: $e'); @@ -173,20 +172,46 @@ class WebSocketService { }); } + /// Subscribe ke panggilan masuk realtime. Ini melengkapi FCM agar call tetap + /// masuk saat app foreground atau ketika FCM di app clone tidak stabil. + void subscribeCall(void Function(Map callData) callback) { + _onCall = callback; + if (_client == null || !_connected) return; + + _storage.getUserId().then((userId) { + if (userId == null) return; + _callUnsub?.call(); + _callUnsub = _client!.subscribe( + destination: '/queue/call/$userId', + callback: (frame) { + try { + final data = jsonDecode(frame.body ?? '{}') as Map; + _onCall?.call(data); + } catch (e) { + debugPrint('[WS] Call parse error: $e'); + } + }, + ); + debugPrint('[WS] Subscribed to /queue/call/$userId'); + }); + } + /// Disconnect dan cleanup semua subscriptions. Future disconnect() async { _locationUnsub?.call(); _sosUnsub?.call(); _notifUnsub?.call(); + _callUnsub?.call(); _locationUnsub = null; _sosUnsub = null; _notifUnsub = null; + _callUnsub = null; _client?.deactivate(); _client = null; _connected = false; } - // Legacy compat — lama pakai onMessage raw + // Legacy compat — lama pakai onMessage raw void send(Object message) { debugPrint('[WS] send() not used in STOMP mode. Use subscribe callbacks.'); } diff --git a/walkguide-mobile/walkguide_app/lib/core/theme/app_colors.dart b/walkguide-mobile/walkguide_app/lib/core/theme/app_colors.dart index cd853ef..a32bebf 100644 --- a/walkguide-mobile/walkguide_app/lib/core/theme/app_colors.dart +++ b/walkguide-mobile/walkguide_app/lib/core/theme/app_colors.dart @@ -1,10 +1,15 @@ import 'package:flutter/material.dart'; class AppColors { - static const primary = Color(0xFF1A56DB); + static const primary = Color(0xFF2563EB); + static const primaryDark = Color(0xFF0F3EA8); + static const accent = Color(0xFF0891B2); + static const warning = Color(0xFFD97706); static const danger = Color(0xFFDC2626); - static const success = Color(0xFF16A34A); - static const surface = Color(0xFFF8FAFC); + static const success = Color(0xFF059669); + static const surface = Color(0xFFF7FAFC); + static const surfaceRaised = Color(0xFFFFFFFF); static const text = Color(0xFF0F172A); static const muted = Color(0xFF64748B); + static const border = Color(0xFFE2E8F0); } diff --git a/walkguide-mobile/walkguide_app/lib/features/auth/login_screen.dart b/walkguide-mobile/walkguide_app/lib/features/auth/login_screen.dart index b091280..12aa434 100644 --- a/walkguide-mobile/walkguide_app/lib/features/auth/login_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/auth/login_screen.dart @@ -8,10 +8,13 @@ import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../app/app_cubit.dart'; +import '../../app/router.dart'; import '../../app/injection_container.dart'; import '../../core/constants/app_constants.dart'; import '../../core/errors/friendly_error.dart'; import '../../core/network/api_client.dart'; +import '../../core/services/fcm_service.dart'; +import '../../core/services/incoming_call_polling_service.dart'; import '../../core/services/offline_queue_service.dart'; import '../../core/services/tts_service.dart'; import '../../core/services/websocket_service.dart'; @@ -225,7 +228,12 @@ class _AuthFrame extends StatelessWidget { width: 56, height: 56, decoration: BoxDecoration( - color: const Color(0xFF1D4ED8), + gradient: const LinearGradient( + colors: [ + Color(0xFF2563EB), + Color(0xFF0891B2) + ], + ), borderRadius: BorderRadius.circular(18), ), child: const Icon(Icons.navigation_rounded, @@ -244,7 +252,32 @@ class _AuthFrame extends StatelessWidget { ), ], ), - const SizedBox(height: 22), + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: const Color(0xFFEFF6FF), + borderRadius: BorderRadius.circular(999), + ), + child: const Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.shield_outlined, + size: 14, color: Color(0xFF1D4ED8)), + SizedBox(width: 6), + Text( + 'Secure Assistive Navigation', + style: TextStyle( + color: Color(0xFF1D4ED8), + fontSize: 11, + fontWeight: FontWeight.w800, + ), + ), + ], + ), + ), + const SizedBox(height: 18), Text( title, style: Theme.of(context) @@ -311,9 +344,16 @@ Future _saveAuthAndRoute( void _startPostLoginServices(String serverUrl) { Future.microtask(() async { - await sl() - .connect(serverUrl) - .timeout(const Duration(seconds: 2)); + sl().start(); + await sl().init().timeout(const Duration(seconds: 4)); + final ws = sl(); + await ws.connect(serverUrl).timeout(const Duration(seconds: 2)); + ws.subscribeCall((data) { + final type = data['type']?.toString(); + if (type == 'INCOMING_CALL') { + appRouter.go('/incoming-call', extra: data); + } + }); await sl() .syncPending(sl()) .timeout(const Duration(seconds: 3)); diff --git a/walkguide-mobile/walkguide_app/lib/features/auth/splash_screen.dart b/walkguide-mobile/walkguide_app/lib/features/auth/splash_screen.dart index 482395a..73dad1c 100644 --- a/walkguide-mobile/walkguide_app/lib/features/auth/splash_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/auth/splash_screen.dart @@ -5,6 +5,7 @@ import 'package:go_router/go_router.dart'; import '../../app/injection_container.dart'; import '../../core/errors/friendly_error.dart'; +import '../../core/services/incoming_call_polling_service.dart'; import '../../core/storage/secure_storage.dart'; // --------------------------------------------------------------------------- @@ -70,6 +71,7 @@ class _SplashScreenState extends State return; } + sl().start(); // Auto-login: arahkan ke home sesuai role. context.go(role == 'ROLE_GUARDIAN' ? '/guardian/dashboard' diff --git a/walkguide-mobile/walkguide_app/lib/features/call/call_screen.dart b/walkguide-mobile/walkguide_app/lib/features/call/call_screen.dart index 881f12d..c53e487 100644 --- a/walkguide-mobile/walkguide_app/lib/features/call/call_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/call/call_screen.dart @@ -1,11 +1,4 @@ -// ignore_for_file: use_build_context_synchronously, prefer_const_constructors -// lib/features/call/call_screen.dart -// -// CallScreen — user memanggil Guardian via Agora -// IncomingCallScreen — Guardian/User menerima panggilan masuk -// -// Keduanya pakai CallService yang sudah ada (agora_rtc_engine). - +// ignore_for_file: use_build_context_synchronously import 'dart:async'; import 'package:flutter/material.dart'; @@ -15,18 +8,23 @@ import '../../app/injection_container.dart'; import '../../core/services/call_service.dart'; import '../../core/services/haptic_service.dart'; import '../../core/services/tts_service.dart'; +import '../../core/storage/secure_storage.dart'; -// ─── Colours ───────────────────────────────────────────────────────────────── const _kBlue = Color(0xFF1A56DB); const _kGreen = Color(0xFF16A34A); const _kRed = Color(0xFFDC2626); const _kMuted = Color(0xFF64748B); -const _kBg = Color(0xFF0F172A); // dark bg untuk call screen - -// ─── CallScreen ─────────────────────────────────────────────────────────────── +const _kBg = Color(0xFF0F172A); class CallScreen extends StatefulWidget { - const CallScreen({super.key}); + final String targetLabel; + final String returnRoute; + + const CallScreen({ + super.key, + this.targetLabel = 'Guardian', + this.returnRoute = '/user/walkguide', + }); @override State createState() => _CallScreenState(); @@ -38,64 +36,153 @@ class _CallScreenState extends State bool _muted = false; bool _speakerOn = true; int _secondsElapsed = 0; + int? _otherId; + String? _activeChannel; Timer? _timer; + Timer? _ringTimeout; + Timer? _acceptedPoll; - // animasi pulse saat ringing - late AnimationController _pulseCtrl; - late Animation _pulseScale; + late final AnimationController _pulseCtrl = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1200), + )..repeat(reverse: true); + late final Animation _pulseScale = Tween(begin: 0.95, end: 1.08) + .animate(CurvedAnimation(parent: _pulseCtrl, curve: Curves.easeInOut)); @override void initState() { super.initState(); - _pulseCtrl = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 1200), - )..repeat(reverse: true); - _pulseScale = Tween(begin: 0.95, end: 1.08) - .animate(CurvedAnimation(parent: _pulseCtrl, curve: Curves.easeInOut)); - - sl().speak('Memanggil Guardian.'); - _startCall(); + sl().speak('Memanggil ${widget.targetLabel}.'); + unawaited(_startCall()); } Future _startCall() async { - final joined = await sl().callPairedUser(); + final callService = sl(); + callService.setRemoteUserJoinedCallback(_markRemoteConnected); + callService.setRemoteUserOfflineCallback(() { + unawaited(_finishRemoteEnded()); + }); - if (!mounted) return; + try { + final invite = await callService.startPairedCall(); + if (!mounted) return; + if (invite == null) { + _failCall('Panggilan gagal. Pastikan sudah pairing dan server aktif.'); + return; + } - if (joined) { - setState(() => _phase = _CallPhase.connected); - sl().speak('Terhubung dengan Guardian.'); - _pulseCtrl.stop(); - _startTimer(); - } else { - setState(() => _phase = _CallPhase.failed); - sl() - .speak('Panggilan gagal. Pastikan Agora sudah dikonfigurasi.'); + _otherId = _asInt(invite['receiverId']); + _activeChannel = invite['channelName']?.toString(); + setState(() => _phase = _CallPhase.calling); + sl().speak( + 'Panggilan dikirim ke ${widget.targetLabel}. Menunggu jawaban.', + ); + _startAcceptedPolling(); + _ringTimeout?.cancel(); + _ringTimeout = Timer(const Duration(seconds: 45), () { + if (!mounted || _phase == _CallPhase.connected) return; + _failCall('Panggilan tidak dijawab.'); + }); + } catch (_) { + if (!mounted) return; + _failCall('Panggilan gagal. Server tidak merespons.'); } } + void _startAcceptedPolling() { + _acceptedPoll?.cancel(); + _acceptedPoll = Timer.periodic(const Duration(seconds: 2), (_) async { + if (!mounted || _activeChannel == null) return; + try { + final state = await sl() + .getCallState(_activeChannel) + .timeout(const Duration(seconds: 3)); + final status = state?['status']?.toString(); + if (status == 'ENDED') { + await _finishRemoteEnded(); + return; + } + if (status == 'ACCEPTED') { + _markRemoteConnected(); + return; + } + + final accepted = await sl() + .getAcceptedCall() + .timeout(const Duration(seconds: 3)); + if (accepted?['type']?.toString() != 'CALL_ACCEPTED') return; + final channel = accepted?['channelName']?.toString(); + if (_activeChannel != null && + channel != null && + channel.isNotEmpty && + channel != _activeChannel) { + return; + } + _markRemoteConnected(); + } catch (_) { + // Keep ringing; a short network hiccup should not cancel the call UI. + } + }); + } + + void _markRemoteConnected() { + if (!mounted || _phase == _CallPhase.connected) return; + _acceptedPoll?.cancel(); + _ringTimeout?.cancel(); + setState(() => _phase = _CallPhase.connected); + sl().speak('Terhubung dengan ${widget.targetLabel}.'); + _pulseCtrl.stop(); + _startTimer(); + } + + void _failCall(String message) { + _acceptedPoll?.cancel(); + _ringTimeout?.cancel(); + sl().setRemoteUserJoinedCallback(null); + sl().setRemoteUserOfflineCallback(null); + setState(() => _phase = _CallPhase.failed); + _pulseCtrl.stop(); + sl().speak(message); + } + void _startTimer() { + _timer?.cancel(); _timer = Timer.periodic(const Duration(seconds: 1), (_) { if (mounted) setState(() => _secondsElapsed++); }); } + Future _finishRemoteEnded() async { + if (!mounted) return; + _timer?.cancel(); + _ringTimeout?.cancel(); + _acceptedPoll?.cancel(); + await sl().leave(); + sl().speak('Panggilan diakhiri oleh lawan bicara.'); + if (mounted) context.go(widget.returnRoute); + } + Future _endCall() async { _timer?.cancel(); - await sl().leave(); + _ringTimeout?.cancel(); + _acceptedPoll?.cancel(); + final callService = sl(); + callService.setRemoteUserJoinedCallback(null); + callService.setRemoteUserOfflineCallback(null); + await callService.endCall(_otherId, channelName: _activeChannel); + await callService.leave(); sl().speak('Panggilan diakhiri.'); - if (mounted) context.go('/user/walkguide'); + if (mounted) context.go(widget.returnRoute); } Future _toggleMute() async { setState(() => _muted = !_muted); - // Agora engine mute via CallService jika ada — di sini cukup state lokal - // sl().muteLocalAudio(_muted); + await sl().setMuted(_muted); } - void _toggleSpeaker() { + Future _toggleSpeaker() async { setState(() => _speakerOn = !_speakerOn); + await sl().setSpeakerEnabled(_speakerOn); } String get _timerLabel { @@ -107,183 +194,370 @@ class _CallScreenState extends State @override void dispose() { _timer?.cancel(); + _ringTimeout?.cancel(); + _acceptedPoll?.cancel(); + sl().setRemoteUserJoinedCallback(null); + sl().setRemoteUserOfflineCallback(null); _pulseCtrl.dispose(); super.dispose(); } @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: _kBg, - body: SafeArea( - child: Column( - children: [ - // ── top bar ────────────────────────────────────────────────── - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Row( - children: [ - IconButton( - onPressed: () => context.go('/user/walkguide'), - icon: const Icon(Icons.arrow_back_ios_new, - color: Colors.white54), - ), - const Expanded( - child: Text('Panggilan', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white70, - fontWeight: FontWeight.w600)), - ), - const SizedBox(width: 48), // balance - ], - ), + return _CallScaffold( + title: 'Panggilan', + child: Column( + children: [ + const Spacer(), + AnimatedBuilder( + animation: _pulseCtrl, + builder: (_, child) => Transform.scale( + scale: _phase == _CallPhase.calling ? _pulseScale.value : 1.0, + child: child, ), - - const Spacer(), - - // ── avatar + name ──────────────────────────────────────────── - AnimatedBuilder( - animation: _pulseCtrl, - builder: (_, child) => Transform.scale( - scale: _phase == _CallPhase.calling ? _pulseScale.value : 1.0, - child: child, - ), - child: Container( - width: 120, - height: 120, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _kBlue.withValues(alpha: 0.2), - border: Border.all(color: _kBlue, width: 3), - ), - child: const Icon(Icons.shield_outlined, - color: Colors.white, size: 56), - ), + child: _Avatar( + icon: Icons.shield_outlined, + color: _phase == _CallPhase.failed ? _kRed : _kBlue, ), - - const SizedBox(height: 20), - - const Text('Guardian', - style: TextStyle( - color: Colors.white, - fontSize: 26, - fontWeight: FontWeight.w800)), - - const SizedBox(height: 8), - - _PhaseLabel(phase: _phase, timerLabel: _timerLabel), - - const Spacer(), - - // ── controls ───────────────────────────────────────────────── - if (_phase == _CallPhase.connected) ...[ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _ControlButton( - icon: _muted ? Icons.mic_off : Icons.mic, - label: _muted ? 'Unmute' : 'Mute', - onTap: _toggleMute, - active: _muted, - ), - _ControlButton( - icon: _speakerOn ? Icons.volume_up : Icons.volume_off, - label: _speakerOn ? 'Speaker' : 'Earpiece', - onTap: _toggleSpeaker, - active: _speakerOn, - ), - ], - ), - const SizedBox(height: 28), - ], - - if (_phase == _CallPhase.failed) ...[ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 32), - child: Text( - 'Panggilan gagal.\nPastikan Agora App ID sudah diisi di app_constants.dart dan server backend aktif.', - textAlign: TextAlign.center, - style: const TextStyle(color: Colors.white54, height: 1.5), + ), + const SizedBox(height: 20), + Text( + widget.targetLabel, + style: const TextStyle( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w800, + ), + ), + const SizedBox(height: 8), + _PhaseLabel(phase: _phase, timerLabel: _timerLabel), + const Spacer(), + if (_phase == _CallPhase.connected) ...[ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _ControlButton( + icon: _muted ? Icons.mic_off : Icons.mic, + label: _muted ? 'Unmute' : 'Mute', + onTap: _toggleMute, + active: _muted, ), - ), - const SizedBox(height: 24), - ], - - // ── end call button ─────────────────────────────────────────── - _EndCallButton(onTap: _endCall), - - const SizedBox(height: 48), + _ControlButton( + icon: _speakerOn ? Icons.volume_up : Icons.volume_off, + label: _speakerOn ? 'Speaker' : 'Earpiece', + onTap: _toggleSpeaker, + active: _speakerOn, + ), + ], + ), + const SizedBox(height: 28), ], - ), + if (_phase == _CallPhase.failed) ...[ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 32), + child: Text( + 'Panggilan belum tersambung. Pastikan device lawan login, paired, dan backend aktif.', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white54, height: 1.5), + ), + ), + const SizedBox(height: 24), + ], + _EndCallButton(onTap: _endCall), + const SizedBox(height: 48), + ], ), ); } } -// ─── IncomingCallScreen ─────────────────────────────────────────────────────── - class IncomingCallScreen extends StatefulWidget { - /// callerName bisa diisi dari FCM payload via extra go_router params. - /// Default 'Guardian' jika tidak ada. final String callerName; - const IncomingCallScreen({super.key, this.callerName = 'Guardian'}); + final int? callerId; + final String? channelName; + final String? agoraToken; + + const IncomingCallScreen({ + super.key, + this.callerName = 'Guardian', + this.callerId, + this.channelName, + this.agoraToken, + }); @override State createState() => _IncomingCallScreenState(); } class _IncomingCallScreenState extends State { - static const _autoAnswerSeconds = 30; - int _countdown = _autoAnswerSeconds; - Timer? _autoTimer; + int _secondsElapsed = 0; + Timer? _callTimer; + Timer? _statePoll; bool _responding = false; + bool _connected = false; + bool _failed = false; + bool _muted = false; + bool _speakerOn = true; + String? _joinedChannel; @override void initState() { super.initState(); sl().callIncoming(); sl().speak('Panggilan masuk dari ${widget.callerName}.'); - - // auto-answer countdown - _autoTimer = Timer.periodic(const Duration(seconds: 1), (t) { - if (!mounted) { - t.cancel(); - return; - } - setState(() => _countdown--); - if (_countdown <= 0) { - t.cancel(); - _accept(); - } - }); } @override void dispose() { - _autoTimer?.cancel(); + _callTimer?.cancel(); + _statePoll?.cancel(); super.dispose(); } Future _accept() async { if (_responding) return; setState(() => _responding = true); - _autoTimer?.cancel(); sl().speak('Menerima panggilan.'); - // Gabung ke channel yang sama (nama channel dari FCM payload — sementara hardcode) - await sl().joinChannel(channelName: 'walkguide-call'); - if (mounted) context.go('/user/call'); + + final joined = await _joinIncomingChannel(); + if (!mounted) return; + if (!joined || _joinedChannel == null || widget.callerId == null) { + setState(() { + _failed = true; + _responding = false; + }); + sl().speak('Panggilan gagal tersambung.'); + return; + } + + await sl().acceptIncomingCall( + callerId: widget.callerId!, + channelName: _joinedChannel!, + ); + + setState(() { + _connected = true; + _responding = false; + }); + _callTimer = Timer.periodic(const Duration(seconds: 1), (_) { + if (mounted) setState(() => _secondsElapsed++); + }); + _startIncomingStatePolling(); + sl().speak('Panggilan tersambung.'); + } + + void _startIncomingStatePolling() { + _statePoll?.cancel(); + _statePoll = Timer.periodic(const Duration(seconds: 2), (_) async { + if (!mounted || _joinedChannel == null) return; + try { + final state = await sl() + .getCallState(_joinedChannel) + .timeout(const Duration(seconds: 3)); + if (state?['status']?.toString() == 'ENDED') { + await _finishIncomingRemoteEnded(); + } + } catch (_) {} + }); + } + + Future _finishIncomingRemoteEnded() async { + if (!mounted) return; + _callTimer?.cancel(); + _statePoll?.cancel(); + await sl().leave(); + sl().speak('Panggilan diakhiri oleh lawan bicara.'); + if (mounted) context.go(await _homeRoute()); } Future _decline() async { if (_responding) return; setState(() => _responding = true); - _autoTimer?.cancel(); sl().speak('Panggilan ditolak.'); + sl().setRemoteUserOfflineCallback(null); + await sl() + .endCall(widget.callerId, channelName: widget.channelName); + await sl().clearPendingCall(); await sl().leave(); - if (mounted) context.go('/user/walkguide'); + if (mounted) context.go(await _homeRoute()); } + Future _joinIncomingChannel() async { + sl().setRemoteUserOfflineCallback(() { + unawaited(_finishIncomingRemoteEnded()); + }); + if (widget.callerId != null) { + final tokenData = + await sl().requestToken(receiverId: widget.callerId!); + final channelName = tokenData?['channelName']?.toString(); + final token = tokenData?['token']?.toString(); + final uid = (tokenData?['uid'] as num?)?.toInt() ?? 0; + if (channelName != null && channelName.isNotEmpty) { + _joinedChannel = channelName; + return sl().joinChannel( + channelName: channelName, + token: token, + uid: uid, + ); + } + } + + final fallbackChannel = widget.channelName; + if (fallbackChannel == null || fallbackChannel.isEmpty) return false; + _joinedChannel = fallbackChannel; + return sl().joinChannel( + channelName: fallbackChannel, + token: widget.agoraToken, + ); + } + + Future _endConnectedCall() async { + _callTimer?.cancel(); + _statePoll?.cancel(); + sl().setRemoteUserOfflineCallback(null); + await sl() + .endCall(widget.callerId, channelName: _joinedChannel); + await sl().leave(); + sl().speak('Panggilan diakhiri.'); + if (mounted) context.go(await _homeRoute()); + } + + Future _toggleMute() async { + setState(() => _muted = !_muted); + await sl().setMuted(_muted); + } + + Future _toggleSpeaker() async { + setState(() => _speakerOn = !_speakerOn); + await sl().setSpeakerEnabled(_speakerOn); + } + + Future _homeRoute() async { + final role = await sl().getUserRole(); + return role == 'ROLE_GUARDIAN' ? '/guardian/dashboard' : '/user/walkguide'; + } + + String get _timerLabel { + final m = (_secondsElapsed ~/ 60).toString().padLeft(2, '0'); + final s = (_secondsElapsed % 60).toString().padLeft(2, '0'); + return '$m:$s'; + } + + @override + Widget build(BuildContext context) { + if (_connected) { + return _CallScaffold( + title: 'Terhubung', + child: Column( + children: [ + const Spacer(), + const _Avatar(icon: Icons.call, color: _kGreen), + const SizedBox(height: 18), + Text( + widget.callerName, + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.w800, + ), + ), + const SizedBox(height: 8), + Text( + _timerLabel, + style: const TextStyle( + color: _kGreen, + fontSize: 22, + fontWeight: FontWeight.w700, + ), + ), + const Spacer(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _ControlButton( + icon: _muted ? Icons.mic_off : Icons.mic, + label: _muted ? 'Unmute' : 'Mute', + onTap: _toggleMute, + active: _muted, + ), + _ControlButton( + icon: _speakerOn ? Icons.volume_up : Icons.volume_off, + label: _speakerOn ? 'Speaker' : 'Earpiece', + onTap: _toggleSpeaker, + active: _speakerOn, + ), + ], + ), + const SizedBox(height: 28), + _EndCallButton(onTap: _endConnectedCall), + const SizedBox(height: 56), + ], + ), + ); + } + + return _CallScaffold( + title: 'Panggilan Masuk', + child: Column( + children: [ + const Spacer(), + const Icon(Icons.call_received, color: _kGreen, size: 48), + const SizedBox(height: 16), + const Text( + 'Panggilan Masuk', + style: TextStyle(color: Colors.white54, fontSize: 14), + ), + const SizedBox(height: 8), + Text( + widget.callerName, + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.w800, + ), + ), + const SizedBox(height: 12), + Text( + _failed + ? 'Tidak bisa tersambung. Coba panggil ulang.' + : 'Tekan Terima untuk menyambungkan panggilan.', + style: TextStyle(color: _failed ? _kRed : Colors.white38), + textAlign: TextAlign.center, + ), + const Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 48), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _RoundCallButton( + icon: Icons.call_end, + color: _kRed, + label: 'Tolak', + onTap: _responding ? null : _decline, + ), + _RoundCallButton( + icon: Icons.call, + color: _kGreen, + label: 'Terima', + onTap: _responding ? null : _accept, + ), + ], + ), + ), + const SizedBox(height: 56), + ], + ), + ); + } +} + +class _CallScaffold extends StatelessWidget { + final String title; + final Widget child; + + const _CallScaffold({required this.title, required this.child}); + @override Widget build(BuildContext context) { return Scaffold( @@ -291,55 +565,26 @@ class _IncomingCallScreenState extends State { body: SafeArea( child: Column( children: [ - const Spacer(), - - // ── caller info ─────────────────────────────────────────────── - const Icon(Icons.call_received, color: _kGreen, size: 48), - const SizedBox(height: 16), - const Text('Panggilan Masuk', - style: TextStyle(color: Colors.white54, fontSize: 14)), - const SizedBox(height: 8), - Text(widget.callerName, - style: const TextStyle( - color: Colors.white, - fontSize: 28, - fontWeight: FontWeight.w800)), - - const SizedBox(height: 12), - - // auto-answer countdown - Text( - 'Auto-answer dalam $_countdown detik', - style: const TextStyle(color: Colors.white38, fontSize: 13), - ), - - const Spacer(), - - // ── accept / decline ────────────────────────────────────────── Padding( - padding: const EdgeInsets.symmetric(horizontal: 48), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - // Decline - _RoundCallButton( - icon: Icons.call_end, - color: _kRed, - label: 'Tolak', - onTap: _responding ? null : _decline, - ), - // Accept - _RoundCallButton( - icon: Icons.call, - color: _kGreen, - label: 'Terima', - onTap: _responding ? null : _accept, + const SizedBox(width: 48), + Expanded( + child: Text( + title, + textAlign: TextAlign.center, + style: const TextStyle( + color: Colors.white70, + fontWeight: FontWeight.w600, + ), + ), ), + const SizedBox(width: 48), ], ), ), - - const SizedBox(height: 56), + Expanded(child: child), ], ), ), @@ -347,42 +592,73 @@ class _IncomingCallScreenState extends State { } } -// ─── Sub-widgets ────────────────────────────────────────────────────────────── - enum _CallPhase { calling, connected, failed } class _PhaseLabel extends StatelessWidget { final _CallPhase phase; final String timerLabel; + const _PhaseLabel({required this.phase, required this.timerLabel}); @override Widget build(BuildContext context) { switch (phase) { case _CallPhase.calling: - return const Text('Memanggil…', - style: TextStyle(color: _kMuted, fontSize: 16)); + return const Text( + 'Memanggil...', + style: TextStyle(color: _kMuted, fontSize: 16), + ); case _CallPhase.connected: - return Text(timerLabel, - style: const TextStyle( - color: _kGreen, fontSize: 22, fontWeight: FontWeight.w700)); + return Text( + timerLabel, + style: const TextStyle( + color: _kGreen, + fontSize: 22, + fontWeight: FontWeight.w700, + ), + ); case _CallPhase.failed: - return const Text('Panggilan gagal', - style: TextStyle(color: _kRed, fontSize: 16)); + return const Text( + 'Panggilan gagal', + style: TextStyle(color: _kRed, fontSize: 16), + ); } } } +class _Avatar extends StatelessWidget { + final IconData icon; + final Color color; + + const _Avatar({required this.icon, required this.color}); + + @override + Widget build(BuildContext context) { + return Container( + width: 124, + height: 124, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color.withValues(alpha: 0.2), + border: Border.all(color: color, width: 3), + ), + child: Icon(icon, color: Colors.white, size: 56), + ); + } +} + class _ControlButton extends StatelessWidget { final IconData icon; final String label; final VoidCallback onTap; final bool active; - const _ControlButton( - {required this.icon, - required this.label, - required this.onTap, - this.active = false}); + + const _ControlButton({ + required this.icon, + required this.label, + required this.onTap, + this.active = false, + }); @override Widget build(BuildContext context) { @@ -402,8 +678,7 @@ class _ControlButton extends StatelessWidget { child: Icon(icon, color: Colors.white, size: 28), ), const SizedBox(height: 6), - Text(label, - style: const TextStyle(color: Colors.white54, fontSize: 12)), + Text(label, style: const TextStyle(color: Colors.white54)), ], ), ); @@ -412,6 +687,7 @@ class _ControlButton extends StatelessWidget { class _EndCallButton extends StatelessWidget { final VoidCallback onTap; + const _EndCallButton({required this.onTap}); @override @@ -421,17 +697,14 @@ class _EndCallButton extends StatelessWidget { child: Column( children: [ Container( - width: 72, - height: 72, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: _kRed, - ), + width: 74, + height: 74, + decoration: + const BoxDecoration(shape: BoxShape.circle, color: _kRed), child: const Icon(Icons.call_end, color: Colors.white, size: 32), ), const SizedBox(height: 6), - const Text('Akhiri', - style: TextStyle(color: Colors.white54, fontSize: 12)), + const Text('Akhiri', style: TextStyle(color: Colors.white54)), ], ), ); @@ -443,32 +716,38 @@ class _RoundCallButton extends StatelessWidget { final Color color; final String label; final VoidCallback? onTap; - const _RoundCallButton( - {required this.icon, - required this.color, - required this.label, - this.onTap}); + + const _RoundCallButton({ + required this.icon, + required this.color, + required this.label, + this.onTap, + }); @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, child: Opacity( - opacity: onTap == null ? 0.4 : 1.0, + opacity: onTap == null ? 0.4 : 1, child: Column( children: [ Container( - width: 72, - height: 72, + width: 74, + height: 74, decoration: BoxDecoration(shape: BoxShape.circle, color: color), child: Icon(icon, color: Colors.white, size: 32), ), const SizedBox(height: 8), - Text(label, - style: const TextStyle(color: Colors.white70, fontSize: 13)), + Text(label, style: const TextStyle(color: Colors.white70)), ], ), ), ); } } + +int? _asInt(dynamic value) { + if (value is num) return value.toInt(); + return int.tryParse(value?.toString() ?? ''); +} diff --git a/walkguide-mobile/walkguide_app/lib/features/home/presentation/guardian_dashboard_screen.dart b/walkguide-mobile/walkguide_app/lib/features/home/presentation/guardian_dashboard_screen.dart index 93780be..6306255 100644 --- a/walkguide-mobile/walkguide_app/lib/features/home/presentation/guardian_dashboard_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/home/presentation/guardian_dashboard_screen.dart @@ -12,14 +12,15 @@ import 'package:latlong2/latlong.dart'; import '../../../app/injection_container.dart'; import '../../../core/network/api_client.dart'; import '../../../core/services/websocket_service.dart'; +import '../../../core/services/incoming_call_polling_service.dart'; import '../../../core/storage/secure_storage.dart'; import '../../../core/utils/operation_guard.dart'; -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── // GUARDIAN DASHBOARD SCREEN -// Fully live — fetches real data from backend, subscribes to WebSocket +// Fully live — fetches real data from backend, subscribes to WebSocket // for real-time GPS updates and SOS alerts. -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── class GuardianDashboardScreen extends StatefulWidget { const GuardianDashboardScreen({super.key}); @@ -31,18 +32,18 @@ class GuardianDashboardScreen extends StatefulWidget { class _GuardianDashboardScreenState extends State with TickerProviderStateMixin { - // ── Data state ────────────────────────────────────────────────────────────── + // ── Data state ────────────────────────────────────────────────────────────── _DashboardData? _data; bool _loading = true; String? _error; String _guardianName = 'Guardian'; - // ── Live location (WebSocket) ──────────────────────────────────────────────── + // ── Live location (WebSocket) ──────────────────────────────────────────────── LatLng? _liveLatLng; bool _liveConnected = false; final MapController _mapController = MapController(); - // ── Pulse animation for live dot ──────────────────────────────────────────── + // ── Pulse animation for live dot ──────────────────────────────────────────── late final AnimationController _pulseCtrl = AnimationController( vsync: this, duration: const Duration(milliseconds: 1800), @@ -52,15 +53,16 @@ class _GuardianDashboardScreenState extends State CurvedAnimation(parent: _pulseCtrl, curve: Curves.easeInOut), ); - // ── SOS flash animation ────────────────────────────────────────────────────── + // ── SOS flash animation ────────────────────────────────────────────────────── late final AnimationController _sosCtrl = AnimationController( vsync: this, duration: const Duration(milliseconds: 600), ); bool _sosAlert = false; + bool _handlingSos = false; List> _pendingSos = const []; - // ── Refresh button animation ───────────────────────────────────────────────── + // ── Refresh button animation ───────────────────────────────────────────────── late final AnimationController _refreshCtrl = AnimationController( vsync: this, duration: const Duration(milliseconds: 700), @@ -70,6 +72,7 @@ class _GuardianDashboardScreenState extends State void initState() { super.initState(); _loadAll(); + sl().start(); _subscribeWebSocket(); } @@ -83,7 +86,7 @@ class _GuardianDashboardScreenState extends State Dio get _api => sl().dio; - // ── Load all dashboard data in parallel ──────────────────────────────────── + // ── Load all dashboard data in parallel ──────────────────────────────────── Future _loadAll({bool silent = false}) async { if (!silent) { setState(() { @@ -93,83 +96,76 @@ class _GuardianDashboardScreenState extends State } await guarded( () async { - _guardianName = - await sl().getDisplayName() ?? 'Guardian'; + _guardianName = + await sl().getDisplayName() ?? 'Guardian'; - // Run dashboard + activity + SOS in parallel - final results = await Future.wait([ - _fetchDashboard(), - _fetchActivity(), - _fetchSosPending(), - ]); + // Run dashboard + activity + SOS in parallel + final results = await Future.wait([ + _fetchDashboard(), + _fetchActivity(), + _fetchSosPending(), + ]); - final dashboard = results[0] as Map?; - final activityList = - results[1] as List>; - final sosPendingEvents = results[2] as List>; - final sosPending = sosPendingEvents.length; + final dashboard = results[0] as Map?; + final activityList = results[1] as List>; + final sosPendingEvents = results[2] as List>; + final sosPending = sosPendingEvents.length; - // Extract latest GPS from dashboard - final lastLoc = dashboard?['lastLocation'] as Map?; - LatLng? newLatLng; - if (lastLoc != null && - lastLoc['lat'] != null && - lastLoc['lng'] != null) { - newLatLng = LatLng( - (lastLoc['lat'] as num).toDouble(), - (lastLoc['lng'] as num).toDouble(), - ); - } - - // Extract user info - final userStatus = - dashboard?['userStatus'] as Map?; - - setState(() { - _data = _DashboardData( - userName: userStatus?['displayName']?.toString() ?? - dashboard?['userName']?.toString() ?? - 'User', - userOnline: - userStatus?['online'] as bool? ?? false, - userLastSeen: - userStatus?['lastSeenAt']?.toString(), - battery: userStatus?['battery'] as int?, - speed: userStatus?['lastSpeed'] as double?, - obstaclesTotal: - userStatus?['obstaclesToday'] as int? ?? - dashboard?['obstaclesToday'] as int? ?? - 0, - unreadNotif: - dashboard?['unreadNotifCount'] as int? ?? 0, - unreadSos: sosPending, - lastLat: lastLoc?['lat'] != null - ? (lastLoc!['lat'] as num).toDouble() - : null, - lastLng: lastLoc?['lng'] != null - ? (lastLoc!['lng'] as num).toDouble() - : null, - lastLocationTime: - lastLoc?['createdAt']?.toString(), - recentActivity: activityList, - isPaired: userStatus != null || dashboard != null, - ); - _pendingSos = sosPendingEvents; - if (newLatLng != null) { - _liveLatLng = newLatLng; + // Extract latest GPS from dashboard + final lastLoc = dashboard?['lastLocation'] as Map?; + LatLng? newLatLng; + if (lastLoc != null && + lastLoc['lat'] != null && + lastLoc['lng'] != null) { + newLatLng = LatLng( + (lastLoc['lat'] as num).toDouble(), + (lastLoc['lng'] as num).toDouble(), + ); } - _loading = false; - }); - // If SOS pending, start flash - if (sosPending > 0 && !_sosAlert) { - _triggerSosFlash(); - } + // Extract user info + final userStatus = dashboard?['userStatus'] as Map?; - // Move map to latest location - if (newLatLng != null) { - _moveMapSafely(newLatLng); - } + setState(() { + _data = _DashboardData( + userName: userStatus?['displayName']?.toString() ?? + dashboard?['userName']?.toString() ?? + 'User', + userOnline: userStatus?['online'] as bool? ?? false, + userLastSeen: userStatus?['lastSeenAt']?.toString(), + battery: userStatus?['battery'] as int?, + speed: userStatus?['lastSpeed'] as double?, + obstaclesTotal: userStatus?['obstaclesToday'] as int? ?? + dashboard?['obstaclesToday'] as int? ?? + 0, + unreadNotif: dashboard?['unreadNotifCount'] as int? ?? 0, + unreadSos: sosPending, + lastLat: lastLoc?['lat'] != null + ? (lastLoc!['lat'] as num).toDouble() + : null, + lastLng: lastLoc?['lng'] != null + ? (lastLoc!['lng'] as num).toDouble() + : null, + lastLocationTime: lastLoc?['createdAt']?.toString(), + recentActivity: activityList, + isPaired: userStatus != null || dashboard != null, + ); + _pendingSos = sosPendingEvents; + if (newLatLng != null) { + _liveLatLng = newLatLng; + } + _loading = false; + }); + + // If SOS pending, start flash + if (sosPending > 0 && !_sosAlert) { + _triggerSosFlash(); + } + + // Move map to latest location + if (newLatLng != null) { + _moveMapSafely(newLatLng); + } }, onError: (e) => setState(() { _loading = false; @@ -181,91 +177,90 @@ class _GuardianDashboardScreenState extends State Future?> _fetchDashboard() async { return await guarded?>( () async { - final res = await _api - .get('/guardian/dashboard') - .timeout(const Duration(seconds: 8)); - final d = res.data['data']; - return d is Map ? Map.from(d) : null; + final res = await _api + .get('/guardian/dashboard') + .timeout(const Duration(seconds: 8)); + final d = res.data['data']; + return d is Map ? Map.from(d) : null; }, ); } Future>> _fetchActivity() async { return await guarded>>( - () async { - final res = await _api - .get('/guardian/activity-logs', - queryParameters: {'size': 5, 'page': 0}) - .timeout(const Duration(seconds: 8)); - final data = res.data['data']; - final content = - data is Map ? data['content'] : null; - if (content is List) { - return content - .whereType() - .map((e) => Map.from(e)) - .toList(); - } - return const []; - }, - ) ?? + () async { + final res = await _api.get('/guardian/activity-logs', + queryParameters: { + 'size': 5, + 'page': 0 + }).timeout(const Duration(seconds: 8)); + final data = res.data['data']; + final content = data is Map ? data['content'] : null; + if (content is List) { + return content + .whereType() + .map((e) => Map.from(e)) + .toList(); + } + return const []; + }, + ) ?? const []; } Future>> _fetchSosPending() async { return await guarded>>( - () async { - final res = await _api - .get('/guardian/sos-events', - queryParameters: {'size': 10, 'page': 0}) - .timeout(const Duration(seconds: 8)); - final data = res.data['data']; - final content = - data is Map ? data['content'] : null; - if (content is List) { - return content - .whereType() - .where((e) => e['status'] == 'TRIGGERED') - .map((e) => Map.from(e)) - .toList(); - } - return const []; - }, - ) ?? + () async { + final res = await _api.get('/guardian/sos-events', + queryParameters: { + 'size': 10, + 'page': 0 + }).timeout(const Duration(seconds: 8)); + final data = res.data['data']; + final content = data is Map ? data['content'] : null; + if (content is List) { + return content + .whereType() + .where((e) => e['status'] == 'TRIGGERED') + .map((e) => Map.from(e)) + .toList(); + } + return const []; + }, + ) ?? const []; } - // ── WebSocket subscription ────────────────────────────────────────────────── + // ── WebSocket subscription ────────────────────────────────────────────────── void _subscribeWebSocket() { final ws = sl(); Future.microtask(() async { await guarded( () async { - final userId = await _getLinkedUserId(); - if (userId == null) return; - ws.subscribeLocation(userId, (lat, lng) { - if (!mounted) return; - final newPos = LatLng(lat, lng); - setState(() { - _liveLatLng = newPos; - _liveConnected = true; + final userId = await _getLinkedUserId(); + if (userId == null) return; + ws.subscribeLocation(userId, (lat, lng) { + if (!mounted) return; + final newPos = LatLng(lat, lng); + setState(() { + _liveLatLng = newPos; + _liveConnected = true; + }); + _moveMapSafely(newPos); }); - _moveMapSafely(newPos); - }); - ws.subscribeSos((sosData) { - if (!mounted) return; - _triggerSosFlash(); - setState(() { - _pendingSos = [ - Map.from(sosData), - ..._pendingSos, - ]; - _data = _data?.copyWith( - unreadSos: (_data?.unreadSos ?? 0) + 1); + ws.subscribeSos((sosData) { + if (!mounted) return; + _triggerSosFlash(); + setState(() { + _pendingSos = [ + Map.from(sosData), + ..._pendingSos, + ]; + _data = _data?.copyWith(unreadSos: (_data?.unreadSos ?? 0) + 1); + }); + _showSosSnackbar(sosData); }); - _showSosSnackbar(sosData); - }); - if (mounted) setState(() => _liveConnected = true); + if (mounted) setState(() => _liveConnected = true); }, ); }); @@ -274,15 +269,14 @@ class _GuardianDashboardScreenState extends State Future _getLinkedUserId() async { return await guarded( () async { - final res = await _api - .get('/shared/pairing/status') - .timeout(const Duration(seconds: 5)); - final d = res.data['data']; - if (d is Map && d['status'] == 'ACTIVE') { - return d['pairedWithId']?.toString() ?? - d['userId']?.toString(); - } - return null; + final res = await _api + .get('/shared/pairing/status') + .timeout(const Duration(seconds: 5)); + final d = res.data['data']; + if (d is Map && d['status'] == 'ACTIVE') { + return d['pairedWithId']?.toString() ?? d['userId']?.toString(); + } + return null; }, ); } @@ -301,33 +295,16 @@ class _GuardianDashboardScreenState extends State } void _showSosSnackbar(Map data) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - backgroundColor: const Color(0xFFDC2626), - duration: const Duration(seconds: 8), - content: Row(children: [ - const Icon(Icons.warning_rounded, - color: Colors.white), - const SizedBox(width: 10), - Expanded( - child: Text( - '🚨 SOS dari User! Koordinat: ${data['lat']?.toStringAsFixed(4) ?? '-'}, ${data['lng']?.toStringAsFixed(4) ?? '-'}', - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.w700), - ), - ), - ]), - action: SnackBarAction( - label: 'Tangani', - textColor: Colors.white, - onPressed: _handleLatestSos, - ), - ), - ); + // Keep SOS inside the dashboard card. SnackBar overlays were blocking taps + // on some Android builds until orientation changed. + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + if (!_sosAlert) { + _triggerSosFlash(); + } } Future _handleLatestSos() async { + if (_handlingSos) return; final sosId = _pendingSos .map((e) => e['id']) .where((id) => id != null) @@ -337,32 +314,36 @@ class _GuardianDashboardScreenState extends State await _loadAll(silent: true); return; } + setState(() => _handlingSos = true); await guarded( () async { - await _api - .put('/guardian/sos/$sosId/resolve') - .timeout(const Duration(seconds: 8)); - if (!mounted) return; - setState(() { - _pendingSos = - _pendingSos.where((e) => e['id']?.toString() != '$sosId').toList(); - _data = _data?.copyWith(unreadSos: _pendingSos.length); - if (_pendingSos.isEmpty) { - _sosAlert = false; - _sosCtrl.stop(); - } - }); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('SOS ditandai sudah ditangani.')), - ); + await _api + .put('/guardian/sos/$sosId/acknowledge') + .timeout(const Duration(seconds: 8)); + if (!mounted) return; + setState(() { + _pendingSos = _pendingSos + .where((e) => e['id']?.toString() != '$sosId') + .toList(); + _data = _data?.copyWith(unreadSos: _pendingSos.length); + if (_pendingSos.isEmpty) { + _sosAlert = false; + _sosCtrl.stop(); + } + }); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('SOS diterima. Status berubah menjadi ditangani.')), + ); }, onError: (_) { if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Gagal menandai SOS. Coba refresh.')), - ); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Gagal menandai SOS. Coba refresh.')), + ); }, ); + if (mounted) setState(() => _handlingSos = false); } void _moveMapSafely(LatLng position) { @@ -387,9 +368,9 @@ class _GuardianDashboardScreenState extends State return 'Gagal memuat dashboard. Coba refresh.'; } - // ───────────────────────────────────────────────────────────────────────── + // ───────────────────────────────────────────────────────────────────────── // BUILD - // ───────────────────────────────────────────────────────────────────────── + // ───────────────────────────────────────────────────────────────────────── @override Widget build(BuildContext context) { return Scaffold( @@ -398,7 +379,6 @@ class _GuardianDashboardScreenState extends State child: Column( children: [ _buildTopBar(), - if (_sosAlert) _buildSosBanner(), Expanded( child: _loading ? _buildSkeleton() @@ -408,15 +388,17 @@ class _GuardianDashboardScreenState extends State onRefresh: _refresh, color: const Color(0xFF1A56DB), child: SingleChildScrollView( - physics: - const AlwaysScrollableScrollPhysics(), + physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.all(16), child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildGreetingRow(), const SizedBox(height: 14), + if (_sosAlert || _pendingSos.isNotEmpty) ...[ + _buildSosBanner(), + const SizedBox(height: 14), + ], _buildKpiStrip(), const SizedBox(height: 14), _buildMainRow(), @@ -436,16 +418,14 @@ class _GuardianDashboardScreenState extends State ); } - // ── Top bar ───────────────────────────────────────────────────────────────── + // ── Top bar ───────────────────────────────────────────────────────────────── Widget _buildTopBar() { return Container( height: 56, padding: const EdgeInsets.symmetric(horizontal: 16), decoration: const BoxDecoration( color: Colors.white, - border: Border( - bottom: - BorderSide(color: Color(0xFFE2E8F0), width: 1)), + border: Border(bottom: BorderSide(color: Color(0xFFE2E8F0), width: 1)), ), child: Row(children: [ // Logo @@ -471,8 +451,7 @@ class _GuardianDashboardScreenState extends State color: const Color(0xFF0F172A))), const SizedBox(width: 4), Container( - padding: - const EdgeInsets.symmetric(horizontal: 7, vertical: 2), + padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 2), decoration: BoxDecoration( color: const Color(0xFFEFF6FF), borderRadius: BorderRadius.circular(20), @@ -494,8 +473,7 @@ class _GuardianDashboardScreenState extends State decoration: BoxDecoration( shape: BoxShape.circle, color: _liveConnected - ? Color.fromRGBO( - 22, 163, 74, _pulseAnim.value) + ? Color.fromRGBO(22, 163, 74, _pulseAnim.value) : const Color(0xFF94A3B8), boxShadow: _liveConnected ? [ @@ -522,7 +500,24 @@ class _GuardianDashboardScreenState extends State ), ]), ), - const SizedBox(width: 12), + const SizedBox(width: 8), + SizedBox( + width: 40, + height: 40, + child: FilledButton( + onPressed: () => context.go('/guardian/call'), + style: FilledButton.styleFrom( + padding: EdgeInsets.zero, + backgroundColor: const Color(0xFF16A34A), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: const Icon(Icons.call_rounded, size: 20), + ), + ), + const SizedBox(width: 8), // Refresh RotationTransition( turns: _refreshCtrl, @@ -539,62 +534,131 @@ class _GuardianDashboardScreenState extends State radius: 16, backgroundColor: const Color(0xFF1A56DB), child: Text( - _guardianName.isNotEmpty - ? _guardianName[0].toUpperCase() - : 'G', + _guardianName.isNotEmpty ? _guardianName[0].toUpperCase() : 'G', style: GoogleFonts.outfit( - color: Colors.white, - fontSize: 13, - fontWeight: FontWeight.w700), + color: Colors.white, fontSize: 13, fontWeight: FontWeight.w700), ), ), ]), ); } - // ── SOS banner ────────────────────────────────────────────────────────────── + // ── SOS banner ────────────────────────────────────────────────────────────── Widget _buildSosBanner() { + final count = + _pendingSos.isNotEmpty ? _pendingSos.length : (_data?.unreadSos ?? 1); return AnimatedBuilder( animation: _sosCtrl, - builder: (_, __) => Container( - color: Color.lerp(const Color(0xFFDC2626), - const Color(0xFFFF6B6B), _sosCtrl.value), - padding: - const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Row(children: [ - const Icon(Icons.warning_rounded, - color: Colors.white, size: 18), - const SizedBox(width: 10), - Expanded( - child: Text( - '🚨 SOS AKTIF — User membutuhkan bantuan segera!', - style: GoogleFonts.inter( - color: Colors.white, - fontWeight: FontWeight.w700, - fontSize: 13), + builder: (_, __) { + final pulse = Color.lerp( + const Color(0xFFFFF1F2), + const Color(0xFFFFE4E6), + _sosCtrl.value, + ); + return Material( + color: Colors.transparent, + borderRadius: BorderRadius.circular(18), + child: InkWell( + onTap: _handlingSos ? null : _handleLatestSos, + borderRadius: BorderRadius.circular(18), + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: pulse, + borderRadius: BorderRadius.circular(18), + border: Border.all(color: const Color(0xFFFCA5A5), width: 1.2), + boxShadow: [ + BoxShadow( + color: const Color(0xFFDC2626).withValues(alpha: 0.12), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Container( + width: 42, + height: 42, + decoration: BoxDecoration( + color: const Color(0xFFDC2626), + borderRadius: BorderRadius.circular(14), + ), + child: const Icon(Icons.sos_rounded, + color: Colors.white, size: 22), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '$count SOS aktif', + style: GoogleFonts.inter( + color: const Color(0xFF991B1B), + fontSize: 16, + fontWeight: FontWeight.w900, + ), + ), + Text( + _handlingSos + ? 'Sedang menandai SOS sebagai ditangani...' + : 'Tap kartu ini atau tombol di bawah untuk menangani.', + style: GoogleFonts.inter( + color: const Color(0xFF7F1D1D), + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + IconButton( + onPressed: () { + setState(() => _sosAlert = false); + _sosCtrl.stop(); + }, + icon: const Icon(Icons.close_rounded, + color: Color(0xFF991B1B)), + ), + ], + ), + const SizedBox(height: 12), + FilledButton.icon( + onPressed: _handlingSos ? null : _handleLatestSos, + style: FilledButton.styleFrom( + backgroundColor: const Color(0xFFDC2626), + foregroundColor: Colors.white, + minimumSize: const Size.fromHeight(48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + ), + ), + icon: _handlingSos + ? const SizedBox( + width: 18, + height: 18, + child: CircularProgressIndicator( + strokeWidth: 2, + color: Colors.white, + ), + ) + : const Icon(Icons.check_circle_outline_rounded), + label: Text(_handlingSos ? 'Memproses...' : 'Handle SOS'), + ), + ], + ), ), ), - TextButton( - onPressed: _handleLatestSos, - style: TextButton.styleFrom( - foregroundColor: Colors.white), - child: const Text('Handle'), - ), - IconButton( - onPressed: () { - setState(() => _sosAlert = false); - _sosCtrl.stop(); - }, - icon: const Icon(Icons.close, - color: Colors.white, size: 16), - padding: EdgeInsets.zero, - ), - ]), - ), + ); + }, ); } - // ── Greeting row ──────────────────────────────────────────────────────────── Widget _buildGreetingRow() { final hour = DateTime.now().hour; final greeting = hour < 12 @@ -620,8 +684,7 @@ class _GuardianDashboardScreenState extends State ? 'Memantau ${_data?.userName ?? "User"} secara real-time' : 'Belum terhubung dengan User', style: GoogleFonts.inter( - fontSize: 12, - color: const Color(0xFF64748B)), + fontSize: 12, color: const Color(0xFF64748B)), ), ], ), @@ -632,86 +695,109 @@ class _GuardianDashboardScreenState extends State ); } - // ── KPI strip ─────────────────────────────────────────────────────────────── + // ── KPI strip ─────────────────────────────────────────────────────────────── Widget _buildKpiStrip() { if (_data == null) return const SizedBox.shrink(); final d = _data!; - return Row(children: [ - Expanded( - child: _KpiCard( + final cards = [ + _KpiCard( label: 'Status', - value: d.isPaired - ? (d.userOnline ? 'Online' : 'Offline') - : 'Belum Pair', + value: + d.isPaired ? (d.userOnline ? 'Online' : 'Offline') : 'Belum Pair', valueColor: d.isPaired && d.userOnline ? const Color(0xFF16A34A) : const Color(0xFF94A3B8), icon: Icons.person_outline, sub: d.isPaired - ? (d.userOnline ? 'Aktif berjalan' : _formatLastSeen(d.userLastSeen)) + ? (d.userOnline + ? 'Aktif berjalan' + : _formatLastSeen(d.userLastSeen)) : 'Buka menu Pairing', - )), - const SizedBox(width: 10), - Expanded( - child: _KpiCard( + ), + _KpiCard( label: 'Baterai', - value: - d.battery != null ? '${d.battery}%' : '—', + value: d.battery != null ? '${d.battery}%' : '-', valueColor: d.battery != null && d.battery! < 20 ? const Color(0xFFDC2626) : const Color(0xFF0F172A), icon: Icons.battery_std_outlined, sub: d.battery != null - ? (d.battery! > 50 - ? 'Baterai cukup' - : 'Baterai hampir habis') + ? (d.battery! > 50 ? 'Baterai cukup' : 'Baterai rendah') : 'Belum tersedia', - )), - const SizedBox(width: 10), - Expanded( - child: _KpiCard( - label: 'Obstacle Hari Ini', + ), + _KpiCard( + label: 'Obstacle', value: '${d.obstaclesTotal}', valueColor: d.obstaclesTotal > 10 ? const Color(0xFFD97706) : const Color(0xFF0F172A), icon: Icons.radar_outlined, - sub: d.obstaclesTotal > 0 - ? 'AI deteksi aktif' - : 'Belum ada deteksi', - )), - const SizedBox(width: 10), - Expanded( - child: _KpiCard( - label: 'SOS Pending', - value: '${d.unreadSos}', - valueColor: d.unreadSos > 0 - ? const Color(0xFFDC2626) - : const Color(0xFF16A34A), - icon: Icons.sos_outlined, - sub: d.unreadSos > 0 - ? 'Perlu perhatian!' - : 'Aman', - highlight: d.unreadSos > 0, - )), - ]); - } - - // ── Main row: map + user card ──────────────────────────────────────────────── - Widget _buildMainRow() { - return IntrinsicHeight( - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(flex: 3, child: _buildMapCard()), - const SizedBox(width: 12), - SizedBox(width: 180, child: _buildUserCard()), - ], + sub: d.obstaclesTotal > 0 ? 'AI deteksi aktif' : 'Belum ada deteksi', ), + _KpiCard( + label: 'SOS', + value: '${d.unreadSos}', + valueColor: + d.unreadSos > 0 ? const Color(0xFFDC2626) : const Color(0xFF16A34A), + icon: Icons.sos_outlined, + sub: d.unreadSos > 0 ? 'Perlu perhatian' : 'Aman', + highlight: d.unreadSos > 0, + ), + ]; + + return LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth < 430) { + return GridView.count( + crossAxisCount: 2, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisSpacing: 10, + mainAxisSpacing: 10, + childAspectRatio: 1.9, + children: cards, + ); + } + return Row( + children: [ + for (var i = 0; i < cards.length; i++) ...[ + Expanded(child: cards[i]), + if (i != cards.length - 1) const SizedBox(width: 10), + ], + ], + ); + }, ); } - // ── Map card ───────────────────────────────────────────────────────────────── + // Main row: map + user card ──────────────────────────────────────────────── + Widget _buildMainRow() { + return LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth < 430) { + return Column( + children: [ + _buildMapCard(), + const SizedBox(height: 12), + SizedBox(height: 250, child: _buildUserCard()), + ], + ); + } + return IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded(flex: 3, child: _buildMapCard()), + const SizedBox(width: 12), + SizedBox(width: 180, child: _buildUserCard()), + ], + ), + ); + }, + ); + } + + // Map card ───────────────────────────────────────────────────────────────── Widget _buildMapCard() { final pos = _liveLatLng ?? (_data?.lastLat != null && _data?.lastLng != null @@ -723,8 +809,7 @@ class _GuardianDashboardScreenState extends State decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), - border: - Border.all(color: const Color(0xFFE2E8F0), width: 1), + border: Border.all(color: const Color(0xFFE2E8F0), width: 1), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.04), @@ -739,12 +824,10 @@ class _GuardianDashboardScreenState extends State if (pos != null) FlutterMap( mapController: _mapController, - options: MapOptions( - initialCenter: pos, initialZoom: 15), + options: MapOptions(initialCenter: pos, initialZoom: 15), children: [ TileLayer( - urlTemplate: - 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'com.walkguide.app', ), MarkerLayer(markers: [ @@ -789,16 +872,14 @@ class _GuardianDashboardScreenState extends State mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.map_outlined, - size: 48, - color: const Color(0xFFCBD5E1)), + size: 48, color: const Color(0xFFCBD5E1)), const SizedBox(height: 8), Text( _data?.isPaired == true ? 'Belum ada lokasi terbaru' : 'Pairing dulu untuk melihat peta', style: GoogleFonts.inter( - fontSize: 12, - color: const Color(0xFF94A3B8)), + fontSize: 12, color: const Color(0xFF94A3B8)), ), ], ), @@ -812,8 +893,8 @@ class _GuardianDashboardScreenState extends State right: 10, child: Row(children: [ Container( - padding: const EdgeInsets.symmetric( - horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 5), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.92), borderRadius: BorderRadius.circular(20), @@ -852,11 +933,10 @@ class _GuardianDashboardScreenState extends State GestureDetector( onTap: () => context.go('/guardian/map'), child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 5), decoration: BoxDecoration( - color: - const Color(0xFF1A56DB).withValues(alpha: 0.9), + color: const Color(0xFF1A56DB).withValues(alpha: 0.9), borderRadius: BorderRadius.circular(20), ), child: Text('Buka Peta', @@ -875,8 +955,8 @@ class _GuardianDashboardScreenState extends State bottom: 10, left: 10, child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 10, vertical: 6), + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 6), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.92), borderRadius: BorderRadius.circular(8), @@ -900,7 +980,7 @@ class _GuardianDashboardScreenState extends State ); } - // ── User card ───────────────────────────────────────────────────────────────── + // ── User card ───────────────────────────────────────────────────────────────── Widget _buildUserCard() { if (_data?.isPaired != true) { return _buildNoPairingCard(); @@ -926,12 +1006,9 @@ class _GuardianDashboardScreenState extends State Row(children: [ CircleAvatar( radius: 20, - backgroundColor: - const Color(0xFF1A56DB).withValues(alpha: 0.1), + backgroundColor: const Color(0xFF1A56DB).withValues(alpha: 0.1), child: Text( - d.userName.isNotEmpty - ? d.userName[0].toUpperCase() - : 'U', + d.userName.isNotEmpty ? d.userName[0].toUpperCase() : 'U', style: GoogleFonts.outfit( fontSize: 16, color: const Color(0xFF1A56DB), @@ -962,8 +1039,7 @@ class _GuardianDashboardScreenState extends State ), ), const SizedBox(width: 4), - Text( - d.userOnline ? 'Online' : 'Offline', + Text(d.userOnline ? 'Online' : 'Offline', style: GoogleFonts.inter( fontSize: 10, color: d.userOnline @@ -982,7 +1058,7 @@ class _GuardianDashboardScreenState extends State _buildStatRow( Icons.battery_std_outlined, 'Baterai', - d.battery != null ? '${d.battery}%' : '—', + d.battery != null ? '${d.battery}%' : '—', d.battery != null && d.battery! < 20 ? const Color(0xFFDC2626) : const Color(0xFF16A34A)), @@ -992,7 +1068,7 @@ class _GuardianDashboardScreenState extends State 'Kecepatan', d.speed != null ? '${(d.speed! * 3.6).toStringAsFixed(1)} km/h' - : '—', + : '—', const Color(0xFF1A56DB)), const SizedBox(height: 8), _buildStatRow( @@ -1017,7 +1093,7 @@ class _GuardianDashboardScreenState extends State SizedBox( width: double.infinity, child: FilledButton.icon( - onPressed: () => context.go('/user/call'), + onPressed: () => context.go('/guardian/call'), icon: const Icon(Icons.call, size: 14), label: const Text('Hubungi User'), style: FilledButton.styleFrom( @@ -1045,9 +1121,7 @@ class _GuardianDashboardScreenState extends State ), Text(value, style: GoogleFonts.outfit( - fontSize: 12, - fontWeight: FontWeight.w700, - color: valueColor)), + fontSize: 12, fontWeight: FontWeight.w700, color: valueColor)), ]); } @@ -1062,8 +1136,7 @@ class _GuardianDashboardScreenState extends State child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.link_off, - color: Color(0xFFD97706), size: 40), + const Icon(Icons.link_off, color: Color(0xFFD97706), size: 40), const SizedBox(height: 12), Text('Belum Pairing', style: GoogleFonts.outfit( @@ -1073,8 +1146,8 @@ class _GuardianDashboardScreenState extends State const SizedBox(height: 6), Text( 'Masukkan Unique ID User untuk mulai memantau.', - style: GoogleFonts.inter( - fontSize: 11, color: const Color(0xFF92400E)), + style: + GoogleFonts.inter(fontSize: 11, color: const Color(0xFF92400E)), textAlign: TextAlign.center, ), const SizedBox(height: 14), @@ -1087,8 +1160,7 @@ class _GuardianDashboardScreenState extends State padding: const EdgeInsets.symmetric(vertical: 8)), child: Text('Pair Sekarang', style: GoogleFonts.inter( - fontSize: 12, - fontWeight: FontWeight.w600)), + fontSize: 12, fontWeight: FontWeight.w600)), ), ), ], @@ -1096,7 +1168,7 @@ class _GuardianDashboardScreenState extends State ); } - // ── Activity section ───────────────────────────────────────────────────────── + // ── Activity section ───────────────────────────────────────────────────────── Widget _buildActivitySection() { final items = _data?.recentActivity ?? const []; return Container( @@ -1115,8 +1187,7 @@ class _GuardianDashboardScreenState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.fromLTRB(16, 14, 12, 10), + padding: const EdgeInsets.fromLTRB(16, 14, 12, 10), child: Row(children: [ Text('Aktivitas Terkini', style: GoogleFonts.outfit( @@ -1127,12 +1198,11 @@ class _GuardianDashboardScreenState extends State TextButton.icon( onPressed: () => context.go('/guardian/logs'), icon: const Icon(Icons.open_in_new, size: 13), - label: Text('Semua', - style: GoogleFonts.inter(fontSize: 12)), + label: Text('Semua', style: GoogleFonts.inter(fontSize: 12)), style: TextButton.styleFrom( foregroundColor: const Color(0xFF1A56DB), - padding: const EdgeInsets.symmetric( - horizontal: 8, vertical: 4)), + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 4)), ), ]), ), @@ -1145,8 +1215,7 @@ class _GuardianDashboardScreenState extends State ? 'Belum ada aktivitas. Minta User start WalkGuide.' : 'Aktivitas akan muncul setelah pairing.', style: GoogleFonts.inter( - fontSize: 12, - color: const Color(0xFF94A3B8)), + fontSize: 12, color: const Color(0xFF94A3B8)), textAlign: TextAlign.center, ), ), @@ -1156,9 +1225,7 @@ class _GuardianDashboardScreenState extends State final i = entry.key; final item = entry.value; return Column(children: [ - if (i == 0) - const Divider( - height: 1, color: Color(0xFFF1F5F9)), + if (i == 0) const Divider(height: 1, color: Color(0xFFF1F5F9)), _ActivityTile(data: item), ]); }), @@ -1168,7 +1235,7 @@ class _GuardianDashboardScreenState extends State ); } - // ── Quick actions ───────────────────────────────────────────────────────────── + // ── Quick actions ───────────────────────────────────────────────────────────── Widget _buildQuickActions() { final actions = [ _ActionItem( @@ -1226,52 +1293,50 @@ class _GuardianDashboardScreenState extends State fontWeight: FontWeight.w700, color: const Color(0xFF0F172A))), ), - GridView.count( - crossAxisCount: 3, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - crossAxisSpacing: 10, - mainAxisSpacing: 10, - childAspectRatio: 1.4, - children: actions - .map((a) => _QuickActionCard(item: a)) - .toList(), - ), + LayoutBuilder(builder: (context, constraints) { + final isNarrow = constraints.maxWidth < 430; + return GridView.count( + crossAxisCount: isNarrow ? 2 : 3, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisSpacing: 10, + mainAxisSpacing: 10, + childAspectRatio: isNarrow ? 1.55 : 1.15, + children: actions.map((a) => _QuickActionCard(item: a)).toList(), + ); + }), ], ); } - // ── Loading skeleton ────────────────────────────────────────────────────────── + // ── Loading skeleton ────────────────────────────────────────────────────────── Widget _buildSkeleton() { return SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column(children: [ - _SkeletonBox(height: 32, width: double.infinity, - borderRadius: 8), + _SkeletonBox(height: 32, width: double.infinity, borderRadius: 8), const SizedBox(height: 14), - Row(children: List.generate( - 4, - (i) => Expanded( - child: Padding( - padding: EdgeInsets.only( - right: i < 3 ? 10 : 0), - child: _SkeletonBox( - height: 80, - width: double.infinity, - borderRadius: 12), - ), - ))), + Row( + children: List.generate( + 4, + (i) => Expanded( + child: Padding( + padding: EdgeInsets.only(right: i < 3 ? 10 : 0), + child: _SkeletonBox( + height: 80, + width: double.infinity, + borderRadius: 12), + ), + ))), const SizedBox(height: 14), - _SkeletonBox( - height: 220, width: double.infinity, borderRadius: 16), + _SkeletonBox(height: 220, width: double.infinity, borderRadius: 16), const SizedBox(height: 14), - _SkeletonBox( - height: 160, width: double.infinity, borderRadius: 16), + _SkeletonBox(height: 160, width: double.infinity, borderRadius: 16), ]), ); } - // ── Error state ─────────────────────────────────────────────────────────────── + // ── Error state ─────────────────────────────────────────────────────────────── Widget _buildError() { return Center( child: Padding( @@ -1307,9 +1372,9 @@ class _GuardianDashboardScreenState extends State } } -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── // DATA MODELS -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── class _DashboardData { final String userName; @@ -1376,9 +1441,9 @@ class _ActionItem { }); } -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── // SUB-WIDGETS -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── class _KpiCard extends StatelessWidget { final String label; @@ -1402,18 +1467,14 @@ class _KpiCard extends StatelessWidget { return Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: - highlight ? const Color(0xFFFFF1F2) : Colors.white, + color: highlight ? const Color(0xFFFFF1F2) : Colors.white, borderRadius: BorderRadius.circular(12), border: Border.all( - color: highlight - ? const Color(0xFFFECACA) - : const Color(0xFFE2E8F0), + color: + highlight ? const Color(0xFFFECACA) : const Color(0xFFE2E8F0), width: 1), boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.03), - blurRadius: 8), + BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 8), ], ), child: Column( @@ -1432,11 +1493,16 @@ class _KpiCard extends StatelessWidget { ), ]), const SizedBox(height: 6), - Text(value, - style: GoogleFonts.outfit( - fontSize: 20, - fontWeight: FontWeight.w700, - color: valueColor)), + FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: Text(value, + maxLines: 1, + style: GoogleFonts.outfit( + fontSize: 20, + fontWeight: FontWeight.w700, + color: valueColor)), + ), const SizedBox(height: 2), Text(sub, style: GoogleFonts.inter( @@ -1460,17 +1526,13 @@ class _ActivityTile extends StatelessWidget { final logType = data['logType']?.toString() ?? ''; final cfg = _activityConfig(logType); final created = - DateTime.tryParse(data['createdAt']?.toString() ?? '') - ?.toLocal(); - final timeStr = created == null - ? '' - : '${_two(created.hour)}:${_two(created.minute)}'; - final desc = - data['description']?.toString() ?? logType; + DateTime.tryParse(data['createdAt']?.toString() ?? '')?.toLocal(); + final timeStr = + created == null ? '' : '${_two(created.hour)}:${_two(created.minute)}'; + final desc = data['description']?.toString() ?? logType; return Padding( - padding: - const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), child: Row(children: [ Container( width: 32, @@ -1496,8 +1558,7 @@ class _ActivityTile extends StatelessWidget { Text( desc, style: GoogleFonts.inter( - fontSize: 11, - color: const Color(0xFF64748B)), + fontSize: 11, color: const Color(0xFF64748B)), maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -1529,8 +1590,7 @@ class _QuickActionCard extends StatelessWidget { padding: const EdgeInsets.all(10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), - border: - Border.all(color: const Color(0xFFE2E8F0)), + border: Border.all(color: const Color(0xFFE2E8F0)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1543,8 +1603,7 @@ class _QuickActionCard extends StatelessWidget { color: item.color.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(7), ), - child: Icon(item.icon, - size: 15, color: item.color), + child: Icon(item.icon, size: 15, color: item.color), ), const SizedBox(height: 6), Text(item.label, @@ -1556,8 +1615,7 @@ class _QuickActionCard extends StatelessWidget { overflow: TextOverflow.ellipsis), Text(item.sub, style: GoogleFonts.inter( - fontSize: 10, - color: const Color(0xFF94A3B8)), + fontSize: 10, color: const Color(0xFF94A3B8)), maxLines: 1, overflow: TextOverflow.ellipsis), ], @@ -1575,8 +1633,7 @@ class _SosBadge extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: - const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), decoration: BoxDecoration( color: const Color(0xFFDC2626), borderRadius: BorderRadius.circular(20), @@ -1588,8 +1645,7 @@ class _SosBadge extends StatelessWidget { ], ), child: Row(mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.warning_rounded, - color: Colors.white, size: 13), + const Icon(Icons.warning_rounded, color: Colors.white, size: 13), const SizedBox(width: 4), Text('$count SOS', style: GoogleFonts.inter( @@ -1606,9 +1662,7 @@ class _SkeletonBox extends StatefulWidget { final double width; final double borderRadius; const _SkeletonBox( - {required this.height, - required this.width, - required this.borderRadius}); + {required this.height, required this.width, required this.borderRadius}); @override State<_SkeletonBox> createState() => _SkeletonBoxState(); @@ -1635,19 +1689,18 @@ class _SkeletonBoxState extends State<_SkeletonBox> height: widget.height, width: widget.width, decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(widget.borderRadius), - color: Color.lerp(const Color(0xFFE2E8F0), - const Color(0xFFF8FAFC), _ctrl.value), + borderRadius: BorderRadius.circular(widget.borderRadius), + color: Color.lerp( + const Color(0xFFE2E8F0), const Color(0xFFF8FAFC), _ctrl.value), ), ), ); } } -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── // HELPERS -// ───────────────────────────────────────────────────────────────────────────── +// ───────────────────────────────────────────────────────────────────────────── class _ActivityCfg { final IconData icon; @@ -1665,8 +1718,8 @@ _ActivityCfg _activityConfig(String logType) { return const _ActivityCfg( Icons.stop_circle_outlined, Color(0xFF64748B), 'WalkGuide Berhenti'); case 'OBSTACLE_DETECTED': - return const _ActivityCfg( - Icons.warning_amber_outlined, Color(0xFFD97706), 'Obstacle Terdeteksi'); + return const _ActivityCfg(Icons.warning_amber_outlined, Color(0xFFD97706), + 'Obstacle Terdeteksi'); case 'SOS_TRIGGERED': return const _ActivityCfg( Icons.sos_outlined, Color(0xFFDC2626), 'SOS Dikirim'); diff --git a/walkguide-mobile/walkguide_app/lib/features/pairing/pairing_screens.dart b/walkguide-mobile/walkguide_app/lib/features/pairing/pairing_screens.dart index ed14527..480fc75 100644 --- a/walkguide-mobile/walkguide_app/lib/features/pairing/pairing_screens.dart +++ b/walkguide-mobile/walkguide_app/lib/features/pairing/pairing_screens.dart @@ -345,25 +345,58 @@ class _PairingStatusCardState extends State<_PairingStatusCard> { @override Widget build(BuildContext context) { final pending = _data?['status'] == 'PENDING'; + final cardColor = _active + ? const Color(0xFFF0FDF4) + : pending + ? const Color(0xFFEFF6FF) + : const Color(0xFFFFFBEB); + final accent = _active + ? const Color(0xFF059669) + : pending + ? const Color(0xFF2563EB) + : const Color(0xFFD97706); return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(18), decoration: BoxDecoration( - color: _active ? const Color(0xFFF0FDF4) : const Color(0xFFFFFBEB), - borderRadius: BorderRadius.circular(12), - border: Border.all( - color: _active ? const Color(0xFFBBF7D0) : const Color(0xFFFDE68A)), + color: cardColor, + borderRadius: BorderRadius.circular(22), + border: Border.all(color: accent.withValues(alpha: 0.28)), + boxShadow: [ + BoxShadow( + color: accent.withValues(alpha: 0.10), + blurRadius: 24, + offset: const Offset(0, 12), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( children: [ - Icon(_active ? Icons.link : Icons.info_outline, - color: _active - ? const Color(0xFF16A34A) - : const Color(0xFFD97706)), + Container( + width: 42, + height: 42, + decoration: BoxDecoration( + color: accent.withValues(alpha: 0.12), + borderRadius: BorderRadius.circular(12), + ), + child: Icon( + _active + ? Icons.verified_user_outlined + : pending + ? Icons.mark_email_unread_outlined + : Icons.info_outline, + color: accent), + ), const SizedBox(width: 12), - Expanded(child: Text(_status)), + Expanded( + child: Text(_status, + style: const TextStyle( + color: Color(0xFF0F172A), + fontWeight: FontWeight.w700, + height: 1.25)), + ), IconButton( onPressed: _loading ? null : _load, icon: _loading @@ -427,33 +460,84 @@ class _Page extends StatelessWidget { @override Widget build(BuildContext context) { return SafeArea( - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: DecoratedBox( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Color(0xFFF8FAFC), Color(0xFFEFF6FF)], + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 14, 16, 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TweenAnimationBuilder( + tween: Tween(begin: 14, end: 0), + duration: const Duration(milliseconds: 360), + curve: Curves.easeOutCubic, + builder: (_, offset, child) => Opacity( + opacity: (1 - offset / 14).clamp(0.0, 1.0), + child: Transform.translate( + offset: Offset(0, offset), child: child), + ), + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(18), + decoration: BoxDecoration( + color: const Color(0xFF0F172A), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: const Color(0xFF0F172A).withValues(alpha: 0.18), + blurRadius: 28, + offset: const Offset(0, 14), + ), + ], + ), + child: Row( children: [ - Text(title, - style: Theme.of(context) - .textTheme - .headlineSmall - ?.copyWith(fontWeight: FontWeight.w800)), - if (subtitle != null) - Text(subtitle!, - style: const TextStyle(color: Color(0xFF64748B))), + Container( + width: 52, + height: 52, + decoration: BoxDecoration( + color: + const Color(0xFF38BDF8).withValues(alpha: 0.16), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: const Color(0xFF38BDF8)), + ), + child: const Icon(Icons.hub_outlined, + color: Color(0xFFBAE6FD), size: 28), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: Theme.of(context) + .textTheme + .headlineSmall + ?.copyWith( + fontWeight: FontWeight.w900, + color: Colors.white, + )), + if (subtitle != null) + Text(subtitle!, + style: const TextStyle( + color: Color(0xFFCBD5E1), height: 1.25)), + ], + ), + ), ], ), ), - ], - ), - const SizedBox(height: 16), - Expanded(child: child), - ], + ), + const SizedBox(height: 16), + Expanded(child: child), + ], + ), ), ), ); @@ -474,24 +558,47 @@ class _InfoCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(18), decoration: BoxDecoration( - color: const Color(0xFFEFF6FF), - borderRadius: BorderRadius.circular(12)), + color: Colors.white, + borderRadius: BorderRadius.circular(22), + border: Border.all(color: const Color(0xFFDDEAFE)), + boxShadow: [ + BoxShadow( + color: const Color(0xFF2563EB).withValues(alpha: 0.10), + blurRadius: 24, + offset: const Offset(0, 12), + ), + ], + ), child: Row( children: [ - Icon(icon, color: const Color(0xFF1A56DB)), - const SizedBox(width: 12), + Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: const Color(0xFFEFF6FF), + borderRadius: BorderRadius.circular(14), + ), + child: Icon(icon, color: const Color(0xFF2563EB)), + ), + const SizedBox(width: 14), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title), + Text(title, + style: const TextStyle( + color: Color(0xFF64748B), fontWeight: FontWeight.w700)), SelectableText(value, style: const TextStyle( - fontSize: 22, fontWeight: FontWeight.w800)), + fontSize: 25, + height: 1.1, + letterSpacing: 1.2, + fontWeight: FontWeight.w900, + color: Color(0xFF0F172A))), if (helper != null) ...[ - const SizedBox(height: 4), + const SizedBox(height: 6), Text(helper!, style: const TextStyle( color: Color(0xFF64748B), fontSize: 12)), diff --git a/walkguide-mobile/walkguide_app/lib/features/server_connect/server_connect_server.dart b/walkguide-mobile/walkguide_app/lib/features/server_connect/server_connect_server.dart index 0fb610d..7a72ed9 100644 --- a/walkguide-mobile/walkguide_app/lib/features/server_connect/server_connect_server.dart +++ b/walkguide-mobile/walkguide_app/lib/features/server_connect/server_connect_server.dart @@ -9,16 +9,6 @@ import '../../core/constants/app_constants.dart'; import '../../core/errors/friendly_error.dart'; import '../../core/network/api_client.dart'; -// --------------------------------------------------------------------------- -// ServerConnectScreen -// --------------------------------------------------------------------------- -// -// Gerbang pertama aplikasi. -// Muncul HANYA jika SharedPreferences tidak punya serverUrl tersimpan. -// Setelah berhasil connect, tidak akan muncul lagi kecuali user reset via -// Settings → "Change Server". -// --------------------------------------------------------------------------- - class ServerConnectScreen extends StatefulWidget { const ServerConnectScreen({super.key}); @@ -27,11 +17,17 @@ class ServerConnectScreen extends StatefulWidget { } class _ServerConnectScreenState extends State { - final _url = TextEditingController(); + final _url = TextEditingController(text: 'http://127.0.0.1:8080'); bool _loading = false; bool _ok = false; String? _message; + @override + void dispose() { + _url.dispose(); + super.dispose(); + } + Future _test() async { setState(() { _loading = true; @@ -47,8 +43,8 @@ class _ServerConnectScreenState extends State { )).get('$clean/api/v1/auth/ping'); _ok = res.statusCode == 200 && res.data['success'] == true; _message = _ok - ? 'Server aktif dan siap dipakai.' - : 'Server merespons dengan format tidak valid.'; + ? 'Server aktif. WalkGuide siap tersambung.' + : 'Server merespons, tetapi format ping tidak valid.'; }, onError: (message) => _message = message, fallback: 'Tidak bisa terhubung. Periksa URL dan jaringan.', @@ -63,49 +59,219 @@ class _ServerConnectScreenState extends State { if (mounted) context.go('/splash'); } + void _useUsbUrl() => setState(() => _url.text = 'http://127.0.0.1:8080'); + @override Widget build(BuildContext context) { - return _AuthFrame( - title: 'Connect to Server', - subtitle: 'Masukkan URL backend WalkGuide yang diberikan dosen.', - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + return Scaffold( + backgroundColor: const Color(0xFFF5F8FC), + body: Stack( children: [ - TextField( - controller: _url, - keyboardType: TextInputType.url, - decoration: const InputDecoration( - labelText: 'Server URL', - hintText: 'http://server-ip:8080', - prefixIcon: Icon(Icons.dns_outlined), - )), - const SizedBox(height: 12), - OutlinedButton.icon( - onPressed: _loading ? null : _test, - icon: _loading - ? const SizedBox( - width: 18, - height: 18, - child: CircularProgressIndicator(strokeWidth: 2)) - : const Icon(Icons.wifi_tethering), - label: const Text('Test Connection'), + const Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFF071226), + Color(0xFF123D6B), + Color(0xFFF7FAFC) + ], + stops: [0, 0.42, 1], + ), + ), + ), ), - if (_message != null) ...[ - const SizedBox(height: 12), - _StatusBox(success: _ok, message: _message!), - ], - if (_ok) ...[ - const SizedBox(height: 12), - FilledButton.icon( - onPressed: _continue, - icon: const Icon(Icons.arrow_forward), - label: const Text('Continue')), - ], - const SizedBox(height: 24), - const Center( - child: Text( - 'v1.0.0 | For Testing Purposes Only', - style: TextStyle(fontSize: 11, color: Color(0xFF94A3B8)), + const Positioned( + top: -80, + right: -70, + child: _GlowBlob(size: 250, color: Color(0xFF38BDF8)), + ), + const Positioned( + bottom: -90, + left: -80, + child: _GlowBlob(size: 260, color: Color(0xFF22C55E)), + ), + SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + final compact = constraints.maxWidth < 390; + return SingleChildScrollView( + padding: EdgeInsets.fromLTRB(20, compact ? 20 : 36, 20, 24), + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 460), + child: TweenAnimationBuilder( + tween: Tween(begin: 18, end: 0), + duration: const Duration(milliseconds: 520), + curve: Curves.easeOutCubic, + builder: (_, y, child) => Opacity( + opacity: (1 - y / 18).clamp(0, 1), + child: Transform.translate( + offset: Offset(0, y), child: child), + ), + child: Container( + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.96), + borderRadius: BorderRadius.circular(28), + border: Border.all( + color: Colors.white.withValues(alpha: 0.7)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.18), + blurRadius: 34, + offset: const Offset(0, 22), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(28), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: + const EdgeInsets.fromLTRB(22, 22, 22, 20), + decoration: const BoxDecoration( + color: Color(0xFF071226), + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: const Color(0xFF2563EB), + borderRadius: + BorderRadius.circular(16), + ), + child: const Icon( + Icons.navigation_rounded, + color: Colors.white, + size: 28), + ), + const SizedBox(width: 12), + const Expanded( + child: Text( + 'WalkGuide Link', + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.w900, + ), + ), + ), + ], + ), + const SizedBox(height: 18), + const Text( + 'Connect to Server', + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w900, + height: 1, + ), + ), + const SizedBox(height: 8), + Text( + 'Sambungkan app HP ke backend Spring Boot yang sedang berjalan di laptop.', + style: TextStyle( + color: Colors.white + .withValues(alpha: 0.72), + height: 1.35, + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(22), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.stretch, + children: [ + TextField( + controller: _url, + keyboardType: TextInputType.url, + textInputAction: TextInputAction.done, + onSubmitted: (_) => _test(), + decoration: const InputDecoration( + labelText: 'Server URL', + hintText: 'http://127.0.0.1:8080', + prefixIcon: Icon(Icons.dns_outlined), + ), + ), + const SizedBox(height: 10), + Wrap( + spacing: 8, + runSpacing: 8, + children: [ + _HintChip( + icon: Icons.usb_outlined, + label: 'USB: 127.0.0.1', + onTap: _useUsbUrl, + ), + const _HintChip( + icon: Icons.wifi_tethering_outlined, + label: 'Wi-Fi: IP laptop', + ), + ], + ), + const SizedBox(height: 16), + OutlinedButton.icon( + onPressed: _loading ? null : _test, + icon: _loading + ? const SizedBox( + width: 18, + height: 18, + child: + CircularProgressIndicator( + strokeWidth: 2), + ) + : const Icon(Icons.radar_outlined), + label: const Text('Test Connection'), + ), + if (_message != null) ...[ + const SizedBox(height: 12), + _StatusBox( + success: _ok, message: _message!), + ], + if (_ok) ...[ + const SizedBox(height: 12), + FilledButton.icon( + onPressed: _continue, + icon: const Icon( + Icons.arrow_forward_rounded), + label: const Text('Continue'), + ), + ], + const SizedBox(height: 18), + const Center( + child: Text( + 'v1.0.0 | Spring Boot + Flutter', + style: TextStyle( + fontSize: 11, + color: Color(0xFF94A3B8)), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + }, ), ), ], @@ -114,55 +280,62 @@ class _ServerConnectScreenState extends State { } } -// --------------------------------------------------------------------------- -// Shared private widgets -// --------------------------------------------------------------------------- - -class _AuthFrame extends StatelessWidget { - final String title; - final String subtitle; - final Widget child; - const _AuthFrame( - {required this.title, required this.subtitle, required this.child}); +class _GlowBlob extends StatelessWidget { + final double size; + final Color color; + const _GlowBlob({required this.size, required this.color}); @override Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.all(24), - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 460), - child: Card( - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18), - side: const BorderSide(color: Color(0xFFE2E8F0))), - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const Icon(Icons.navigation_rounded, - color: Color(0xFF1A56DB), size: 42), - const SizedBox(height: 14), - Text(title, - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .headlineSmall - ?.copyWith(fontWeight: FontWeight.w800)), - const SizedBox(height: 4), - Text(subtitle, - textAlign: TextAlign.center, - style: const TextStyle(color: Color(0xFF64748B))), - const SizedBox(height: 22), - child, - ], - ), + return Container( + width: size, + height: size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color.withValues(alpha: 0.18), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.22), + blurRadius: 60, + spreadRadius: 8), + ], + ), + ); + } +} + +class _HintChip extends StatelessWidget { + final IconData icon; + final String label; + final VoidCallback? onTap; + const _HintChip({required this.icon, required this.label, this.onTap}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(999), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + decoration: BoxDecoration( + color: const Color(0xFFEFF6FF), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: const Color(0xFFBFDBFE)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 14, color: const Color(0xFF1D4ED8)), + const SizedBox(width: 6), + Text( + label, + style: const TextStyle( + color: Color(0xFF1D4ED8), + fontSize: 12, + fontWeight: FontWeight.w800, ), ), - ), + ], ), ), ); @@ -176,31 +349,23 @@ class _StatusBox extends StatelessWidget { @override Widget build(BuildContext context) { - return DecoratedBox( + final color = success ? const Color(0xFF16A34A) : const Color(0xFFDC2626); + return Container( + padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: success ? const Color(0xFFF0FDF4) : const Color(0xFFFEF2F2), - borderRadius: BorderRadius.circular(10), + color: color.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: color.withValues(alpha: 0.22)), ), - child: Padding( - padding: const EdgeInsets.all(12), - child: Row( - children: [ - Icon( - success ? Icons.check_circle_outline : Icons.error_outline, - color: - success ? const Color(0xFF166534) : const Color(0xFF991B1B), - size: 20, - ), - const SizedBox(width: 8), - Expanded( + child: Row( + children: [ + Icon(success ? Icons.check_circle_outline : Icons.error_outline, + color: color, size: 20), + const SizedBox(width: 8), + Expanded( child: Text(message, - style: TextStyle( - color: success - ? const Color(0xFF166534) - : const Color(0xFF991B1B))), - ), - ], - ), + style: TextStyle(color: color, fontWeight: FontWeight.w700))), + ], ), ); } diff --git a/walkguide-mobile/walkguide_app/lib/features/sos/sos_screen.dart b/walkguide-mobile/walkguide_app/lib/features/sos/sos_screen.dart index 0042155..9b5fe7f 100644 --- a/walkguide-mobile/walkguide_app/lib/features/sos/sos_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/sos/sos_screen.dart @@ -7,6 +7,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:go_router/go_router.dart'; import '../../app/injection_container.dart'; import '../../core/errors/friendly_error.dart'; @@ -139,6 +140,8 @@ class _SosScreenState extends State Future _confirmAndSend() async { if (_sosCubit.state.phase == SosPhase.sending) return; + final paired = await _ensurePaired(); + if (!paired) return; // Confirmation dialog — prevents accidental tap final confirm = await showDialog( @@ -181,6 +184,35 @@ class _SosScreenState extends State await _sendSos(); } + Future _ensurePaired() async { + bool paired = false; + await runFriendlyAction( + () async { + final res = await _api + .get('/shared/pairing/status') + .timeout(const Duration(seconds: 6)); + final data = res.data['data']; + paired = data is Map && data['status'] == 'ACTIVE'; + }, + onError: (_) {}, + fallback: 'Status pairing belum bisa dicek.', + ); + if (paired) return true; + if (!mounted) return false; + sl().speak('SOS belum bisa dikirim. Hubungkan Guardian dulu.'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text( + 'SOS hanya bisa dikirim setelah akun terhubung dengan Guardian.'), + action: SnackBarAction( + label: 'Pairing', + onPressed: () => context.go('/user/pairing'), + ), + ), + ); + return false; + } + Future _sendSos() async { await runFriendlyAction( () async { @@ -217,96 +249,98 @@ class _SosScreenState extends State child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - // Header - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'SOS', - style: Theme.of(context) - .textTheme - .headlineSmall - ?.copyWith(fontWeight: FontWeight.w800), - ), - const Text( - 'Emergency alert ke Guardian', - style: TextStyle(color: Color(0xFF64748B)), - ), - ], - ), - ), - IconButton( - onPressed: _loadHistory, - icon: const Icon(Icons.refresh), - tooltip: 'Refresh riwayat', - ), - ], - ), - - const SizedBox(height: 24), - - // Active SOS banner - if (_hasActiveSos) - _ActiveSosBanner(event: _events.first, onRefresh: _loadHistory), - - const SizedBox(height: 24), - - // SOS Button - Center( - child: sending - ? const _SendingIndicator() - : AnimatedBuilder( - animation: _pulseAnim, - builder: (_, child) => Transform.scale( - scale: _hasActiveSos ? _pulseAnim.value : 1.0, - child: child, - ), - child: _SosButton( - active: _hasActiveSos, - onPressed: _confirmAndSend, + // Header + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'SOS', + style: Theme.of(context) + .textTheme + .headlineSmall + ?.copyWith(fontWeight: FontWeight.w800), + ), + const Text( + 'Emergency alert ke Guardian', + style: TextStyle(color: Color(0xFF64748B)), + ), + ], ), ), + IconButton( + onPressed: _loadHistory, + icon: const Icon(Icons.refresh), + tooltip: 'Refresh riwayat', + ), + ], + ), + + const SizedBox(height: 24), + + // Active SOS banner + if (_hasActiveSos) + _ActiveSosBanner( + event: _events.first, onRefresh: _loadHistory), + + const SizedBox(height: 24), + + // SOS Button + Center( + child: sending + ? const _SendingIndicator() + : AnimatedBuilder( + animation: _pulseAnim, + builder: (_, child) => Transform.scale( + scale: _hasActiveSos ? _pulseAnim.value : 1.0, + child: child, + ), + child: _SosButton( + active: _hasActiveSos, + onPressed: _confirmAndSend, + ), + ), + ), + + const SizedBox(height: 8), + + // Hint text + Text( + _hasActiveSos + ? 'SOS aktif — Guardian sudah mendapat notifikasi' + : 'Tekan tombol untuk kirim SOS darurat ke Guardian', + textAlign: TextAlign.center, + style: TextStyle( + color: _hasActiveSos + ? const Color(0xFFDC2626) + : const Color(0xFF64748B), + fontWeight: + _hasActiveSos ? FontWeight.w700 : FontWeight.normal, + ), + ), + + const SizedBox(height: 28), + + // History section + const Text( + 'Riwayat SOS', + style: TextStyle(fontWeight: FontWeight.w800, fontSize: 16), + ), + const SizedBox(height: 10), + + Expanded( + child: _SosHistory( + loading: _historyLoading, + error: _historyError, + events: _events, + onRefresh: _loadHistory, + )), + ], ), - - const SizedBox(height: 8), - - // Hint text - Text( - _hasActiveSos - ? 'SOS aktif — Guardian sudah mendapat notifikasi' - : 'Tekan tombol untuk kirim SOS darurat ke Guardian', - textAlign: TextAlign.center, - style: TextStyle( - color: _hasActiveSos - ? const Color(0xFFDC2626) - : const Color(0xFF64748B), - fontWeight: _hasActiveSos ? FontWeight.w700 : FontWeight.normal, - ), - ), - - const SizedBox(height: 28), - - // History section - const Text( - 'Riwayat SOS', - style: TextStyle(fontWeight: FontWeight.w800, fontSize: 16), - ), - const SizedBox(height: 10), - - Expanded( - child: _SosHistory( - loading: _historyLoading, - error: _historyError, - events: _events, - onRefresh: _loadHistory, - )), - ], ), - ), - ); + ); }, ); } diff --git a/walkguide-mobile/walkguide_app/lib/features/walk_guide/walk_guide_screen.dart b/walkguide-mobile/walkguide_app/lib/features/walk_guide/walk_guide_screen.dart index 7d7c931..70aea8d 100644 --- a/walkguide-mobile/walkguide_app/lib/features/walk_guide/walk_guide_screen.dart +++ b/walkguide-mobile/walkguide_app/lib/features/walk_guide/walk_guide_screen.dart @@ -12,6 +12,7 @@ import '../../app/injection_container.dart'; import '../../core/ai/detection_export.dart'; import '../../core/ai/obstacle_alert_strategy.dart'; import '../../core/errors/friendly_error.dart'; +import '../../core/network/api_client.dart'; import '../../core/services/location_reporter_service.dart'; import '../../core/services/tts_service.dart'; import 'application/walk_guide_cubit.dart'; @@ -27,10 +28,15 @@ class WalkGuideScreen extends StatefulWidget { State createState() => _WalkGuideScreenState(); } -class _WalkGuideScreenState extends State { +class _WalkGuideScreenState extends State + with SingleTickerProviderStateMixin { late final WalkGuideCubit _cubit; + late final AnimationController _scanCtrl; CameraController? _camera; bool _processingFrame = false; + bool _pairingLoading = true; + bool _paired = false; + String? _pairedName; DateTime _lastInferenceAt = DateTime.fromMillisecondsSinceEpoch(0); DateTime _lastAlertAt = DateTime.fromMillisecondsSinceEpoch(0); DateTime _lastModelWarningAt = DateTime.fromMillisecondsSinceEpoch(0); @@ -39,6 +45,11 @@ class _WalkGuideScreenState extends State { void initState() { super.initState(); _cubit = sl(); + _scanCtrl = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 2200), + )..repeat(); + _loadPairingStatus(); } @override @@ -49,6 +60,7 @@ class _WalkGuideScreenState extends State { } _camera?.dispose(); sl().stop(); + _scanCtrl.dispose(); _cubit.close(); super.dispose(); } @@ -56,6 +68,8 @@ class _WalkGuideScreenState extends State { Future _toggle() async { final next = !_cubit.state.active; if (next) { + final paired = await _ensurePaired(); + if (!paired) return; await _startCamera(); await sl().start(walkGuideActive: true); await _cubit.start(); @@ -69,6 +83,48 @@ class _WalkGuideScreenState extends State { sl().speak(next ? 'WalkGuide dimulai' : 'WalkGuide dihentikan'); } + Future _loadPairingStatus() async { + await runFriendlyAction( + () async { + final res = await sl() + .dio + .get('/shared/pairing/status') + .timeout(const Duration(seconds: 6)); + final data = res.data['data']; + if (!mounted) return; + setState(() { + _paired = data is Map && data['status'] == 'ACTIVE'; + _pairedName = data is Map ? data['pairedWithName']?.toString() : null; + _pairingLoading = false; + }); + }, + onError: (_) { + if (!mounted) return; + setState(() => _pairingLoading = false); + }, + fallback: 'Status pairing belum bisa dicek.', + ); + } + + Future _ensurePaired() async { + if (_paired) return true; + await _loadPairingStatus(); + if (_paired) return true; + if (!mounted) return false; + sl().speak('Hubungkan Guardian terlebih dahulu.'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text( + 'WalkGuide, SOS, dan panggilan aktif setelah pairing dengan Guardian.'), + action: SnackBarAction( + label: 'Pairing', + onPressed: () => context.go('/user/pairing'), + ), + ), + ); + return false; + } + String _activeStatusText() { final detector = sl(); if (kIsWeb) { @@ -86,33 +142,33 @@ class _WalkGuideScreenState extends State { if (_camera != null) return; await runFriendlyAction( () async { - final cameras = await availableCameras(); - if (cameras.isEmpty) return; - final backCamera = cameras.firstWhere( - (camera) => camera.lensDirection == CameraLensDirection.back, - orElse: () => cameras.first, - ); - final controller = CameraController( - backCamera, - ResolutionPreset.medium, - enableAudio: false, - imageFormatGroup: ImageFormatGroup.yuv420, - ); - await controller.initialize(); - if (!mounted) { - await controller.dispose(); - return; - } - await runFriendlyAction( - () => controller.startImageStream(_onCameraImage), - onError: (_) { - _cubit.updateStatus(kIsWeb - ? 'Camera preview aktif, tapi image stream YOLO tidak tersedia di Chrome/web.' - : 'Camera preview aktif, tapi image stream belum tersedia.'); - }, - fallback: 'Camera preview aktif, tapi image stream belum tersedia.', - ); - setState(() => _camera = controller); + final cameras = await availableCameras(); + if (cameras.isEmpty) return; + final backCamera = cameras.firstWhere( + (camera) => camera.lensDirection == CameraLensDirection.back, + orElse: () => cameras.first, + ); + final controller = CameraController( + backCamera, + ResolutionPreset.medium, + enableAudio: false, + imageFormatGroup: ImageFormatGroup.yuv420, + ); + await controller.initialize(); + if (!mounted) { + await controller.dispose(); + return; + } + await runFriendlyAction( + () => controller.startImageStream(_onCameraImage), + onError: (_) { + _cubit.updateStatus(kIsWeb + ? 'Camera preview aktif, tapi image stream YOLO tidak tersedia di Chrome/web.' + : 'Camera preview aktif, tapi image stream belum tersedia.'); + }, + fallback: 'Camera preview aktif, tapi image stream belum tersedia.', + ); + setState(() => _camera = controller); }, onError: (_) => _cubit.updateStatus('Camera unavailable.'), fallback: 'Camera unavailable.', @@ -190,7 +246,9 @@ class _WalkGuideScreenState extends State { bloc: _cubit, builder: (context, state) => _Page( title: 'WalkGuide', - subtitle: 'On-device AI detection surface', + subtitle: _paired + ? 'Connected to ${_pairedName ?? 'Guardian'}' + : 'Pair with Guardian to unlock live protection', actions: [ IconButton( onPressed: () => context.go('/user/benchmark'), @@ -202,64 +260,52 @@ class _WalkGuideScreenState extends State { child: Column( children: [ Expanded( - child: Container( - width: double.infinity, - decoration: BoxDecoration( - color: const Color(0xFF0F172A), - borderRadius: BorderRadius.circular(16)), - child: Stack( - children: [ - if (_camera != null && _camera!.value.isInitialized) - Positioned.fill(child: CameraPreview(_camera!)) - else - const Center( - child: Icon(Icons.videocam_outlined, - color: Colors.white30, size: 96)), - if (state.latestDetection?.box != null) - Positioned.fill( - child: CustomPaint( - painter: - _DetectionOverlayPainter(state.latestDetection!), - ), - ), - Positioned( - top: 16, - left: 16, - child: _Pill( - text: state.active ? 'AI ACTIVE' : 'STANDBY', - color: - state.active ? Colors.green : Colors.orange)), - if (state.latestDetection != null) - Positioned( - top: 64, - left: 16, - child: _Pill( - text: - '${ObstacleAnalyzer.spokenLabel(state.latestDetection!.label)} ${state.latestDetection!.directionName}', - color: Colors.redAccent), - ), - Positioned( - left: 16, - right: 16, - bottom: 16, - child: Text(state.status, - style: const TextStyle( - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.w700))), - ], - ), + child: _VisionPanel( + state: state, + camera: _camera, + scanCtrl: _scanCtrl, + paired: _paired, + pairingLoading: _pairingLoading, + onPairingTap: () => context.go('/user/pairing'), ), ), const SizedBox(height: 14), + _StatusStrip( + active: state.active, + paired: _paired, + latestDetection: state.latestDetection, + ), + const SizedBox(height: 12), Row( children: [ Expanded( - child: FilledButton.icon( - onPressed: _toggle, - icon: - Icon(state.active ? Icons.stop : Icons.play_arrow), - label: Text(state.active ? 'Stop' : 'Start'))), + flex: 2, + child: FilledButton.icon( + onPressed: _pairingLoading ? null : _toggle, + icon: Icon(state.active ? Icons.stop : Icons.play_arrow), + label: Text(state.active ? 'Stop Scan' : 'Start Scan'), + ), + ), + const SizedBox(width: 10), + _ActionSquare( + icon: Icons.sos_outlined, + color: const Color(0xFFDC2626), + onTap: () async { + if (await _ensurePaired() && context.mounted) { + context.go('/user/sos'); + } + }, + ), + const SizedBox(width: 10), + _ActionSquare( + icon: Icons.call_outlined, + color: const Color(0xFF059669), + onTap: () async { + if (await _ensurePaired() && context.mounted) { + context.go('/user/call'); + } + }, + ), ], ), ], @@ -269,6 +315,413 @@ class _WalkGuideScreenState extends State { } } +class _VisionPanel extends StatelessWidget { + final WalkGuideState state; + final CameraController? camera; + final AnimationController scanCtrl; + final bool paired; + final bool pairingLoading; + final VoidCallback onPairingTap; + + const _VisionPanel({ + required this.state, + required this.camera, + required this.scanCtrl, + required this.paired, + required this.pairingLoading, + required this.onPairingTap, + }); + + @override + Widget build(BuildContext context) { + final cameraReady = camera != null && camera!.value.isInitialized; + return ClipRRect( + borderRadius: BorderRadius.circular(28), + child: DecoratedBox( + decoration: const BoxDecoration(color: Color(0xFF07111F)), + child: Stack( + children: [ + Positioned.fill( + child: cameraReady + ? CameraPreview(camera!) + : const DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFF07111F), + Color(0xFF0E2A3D), + Color(0xFF111827), + ], + ), + ), + ), + ), + Positioned.fill(child: CustomPaint(painter: _HudGridPainter())), + if (state.active) + AnimatedBuilder( + animation: scanCtrl, + builder: (_, __) => Positioned( + left: 0, + right: 0, + top: 28 + + (MediaQuery.of(context).size.height * + 0.38 * + scanCtrl.value), + child: Container( + height: 3, + decoration: BoxDecoration( + color: const Color(0xFF22D3EE).withValues(alpha: 0.8), + boxShadow: [ + BoxShadow( + color: + const Color(0xFF22D3EE).withValues(alpha: 0.45), + blurRadius: 22, + spreadRadius: 4, + ), + ], + ), + ), + ), + ), + if (state.latestDetection?.box != null) + Positioned.fill( + child: CustomPaint( + painter: _DetectionOverlayPainter(state.latestDetection!), + ), + ), + Positioned( + top: 18, + left: 18, + right: 18, + child: Row( + children: [ + _Pill( + text: state.active ? 'LIVE AI SCAN' : 'STANDBY', + color: state.active + ? const Color(0xFF22C55E) + : const Color(0xFFF59E0B), + ), + const SizedBox(width: 8), + _Pill( + text: paired ? 'GUARDIAN LINKED' : 'PAIRING REQUIRED', + color: paired + ? const Color(0xFF38BDF8) + : const Color(0xFFF97316), + ), + ], + ), + ), + Center( + child: AnimatedScale( + duration: const Duration(milliseconds: 320), + scale: state.active ? 1.0 : 0.92, + child: Container( + width: 118, + height: 118, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black.withValues(alpha: 0.28), + border: Border.all( + color: (state.active + ? const Color(0xFF22D3EE) + : Colors.white) + .withValues(alpha: 0.34), + width: 2, + ), + ), + child: Icon( + cameraReady + ? Icons.center_focus_strong + : Icons.videocam_off, + color: Colors.white.withValues(alpha: 0.68), + size: 48, + ), + ), + ), + ), + if (!paired && !pairingLoading) + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + color: const Color(0xFF020617).withValues(alpha: 0.72), + ), + child: Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 70, + height: 70, + decoration: BoxDecoration( + color: const Color(0xFFFFFBEB) + .withValues(alpha: 0.14), + borderRadius: BorderRadius.circular(18), + border: + Border.all(color: const Color(0xFFF59E0B)), + ), + child: const Icon(Icons.link_off, + color: Color(0xFFFBBF24), size: 34), + ), + const SizedBox(height: 14), + const Text( + 'Guardian belum terhubung', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 22, + fontWeight: FontWeight.w900, + ), + ), + const SizedBox(height: 6), + const Text( + 'Pairing dulu supaya SOS, panggilan, dan pemantauan live punya penerima yang jelas.', + textAlign: TextAlign.center, + style: + TextStyle(color: Colors.white70, height: 1.35), + ), + const SizedBox(height: 16), + FilledButton.icon( + onPressed: onPairingTap, + icon: const Icon(Icons.link), + label: const Text('Buka Pairing'), + ), + ], + ), + ), + ), + ), + ), + Positioned( + left: 18, + right: 18, + bottom: 18, + child: _GlassStatusBar( + status: state.status, + detection: state.latestDetection, + ), + ), + ], + ), + ), + ); + } +} + +class _GlassStatusBar extends StatelessWidget { + final String status; + final DetectionResult? detection; + + const _GlassStatusBar({required this.status, required this.detection}); + + @override + Widget build(BuildContext context) { + final label = detection == null + ? status + : '${ObstacleAnalyzer.spokenLabel(detection!.label)} detected ${detection!.directionName}'; + return Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.black.withValues(alpha: 0.42), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.white.withValues(alpha: 0.16)), + ), + child: Row( + children: [ + Icon( + detection == null ? Icons.sensors : Icons.warning_amber_rounded, + color: detection == null + ? const Color(0xFF93C5FD) + : const Color(0xFFFBBF24), + ), + const SizedBox(width: 10), + Expanded( + child: Text( + label, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w800, + height: 1.2, + ), + ), + ), + ], + ), + ); + } +} + +class _StatusStrip extends StatelessWidget { + final bool active; + final bool paired; + final DetectionResult? latestDetection; + + const _StatusStrip({ + required this.active, + required this.paired, + required this.latestDetection, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: _MetricChip( + icon: Icons.health_and_safety_outlined, + label: 'Guardian', + value: paired ? 'Linked' : 'Required', + color: paired ? const Color(0xFF059669) : const Color(0xFFD97706), + ), + ), + const SizedBox(width: 8), + Expanded( + child: _MetricChip( + icon: Icons.radar_outlined, + label: 'Detector', + value: active ? 'Scanning' : 'Idle', + color: active ? const Color(0xFF2563EB) : const Color(0xFF64748B), + ), + ), + const SizedBox(width: 8), + Expanded( + child: _MetricChip( + icon: Icons.visibility_outlined, + label: 'Obstacle', + value: latestDetection == null ? 'Clear' : 'Alert', + color: latestDetection == null + ? const Color(0xFF64748B) + : const Color(0xFFDC2626), + ), + ), + ], + ); + } +} + +class _MetricChip extends StatelessWidget { + final IconData icon; + final String label; + final String value; + final Color color; + + const _MetricChip({ + required this.icon, + required this.label, + required this.value, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(14), + border: Border.all(color: const Color(0xFFE2E8F0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.04), + blurRadius: 14, + offset: const Offset(0, 8), + ), + ], + ), + child: Row( + children: [ + Icon(icon, size: 18, color: color), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Color(0xFF64748B), + fontSize: 11, + fontWeight: FontWeight.w600, + )), + Text(value, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: color, + fontSize: 13, + fontWeight: FontWeight.w900, + )), + ], + ), + ), + ], + ), + ); + } +} + +class _ActionSquare extends StatelessWidget { + final IconData icon; + final Color color; + final VoidCallback onTap; + + const _ActionSquare({ + required this.icon, + required this.color, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: color, + borderRadius: BorderRadius.circular(14), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(14), + child: SizedBox( + width: 54, + height: 50, + child: Icon(icon, color: Colors.white), + ), + ), + ); + } +} + +class _HudGridPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final line = Paint() + ..color = Colors.white.withValues(alpha: 0.045) + ..strokeWidth = 1; + for (double x = 0; x < size.width; x += 42) { + canvas.drawLine(Offset(x, 0), Offset(x, size.height), line); + } + for (double y = 0; y < size.height; y += 42) { + canvas.drawLine(Offset(0, y), Offset(size.width, y), line); + } + + final center = Offset(size.width / 2, size.height / 2); + final ring = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 1.2 + ..color = const Color(0xFF22D3EE).withValues(alpha: 0.16); + for (final radius in [64.0, 112.0, 164.0]) { + canvas.drawCircle(center, radius, ring); + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + class _DetectionOverlayPainter extends CustomPainter { final DetectionResult detection; const _DetectionOverlayPainter(this.detection); @@ -356,34 +809,67 @@ class _Page extends StatelessWidget { @override Widget build(BuildContext context) { return SafeArea( - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(title, - style: Theme.of(context) - .textTheme - .headlineSmall - ?.copyWith(fontWeight: FontWeight.w800)), - if (subtitle != null) - Text(subtitle!, - style: const TextStyle(color: Color(0xFF64748B))), - ], + child: DecoratedBox( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Color(0xFFF8FAFC), Color(0xFFEFF6FF)], + ), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 14, 16, 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 46, + height: 46, + decoration: BoxDecoration( + color: const Color(0xFF2563EB), + borderRadius: BorderRadius.circular(14), + boxShadow: [ + BoxShadow( + color: + const Color(0xFF2563EB).withValues(alpha: 0.28), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], + ), + child: const Icon(Icons.navigation_rounded, + color: Colors.white, size: 26), ), - ), - ...?actions, - ], - ), - const SizedBox(height: 16), - Expanded(child: child), - ], + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: Theme.of(context) + .textTheme + .headlineSmall + ?.copyWith( + fontWeight: FontWeight.w900, + color: const Color(0xFF0F172A), + )), + if (subtitle != null) + Text(subtitle!, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(color: Color(0xFF64748B))), + ], + ), + ), + ...?actions, + ], + ), + const SizedBox(height: 16), + Expanded(child: child), + ], + ), ), ), ); diff --git a/walkguide-mobile/walkguide_app/lib/main.dart b/walkguide-mobile/walkguide_app/lib/main.dart index 0777bbe..6703c4c 100644 --- a/walkguide-mobile/walkguide_app/lib/main.dart +++ b/walkguide-mobile/walkguide_app/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:camera/camera.dart'; import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'app/injection_container.dart'; import 'app/app.dart'; @@ -8,6 +9,11 @@ import 'core/utils/init_guard.dart'; List cameras = []; +@pragma('vm:entry-point') +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + await Firebase.initializeApp(); +} + Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -18,7 +24,9 @@ Future main() async { []; if (!kIsWeb) { - await ignoreInitFailure(() => Firebase.initializeApp(), label: 'Firebase init'); + await ignoreInitFailure(() => Firebase.initializeApp(), + label: 'Firebase init'); + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); } // Init GetIt dependencies diff --git a/walkguide-mobile/walkguide_app/lib/shared/widgets/app_shells.dart b/walkguide-mobile/walkguide_app/lib/shared/widgets/app_shells.dart index 9cb0c7f..8948efc 100644 --- a/walkguide-mobile/walkguide_app/lib/shared/widgets/app_shells.dart +++ b/walkguide-mobile/walkguide_app/lib/shared/widgets/app_shells.dart @@ -10,6 +10,7 @@ import '../../core/services/hardware_shortcut_listener.dart'; import '../../core/services/stt_service.dart'; import '../../core/services/tts_service.dart'; import '../../core/services/voice_command_handler.dart'; +import '../../core/theme/app_colors.dart'; class UserShell extends StatefulWidget { final Widget child; @@ -75,7 +76,8 @@ class _UserShellState extends State { if (data is! List) return; final commands = data .whereType() - .map((item) => _voiceCommandFromJson(Map.from(item))) + .map((item) => + _voiceCommandFromJson(Map.from(item))) .whereType() .toList(); if (commands.isNotEmpty) { @@ -181,18 +183,40 @@ class _AppShell extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: child, - bottomNavigationBar: NavigationBar( - selectedIndex: _selectedIndex, - onDestinationSelected: (index) => context.go(items[index].route), - destinations: [ - for (final item in items) - NavigationDestination( - icon: Icon(item.icon), - selectedIcon: Icon(item.selectedIcon), - label: item.label, + backgroundColor: AppColors.surface, + body: AnimatedSwitcher( + duration: const Duration(milliseconds: 180), + switchInCurve: Curves.easeOutCubic, + switchOutCurve: Curves.easeInCubic, + child: KeyedSubtree( + key: ValueKey(location), + child: child, + ), + ), + bottomNavigationBar: DecoratedBox( + decoration: BoxDecoration( + color: Colors.white, + border: const Border(top: BorderSide(color: AppColors.border)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.06), + blurRadius: 18, + offset: const Offset(0, -8), ), - ], + ], + ), + child: NavigationBar( + selectedIndex: _selectedIndex, + onDestinationSelected: (index) => context.go(items[index].route), + destinations: [ + for (final item in items) + NavigationDestination( + icon: Icon(item.icon), + selectedIcon: Icon(item.selectedIcon), + label: item.label, + ), + ], + ), ), ); } diff --git a/walkguide-mobile/walkguide_app/lib/shared/widgets/feature_page.dart b/walkguide-mobile/walkguide_app/lib/shared/widgets/feature_page.dart index 9b749d6..26731fb 100644 --- a/walkguide-mobile/walkguide_app/lib/shared/widgets/feature_page.dart +++ b/walkguide-mobile/walkguide_app/lib/shared/widgets/feature_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../core/theme/app_colors.dart'; + class FeaturePage extends StatelessWidget { final String title; final String subtitle; @@ -18,33 +20,51 @@ class FeaturePage extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.fromLTRB(16, 14, 16, 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - title, - style: - Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w900, - color: const Color(0xFF0F172A), - ), - ), - Text( - subtitle, - style: const TextStyle(color: Color(0xFF64748B)), - ), - ], - ), + TweenAnimationBuilder( + tween: Tween(begin: 12, end: 0), + duration: const Duration(milliseconds: 360), + curve: Curves.easeOutCubic, + builder: (_, offset, child) => Opacity( + opacity: (1 - offset / 12).clamp(0.0, 1.0), + child: Transform.translate( + offset: Offset(0, offset), + child: child, ), - if (trailing != null) trailing!, - ], + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: Theme.of(context) + .textTheme + .headlineSmall + ?.copyWith( + fontWeight: FontWeight.w900, + color: AppColors.text, + ), + ), + const SizedBox(height: 2), + Text( + subtitle, + style: const TextStyle( + color: AppColors.muted, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + if (trailing != null) trailing!, + ], + ), ), const SizedBox(height: 16), Expanded(child: child), @@ -77,7 +97,16 @@ class FeatureEmptyPanel extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon(icon, size: 48, color: const Color(0xFF64748B)), + Container( + width: 72, + height: 72, + decoration: BoxDecoration( + color: AppColors.primary.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColors.border), + ), + child: Icon(icon, size: 36, color: AppColors.primary), + ), const SizedBox(height: 12), Text( title, @@ -88,7 +117,7 @@ class FeatureEmptyPanel extends StatelessWidget { Text( message, textAlign: TextAlign.center, - style: const TextStyle(color: Color(0xFF64748B), height: 1.35), + style: const TextStyle(color: AppColors.muted, height: 1.35), ), if (action != null) ...[ const SizedBox(height: 16), @@ -120,7 +149,7 @@ class FeatureErrorPanel extends StatelessWidget { padding: const EdgeInsets.all(18), decoration: BoxDecoration( color: const Color(0xFFFEF2F2), - borderRadius: BorderRadius.circular(18), + borderRadius: BorderRadius.circular(8), border: Border.all(color: const Color(0xFFFECACA)), ), child: Column( diff --git a/walkguide-mobile/walkguide_app/walkguide_now.png b/walkguide-mobile/walkguide_app/walkguide_now.png new file mode 100644 index 0000000000000000000000000000000000000000..da0701dd758aa73be0a6dda285e74540f978355b GIT binary patch literal 463385 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

=gUuxrYlGxdnWwfcHmbIViY$D+qoJ--6>(4U? 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 z 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

%Y=6(`t)-uH?Ieym=J_wOsTzl$nCN2Hp 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

S@zq&}Y3WUEF7Fra1>JmAUaJE@E_abYD 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

3w;7G(cO)e5 zs=v9I{8%BOV$~E0$1wgQ^9SC`t5`yd`86RQMNXbz)PcEd; zV%GUWM+k?*_bKg$rN4x546b6+2okjJWS@BF3|Qj(jx>MW|T~{8=Z;~7ELIa;Z zrCcKicE^HVEM^XzwFO8Jh!yB;39I0KDb%%D6jte{*vrL^T5YSVHSO)~s*9*VU=@~^ z-^_5i>Wio?fMvjX0iXR4O*sr8cT88eFND08gsWB5d}Q@b41#3#3QtMO+90$*UtaF+ zutCi;{ +