blob: d9b574b25ef870bba63299d62d4b788695c3d54c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser;
import android.app.Activity;
import android.view.View;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder;
import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.WebApkActivity;
import org.chromium.ui.base.ActivityAndroidPermissionDelegate;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ActivityWindowAndroid;
import java.lang.ref.WeakReference;
/**
* The window that has access to the main activity and is able to create and receive intents,
* and show error messages.
*/
public class ChromeWindow extends ActivityWindowAndroid {
/**
* Interface allowing to inject a different keyboard delegate for testing.
*/
@VisibleForTesting
public interface KeyboardVisibilityDelegateFactory {
ActivityKeyboardVisibilityDelegate create(WeakReference<Activity> activity);
}
private static KeyboardVisibilityDelegateFactory sKeyboardVisibilityDelegateFactory =
ChromeKeyboardVisibilityDelegate::new;
/**
* Creates Chrome specific ActivityWindowAndroid.
* @param activity The activity that owns the ChromeWindow.
*/
public ChromeWindow(ChromeActivity activity) {
super(activity);
}
@Override
public View getReadbackView() {
assert getActivity().get() instanceof ChromeActivity;
ChromeActivity chromeActivity = (ChromeActivity) getActivity().get();
return chromeActivity.getCompositorViewHolder() == null
? null
: chromeActivity.getCompositorViewHolder().getActiveSurfaceView();
}
@Override
protected ActivityAndroidPermissionDelegate createAndroidPermissionDelegate() {
return new ActivityAndroidPermissionDelegate(getActivity()) {
@Override
protected void logUMAOnRequestPermissionDenied(String permission) {
Activity activity = getActivity().get();
if (activity instanceof WebApkActivity
&& ((ChromeActivity) activity).didFinishNativeInitialization()) {
WebApkUma.recordAndroidRuntimePermissionDeniedInWebApk(
new String[] {permission});
}
}
};
}
@Override
protected ActivityKeyboardVisibilityDelegate createKeyboardVisibilityDelegate() {
return sKeyboardVisibilityDelegateFactory.create(getActivity());
}
/**
* Shows an infobar error message overriding the WindowAndroid implementation.
*/
@Override
protected void showCallbackNonExistentError(String error) {
Activity activity = getActivity().get();
// We can assume that activity is a ChromeActivity because we require one to be passed in
// in the constructor.
Tab tab = activity != null ? ((ChromeActivity) activity).getActivityTab() : null;
if (tab != null) {
SimpleConfirmInfoBarBuilder.create(
tab, InfoBarIdentifier.WINDOW_ERROR_INFOBAR_DELEGATE_ANDROID, error, false);
} else {
super.showCallbackNonExistentError(error);
}
}
@VisibleForTesting
public static void setKeyboardVisibilityDelegateFactory(
KeyboardVisibilityDelegateFactory factory) {
sKeyboardVisibilityDelegateFactory = factory;
}
@VisibleForTesting
public static void resetKeyboardVisibilityDelegateFactory() {
setKeyboardVisibilityDelegateFactory(ChromeKeyboardVisibilityDelegate::new);
}
}