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