Commit 708cc13d authored by Robbie McElrath's avatar Robbie McElrath Committed by Chromium LUCI CQ

[WebLayer] Make BrowserFragmentImpl extend FragmentHostingRemoteFragmentImpl

BrowserFragmentImpl extending FragmentHostingRemoteFragmentImpl means we
have a FragmentController (and therefore a FragmentManager) available to
us in the main WebLayer UI. Upcoming page info changes will use this
FragmentManager, and mediarouter could be refactored to use this as well
instead of creating its own RemoteFragment.

Bug: 1077766
Change-Id: Id659555b827feed4293b062f8b0d8c6f4889daba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2575753
Commit-Queue: Robbie McElrath <rmcelrath@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835045}
parent b2af6d84
......@@ -28,7 +28,7 @@ import org.chromium.weblayer_private.interfaces.StrictModeWorkaround;
/**
* Implementation of RemoteFragmentImpl which forwards logic to BrowserImpl.
*/
public class BrowserFragmentImpl extends RemoteFragmentImpl {
public class BrowserFragmentImpl extends FragmentHostingRemoteFragmentImpl {
private static int sResumedCount;
private static long sSessionStartTimeMs;
......@@ -41,11 +41,6 @@ public class BrowserFragmentImpl extends RemoteFragmentImpl {
// embedder.
private Context mEmbedderActivityContext;
// The WebLayer-wrapped context object. This context gets assets and resources from WebLayer,
// not from the embedder. Use this for the most part, especially to resolve WebLayer-specific
// resource IDs.
private Context mContext;
public BrowserFragmentImpl(
ProfileManager profileManager, IRemoteFragmentClient client, Bundle fragmentArgs) {
super(client);
......@@ -66,11 +61,9 @@ public class BrowserFragmentImpl extends RemoteFragmentImpl {
StrictModeWorkaround.apply();
super.onAttach(context);
mEmbedderActivityContext = context;
mContext = new ContextThemeWrapper(
ClassLoaderContextWrapperFactory.get(context), R.style.Theme_BrowserUI);
if (mBrowser != null) { // On first creation, onAttach is called before onCreate
mBrowser.onFragmentAttached(
mEmbedderActivityContext, new FragmentWindowAndroid(mContext, this));
mBrowser.onFragmentAttached(mEmbedderActivityContext,
new FragmentWindowAndroid(getWebLayerContext(), this));
}
}
......@@ -80,12 +73,12 @@ public class BrowserFragmentImpl extends RemoteFragmentImpl {
super.onCreate(savedInstanceState);
// onCreate() is only called once
assert mBrowser == null;
// onCreate() is always called after onAttach(). onAttach() sets |mContext| and
// onCreate() is always called after onAttach(). onAttach() sets |getWebLayerContext()| and
// |mEmbedderContext|.
assert mContext != null;
assert getWebLayerContext() != null;
assert mEmbedderActivityContext != null;
mBrowser = new BrowserImpl(mEmbedderActivityContext, mProfile, mPersistenceId,
savedInstanceState, new FragmentWindowAndroid(mContext, this));
savedInstanceState, new FragmentWindowAndroid(getWebLayerContext(), this));
}
@Override
......@@ -123,7 +116,6 @@ public class BrowserFragmentImpl extends RemoteFragmentImpl {
if (mBrowser != null) {
mBrowser.onFragmentDetached();
}
mContext = null;
}
@Override
......@@ -189,4 +181,12 @@ public class BrowserFragmentImpl extends RemoteFragmentImpl {
}
};
}
@Override
protected FragmentHostingRemoteFragmentImpl.RemoteFragmentContext createRemoteFragmentContext(
Context embedderContext) {
Context wrappedContext = ClassLoaderContextWrapperFactory.get(embedderContext);
Context themedContext = new ContextThemeWrapper(wrappedContext, R.style.Theme_BrowserUI);
return new FragmentHostingRemoteFragmentImpl.RemoteFragmentContext(themedContext);
}
}
......@@ -160,6 +160,7 @@ public abstract class FragmentHostingRemoteFragmentImpl extends RemoteFragmentIm
mContext = createRemoteFragmentContext(embedderContext);
mFragmentController =
FragmentController.createController(new RemoteFragmentHostCallback(this));
mFragmentController.attachHost(null);
// Some appcompat functionality depends on Fragments being hosted from within an
// AppCompatActivity, which performs some static initialization. Even if we're running
......@@ -172,10 +173,7 @@ public abstract class FragmentHostingRemoteFragmentImpl extends RemoteFragmentIm
@Override
public void onCreate(Bundle savedInstanceState) {
StrictModeWorkaround.apply();
mFragmentController.attachHost(null);
super.onCreate(savedInstanceState);
mFragmentController.dispatchCreate();
}
......@@ -198,6 +196,14 @@ public abstract class FragmentHostingRemoteFragmentImpl extends RemoteFragmentIm
StrictModeWorkaround.apply();
super.onDetach();
mContext = null;
// If the Fragment is retained, onDestory won't be called during configuration changes. We
// have to create a new FragmentController that's attached to the correct Context when
// reattaching this Fragment, so destroy the existing one here.
if (!mFragmentController.getSupportFragmentManager().isDestroyed()) {
mFragmentController.dispatchDestroy();
assert mFragmentController.getSupportFragmentManager().isDestroyed();
}
}
@Override
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment