WebViewDelegate.java revision f1a9b1bc249161fe1a9b0d85d4ed31153e4421c1
1e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla/* 2e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Copyright (C) 2014 The Android Open Source Project 3e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 4e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Licensed under the Apache License, Version 2.0 (the "License"); 5e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * you may not use this file except in compliance with the License. 6e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * You may obtain a copy of the License at 7e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 8e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * http://www.apache.org/licenses/LICENSE-2.0 9e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 10e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Unless required by applicable law or agreed to in writing, software 11e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * distributed under the License is distributed on an "AS IS" BASIS, 12e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * See the License for the specific language governing permissions and 14e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * limitations under the License. 15e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 16e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 17e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollapackage android.webkit; 18e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 19ea1d90f5dab529541bb2c68d5f68c1a7a6ddbe01Ignacio Sollaimport android.annotation.SystemApi; 20e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.app.ActivityThread; 21e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.app.Application; 22e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.content.Context; 23e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.content.res.Resources; 24e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.graphics.Canvas; 25e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.os.SystemProperties; 26e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.os.Trace; 27e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.util.SparseArray; 28e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.view.HardwareCanvas; 29e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.view.View; 30e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollaimport android.view.ViewRootImpl; 31e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 32e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla/** 33e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Delegate used by the WebView provider implementation to access 34e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * the required framework functionality needed to implement a {@link WebView}. 35e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 36e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @hide 37e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 38ea1d90f5dab529541bb2c68d5f68c1a7a6ddbe01Ignacio Solla@SystemApi 39e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Sollapublic final class WebViewDelegate { 40e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 41e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /* package */ WebViewDelegate() { } 42e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 43e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 44e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Listener that gets notified whenever tracing has been enabled/disabled. 45e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 46e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public interface OnTraceEnabledChangeListener { 47e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla void onTraceEnabledChange(boolean enabled); 48e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 49e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 50e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 51e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Register a callback to be invoked when tracing for the WebView component has been 52e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * enabled/disabled. 53e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 54e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener) { 55e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla SystemProperties.addChangeCallback(new Runnable() { 56e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla @Override 57e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void run() { 58e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla listener.onTraceEnabledChange(isTraceTagEnabled()); 59e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 60e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla }); 61e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 62e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 63e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 64e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Returns true if the WebView trace tag is enabled and false otherwise. 65e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 66e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public boolean isTraceTagEnabled() { 67e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla return Trace.isTagEnabled(Trace.TRACE_TAG_WEBVIEW); 68e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 69e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 70e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 71e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Returns true if the draw GL functor can be invoked (see {@link #invokeDrawGlFunctor}) 72e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * and false otherwise. 73e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 74e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public boolean canInvokeDrawGlFunctor(View containerView) { 75e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); 76e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla // viewRootImpl can be null during teardown when window is leaked. 77e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla return viewRootImpl != null; 78e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 79e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 80e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 81e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Invokes the draw GL functor. If waitForCompletion is false the functor 82e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * may be invoked asynchronously. 83e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 84e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @param nativeDrawGLFunctor the pointer to the native functor that implements 85e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * system/core/include/utils/Functor.h 86e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 87e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor, 88e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla boolean waitForCompletion) { 89e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); 90e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla viewRootImpl.invokeFunctor(nativeDrawGLFunctor, waitForCompletion); 91e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 92e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 93e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 94e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Calls the function specified with the nativeDrawGLFunctor functor pointer. This 95e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * functionality is used by the WebView for calling into their renderer from the 96e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * framework display lists. 97e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 98e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @param canvas a hardware accelerated canvas (see {@link Canvas#isHardwareAccelerated()}) 99e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @param nativeDrawGLFunctor the pointer to the native functor that implements 100e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * system/core/include/utils/Functor.h 101e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @throws IllegalArgumentException if the canvas is not hardware accelerated 102e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 103e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor) { 104e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla if (!(canvas instanceof HardwareCanvas)) { 105e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla // Canvas#isHardwareAccelerated() is only true for subclasses of HardwareCanvas. 106e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla throw new IllegalArgumentException(canvas.getClass().getName() 107e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla + " is not hardware accelerated"); 108e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 109e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla ((HardwareCanvas) canvas).callDrawGLFunction(nativeDrawGLFunctor); 110e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 111e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 112e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 113e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Detaches the draw GL functor. 114e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * 115e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * @param nativeDrawGLFunctor the pointer to the native functor that implements 116e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * system/core/include/utils/Functor.h 117e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 118e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor) { 119e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla ViewRootImpl viewRootImpl = containerView.getViewRootImpl(); 120e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla if (nativeDrawGLFunctor != 0 && viewRootImpl != null) { 121e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla viewRootImpl.detachFunctor(nativeDrawGLFunctor); 122e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 123e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 124e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 125e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 126e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Returns the package id of the given {@code packageName}. 127e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 128e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public int getPackageId(Resources resources, String packageName) { 129e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla SparseArray<String> packageIdentifiers = 130e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla resources.getAssets().getAssignedPackageIdentifiers(); 131e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla for (int i = 0; i < packageIdentifiers.size(); i++) { 132e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla final String name = packageIdentifiers.valueAt(i); 133e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 134e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla if (packageName.equals(name)) { 135e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla return packageIdentifiers.keyAt(i); 136e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 137e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 138e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla throw new RuntimeException("Package not found: " + packageName); 139e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 140e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 141e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 142e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Returns the application which is embedding the WebView. 143e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 144e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public Application getApplication() { 145e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla return ActivityThread.currentApplication(); 146e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 147e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 148e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 149e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Returns the error string for the given {@code errorCode}. 150e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 151e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public String getErrorString(Context context, int errorCode) { 152f1a9b1bc249161fe1a9b0d85d4ed31153e4421c1Narayan Kamath return LegacyErrorStrings.getString(errorCode, context); 153e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 154e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla 155e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla /** 156e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla * Adds the WebView asset path to {@link AssetManager}. 157e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla */ 158e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla public void addWebViewAssetPath(Context context) { 159e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla context.getAssets().addAssetPath( 160e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla WebViewFactory.getLoadedPackageInfo().applicationInfo.sourceDir); 161e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla } 162e7cf27b664ef9857ccb6c61d1b0fad2646c70607Ignacio Solla} 163