Skip to content

Commit df46b06

Browse files
authored
Merge pull request #60 from Team-HMH/refactor/#59
Refactor [#59] v 1.0.0 심사 대응
2 parents b890cd1 + c9cdc34 commit df46b06

20 files changed

Lines changed: 448 additions & 189 deletions

HMH_iOS/HMHDeviceActivityReport/ActivityModel.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import Foundation
1010
import ManagedSettings
1111

1212
struct ActivityReport {
13+
let totalDuration: Int
14+
let titleState: [String]
15+
var remainTime: Int
16+
var totalGoalTime: Int
17+
let apps: [AppDeviceActivity]
18+
}
19+
20+
struct ChallengeActivity {
1321
let totalDuration: TimeInterval
1422
let apps: [AppDeviceActivity]
1523
}

HMH_iOS/HMHDeviceActivityReport/AppActivityReport.swift

Lines changed: 0 additions & 104 deletions
This file was deleted.

HMH_iOS/HMHDeviceActivityReport/AppActivityView.swift

Lines changed: 89 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,101 @@
88
import SwiftUI
99
import FamilyControls
1010

11+
import Lottie
12+
1113
struct AppActivityView: View {
1214
var activityReport: ActivityReport
1315
var body: some View {
14-
VStack(alignment: .center) {
16+
VStack() {
17+
HeaderView(activityReport: activityReport)
18+
19+
.padding(.bottom, 40)
1520
ForEach(activityReport.apps) { eachApp in
1621
ListView(eachApp: eachApp)
1722
.padding(.horizontal, 20)
1823
}
19-
Spacer()
24+
}
25+
}
26+
}
27+
28+
struct HeaderView: View {
29+
var activityReport: ActivityReport
30+
@ObservedObject var screenTimeViewModel = ScreenTimeViewModel()
31+
32+
var body: some View {
33+
34+
VStack(alignment: .leading) {
35+
ZStack(alignment: .topLeading) {
36+
LottieView(animation: .named(activityReport.titleState.isEmpty ? "Main-A-final.json" : activityReport.titleState[0]))
37+
.playing(loopMode: .autoReverse)
38+
.resizable()
39+
VStack(alignment: .leading){
40+
Text(activityReport.titleState.isEmpty ? StringLiteral.Home.usageStatusA : activityReport.titleState[1])
41+
.font(.text1_medium_22)
42+
.foregroundStyle(.whiteText)
43+
.frame(alignment: .topLeading)
44+
.padding(EdgeInsets(top: 8,
45+
leading: 20,
46+
bottom: 0,
47+
trailing: 0))
48+
Spacer()
49+
VStack(alignment: .leading) {
50+
Text("목표 사용 시간 \(convertMillisecondsToHourString(milliseconds: activityReport.totalGoalTime))")
51+
.font(.detail4_medium_12)
52+
.foregroundStyle(.gray2)
53+
.frame(alignment: .leading)
54+
.padding(EdgeInsets(top: 0,
55+
leading: 20,
56+
bottom: 0,
57+
trailing: 0))
58+
HStack {
59+
Text("\(convertMillisecondsToHourString(milliseconds: activityReport.totalDuration)) 사용")
60+
.font(.title2_semibold_24)
61+
.foregroundStyle(.whiteText)
62+
.frame(maxWidth: .infinity, alignment: .leading)
63+
Spacer()
64+
Text(convertMillisecondsToHourString(milliseconds: activityReport.remainTime) + " 남음")
65+
.font(.detail3_semibold_12)
66+
.foregroundStyle(.whiteText)
67+
}
68+
. padding(EdgeInsets(top: 2,
69+
leading: 20,
70+
bottom: 24,
71+
trailing: 20))
72+
ProgressView(value: Double(activityReport.totalDuration), total: Double(activityReport.totalGoalTime))
73+
.foregroundStyle(.gray5)
74+
.padding(EdgeInsets(top: 0,
75+
leading: 20,
76+
bottom: 0,
77+
trailing: 20))
78+
.tint(.whiteText)
79+
}
80+
.frame(maxHeight: 83)
81+
}
82+
}
83+
}
84+
.onAppear() {
85+
if activityReport.totalDuration == activityReport.totalGoalTime {
86+
screenTimeViewModel.handleSetBlockApplication()
87+
}
88+
}
89+
}
90+
}
91+
92+
extension HeaderView {
93+
func convertMillisecondsToHourString(milliseconds: Int) -> String {
94+
let secondsTotal = milliseconds / 1000
95+
let hours = secondsTotal / 3600
96+
let minutes = (secondsTotal % 3600) / 60
97+
98+
if hours > 0 {
99+
if minutes > 0 {
100+
return "\(hours)시간 \(minutes)"
101+
} else {
102+
return "\(hours)시간"
103+
}
104+
} else {
105+
return "\(minutes)"
20106
}
21107
}
22108
}
@@ -70,5 +156,5 @@ struct ListView: View {
70156
}
71157
.frame(height: 72)
72158
}
73-
159+
74160
}

HMH_iOS/HMHDeviceActivityReport/ChallengeActivityView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import SwiftUI
99
import FamilyControls
1010

1111
struct ChallengeActivityView: View {
12-
var activityReport: ActivityReport
12+
var activityReport: ChallengeActivity
1313

1414
var body: some View {
1515
VStack(alignment: .center) {
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// ChallengeDeviceActivityReportScene.swift
3+
// HMHDeviceActivityReport
4+
//
5+
// Created by 이지희 on 6/21/24.
6+
//
7+
8+
import SwiftUI
9+
import DeviceActivity
10+
11+
struct ChallengeActivityReport: DeviceActivityReportScene {
12+
let context : DeviceActivityReport.Context = .challengeActivity
13+
let content: (ChallengeActivity) -> ChallengeActivityView
14+
15+
func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> ChallengeActivity {
16+
17+
var totalActivityDuration: Double = 0
18+
var list: [AppDeviceActivity] = []
19+
20+
/// DeviceActivityResults 데이터에서 화면에 보여주기 위해 필요한 내용을 추출해줍니다.
21+
for await eachData in data {
22+
/// 특정 시간 간격 동안 사용자의 활동
23+
for await activitySegment in eachData.activitySegments {
24+
/// 활동 세그먼트 동안 사용자의 카테고리 별 Device Activity
25+
for await categoryActivity in activitySegment.categories {
26+
/// 이 카테고리의 totalActivityDuration에 기여한 사용자의 application Activity
27+
for await applicationActivity in categoryActivity.applications {
28+
var id = 0
29+
let appName = (applicationActivity.application.localizedDisplayName ?? "nil") /// 앱 이름
30+
let bundle = (applicationActivity.application.bundleIdentifier ?? "nil") /// 앱 번들id
31+
let duration = applicationActivity.totalActivityDuration /// 앱의 total activity 기간
32+
totalActivityDuration += duration
33+
let numberOfPickups = applicationActivity.numberOfPickups /// 앱에 대해 직접적인 pickup 횟수
34+
let token = applicationActivity.application.token /// 앱의 토큰
35+
let appActivity = AppDeviceActivity(
36+
id: bundle,
37+
displayName: appName,
38+
duration: duration,
39+
remainTime: duration,
40+
numberOfPickups: numberOfPickups,
41+
token: token
42+
)
43+
list.append(appActivity)
44+
id += 1
45+
}
46+
}
47+
48+
}
49+
}
50+
51+
/// 필터링된 ActivityReport 데이터들을 반환
52+
return ChallengeActivity(totalDuration: totalActivityDuration, apps: list)
53+
}
54+
}

0 commit comments

Comments
 (0)