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

#include "chrome/browser/android/compositor/scene_layer/top_toolbar_scene_layer.h"

#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "cc/input/android/offset_tag_android.h"
#include "cc/slim/solid_color_layer.h"
#include "chrome/browser/android/compositor/layer/toolbar_layer.h"
#include "components/viz/common/quads/offset_tag.h"
#include "ui/android/resources/resource_manager_impl.h"
#include "ui/gfx/android/java_bitmap.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/browser/ui/android/toolbar/jni_headers/TopToolbarSceneLayer_jni.h"

using base::android::JavaRef;

namespace android {

TopToolbarSceneLayer::TopToolbarSceneLayer(JNIEnv* env,
                                           const JavaRef<jobject>& jobj)
    : SceneLayer(env, jobj),
      should_show_background_(false),
      background_color_(SK_ColorWHITE),
      content_container_(cc::slim::Layer::Create()) {
  layer()->AddChild(content_container_);
  layer()->SetIsDrawable(true);
}

TopToolbarSceneLayer::~TopToolbarSceneLayer() = default;

void TopToolbarSceneLayer::UpdateToolbarLayer(
    JNIEnv* env,
    const JavaRef<jobject>& jresource_manager,
    int32_t toolbar_resource_id,
    int32_t toolbar_background_color,
    int32_t url_bar_resource_id,
    int32_t url_bar_color,
    float x_offset,
    float y_offset,
    float legacy_content_offset,
    bool show_shadow,
    bool visible,
    bool anonymize,
    const base::android::JavaRef<jobject>& joffset_tag) {
  // If the toolbar layer has not been created yet, create it.
  if (!toolbar_layer_) {
    ui::ResourceManager* resource_manager =
        ui::ResourceManagerImpl::FromJavaObject(jresource_manager);
    toolbar_layer_ = ToolbarLayer::Create(resource_manager);
    toolbar_layer_->layer()->SetHideLayerAndSubtree(true);
    layer_->AddChild(toolbar_layer_->layer());
  }

  toolbar_layer_->layer()->SetHideLayerAndSubtree(!visible);
  if (!visible) {
    return;
  }

  viz::OffsetTag offset_tag = cc::android::FromJavaOffsetTag(env, joffset_tag);
  toolbar_layer_->PushResource(toolbar_resource_id, toolbar_background_color,
                               anonymize, url_bar_color, url_bar_resource_id,
                               x_offset, y_offset, legacy_content_offset, false,
                               !show_shadow, offset_tag);
}

void TopToolbarSceneLayer::UpdateProgressBar(
    JNIEnv* env,
    int32_t progress_bar_x,
    int32_t progress_bar_y,
    int32_t progress_bar_width,
    int32_t progress_bar_height,
    int32_t progress_bar_color,
    int32_t progress_bar_background_x,
    int32_t progress_bar_background_y,
    int32_t progress_bar_background_width,
    int32_t progress_bar_background_height,
    int32_t progress_bar_background_color,
    int32_t progress_bar_static_background_x,
    int32_t progress_bar_static_background_width,
    int32_t progress_bar_static_background_color,
    float corner_radius,
    bool progress_bar_visual_update_available,
    bool visible) {
  if (!toolbar_layer_)
    return;

  toolbar_layer_->UpdateProgressBar(
      progress_bar_x, progress_bar_y, progress_bar_width, progress_bar_height,
      progress_bar_color, progress_bar_background_x, progress_bar_background_y,
      progress_bar_background_width, progress_bar_background_height,
      progress_bar_background_color, progress_bar_static_background_x,
      progress_bar_static_background_width,
      progress_bar_static_background_color, corner_radius,
      progress_bar_visual_update_available, visible);
}

void TopToolbarSceneLayer::SetContentTree(
    JNIEnv* env,
    const JavaRef<jobject>& jcontent_tree) {
  SceneLayer* content_tree = FromJavaObject(env, jcontent_tree);
  if (!content_tree || !content_tree->layer())
    return;

  if (!content_tree->layer()->parent() ||
      (content_tree->layer()->parent()->id() != content_container_->id())) {
    // Clear out all the children of the container when the content changes.
    // This indicates that the layout has switched.
    content_container_->RemoveAllChildren();
    content_container_->AddChild(content_tree->layer());
  }

  // Propagate the background color up from the content layer.
  should_show_background_ = content_tree->ShouldShowBackground();
  background_color_ = content_tree->GetBackgroundColor();
}

SkColor TopToolbarSceneLayer::GetBackgroundColor() {
  return background_color_;
}

bool TopToolbarSceneLayer::ShouldShowBackground() {
  return should_show_background_;
}

static int64_t JNI_TopToolbarSceneLayer_Init(JNIEnv* env,
                                             const JavaRef<jobject>& jobj) {
  // This will automatically bind to the Java object and pass ownership there.
  TopToolbarSceneLayer* toolbar_scene_layer =
      new TopToolbarSceneLayer(env, jobj);
  return reinterpret_cast<intptr_t>(toolbar_scene_layer);
}

}  // namespace android

DEFINE_JNI(TopToolbarSceneLayer)
