Skip to content

Commit 0c17db1

Browse files
authored
Merge pull request #127 from DeveloperAcademy-POSTECH/feat/#123-WatchAppFlow
[#123] Feat/워치 앱 플로우 구현
2 parents e4d83ae + 4bb422a commit 0c17db1

File tree

13 files changed

+283
-95
lines changed

13 files changed

+283
-95
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "Watch_HomeView.svg",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"idiom" : "universal",
10+
"scale" : "2x"
11+
},
12+
{
13+
"idiom" : "universal",
14+
"scale" : "3x"
15+
}
16+
],
17+
"info" : {
18+
"author" : "xcode",
19+
"version" : 1
20+
}
21+
}
Lines changed: 38 additions & 0 deletions
Loading

hearo/HearoadWatch Watch App/ContentView.swift

Lines changed: 47 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -9,98 +9,56 @@ import SwiftUI
99
import WatchKit
1010

1111
struct ContentView: View {
12-
@ObservedObject var sessionManager = WatchSessionManager.shared
13-
@State private var timer: Timer? = nil // 타이머 관리
14-
@State private var showHearoadDefault = true // Hearoad 기본 화면 표시 여부
15-
16-
var body: some View {
17-
ZStack {
18-
// 배경색 설정: 알림 상태, 기본 상태, etc 상태에 따라 변경
19-
backgroundColor()
20-
.edgesIgnoringSafeArea(.all)
21-
22-
VStack {
23-
if showHearoadDefault {
24-
// Hearoad 기본 화면
25-
Image("HearoadLetters") // Hearoad 이미지 이름 (녹색 화면)
26-
.resizable()
27-
.scaledToFit()
28-
.frame(width: 100, height: 100)
29-
.frame(maxWidth: .infinity, maxHeight: .infinity)
30-
} else if sessionManager.isAlerting {
31-
// 특정 소리 감지 화면
32-
Image(sessionManager.alertImageName()) // Siren, Car, Bicycle 이미지 표시
33-
.resizable()
34-
.scaledToFit()
35-
.frame(width: 150, height: 150)
36-
Text(sessionManager.alertMessage) // 텍스트: 감지된 소리 이름
37-
.font(.title2)
38-
.foregroundColor(.white)
39-
.padding(.top, 10)
40-
} else {
41-
// ETC 정보 상태 (소리 수집중)
42-
Image("MainCircle") // MainCircle 이미지
43-
.resizable()
44-
.scaledToFit()
45-
.frame(width: 150, height: 150)
46-
Text("소리 수집중") // 텍스트
47-
.font(.title2)
48-
.foregroundColor(.gray)
49-
.padding(.top, 10)
50-
}
51-
}
52-
}
53-
.onAppear {
54-
startResetTimer() // 초기화 타이머 시작
55-
sessionManager.resetAlert() // 초기 상태 설정
56-
}
57-
.onChange(of: sessionManager.isAlerting) { newValue in
58-
if newValue {
59-
// Alert 상태가 들어오면 Hearoad 기본 화면 끔
60-
showHearoadDefault = false
61-
cancelResetTimer() // 기존 타이머 취소
62-
startAlertResetTimer() // 알림 상태에서 3초 뒤 복구
63-
}
64-
}
65-
.onChange(of: sessionManager.alertMessage) { newMessage in
66-
if newMessage == "etc" {
67-
// etc 정보가 들어오면 기본 상태 유지
68-
showHearoadDefault = false
69-
cancelResetTimer()
70-
startResetTimer() // etc 상태를 유지하는 5초 타이머
71-
}
72-
}
73-
}
74-
75-
// 배경색 결정
76-
private func backgroundColor() -> Color {
77-
if showHearoadDefault {
78-
return Color("HPrimaryColor") // 기본 Hearoad 화면
79-
} else if sessionManager.isAlerting {
80-
return Color.red // Alert 상태
81-
} else {
82-
return Color.white // ETC 정보 상태
12+
@ObservedObject var sessionManager = WatchSessionManager.shared
13+
@State private var alertTimer: Timer? = nil // 타이머 관리
14+
@State private var currentView: String = "working" // 현재 표시중인 뷰
15+
// @State private var showHearoadDefault = true // Hearoad 기본 화면 표시 여부
16+
17+
var body: some View {
18+
ZStack {
19+
if currentView == "alert" {
20+
// 알림 화면
21+
VStack {
22+
Image(sessionManager.alertImageName())
23+
.resizable()
24+
.scaledToFit()
25+
.frame(width: 150, height: 150)
26+
Text(sessionManager.alertMessage)
27+
.font(.title2)
28+
.foregroundStyle(Color.red)
29+
.padding(.top, 10)
8330
}
31+
} else if sessionManager.currentScreen == "working" {
32+
WatchWorkingView()
33+
} else {
34+
WatchHomeView()
35+
}
8436
}
85-
86-
// 알림 상태에서 3초 뒤 ETC 상태로 복구
87-
private func startAlertResetTimer() {
88-
timer?.invalidate() // 기존 타이머 취소
89-
timer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in
90-
sessionManager.resetAlert() // 알림 상태 복구
91-
}
37+
.onChange(of: sessionManager.isAlerting) { newValue in
38+
if newValue {
39+
// 알림 상태로 전환
40+
currentView = "alert"
41+
startAlertTimer()
42+
}
9243
}
93-
94-
// ETC 상태에서 5초 뒤 기본 Hearoad 화면으로 전환
95-
private func startResetTimer() {
96-
timer?.invalidate() // 기존 타이머 취소
97-
timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in
98-
showHearoadDefault = true // Hearoad 기본 화면 표시
99-
}
44+
.onAppear {
45+
// 기본 화면 설정
46+
currentView = sessionManager.currentScreen == "working" ? "working" : "home"
10047
}
101-
102-
private func cancelResetTimer() {
103-
timer?.invalidate()
104-
timer = nil
48+
}
49+
50+
private func startAlertTimer() {
51+
alertTimer?.invalidate() // 기존 타이머 취소
52+
alertTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in
53+
// 3초 후 원래 화면으로 복구
54+
currentView = sessionManager.currentScreen == "working" ? "working" : "home"
55+
sessionManager.resetAlert() // 알림 상태 초기화
10556
}
57+
}
58+
59+
60+
61+
}
62+
#Preview {
63+
ContentView()
10664
}

hearo/HearoadWatch Watch App/HearoadWatchApp.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import SwiftUI
1111
struct HearoadWatch_Watch_AppApp: App {
1212
var body: some Scene {
1313
WindowGroup {
14-
ContentView()
14+
// ContentView()
15+
SplashView() // 초기 진입 화면을 SplashView로 설정
1516
}
1617
}
1718
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// SplashView.swift
3+
// HearoadWatch Watch App
4+
//
5+
// Created by 규북 on 12/4/24.
6+
//
7+
8+
import SwiftUI
9+
10+
struct SplashView: View {
11+
@State private var showSplash: Bool = true
12+
13+
var body: some View {
14+
if showSplash {
15+
ZStack(alignment: .center) {
16+
Color("HPrimaryColor")
17+
.edgesIgnoringSafeArea(.all)
18+
19+
Image("HearoadLetters") // Hearoad 이미지 이름 (녹색 화면)
20+
.resizable()
21+
.scaledToFit()
22+
.frame(width: 100, height: 100)
23+
.frame(maxWidth: .infinity, maxHeight: .infinity)
24+
}
25+
.onAppear {
26+
// 2초 후 스플래시 화면 종료
27+
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
28+
self.showSplash = false
29+
}
30+
}
31+
} else {
32+
ContentView() // 스플래시 화면 종료 후 ContentView로 전환
33+
}
34+
35+
}
36+
}
37+
38+
#Preview {
39+
SplashView()
40+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// WatchHomeView.swift
3+
// HearoadWatch Watch App
4+
//
5+
// Created by 규북 on 12/5/24.
6+
//
7+
8+
import SwiftUI
9+
10+
struct WatchHomeView: View {
11+
var body: some View {
12+
Image("Watch_HomeView")
13+
.resizable()
14+
.scaledToFit()
15+
.aspectRatio(contentMode: .fill)
16+
}
17+
}
18+
19+
#Preview {
20+
WatchHomeView()
21+
}

0 commit comments

Comments
 (0)