11
11
12
12
static constexpr char kChannelName [] = " flutter/platform" ;
13
13
14
+ #if defined(MOBILE) || defined(WEARABLE)
15
+ static constexpr char kUnsupportedHapticFeedbackError [] =
16
+ " HapticFeedback.vibrate() is not supported" ;
17
+ static constexpr char kPermissionDeniedHapticFeedbackError [] =
18
+ " No permission to run HapticFeedback.vibrate(). Add "
19
+ " \" http://tizen.org/privilege/feedback\" privilege to tizen-manifest.xml "
20
+ " to use this method" ;
21
+ static constexpr char kUnknownHapticFeedbackError [] =
22
+ " An unknown error on HapticFeedback.vibrate()" ;
23
+ #endif
24
+
14
25
PlatformChannel::PlatformChannel (flutter::BinaryMessenger* messenger)
15
26
: channel_(std::make_unique<flutter::MethodChannel<rapidjson::Document>>(
16
27
messenger, kChannelName , &flutter::JsonMethodCodec::GetInstance ())) {
@@ -24,6 +35,94 @@ PlatformChannel::PlatformChannel(flutter::BinaryMessenger* messenger)
24
35
25
36
PlatformChannel::~PlatformChannel () {}
26
37
38
+ #if defined(MOBILE) || defined(WEARABLE)
39
+ namespace {
40
+
41
+ class FeedbackManager {
42
+ public:
43
+ enum class ResultCode {
44
+ OK,
45
+ NOT_SUPPORTED_ERROR,
46
+ PERMISSION_DENIED_ERROR,
47
+ UNKNOWN_ERROR
48
+ };
49
+
50
+ FeedbackManager () {
51
+ FT_LOGD (" Enter FeedbackManager::FeedbackManager()" );
52
+
53
+ auto ret = feedback_initialize ();
54
+ if (FEEDBACK_ERROR_NONE != ret) {
55
+ FT_LOGD (" feedback_initialize() failed with error: [%d] (%s)" , ret,
56
+ get_error_message (ret));
57
+ return ;
58
+ }
59
+ FT_LOGD (" feedback_initialize() succeeded" );
60
+ properly_initialized_ = true ;
61
+
62
+ ret = feedback_is_supported_pattern (
63
+ FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_SIP, &vibration_supported_);
64
+ if (FEEDBACK_ERROR_NONE != ret) {
65
+ FT_LOGD (" feedback_is_supported_pattern() failed with error: [%d] (%s)" ,
66
+ ret, get_error_message (ret));
67
+ return ;
68
+ }
69
+ FT_LOGD (" feedback_is_supported_pattern() succeeded" );
70
+ }
71
+
72
+ ~FeedbackManager () {
73
+ FT_LOGD (" Enter FeedbackManager::~FeedbackManager" );
74
+
75
+ if (!properly_initialized_) {
76
+ return ;
77
+ }
78
+
79
+ auto ret = feedback_deinitialize ();
80
+ if (FEEDBACK_ERROR_NONE != ret) {
81
+ FT_LOGD (" feedback_deinitialize() failed with error: [%d] (%s)" , ret,
82
+ get_error_message (ret));
83
+ return ;
84
+ }
85
+ FT_LOGD (" feedback_deinitialize() succeeded" );
86
+ }
87
+
88
+ ResultCode Vibrate () {
89
+ FT_LOGD (" Enter FeedbackManager::Vibrate()" );
90
+
91
+ if (!properly_initialized_) {
92
+ FT_LOGD (
93
+ " Cannot run Vibrate(): FeedbackManager.properly_initialized_ is "
94
+ " false" );
95
+ return ResultCode::UNKNOWN_ERROR;
96
+ }
97
+
98
+ if (!vibration_supported_) {
99
+ FT_LOGD (" HapticFeedback.Vibrate() is not supported" );
100
+ return ResultCode::NOT_SUPPORTED_ERROR;
101
+ }
102
+
103
+ auto ret =
104
+ feedback_play_type (FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_SIP);
105
+ FT_LOGD (" feedback_play_type() returned: [%d] (%s)" , ret,
106
+ get_error_message (ret));
107
+ if (FEEDBACK_ERROR_NONE == ret) {
108
+ return ResultCode::OK;
109
+ } else if (FEEDBACK_ERROR_PERMISSION_DENIED == ret) {
110
+ return ResultCode::UNKNOWN_ERROR;
111
+ } else if (FEEDBACK_ERROR_NOT_SUPPORTED) {
112
+ return ResultCode::NOT_SUPPORTED_ERROR;
113
+ } else {
114
+ return ResultCode::UNKNOWN_ERROR;
115
+ }
116
+ }
117
+
118
+ private:
119
+ bool properly_initialized_ = false ;
120
+ bool vibration_supported_ = false ;
121
+ };
122
+
123
+ } // namespace
124
+ #endif
125
+
27
126
void PlatformChannel::HandleMethodCall (
28
127
const flutter::MethodCall<rapidjson::Document>& call,
29
128
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
@@ -35,7 +134,28 @@ void PlatformChannel::HandleMethodCall(
35
134
} else if (method == " SystemSound.play" ) {
36
135
result->NotImplemented ();
37
136
} else if (method == " HapticFeedback.vibrate" ) {
137
+ FT_LOGD (" HapticFeedback.vibrate() call received" );
138
+
139
+ #if defined(MOBILE) || defined(WEARABLE)
140
+ static FeedbackManager feedback_mgr;
141
+
142
+ auto ret = feedback_mgr.Vibrate ();
143
+ if (FeedbackManager::ResultCode::OK == ret) {
144
+ result->Success ();
145
+ return ;
146
+ }
147
+
148
+ const std::string error_message = " Could not vibrate" ;
149
+ if (FeedbackManager::ResultCode::NOT_SUPPORTED_ERROR == ret) {
150
+ result->Error (kUnsupportedHapticFeedbackError , error_message);
151
+ } else if (FeedbackManager::ResultCode::PERMISSION_DENIED_ERROR == ret) {
152
+ result->Error (kPermissionDeniedHapticFeedbackError , error_message);
153
+ } else {
154
+ result->Error (kUnknownHapticFeedbackError , error_message);
155
+ }
156
+ #else
38
157
result->NotImplemented ();
158
+ #endif
39
159
} else if (method == " Clipboard.getData" ) {
40
160
result->NotImplemented ();
41
161
} else if (method == " Clipboard.setData" ) {
0 commit comments