1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.chrome.browser;
6 
7 import android.app.Activity;
8 import android.view.View;
9 
10 import androidx.annotation.VisibleForTesting;
11 
12 import org.chromium.chrome.browser.app.ChromeActivity;
13 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
14 import org.chromium.chrome.browser.tab.Tab;
15 import org.chromium.chrome.browser.ui.messages.infobar.SimpleConfirmInfoBarBuilder;
16 import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
17 import org.chromium.ui.base.ActivityWindowAndroid;
18 import org.chromium.ui.modaldialog.ModalDialogManager;
19 
20 import java.lang.ref.WeakReference;
21 
22 /**
23  * The window that has access to the main activity and is able to create and receive intents,
24  * and show error messages.
25  */
26 public class ChromeWindow extends ActivityWindowAndroid {
27     /**
28      * Interface allowing to inject a different keyboard delegate for testing.
29      */
30     @VisibleForTesting
31     public interface KeyboardVisibilityDelegateFactory {
create(WeakReference<Activity> activity)32         ActivityKeyboardVisibilityDelegate create(WeakReference<Activity> activity);
33     }
34     private static KeyboardVisibilityDelegateFactory sKeyboardVisibilityDelegateFactory =
35             ChromeKeyboardVisibilityDelegate::new;
36 
37     /**
38      * Creates Chrome specific ActivityWindowAndroid.
39      * @param activity The activity that owns the ChromeWindow.
40      */
ChromeWindow(ChromeActivity activity)41     public ChromeWindow(ChromeActivity activity) {
42         super(activity);
43     }
44 
45     @Override
getReadbackView()46     public View getReadbackView() {
47         assert getActivity().get() instanceof ChromeActivity;
48 
49         ChromeActivity chromeActivity = (ChromeActivity) getActivity().get();
50         return chromeActivity.getCompositorViewHolder() == null
51                 ? null
52                 : chromeActivity.getCompositorViewHolder().getActiveSurfaceView();
53     }
54 
55     @Override
getModalDialogManager()56     public ModalDialogManager getModalDialogManager() {
57         ChromeActivity activity = (ChromeActivity) getActivity().get();
58         return activity == null ? null : activity.getModalDialogManager();
59     }
60 
61     @Override
createKeyboardVisibilityDelegate()62     protected ActivityKeyboardVisibilityDelegate createKeyboardVisibilityDelegate() {
63         return sKeyboardVisibilityDelegateFactory.create(getActivity());
64     }
65 
66     /**
67      * Shows an infobar error message overriding the WindowAndroid implementation.
68      */
69     @Override
showCallbackNonExistentError(String error)70     protected void showCallbackNonExistentError(String error) {
71         Activity activity = getActivity().get();
72 
73         // We can assume that activity is a ChromeActivity because we require one to be passed in
74         // in the constructor.
75         Tab tab = activity != null ? ((ChromeActivity) activity).getActivityTab() : null;
76 
77         if (tab != null) {
78             SimpleConfirmInfoBarBuilder.create(tab.getWebContents(),
79                     InfoBarIdentifier.WINDOW_ERROR_INFOBAR_DELEGATE_ANDROID, error, false);
80         } else {
81             super.showCallbackNonExistentError(error);
82         }
83     }
84 
85     @VisibleForTesting
setKeyboardVisibilityDelegateFactory( KeyboardVisibilityDelegateFactory factory)86     public static void setKeyboardVisibilityDelegateFactory(
87             KeyboardVisibilityDelegateFactory factory) {
88         sKeyboardVisibilityDelegateFactory = factory;
89     }
90 
91     @VisibleForTesting
resetKeyboardVisibilityDelegateFactory()92     public static void resetKeyboardVisibilityDelegateFactory() {
93         setKeyboardVisibilityDelegateFactory(ChromeKeyboardVisibilityDelegate::new);
94     }
95 }
96