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