// Copyright 2018 Samsung Electronics. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/contrib/tizen/shared/wayland/window_internal_tizen.h"

#include "starboard/shared/wayland/application_wayland.h"

static void WindowCbVisibilityChange(void* data,
                                     struct tizen_visibility* tizen_visibility
                                         EINA_UNUSED,
                                     uint32_t visibility) {
#if SB_HAS(LAZY_SUSPEND)
  if (visibility == TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED)
    ApplicationWayland::Get()->Pause(NULL, NULL);
  else
    ApplicationWayland::Get()->Unpause(NULL, NULL);
#else
  if (visibility == TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED)
    starboard::shared::starboard::Application::Get()->Suspend(NULL, NULL);
  else
    starboard::shared::starboard::Application::Get()->Unpause(NULL, NULL);
#endif
}

static const struct tizen_visibility_listener tizen_visibility_listener = {
    WindowCbVisibilityChange};

SbWindowPrivateTizen::SbWindowPrivateTizen(wl_display* display,
                                           tizen_policy* policy,
                                           wl_compositor* compositor,
                                           wl_shell* shell,
                                           const SbWindowOptions* options,
                                           float pixel_ratio)
    : SbWindowPrivate(compositor, shell, options, pixel_ratio) {
#if SB_CAN(USE_WAYLAND_VIDEO_WINDOW)
  video_window = display;
#else
  video_window = elm_win_add(NULL, "Cobalt_Video", ELM_WIN_BASIC);
  elm_win_title_set(video_window, "Cobalt_Video");
  elm_win_autodel_set(video_window, EINA_TRUE);
  evas_object_resize(video_window, width, height);
  evas_object_hide(video_window);
#endif
  tz_policy = policy;
  tz_visibility = tizen_policy_get_visibility(tz_policy, surface);
  tizen_visibility_add_listener(tz_visibility, &tizen_visibility_listener,
                                this);
  tizen_policy_activate(tz_policy, surface);
}

SbWindowPrivateTizen::~SbWindowPrivateTizen() {
#if !SB_CAN(USE_WAYLAND_VIDEO_WINDOW)
  evas_object_hide(video_window);
#endif
  video_window = NULL;
  tizen_visibility_destroy(tz_visibility);
}

void SbWindowPrivateTizen::WindowRaise() {
  SbWindowPrivate::WindowRaise();
  if (tz_policy)
    tizen_policy_raise(tz_policy, surface);
}
