Skip to content

Commit e72a4b2

Browse files
authored
Add TizenView::Unfocus() method (#352)
* When Unfocus() is called, the view no longer handles key-events. As a result the keyboard focus can be removed from the view. * Now, if a backkey is pressed when the navigation stack is empty, the view loses keyboard focus by Platform channel with TizenViewElementary. Signed-off-by: Boram Bae <[email protected]>
1 parent 3e27c1f commit e72a4b2

File tree

8 files changed

+39
-21
lines changed

8 files changed

+39
-21
lines changed

shell/platform/tizen/channels/platform_channel.cc

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include "flutter/shell/platform/tizen/channels/tizen_shell.h"
1515
#endif
1616
#include "flutter/shell/platform/tizen/logger.h"
17+
#include "flutter/shell/platform/tizen/tizen_view.h"
18+
#include "flutter/shell/platform/tizen/tizen_window.h"
1719

1820
namespace flutter {
1921

@@ -62,12 +64,12 @@ std::string text_clipboard = "";
6264
} // namespace
6365

6466
PlatformChannel::PlatformChannel(BinaryMessenger* messenger,
65-
TizenWindow* window)
67+
TizenViewBase* view)
6668
: channel_(std::make_unique<MethodChannel<rapidjson::Document>>(
6769
messenger,
6870
kChannelName,
6971
&JsonMethodCodec::GetInstance())),
70-
window_(window) {
72+
view_(view) {
7173
channel_->SetMethodCallHandler(
7274
[this](const MethodCall<rapidjson::Document>& call,
7375
std::unique_ptr<MethodResult<rapidjson::Document>> result) {
@@ -156,8 +158,10 @@ void PlatformChannel::HandleMethodCall(
156158
}
157159

158160
void PlatformChannel::SystemNavigatorPop() {
159-
if (window_) {
161+
if (view_->GetType() == TizenViewType::kWindow) {
160162
ui_app_exit();
163+
} else {
164+
reinterpret_cast<TizenView*>(view_)->Unfocus();
161165
}
162166
}
163167

@@ -174,13 +178,13 @@ void PlatformChannel::HapticFeedbackVibrate(const std::string& feedback_type) {
174178
}
175179

176180
void PlatformChannel::RestoreSystemUiOverlays() {
177-
if (!window_) {
181+
if (view_->GetType() != TizenViewType::kWindow) {
178182
return;
179183
}
180184

181185
#ifdef COMMON_PROFILE
182186
auto& shell = TizenShell::GetInstance();
183-
shell.InitializeSoftkey(window_->GetWindowId());
187+
shell.InitializeSoftkey(view_->GetWindowId());
184188

185189
if (shell.IsSoftkeyShown()) {
186190
shell.ShowSoftkey();
@@ -192,13 +196,13 @@ void PlatformChannel::RestoreSystemUiOverlays() {
192196

193197
void PlatformChannel::SetEnabledSystemUiOverlays(
194198
const std::vector<std::string>& overlays) {
195-
if (!window_) {
199+
if (view_->GetType() != TizenViewType::kWindow) {
196200
return;
197201
}
198202

199203
#ifdef COMMON_PROFILE
200204
auto& shell = TizenShell::GetInstance();
201-
shell.InitializeSoftkey(window_->GetWindowId());
205+
shell.InitializeSoftkey(view_->GetWindowId());
202206

203207
if (std::find(overlays.begin(), overlays.end(), kSystemUiOverlayBottom) !=
204208
overlays.end()) {
@@ -211,7 +215,7 @@ void PlatformChannel::SetEnabledSystemUiOverlays(
211215

212216
void PlatformChannel::SetPreferredOrientations(
213217
const std::vector<std::string>& orientations) {
214-
if (!window_) {
218+
if (view_->GetType() != TizenViewType::kWindow) {
215219
return;
216220
}
217221

@@ -230,7 +234,7 @@ void PlatformChannel::SetPreferredOrientations(
230234
// default.
231235
rotations = {0, 90, 180, 270};
232236
}
233-
window_->SetPreferredOrientations(rotations);
237+
reinterpret_cast<TizenWindow*>(view_)->SetPreferredOrientations(rotations);
234238
}
235239

236240
} // namespace flutter

shell/platform/tizen/channels/platform_channel.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111

1212
#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"
1313
#include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h"
14-
#include "flutter/shell/platform/tizen/tizen_window.h"
14+
#include "flutter/shell/platform/tizen/tizen_view_base.h"
1515
#include "rapidjson/document.h"
1616

1717
namespace flutter {
1818

1919
class PlatformChannel {
2020
public:
21-
explicit PlatformChannel(BinaryMessenger* messenger, TizenWindow* window);
21+
explicit PlatformChannel(BinaryMessenger* messenger, TizenViewBase* view);
2222
virtual ~PlatformChannel();
2323

2424
private:
@@ -35,9 +35,8 @@ class PlatformChannel {
3535

3636
std::unique_ptr<MethodChannel<rapidjson::Document>> channel_;
3737

38-
// A reference to the window object managed by FlutterTizenView.
39-
// This can be nullptr if the engine is running in headless mode.
40-
TizenWindow* window_;
38+
// A reference to the native view managed by FlutterTizenView.
39+
TizenViewBase* view_;
4140
};
4241

4342
} // namespace flutter

shell/platform/tizen/channels/window_channel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class WindowChannel {
2626

2727
std::unique_ptr<MethodChannel<EncodableValue>> channel_;
2828

29-
// A reference to the renderer object managed by FlutterTizenView.
29+
// A reference to the native window managed by FlutterTizenView.
3030
TizenWindow* window_;
3131
};
3232

shell/platform/tizen/flutter_tizen_view.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,12 @@ void FlutterTizenView::SetEngine(std::unique_ptr<FlutterTizenEngine> engine) {
7575

7676
if (tizen_view_->GetType() == TizenViewType::kWindow) {
7777
auto* window = reinterpret_cast<TizenWindow*>(tizen_view_.get());
78-
platform_channel_ = std::make_unique<PlatformChannel>(messenger, window);
7978
window_channel_ = std::make_unique<WindowChannel>(messenger, window);
8079
} else {
81-
platform_channel_ = std::make_unique<PlatformChannel>(messenger, nullptr);
8280
window_channel_ = std::make_unique<WindowChannel>(messenger, nullptr);
8381
}
84-
82+
platform_channel_ =
83+
std::make_unique<PlatformChannel>(messenger, tizen_view_.get());
8584
text_input_channel_ = std::make_unique<TextInputChannel>(
8685
internal_plugin_registrar_->messenger(),
8786
tizen_view_->input_method_context());

shell/platform/tizen/tizen_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@ class TizenView : public TizenViewBase {
2020

2121
TizenViewType GetType() override { return TizenViewType::kView; };
2222

23+
void Unfocus() { focused_ = false; };
24+
2325
protected:
2426
explicit TizenView(int32_t width, int32_t height)
2527
: initial_width_(width), initial_height_(height) {}
2628

2729
int32_t initial_width_ = 0;
2830
int32_t initial_height_ = 0;
31+
bool focused_ = false;
2932
};
3033

3134
} // namespace flutter

shell/platform/tizen/tizen_view_elementary.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void TizenViewElementary::RegisterEventHandlers() {
243243
void* event_info) {
244244
auto* self = reinterpret_cast<TizenViewElementary*>(data);
245245
if (self->view_delegate_) {
246-
if (self->event_layer_ == object) {
246+
if (self->event_layer_ == object && self->focused_) {
247247
auto* key_event = reinterpret_cast<Evas_Event_Key_Down*>(event_info);
248248
bool handled = false;
249249
key_event->event_flags =
@@ -269,7 +269,7 @@ void TizenViewElementary::RegisterEventHandlers() {
269269
[](void* data, Evas* evas, Evas_Object* object, void* event_info) {
270270
auto* self = reinterpret_cast<TizenViewElementary*>(data);
271271
if (self->view_delegate_) {
272-
if (self->event_layer_ == object) {
272+
if (self->event_layer_ == object && self->focused_) {
273273
auto* key_event = reinterpret_cast<Evas_Event_Key_Up*>(event_info);
274274
bool handled = false;
275275
key_event->event_flags = Evas_Event_Flags(key_event->event_flags |
@@ -290,6 +290,17 @@ void TizenViewElementary::RegisterEventHandlers() {
290290
evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_KEY_UP,
291291
evas_object_callbacks_[EVAS_CALLBACK_KEY_UP],
292292
this);
293+
294+
focused_callback_ = [](void* data, Evas_Object* object, void* event_info) {
295+
auto* self = reinterpret_cast<TizenViewElementary*>(data);
296+
if (self->view_delegate_) {
297+
if (self->event_layer_ == object) {
298+
self->focused_ = true;
299+
}
300+
}
301+
};
302+
evas_object_smart_callback_add(event_layer_, "focused", focused_callback_,
303+
this);
293304
}
294305

295306
void TizenViewElementary::UnregisterEventHandlers() {
@@ -312,6 +323,7 @@ void TizenViewElementary::UnregisterEventHandlers() {
312323
evas_object_callbacks_[EVAS_CALLBACK_KEY_DOWN]);
313324
evas_object_event_callback_del(event_layer_, EVAS_CALLBACK_KEY_UP,
314325
evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]);
326+
evas_object_smart_callback_del(event_layer_, "focused", focused_callback_);
315327
}
316328

317329
TizenGeometry TizenViewElementary::GetGeometry() {

shell/platform/tizen/tizen_view_elementary.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class TizenViewElementary : public TizenView {
5656
std::unordered_map<Evas_Callback_Type, Evas_Object_Event_Cb>
5757
evas_object_callbacks_;
5858
std::vector<Ecore_Event_Handler*> ecore_event_key_handlers_;
59+
Evas_Smart_Cb focused_callback_ = nullptr;
5960

6061
bool scroll_hold_ = false;
6162
};

shell/platform/tizen/tizen_window_elementary.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class TizenWindowElementary : public TizenWindow {
6565
Evas_Object* elm_win_ = nullptr;
6666
Evas_Object* image_ = nullptr;
6767

68-
Evas_Smart_Cb rotation_changed_callback_;
68+
Evas_Smart_Cb rotation_changed_callback_ = nullptr;
6969
std::unordered_map<Evas_Callback_Type, Evas_Object_Event_Cb>
7070
evas_object_callbacks_;
7171
};

0 commit comments

Comments
 (0)