Home | History | Annotate | Download | only in webkit
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.webkit;
     18 
     19 import android.annotation.NonNull;
     20 import android.annotation.Nullable;
     21 import android.annotation.SystemApi;
     22 import android.annotation.UnsupportedAppUsage;
     23 import android.app.ActivityThread;
     24 import android.app.Application;
     25 import android.app.ResourcesManager;
     26 import android.content.Context;
     27 import android.content.pm.ApplicationInfo;
     28 import android.content.res.Resources;
     29 import android.graphics.Canvas;
     30 import android.graphics.RecordingCanvas;
     31 import android.os.RemoteException;
     32 import android.os.SystemProperties;
     33 import android.os.Trace;
     34 import android.util.SparseArray;
     35 import android.view.View;
     36 import android.view.ViewRootImpl;
     37 
     38 import com.android.internal.util.ArrayUtils;
     39 
     40 /**
     41  * Delegate used by the WebView provider implementation to access
     42  * the required framework functionality needed to implement a {@link WebView}.
     43  *
     44  * @hide
     45  */
     46 @SystemApi
     47 public final class WebViewDelegate {
     48 
     49     @UnsupportedAppUsage
     50     /* package */ WebViewDelegate() { }
     51 
     52     /**
     53      * Listener that gets notified whenever tracing has been enabled/disabled.
     54      */
     55     public interface OnTraceEnabledChangeListener {
     56         void onTraceEnabledChange(boolean enabled);
     57     }
     58 
     59     /**
     60      * Register a callback to be invoked when tracing for the WebView component has been
     61      * enabled/disabled.
     62      */
     63     public void setOnTraceEnabledChangeListener(final OnTraceEnabledChangeListener listener) {
     64         SystemProperties.addChangeCallback(new Runnable() {
     65             @Override
     66             public void run() {
     67                 listener.onTraceEnabledChange(isTraceTagEnabled());
     68             }
     69         });
     70     }
     71 
     72     /**
     73      * Returns {@code true} if the WebView trace tag is enabled and {@code false} otherwise.
     74      */
     75     public boolean isTraceTagEnabled() {
     76         return Trace.isTagEnabled(Trace.TRACE_TAG_WEBVIEW);
     77     }
     78 
     79     /**
     80      * Returns {@code true} if the draw GL functor can be invoked (see {@link #invokeDrawGlFunctor})
     81      * and {@code false} otherwise.
     82      *
     83      * @deprecated Use {@link #drawWebViewFunctor(Canvas, int)}
     84      */
     85     @Deprecated
     86     public boolean canInvokeDrawGlFunctor(View containerView) {
     87         return true;
     88     }
     89 
     90     /**
     91      * Invokes the draw GL functor. If waitForCompletion is {@code false} the functor
     92      * may be invoked asynchronously.
     93      *
     94      * @param nativeDrawGLFunctor the pointer to the native functor that implements
     95      *        system/core/include/utils/Functor.h
     96      * @deprecated Use {@link #drawWebViewFunctor(Canvas, int)}
     97      */
     98     @Deprecated
     99     public void invokeDrawGlFunctor(View containerView, long nativeDrawGLFunctor,
    100             boolean waitForCompletion) {
    101         ViewRootImpl.invokeFunctor(nativeDrawGLFunctor, waitForCompletion);
    102     }
    103 
    104     /**
    105      * Calls the function specified with the nativeDrawGLFunctor functor pointer. This
    106      * functionality is used by the WebView for calling into their renderer from the
    107      * framework display lists.
    108      *
    109      * @param canvas a hardware accelerated canvas (see {@link Canvas#isHardwareAccelerated()})
    110      * @param nativeDrawGLFunctor the pointer to the native functor that implements
    111      *        system/core/include/utils/Functor.h
    112      * @throws IllegalArgumentException if the canvas is not hardware accelerated
    113      * @deprecated Use {@link #drawWebViewFunctor(Canvas, int)}
    114      */
    115     @Deprecated
    116     public void callDrawGlFunction(Canvas canvas, long nativeDrawGLFunctor) {
    117         if (!(canvas instanceof RecordingCanvas)) {
    118             // Canvas#isHardwareAccelerated() is only true for subclasses of HardwareCanvas.
    119             throw new IllegalArgumentException(canvas.getClass().getName()
    120                     + " is not a DisplayList canvas");
    121         }
    122         ((RecordingCanvas) canvas).drawGLFunctor2(nativeDrawGLFunctor, null);
    123     }
    124 
    125     /**
    126      * Calls the function specified with the nativeDrawGLFunctor functor pointer. This
    127      * functionality is used by the WebView for calling into their renderer from the
    128      * framework display lists.
    129      *
    130      * @param canvas a hardware accelerated canvas (see {@link Canvas#isHardwareAccelerated()})
    131      * @param nativeDrawGLFunctor the pointer to the native functor that implements
    132      *        system/core/include/utils/Functor.h
    133      * @param releasedRunnable Called when this nativeDrawGLFunctor is no longer referenced by this
    134      *        canvas, so is safe to be destroyed.
    135      * @throws IllegalArgumentException if the canvas is not hardware accelerated
    136      * @deprecated Use {@link #drawWebViewFunctor(Canvas, int)}
    137      */
    138     @Deprecated
    139     public void callDrawGlFunction(@NonNull Canvas canvas, long nativeDrawGLFunctor,
    140             @Nullable Runnable releasedRunnable) {
    141         if (!(canvas instanceof RecordingCanvas)) {
    142             // Canvas#isHardwareAccelerated() is only true for subclasses of HardwareCanvas.
    143             throw new IllegalArgumentException(canvas.getClass().getName()
    144                     + " is not a DisplayList canvas");
    145         }
    146         ((RecordingCanvas) canvas).drawGLFunctor2(nativeDrawGLFunctor, releasedRunnable);
    147     }
    148 
    149     /**
    150      * Call webview draw functor. See API in draw_fn.h.
    151      * @param canvas a {@link RecordingCanvas}.
    152      * @param functor created by AwDrawFn_CreateFunctor in draw_fn.h.
    153      */
    154     public void drawWebViewFunctor(@NonNull Canvas canvas, int functor) {
    155         if (!(canvas instanceof RecordingCanvas)) {
    156             // Canvas#isHardwareAccelerated() is only true for subclasses of RecordingCanvas.
    157             throw new IllegalArgumentException(canvas.getClass().getName()
    158                     + " is not a RecordingCanvas canvas");
    159         }
    160         ((RecordingCanvas) canvas).drawWebViewFunctor(functor);
    161     }
    162 
    163     /**
    164      * Detaches the draw GL functor.
    165      *
    166      * @param nativeDrawGLFunctor the pointer to the native functor that implements
    167      *        system/core/include/utils/Functor.h
    168      * @deprecated Use {@link #drawWebViewFunctor(Canvas, int)}
    169      */
    170     @Deprecated
    171     public void detachDrawGlFunctor(View containerView, long nativeDrawGLFunctor) {
    172         ViewRootImpl viewRootImpl = containerView.getViewRootImpl();
    173         if (nativeDrawGLFunctor != 0 && viewRootImpl != null) {
    174             viewRootImpl.detachFunctor(nativeDrawGLFunctor);
    175         }
    176     }
    177 
    178     /**
    179      * Returns the package id of the given {@code packageName}.
    180      */
    181     public int getPackageId(Resources resources, String packageName) {
    182         SparseArray<String> packageIdentifiers =
    183                 resources.getAssets().getAssignedPackageIdentifiers();
    184         for (int i = 0; i < packageIdentifiers.size(); i++) {
    185             final String name = packageIdentifiers.valueAt(i);
    186 
    187             if (packageName.equals(name)) {
    188                 return packageIdentifiers.keyAt(i);
    189             }
    190         }
    191         throw new RuntimeException("Package not found: " + packageName);
    192     }
    193 
    194     /**
    195      * Returns the application which is embedding the WebView.
    196      */
    197     public Application getApplication() {
    198         return ActivityThread.currentApplication();
    199     }
    200 
    201     /**
    202      * Returns the error string for the given {@code errorCode}.
    203      */
    204     public String getErrorString(Context context, int errorCode) {
    205         return LegacyErrorStrings.getString(errorCode, context);
    206     }
    207 
    208     /**
    209      * Adds the WebView asset path to {@link android.content.res.AssetManager}.
    210      */
    211     public void addWebViewAssetPath(Context context) {
    212         final String[] newAssetPaths =
    213                 WebViewFactory.getLoadedPackageInfo().applicationInfo.getAllApkPaths();
    214         final ApplicationInfo appInfo = context.getApplicationInfo();
    215 
    216         // Build the new library asset path list.
    217         String[] newLibAssets = appInfo.sharedLibraryFiles;
    218         for (String newAssetPath : newAssetPaths) {
    219             newLibAssets = ArrayUtils.appendElement(String.class, newLibAssets, newAssetPath);
    220         }
    221 
    222         if (newLibAssets != appInfo.sharedLibraryFiles) {
    223             // Update the ApplicationInfo object with the new list.
    224             // We know this will persist and future Resources created via ResourcesManager
    225             // will include the shared library because this ApplicationInfo comes from the
    226             // underlying LoadedApk in ContextImpl, which does not change during the life of the
    227             // application.
    228             appInfo.sharedLibraryFiles = newLibAssets;
    229 
    230             // Update existing Resources with the WebView library.
    231             ResourcesManager.getInstance().appendLibAssetsForMainAssetPath(
    232                     appInfo.getBaseResourcePath(), newAssetPaths);
    233         }
    234     }
    235 
    236     /**
    237      * Returns whether WebView should run in multiprocess mode.
    238      */
    239     public boolean isMultiProcessEnabled() {
    240         try {
    241             return WebViewFactory.getUpdateService().isMultiProcessEnabled();
    242         } catch (RemoteException e) {
    243             throw e.rethrowFromSystemServer();
    244         }
    245     }
    246 
    247     /**
    248      * Returns the data directory suffix to use, or null for none.
    249      */
    250     public String getDataDirectorySuffix() {
    251         return WebViewFactory.getDataDirectorySuffix();
    252     }
    253 }
    254