| Index: android/java/src/org/chromium/base/BaseChromiumApplication.java
|
| diff --git a/android/java/src/org/chromium/base/BaseChromiumApplication.java b/android/java/src/org/chromium/base/BaseChromiumApplication.java
|
| index d7c7b05ea58d88808aef44d10e798448e74ec0ca..b71b6463b49c38c75e8e153dbaa6b1a81f63def8 100644
|
| --- a/android/java/src/org/chromium/base/BaseChromiumApplication.java
|
| +++ b/android/java/src/org/chromium/base/BaseChromiumApplication.java
|
| @@ -8,18 +8,19 @@ import android.app.Activity;
|
| import android.app.Application;
|
| import android.content.Context;
|
| import android.os.Bundle;
|
| -import android.view.KeyEvent;
|
| import android.view.Window;
|
|
|
| -import java.lang.reflect.InvocationHandler;
|
| -import java.lang.reflect.InvocationTargetException;
|
| -import java.lang.reflect.Method;
|
| -import java.lang.reflect.Proxy;
|
| -
|
| /**
|
| * Basic application functionality that should be shared among all browser applications.
|
| */
|
| public class BaseChromiumApplication extends Application {
|
| + private static final String TAG = "cr.base";
|
| +
|
| + @Override
|
| + protected void attachBaseContext(Context base) {
|
| + super.attachBaseContext(base);
|
| + }
|
| +
|
| /**
|
| * Interface to be implemented by listeners for window focus events.
|
| */
|
| @@ -35,66 +36,6 @@ public class BaseChromiumApplication extends Application {
|
| private ObserverList<WindowFocusChangedListener> mWindowFocusListeners =
|
| new ObserverList<WindowFocusChangedListener>();
|
|
|
| - /**
|
| - * Intercepts calls to an existing Window.Callback. Most invocations are passed on directly
|
| - * to the composed Window.Callback but enables intercepting/manipulating others.
|
| - *
|
| - * This is used to relay window focus changes throughout the app and remedy a bug in the
|
| - * appcompat library.
|
| - */
|
| - private class WindowCallbackProxy implements InvocationHandler {
|
| - private final Window.Callback mCallback;
|
| - private final Activity mActivity;
|
| -
|
| - public WindowCallbackProxy(Activity activity, Window.Callback callback) {
|
| - mCallback = callback;
|
| - mActivity = activity;
|
| - }
|
| -
|
| - @Override
|
| - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
| - if (method.getName().equals("onWindowFocusChanged") && args.length == 1
|
| - && args[0] instanceof Boolean) {
|
| - onWindowFocusChanged((boolean) args[0]);
|
| - return null;
|
| - } else if (method.getName().equals("dispatchKeyEvent") && args.length == 1
|
| - && args[0] instanceof KeyEvent) {
|
| - return dispatchKeyEvent((KeyEvent) args[0]);
|
| - } else {
|
| - try {
|
| - return method.invoke(mCallback, args);
|
| - } catch (InvocationTargetException e) {
|
| - // Special-case for when a method is not defined on the underlying
|
| - // Window.Callback object. Because we're using a Proxy to forward all method
|
| - // calls, this breaks the Android framework's handling for apps built against
|
| - // an older SDK. The framework expects an AbstractMethodError but due to
|
| - // reflection it becomes wrapped inside an InvocationTargetException. Undo the
|
| - // wrapping to signal the framework accordingly.
|
| - if (e.getCause() instanceof AbstractMethodError) {
|
| - throw e.getCause();
|
| - }
|
| - throw e;
|
| - }
|
| - }
|
| - }
|
| -
|
| - public void onWindowFocusChanged(boolean hasFocus) {
|
| - mCallback.onWindowFocusChanged(hasFocus);
|
| -
|
| - for (WindowFocusChangedListener listener : mWindowFocusListeners) {
|
| - listener.onWindowFocusChanged(mActivity, hasFocus);
|
| - }
|
| - }
|
| -
|
| - public boolean dispatchKeyEvent(KeyEvent event) {
|
| - // TODO(aurimas): remove this once AppCompatDelegateImpl no longer steals
|
| - // KEYCODE_MENU. (see b/20529185)
|
| - if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && mActivity.dispatchKeyEvent(event)) {
|
| - return true;
|
| - }
|
| - return mCallback.dispatchKeyEvent(event);
|
| - }
|
| - }
|
| @Override
|
| public void onCreate() {
|
| super.onCreate();
|
| @@ -103,39 +44,45 @@ public class BaseChromiumApplication extends Application {
|
| @Override
|
| public void onActivityCreated(final Activity activity, Bundle savedInstanceState) {
|
| Window.Callback callback = activity.getWindow().getCallback();
|
| - activity.getWindow().setCallback((Window.Callback) Proxy.newProxyInstance(
|
| - Window.Callback.class.getClassLoader(), new Class[] {Window.Callback.class},
|
| - new WindowCallbackProxy(activity, callback)));
|
| + activity.getWindow().setCallback(new WindowCallbackWrapper(callback) {
|
| + @Override
|
| + public void onWindowFocusChanged(boolean hasFocus) {
|
| + super.onWindowFocusChanged(hasFocus);
|
| + for (WindowFocusChangedListener listener : mWindowFocusListeners) {
|
| + listener.onWindowFocusChanged(activity, hasFocus);
|
| + }
|
| + }
|
| + });
|
| }
|
|
|
| @Override
|
| public void onActivityDestroyed(Activity activity) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
|
|
| @Override
|
| public void onActivityPaused(Activity activity) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
|
|
| @Override
|
| public void onActivityResumed(Activity activity) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
|
|
| @Override
|
| public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
|
|
| @Override
|
| public void onActivityStarted(Activity activity) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
|
|
| @Override
|
| public void onActivityStopped(Activity activity) {
|
| - assert Proxy.isProxyClass(activity.getWindow().getCallback().getClass());
|
| + assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
|
| }
|
| });
|
| }
|
| @@ -166,5 +113,5 @@ public class BaseChromiumApplication extends Application {
|
| @VisibleForTesting
|
| public static void initCommandLine(Context context) {
|
| ((BaseChromiumApplication) context.getApplicationContext()).initCommandLine();
|
| - };
|
| + }
|
| }
|
|
|