Move InsetObserver initialization to activity
Currently, the InsetObserver is managed by the WindowAndroid, which is only created by certain activities. With edge-to-edge everywhere, all activities will need access to the InsetObserver to properly observe the window insets, so this change passes the InsetObserver to ChromeBaseAppCompatActivity. The InsetObserver should be passed to any WindowAndroid that needs access to it through the WindowAndroid constructor. Bug: 374641218 Change-Id: Id42a26f7c9848b50fc5fde49074583719e645413 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5945405 Reviewed-by: Tomasz Wiszkowski <ender@google.com> Reviewed-by: Vigen Issahhanjan <vigeni@google.com> Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org> Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com> Reviewed-by: Andrew Grieve <agrieve@chromium.org> Commit-Queue: Charles Hager <clhager@google.com> Reviewed-by: Theresa Sullivan <twellington@chromium.org> Reviewed-by: Richard (Torne) Coles <torne@chromium.org> Reviewed-by: Shakti Sahu <shaktisahu@chromium.org> Reviewed-by: Wenyu Fu <wenyufu@chromium.org> Reviewed-by: Antonio Rivera <antoniori@google.com> Cr-Commit-Position: refs/heads/main@{#1373467}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
bb246fedf7
commit
62a63ab0b2
android_webview/java/src/org/chromium/android_webview
chrome
android
java
src
org
chromium
chrome
browser
ChromeBaseAppCompatActivity.javaChromeTabbedActivity.javaChromeWindow.java
app
device_lock
display_cutout
firstrun
media
searchwidget
signin
javatests
src
org
chromium
chrome
junit
src
org
chromium
chrome
browser
share
android
javatests
src
org
chromium
chrome
browser
share
android_share_sheet
ui
android
default_browser_promo
java
src
org
chromium
chrome
browser
ui
default_browser_promo
edge_to_edge
internal
java
src
org
chromium
chrome
browser
ui
edge_to_edge
hats
internal
java
src
org
chromium
chrome
browser
omnibox
java
src
org
chromium
chrome
browser
omnibox
suggestions
chromecast/browser/android/apk/src/org/chromium/chromecast/shell
components
browser_ui
contacts_picker
android
java
src
org
chromium
components
browser_ui
contacts_picker
photo_picker
android
java
src
org
chromium
components
browser_ui
photo_picker
thin_webview
internal
java
src
org
chromium
components
thinwebview
internal
content/shell/android
browsertests
src
org
chromium
content_shell
browsertests
shell_apk
src
org
chromium
content_shell_apk
ui/android/java/src/org/chromium/ui/base
@ -1843,7 +1843,8 @@ public class AwContents implements SmartClipProvider {
|
||||
new ActivityWindowAndroid(
|
||||
context,
|
||||
listenToActivityState,
|
||||
IntentRequestTracker.createFromActivity(activity));
|
||||
IntentRequestTracker.createFromActivity(activity),
|
||||
/* insetObserver= */ null);
|
||||
}
|
||||
wrapper = new WindowAndroidWrapper(activityWindow);
|
||||
} else {
|
||||
|
@ -52,6 +52,8 @@ import org.chromium.chrome.browser.night_mode.NightModeStateProvider;
|
||||
import org.chromium.chrome.browser.night_mode.NightModeUtils;
|
||||
import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeStateProvider;
|
||||
import org.chromium.components.browser_ui.util.AutomotiveUtils;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ImmutableWeakReference;
|
||||
import org.chromium.ui.display.DisplaySwitches;
|
||||
import org.chromium.ui.display.DisplayUtil;
|
||||
import org.chromium.ui.modaldialog.ModalDialogManager;
|
||||
@ -102,6 +104,7 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity
|
||||
private LinkedHashSet<Integer> mThemeResIds = new LinkedHashSet<>();
|
||||
private ServiceTracingProxyProvider mServiceTracingProxyProvider;
|
||||
private EdgeToEdgeStateProvider mEdgeToEdgeStateProvider;
|
||||
private InsetObserver mInsetObserver;
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context newBase) {
|
||||
@ -162,6 +165,7 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity
|
||||
GlobalAppLocaleController.getInstance().maybeOverrideContextConfig(this);
|
||||
|
||||
setDefaultTaskDescription();
|
||||
mInsetObserver = createInsetObserver();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -473,6 +477,18 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity
|
||||
return mEdgeToEdgeStateProvider;
|
||||
}
|
||||
|
||||
/** Returns the {@link InsetObserver} for observing changes to the system insets. */
|
||||
protected InsetObserver getInsetObserver() {
|
||||
assert mInsetObserver != null
|
||||
: "The inset observer should not be accessed before being initialized.";
|
||||
return mInsetObserver;
|
||||
}
|
||||
|
||||
private InsetObserver createInsetObserver() {
|
||||
return new InsetObserver(
|
||||
new ImmutableWeakReference<>(getWindow().getDecorView().getRootView()));
|
||||
}
|
||||
|
||||
private void setAutomotiveToolbarBackButtonAction() {
|
||||
Toolbar backButtonToolbarForAutomotive = findViewById(R.id.back_button_toolbar);
|
||||
if (backButtonToolbarForAutomotive != null) {
|
||||
|
@ -2132,7 +2132,7 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
|
||||
/* statusBarColorProvider= */ this,
|
||||
new OneshotSupplierImpl<>(),
|
||||
getIntentRequestTracker(),
|
||||
getWindowAndroid().getInsetObserver(),
|
||||
getInsetObserver(),
|
||||
this::backShouldCloseTab,
|
||||
this::sendToBackground,
|
||||
// TODO(sinansahin): This currently only checks for incognito extras in the intent.
|
||||
|
@ -13,6 +13,7 @@ import androidx.annotation.VisibleForTesting;
|
||||
import org.chromium.base.supplier.Supplier;
|
||||
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
|
||||
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
@ -53,14 +54,16 @@ public class ChromeWindow extends ActivityWindowAndroid {
|
||||
@NonNull Supplier<CompositorViewHolder> compositorViewHolderSupplier,
|
||||
@NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier,
|
||||
@NonNull Supplier<ManualFillingComponent> manualFillingComponentSupplier,
|
||||
@NonNull IntentRequestTracker intentRequestTracker) {
|
||||
@NonNull IntentRequestTracker intentRequestTracker,
|
||||
@NonNull InsetObserver insetObserver) {
|
||||
this(
|
||||
activity,
|
||||
compositorViewHolderSupplier,
|
||||
modalDialogManagerSupplier,
|
||||
sKeyboardVisibilityDelegateFactory.create(
|
||||
new WeakReference<Activity>(activity), manualFillingComponentSupplier),
|
||||
intentRequestTracker);
|
||||
intentRequestTracker,
|
||||
insetObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -77,12 +80,15 @@ public class ChromeWindow extends ActivityWindowAndroid {
|
||||
@NonNull Supplier<CompositorViewHolder> compositorViewHolderSupplier,
|
||||
@NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier,
|
||||
@NonNull ActivityKeyboardVisibilityDelegate activityKeyboardVisibilityDelegate,
|
||||
IntentRequestTracker intentRequestTracker) {
|
||||
IntentRequestTracker intentRequestTracker,
|
||||
@NonNull InsetObserver insetObserver) {
|
||||
super(
|
||||
activity,
|
||||
/* listenToActivityState= */ true,
|
||||
activityKeyboardVisibilityDelegate,
|
||||
intentRequestTracker);
|
||||
intentRequestTracker,
|
||||
insetObserver);
|
||||
assert insetObserver != null;
|
||||
mCompositorViewHolderSupplier = compositorViewHolderSupplier;
|
||||
mModalDialogManagerSupplier = modalDialogManagerSupplier;
|
||||
}
|
||||
|
@ -452,7 +452,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|
||||
mCompositorViewHolderSupplier,
|
||||
getModalDialogManagerSupplier(),
|
||||
mManualFillingComponentSupplier,
|
||||
getIntentRequestTracker());
|
||||
getIntentRequestTracker(),
|
||||
getInsetObserver());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -685,11 +686,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|
||||
mBottomContainer = findViewById(R.id.bottom_container);
|
||||
|
||||
mSnackbarManager = new SnackbarManager(this, mBottomContainer, getWindowAndroid());
|
||||
getWindowAndroid().getInsetObserver().addObserver(mSnackbarManager);
|
||||
getInsetObserver().addObserver(mSnackbarManager);
|
||||
SnackbarManagerProvider.attach(getWindowAndroid(), mSnackbarManager);
|
||||
// TODO (crbug.com/365110749): Remove wiring the InsetObserver when the dialog window
|
||||
// returns expected system insets.
|
||||
getModalDialogManager().setInsetObserver(getWindowAndroid().getInsetObserver());
|
||||
getModalDialogManager().setInsetObserver(getInsetObserver());
|
||||
|
||||
// Make the activity listen to policy change events
|
||||
CombinedPolicyProvider.get().addPolicyChangeListener(this);
|
||||
@ -1670,7 +1671,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|
||||
mDisplayAndroidObserver = null;
|
||||
}
|
||||
|
||||
InsetObserver insetObserver = windowAndroid.getInsetObserver();
|
||||
InsetObserver insetObserver = getInsetObserver();
|
||||
if (insetObserver != null) {
|
||||
insetObserver.removeObserver(mSnackbarManager);
|
||||
}
|
||||
@ -2120,8 +2121,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|
||||
|
||||
ApplicationViewportInsetSupplier insetSupplier =
|
||||
getWindowAndroid().getApplicationBottomInsetSupplier();
|
||||
insetSupplier.setKeyboardInsetSupplier(
|
||||
getWindowAndroid().getInsetObserver().getSupplierForKeyboardInset());
|
||||
insetSupplier.setKeyboardInsetSupplier(getInsetObserver().getSupplierForKeyboardInset());
|
||||
insetSupplier.setKeyboardAccessoryInsetSupplier(
|
||||
mManualFillingComponentSupplier.get().getBottomInsetSupplier());
|
||||
compositorViewHolder.setApplicationViewportInsetSupplier(insetSupplier);
|
||||
|
@ -99,7 +99,8 @@ public class CreatorActivity extends SnackbarActivity {
|
||||
mProfileSupplier.set(mProfile);
|
||||
|
||||
IntentRequestTracker intentRequestTracker = IntentRequestTracker.createFromActivity(this);
|
||||
mWindowAndroid = new ActivityWindowAndroid(this, false, intentRequestTracker);
|
||||
mWindowAndroid =
|
||||
new ActivityWindowAndroid(this, false, intentRequestTracker, getInsetObserver());
|
||||
|
||||
TabShareDelegateImpl tabshareDelegate =
|
||||
new TabShareDelegateImpl(
|
||||
|
@ -64,7 +64,8 @@ public class DeviceLockActivity extends SynchronousInitializationActivity
|
||||
new ActivityWindowAndroid(
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(this));
|
||||
IntentRequestTracker.createFromActivity(this),
|
||||
getInsetObserver());
|
||||
mIntentRequestTracker = mWindowAndroid.getIntentRequestTracker();
|
||||
|
||||
Bundle fragmentArgs = getIntent().getBundleExtra(ARGUMENT_FRAGMENT_ARGS);
|
||||
|
@ -90,7 +90,7 @@ public class DisplayCutoutTabHelper implements UserData {
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsetObserver getInsetObserver() {
|
||||
public @Nullable InsetObserver getInsetObserver() {
|
||||
return mTab.getWindowAndroid().getInsetObserver();
|
||||
}
|
||||
|
||||
|
@ -826,6 +826,9 @@ public class FirstRunActivity extends FirstRunActivityBase implements FirstRunPa
|
||||
@Override
|
||||
protected ActivityWindowAndroid createWindowAndroid() {
|
||||
return new ActivityWindowAndroid(
|
||||
this, /* listenToActivityState= */ true, getIntentRequestTracker());
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
getIntentRequestTracker(),
|
||||
getInsetObserver());
|
||||
}
|
||||
}
|
||||
|
@ -673,7 +673,10 @@ public class PictureInPictureActivity extends AsyncInitializationActivity {
|
||||
@Override
|
||||
protected ActivityWindowAndroid createWindowAndroid() {
|
||||
return new ActivityWindowAndroid(
|
||||
this, /* listenToActivityState= */ true, getIntentRequestTracker());
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
getIntentRequestTracker(),
|
||||
getInsetObserver());
|
||||
}
|
||||
|
||||
@CalledByNative
|
||||
|
@ -257,7 +257,8 @@ public class SearchActivity extends AsyncInitializationActivity
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
new ActivityKeyboardVisibilityDelegate(new WeakReference(this)),
|
||||
getIntentRequestTracker()) {
|
||||
getIntentRequestTracker(),
|
||||
getInsetObserver()) {
|
||||
@Override
|
||||
public ModalDialogManager getModalDialogManager() {
|
||||
return SearchActivity.this.getModalDialogManager();
|
||||
|
@ -200,7 +200,10 @@ public class SigninAndHistorySyncActivity extends FirstRunActivityBase
|
||||
@Override
|
||||
protected ActivityWindowAndroid createWindowAndroid() {
|
||||
return new ActivityWindowAndroid(
|
||||
this, /* listenToActivityState= */ true, getIntentRequestTracker());
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
getIntentRequestTracker(),
|
||||
getInsetObserver());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -97,7 +97,8 @@ public class SyncConsentActivity extends SynchronousInitializationActivity
|
||||
new ActivityWindowAndroid(
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(this));
|
||||
IntentRequestTracker.createFromActivity(this),
|
||||
getInsetObserver());
|
||||
}
|
||||
return mWindowAndroid;
|
||||
}
|
||||
|
@ -21,6 +21,9 @@ import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
|
||||
import org.chromium.base.ContextUtils;
|
||||
import org.chromium.base.ThreadUtils;
|
||||
@ -36,6 +39,7 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
|
||||
import org.chromium.chrome.test.TestContentProvider;
|
||||
import org.chromium.content_public.browser.WebContents;
|
||||
import org.chromium.content_public.browser.test.util.DOMUtils;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.SelectFileDialog;
|
||||
@ -49,6 +53,10 @@ public class SelectFileDialogTest {
|
||||
@Rule
|
||||
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
|
||||
|
||||
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
|
||||
|
||||
@Mock InsetObserver mInsetObserver;
|
||||
|
||||
private static final String DATA_URL =
|
||||
UrlUtils.encodeHtmlDataUri(
|
||||
"<html><head><meta name=\"viewport\"content=\"width=device-width,"
|
||||
@ -65,11 +73,12 @@ public class SelectFileDialogTest {
|
||||
public Intent lastIntent;
|
||||
public IntentCallback lastCallback;
|
||||
|
||||
public ActivityWindowAndroidForTest(Activity activity) {
|
||||
public ActivityWindowAndroidForTest(Activity activity, InsetObserver insetObserver) {
|
||||
super(
|
||||
activity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(activity));
|
||||
IntentRequestTracker.createFromActivity(activity),
|
||||
insetObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -105,7 +114,8 @@ public class SelectFileDialogTest {
|
||||
ThreadUtils.runOnUiThreadBlocking(
|
||||
() -> {
|
||||
mActivityWindowAndroidForTest =
|
||||
new ActivityWindowAndroidForTest(mActivityTestRule.getActivity());
|
||||
new ActivityWindowAndroidForTest(
|
||||
mActivityTestRule.getActivity(), mInsetObserver);
|
||||
SelectFileDialog.setWindowAndroidForTests(mActivityWindowAndroidForTest);
|
||||
|
||||
mWebContents = mActivityTestRule.getActivity().getCurrentWebContents();
|
||||
|
@ -35,6 +35,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
|
||||
import org.chromium.chrome.browser.profiles.Profile;
|
||||
import org.chromium.chrome.browser.tab.Tab;
|
||||
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -64,6 +65,7 @@ public class OverlayPanelBaseTest {
|
||||
@Mock private ViewGroup mCompositorViewHolder;
|
||||
@Mock private Profile mProfile;
|
||||
@Mock private Tab mTab;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
Activity mActivity;
|
||||
ActivityWindowAndroid mWindowAndroid;
|
||||
@ -158,7 +160,8 @@ public class OverlayPanelBaseTest {
|
||||
new ActivityWindowAndroid(
|
||||
mActivity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(mActivity));
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
OverlayPanelManager panelManager = new OverlayPanelManager();
|
||||
mExpandPanel =
|
||||
new MockOverlayPanel(
|
||||
|
@ -36,6 +36,7 @@ import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEv
|
||||
import org.chromium.chrome.browser.profiles.Profile;
|
||||
import org.chromium.chrome.browser.tab.Tab;
|
||||
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -69,6 +70,7 @@ public class OverlayPanelEventFilterTest {
|
||||
@Mock private Tab mTab;
|
||||
@Mock private OverlayPanelContentDelegate mOverlayPanelContentDelegate;
|
||||
@Mock private OverlayPanelContentProgressObserver mOverlayPanelContentProgressObserver;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
private float mTouchSlopDp;
|
||||
private float mDpToPx;
|
||||
@ -273,7 +275,8 @@ public class OverlayPanelEventFilterTest {
|
||||
new ActivityWindowAndroid(
|
||||
mActivity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(mActivity));
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
|
||||
mPanel =
|
||||
new MockOverlayPanel(
|
||||
|
@ -38,6 +38,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
|
||||
import org.chromium.chrome.browser.profiles.Profile;
|
||||
import org.chromium.chrome.browser.tab.Tab;
|
||||
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -63,6 +64,7 @@ public class OverlayPanelManagerTest {
|
||||
@Mock private ViewGroup mCompositorViewHolder;
|
||||
@Mock private Profile mProfile;
|
||||
@Mock private Tab mTab;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
Activity mActivity;
|
||||
ActivityWindowAndroid mWindowAndroid;
|
||||
@ -172,7 +174,8 @@ public class OverlayPanelManagerTest {
|
||||
return new ActivityWindowAndroid(
|
||||
mActivity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(mActivity));
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,7 @@ import org.chromium.content_public.browser.WebContents;
|
||||
import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
|
||||
import org.chromium.payments.mojom.PaymentDetailsModifier;
|
||||
import org.chromium.payments.mojom.PaymentMethodData;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -80,6 +81,7 @@ public class AndroidPaymentAppFinderUnitTest extends BlankUiTestActivityTestCase
|
||||
@Mock private PaymentManifestDownloader mPaymentManifestDownloader;
|
||||
@Mock private PaymentManifestParser mPaymentManifestParser;
|
||||
@Mock private PackageManagerDelegate mPackageManagerDelegate;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
private WindowAndroid mWindowAndroid;
|
||||
|
||||
@ -91,7 +93,8 @@ public class AndroidPaymentAppFinderUnitTest extends BlankUiTestActivityTestCase
|
||||
return new ActivityWindowAndroid(
|
||||
getActivity(),
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(getActivity()));
|
||||
IntentRequestTracker.createFromActivity(getActivity()),
|
||||
mInsetObserver);
|
||||
});
|
||||
|
||||
NativeLibraryTestUtils.loadNativeLibraryAndInitBrowserProcess();
|
||||
|
@ -198,7 +198,12 @@ public class ShareHelperMultiInstanceUnitTest {
|
||||
.moveToState(State.STARTED);
|
||||
doReturn(taskId).when(mActivity).getTaskId();
|
||||
mIntentRequestTracker = IntentRequestTracker.createFromActivity(mActivity);
|
||||
mWindow = new ActivityWindowAndroid(mActivity, false, mIntentRequestTracker);
|
||||
mWindow =
|
||||
new ActivityWindowAndroid(
|
||||
mActivity,
|
||||
/* listenToActivityState= */ false,
|
||||
mIntentRequestTracker,
|
||||
/* insetObserver= */ null);
|
||||
}
|
||||
|
||||
public SingleWindowTestInstance startShare() {
|
||||
|
@ -74,7 +74,10 @@ public class ShareHelperUnitTest {
|
||||
mActivity = Robolectric.buildActivity(Activity.class).get();
|
||||
mWindow =
|
||||
new ActivityWindowAndroid(
|
||||
mActivity, false, IntentRequestTracker.createFromActivity(mActivity));
|
||||
mActivity,
|
||||
/* listenToActivityState= */ false,
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
/* insetObserver= */ null);
|
||||
mImageUri = Uri.parse(IMAGE_URI);
|
||||
}
|
||||
|
||||
|
@ -98,6 +98,7 @@ import org.chromium.components.feature_engagement.EventConstants;
|
||||
import org.chromium.components.feature_engagement.Tracker;
|
||||
import org.chromium.components.prefs.PrefService;
|
||||
import org.chromium.components.user_prefs.UserPrefsJni;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.Clipboard;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
@ -138,6 +139,7 @@ public class AndroidShareSheetControllerUnitTest {
|
||||
@Mock DeviceLockActivityLauncher mDeviceLockActivityLauncher;
|
||||
@Mock Profile mProfile;
|
||||
@Mock Tracker mTracker;
|
||||
@Mock InsetObserver mInsetObserver;
|
||||
|
||||
private TestActivity mActivity;
|
||||
private WindowAndroid mWindow;
|
||||
@ -184,7 +186,10 @@ public class AndroidShareSheetControllerUnitTest {
|
||||
mActivityScenario.getScenario().moveToState(State.RESUMED);
|
||||
mWindow =
|
||||
new ActivityWindowAndroid(
|
||||
mActivity, false, IntentRequestTracker.createFromActivity(mActivity));
|
||||
mActivity,
|
||||
false,
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
mPrintCallback = new PayloadCallbackHelper<>();
|
||||
// Set up mock tab
|
||||
doReturn(mWindow).when(mTab).getWindowAndroid();
|
||||
|
@ -44,6 +44,7 @@ import org.chromium.components.messages.MessageBannerProperties;
|
||||
import org.chromium.components.messages.MessageIdentifier;
|
||||
import org.chromium.components.messages.MessagesFactory;
|
||||
import org.chromium.components.search_engines.SearchEngineChoiceService;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -59,6 +60,7 @@ public class DefaultBrowserPromoUtilsTest {
|
||||
@Mock private Profile mProfile;
|
||||
@Mock private ManagedMessageDispatcher mMockMessageDispatcher;
|
||||
@Mock private SearchEngineChoiceService mMockSearchEngineChoiceService;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
@Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||
|
||||
@ -72,7 +74,10 @@ public class DefaultBrowserPromoUtilsTest {
|
||||
mActivity = Robolectric.buildActivity(Activity.class).get();
|
||||
mWindowAndroid =
|
||||
new ActivityWindowAndroid(
|
||||
mActivity, false, IntentRequestTracker.createFromActivity(mActivity));
|
||||
mActivity,
|
||||
false,
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
TrackerFactory.setTrackerForTests(mMockTracker);
|
||||
MessagesFactory.attachMessageDispatcher(mWindowAndroid, mMockMessageDispatcher);
|
||||
SearchEngineChoiceService.setInstanceForTests(mMockSearchEngineChoiceService);
|
||||
|
@ -166,7 +166,6 @@ public class EdgeToEdgeControllerImpl
|
||||
updateWebContentsObserver(tab);
|
||||
}
|
||||
};
|
||||
mInsetObserver = mWindowAndroid.getInsetObserver();
|
||||
mBrowserControlsStateProvider = browserControlsStateProvider;
|
||||
mBrowserControlsStateProvider.addObserver(this);
|
||||
|
||||
@ -180,6 +179,10 @@ public class EdgeToEdgeControllerImpl
|
||||
mFullscreenManager = fullscreenManager;
|
||||
mFullscreenManager.addObserver(this);
|
||||
|
||||
mInsetObserver = mWindowAndroid.getInsetObserver();
|
||||
assert mInsetObserver != null
|
||||
: "The EdgeToEdgeControllerImpl needs access to a valid InsetObserver to listen to"
|
||||
+ " the system insets!";
|
||||
mWindowInsetsConsumer = this::handleWindowInsets;
|
||||
mInsetObserver.addInsetsConsumer(mWindowInsetsConsumer);
|
||||
|
||||
|
@ -36,6 +36,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorSupplier;
|
||||
import org.chromium.components.messages.ManagedMessageDispatcher;
|
||||
import org.chromium.components.messages.MessageWrapper;
|
||||
import org.chromium.components.messages.MessagesFactory;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -56,6 +57,7 @@ public class SurveyUiDelegateBridgeUnitTest {
|
||||
@Mock private SurveyUiDelegateBridge.Natives mMockSurveyUiDelegateBridge;
|
||||
@Mock private ManagedMessageDispatcher mMockMessageDispatcher;
|
||||
@Mock private TabModelSelector mTabModelSelector;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
private Activity mActivity;
|
||||
private WindowAndroid mWindow;
|
||||
@ -67,7 +69,10 @@ public class SurveyUiDelegateBridgeUnitTest {
|
||||
mActivity = Robolectric.buildActivity(Activity.class).get();
|
||||
mWindow =
|
||||
new ActivityWindowAndroid(
|
||||
mActivity, false, IntentRequestTracker.createFromActivity(mActivity));
|
||||
mActivity,
|
||||
false,
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
MessagesFactory.attachMessageDispatcher(mWindow, mMockMessageDispatcher);
|
||||
TabModelSelectorSupplier.setInstanceForTesting(mTabModelSelector);
|
||||
}
|
||||
|
@ -61,6 +61,7 @@ import org.chromium.components.omnibox.action.OmniboxAction;
|
||||
import org.chromium.components.omnibox.action.OmniboxActionDelegate;
|
||||
import org.chromium.content_public.browser.LoadUrlParams;
|
||||
import org.chromium.content_public.browser.WebContents;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.DeviceFormFactor;
|
||||
import org.chromium.ui.base.PageTransition;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -1388,9 +1389,11 @@ class AutocompleteMediator
|
||||
mContext.getResources()
|
||||
.getDimensionPixelOffset(
|
||||
R.dimen.omnibox_suggestion_list_animation_added_vertical_offset);
|
||||
InsetObserver insetObserver = mWindowAndroid.getInsetObserver();
|
||||
assert insetObserver != null;
|
||||
mAnimationDriver =
|
||||
new SuggestionsListAnimationDriver(
|
||||
mWindowAndroid.getInsetObserver(),
|
||||
insetObserver,
|
||||
mListPropertyModel,
|
||||
mEmbedder::getVerticalTranslationForAnimation,
|
||||
() -> propagateOmniboxSessionStateChange(true),
|
||||
|
@ -34,10 +34,17 @@ class CastWebContentsScopes {
|
||||
public static Observer<WebContents> onLayoutActivity(
|
||||
Activity activity, FrameLayout layout, @ColorInt int backgroundColor) {
|
||||
layout.setBackgroundColor(backgroundColor);
|
||||
return onLayoutInternal(activity, layout, () -> {
|
||||
return new ActivityWindowAndroid(activity, /* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(activity));
|
||||
}, backgroundColor);
|
||||
return onLayoutInternal(
|
||||
activity,
|
||||
layout,
|
||||
() -> {
|
||||
return new ActivityWindowAndroid(
|
||||
activity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(activity),
|
||||
/* insetObserver= */ null);
|
||||
},
|
||||
backgroundColor);
|
||||
}
|
||||
|
||||
public static Observer<WebContents> onLayoutFragment(
|
||||
|
@ -49,6 +49,7 @@ import org.chromium.content_public.browser.Visibility;
|
||||
import org.chromium.content_public.browser.WebContents;
|
||||
import org.chromium.content_public.browser.test.util.TestTouchUtils;
|
||||
import org.chromium.payments.mojom.PaymentAddress;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.base.ActivityWindowAndroid;
|
||||
import org.chromium.ui.base.IntentRequestTracker;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
@ -74,6 +75,7 @@ public class ContactsPickerDialogTest
|
||||
private WindowAndroid mWindowAndroid;
|
||||
|
||||
@Mock private WebContents mWebContents;
|
||||
@Mock private InsetObserver mInsetObserver;
|
||||
|
||||
@Rule
|
||||
public RenderTestRule mRenderTestRule =
|
||||
@ -142,7 +144,8 @@ public class ContactsPickerDialogTest
|
||||
return new ActivityWindowAndroid(
|
||||
mActivity,
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(mActivity));
|
||||
IntentRequestTracker.createFromActivity(mActivity),
|
||||
mInsetObserver);
|
||||
});
|
||||
mWebContents = Mockito.mock(WebContents.class);
|
||||
when(mWebContents.getTopLevelNativeWindow()).thenReturn(mWindowAndroid);
|
||||
|
@ -138,7 +138,8 @@ public class PhotoPickerDialogTest extends BlankUiTestActivityTestCase
|
||||
return new ActivityWindowAndroid(
|
||||
getActivity(),
|
||||
/* listenToActivityState= */ true,
|
||||
IntentRequestTracker.createFromActivity(getActivity()));
|
||||
IntentRequestTracker.createFromActivity(getActivity()),
|
||||
/* insetObserver= */ null);
|
||||
});
|
||||
ThreadUtils.runOnUiThreadBlocking(
|
||||
() -> {
|
||||
|
@ -51,7 +51,10 @@ public class ThinWebViewImpl extends FrameLayout implements ThinWebView {
|
||||
if (ContextUtils.activityFromContext(context) != null) {
|
||||
mWindowAndroid =
|
||||
new ActivityWindowAndroid(
|
||||
context, /* listenToActivityState= */ true, intentRequestTracker);
|
||||
context,
|
||||
/* listenToActivityState= */ true,
|
||||
intentRequestTracker,
|
||||
/* insetObserver= */ null);
|
||||
} else {
|
||||
mWindowAndroid = new WindowAndroid(context);
|
||||
}
|
||||
|
@ -64,7 +64,10 @@ public abstract class ContentShellBrowserTestActivity extends NativeBrowserTestA
|
||||
IntentRequestTracker intentRequestTracker = IntentRequestTracker.createFromActivity(this);
|
||||
mWindowAndroid =
|
||||
new ActivityWindowAndroid(
|
||||
this, /* listenToActivityState= */ true, intentRequestTracker);
|
||||
this,
|
||||
/* listenToActivityState= */ true,
|
||||
intentRequestTracker,
|
||||
/* insetObserver= */ null);
|
||||
mShellManager.setWindow(mWindowAndroid);
|
||||
|
||||
Window wind = this.getWindow();
|
||||
|
@ -64,7 +64,11 @@ public class ContentShellActivity extends Activity {
|
||||
final boolean listenToActivityState = true;
|
||||
mIntentRequestTracker = IntentRequestTracker.createFromActivity(this);
|
||||
mWindowAndroid =
|
||||
new ActivityWindowAndroid(this, listenToActivityState, mIntentRequestTracker);
|
||||
new ActivityWindowAndroid(
|
||||
this,
|
||||
listenToActivityState,
|
||||
mIntentRequestTracker,
|
||||
/* insetObserver= */ null);
|
||||
mIntentRequestTracker.restoreInstanceState(savedInstanceState);
|
||||
mShellManager.setWindow(mWindowAndroid);
|
||||
// Set up the animation placeholder to be the SurfaceView. This disables the
|
||||
|
@ -8,12 +8,14 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.chromium.base.ActivityState;
|
||||
import org.chromium.base.ApplicationStatus;
|
||||
import org.chromium.base.ContextUtils;
|
||||
import org.chromium.base.supplier.LazyOneshotSupplier;
|
||||
import org.chromium.base.supplier.ObservableSupplierImpl;
|
||||
import org.chromium.ui.InsetObserver;
|
||||
import org.chromium.ui.permissions.ActivityAndroidPermissionDelegate;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@ -40,7 +42,8 @@ public class ActivityWindowAndroid extends WindowAndroid
|
||||
public ActivityWindowAndroid(
|
||||
Context context,
|
||||
boolean listenToActivityState,
|
||||
IntentRequestTracker intentRequestTracker) {
|
||||
IntentRequestTracker intentRequestTracker,
|
||||
@Nullable InsetObserver insetObserver) {
|
||||
this(
|
||||
context,
|
||||
listenToActivityState,
|
||||
@ -48,7 +51,8 @@ public class ActivityWindowAndroid extends WindowAndroid
|
||||
new WeakReference<Activity>(ContextUtils.activityFromContext(context))),
|
||||
new ActivityKeyboardVisibilityDelegate(
|
||||
new WeakReference<Activity>(ContextUtils.activityFromContext(context))),
|
||||
intentRequestTracker);
|
||||
intentRequestTracker,
|
||||
insetObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -63,14 +67,16 @@ public class ActivityWindowAndroid extends WindowAndroid
|
||||
Context context,
|
||||
boolean listenToActivityState,
|
||||
@NonNull ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
|
||||
IntentRequestTracker intentRequestTracker) {
|
||||
IntentRequestTracker intentRequestTracker,
|
||||
InsetObserver insetObserver) {
|
||||
this(
|
||||
context,
|
||||
listenToActivityState,
|
||||
new ActivityAndroidPermissionDelegate(
|
||||
new WeakReference<Activity>(ContextUtils.activityFromContext(context))),
|
||||
keyboardVisibilityDelegate,
|
||||
intentRequestTracker);
|
||||
intentRequestTracker,
|
||||
insetObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,8 +92,9 @@ public class ActivityWindowAndroid extends WindowAndroid
|
||||
boolean listenToActivityState,
|
||||
ActivityAndroidPermissionDelegate activityAndroidPermissionDelegate,
|
||||
ActivityKeyboardVisibilityDelegate activityKeyboardVisibilityDelegate,
|
||||
IntentRequestTracker intentRequestTracker) {
|
||||
super(context, intentRequestTracker);
|
||||
IntentRequestTracker intentRequestTracker,
|
||||
InsetObserver insetObserver) {
|
||||
super(context, intentRequestTracker, insetObserver);
|
||||
Activity activity = ContextUtils.activityFromContext(context);
|
||||
if (activity == null) {
|
||||
throw new IllegalArgumentException("Context is not and does not wrap an Activity");
|
||||
@ -101,10 +108,7 @@ public class ActivityWindowAndroid extends WindowAndroid
|
||||
activityKeyboardVisibilityDelegate.setLazyKeyboardInsetSupplier(
|
||||
LazyOneshotSupplier.fromSupplier(
|
||||
() -> {
|
||||
// `getInsetObserver()` implicitly checks for a window and for the
|
||||
// activity to not be finishing.
|
||||
var insetObserver = getInsetObserver();
|
||||
if (insetObserver == null) {
|
||||
if (getInsetObserver() == null) {
|
||||
// An InsetObserver can no longer be created. Stub this out so
|
||||
// calls continue to succeed.
|
||||
return new ObservableSupplierImpl<Integer>();
|
||||
|
@ -77,7 +77,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
|
||||
private KeyboardVisibilityDelegate mKeyboardVisibilityDelegate =
|
||||
KeyboardVisibilityDelegate.getInstance();
|
||||
|
||||
private InsetObserver mInsetObserver;
|
||||
private @Nullable InsetObserver mInsetObserver;
|
||||
|
||||
// Native pointer to the c++ WindowAndroid object.
|
||||
private long mNativeWindowAndroid;
|
||||
@ -192,9 +192,11 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
|
||||
this(context, DisplayAndroid.getNonMultiDisplay(context));
|
||||
}
|
||||
|
||||
protected WindowAndroid(Context context, IntentRequestTracker tracker) {
|
||||
protected WindowAndroid(
|
||||
Context context, IntentRequestTracker tracker, InsetObserver insetObserver) {
|
||||
this(context, DisplayAndroid.getNonMultiDisplay(context));
|
||||
mIntentRequestTracker = (IntentRequestTrackerImpl) tracker;
|
||||
mInsetObserver = insetObserver;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -788,14 +790,6 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
|
||||
|
||||
/** Returns the {@link InsetObserver} for the root view of the activity or null. */
|
||||
public InsetObserver getInsetObserver() {
|
||||
if (mInsetObserver == null) {
|
||||
Window window = getWindow();
|
||||
if (window == null) return null;
|
||||
|
||||
mInsetObserver =
|
||||
new InsetObserver(
|
||||
new ImmutableWeakReference<>(window.getDecorView().getRootView()));
|
||||
}
|
||||
return mInsetObserver;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user