diff options
author | Ignacio Solla <igsolla@google.com> | 2014-11-19 21:53:43 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-19 21:53:43 +0000 |
commit | 1228e58e88ac0ae2abb698ed3f933ac44a8851ee (patch) | |
tree | a32bce54071d2646634d7147315dcc84259b762a | |
parent | c3507d1098a444176a7270cba7e5299af7f77350 (diff) | |
parent | e7cf27b664ef9857ccb6c61d1b0fad2646c70607 (diff) | |
download | frameworks_base-1228e58e88ac0ae2abb698ed3f933ac44a8851ee.zip frameworks_base-1228e58e88ac0ae2abb698ed3f933ac44a8851ee.tar.gz frameworks_base-1228e58e88ac0ae2abb698ed3f933ac44a8851ee.tar.bz2 |
Merge "[WebView] Interface to access hidden APIs. (DO NOT MERGE)"
-rw-r--r-- | core/java/android/webkit/WebViewDelegate.java | 161 | ||||
-rw-r--r-- | core/java/android/webkit/WebViewFactory.java | 7 |
2 files changed, 167 insertions, 1 deletions
diff --git a/core/java/android/webkit/WebViewDelegate.java b/core/java/android/webkit/WebViewDelegate.java new file mode 100644 index 0000000..c878b3d --- /dev/null +++ b/core/java/android/webkit/WebViewDelegate.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.webkit; + +import android.app.ActivityThread; +import android.app.Application; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Canvas; +import android.net.http.ErrorStrings; +import android.os.SystemProperties; +import android.os.Trace; +import android.util.SparseArray; +import android.view.HardwareCanvas; +import android.view.View; +import android.view.ViewRootImpl; + +/** + * Delegate used by the WebView provider implementation to access + * the required framework functionality needed to implement a {@link WebView}. + * + * @hide + */ +public final class WebViewDelegate { + + /* package */ WebViewDelegate() { } + + /** + * Listener that gets notified whenever tracing has been enabled/disabled. + */ + public interface OnTraceEnabledChangeListener { + void onTraceEnabledChange(boolean enabled); + } + + /** + * Register a callback to be invoked when tracing for the WebView component has been + * enabled/disabled. + */ + public void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener) { + SystemProperties.addChangeCallback(new Runnable() { + @Override + public void run() { + listener.onTraceEnabledChange(isTraceTagEnabled()); + } + }); + } + + /** + * Returns true if the WebView trace tag is enabled and false otherwise. + */ + public boolean isTraceTagEnabled() { + return Trace.isTagEnabled(Trace.TRACE_TAG_WEBVIEW); + } + + /** + * Returns true if the draw GL functor can be invoked (see {@link #invokeDrawGlFunctor}) + * and false otherwise. + */ + public boolean canInvokeDrawGlFunctor(View containerView) { + ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); + // viewRootImpl can be null during teardown when window is leaked. + return viewRootImpl != null; + } + + /** + * Invokes the draw GL functor. If waitForCompletion is false the functor + * may be invoked asynchronously. + * + * @param nativeDrawGLFunctor the pointer to the native functor that implements + * system/core/include/utils/Functor.h + */ + public void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor, + boolean waitForCompletion) { + ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); + viewRootImpl.invokeFunctor(nativeDrawGLFunctor, waitForCompletion); + } + + /** + * Calls the function specified with the nativeDrawGLFunctor functor pointer. This + * functionality is used by the WebView for calling into their renderer from the + * framework display lists. + * + * @param canvas a hardware accelerated canvas (see {@link Canvas#isHardwareAccelerated()}) + * @param nativeDrawGLFunctor the pointer to the native functor that implements + * system/core/include/utils/Functor.h + * @throws IllegalArgumentException if the canvas is not hardware accelerated + */ + public void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor) { + if (!(canvas instanceof HardwareCanvas)) { + // Canvas#isHardwareAccelerated() is only true for subclasses of HardwareCanvas. + throw new IllegalArgumentException(canvas.getClass().getName() + + " is not hardware accelerated"); + } + ((HardwareCanvas) canvas).callDrawGLFunction(nativeDrawGLFunctor); + } + + /** + * Detaches the draw GL functor. + * + * @param nativeDrawGLFunctor the pointer to the native functor that implements + * system/core/include/utils/Functor.h + */ + public void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor) { + ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); + if (nativeDrawGLFunctor != 0 && viewRootImpl != null) { + viewRootImpl.detachFunctor(nativeDrawGLFunctor); + } + } + + /** + * Returns the package id of the given {@code packageName}. + */ + public int getPackageId(Resources resources, String packageName) { + SparseArray<String> packageIdentifiers = + resources.getAssets().getAssignedPackageIdentifiers(); + for (int i = 0; i < packageIdentifiers.size(); i++) { + final String name = packageIdentifiers.valueAt(i); + + if (packageName.equals(name)) { + return packageIdentifiers.keyAt(i); + } + } + throw new RuntimeException("Package not found: " + packageName); + } + + /** + * Returns the application which is embedding the WebView. + */ + public Application getApplication() { + return ActivityThread.currentApplication(); + } + + /** + * Returns the error string for the given {@code errorCode}. + */ + public String getErrorString(Context context, int errorCode) { + return ErrorStrings.getString(errorCode, context); + } + + /** + * Adds the WebView asset path to {@link AssetManager}. + */ + public void addWebViewAssetPath(Context context) { + context.getAssets().addAssetPath( + WebViewFactory.getLoadedPackageInfo().applicationInfo.sourceDir); + } +} diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index c7ffedc..ca9f378 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -109,7 +109,12 @@ public final class WebViewFactory { StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()"); try { - sProviderInstance = providerClass.newInstance(); + try { + sProviderInstance = providerClass.getConstructor(WebViewDelegate.class) + .newInstance(new WebViewDelegate()); + } catch (Exception e) { + sProviderInstance = providerClass.newInstance(); + } if (DEBUG) Log.v(LOGTAG, "Loaded provider: " + sProviderInstance); return sProviderInstance; } catch (Exception e) { |