Commit 68edda64c1cec4aab814d3f0c2038760545f91f5

Authored by 权海
1 parent b728d625

feat(ui):添加检查手表设备时附带是否已经安装了 doublefeel

@@ -83,7 +83,8 @@ class FlutterError ( @@ -83,7 +83,8 @@ class FlutterError (
83 data class WearDeviceInfo ( 83 data class WearDeviceInfo (
84 val deviceId: String? = null, 84 val deviceId: String? = null,
85 val deviceName: String? = null, 85 val deviceName: String? = null,
86 - val isConnected: Boolean? = null 86 + val isConnected: Boolean? = null,
  87 + val isWatchAppInstalled: Boolean? = null
87 ) 88 )
88 { 89 {
89 companion object { 90 companion object {
@@ -91,7 +92,8 @@ data class WearDeviceInfo ( @@ -91,7 +92,8 @@ data class WearDeviceInfo (
91 val deviceId = pigeonVar_list[0] as String? 92 val deviceId = pigeonVar_list[0] as String?
92 val deviceName = pigeonVar_list[1] as String? 93 val deviceName = pigeonVar_list[1] as String?
93 val isConnected = pigeonVar_list[2] as Boolean? 94 val isConnected = pigeonVar_list[2] as Boolean?
94 - return WearDeviceInfo(deviceId, deviceName, isConnected) 95 + val isWatchAppInstalled = pigeonVar_list[3] as Boolean?
  96 + return WearDeviceInfo(deviceId, deviceName, isConnected, isWatchAppInstalled)
95 } 97 }
96 } 98 }
97 fun toList(): List<Any?> { 99 fun toList(): List<Any?> {
@@ -99,6 +101,7 @@ data class WearDeviceInfo ( @@ -99,6 +101,7 @@ data class WearDeviceInfo (
99 deviceId, 101 deviceId,
100 deviceName, 102 deviceName,
101 isConnected, 103 isConnected,
  104 + isWatchAppInstalled,
102 ) 105 )
103 } 106 }
104 override fun equals(other: Any?): Boolean { 107 override fun equals(other: Any?): Boolean {
@@ -117,6 +117,7 @@ struct WearDeviceInfo: Hashable { @@ -117,6 +117,7 @@ struct WearDeviceInfo: Hashable {
117 var deviceId: String? = nil 117 var deviceId: String? = nil
118 var deviceName: String? = nil 118 var deviceName: String? = nil
119 var isConnected: Bool? = nil 119 var isConnected: Bool? = nil
  120 + var isWatchAppInstalled: Bool? = nil
120 121
121 122
122 // swift-format-ignore: AlwaysUseLowerCamelCase 123 // swift-format-ignore: AlwaysUseLowerCamelCase
@@ -124,11 +125,13 @@ struct WearDeviceInfo: Hashable { @@ -124,11 +125,13 @@ struct WearDeviceInfo: Hashable {
124 let deviceId: String? = nilOrValue(pigeonVar_list[0]) 125 let deviceId: String? = nilOrValue(pigeonVar_list[0])
125 let deviceName: String? = nilOrValue(pigeonVar_list[1]) 126 let deviceName: String? = nilOrValue(pigeonVar_list[1])
126 let isConnected: Bool? = nilOrValue(pigeonVar_list[2]) 127 let isConnected: Bool? = nilOrValue(pigeonVar_list[2])
  128 + let isWatchAppInstalled: Bool? = nilOrValue(pigeonVar_list[3])
127 129
128 return WearDeviceInfo( 130 return WearDeviceInfo(
129 deviceId: deviceId, 131 deviceId: deviceId,
130 deviceName: deviceName, 132 deviceName: deviceName,
131 - isConnected: isConnected 133 + isConnected: isConnected,
  134 + isWatchAppInstalled: isWatchAppInstalled
132 ) 135 )
133 } 136 }
134 func toList() -> [Any?] { 137 func toList() -> [Any?] {
@@ -136,6 +139,7 @@ struct WearDeviceInfo: Hashable { @@ -136,6 +139,7 @@ struct WearDeviceInfo: Hashable {
136 deviceId, 139 deviceId,
137 deviceName, 140 deviceName,
138 isConnected, 141 isConnected,
  142 + isWatchAppInstalled,
139 ] 143 ]
140 } 144 }
141 static func == (lhs: WearDeviceInfo, rhs: WearDeviceInfo) -> Bool { 145 static func == (lhs: WearDeviceInfo, rhs: WearDeviceInfo) -> Bool {
1 -# 使用前注意: 需要先将主项目和lovenote-flutter放到同一路径下  
2 -SOURCE_DIR="./SDK/iOS_SDK" 1 +#!/bin/bash
3 2
4 -# 目标目录,绝对路径  
5 -TARGET_DIR="../hippo/PodLocal/Flutter/SDK" 3 +set -euo pipefail
6 4
7 -# 检查目标目录是否存在  
8 -if [ -d "$TARGET_DIR" ]; then  
9 - echo "目标目录已存在,正在替换..."  
10 - rm -rf "$TARGET_DIR" 5 +# 使用前注意:doublefeel_flutter 和 hippo 需要位于同一目录下。
  6 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  7 +SOURCE_SDK_DIR="$SCRIPT_DIR/SDK/iOS_SDK"
  8 +SOURCE_RUNNER_DIR="$SCRIPT_DIR/ios/Runner"
  9 +
  10 +HIPPO_PROJECT_DIR="$SCRIPT_DIR/../hippo/hippo"
  11 +TARGET_SDK_DIR="$SCRIPT_DIR/../hippo/PodLocal/Flutter/SDK"
  12 +TARGET_PIGEON_DIR="$HIPPO_PROJECT_DIR/Pigeon"
  13 +
  14 +if [ ! -d "$SOURCE_SDK_DIR" ]; then
  15 + echo "iOS SDK目录不存在:$SOURCE_SDK_DIR"
  16 + exit 1
  17 +fi
  18 +
  19 +if [ ! -d "$HIPPO_PROJECT_DIR" ]; then
  20 + echo "hippo项目目录不存在:$HIPPO_PROJECT_DIR"
  21 + exit 1
  22 +fi
  23 +
  24 +if [ -d "$TARGET_SDK_DIR" ]; then
  25 + echo "目标SDK目录已存在,正在替换..."
  26 + rm -rf "$TARGET_SDK_DIR"
11 else 27 else
12 - echo "目标目录不存在,正在新增..." 28 + echo "目标SDK目录不存在,正在新增..."
13 fi 29 fi
14 30
15 -# 复制源目录到目标目录  
16 -cp -r "$SOURCE_DIR" "$TARGET_DIR" 31 +mkdir -p "$(dirname "$TARGET_SDK_DIR")" "$TARGET_PIGEON_DIR"
  32 +cp -R "$SOURCE_SDK_DIR" "$TARGET_SDK_DIR"
  33 +
  34 +echo "正在复制GeneratedPluginRegistrant文件..."
  35 +cp -f \
  36 + "$SOURCE_RUNNER_DIR/GeneratedPluginRegistrant.h" \
  37 + "$SOURCE_RUNNER_DIR/GeneratedPluginRegistrant.m" \
  38 + "$HIPPO_PROJECT_DIR/"
  39 +
  40 +echo "正在复制Pigeon Api文件..."
  41 +pigeon_api_files=("$SOURCE_RUNNER_DIR"/Pigeon/*Api.swift)
  42 +if [ ! -e "${pigeon_api_files[0]}" ]; then
  43 + echo "未找到Pigeon Api文件:$SOURCE_RUNNER_DIR/Pigeon/*Api.swift"
  44 + exit 1
  45 +fi
  46 +cp -f "${pigeon_api_files[@]}" "$TARGET_PIGEON_DIR/"
17 47
18 echo "操作完成。" 48 echo "操作完成。"
1 import 'dart:async'; 1 import 'dart:async';
2 2
3 import 'package:doublefeel_flutter/app/routes/app_pages.dart'; 3 import 'package:doublefeel_flutter/app/routes/app_pages.dart';
  4 +import 'package:doublefeel_flutter/core/constants/intent_keys.dart';
4 import 'package:doublefeel_flutter/core/network/api/theme_api.dart'; 5 import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
5 import 'package:doublefeel_flutter/core/network/api/vip_api.dart'; 6 import 'package:doublefeel_flutter/core/network/api/vip_api.dart';
6 import 'package:doublefeel_flutter/core/result/app_result.dart'; 7 import 'package:doublefeel_flutter/core/result/app_result.dart';
@@ -91,7 +92,7 @@ class WatchThemeController extends GetxController { @@ -91,7 +92,7 @@ class WatchThemeController extends GetxController {
91 92
92 Future<void> _toPremiumPage() async { 93 Future<void> _toPremiumPage() async {
93 await Get.toNamed(Routes.PURCHASE, arguments: { 94 await Get.toNamed(Routes.PURCHASE, arguments: {
94 - 'channel_type': '表盘主题', 95 + IntentKeys.channelType: '表盘主题',
95 }); 96 });
96 await _refreshVip(); 97 await _refreshVip();
97 } 98 }
@@ -35,6 +35,7 @@ class WearDeviceInfo { @@ -35,6 +35,7 @@ class WearDeviceInfo {
35 this.deviceId, 35 this.deviceId,
36 this.deviceName, 36 this.deviceName,
37 this.isConnected, 37 this.isConnected,
  38 + this.isWatchAppInstalled,
38 }); 39 });
39 40
40 String? deviceId; 41 String? deviceId;
@@ -43,11 +44,14 @@ class WearDeviceInfo { @@ -43,11 +44,14 @@ class WearDeviceInfo {
43 44
44 bool? isConnected; 45 bool? isConnected;
45 46
  47 + bool? isWatchAppInstalled;
  48 +
46 List<Object?> _toList() { 49 List<Object?> _toList() {
47 return <Object?>[ 50 return <Object?>[
48 deviceId, 51 deviceId,
49 deviceName, 52 deviceName,
50 isConnected, 53 isConnected,
  54 + isWatchAppInstalled,
51 ]; 55 ];
52 } 56 }
53 57
@@ -60,6 +64,7 @@ class WearDeviceInfo { @@ -60,6 +64,7 @@ class WearDeviceInfo {
60 deviceId: result[0] as String?, 64 deviceId: result[0] as String?,
61 deviceName: result[1] as String?, 65 deviceName: result[1] as String?,
62 isConnected: result[2] as bool?, 66 isConnected: result[2] as bool?,
  67 + isWatchAppInstalled: result[3] as bool?,
63 ); 68 );
64 } 69 }
65 70
@@ -5,11 +5,13 @@ class WearDeviceInfo { @@ -5,11 +5,13 @@ class WearDeviceInfo {
5 this.deviceId, 5 this.deviceId,
6 this.deviceName, 6 this.deviceName,
7 this.isConnected, 7 this.isConnected,
  8 + this.isWatchAppInstalled,
8 }); 9 });
9 10
10 String? deviceId; 11 String? deviceId;
11 String? deviceName; 12 String? deviceName;
12 bool? isConnected; 13 bool? isConnected;
  14 + bool? isWatchAppInstalled;
13 } 15 }
14 16
15 @ConfigurePigeon( 17 @ConfigurePigeon(