Skip to content

Commit 3ac9da8

Browse files
committed
[HapticFeedback] Implement vibrate()
[Before] HapticFeedback.vibrate() was not implemented [After] The code below will cause a short vibration: HapticFeedback.vibrate() Signed-off-by: Pawel Wasowski <[email protected]>
1 parent 94bd946 commit 3ac9da8

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

shell/platform/tizen/channels/platform_channel.cc

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@
1111

1212
static constexpr char kChannelName[] = "flutter/platform";
1313

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+
1425
PlatformChannel::PlatformChannel(flutter::BinaryMessenger* messenger)
1526
: channel_(std::make_unique<flutter::MethodChannel<rapidjson::Document>>(
1627
messenger, kChannelName, &flutter::JsonMethodCodec::GetInstance())) {
@@ -24,6 +35,94 @@ PlatformChannel::PlatformChannel(flutter::BinaryMessenger* messenger)
2435

2536
PlatformChannel::~PlatformChannel() {}
2637

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+
27126
void PlatformChannel::HandleMethodCall(
28127
const flutter::MethodCall<rapidjson::Document>& call,
29128
std::unique_ptr<flutter::MethodResult<rapidjson::Document>> result) {
@@ -35,7 +134,28 @@ void PlatformChannel::HandleMethodCall(
35134
} else if (method == "SystemSound.play") {
36135
result->NotImplemented();
37136
} 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
38157
result->NotImplemented();
158+
#endif
39159
} else if (method == "Clipboard.getData") {
40160
result->NotImplemented();
41161
} else if (method == "Clipboard.setData") {

0 commit comments

Comments
 (0)