145702509d4752478188935eaf442c549c2c220beIgnacio Sollapackage com.android.webview.chromium;
245702509d4752478188935eaf442c549c2c220beIgnacio Solla
345702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.app.Application;
445702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.content.Context;
545702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.content.pm.PackageInfo;
645702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.content.res.AssetManager;
745702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.content.res.Resources;
845702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.graphics.Canvas;
945702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.os.Trace;
1045702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.util.Log;
1145702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.util.SparseArray;
1245702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.view.View;
1345702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport android.webkit.WebViewFactory;
1445702509d4752478188935eaf442c549c2c220beIgnacio Solla
1545702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport java.lang.reflect.InvocationTargetException;
1645702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport java.lang.reflect.Method;
1745702509d4752478188935eaf442c549c2c220beIgnacio Solla
1845702509d4752478188935eaf442c549c2c220beIgnacio Solla/**
1945702509d4752478188935eaf442c549c2c220beIgnacio Solla * Factory class for {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate}s.
2045702509d4752478188935eaf442c549c2c220beIgnacio Solla *
2145702509d4752478188935eaf442c549c2c220beIgnacio Solla * <p>{@link WebViewDelegate com.android.webview.chromium.WebViewDelegate}s provide the same
2245702509d4752478188935eaf442c549c2c220beIgnacio Solla * interface as {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate} but without
2345702509d4752478188935eaf442c549c2c220beIgnacio Solla * a dependency on the webkit class. Defining our own
2445702509d4752478188935eaf442c549c2c220beIgnacio Solla * {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} in frameworks/webview
2545702509d4752478188935eaf442c549c2c220beIgnacio Solla * allows the WebView apk to be binary compatible with the API 21 version of the framework, in
2645702509d4752478188935eaf442c549c2c220beIgnacio Solla * which {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate} had not yet been
2745702509d4752478188935eaf442c549c2c220beIgnacio Solla * introduced.
2845702509d4752478188935eaf442c549c2c220beIgnacio Solla *
2945702509d4752478188935eaf442c549c2c220beIgnacio Solla * <p>The {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} interface and this
3045702509d4752478188935eaf442c549c2c220beIgnacio Solla * factory class can be removed once we don't longer need to support WebView apk updates to devices
3145702509d4752478188935eaf442c549c2c220beIgnacio Solla * running the API 21 version of the framework. At that point, we should use
3245702509d4752478188935eaf442c549c2c220beIgnacio Solla * {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate} directly instead.
3345702509d4752478188935eaf442c549c2c220beIgnacio Solla */
3445702509d4752478188935eaf442c549c2c220beIgnacio Sollaclass WebViewDelegateFactory {
3545702509d4752478188935eaf442c549c2c220beIgnacio Solla
3645702509d4752478188935eaf442c549c2c220beIgnacio Solla    /**
3745702509d4752478188935eaf442c549c2c220beIgnacio Solla     * Copy of {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate}'s interface.
3845702509d4752478188935eaf442c549c2c220beIgnacio Solla     * See {@link WebViewDelegateFactory} for the reasons why this copy is needed.
3945702509d4752478188935eaf442c549c2c220beIgnacio Solla     */
4045702509d4752478188935eaf442c549c2c220beIgnacio Solla    interface WebViewDelegate {
4145702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate.OnTraceEnabledChangeListener */
4245702509d4752478188935eaf442c549c2c220beIgnacio Solla        interface OnTraceEnabledChangeListener {
4345702509d4752478188935eaf442c549c2c220beIgnacio Solla            void onTraceEnabledChange(boolean enabled);
4445702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
4545702509d4752478188935eaf442c549c2c220beIgnacio Solla
4645702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#setOnTraceEnabledChangeListener */
4745702509d4752478188935eaf442c549c2c220beIgnacio Solla        void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener);
4845702509d4752478188935eaf442c549c2c220beIgnacio Solla
4945702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#isTraceTagEnabled */
5045702509d4752478188935eaf442c549c2c220beIgnacio Solla        boolean isTraceTagEnabled();
5145702509d4752478188935eaf442c549c2c220beIgnacio Solla
5245702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#canInvokeDrawGlFunctor */
5345702509d4752478188935eaf442c549c2c220beIgnacio Solla        boolean canInvokeDrawGlFunctor(View containerView);
5445702509d4752478188935eaf442c549c2c220beIgnacio Solla
5545702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#invokeDrawGlFunctor */
5645702509d4752478188935eaf442c549c2c220beIgnacio Solla        void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor,
5745702509d4752478188935eaf442c549c2c220beIgnacio Solla                boolean waitForCompletion);
5845702509d4752478188935eaf442c549c2c220beIgnacio Solla
5945702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#callDrawGlFunction */
6045702509d4752478188935eaf442c549c2c220beIgnacio Solla        void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor);
6145702509d4752478188935eaf442c549c2c220beIgnacio Solla
6245702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#detachDrawGlFunctor */
6345702509d4752478188935eaf442c549c2c220beIgnacio Solla        void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor);
6445702509d4752478188935eaf442c549c2c220beIgnacio Solla
6545702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#getPackageId */
6645702509d4752478188935eaf442c549c2c220beIgnacio Solla        int getPackageId(Resources resources, String packageName);
6745702509d4752478188935eaf442c549c2c220beIgnacio Solla
6845702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#getApplication */
6945702509d4752478188935eaf442c549c2c220beIgnacio Solla        Application getApplication();
7045702509d4752478188935eaf442c549c2c220beIgnacio Solla
7145702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#getErrorString */
7245702509d4752478188935eaf442c549c2c220beIgnacio Solla        String getErrorString(Context context, int errorCode);
7345702509d4752478188935eaf442c549c2c220beIgnacio Solla
7445702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** @see android.webkit.WebViewDelegate#addWebViewAssetPath */
7545702509d4752478188935eaf442c549c2c220beIgnacio Solla        void addWebViewAssetPath(Context context);
7645702509d4752478188935eaf442c549c2c220beIgnacio Solla    }
7745702509d4752478188935eaf442c549c2c220beIgnacio Solla
7845702509d4752478188935eaf442c549c2c220beIgnacio Solla    /**
7945702509d4752478188935eaf442c549c2c220beIgnacio Solla     * Creates a {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} that proxies
8045702509d4752478188935eaf442c549c2c220beIgnacio Solla     * requests to the given {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate}.
8145702509d4752478188935eaf442c549c2c220beIgnacio Solla     *
8245702509d4752478188935eaf442c549c2c220beIgnacio Solla     * @return the created delegate
8345702509d4752478188935eaf442c549c2c220beIgnacio Solla     */
8445702509d4752478188935eaf442c549c2c220beIgnacio Solla    static WebViewDelegate createProxyDelegate(android.webkit.WebViewDelegate delegate) {
8545702509d4752478188935eaf442c549c2c220beIgnacio Solla        return new ProxyDelegate(delegate);
8645702509d4752478188935eaf442c549c2c220beIgnacio Solla    }
8745702509d4752478188935eaf442c549c2c220beIgnacio Solla
8845702509d4752478188935eaf442c549c2c220beIgnacio Solla    /**
8945702509d4752478188935eaf442c549c2c220beIgnacio Solla     * Creates a {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} compatible
9045702509d4752478188935eaf442c549c2c220beIgnacio Solla     * with the API 21 version of the framework in which
9145702509d4752478188935eaf442c549c2c220beIgnacio Solla     * {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate} had not yet been
9245702509d4752478188935eaf442c549c2c220beIgnacio Solla     * introduced.
9345702509d4752478188935eaf442c549c2c220beIgnacio Solla     *
9445702509d4752478188935eaf442c549c2c220beIgnacio Solla     * @return the created delegate
9545702509d4752478188935eaf442c549c2c220beIgnacio Solla     */
9645702509d4752478188935eaf442c549c2c220beIgnacio Solla    static WebViewDelegate createApi21CompatibilityDelegate() {
9745702509d4752478188935eaf442c549c2c220beIgnacio Solla        return new Api21CompatibilityDelegate();
9845702509d4752478188935eaf442c549c2c220beIgnacio Solla    }
9945702509d4752478188935eaf442c549c2c220beIgnacio Solla
10045702509d4752478188935eaf442c549c2c220beIgnacio Solla    /**
10145702509d4752478188935eaf442c549c2c220beIgnacio Solla     * A {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} that proxies requests
10245702509d4752478188935eaf442c549c2c220beIgnacio Solla     * to a {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate}.
10345702509d4752478188935eaf442c549c2c220beIgnacio Solla     */
10445702509d4752478188935eaf442c549c2c220beIgnacio Solla    private static class ProxyDelegate implements WebViewDelegate {
10545702509d4752478188935eaf442c549c2c220beIgnacio Solla
10645702509d4752478188935eaf442c549c2c220beIgnacio Solla        android.webkit.WebViewDelegate delegate;
10745702509d4752478188935eaf442c549c2c220beIgnacio Solla
10845702509d4752478188935eaf442c549c2c220beIgnacio Solla        ProxyDelegate(android.webkit.WebViewDelegate delegate) {
10945702509d4752478188935eaf442c549c2c220beIgnacio Solla            this.delegate = delegate;
11045702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
11145702509d4752478188935eaf442c549c2c220beIgnacio Solla
11245702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
11345702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener) {
11445702509d4752478188935eaf442c549c2c220beIgnacio Solla            delegate.setOnTraceEnabledChangeListener(
11545702509d4752478188935eaf442c549c2c220beIgnacio Solla                    new android.webkit.WebViewDelegate.OnTraceEnabledChangeListener() {
11645702509d4752478188935eaf442c549c2c220beIgnacio Solla                        @Override
11745702509d4752478188935eaf442c549c2c220beIgnacio Solla                        public void onTraceEnabledChange(boolean enabled) {
11845702509d4752478188935eaf442c549c2c220beIgnacio Solla                            listener.onTraceEnabledChange(enabled);
11945702509d4752478188935eaf442c549c2c220beIgnacio Solla                            ;
12045702509d4752478188935eaf442c549c2c220beIgnacio Solla                        }
12145702509d4752478188935eaf442c549c2c220beIgnacio Solla                    });
12245702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
12345702509d4752478188935eaf442c549c2c220beIgnacio Solla
12445702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
12545702509d4752478188935eaf442c549c2c220beIgnacio Solla        public boolean isTraceTagEnabled() {
12645702509d4752478188935eaf442c549c2c220beIgnacio Solla            return delegate.isTraceTagEnabled();
12745702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
12845702509d4752478188935eaf442c549c2c220beIgnacio Solla
12945702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
13045702509d4752478188935eaf442c549c2c220beIgnacio Solla        public boolean canInvokeDrawGlFunctor(View containerView) {
13145702509d4752478188935eaf442c549c2c220beIgnacio Solla            return delegate.canInvokeDrawGlFunctor(containerView);
13245702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
13345702509d4752478188935eaf442c549c2c220beIgnacio Solla
13445702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
13545702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor,
13645702509d4752478188935eaf442c549c2c220beIgnacio Solla                boolean waitForCompletion) {
13745702509d4752478188935eaf442c549c2c220beIgnacio Solla            delegate.invokeDrawGlFunctor(containerView, nativeDrawGLFunctor, waitForCompletion);
13845702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
13945702509d4752478188935eaf442c549c2c220beIgnacio Solla
14045702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
14145702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor) {
14245702509d4752478188935eaf442c549c2c220beIgnacio Solla            delegate.callDrawGlFunction(canvas, nativeDrawGLFunctor);
14345702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
14445702509d4752478188935eaf442c549c2c220beIgnacio Solla
14545702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
14645702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor) {
14745702509d4752478188935eaf442c549c2c220beIgnacio Solla            delegate.detachDrawGlFunctor(containerView, nativeDrawGLFunctor);
14845702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
14945702509d4752478188935eaf442c549c2c220beIgnacio Solla
15045702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
15145702509d4752478188935eaf442c549c2c220beIgnacio Solla        public int getPackageId(Resources resources, String packageName) {
15245702509d4752478188935eaf442c549c2c220beIgnacio Solla            return delegate.getPackageId(resources, packageName);
15345702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
15445702509d4752478188935eaf442c549c2c220beIgnacio Solla
15545702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
15645702509d4752478188935eaf442c549c2c220beIgnacio Solla        public Application getApplication() {
15745702509d4752478188935eaf442c549c2c220beIgnacio Solla            return delegate.getApplication();
15845702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
15945702509d4752478188935eaf442c549c2c220beIgnacio Solla
16045702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
16145702509d4752478188935eaf442c549c2c220beIgnacio Solla        public String getErrorString(Context context, int errorCode) {
16245702509d4752478188935eaf442c549c2c220beIgnacio Solla            return delegate.getErrorString(context, errorCode);
16345702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
16445702509d4752478188935eaf442c549c2c220beIgnacio Solla
16545702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
16645702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void addWebViewAssetPath(Context context) {
16745702509d4752478188935eaf442c549c2c220beIgnacio Solla            delegate.addWebViewAssetPath(context);
16845702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
16945702509d4752478188935eaf442c549c2c220beIgnacio Solla    }
17045702509d4752478188935eaf442c549c2c220beIgnacio Solla
17145702509d4752478188935eaf442c549c2c220beIgnacio Solla    /**
17245702509d4752478188935eaf442c549c2c220beIgnacio Solla     * A {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} compatible with the
17345702509d4752478188935eaf442c549c2c220beIgnacio Solla     * API 21 version of the framework in which
17445702509d4752478188935eaf442c549c2c220beIgnacio Solla     * {@link android.webkit.WebViewDelegate android.webkit.WebViewDelegate} had not yet been
17545702509d4752478188935eaf442c549c2c220beIgnacio Solla     * introduced.
17645702509d4752478188935eaf442c549c2c220beIgnacio Solla     *
17745702509d4752478188935eaf442c549c2c220beIgnacio Solla     * <p>This class implements the
17845702509d4752478188935eaf442c549c2c220beIgnacio Solla     * {@link WebViewDelegate com.android.webview.chromium.WebViewDelegate} functionality by using
17945702509d4752478188935eaf442c549c2c220beIgnacio Solla     * reflection to call into hidden frameworks APIs released in the API-21 version of the
18045702509d4752478188935eaf442c549c2c220beIgnacio Solla     * framework.
18145702509d4752478188935eaf442c549c2c220beIgnacio Solla     */
18245702509d4752478188935eaf442c549c2c220beIgnacio Solla    private static class Api21CompatibilityDelegate implements WebViewDelegate {
18345702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** Copy of Trace.TRACE_TAG_WEBVIEW */
18445702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final static long TRACE_TAG_WEBVIEW = 1L << 4;
18545702509d4752478188935eaf442c549c2c220beIgnacio Solla
18645702509d4752478188935eaf442c549c2c220beIgnacio Solla        /** Hidden APIs released in the API 21 version of the framework */
18745702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mIsTagEnabledMethod;
18845702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mAddChangeCallbackMethod;
18945702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mGetViewRootImplMethod;
19045702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mInvokeFunctorMethod;
19145702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mCallDrawGLFunctionMethod;
19245702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mDetachFunctorMethod;
19345702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mGetAssignedPackageIdentifiersMethod;
19445702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mAddAssetPathMethod;
19545702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mCurrentApplicationMethod;
19645702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mGetStringMethod;
19745702509d4752478188935eaf442c549c2c220beIgnacio Solla        private final Method mGetLoadedPackageInfoMethod;
19845702509d4752478188935eaf442c549c2c220beIgnacio Solla
19945702509d4752478188935eaf442c549c2c220beIgnacio Solla        Api21CompatibilityDelegate() {
20045702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
20145702509d4752478188935eaf442c549c2c220beIgnacio Solla                // Important: This reflection essentially defines a snapshot of some hidden APIs
20245702509d4752478188935eaf442c549c2c220beIgnacio Solla                // at version 21 of the framework for compatibility reasons, and the reflection
20345702509d4752478188935eaf442c549c2c220beIgnacio Solla                // should not be changed even if those hidden APIs change in future releases.
20445702509d4752478188935eaf442c549c2c220beIgnacio Solla                mIsTagEnabledMethod = Trace.class.getMethod("isTagEnabled", long.class);
20545702509d4752478188935eaf442c549c2c220beIgnacio Solla                mAddChangeCallbackMethod = Class.forName("android.os.SystemProperties")
20645702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("addChangeCallback", Runnable.class);
20745702509d4752478188935eaf442c549c2c220beIgnacio Solla                mGetViewRootImplMethod = View.class.getMethod("getViewRootImpl");
20845702509d4752478188935eaf442c549c2c220beIgnacio Solla                mInvokeFunctorMethod = Class.forName("android.view.ViewRootImpl")
20945702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("invokeFunctor", long.class, boolean.class);
21045702509d4752478188935eaf442c549c2c220beIgnacio Solla                mDetachFunctorMethod = Class.forName("android.view.ViewRootImpl")
21145702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("detachFunctor", long.class);
21245702509d4752478188935eaf442c549c2c220beIgnacio Solla                mCallDrawGLFunctionMethod = Class.forName("android.view.HardwareCanvas")
21345702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("callDrawGLFunction", long.class);
21445702509d4752478188935eaf442c549c2c220beIgnacio Solla                mGetAssignedPackageIdentifiersMethod = AssetManager.class.getMethod(
21545702509d4752478188935eaf442c549c2c220beIgnacio Solla                        "getAssignedPackageIdentifiers");
21645702509d4752478188935eaf442c549c2c220beIgnacio Solla                mAddAssetPathMethod = AssetManager.class.getMethod(
21745702509d4752478188935eaf442c549c2c220beIgnacio Solla                        "addAssetPath", String.class);
21845702509d4752478188935eaf442c549c2c220beIgnacio Solla                mCurrentApplicationMethod = Class.forName("android.app.ActivityThread")
21945702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("currentApplication");
22045702509d4752478188935eaf442c549c2c220beIgnacio Solla                mGetStringMethod = Class.forName("android.net.http.ErrorStrings")
22145702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("getString", int.class, Context.class);
22245702509d4752478188935eaf442c549c2c220beIgnacio Solla                mGetLoadedPackageInfoMethod = Class.forName("android.webkit.WebViewFactory")
22345702509d4752478188935eaf442c549c2c220beIgnacio Solla                        .getMethod("getLoadedPackageInfo");
22445702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
22545702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
22645702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
22745702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
22845702509d4752478188935eaf442c549c2c220beIgnacio Solla
22945702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
23045702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener) {
23145702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
23245702509d4752478188935eaf442c549c2c220beIgnacio Solla                mAddChangeCallbackMethod.invoke(null, new Runnable() {
23345702509d4752478188935eaf442c549c2c220beIgnacio Solla                    @Override
23445702509d4752478188935eaf442c549c2c220beIgnacio Solla                    public void run() {
23545702509d4752478188935eaf442c549c2c220beIgnacio Solla                        listener.onTraceEnabledChange(isTraceTagEnabled());
23645702509d4752478188935eaf442c549c2c220beIgnacio Solla                    }
23745702509d4752478188935eaf442c549c2c220beIgnacio Solla                });
23845702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
23945702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
24045702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
24145702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
24245702509d4752478188935eaf442c549c2c220beIgnacio Solla
24345702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
24445702509d4752478188935eaf442c549c2c220beIgnacio Solla        public boolean isTraceTagEnabled() {
24545702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
24645702509d4752478188935eaf442c549c2c220beIgnacio Solla                return ((Boolean) mIsTagEnabledMethod.invoke(null, TRACE_TAG_WEBVIEW));
24745702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
24845702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
24945702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
25045702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
25145702509d4752478188935eaf442c549c2c220beIgnacio Solla
25245702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
25345702509d4752478188935eaf442c549c2c220beIgnacio Solla        public boolean canInvokeDrawGlFunctor(View containerView) {
25445702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
25545702509d4752478188935eaf442c549c2c220beIgnacio Solla                Object viewRootImpl = mGetViewRootImplMethod.invoke(containerView);
25645702509d4752478188935eaf442c549c2c220beIgnacio Solla                 // viewRootImpl can be null during teardown when window is leaked.
25745702509d4752478188935eaf442c549c2c220beIgnacio Solla                return viewRootImpl != null;
25845702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
25945702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
26045702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
26145702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
26245702509d4752478188935eaf442c549c2c220beIgnacio Solla
26345702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
26445702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor,
26545702509d4752478188935eaf442c549c2c220beIgnacio Solla                boolean waitForCompletion) {
26645702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
26745702509d4752478188935eaf442c549c2c220beIgnacio Solla                Object viewRootImpl = mGetViewRootImplMethod.invoke(containerView);
26845702509d4752478188935eaf442c549c2c220beIgnacio Solla                if (viewRootImpl != null) {
26945702509d4752478188935eaf442c549c2c220beIgnacio Solla                    mInvokeFunctorMethod.invoke(viewRootImpl, nativeDrawGLFunctor, waitForCompletion);
27045702509d4752478188935eaf442c549c2c220beIgnacio Solla                }
27145702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
27245702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
27345702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
27445702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
27545702509d4752478188935eaf442c549c2c220beIgnacio Solla
27645702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
27745702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor) {
27845702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
27945702509d4752478188935eaf442c549c2c220beIgnacio Solla                mCallDrawGLFunctionMethod.invoke(canvas, nativeDrawGLFunctor);
28045702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
28145702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
28245702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
28345702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
28445702509d4752478188935eaf442c549c2c220beIgnacio Solla
28545702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
28645702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor) {
28745702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
28845702509d4752478188935eaf442c549c2c220beIgnacio Solla                Object viewRootImpl = mGetViewRootImplMethod.invoke(containerView);
28945702509d4752478188935eaf442c549c2c220beIgnacio Solla                if (viewRootImpl != null) {
29045702509d4752478188935eaf442c549c2c220beIgnacio Solla                    mDetachFunctorMethod.invoke(viewRootImpl, nativeDrawGLFunctor);
29145702509d4752478188935eaf442c549c2c220beIgnacio Solla                }
29245702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
29345702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
29445702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
29545702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
29645702509d4752478188935eaf442c549c2c220beIgnacio Solla
29745702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
29845702509d4752478188935eaf442c549c2c220beIgnacio Solla        public int getPackageId(Resources resources, String packageName) {
29945702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
30045702509d4752478188935eaf442c549c2c220beIgnacio Solla                SparseArray packageIdentifiers =
30145702509d4752478188935eaf442c549c2c220beIgnacio Solla                        (SparseArray) mGetAssignedPackageIdentifiersMethod.invoke(
30245702509d4752478188935eaf442c549c2c220beIgnacio Solla                                resources.getAssets());
30345702509d4752478188935eaf442c549c2c220beIgnacio Solla                for (int i = 0; i < packageIdentifiers.size(); i++) {
30445702509d4752478188935eaf442c549c2c220beIgnacio Solla                    final String name = (String) packageIdentifiers.valueAt(i);
30545702509d4752478188935eaf442c549c2c220beIgnacio Solla
30645702509d4752478188935eaf442c549c2c220beIgnacio Solla                    if (packageName.equals(name)) {
30745702509d4752478188935eaf442c549c2c220beIgnacio Solla                        return packageIdentifiers.keyAt(i);
30845702509d4752478188935eaf442c549c2c220beIgnacio Solla                    }
30945702509d4752478188935eaf442c549c2c220beIgnacio Solla                }
31045702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
31145702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
31245702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
31345702509d4752478188935eaf442c549c2c220beIgnacio Solla            throw new RuntimeException("Package not found: " + packageName);
31445702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
31545702509d4752478188935eaf442c549c2c220beIgnacio Solla
31645702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
31745702509d4752478188935eaf442c549c2c220beIgnacio Solla        public Application getApplication() {
31845702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
31945702509d4752478188935eaf442c549c2c220beIgnacio Solla                return (Application) mCurrentApplicationMethod.invoke(null);
32045702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
32145702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
32245702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
32345702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
32445702509d4752478188935eaf442c549c2c220beIgnacio Solla
32545702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
32645702509d4752478188935eaf442c549c2c220beIgnacio Solla        public String getErrorString(Context context, int errorCode) {
32745702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
32845702509d4752478188935eaf442c549c2c220beIgnacio Solla                return (String) mGetStringMethod.invoke(null, errorCode, context);
32945702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
33045702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
33145702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
33245702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
33345702509d4752478188935eaf442c549c2c220beIgnacio Solla
33445702509d4752478188935eaf442c549c2c220beIgnacio Solla        @Override
33545702509d4752478188935eaf442c549c2c220beIgnacio Solla        public void addWebViewAssetPath(Context context) {
33645702509d4752478188935eaf442c549c2c220beIgnacio Solla            try {
33745702509d4752478188935eaf442c549c2c220beIgnacio Solla                PackageInfo info = (PackageInfo) mGetLoadedPackageInfoMethod.invoke(null);
33845702509d4752478188935eaf442c549c2c220beIgnacio Solla                mAddAssetPathMethod.invoke(context.getAssets(), info.applicationInfo.sourceDir);
33945702509d4752478188935eaf442c549c2c220beIgnacio Solla            } catch (Exception e) {
34045702509d4752478188935eaf442c549c2c220beIgnacio Solla                throw new RuntimeException("Invalid reflection", e);
34145702509d4752478188935eaf442c549c2c220beIgnacio Solla            }
34245702509d4752478188935eaf442c549c2c220beIgnacio Solla        }
34345702509d4752478188935eaf442c549c2c220beIgnacio Solla    }
34445702509d4752478188935eaf442c549c2c220beIgnacio Solla}
34545702509d4752478188935eaf442c549c2c220beIgnacio Solla
346