blob: 82fa3fef84dff0ce33e39498b096abc2066a21df [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2017 The Chromium Authors
liberatoa8da3b52017-05-02 20:23:512// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_ANDROID_DIALOG_OVERLAY_IMPL_H_
6#define CONTENT_BROWSER_ANDROID_DIALOG_OVERLAY_IMPL_H_
7
8#include "base/android/jni_android.h"
9#include "base/android/jni_weak_ref.h"
10#include "base/android/scoped_java_ref.h"
Keishi Hattori0e45c022021-11-27 09:25:5211#include "base/memory/raw_ptr.h"
liberatoa8da3b52017-05-02 20:23:5112#include "base/unguessable_token.h"
Thomas Guilbert2d5ef442017-07-13 00:12:5513#include "content/public/browser/web_contents_observer.h"
Jinsuk Kimd5d29a22017-08-29 01:39:4414#include "ui/android/view_android_observer.h"
Andrei Pascovicib4784022018-09-06 14:41:2215#include "ui/android/window_android.h"
16#include "ui/android/window_android_observer.h"
liberatoa8da3b52017-05-02 20:23:5117
18namespace content {
19
David Sanders73ebb80c2022-04-19 00:53:1220class RenderFrameHost;
21class RenderFrameHostImpl;
22
liberatoa8da3b52017-05-02 20:23:5123// Native counterpart to DialogOverlayImpl java class. This is created by the
Jinsuk Kimd665cf22018-07-25 23:20:1024// java side. When the WebContents for the provided token is attached or
liberatoa8da3b52017-05-02 20:23:5125// detached from a WindowAndroid, we get the Android window token and notify the
26// java side.
Jinsuk Kimd5d29a22017-08-29 01:39:4427class DialogOverlayImpl : public ui::ViewAndroidObserver,
Andrei Pascovicib4784022018-09-06 14:41:2228 public ui::WindowAndroidObserver,
Thomas Guilbert2d5ef442017-07-13 00:12:5529 public WebContentsObserver {
liberatoa8da3b52017-05-02 20:23:5130 public:
[email protected]251fe522017-07-11 00:54:0631 // This may not call back into |obj| directly, but must post. This is because
32 // |obj| is still being initialized.
liberatoa8da3b52017-05-02 20:23:5133 DialogOverlayImpl(const base::android::JavaParamRef<jobject>& obj,
Thomas Guilbert2d5ef442017-07-13 00:12:5534 RenderFrameHostImpl* rfhi,
[email protected]e62e7ebf2017-09-21 17:14:4135 WebContents* web_contents,
Richard Knollba182752021-06-01 10:49:5536 bool power_efficient,
37 bool observe_container_view);
liberatoa8da3b52017-05-02 20:23:5138 ~DialogOverlayImpl() override;
39
[email protected]251fe522017-07-11 00:54:0640 // Called when the java side is ready for token / dismissed callbacks. May
41 // call back before returning. Must guarantee that a token is eventually sent
42 // if we have one.
Andrew Grieveab2c9152025-07-02 19:53:1343 void CompleteInit(JNIEnv* env);
[email protected]251fe522017-07-11 00:54:0644
liberatoa8da3b52017-05-02 20:23:5145 // Clean up and post to delete |this| later.
Andrew Grieveab2c9152025-07-02 19:53:1346 void Destroy(JNIEnv* env);
liberatoa8da3b52017-05-02 20:23:5147
[email protected]d6c17922017-06-26 18:48:0648 // Calls ReceiveCompositorOffset() (java) with the compositor screen offset
49 // before returning, in physical pixels. We send |rect| as a convenience.
50 void GetCompositorOffset(JNIEnv* env,
[email protected]d6c17922017-06-26 18:48:0651 const base::android::JavaParamRef<jobject>& rect);
52
Jinsuk Kimd5d29a22017-08-29 01:39:4453 // ui::ViewAndroidObserver
liberatoa8da3b52017-05-02 20:23:5154 void OnAttachedToWindow() override;
55 void OnDetachedFromWindow() override;
56
Thomas Guilbert2d5ef442017-07-13 00:12:5557 // WebContentsObserver
Francois Dorayfe4a1772018-02-17 04:17:0958 void OnVisibilityChanged(content::Visibility visibility) override;
Thomas Guilbert2d5ef442017-07-13 00:12:5559 void WebContentsDestroyed() override;
Muyao Xudb226be52023-12-01 04:23:0960 void DidToggleFullscreenModeForTab(bool entered_fullscreen,
61 bool will_cause_resize) override;
Thomas Guilbert2d5ef442017-07-13 00:12:5562 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
63 void RenderFrameHostChanged(RenderFrameHost* old_host,
64 RenderFrameHost* new_host) override;
65
Andrei Pascovicib4784022018-09-06 14:41:2266 // Unregister callbacks if previously registered.
67 void UnregisterCallbacksIfNeeded();
68
69 // WindowAndroidObserver
70 void OnRootWindowVisibilityChanged(bool visible) override;
Andrei Pascovicib4784022018-09-06 14:41:2271 void OnAttachCompositor() override {}
72 void OnDetachCompositor() override {}
73 void OnActivityStopped() override {}
74 void OnActivityStarted() override {}
liberatoa8da3b52017-05-02 20:23:5175
76 private:
Thomas Guilbert2d5ef442017-07-13 00:12:5577 // Signals the overlay should be cleaned up and no longer used.
78 void Stop();
Andrei Pascovicib4784022018-09-06 14:41:2279 void RegisterWindowObserverIfNeeded(ui::WindowAndroid* window);
liberatoa8da3b52017-05-02 20:23:5180
Richard Knollba182752021-06-01 10:49:5581 void StartObservingContainerView();
82 void StopObservingContainerView();
83 void ObserveContainerViewIfNeeded(
84 const base::android::ScopedJavaLocalRef<jobject>& container_view);
85
liberatoa8da3b52017-05-02 20:23:5186 // Java object that owns us.
87 JavaObjectWeakGlobalRef obj_;
88
Thomas Guilbert2d5ef442017-07-13 00:12:5589 // RenderFrameHostImpl* associated with the given overlay routing token.
Keishi Hattori0e45c022021-11-27 09:25:5290 raw_ptr<RenderFrameHostImpl> rfhi_;
[email protected]e62e7ebf2017-09-21 17:14:4191
92 // Do we care about power efficiency?
Richard Knollba182752021-06-01 10:49:5593 const bool power_efficient_;
Andrei Pascovicib4784022018-09-06 14:41:2294
95 // Whether we added ourselves as an observer through WindowAndroid.
96 bool observed_window_android_;
Richard Knollba182752021-06-01 10:49:5597
98 // Whether we should observe the container view for location changes.
99 const bool observe_container_view_;
liberatoa8da3b52017-05-02 20:23:51100};
101
102} // namespace content
103
104#endif // CONTENT_BROWSER_ANDROID_DIALOG_OVERLAY_IMPL_H_