UI 문구 이모티콘 제거 + 계정 강제 삭제 아이콘 검정으로 통일
화면 타이틀, 스낵바/다이얼로그 메시지, 백그라운드 알림 문구 등 사용자에게 노출되는 텍스트에서 이모티콘을 전부 제거 (코드 주석은 대상 아님). 아이콘 위젯은 그대로 유지. main_dashboard.dart의 "계정 강제 삭제" 타일 아이콘 색상도 빨간색 대신 다른 타일과 동일한 검정(AppPalette.ink)으로 통일. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,8 +17,12 @@ import '../config.dart' show baseUrl;
|
||||
// 🛡️ iOS 근접센서 감시용 네이티브 채널 (ios/Runner/ProximityMonitorPlugin.swift 참고).
|
||||
// 조도 센서 API가 없는 iOS에서, 통화 중 화면이 꺼지는 것과 같은 원리인
|
||||
// 근접센서로 "주머니 안/밖" 상태 변화를 감지해 대체한다.
|
||||
const MethodChannel _proximityMethodChannel = MethodChannel('proximity_monitor');
|
||||
const EventChannel _proximityEventChannel = EventChannel('proximity_monitor/events');
|
||||
const MethodChannel _proximityMethodChannel = MethodChannel(
|
||||
'proximity_monitor',
|
||||
);
|
||||
const EventChannel _proximityEventChannel = EventChannel(
|
||||
'proximity_monitor/events',
|
||||
);
|
||||
|
||||
enum WatchMessageLevel { info, success, warning, error }
|
||||
|
||||
@@ -78,22 +82,22 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
// 화면이 열려있는 동안은 실시간으로 위반 알림을 받아 팝업을 띄운다.
|
||||
// 무단 반출이 한 번 감지되면 "신뢰된 감시 세션"은 끝난 것으로 보고,
|
||||
// 다음 태깅은 체크아웃이 아니라 새 출석(재출석)으로 처리되도록 감시 상태를 해제한다.
|
||||
_violationSub = FlutterBackgroundService().on('violation_detected').listen((
|
||||
event,
|
||||
) {
|
||||
_isWatching = false;
|
||||
notifyListeners();
|
||||
onViolationDetected(event?['pocketNumber']?.toString());
|
||||
});
|
||||
_violationSub = FlutterBackgroundService()
|
||||
.on('violation_detected')
|
||||
.listen((event) {
|
||||
_isWatching = false;
|
||||
notifyListeners();
|
||||
onViolationDetected(event?['pocketNumber']?.toString());
|
||||
});
|
||||
// 🏫 하교 처리 등으로 반출이 허용된 상태에서 폰을 꺼내면, 위반이 아니라 정상 회수로 처리된다.
|
||||
_checkedOutSub = FlutterBackgroundService().on('checked_out').listen((
|
||||
event,
|
||||
) {
|
||||
_isWatching = false;
|
||||
_activePocketNumber = null;
|
||||
_statusMessage = "✅ 폰을 회수했습니다. 수고하셨습니다!";
|
||||
_statusMessage = "폰을 회수했습니다. 수고하셨습니다!";
|
||||
notifyListeners();
|
||||
onMessage("✅ 폰이 정상적으로 회수되었습니다.", WatchMessageLevel.success);
|
||||
onMessage("폰이 정상적으로 회수되었습니다.", WatchMessageLevel.success);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -117,7 +121,7 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
void _startNfcSession() async {
|
||||
bool isAvailable = await NfcManager.instance.isAvailable();
|
||||
if (!isAvailable) {
|
||||
_statusMessage = "❌ 이 스마트폰은 NFC 기능이 꺼져있거나 지원되지 않습니다.";
|
||||
_statusMessage = "이 스마트폰은 NFC 기능이 꺼져있거나 지원되지 않습니다.";
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
@@ -134,7 +138,7 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
}
|
||||
|
||||
_isProcessing = true;
|
||||
_statusMessage = "⏳ 태그 인식 완료! 서버에 출석 전송 중...";
|
||||
_statusMessage = "태그 인식 완료! 서버에 출석 전송 중...";
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
@@ -163,7 +167,7 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
tagUid: _getTagUid(tag),
|
||||
);
|
||||
} catch (e) {
|
||||
onMessage("❌ 태그 읽기 실패: $e", WatchMessageLevel.error);
|
||||
onMessage("태그 읽기 실패: $e", WatchMessageLevel.error);
|
||||
} finally {
|
||||
// 3초 후 연타 방지 해제 (쿨다운)
|
||||
await Future.delayed(const Duration(seconds: 3));
|
||||
@@ -216,16 +220,16 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
onMessage("ℹ️ 이 기기는 백그라운드 감시를 지원하지 않습니다.", WatchMessageLevel.info);
|
||||
}
|
||||
} else {
|
||||
onMessage("⚠️ 출석 실패: ${result['message']}", WatchMessageLevel.warning);
|
||||
onMessage("출석 실패: ${result['message']}", WatchMessageLevel.warning);
|
||||
}
|
||||
} else {
|
||||
onMessage(
|
||||
"🚨 서버 에러 (코드: ${response.statusCode})",
|
||||
"서버 에러 (코드: ${response.statusCode})",
|
||||
WatchMessageLevel.error,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
onMessage("❌ 서버 연결 실패: $e", WatchMessageLevel.error);
|
||||
onMessage("서버 연결 실패: $e", WatchMessageLevel.error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,7 +259,7 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
|
||||
_isWatching = true;
|
||||
_activePocketNumber = pocketNumber;
|
||||
_statusMessage = "🛡️ 백그라운드에서 감시 중입니다. 화면을 꺼도 계속 감시돼요.";
|
||||
_statusMessage = "백그라운드에서 감시 중입니다. 화면을 꺼도 계속 감시돼요.";
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@@ -268,9 +272,9 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
}
|
||||
_isWatching = false;
|
||||
_activePocketNumber = null;
|
||||
_statusMessage = "✅ 폰을 회수했습니다. 감시가 종료되었습니다.";
|
||||
_statusMessage = "폰을 회수했습니다. 감시가 종료되었습니다.";
|
||||
notifyListeners();
|
||||
onMessage("✅ 감시가 종료되었습니다. 수고하셨습니다!", WatchMessageLevel.success);
|
||||
onMessage("감시가 종료되었습니다. 수고하셨습니다!", WatchMessageLevel.success);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
@@ -291,13 +295,13 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
|
||||
_activePocketNumber = pocketNumber;
|
||||
_isWatching = true;
|
||||
_statusMessage = "📥 주머니에 넣는 중...";
|
||||
_statusMessage = "주머니에 넣는 중...";
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
await _proximityMethodChannel.invokeMethod('start');
|
||||
} catch (e) {
|
||||
onMessage("❌ 근접센서 감시 시작 실패: $e", WatchMessageLevel.error);
|
||||
onMessage("근접센서 감시 시작 실패: $e", WatchMessageLevel.error);
|
||||
_isWatching = false;
|
||||
_isIosProximityWatch = false;
|
||||
notifyListeners();
|
||||
@@ -307,7 +311,7 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
// 학생이 폰을 주머니에 넣을 시간을 준 뒤, 그 시점 상태를 기준값으로 삼는다.
|
||||
await Future.delayed(const Duration(seconds: 4));
|
||||
|
||||
_statusMessage = "🛡️ 감시 중입니다. 화면을 잠그지 말고 주머니에 넣어주세요.";
|
||||
_statusMessage = "감시 중입니다. 화면을 잠그지 말고 주머니에 넣어주세요.";
|
||||
notifyListeners();
|
||||
|
||||
_proximitySub = _proximityEventChannel.receiveBroadcastStream().listen((
|
||||
@@ -359,9 +363,9 @@ class NfcPocketCheckinController extends ChangeNotifier {
|
||||
|
||||
if (isPermitted) {
|
||||
_activePocketNumber = null;
|
||||
_statusMessage = "✅ 폰을 회수했습니다. 수고하셨습니다!";
|
||||
_statusMessage = "폰을 회수했습니다. 수고하셨습니다!";
|
||||
notifyListeners();
|
||||
onMessage("✅ 폰이 정상적으로 회수되었습니다.", WatchMessageLevel.success);
|
||||
onMessage("폰이 정상적으로 회수되었습니다.", WatchMessageLevel.success);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user