Commit bbdeabcf authored by Pavel Shmakov's avatar Pavel Shmakov Committed by Commit Bot

Plumb Fragment API between "public" and "browser" modules

The implementation code of the Fragment and the class actually extending
Fragment live in different ClassLoaders. Thus we need to forward calls
back and forth through aidl interfaces.

Change-Id: I765d116480778ce4d0c82dece91550c85855e950
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1813299Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Pavel Shmakov <pshmakov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699785}
parent d349f92c
...@@ -8,6 +8,7 @@ import("//build/config/android/rules.gni") ...@@ -8,6 +8,7 @@ import("//build/config/android/rules.gni")
android_library("java") { android_library("java") {
java_files = [ java_files = [
"org/chromium/weblayer_private/BrowserControllerImpl.java", "org/chromium/weblayer_private/BrowserControllerImpl.java",
"org/chromium/weblayer_private/BrowserFragmentControllerImpl.java",
"org/chromium/weblayer_private/BrowserObserverProxy.java", "org/chromium/weblayer_private/BrowserObserverProxy.java",
"org/chromium/weblayer_private/ContentView.java", "org/chromium/weblayer_private/ContentView.java",
"org/chromium/weblayer_private/ContentViewRenderView.java", "org/chromium/weblayer_private/ContentViewRenderView.java",
...@@ -18,6 +19,7 @@ android_library("java") { ...@@ -18,6 +19,7 @@ android_library("java") {
"org/chromium/weblayer_private/TopControlsContainerView.java", "org/chromium/weblayer_private/TopControlsContainerView.java",
"org/chromium/weblayer_private/WebLayerImpl.java", "org/chromium/weblayer_private/WebLayerImpl.java",
"org/chromium/weblayer_private/ChildProcessServiceImpl.java", "org/chromium/weblayer_private/ChildProcessServiceImpl.java",
"org/chromium/weblayer_private/RemoteFragmentImpl.java",
] ]
deps = [ deps = [
...@@ -54,6 +56,7 @@ android_library("client_java") { ...@@ -54,6 +56,7 @@ android_library("client_java") {
android_aidl("aidl") { android_aidl("aidl") {
import_include = [ "org/chromium/weblayer_private/aidl" ] import_include = [ "org/chromium/weblayer_private/aidl" ]
sources = [ sources = [
"org/chromium/weblayer_private/aidl/IBrowserFragmentController.aidl",
"org/chromium/weblayer_private/aidl/IBrowserController.aidl", "org/chromium/weblayer_private/aidl/IBrowserController.aidl",
"org/chromium/weblayer_private/aidl/IBrowserControllerClient.aidl", "org/chromium/weblayer_private/aidl/IBrowserControllerClient.aidl",
"org/chromium/weblayer_private/aidl/IChildProcessService.aidl", "org/chromium/weblayer_private/aidl/IChildProcessService.aidl",
...@@ -63,6 +66,8 @@ android_aidl("aidl") { ...@@ -63,6 +66,8 @@ android_aidl("aidl") {
"org/chromium/weblayer_private/aidl/INavigationControllerClient.aidl", "org/chromium/weblayer_private/aidl/INavigationControllerClient.aidl",
"org/chromium/weblayer_private/aidl/IObjectWrapper.aidl", "org/chromium/weblayer_private/aidl/IObjectWrapper.aidl",
"org/chromium/weblayer_private/aidl/IProfile.aidl", "org/chromium/weblayer_private/aidl/IProfile.aidl",
"org/chromium/weblayer_private/aidl/IRemoteFragment.aidl",
"org/chromium/weblayer_private/aidl/IRemoteFragmentClient.aidl",
"org/chromium/weblayer_private/aidl/IWebLayer.aidl", "org/chromium/weblayer_private/aidl/IWebLayer.aidl",
] ]
} }
...@@ -29,8 +29,10 @@ import org.chromium.weblayer_private.aidl.ObjectWrapper; ...@@ -29,8 +29,10 @@ import org.chromium.weblayer_private.aidl.ObjectWrapper;
public final class BrowserControllerImpl extends IBrowserController.Stub { public final class BrowserControllerImpl extends IBrowserController.Stub {
private long mNativeBrowserController; private long mNativeBrowserController;
// TODO: move mWindowAndroid, mContentViewRenderView, mContentView, mTopControlsContainerView to
// BrowserFragmentControllerImpl.
private ActivityWindowAndroid mWindowAndroid; private ActivityWindowAndroid mWindowAndroid;
// This view is the main view (returned from OnCreateView()). // This view is the main view (returned from the fragment's onCreateView()).
private ContentViewRenderView mContentViewRenderView; private ContentViewRenderView mContentViewRenderView;
// One of these is needed per WebContents. // One of these is needed per WebContents.
private ContentView mContentView; private ContentView mContentView;
...@@ -125,7 +127,6 @@ public final class BrowserControllerImpl extends IBrowserController.Stub { ...@@ -125,7 +127,6 @@ public final class BrowserControllerImpl extends IBrowserController.Stub {
mBrowserObserverProxy = new BrowserObserverProxy(mNativeBrowserController, client); mBrowserObserverProxy = new BrowserObserverProxy(mNativeBrowserController, client);
} }
@Override
public void destroy() { public void destroy() {
BrowserControllerImplJni.get().setTopControlsContainerView( BrowserControllerImplJni.get().setTopControlsContainerView(
mNativeBrowserController, BrowserControllerImpl.this, 0); mNativeBrowserController, BrowserControllerImpl.this, 0);
...@@ -138,18 +139,16 @@ public final class BrowserControllerImpl extends IBrowserController.Stub { ...@@ -138,18 +139,16 @@ public final class BrowserControllerImpl extends IBrowserController.Stub {
mNativeBrowserController = 0; mNativeBrowserController = 0;
} }
@Override
public void setTopView(IObjectWrapper viewWrapper) { public void setTopView(IObjectWrapper viewWrapper) {
View view = ObjectWrapper.unwrap(viewWrapper, View.class); View view = ObjectWrapper.unwrap(viewWrapper, View.class);
mTopControlsContainerView.setView(view); mTopControlsContainerView.setView(view);
} }
@Override /** Returns top-level View this Controller works with */
public IObjectWrapper onCreateView() { public View getView() {
return ObjectWrapper.wrap(mContentViewRenderView); return mContentViewRenderView;
} }
@Override
public void setSupportsEmbedding(boolean enable, IObjectWrapper callback) { public void setSupportsEmbedding(boolean enable, IObjectWrapper callback) {
mContentViewRenderView.requestMode(enable ? ContentViewRenderView.MODE_TEXTURE_VIEW mContentViewRenderView.requestMode(enable ? ContentViewRenderView.MODE_TEXTURE_VIEW
: ContentViewRenderView.MODE_SURFACE_VIEW, : ContentViewRenderView.MODE_SURFACE_VIEW,
......
// 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.view.View;
import org.chromium.weblayer_private.aidl.IBrowserController;
import org.chromium.weblayer_private.aidl.IBrowserFragmentController;
import org.chromium.weblayer_private.aidl.IObjectWrapper;
import org.chromium.weblayer_private.aidl.IRemoteFragment;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
/**
* Implementation of {@link IBrowserFragmentController}.
*/
public class BrowserFragmentControllerImpl extends IBrowserFragmentController.Stub {
private final BrowserControllerImpl mController;
private final BrowserRemoteFragmentImpl mRemoteFragmentImpl;
public BrowserFragmentControllerImpl(BrowserControllerImpl controller,
IRemoteFragmentClient fragmentClient) {
mController = controller;
mRemoteFragmentImpl = new BrowserRemoteFragmentImpl(fragmentClient);
}
@Override
public void setTopView(IObjectWrapper view) {
mController.setTopView(view);
}
@Override
public void setSupportsEmbedding(boolean enable, IObjectWrapper valueCallback) {
mController.setSupportsEmbedding(enable, valueCallback);
}
@Override
public IRemoteFragment getRemoteFragment() {
return mRemoteFragmentImpl;
}
@Override
public IBrowserController getBrowserController() {
return mController;
}
@Override
public void destroy() {
mController.destroy();
}
private class BrowserRemoteFragmentImpl extends RemoteFragmentImpl {
public BrowserRemoteFragmentImpl(IRemoteFragmentClient client) {
super(client);
}
@Override
public View onCreateView() {
return mController.getView();
}
}
}
...@@ -8,9 +8,10 @@ import android.content.Context; ...@@ -8,9 +8,10 @@ import android.content.Context;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.weblayer_private.aidl.IBrowserController; import org.chromium.weblayer_private.aidl.IBrowserFragmentController;
import org.chromium.weblayer_private.aidl.IObjectWrapper; import org.chromium.weblayer_private.aidl.IObjectWrapper;
import org.chromium.weblayer_private.aidl.IProfile; import org.chromium.weblayer_private.aidl.IProfile;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
import org.chromium.weblayer_private.aidl.ObjectWrapper; import org.chromium.weblayer_private.aidl.ObjectWrapper;
@JNINamespace("weblayer") @JNINamespace("weblayer")
...@@ -33,8 +34,12 @@ public final class ProfileImpl extends IProfile.Stub { ...@@ -33,8 +34,12 @@ public final class ProfileImpl extends IProfile.Stub {
} }
@Override @Override
public IBrowserController createBrowserController(IObjectWrapper context) { public IBrowserFragmentController createBrowserFragmentController(IRemoteFragmentClient
return new BrowserControllerImpl(ObjectWrapper.unwrap(context, Context.class), this); fragmentClient,
IObjectWrapper context) {
BrowserControllerImpl browserController = new BrowserControllerImpl(
ObjectWrapper.unwrap(context, Context.class), this);
return new BrowserFragmentControllerImpl(browserController, fragmentClient);
} }
long getNativeProfile() { long getNativeProfile() {
......
// 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.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.view.View;
import org.chromium.weblayer_private.aidl.APICallException;
import org.chromium.weblayer_private.aidl.IObjectWrapper;
import org.chromium.weblayer_private.aidl.IRemoteFragment;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
import org.chromium.weblayer_private.aidl.ObjectWrapper;
/**
* Base for the classes controlling a Fragment that exists in another ClassLoader. Extending this
* class is similar to extending Fragment: e.g. one can override lifecycle methods, not forgetting
* to call super, etc.
*/
public abstract class RemoteFragmentImpl extends IRemoteFragment.Stub {
private final IRemoteFragmentClient mClient;
protected RemoteFragmentImpl(IRemoteFragmentClient client) {
mClient = client;
}
public View onCreateView() {
return null;
}
public final Activity getActivity() {
try {
return ObjectWrapper.unwrap(mClient.getActivity(), Activity.class);
} catch (RemoteException e) {
throw new APICallException(e);
}
}
// TODO(pshmakov): add dependency to androidx.annotation and put @CallSuper here.
public void onCreate(Bundle savedInstanceState) {
try {
mClient.superOnCreate(ObjectWrapper.wrap(savedInstanceState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onAttach(Context context) {
try {
mClient.superOnAttach(ObjectWrapper.wrap(context));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onActivityCreated(Bundle savedInstanceState) {
try {
mClient.superOnActivityCreated(ObjectWrapper.wrap(savedInstanceState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onStart() {
try {
mClient.superOnStart();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onDestroy() {
try {
mClient.superOnDestroy();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onDetach() {
try {
mClient.superOnDetach();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onResume() {
try {
mClient.superOnResume();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onDestroyView() {
try {
mClient.superOnDestroyView();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onStop() {
try {
mClient.superOnStop();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onPause() {
try {
mClient.superOnPause();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public void onSaveInstaceState(Bundle outState) {
try {
mClient.superOnSaveInstanceState(ObjectWrapper.wrap(outState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
// IRemoteFragment implementation below.
@Override
public final IObjectWrapper handleOnCreateView() {
return ObjectWrapper.wrap(onCreateView());
}
@Override
public final void handleOnStart() {
onStart();
}
@Override
public final void handleOnCreate(IObjectWrapper savedInstanceState) {
onCreate(ObjectWrapper.unwrap(savedInstanceState, Bundle.class));
}
@Override
public final void handleOnAttach(IObjectWrapper context) {
onAttach(ObjectWrapper.unwrap(context, Context.class));
}
@Override
public final void handleOnActivityCreated(IObjectWrapper savedInstanceState) {
onActivityCreated(ObjectWrapper.unwrap(savedInstanceState, Bundle.class));
}
@Override
public final void handleOnResume() {
onResume();
}
@Override
public final void handleOnPause() {
onPause();
}
@Override
public final void handleOnStop() {
onStop();
}
@Override
public final void handleOnDestroyView() {
onDestroyView();
}
@Override
public final void handleOnDetach() {
onDetach();
}
@Override
public final void handleOnDestroy() {
onDestroy();
}
@Override
public final void handleOnSaveInstanceState(IObjectWrapper outState) {
onSaveInstaceState(ObjectWrapper.unwrap(outState, Bundle.class));
}
}
...@@ -5,21 +5,11 @@ ...@@ -5,21 +5,11 @@
package org.chromium.weblayer_private.aidl; package org.chromium.weblayer_private.aidl;
import org.chromium.weblayer_private.aidl.IBrowserControllerClient; import org.chromium.weblayer_private.aidl.IBrowserControllerClient;
import org.chromium.weblayer_private.aidl.IObjectWrapper; import org.chromium.weblayer_private.aidl.INavigationController;
import org.chromium.weblayer_private.aidl.INavigationControllerClient;
interface IBrowserController { interface IBrowserController {
void setClient(in IBrowserControllerClient client) = 0; void setClient(in IBrowserControllerClient client) = 0;
INavigationController createNavigationController(in INavigationControllerClient client) = 1; INavigationController createNavigationController(in INavigationControllerClient client) = 1;
void setTopView(in IObjectWrapper view) = 2;
void destroy() = 3;
IObjectWrapper onCreateView() = 4;
// |valueCallback| is a wrapped ValueCallback<Boolean> instead. The bool value in |valueCallback|
// indicates is whether the request was successful. Request might fail if it is subsumed by a
// following request, or if this object is destroyed.
void setSupportsEmbedding(in boolean enable, in IObjectWrapper valueCallback) = 5;
} }
// 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.aidl;
import org.chromium.weblayer_private.aidl.IBrowserController;
import org.chromium.weblayer_private.aidl.IObjectWrapper;
import org.chromium.weblayer_private.aidl.IRemoteFragment;
interface IBrowserFragmentController {
void destroy() = 0;
IBrowserController getBrowserController() = 1;
IRemoteFragment getRemoteFragment() = 2;
void setTopView(IObjectWrapper view) = 3;
// |valueCallback| is a wrapped ValueCallback<Boolean> instead. The bool value in |valueCallback|
// indicates is whether the request was successful. Request might fail if it is subsumed by a
// following request, or if this object is destroyed.
void setSupportsEmbedding(in boolean enable, in IObjectWrapper valueCallback) = 4;
}
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
package org.chromium.weblayer_private.aidl; package org.chromium.weblayer_private.aidl;
import org.chromium.weblayer_private.aidl.IBrowserController; import org.chromium.weblayer_private.aidl.IBrowserFragmentController;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
import org.chromium.weblayer_private.aidl.IObjectWrapper; import org.chromium.weblayer_private.aidl.IObjectWrapper;
interface IProfile { interface IProfile {
...@@ -13,8 +14,11 @@ interface IProfile { ...@@ -13,8 +14,11 @@ interface IProfile {
void clearBrowsingData() = 1; void clearBrowsingData() = 1;
/** /**
* Creates a new IBrowserController. * Creates a new IBrowserFragmentController.
* @param fragmentClient IRemoteFragmentClient that will host the Fragment implemented on the
* weblayer side.
* @param context Context that refers the the weblayer implementation * @param context Context that refers the the weblayer implementation
*/ */
IBrowserController createBrowserController(in IObjectWrapper context) = 2; IBrowserFragmentController createBrowserFragmentController(
in IRemoteFragmentClient fragmentClient, in IObjectWrapper context) = 2;
} }
// 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.aidl;
import org.chromium.weblayer_private.aidl.IObjectWrapper;
interface IRemoteFragment {
// Using IObjectWrapper instead of Bundle to pass by reference instead of by value.
void handleOnCreate(in IObjectWrapper savedInstanceState) = 0;
void handleOnAttach(in IObjectWrapper context) = 1;
void handleOnActivityCreated(in IObjectWrapper savedInstanceState) = 2;
IObjectWrapper handleOnCreateView() = 3;
void handleOnStart() = 4;
void handleOnResume() = 5;
void handleOnPause() = 6;
void handleOnStop() = 7;
void handleOnDestroyView() = 8;
void handleOnDetach() = 9;
void handleOnDestroy() = 10;
void handleOnSaveInstanceState(in IObjectWrapper outState) = 11;
}
// 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.aidl;
interface IRemoteFragmentClient {
void superOnCreate(in IObjectWrapper savedInstanceState) = 0;
void superOnAttach(in IObjectWrapper context) = 1;
void superOnActivityCreated(in IObjectWrapper savedInstanceState) = 2;
void superOnStart() = 3;
void superOnResume() = 4;
void superOnPause() = 5;
void superOnStop() = 6;
void superOnDestroyView() = 7;
void superOnDetach() = 8;
void superOnDestroy() = 9;
void superOnSaveInstanceState(in IObjectWrapper outState) = 10;
IObjectWrapper getActivity() = 11;
}
...@@ -21,8 +21,9 @@ android_resources("client_resources") { ...@@ -21,8 +21,9 @@ android_resources("client_resources") {
android_library("java") { android_library("java") {
java_files = [ java_files = [
"org/chromium/weblayer/RemoteFragmentClient.java",
"org/chromium/weblayer/BrowserController.java", "org/chromium/weblayer/BrowserController.java",
"org/chromium/weblayer/BrowserFragmentImpl.java", "org/chromium/weblayer/BrowserFragmentController.java",
"org/chromium/weblayer/BrowserObserver.java", "org/chromium/weblayer/BrowserObserver.java",
"org/chromium/weblayer/Callback.java", "org/chromium/weblayer/Callback.java",
"org/chromium/weblayer/ListenableResult.java", "org/chromium/weblayer/ListenableResult.java",
...@@ -38,6 +39,10 @@ android_library("java") { ...@@ -38,6 +39,10 @@ android_library("java") {
deps = [ deps = [
":client_resources", ":client_resources",
"//weblayer/browser/java:client_java", "//weblayer/browser/java:client_java",
# TODO(pshmakov): Exclude this from the artifact and make sure we can depend on other version
# than Chrome.
"//third_party/android_deps:android_support_v4_java",
] ]
# Needed for android.webkit.WebViewDelegate. # Needed for android.webkit.WebViewDelegate.
......
...@@ -6,12 +6,10 @@ package org.chromium.weblayer; ...@@ -6,12 +6,10 @@ package org.chromium.weblayer;
import android.net.Uri; import android.net.Uri;
import android.os.RemoteException; import android.os.RemoteException;
import android.view.View;
import org.chromium.weblayer_private.aidl.APICallException; import org.chromium.weblayer_private.aidl.APICallException;
import org.chromium.weblayer_private.aidl.IBrowserController; import org.chromium.weblayer_private.aidl.IBrowserController;
import org.chromium.weblayer_private.aidl.IBrowserControllerClient; import org.chromium.weblayer_private.aidl.IBrowserControllerClient;
import org.chromium.weblayer_private.aidl.ObjectWrapper;
public final class BrowserController { public final class BrowserController {
private final IBrowserController mImpl; private final IBrowserController mImpl;
...@@ -47,23 +45,6 @@ public final class BrowserController { ...@@ -47,23 +45,6 @@ public final class BrowserController {
mObservers.removeObserver(observer); mObservers.removeObserver(observer);
} }
// Only called from BrowserFragmentImpl.
void destroy() {
try {
mImpl.destroy();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
public View onCreateView() {
try {
return ObjectWrapper.unwrap(mImpl.onCreateView(), View.class);
} catch (RemoteException e) {
throw new APICallException(e);
}
}
IBrowserController getIBrowserController() { IBrowserController getIBrowserController() {
return mImpl; return mImpl;
} }
......
...@@ -5,43 +5,54 @@ ...@@ -5,43 +5,54 @@
package org.chromium.weblayer; package org.chromium.weblayer;
import android.os.RemoteException; import android.os.RemoteException;
import android.support.v4.app.Fragment;
import android.view.View; import android.view.View;
import android.webkit.ValueCallback; import android.webkit.ValueCallback;
import org.chromium.weblayer_private.aidl.APICallException; import org.chromium.weblayer_private.aidl.APICallException;
import org.chromium.weblayer_private.aidl.IBrowserController; import org.chromium.weblayer_private.aidl.IBrowserFragmentController;
import org.chromium.weblayer_private.aidl.ObjectWrapper; import org.chromium.weblayer_private.aidl.ObjectWrapper;
/** /**
* Provides an API similar to that of Fragment. To avoid depending upon a particular Fragment * Represents a browser fragment. Created from Profile.
* implementation, this class does not actually extend Fragment. It is expected that consumers of
* this provide an implementation of Fragment that calls through to the similarly named methods in
* this class.
*
* BrowserFragmentImpl is created from Profile.
*/ */
public final class BrowserFragmentImpl { public final class BrowserFragmentController {
private BrowserController mBrowserController; private final IBrowserFragmentController mImpl;
private final RemoteFragmentClient mFragment;
private BrowserController mController;
BrowserFragmentImpl(IBrowserController iBrowserController) { BrowserFragmentController(IBrowserFragmentController impl, RemoteFragmentClient fragment) {
mBrowserController = new BrowserController(iBrowserController); mImpl = impl;
mFragment = fragment;
} }
public void destroy() { public void destroy() {
mBrowserController.destroy();
}
public void setTopView(View view) {
try { try {
getIBrowserController().setTopView(ObjectWrapper.wrap(view)); mImpl.destroy();
} catch (RemoteException e) { } catch (RemoteException e) {
throw new APICallException(e); throw new APICallException(e);
} }
} }
public View onCreateView() { // TODO(pshmakov): rename this to BrowserTabController.
public BrowserController getBrowserController() {
if (mController == null) {
try {
mController = new BrowserController(mImpl.getBrowserController());
} catch (RemoteException e) {
throw new APICallException(e);
}
}
return mController;
}
public Fragment getFragment() {
return mFragment;
}
public void setTopView(View view) {
try { try {
return ObjectWrapper.unwrap(getIBrowserController().onCreateView(), View.class); mImpl.setTopView(ObjectWrapper.wrap(view));
} catch (RemoteException e) { } catch (RemoteException e) {
throw new APICallException(e); throw new APICallException(e);
} }
...@@ -59,7 +70,7 @@ public final class BrowserFragmentImpl { ...@@ -59,7 +70,7 @@ public final class BrowserFragmentImpl {
public ListenableResult<Boolean> setSupportsEmbedding(boolean enable) { public ListenableResult<Boolean> setSupportsEmbedding(boolean enable) {
try { try {
final ListenableResult<Boolean> listenableResult = new ListenableResult<Boolean>(); final ListenableResult<Boolean> listenableResult = new ListenableResult<Boolean>();
getIBrowserController().setSupportsEmbedding( mImpl.setSupportsEmbedding(
enable, ObjectWrapper.wrap(new ValueCallback<Boolean>() { enable, ObjectWrapper.wrap(new ValueCallback<Boolean>() {
@Override @Override
public void onReceiveValue(Boolean result) { public void onReceiveValue(Boolean result) {
...@@ -71,12 +82,4 @@ public final class BrowserFragmentImpl { ...@@ -71,12 +82,4 @@ public final class BrowserFragmentImpl {
throw new APICallException(e); throw new APICallException(e);
} }
} }
public BrowserController getBrowserController() {
return mBrowserController;
}
private IBrowserController getIBrowserController() {
return mBrowserController.getIBrowserController();
}
} }
...@@ -8,6 +8,7 @@ import android.content.Context; ...@@ -8,6 +8,7 @@ import android.content.Context;
import android.os.RemoteException; import android.os.RemoteException;
import org.chromium.weblayer_private.aidl.APICallException; import org.chromium.weblayer_private.aidl.APICallException;
import org.chromium.weblayer_private.aidl.IBrowserFragmentController;
import org.chromium.weblayer_private.aidl.IProfile; import org.chromium.weblayer_private.aidl.IProfile;
import org.chromium.weblayer_private.aidl.ObjectWrapper; import org.chromium.weblayer_private.aidl.ObjectWrapper;
...@@ -43,10 +44,14 @@ public final class Profile { ...@@ -43,10 +44,14 @@ public final class Profile {
} }
} }
public BrowserFragmentImpl createBrowserFragment(Context context) { public BrowserFragmentController createBrowserFragmentController(Context context) {
try { try {
return new BrowserFragmentImpl(mImpl.createBrowserController( RemoteFragmentClient fragmentClient = new RemoteFragmentClient();
ObjectWrapper.wrap(WebLayer.createRemoteContext(context)))); IBrowserFragmentController browserFragmentImpl = mImpl.createBrowserFragmentController(
fragmentClient.asIRemoteFragmentClient(),
ObjectWrapper.wrap(WebLayer.createRemoteContext(context)));
fragmentClient.setRemoteFragment(browserFragmentImpl.getRemoteFragment());
return new BrowserFragmentController(browserFragmentImpl, fragmentClient);
} catch (RemoteException e) { } catch (RemoteException e) {
throw new APICallException(e); throw new APICallException(e);
} }
......
// 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;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.chromium.weblayer_private.aidl.APICallException;
import org.chromium.weblayer_private.aidl.IObjectWrapper;
import org.chromium.weblayer_private.aidl.IRemoteFragment;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
import org.chromium.weblayer_private.aidl.ObjectWrapper;
/**
* Hosts a "remote fragment" (represented by {@link IRemoteFragment}) that lives in another
* ClassLoader. The remote fragment has all the actual logic (e.g. handling lifecycle events), while
* this class actually extends {@link Fragment}, forwarding the calls to and from the remote
* fragment. Thus it is "hosting" the fragment implemented elsewhere.
*/
public final class RemoteFragmentClient extends Fragment {
private final IRemoteFragmentClient mClientImpl = new IRemoteFragmentClient.Stub() {
@Override
public void superOnCreate(IObjectWrapper savedInstanceState) {
RemoteFragmentClient.super.onCreate(ObjectWrapper.unwrap(savedInstanceState,
Bundle.class));
}
@Override
public void superOnAttach(IObjectWrapper context) {
RemoteFragmentClient.super.onAttach(ObjectWrapper.unwrap(context, Context.class));
}
@Override
public void superOnActivityCreated(IObjectWrapper savedInstanceState) {
RemoteFragmentClient.super.onCreate(ObjectWrapper.unwrap(savedInstanceState,
Bundle.class));
}
@Override
public void superOnStart() {
RemoteFragmentClient.super.onStart();
}
@Override
public void superOnResume() {
RemoteFragmentClient.super.onResume();
}
@Override
public void superOnPause() {
RemoteFragmentClient.super.onPause();
}
@Override
public void superOnStop() {
RemoteFragmentClient.super.onStop();
}
@Override
public void superOnDestroyView() {
RemoteFragmentClient.super.onDestroyView();
}
@Override
public void superOnDetach() {
RemoteFragmentClient.super.onDetach();
}
@Override
public void superOnDestroy() {
RemoteFragmentClient.super.onDestroy();
}
@Override
public void superOnSaveInstanceState(IObjectWrapper outState) {
RemoteFragmentClient.super.onSaveInstanceState(ObjectWrapper.unwrap(outState,
Bundle.class));
}
@Override
public IObjectWrapper getActivity() {
return ObjectWrapper.wrap(RemoteFragmentClient.this.getActivity());
}
};
private IRemoteFragment mRemoteFragment;
// TODO(pshmakov): how do we deal with FragmentManager restoring this Fragment on its own?
/* package */ void setRemoteFragment(IRemoteFragment remoteFragment) {
mRemoteFragment = remoteFragment;
}
/* package */ IRemoteFragmentClient asIRemoteFragmentClient() {
return mClientImpl;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
try {
return ObjectWrapper.unwrap(mRemoteFragment.handleOnCreateView(), View.class);
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onAttach(Context context) {
try {
mRemoteFragment.handleOnAttach(ObjectWrapper.wrap(context));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onCreate(Bundle savedInstanceState) {
try {
mRemoteFragment.handleOnCreate(ObjectWrapper.wrap(savedInstanceState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onActivityCreated(Bundle savedInstanceState) {
try {
mRemoteFragment.handleOnActivityCreated(ObjectWrapper.wrap(savedInstanceState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onStart() {
try {
mRemoteFragment.handleOnStart();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onResume() {
try {
mRemoteFragment.handleOnResume();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onSaveInstanceState(Bundle outState) {
try {
mRemoteFragment.handleOnSaveInstanceState(ObjectWrapper.wrap(outState));
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onPause() {
try {
mRemoteFragment.handleOnPause();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onStop() {
try {
mRemoteFragment.handleOnStop();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onDestroyView() {
try {
mRemoteFragment.handleOnDestroyView();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onDestroy() {
try {
mRemoteFragment.handleOnDestroy();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
@SuppressWarnings("MissingSuperCall")
@Override
public void onDetach() {
try {
mRemoteFragment.handleOnDetach();
} catch (RemoteException e) {
throw new APICallException(e);
}
}
}
...@@ -7,15 +7,12 @@ package org.chromium.weblayer.demo; ...@@ -7,15 +7,12 @@ package org.chromium.weblayer.demo;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.text.InputType; import android.text.InputType;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
...@@ -26,7 +23,7 @@ import android.widget.TextView; ...@@ -26,7 +23,7 @@ import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener; import android.widget.TextView.OnEditorActionListener;
import org.chromium.weblayer.BrowserController; import org.chromium.weblayer.BrowserController;
import org.chromium.weblayer.BrowserFragmentImpl; import org.chromium.weblayer.BrowserFragmentController;
import org.chromium.weblayer.BrowserObserver; import org.chromium.weblayer.BrowserObserver;
import org.chromium.weblayer.Profile; import org.chromium.weblayer.Profile;
import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.WebLayer;
...@@ -40,38 +37,26 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -40,38 +37,26 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
private static final boolean USE_WEBVIEW = false; private static final boolean USE_WEBVIEW = false;
private Profile mProfile; private Profile mProfile;
private final BrowserFragmentImpl mBrowserFragments[] = new BrowserFragmentImpl[4]; private final BrowserFragmentController mBrowserFragmentControllers[] =
new BrowserFragmentController[4];
private final ContainerFrameLayout mContainerViews[] = new ContainerFrameLayout[4]; private final ContainerFrameLayout mContainerViews[] = new ContainerFrameLayout[4];
private final MyWebView mWebViews[] = new MyWebView[4]; private final MyWebView mWebViews[] = new MyWebView[4];
private FrameLayout mMainView; private FrameLayout mMainView;
public static class ShellFragment extends Fragment {
private BrowserFragmentImpl mBrowserFragment;
ShellFragment(BrowserFragmentImpl browserFragment) {
mBrowserFragment = browserFragment;
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return mBrowserFragment.onCreateView();
}
}
public static class ContainerFrameLayout extends FrameLayout { public static class ContainerFrameLayout extends FrameLayout {
private final BrowserFragmentImpl mFragment; private final BrowserFragmentController mFragmentController;
private int mIndex; private int mIndex;
private boolean mInterceptTouchEvent; private boolean mInterceptTouchEvent;
public ContainerFrameLayout(Context context, BrowserFragmentImpl fragment, int index) { public ContainerFrameLayout(Context context, BrowserFragmentController fragmentController,
int index) {
super(context); super(context);
mFragment = fragment; mFragmentController = fragmentController;
mIndex = index; mIndex = index;
} }
public BrowserFragmentImpl getFragment() { public BrowserFragmentController getFragmentController() {
return mFragment; return mFragmentController;
} }
public void setInterceptTouchEvent(boolean intercept) { public void setInterceptTouchEvent(boolean intercept) {
...@@ -130,18 +115,20 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -130,18 +115,20 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
} }
private void createNewFragment(int index) { private void createNewFragment(int index) {
mBrowserFragments[index] = mProfile.createBrowserFragment(this); mBrowserFragmentControllers[index] = mProfile.createBrowserFragmentController(this);
final BrowserController controller = mBrowserFragments[index].getBrowserController(); final BrowserController controller = mBrowserFragmentControllers[index]
.getBrowserController();
ContainerFrameLayout container = ContainerFrameLayout container =
new ContainerFrameLayout(this, mBrowserFragments[index], index); new ContainerFrameLayout(this, mBrowserFragmentControllers[index],
index);
mContainerViews[index] = container; mContainerViews[index] = container;
int viewId = View.generateViewId(); int viewId = View.generateViewId();
container.setId(viewId); container.setId(viewId);
mMainView.addView(container); mMainView.addView(container);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(viewId, new ShellFragment(mBrowserFragments[index])); transaction.add(viewId, mBrowserFragmentControllers[index].getFragment());
transaction.commit(); transaction.commit();
EditText urlView = new EditText(this); EditText urlView = new EditText(this);
...@@ -164,7 +151,7 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -164,7 +151,7 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
return true; return true;
} }
}); });
mBrowserFragments[index].setTopView(urlView); mBrowserFragmentControllers[index].setTopView(urlView);
controller.addObserver(new BrowserObserver() { controller.addObserver(new BrowserObserver() {
@Override @Override
...@@ -216,21 +203,21 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -216,21 +203,21 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
createNewFragment(1); createNewFragment(1);
createNewFragment(2); createNewFragment(2);
mBrowserFragments[0].getBrowserController().getNavigationController().navigate( mBrowserFragmentControllers[0].getBrowserController().getNavigationController()
Uri.parse(sanitizeUrl("https://www.google.com"))); .navigate(Uri.parse(sanitizeUrl("https://www.google.com")));
mBrowserFragments[1].getBrowserController().getNavigationController().navigate( mBrowserFragmentControllers[1].getBrowserController().getNavigationController()
Uri.parse(sanitizeUrl("https://en.wikipedia.org"))); .navigate(Uri.parse(sanitizeUrl("https://en.wikipedia.org")));
mBrowserFragments[2].getBrowserController().getNavigationController().navigate( mBrowserFragmentControllers[2].getBrowserController().getNavigationController()
Uri.parse(sanitizeUrl("https://www.chromium.org"))); .navigate(Uri.parse(sanitizeUrl("https://www.chromium.org")));
} }
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
for (int i = 0; i < mBrowserFragments.length; ++i) { for (int i = 0; i < mBrowserFragmentControllers.length; ++i) {
BrowserFragmentImpl fragment = mBrowserFragments[i]; BrowserFragmentController fragment = mBrowserFragmentControllers[i];
if (fragment != null) fragment.destroy(); if (fragment != null) fragment.destroy();
mBrowserFragments[i] = null; mBrowserFragmentControllers[i] = null;
} }
if (mProfile != null) mProfile.destroy(); if (mProfile != null) mProfile.destroy();
super.onDestroy(); super.onDestroy();
...@@ -260,11 +247,11 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -260,11 +247,11 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
mContainerViews[1].setOnClickListener(new OnClickImpl()); mContainerViews[1].setOnClickListener(new OnClickImpl());
mContainerViews[2].setOnClickListener(new OnClickImpl()); mContainerViews[2].setOnClickListener(new OnClickImpl());
mContainerViews[0].post(() -> { mContainerViews[0].post(() -> {
mBrowserFragments[0].setSupportsEmbedding(true).addCallback( mBrowserFragmentControllers[0].setSupportsEmbedding(true).addCallback(
(Boolean result) -> animateDown(mContainerViews[0])); (Boolean result) -> animateDown(mContainerViews[0]));
mBrowserFragments[1].setSupportsEmbedding(true).addCallback( mBrowserFragmentControllers[1].setSupportsEmbedding(true).addCallback(
(Boolean result) -> animateDown(mContainerViews[1])); (Boolean result) -> animateDown(mContainerViews[1]));
mBrowserFragments[2].setSupportsEmbedding(true).addCallback( mBrowserFragmentControllers[2].setSupportsEmbedding(true).addCallback(
(Boolean result) -> animateDown(mContainerViews[2])); (Boolean result) -> animateDown(mContainerViews[2]));
}); });
} }
...@@ -310,17 +297,18 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -310,17 +297,18 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
private static void animateDown(ContainerFrameLayout container) { private static void animateDown(ContainerFrameLayout container) {
// Start animation after fullying switched from SurfaceView to TextureView. // Start animation after fullying switched from SurfaceView to TextureView.
int index = container.getIndex(); int index = container.getIndex();
container.getFragment().setSupportsEmbedding(true).addCallback((Boolean result) -> { container.getFragmentController().setSupportsEmbedding(true)
container.animate() .addCallback((Boolean result) -> {
.scaleX(1.0f / 3) container.animate()
.scaleY(1.0f / 3) .scaleX(1.0f / 3)
.translationX( .scaleY(1.0f / 3)
-container.getWidth() / 3.0f + (container.getWidth() / 3.0f * index)) .translationX(-container.getWidth() / 3.0f
.translationY(container.getHeight() / 3.0f) + (container.getWidth() / 3.0f * index))
.alpha(0.8f) .translationY(container.getHeight() / 3.0f)
.setDuration(500); .alpha(0.8f)
container.setInterceptTouchEvent(true); .setDuration(500);
}); container.setInterceptTouchEvent(true);
});
} }
private static void animateUp(ContainerFrameLayout container) { private static void animateUp(ContainerFrameLayout container) {
...@@ -332,7 +320,7 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity { ...@@ -332,7 +320,7 @@ public class WebLayerAnimationDemoActivity extends FragmentActivity {
.alpha(1.0f) .alpha(1.0f)
.setDuration(500) .setDuration(500)
.withEndAction(() -> { .withEndAction(() -> {
container.getFragment().setSupportsEmbedding(false); container.getFragmentController().setSupportsEmbedding(false);
container.setInterceptTouchEvent(false); container.setInterceptTouchEvent(false);
}); });
} }
......
...@@ -32,11 +32,11 @@ public class RenderingTest { ...@@ -32,11 +32,11 @@ public class RenderingTest {
String url = "data:text,foo"; String url = "data:text,foo";
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
activity.getBrowserFragmentImpl().setSupportsEmbedding(true).addCallback( activity.getBrowserFragmentController().setSupportsEmbedding(true).addCallback(
(Boolean result) -> { (Boolean result) -> {
Assert.assertTrue(result); Assert.assertTrue(result);
activity.getBrowserFragmentImpl().setSupportsEmbedding(false).addCallback( activity.getBrowserFragmentController().setSupportsEmbedding(false)
(Boolean result2) -> { .addCallback((Boolean result2) -> {
Assert.assertTrue(result2); Assert.assertTrue(result2);
mActivityTestRule.loadUrl(url); mActivityTestRule.loadUrl(url);
latch.countDown(); latch.countDown();
...@@ -61,12 +61,12 @@ public class RenderingTest { ...@@ -61,12 +61,12 @@ public class RenderingTest {
CountDownLatch latch = new CountDownLatch(2); CountDownLatch latch = new CountDownLatch(2);
String url = "data:text,foo"; String url = "data:text,foo";
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
activity.getBrowserFragmentImpl().setSupportsEmbedding(true).addCallback( activity.getBrowserFragmentController().setSupportsEmbedding(true).addCallback(
(Boolean result) -> { (Boolean result) -> {
Assert.assertTrue(result); Assert.assertTrue(result);
latch.countDown(); latch.countDown();
}); });
activity.getBrowserFragmentImpl().setSupportsEmbedding(true).addCallback( activity.getBrowserFragmentController().setSupportsEmbedding(true).addCallback(
(Boolean result) -> { (Boolean result) -> {
Assert.assertTrue(result); Assert.assertTrue(result);
latch.countDown(); latch.countDown();
......
...@@ -28,11 +28,14 @@ public class SmokeTest { ...@@ -28,11 +28,14 @@ public class SmokeTest {
WebLayerShellActivity activity = mActivityTestRule.launchShellWithUrl("about:blank"); WebLayerShellActivity activity = mActivityTestRule.launchShellWithUrl("about:blank");
Assert.assertNotNull(activity); Assert.assertNotNull(activity);
TestThreadUtils.runOnUiThreadBlocking(
() -> { activity.getBrowserFragmentController().setSupportsEmbedding(true); });
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
String url = "data:text,foo"; String url = "data:text,foo";
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
activity.getBrowserFragmentImpl().setSupportsEmbedding(true).addCallback( activity.getBrowserFragmentController().setSupportsEmbedding(true).addCallback(
(Boolean result) -> { (Boolean result) -> {
Assert.assertTrue(result); Assert.assertTrue(result);
mActivityTestRule.loadUrl(url); mActivityTestRule.loadUrl(url);
......
...@@ -7,15 +7,12 @@ package org.chromium.weblayer.shell; ...@@ -7,15 +7,12 @@ package org.chromium.weblayer.shell;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.text.InputType; import android.text.InputType;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.EditText; import android.widget.EditText;
...@@ -26,7 +23,7 @@ import android.widget.TextView; ...@@ -26,7 +23,7 @@ import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener; import android.widget.TextView.OnEditorActionListener;
import org.chromium.weblayer.BrowserController; import org.chromium.weblayer.BrowserController;
import org.chromium.weblayer.BrowserFragmentImpl; import org.chromium.weblayer.BrowserFragmentController;
import org.chromium.weblayer.BrowserObserver; import org.chromium.weblayer.BrowserObserver;
import org.chromium.weblayer.Profile; import org.chromium.weblayer.Profile;
import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.WebLayer;
...@@ -38,32 +35,18 @@ public class WebLayerShellActivity extends FragmentActivity { ...@@ -38,32 +35,18 @@ public class WebLayerShellActivity extends FragmentActivity {
private static final String TAG = "WebLayerShell"; private static final String TAG = "WebLayerShell";
private Profile mProfile; private Profile mProfile;
private BrowserFragmentImpl mBrowserFragment; private BrowserFragmentController mBrowserFragmentController;
private BrowserController mBrowserController; private BrowserController mBrowserController;
private EditText mUrlView; private EditText mUrlView;
private ProgressBar mLoadProgressBar; private ProgressBar mLoadProgressBar;
private View mMainView; private View mMainView;
public static class ShellFragment extends Fragment {
private BrowserFragmentImpl mBrowserFragment;
ShellFragment(BrowserFragmentImpl browserFragment) {
mBrowserFragment = browserFragment;
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return mBrowserFragment.onCreateView();
}
}
public BrowserController getBrowserController() { public BrowserController getBrowserController() {
return mBrowserController; return mBrowserController;
} }
public BrowserFragmentImpl getBrowserFragmentImpl() { public BrowserFragmentController getBrowserFragmentController() {
return mBrowserFragment; return mBrowserFragmentController;
} }
@Override @Override
...@@ -118,15 +101,16 @@ public class WebLayerShellActivity extends FragmentActivity { ...@@ -118,15 +101,16 @@ public class WebLayerShellActivity extends FragmentActivity {
topContentsContainer.addView(mLoadProgressBar, progressLayoutParams); topContentsContainer.addView(mLoadProgressBar, progressLayoutParams);
mProfile = WebLayer.getInstance().createProfile(null); mProfile = WebLayer.getInstance().createProfile(null);
mBrowserFragment = mProfile.createBrowserFragment(this);
mBrowserController = mBrowserFragment.getBrowserController(); mBrowserFragmentController = mProfile.createBrowserFragmentController(this);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(viewId, new ShellFragment(mBrowserFragment)); transaction.add(viewId, mBrowserFragmentController.getFragment());
transaction.commit(); transaction.commit();
mBrowserFragment.setTopView(topContentsContainer); mBrowserFragmentController.setTopView(topContentsContainer);
mBrowserController = mBrowserFragmentController.getBrowserController();
String startupUrl = getUrlFromIntent(getIntent()); String startupUrl = getUrlFromIntent(getIntent());
if (TextUtils.isEmpty(startupUrl)) { if (TextUtils.isEmpty(startupUrl)) {
startupUrl = "http://google.com"; startupUrl = "http://google.com";
...@@ -154,7 +138,7 @@ public class WebLayerShellActivity extends FragmentActivity { ...@@ -154,7 +138,7 @@ public class WebLayerShellActivity extends FragmentActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
if (mProfile != null) mProfile.destroy(); if (mProfile != null) mProfile.destroy();
if (mBrowserFragment != null) mBrowserFragment.destroy(); if (mBrowserFragmentController != null) mBrowserFragmentController.destroy();
super.onDestroy(); super.onDestroy();
} }
......
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