// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/android/display_android_manager.h"

#include <jni.h>
#include <map>

#include "base/android/jni_android.h"
#include "base/stl_util.h"
#include "jni/DisplayAndroidManager_jni.h"
#include "ui/android/screen_android.h"
#include "ui/android/window_android.h"
#include "ui/display/display.h"

namespace ui {

using base::android::AttachCurrentThread;
using display::Display;
using display::DisplayList;

void SetScreenAndroid() {
  // Do not override existing Screen.
  DCHECK_EQ(display::Screen::GetScreen(), nullptr);

  DisplayAndroidManager* manager = new DisplayAndroidManager();
  display::Screen::SetScreenInstance(manager);

  JNIEnv* env = AttachCurrentThread();
  Java_DisplayAndroidManager_onNativeSideCreated(env, (jlong)manager);
}

bool RegisterScreenAndroid(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

DisplayAndroidManager::DisplayAndroidManager() {}

DisplayAndroidManager::~DisplayAndroidManager() {}

// Screen interface.

Display DisplayAndroidManager::GetDisplayNearestWindow(
    gfx::NativeView view) const {
  ui::WindowAndroid* window = view ? view->GetWindowAndroid() : nullptr;
  if (window) {
    DisplayList::Displays::const_iterator it =
        display_list().FindDisplayById(window->display_id());
    if (it != display_list().displays().end()) {
      return *it;
    }
  }
  return GetPrimaryDisplay();
}

// There is no notion of relative display positions on Android.
Display DisplayAndroidManager::GetDisplayNearestPoint(
    const gfx::Point& point) const {
  NOTIMPLEMENTED();
  return GetPrimaryDisplay();
}

// There is no notion of relative display positions on Android.
Display DisplayAndroidManager::GetDisplayMatching(
    const gfx::Rect& match_rect) const {
  NOTIMPLEMENTED();
  return GetPrimaryDisplay();
}

// Methods called from Java

void DisplayAndroidManager::UpdateDisplay(
    JNIEnv* env,
    const base::android::JavaParamRef<jobject>& jobject,
    jint sdkDisplayId,
    jint physicalWidth,
    jint physicalHeight,
    jint width,
    jint height,
    jfloat dipScale,
    jint rotationDegrees,
    jint bitsPerPixel,
    jint bitsPerComponent) {
  gfx::Rect bounds_in_pixels = gfx::Rect(physicalWidth, physicalHeight);

  // Physical width and height might be not supported.
  if (bounds_in_pixels.IsEmpty())
    bounds_in_pixels = gfx::Rect(width, height);

  const gfx::Rect bounds_in_dip = gfx::Rect(
      gfx::ScaleToCeiledSize(bounds_in_pixels.size(), 1.0f / dipScale));

  display::Display display(sdkDisplayId, bounds_in_dip);
  if (!Display::HasForceDeviceScaleFactor())
    display.set_device_scale_factor(dipScale);

  display.set_size_in_pixels(bounds_in_pixels.size());
  display.SetRotationAsDegree(rotationDegrees);
  display.set_color_depth(bitsPerPixel);
  display.set_depth_per_component(bitsPerComponent);
  display.set_is_monochrome(bitsPerComponent == 0);

  ProcessDisplayChanged(display, sdkDisplayId == primary_display_id_);
}

void DisplayAndroidManager::RemoveDisplay(
    JNIEnv* env,
    const base::android::JavaParamRef<jobject>& jobject,
    jint sdkDisplayId) {
  display_list().RemoveDisplay(sdkDisplayId);
}

void DisplayAndroidManager::SetPrimaryDisplayId(
    JNIEnv* env,
    const base::android::JavaParamRef<jobject>& jobject,
    jint sdkDisplayId) {
  primary_display_id_ = sdkDisplayId;
}

}  // namespace ui
