Commit ed605492cef12a5642cdef450b2e55c9b15136ba

Authored by 权海
1 parent 505ab008

feat(ui):增加表盘添加接口,对应直接添加表盘

... ... @@ -141,6 +141,8 @@ interface WearEngineHostApi {
fun checkConnectedDevice(): WearDeviceInfo?
fun registerMessageReceiver(): Boolean
fun sendTextMessage(message: String): Boolean
/** 添加表盘 */
fun addWatchSurface(callback: (Result<Boolean>) -> Unit)
fun sendWatchSyncPayload(jsonPayload: String, callback: (Result<Boolean>) -> Unit)
/**
* Opens the system photo picker and returns a local PNG file path after
... ... @@ -222,6 +224,24 @@ interface WearEngineHostApi {
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.addWatchSurface$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
api.addWatchSurface{ result: Result<Boolean> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(WearEngineApiPigeonUtils.wrapError(error))
} else {
val data = result.getOrNull()
reply.reply(WearEngineApiPigeonUtils.wrapResult(data))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.sendWatchSyncPayload$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
... ...
... ... @@ -215,66 +215,22 @@ struct HealthSleepUploadDataPoint: Hashable {
struct HealthActivityTargetData: Hashable {
var move: Int64? = nil
var stand: Int64? = nil
var activityMoveMode: Int64? = nil
var activeEnergyBurned: Double? = nil
var activeEnergyBurnedGoal: Double? = nil
var appleMoveTime: Double? = nil
var appleMoveTimeGoal: Double? = nil
var appleExerciseTime: Double? = nil
var appleExerciseTimeGoal: Double? = nil
var exerciseTimeGoal: Double? = nil
var appleStandHours: Double? = nil
var appleStandHoursGoal: Double? = nil
var standHoursGoal: Double? = nil
// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ pigeonVar_list: [Any?]) -> HealthActivityTargetData? {
let move: Int64? = nilOrValue(pigeonVar_list[0])
let stand: Int64? = nilOrValue(pigeonVar_list[1])
let activityMoveMode: Int64? = nilOrValue(pigeonVar_list[2])
let activeEnergyBurned: Double? = nilOrValue(pigeonVar_list[3])
let activeEnergyBurnedGoal: Double? = nilOrValue(pigeonVar_list[4])
let appleMoveTime: Double? = nilOrValue(pigeonVar_list[5])
let appleMoveTimeGoal: Double? = nilOrValue(pigeonVar_list[6])
let appleExerciseTime: Double? = nilOrValue(pigeonVar_list[7])
let appleExerciseTimeGoal: Double? = nilOrValue(pigeonVar_list[8])
let exerciseTimeGoal: Double? = nilOrValue(pigeonVar_list[9])
let appleStandHours: Double? = nilOrValue(pigeonVar_list[10])
let appleStandHoursGoal: Double? = nilOrValue(pigeonVar_list[11])
let standHoursGoal: Double? = nilOrValue(pigeonVar_list[12])
return HealthActivityTargetData(
move: move,
stand: stand,
activityMoveMode: activityMoveMode,
activeEnergyBurned: activeEnergyBurned,
activeEnergyBurnedGoal: activeEnergyBurnedGoal,
appleMoveTime: appleMoveTime,
appleMoveTimeGoal: appleMoveTimeGoal,
appleExerciseTime: appleExerciseTime,
appleExerciseTimeGoal: appleExerciseTimeGoal,
exerciseTimeGoal: exerciseTimeGoal,
appleStandHours: appleStandHours,
appleStandHoursGoal: appleStandHoursGoal,
standHoursGoal: standHoursGoal
stand: stand
)
}
func toList() -> [Any?] {
return [
move,
stand,
activityMoveMode,
activeEnergyBurned,
activeEnergyBurnedGoal,
appleMoveTime,
appleMoveTimeGoal,
appleExerciseTime,
appleExerciseTimeGoal,
exerciseTimeGoal,
appleStandHours,
appleStandHoursGoal,
standHoursGoal,
]
}
static func == (lhs: HealthActivityTargetData, rhs: HealthActivityTargetData) -> Bool {
... ...
... ... @@ -188,6 +188,8 @@ protocol WearEngineHostApi {
func checkConnectedDevice() throws -> WearDeviceInfo?
func registerMessageReceiver() throws -> Bool
func sendTextMessage(message: String) throws -> Bool
/// 添加表盘
func addWatchSurface(completion: @escaping (Result<Bool, Error>) -> Void)
func sendWatchSyncPayload(jsonPayload: String, completion: @escaping (Result<Bool, Error>) -> Void)
/// Opens the system photo picker and returns a local PNG file path after
/// removing the image background on the host platform.
... ... @@ -256,6 +258,22 @@ class WearEngineHostApiSetup {
} else {
sendTextMessageChannel.setMessageHandler(nil)
}
/// 添加表盘
let addWatchSurfaceChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.addWatchSurface\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
addWatchSurfaceChannel.setMessageHandler { _, reply in
api.addWatchSurface { result in
switch result {
case .success(let res):
reply(wrapResult(res))
case .failure(let error):
reply(wrapError(error))
}
}
}
} else {
addWatchSurfaceChannel.setMessageHandler(nil)
}
let sendWatchSyncPayloadChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.sendWatchSyncPayload\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
sendWatchSyncPayloadChannel.setMessageHandler { message, reply in
... ...
... ... @@ -5,9 +5,14 @@ import Vision
enum ImageProcessError: Error{
case invalidatePath
case noWatchFound
}
final class WearEngineHostApiImpl: WearEngineHostApi {
func addWatchSurface(completion: @escaping (Result<Bool, any Error>) -> Void) {
completion(.failure(ImageProcessError.noWatchFound))
}
func hasInstalledWatchSurface(completion: @escaping (Result<Bool, any Error>) -> Void) {
// iOS does not expose the user's active watch face. The closest
// supported equivalent is a paired Apple Watch with this Watch App installed.
... ...
... ... @@ -152,10 +152,11 @@ class CustomWatchThemePreviewController extends GetxController {
);
return;
}
bool success = await PlatformHostApi().nativeHandleUrl("itms-watchs://");
if (!success) {
await PlatformHostApi().nativeHandleUrl("itms-watch://");
try {
await WearEngineHostApi().addWatchSurface();
await PlatformHostApi().nativeHandleUrl("itms-watchs://");
} catch (e) {
AppToast.show(e.toString());
}
}
... ...
... ... @@ -124,9 +124,11 @@ class WatchThemePreviewController extends GetxController {
return;
}
bool success = await PlatformHostApi().nativeHandleUrl("itms-watchs://");
if (!success) {
await PlatformHostApi().nativeHandleUrl("itms-watch://");
try {
await WearEngineHostApi().addWatchSurface();
await PlatformHostApi().nativeHandleUrl("itms-watchs://");
} catch (e) {
AppToast.show(e.toString());
}
}
... ...
... ... @@ -228,6 +228,35 @@ class WearEngineHostApi {
}
}
/// 添加表盘
Future<bool> addWatchSurface() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.addWatchSurface$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else if (pigeonVar_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as bool?)!;
}
}
Future<bool> sendWatchSyncPayload(String jsonPayload) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.doublefeel_flutter.WearEngineHostApi.sendWatchSyncPayload$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
... ...
... ... @@ -38,6 +38,10 @@ abstract class WearEngineHostApi {
bool sendTextMessage(String message);
/// 添加表盘
@async
bool addWatchSurface();
@async
bool sendWatchSyncPayload(String jsonPayload);
... ...