// Copyright 2018 The Cobalt Authors. 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);
}
