910e62b5创建于 1月15日历史提交
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TITLE_CACHE_H_
#define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TITLE_CACHE_H_

#include <jni.h>

#include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h"
#include "base/containers/id_map.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "cc/resources/ui_resource_client.h"
#include "components/tab_groups/tab_group_id.h"

namespace cc::slim {
class Layer;
}

namespace ui {
class ResourceManager;
}

namespace android {

class DecorationTabTitle;
class DecorationIconTitle;

// A native component of the Java LayerTitleCache class.  This class
// will build and maintain layers that represent the cached titles in
// the Java class.
class LayerTitleCache {
 public:
  static LayerTitleCache* FromJavaObject(
      const base::android::JavaRef<jobject>& jobj);

  LayerTitleCache(JNIEnv* env,
                  const jni_zero::JavaRef<jobject>& obj,
                  jint fade_width,
                  jint icon_start_padding,
                  jint icon_end_padding,
                  jint spinner_resource_id,
                  jint spinner_incognito_resource_id,
                  jint bubble_inner_dimension,
                  jint bubble_outer_dimension,
                  jint bubble_offset,
                  jint bubble_inner_tint,
                  jint bubble_outer_tint,
                  ui::ResourceManager* resource_manager);

  LayerTitleCache(const LayerTitleCache&) = delete;
  LayerTitleCache& operator=(const LayerTitleCache&) = delete;

  void Destroy(JNIEnv* env);

  // Called from Java, updates a native cc::slim::Layer based on the new texture
  // information.
  void UpdateLayer(JNIEnv* env,
                   jint tab_id,
                   jint title_resource_id,
                   jint icon_resource_id,
                   bool is_incognito,
                   bool is_rtl,
                   bool show_bubble);

  // Called from Java, updates a native cc::slim::Layer based on the new texture
  // information.
  void UpdateGroupLayer(JNIEnv* env,
                        const base::android::JavaParamRef<jobject>& group_token,
                        jint title_resource_id,
                        jint avatar_resource_id,
                        jint avatar_padding,
                        bool is_incognito,
                        bool is_rtl);

  // Called from Java, updates icon.
  void UpdateIcon(JNIEnv* env,
                  jint tab_id,
                  jint icon_resource_id,
                  bool show_bubble);

  // Called from Java, updates tab bubble if a shared tab is updated by
  // collaborators.
  void UpdateTabBubble(JNIEnv* env,
                       jint tab_id,
                       bool show_bubble);

  // Returns the layer that represents the title of tab of tab_id.
  // Returns NULL if no layer can be found.
  DecorationTabTitle* GetTitleLayer(int tab_id);

  // Returns the layer that represents the title of group of group_token.
  // Returns NULL if no layer can be found.
  DecorationIconTitle* GetGroupTitleLayer(
      const tab_groups::TabGroupId& group_token,
      bool incognito);

 private:
  const int kEmptyWidth = 0;

  virtual ~LayerTitleCache();

  base::IDMap<std::unique_ptr<DecorationTabTitle>> layer_cache_;
  std::unordered_map<tab_groups::TabGroupId,
                     std::unique_ptr<DecorationIconTitle>,
                     tab_groups::TabGroupIdHash>
      group_layer_cache_;

  JavaObjectWeakGlobalRef weak_java_title_cache_;
  int fade_width_;
  int icon_start_padding_;
  int icon_end_padding_;

  int spinner_resource_id_;
  int spinner_incognito_resource_id_;

  int bubble_inner_dimension_;
  int bubble_outer_dimension_;
  int bubble_offset_;
  int bubble_inner_tint_;
  int bubble_outer_tint_;

  raw_ptr<ui::ResourceManager> resource_manager_;
};

}  // namespace android

#endif  // CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TITLE_CACHE_H_