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