import 'dart:async'; import 'package:flutter/services.dart'; import '../api/oa_client.dart'; class PushBridge { PushBridge._(); static const _m = MethodChannel('com.fysxkj.oa/ota'); static const _ev = EventChannel('com.fysxkj.oa/push'); static StreamSubscription? _sub; static Future requestFirstLoginPermissions() async { try { await _m.invokeMethod('requestFirstLoginPermissions'); } catch (_) { try { await _m.invokeMethod('requestPushPermission'); } catch (_) {} } } static Future register(OaClient api) async { await requestFirstLoginPermissions(); for (var i = 0; i < 10; i++) { try { final raw = await _m.invokeMethod('getPushToken'); if (raw is Map) { final regId = '${raw['regId'] ?? ''}'; if (regId.isNotEmpty) { await api.post('/push/devices', { 'vendor': '${raw['vendor'] ?? 'vivo'}', 'regId': regId, 'brand': '${raw['brand'] ?? ''}', 'model': '${raw['model'] ?? ''}', }); return; } } } catch (_) {} await Future.delayed(const Duration(seconds: 2)); } } static Future showOnline(String title, String content, {Map extras = const {}}) async { try { await _m.invokeMethod('showOnlineNotification', {'title': title, 'content': content, 'extras': extras}); } catch (_) {} } static Future?> consumeLaunch() async { try { final raw = await _m.invokeMethod('consumeLaunchPush'); if (raw is Map) return raw.map((k, v) => MapEntry('$k', '$v')); } catch (_) {} return null; } static void listen(void Function(Map) onClick) { _sub?.cancel(); _sub = _ev.receiveBroadcastStream().listen((event) { if (event is Map) { onClick(event.map((k, v) => MapEntry('$k', '$v'))); } }); } static void stop() { _sub?.cancel(); _sub = null; } static Future?> oemStatus() async { try { final raw = await _m.invokeMethod('oemStatus'); if (raw is Map) return Map.from(raw); } catch (_) {} return null; } static Future openOemKeepAlive() async { try { await _m.invokeMethod('openOemKeepAlive'); } catch (_) {} } static Future requestBattery() async { try { await _m.invokeMethod('requestBattery'); } catch (_) {} } static Future markOemPrompted() async { try { await _m.invokeMethod('markOemPrompted'); } catch (_) {} } }