blob: 4823f69a29d94bcb588e45ceba5e47ce9a2071f6 [file] [log] [blame]
// Copyright 2019 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.weblayer_private;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Build;
import android.view.View;
import androidx.fragment.app.FragmentManager;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ImmutableWeakReference;
import org.chromium.ui.base.IntentWindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager;
import java.lang.ref.WeakReference;
/**
* Implements intent sending for a fragment based window. This should be created when
* onAttach() is called on the fragment, and destroyed when onDetach() is called.
*/
public class FragmentWindowAndroid extends IntentWindowAndroid {
private BrowserFragmentImpl mFragment;
private ModalDialogManager mModalDialogManager;
// This WeakReference is purely to avoid gc churn of creating a new WeakReference in
// every getActivity call. It is not needed for correctness.
private ImmutableWeakReference<Activity> mActivityWeakRefHolder;
FragmentWindowAndroid(Context context, BrowserFragmentImpl fragment) {
super(context);
mFragment = fragment;
setKeyboardDelegate(new ActivityKeyboardVisibilityDelegate(getActivity()));
setAndroidPermissionDelegate(new FragmentAndroidPermissionDelegate(mFragment));
}
@Override
protected final boolean startIntentSenderForResult(IntentSender intentSender, int requestCode) {
return mFragment.startIntentSenderForResult(
intentSender, requestCode, new Intent(), 0, 0, 0, null);
}
@Override
protected final boolean startActivityForResult(Intent intent, int requestCode) {
return mFragment.startActivityForResult(intent, requestCode, null);
}
@Override
public final WeakReference<Activity> getActivity() {
if (mActivityWeakRefHolder == null
|| mActivityWeakRefHolder.get() != mFragment.getActivity()) {
mActivityWeakRefHolder = new ImmutableWeakReference<>(mFragment.getActivity());
}
return mActivityWeakRefHolder;
}
@Override
public final ModalDialogManager getModalDialogManager() {
return mModalDialogManager;
}
@Override
public View getReadbackView() {
BrowserViewController viewController = getBrowser().getPossiblyNullViewController();
if (viewController == null) return null;
return viewController.getViewForMagnifierReadback();
}
public void setModalDialogManager(ModalDialogManager modalDialogManager) {
mModalDialogManager = modalDialogManager;
}
public BrowserImpl getBrowser() {
return mFragment.getBrowser();
}
public FragmentManager getFragmentManager() {
return mFragment.getSupportFragmentManager();
}
@Override
@TargetApi(Build.VERSION_CODES.O)
public void setWideColorEnabled(boolean enabled) {
// WebLayer should not change its behavior when the content contains wide color.
// Rather, the app embedding the WebLayer gets to choose whether or not it is wide.
// So we should do nothing in this override.
}
}