1/*
2 * Copyright (C) 2007 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
17package android.webkit;
18
19import android.annotation.IntDef;
20import android.annotation.Nullable;
21import android.annotation.SystemApi;
22import android.content.Context;
23
24import java.lang.annotation.ElementType;
25import java.lang.annotation.Retention;
26import java.lang.annotation.RetentionPolicy;
27import java.lang.annotation.Target;
28
29/**
30 * Manages settings state for a WebView. When a WebView is first created, it
31 * obtains a set of default settings. These default settings will be returned
32 * from any getter call. A {@code WebSettings} object obtained from
33 * {@link WebView#getSettings()} is tied to the life of the WebView. If a WebView has
34 * been destroyed, any method call on {@code WebSettings} will throw an
35 * {@link IllegalStateException}.
36 */
37// This is an abstract base class: concrete WebViewProviders must
38// create a class derived from this, and return an instance of it in the
39// WebViewProvider.getWebSettingsProvider() method implementation.
40public abstract class WebSettings {
41    /**
42     * Enum for controlling the layout of html.
43     * <ul>
44     *   <li>{@code NORMAL} means no rendering changes. This is the recommended choice for maximum
45     *       compatibility across different platforms and Android versions.</li>
46     *   <li>{@code SINGLE_COLUMN} moves all content into one column that is the width of the
47     *       view.</li>
48     *   <li>{@code NARROW_COLUMNS} makes all columns no wider than the screen if possible. Only use
49     *       this for API levels prior to {@link android.os.Build.VERSION_CODES#KITKAT}.</li>
50     *   <li>{@code TEXT_AUTOSIZING} boosts font size of paragraphs based on heuristics to make
51     *       the text readable when viewing a wide-viewport layout in the overview mode.
52     *       It is recommended to enable zoom support {@link #setSupportZoom} when
53     *       using this mode. Supported from API level
54     *       {@link android.os.Build.VERSION_CODES#KITKAT}</li>
55     * </ul>
56     */
57    // XXX: These must match LayoutAlgorithm in Settings.h in WebCore.
58    public enum LayoutAlgorithm {
59        NORMAL,
60        /**
61         * @deprecated This algorithm is now obsolete.
62         */
63        @Deprecated
64        SINGLE_COLUMN,
65        /**
66         * @deprecated This algorithm is now obsolete.
67         */
68        @Deprecated
69        NARROW_COLUMNS,
70        TEXT_AUTOSIZING
71    }
72
73    /**
74     * Enum for specifying the text size.
75     * <ul>
76     *   <li>SMALLEST is 50%</li>
77     *   <li>SMALLER is 75%</li>
78     *   <li>NORMAL is 100%</li>
79     *   <li>LARGER is 150%</li>
80     *   <li>LARGEST is 200%</li>
81     * </ul>
82     *
83     * @deprecated Use {@link WebSettings#setTextZoom(int)} and {@link WebSettings#getTextZoom()} instead.
84     */
85    @Deprecated
86    public enum TextSize {
87        SMALLEST(50),
88        SMALLER(75),
89        NORMAL(100),
90        LARGER(150),
91        LARGEST(200);
92        TextSize(int size) {
93            value = size;
94        }
95        int value;
96    }
97
98    /**
99     * Enum for specifying the WebView's desired density.
100     * <ul>
101     *   <li>{@code FAR} makes 100% looking like in 240dpi</li>
102     *   <li>{@code MEDIUM} makes 100% looking like in 160dpi</li>
103     *   <li>{@code CLOSE} makes 100% looking like in 120dpi</li>
104     * </ul>
105     */
106    public enum ZoomDensity {
107        FAR(150),      // 240dpi
108        MEDIUM(100),    // 160dpi
109        CLOSE(75);     // 120dpi
110        ZoomDensity(int size) {
111            value = size;
112        }
113
114        /**
115         * @hide Only for use by WebViewProvider implementations
116         */
117        public int getValue() {
118            return value;
119        }
120
121        int value;
122    }
123
124    /** @hide */
125    @IntDef(prefix = { "LOAD_" }, value = {
126            LOAD_DEFAULT,
127            LOAD_NORMAL,
128            LOAD_CACHE_ELSE_NETWORK,
129            LOAD_NO_CACHE,
130            LOAD_CACHE_ONLY
131    })
132    @Retention(RetentionPolicy.SOURCE)
133    public @interface CacheMode {}
134
135    /**
136     * Default cache usage mode. If the navigation type doesn't impose any
137     * specific behavior, use cached resources when they are available
138     * and not expired, otherwise load resources from the network.
139     * Use with {@link #setCacheMode}.
140     */
141    public static final int LOAD_DEFAULT = -1;
142
143    /**
144     * Normal cache usage mode. Use with {@link #setCacheMode}.
145     *
146     * @deprecated This value is obsolete, as from API level
147     * {@link android.os.Build.VERSION_CODES#HONEYCOMB} and onwards it has the
148     * same effect as {@link #LOAD_DEFAULT}.
149     */
150    @Deprecated
151    public static final int LOAD_NORMAL = 0;
152
153    /**
154     * Use cached resources when they are available, even if they have expired.
155     * Otherwise load resources from the network.
156     * Use with {@link #setCacheMode}.
157     */
158    public static final int LOAD_CACHE_ELSE_NETWORK = 1;
159
160    /**
161     * Don't use the cache, load from the network.
162     * Use with {@link #setCacheMode}.
163     */
164    public static final int LOAD_NO_CACHE = 2;
165
166    /**
167     * Don't use the network, load from the cache.
168     * Use with {@link #setCacheMode}.
169     */
170    public static final int LOAD_CACHE_ONLY = 3;
171
172    public enum RenderPriority {
173        NORMAL,
174        HIGH,
175        LOW
176    }
177
178    /**
179     * The plugin state effects how plugins are treated on a page. ON means
180     * that any object will be loaded even if a plugin does not exist to handle
181     * the content. ON_DEMAND means that if there is a plugin installed that
182     * can handle the content, a placeholder is shown until the user clicks on
183     * the placeholder. Once clicked, the plugin will be enabled on the page.
184     * OFF means that all plugins will be turned off and any fallback content
185     * will be used.
186     */
187    public enum PluginState {
188        ON,
189        ON_DEMAND,
190        OFF
191    }
192
193    /**
194     * Used with {@link #setMixedContentMode}
195     *
196     * In this mode, the WebView will allow a secure origin to load content from any other origin,
197     * even if that origin is insecure. This is the least secure mode of operation for the WebView,
198     * and where possible apps should not set this mode.
199     */
200    public static final int MIXED_CONTENT_ALWAYS_ALLOW = 0;
201
202    /**
203     * Used with {@link #setMixedContentMode}
204     *
205     * In this mode, the WebView will not allow a secure origin to load content from an insecure
206     * origin. This is the preferred and most secure mode of operation for the WebView and apps are
207     * strongly advised to use this mode.
208     */
209    public static final int MIXED_CONTENT_NEVER_ALLOW = 1;
210
211    /**
212     * Used with {@link #setMixedContentMode}
213     *
214     * In this mode, the WebView will attempt to be compatible with the approach of a modern web
215     * browser with regard to mixed content. Some insecure content may be allowed to be loaded by
216     * a secure origin and other types of content will be blocked. The types of content are allowed
217     * or blocked may change release to release and are not explicitly defined.
218     *
219     * This mode is intended to be used by apps that are not in control of the content that they
220     * render but desire to operate in a reasonably secure environment. For highest security, apps
221     * are recommended to use {@link #MIXED_CONTENT_NEVER_ALLOW}.
222     */
223    public static final int MIXED_CONTENT_COMPATIBILITY_MODE = 2;
224
225    /**
226     * Enables dumping the pages navigation cache to a text file. The default
227     * is {@code false}.
228     *
229     * @deprecated This method is now obsolete.
230     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
231     */
232    @SystemApi
233    @Deprecated
234    public abstract void setNavDump(boolean enabled);
235
236    /**
237     * Gets whether dumping the navigation cache is enabled.
238     *
239     * @return whether dumping the navigation cache is enabled
240     * @see #setNavDump
241     * @deprecated This method is now obsolete.
242     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
243     */
244    @SystemApi
245    @Deprecated
246    public abstract boolean getNavDump();
247
248    /**
249     * Sets whether the WebView should support zooming using its on-screen zoom
250     * controls and gestures. The particular zoom mechanisms that should be used
251     * can be set with {@link #setBuiltInZoomControls}. This setting does not
252     * affect zooming performed using the {@link WebView#zoomIn()} and
253     * {@link WebView#zoomOut()} methods. The default is {@code true}.
254     *
255     * @param support whether the WebView should support zoom
256     */
257    public abstract void setSupportZoom(boolean support);
258
259    /**
260     * Gets whether the WebView supports zoom.
261     *
262     * @return {@code true} if the WebView supports zoom
263     * @see #setSupportZoom
264     */
265    public abstract boolean supportZoom();
266
267    /**
268     * Sets whether the WebView requires a user gesture to play media.
269     * The default is {@code true}.
270     *
271     * @param require whether the WebView requires a user gesture to play media
272     */
273    public abstract void setMediaPlaybackRequiresUserGesture(boolean require);
274
275    /**
276     * Gets whether the WebView requires a user gesture to play media.
277     *
278     * @return {@code true} if the WebView requires a user gesture to play media
279     * @see #setMediaPlaybackRequiresUserGesture
280     */
281    public abstract boolean getMediaPlaybackRequiresUserGesture();
282
283    /**
284     * Sets whether the WebView should use its built-in zoom mechanisms. The
285     * built-in zoom mechanisms comprise on-screen zoom controls, which are
286     * displayed over the WebView's content, and the use of a pinch gesture to
287     * control zooming. Whether or not these on-screen controls are displayed
288     * can be set with {@link #setDisplayZoomControls}. The default is {@code false}.
289     * <p>
290     * The built-in mechanisms are the only currently supported zoom
291     * mechanisms, so it is recommended that this setting is always enabled.
292     *
293     * @param enabled whether the WebView should use its built-in zoom mechanisms
294     */
295    // This method was intended to select between the built-in zoom mechanisms
296    // and the separate zoom controls. The latter were obtained using
297    // {@link WebView#getZoomControls}, which is now hidden.
298    public abstract void setBuiltInZoomControls(boolean enabled);
299
300    /**
301     * Gets whether the zoom mechanisms built into WebView are being used.
302     *
303     * @return {@code true} if the zoom mechanisms built into WebView are being used
304     * @see #setBuiltInZoomControls
305     */
306    public abstract boolean getBuiltInZoomControls();
307
308    /**
309     * Sets whether the WebView should display on-screen zoom controls when
310     * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
311     * The default is {@code true}.
312     *
313     * @param enabled whether the WebView should display on-screen zoom controls
314     */
315    public abstract void setDisplayZoomControls(boolean enabled);
316
317    /**
318     * Gets whether the WebView displays on-screen zoom controls when using
319     * the built-in zoom mechanisms.
320     *
321     * @return {@code true} if the WebView displays on-screen zoom controls when using
322     *         the built-in zoom mechanisms
323     * @see #setDisplayZoomControls
324     */
325    public abstract boolean getDisplayZoomControls();
326
327    /**
328     * Enables or disables file access within WebView. File access is enabled by
329     * default.  Note that this enables or disables file system access only.
330     * Assets and resources are still accessible using file:///android_asset and
331     * file:///android_res.
332     */
333    public abstract void setAllowFileAccess(boolean allow);
334
335    /**
336     * Gets whether this WebView supports file access.
337     *
338     * @see #setAllowFileAccess
339     */
340    public abstract boolean getAllowFileAccess();
341
342    /**
343     * Enables or disables content URL access within WebView.  Content URL
344     * access allows WebView to load content from a content provider installed
345     * in the system. The default is enabled.
346     */
347    public abstract void setAllowContentAccess(boolean allow);
348
349    /**
350     * Gets whether this WebView supports content URL access.
351     *
352     * @see #setAllowContentAccess
353     */
354    public abstract boolean getAllowContentAccess();
355
356    /**
357     * Sets whether the WebView loads pages in overview mode, that is,
358     * zooms out the content to fit on screen by width. This setting is
359     * taken into account when the content width is greater than the width
360     * of the WebView control, for example, when {@link #getUseWideViewPort}
361     * is enabled. The default is {@code false}.
362     */
363    public abstract void setLoadWithOverviewMode(boolean overview);
364
365    /**
366     * Gets whether this WebView loads pages in overview mode.
367     *
368     * @return whether this WebView loads pages in overview mode
369     * @see #setLoadWithOverviewMode
370     */
371    public abstract boolean getLoadWithOverviewMode();
372
373    /**
374     * Sets whether the WebView will enable smooth transition while panning or
375     * zooming or while the window hosting the WebView does not have focus.
376     * If it is {@code true}, WebView will choose a solution to maximize the performance.
377     * e.g. the WebView's content may not be updated during the transition.
378     * If it is false, WebView will keep its fidelity. The default value is {@code false}.
379     *
380     * @deprecated This method is now obsolete, and will become a no-op in future.
381     */
382    @Deprecated
383    public abstract void setEnableSmoothTransition(boolean enable);
384
385    /**
386     * Gets whether the WebView enables smooth transition while panning or
387     * zooming.
388     *
389     * @see #setEnableSmoothTransition
390     *
391     * @deprecated This method is now obsolete, and will become a no-op in future.
392     */
393    @Deprecated
394    public abstract  boolean enableSmoothTransition();
395
396    /**
397     * Sets whether the WebView uses its background for over scroll background.
398     * If {@code true}, it will use the WebView's background. If {@code false}, it will use an
399     * internal pattern. Default is {@code true}.
400     *
401     * @deprecated This method is now obsolete.
402     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
403     */
404    @SystemApi
405    @Deprecated
406    public abstract  void setUseWebViewBackgroundForOverscrollBackground(boolean view);
407
408    /**
409     * Gets whether this WebView uses WebView's background instead of
410     * internal pattern for over scroll background.
411     *
412     * @see #setUseWebViewBackgroundForOverscrollBackground
413     * @deprecated This method is now obsolete.
414     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
415     */
416    @SystemApi
417    @Deprecated
418    public abstract  boolean getUseWebViewBackgroundForOverscrollBackground();
419
420    /**
421     * Sets whether the WebView should save form data. In Android O, the
422     * platform has implemented a fully functional Autofill feature to store
423     * form data. Therefore, the Webview form data save feature is disabled.
424     *
425     * Note that the feature will continue to be supported on older versions of
426     * Android as before.
427     *
428     * This function does not have any effect.
429     */
430    @Deprecated
431    public abstract  void setSaveFormData(boolean save);
432
433    /**
434     * Gets whether the WebView saves form data.
435     *
436     * @return whether the WebView saves form data
437     * @see #setSaveFormData
438     */
439    @Deprecated
440    public abstract boolean getSaveFormData();
441
442    /**
443     * Sets whether the WebView should save passwords. The default is {@code true}.
444     * @deprecated Saving passwords in WebView will not be supported in future versions.
445     */
446    @Deprecated
447    public abstract void setSavePassword(boolean save);
448
449    /**
450     * Gets whether the WebView saves passwords.
451     *
452     * @return whether the WebView saves passwords
453     * @see #setSavePassword
454     * @deprecated Saving passwords in WebView will not be supported in future versions.
455     */
456    @Deprecated
457    public abstract boolean getSavePassword();
458
459    /**
460     * Sets the text zoom of the page in percent. The default is 100.
461     *
462     * @param textZoom the text zoom in percent
463     */
464    public abstract void setTextZoom(int textZoom);
465
466    /**
467     * Gets the text zoom of the page in percent.
468     *
469     * @return the text zoom of the page in percent
470     * @see #setTextZoom
471     */
472    public abstract int getTextZoom();
473
474    /**
475     * Sets policy for third party cookies.
476     * Developers should access this via {@link CookieManager#setShouldAcceptThirdPartyCookies}.
477     * @hide Internal API.
478     */
479    @SystemApi
480    public abstract void setAcceptThirdPartyCookies(boolean accept);
481
482    /**
483     * Gets policy for third party cookies.
484     * Developers should access this via {@link CookieManager#getShouldAcceptThirdPartyCookies}.
485     * @hide Internal API
486     */
487    @SystemApi
488    public abstract boolean getAcceptThirdPartyCookies();
489
490    /**
491     * Sets the text size of the page. The default is {@link TextSize#NORMAL}.
492     *
493     * @param t the text size as a {@link TextSize} value
494     * @deprecated Use {@link #setTextZoom} instead.
495     */
496    @Deprecated
497    public synchronized void setTextSize(TextSize t) {
498        setTextZoom(t.value);
499    }
500
501    /**
502     * Gets the text size of the page. If the text size was previously specified
503     * in percent using {@link #setTextZoom}, this will return the closest
504     * matching {@link TextSize}.
505     *
506     * @return the text size as a {@link TextSize} value
507     * @see #setTextSize
508     * @deprecated Use {@link #getTextZoom} instead.
509     */
510    @Deprecated
511    public synchronized TextSize getTextSize() {
512        TextSize closestSize = null;
513        int smallestDelta = Integer.MAX_VALUE;
514        int textSize = getTextZoom();
515        for (TextSize size : TextSize.values()) {
516            int delta = Math.abs(textSize - size.value);
517            if (delta == 0) {
518                return size;
519            }
520            if (delta < smallestDelta) {
521                smallestDelta = delta;
522                closestSize = size;
523            }
524        }
525        return closestSize != null ? closestSize : TextSize.NORMAL;
526    }
527
528    /**
529     * Sets the default zoom density of the page. This must be called from the UI
530     * thread. The default is {@link ZoomDensity#MEDIUM}.
531     *
532     * This setting is not recommended for use in new applications.  If the WebView
533     * is utilized to display mobile-oriented pages, the desired effect can be achieved by
534     * adjusting 'width' and 'initial-scale' attributes of page's 'meta viewport'
535     * tag. For pages lacking the tag, {@link android.webkit.WebView#setInitialScale}
536     * and {@link #setUseWideViewPort} can be used.
537     *
538     * @param zoom the zoom density
539     * @deprecated This method is no longer supported, see the function documentation for
540     *             recommended alternatives.
541     */
542    @Deprecated
543    public abstract void setDefaultZoom(ZoomDensity zoom);
544
545    /**
546     * Gets the default zoom density of the page. This should be called from
547     * the UI thread.
548     *
549     * This setting is not recommended for use in new applications.
550     *
551     * @return the zoom density
552     * @see #setDefaultZoom
553     * @deprecated Will only return the default value.
554     */
555    @Deprecated
556    public abstract ZoomDensity getDefaultZoom();
557
558    /**
559     * Enables using light touches to make a selection and activate mouseovers.
560     * @deprecated From {@link android.os.Build.VERSION_CODES#JELLY_BEAN} this
561     *             setting is obsolete and has no effect.
562     */
563    @Deprecated
564    public abstract void setLightTouchEnabled(boolean enabled);
565
566    /**
567     * Gets whether light touches are enabled.
568     * @see #setLightTouchEnabled
569     * @deprecated This setting is obsolete.
570     */
571    @Deprecated
572    public abstract boolean getLightTouchEnabled();
573
574    /**
575     * Controlled a rendering optimization that is no longer present. Setting
576     * it now has no effect.
577     *
578     * @deprecated This setting now has no effect.
579     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
580     */
581    @Deprecated
582    public void setUseDoubleTree(boolean use) {
583        // Specified to do nothing, so no need for derived classes to override.
584    }
585
586    /**
587     * Controlled a rendering optimization that is no longer present. Setting
588     * it now has no effect.
589     *
590     * @deprecated This setting now has no effect.
591     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
592     */
593    @Deprecated
594    public boolean getUseDoubleTree() {
595        // Returns false unconditionally, so no need for derived classes to override.
596        return false;
597    }
598
599    /**
600     * Sets the user-agent string using an integer code.
601     * <ul>
602     *   <li>0 means the WebView should use an Android user-agent string</li>
603     *   <li>1 means the WebView should use a desktop user-agent string</li>
604     * </ul>
605     * Other values are ignored. The default is an Android user-agent string,
606     * i.e. code value 0.
607     *
608     * @param ua the integer code for the user-agent string
609     * @deprecated Please use {@link #setUserAgentString} instead.
610     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
611     */
612    @SystemApi
613    @Deprecated
614    public abstract void setUserAgent(int ua);
615
616    /**
617     * Gets the user-agent as an integer code.
618     * <ul>
619     *   <li>-1 means the WebView is using a custom user-agent string set with
620     *   {@link #setUserAgentString}</li>
621     *   <li>0 means the WebView should use an Android user-agent string</li>
622     *   <li>1 means the WebView should use a desktop user-agent string</li>
623     * </ul>
624     *
625     * @return the integer code for the user-agent string
626     * @see #setUserAgent
627     * @deprecated Please use {@link #getUserAgentString} instead.
628     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
629     */
630    @SystemApi
631    @Deprecated
632    public abstract int getUserAgent();
633
634    /**
635     * Sets whether the WebView should enable support for the &quot;viewport&quot;
636     * HTML meta tag or should use a wide viewport.
637     * When the value of the setting is {@code false}, the layout width is always set to the
638     * width of the WebView control in device-independent (CSS) pixels.
639     * When the value is {@code true} and the page contains the viewport meta tag, the value
640     * of the width specified in the tag is used. If the page does not contain the tag or
641     * does not provide a width, then a wide viewport will be used.
642     *
643     * @param use whether to enable support for the viewport meta tag
644     */
645    public abstract void setUseWideViewPort(boolean use);
646
647    /**
648     * Gets whether the WebView supports the &quot;viewport&quot;
649     * HTML meta tag or will use a wide viewport.
650     *
651     * @return {@code true} if the WebView supports the viewport meta tag
652     * @see #setUseWideViewPort
653     */
654    public abstract boolean getUseWideViewPort();
655
656    /**
657     * Sets whether the WebView whether supports multiple windows. If set to
658     * true, {@link WebChromeClient#onCreateWindow} must be implemented by the
659     * host application. The default is {@code false}.
660     *
661     * @param support whether to support multiple windows
662     */
663    public abstract void setSupportMultipleWindows(boolean support);
664
665    /**
666     * Gets whether the WebView supports multiple windows.
667     *
668     * @return {@code true} if the WebView supports multiple windows
669     * @see #setSupportMultipleWindows
670     */
671    public abstract boolean supportMultipleWindows();
672
673    /**
674     * Sets the underlying layout algorithm. This will cause a re-layout of the
675     * WebView. The default is {@link LayoutAlgorithm#NARROW_COLUMNS}.
676     *
677     * @param l the layout algorithm to use, as a {@link LayoutAlgorithm} value
678     */
679    public abstract void setLayoutAlgorithm(LayoutAlgorithm l);
680
681    /**
682     * Gets the current layout algorithm.
683     *
684     * @return the layout algorithm in use, as a {@link LayoutAlgorithm} value
685     * @see #setLayoutAlgorithm
686     */
687    public abstract LayoutAlgorithm getLayoutAlgorithm();
688
689    /**
690     * Sets the standard font family name. The default is "sans-serif".
691     *
692     * @param font a font family name
693     */
694    public abstract void setStandardFontFamily(String font);
695
696    /**
697     * Gets the standard font family name.
698     *
699     * @return the standard font family name as a string
700     * @see #setStandardFontFamily
701     */
702    public abstract String getStandardFontFamily();
703
704    /**
705     * Sets the fixed font family name. The default is "monospace".
706     *
707     * @param font a font family name
708     */
709    public abstract void setFixedFontFamily(String font);
710
711    /**
712     * Gets the fixed font family name.
713     *
714     * @return the fixed font family name as a string
715     * @see #setFixedFontFamily
716     */
717    public abstract String getFixedFontFamily();
718
719    /**
720     * Sets the sans-serif font family name. The default is "sans-serif".
721     *
722     * @param font a font family name
723     */
724    public abstract void setSansSerifFontFamily(String font);
725
726    /**
727     * Gets the sans-serif font family name.
728     *
729     * @return the sans-serif font family name as a string
730     * @see #setSansSerifFontFamily
731     */
732    public abstract String getSansSerifFontFamily();
733
734    /**
735     * Sets the serif font family name. The default is "sans-serif".
736     *
737     * @param font a font family name
738     */
739    public abstract void setSerifFontFamily(String font);
740
741    /**
742     * Gets the serif font family name. The default is "serif".
743     *
744     * @return the serif font family name as a string
745     * @see #setSerifFontFamily
746     */
747    public abstract String getSerifFontFamily();
748
749    /**
750     * Sets the cursive font family name. The default is "cursive".
751     *
752     * @param font a font family name
753     */
754    public abstract void setCursiveFontFamily(String font);
755
756    /**
757     * Gets the cursive font family name.
758     *
759     * @return the cursive font family name as a string
760     * @see #setCursiveFontFamily
761     */
762    public abstract String getCursiveFontFamily();
763
764    /**
765     * Sets the fantasy font family name. The default is "fantasy".
766     *
767     * @param font a font family name
768     */
769    public abstract void setFantasyFontFamily(String font);
770
771    /**
772     * Gets the fantasy font family name.
773     *
774     * @return the fantasy font family name as a string
775     * @see #setFantasyFontFamily
776     */
777    public abstract String getFantasyFontFamily();
778
779    /**
780     * Sets the minimum font size. The default is 8.
781     *
782     * @param size a non-negative integer between 1 and 72. Any number outside
783     *             the specified range will be pinned.
784     */
785    public abstract void setMinimumFontSize(int size);
786
787    /**
788     * Gets the minimum font size.
789     *
790     * @return a non-negative integer between 1 and 72
791     * @see #setMinimumFontSize
792     */
793    public abstract int getMinimumFontSize();
794
795    /**
796     * Sets the minimum logical font size. The default is 8.
797     *
798     * @param size a non-negative integer between 1 and 72. Any number outside
799     *             the specified range will be pinned.
800     */
801    public abstract void setMinimumLogicalFontSize(int size);
802
803    /**
804     * Gets the minimum logical font size.
805     *
806     * @return a non-negative integer between 1 and 72
807     * @see #setMinimumLogicalFontSize
808     */
809    public abstract int getMinimumLogicalFontSize();
810
811    /**
812     * Sets the default font size. The default is 16.
813     *
814     * @param size a non-negative integer between 1 and 72. Any number outside
815     *             the specified range will be pinned.
816     */
817    public abstract void setDefaultFontSize(int size);
818
819    /**
820     * Gets the default font size.
821     *
822     * @return a non-negative integer between 1 and 72
823     * @see #setDefaultFontSize
824     */
825    public abstract int getDefaultFontSize();
826
827    /**
828     * Sets the default fixed font size. The default is 16.
829     *
830     * @param size a non-negative integer between 1 and 72. Any number outside
831     *             the specified range will be pinned.
832     */
833    public abstract void setDefaultFixedFontSize(int size);
834
835    /**
836     * Gets the default fixed font size.
837     *
838     * @return a non-negative integer between 1 and 72
839     * @see #setDefaultFixedFontSize
840     */
841    public abstract int getDefaultFixedFontSize();
842
843    /**
844     * Sets whether the WebView should load image resources. Note that this method
845     * controls loading of all images, including those embedded using the data
846     * URI scheme. Use {@link #setBlockNetworkImage} to control loading only
847     * of images specified using network URI schemes. Note that if the value of this
848     * setting is changed from {@code false} to {@code true}, all images resources referenced
849     * by content currently displayed by the WebView are loaded automatically.
850     * The default is {@code true}.
851     *
852     * @param flag whether the WebView should load image resources
853     */
854    public abstract void setLoadsImagesAutomatically(boolean flag);
855
856    /**
857     * Gets whether the WebView loads image resources. This includes
858     * images embedded using the data URI scheme.
859     *
860     * @return {@code true} if the WebView loads image resources
861     * @see #setLoadsImagesAutomatically
862     */
863    public abstract boolean getLoadsImagesAutomatically();
864
865    /**
866     * Sets whether the WebView should not load image resources from the
867     * network (resources accessed via http and https URI schemes).  Note
868     * that this method has no effect unless
869     * {@link #getLoadsImagesAutomatically} returns {@code true}. Also note that
870     * disabling all network loads using {@link #setBlockNetworkLoads}
871     * will also prevent network images from loading, even if this flag is set
872     * to false. When the value of this setting is changed from {@code true} to {@code false},
873     * network images resources referenced by content currently displayed by
874     * the WebView are fetched automatically. The default is {@code false}.
875     *
876     * @param flag whether the WebView should not load image resources from the
877     *             network
878     * @see #setBlockNetworkLoads
879     */
880    public abstract void setBlockNetworkImage(boolean flag);
881
882    /**
883     * Gets whether the WebView does not load image resources from the network.
884     *
885     * @return {@code true} if the WebView does not load image resources from the network
886     * @see #setBlockNetworkImage
887     */
888    public abstract boolean getBlockNetworkImage();
889
890    /**
891     * Sets whether the WebView should not load resources from the network.
892     * Use {@link #setBlockNetworkImage} to only avoid loading
893     * image resources. Note that if the value of this setting is
894     * changed from {@code true} to {@code false}, network resources referenced by content
895     * currently displayed by the WebView are not fetched until
896     * {@link android.webkit.WebView#reload} is called.
897     * If the application does not have the
898     * {@link android.Manifest.permission#INTERNET} permission, attempts to set
899     * a value of {@code false} will cause a {@link java.lang.SecurityException}
900     * to be thrown. The default value is {@code false} if the application has the
901     * {@link android.Manifest.permission#INTERNET} permission, otherwise it is
902     * {@code true}.
903     *
904     * @param flag {@code true} means block network loads by the WebView
905     * @see android.webkit.WebView#reload
906     */
907    public abstract void setBlockNetworkLoads(boolean flag);
908
909    /**
910     * Gets whether the WebView does not load any resources from the network.
911     *
912     * @return {@code true} if the WebView does not load any resources from the network
913     * @see #setBlockNetworkLoads
914     */
915    public abstract boolean getBlockNetworkLoads();
916
917    /**
918     * Tells the WebView to enable JavaScript execution.
919     * <b>The default is {@code false}.</b>
920     *
921     * @param flag {@code true} if the WebView should execute JavaScript
922     */
923    public abstract void setJavaScriptEnabled(boolean flag);
924
925    /**
926     * Sets whether JavaScript running in the context of a file scheme URL
927     * should be allowed to access content from any origin. This includes
928     * access to content from other file scheme URLs. See
929     * {@link #setAllowFileAccessFromFileURLs}. To enable the most restrictive,
930     * and therefore secure policy, this setting should be disabled.
931     * Note that this setting affects only JavaScript access to file scheme
932     * resources. Other access to such resources, for example, from image HTML
933     * elements, is unaffected. To prevent possible violation of same domain policy
934     * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
935     * you should explicitly set this value to {@code false}.
936     * <p>
937     * The default value is {@code true} for apps targeting
938     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
939     * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
940     * and above.
941     *
942     * @param flag whether JavaScript running in the context of a file scheme
943     *             URL should be allowed to access content from any origin
944     */
945    public abstract void setAllowUniversalAccessFromFileURLs(boolean flag);
946
947    /**
948     * Sets whether JavaScript running in the context of a file scheme URL
949     * should be allowed to access content from other file scheme URLs. To
950     * enable the most restrictive, and therefore secure, policy this setting
951     * should be disabled. Note that the value of this setting is ignored if
952     * the value of {@link #getAllowUniversalAccessFromFileURLs} is {@code true}.
953     * Note too, that this setting affects only JavaScript access to file scheme
954     * resources. Other access to such resources, for example, from image HTML
955     * elements, is unaffected. To prevent possible violation of same domain policy
956     * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
957     * you should explicitly set this value to {@code false}.
958     * <p>
959     * The default value is {@code true} for apps targeting
960     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
961     * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
962     * and above.
963     *
964     * @param flag whether JavaScript running in the context of a file scheme
965     *             URL should be allowed to access content from other file
966     *             scheme URLs
967     */
968    public abstract void setAllowFileAccessFromFileURLs(boolean flag);
969
970    /**
971     * Sets whether the WebView should enable plugins. The default is {@code false}.
972     *
973     * @param flag {@code true} if plugins should be enabled
974     * @deprecated This method has been deprecated in favor of
975     *             {@link #setPluginState}
976     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
977     */
978    @SystemApi
979    @Deprecated
980    public abstract void setPluginsEnabled(boolean flag);
981
982    /**
983     * Tells the WebView to enable, disable, or have plugins on demand. On
984     * demand mode means that if a plugin exists that can handle the embedded
985     * content, a placeholder icon will be shown instead of the plugin. When
986     * the placeholder is clicked, the plugin will be enabled. The default is
987     * {@link PluginState#OFF}.
988     *
989     * @param state a PluginState value
990     * @deprecated Plugins will not be supported in future, and should not be used.
991     */
992    @Deprecated
993    public abstract void setPluginState(PluginState state);
994
995    /**
996     * Sets a custom path to plugins used by the WebView. This method is
997     * obsolete since each plugin is now loaded from its own package.
998     *
999     * @param pluginsPath a String path to the directory containing plugins
1000     * @deprecated This method is no longer used as plugins are loaded from
1001     *             their own APK via the system's package manager.
1002     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1003     */
1004    @Deprecated
1005    public void setPluginsPath(String pluginsPath) {
1006        // Specified to do nothing, so no need for derived classes to override.
1007    }
1008
1009    /**
1010     * Sets the path to where database storage API databases should be saved.
1011     * In order for the database storage API to function correctly, this method
1012     * must be called with a path to which the application can write. This
1013     * method should only be called once: repeated calls are ignored.
1014     *
1015     * @param databasePath a path to the directory where databases should be
1016     *                     saved.
1017     * @deprecated Database paths are managed by the implementation and calling this method
1018     *             will have no effect.
1019     */
1020    @Deprecated
1021    public abstract void setDatabasePath(String databasePath);
1022
1023    /**
1024     * Sets the path where the Geolocation databases should be saved. In order
1025     * for Geolocation permissions and cached positions to be persisted, this
1026     * method must be called with a path to which the application can write.
1027     *
1028     * @param databasePath a path to the directory where databases should be
1029     *                     saved.
1030     * @deprecated Geolocation database are managed by the implementation and calling this method
1031     *             will have no effect.
1032     */
1033    @Deprecated
1034    public abstract void setGeolocationDatabasePath(String databasePath);
1035
1036    /**
1037     * Sets whether the Application Caches API should be enabled. The default
1038     * is {@code false}. Note that in order for the Application Caches API to be
1039     * enabled, a valid database path must also be supplied to
1040     * {@link #setAppCachePath}.
1041     *
1042     * @param flag {@code true} if the WebView should enable Application Caches
1043     */
1044    public abstract void setAppCacheEnabled(boolean flag);
1045
1046    /**
1047     * Sets the path to the Application Caches files. In order for the
1048     * Application Caches API to be enabled, this method must be called with a
1049     * path to which the application can write. This method should only be
1050     * called once: repeated calls are ignored.
1051     *
1052     * @param appCachePath a String path to the directory containing
1053     *                     Application Caches files.
1054     * @see #setAppCacheEnabled
1055     */
1056    public abstract void setAppCachePath(String appCachePath);
1057
1058    /**
1059     * Sets the maximum size for the Application Cache content. The passed size
1060     * will be rounded to the nearest value that the database can support, so
1061     * this should be viewed as a guide, not a hard limit. Setting the
1062     * size to a value less than current database size does not cause the
1063     * database to be trimmed. The default size is {@link Long#MAX_VALUE}.
1064     * It is recommended to leave the maximum size set to the default value.
1065     *
1066     * @param appCacheMaxSize the maximum size in bytes
1067     * @deprecated In future quota will be managed automatically.
1068     */
1069    @Deprecated
1070    public abstract void setAppCacheMaxSize(long appCacheMaxSize);
1071
1072    /**
1073     * Sets whether the database storage API is enabled. The default value is
1074     * false. See also {@link #setDatabasePath} for how to correctly set up the
1075     * database storage API.
1076     *
1077     * This setting is global in effect, across all WebView instances in a process.
1078     * Note you should only modify this setting prior to making <b>any</b> WebView
1079     * page load within a given process, as the WebView implementation may ignore
1080     * changes to this setting after that point.
1081     *
1082     * @param flag {@code true} if the WebView should use the database storage API
1083     */
1084    public abstract void setDatabaseEnabled(boolean flag);
1085
1086    /**
1087     * Sets whether the DOM storage API is enabled. The default value is {@code false}.
1088     *
1089     * @param flag {@code true} if the WebView should use the DOM storage API
1090     */
1091    public abstract void setDomStorageEnabled(boolean flag);
1092
1093    /**
1094     * Gets whether the DOM Storage APIs are enabled.
1095     *
1096     * @return {@code true} if the DOM Storage APIs are enabled
1097     * @see #setDomStorageEnabled
1098     */
1099    public abstract boolean getDomStorageEnabled();
1100
1101    /**
1102     * Gets the path to where database storage API databases are saved.
1103     *
1104     * @return the String path to the database storage API databases
1105     * @see #setDatabasePath
1106     * @deprecated Database paths are managed by the implementation this method is obsolete.
1107     */
1108    @Deprecated
1109    public abstract String getDatabasePath();
1110
1111    /**
1112     * Gets whether the database storage API is enabled.
1113     *
1114     * @return {@code true} if the database storage API is enabled
1115     * @see #setDatabaseEnabled
1116     */
1117    public abstract boolean getDatabaseEnabled();
1118
1119    /**
1120     * Sets whether Geolocation is enabled. The default is {@code true}.
1121     * <p>
1122     * Please note that in order for the Geolocation API to be usable
1123     * by a page in the WebView, the following requirements must be met:
1124     * <ul>
1125     *   <li>an application must have permission to access the device location,
1126     *   see {@link android.Manifest.permission#ACCESS_COARSE_LOCATION},
1127     *   {@link android.Manifest.permission#ACCESS_FINE_LOCATION};
1128     *   <li>an application must provide an implementation of the
1129     *   {@link WebChromeClient#onGeolocationPermissionsShowPrompt} callback
1130     *   to receive notifications that a page is requesting access to location
1131     *   via the JavaScript Geolocation API.
1132     * </ul>
1133     * <p>
1134     *
1135     * @param flag whether Geolocation should be enabled
1136     */
1137    public abstract void setGeolocationEnabled(boolean flag);
1138
1139    /**
1140     * Gets whether JavaScript is enabled.
1141     *
1142     * @return {@code true} if JavaScript is enabled
1143     * @see #setJavaScriptEnabled
1144     */
1145    public abstract boolean getJavaScriptEnabled();
1146
1147    /**
1148     * Gets whether JavaScript running in the context of a file scheme URL can
1149     * access content from any origin. This includes access to content from
1150     * other file scheme URLs.
1151     *
1152     * @return whether JavaScript running in the context of a file scheme URL
1153     *         can access content from any origin
1154     * @see #setAllowUniversalAccessFromFileURLs
1155     */
1156    public abstract boolean getAllowUniversalAccessFromFileURLs();
1157
1158    /**
1159     * Gets whether JavaScript running in the context of a file scheme URL can
1160     * access content from other file scheme URLs.
1161     *
1162     * @return whether JavaScript running in the context of a file scheme URL
1163     *         can access content from other file scheme URLs
1164     * @see #setAllowFileAccessFromFileURLs
1165     */
1166    public abstract boolean getAllowFileAccessFromFileURLs();
1167
1168    /**
1169     * Gets whether plugins are enabled.
1170     *
1171     * @return {@code true} if plugins are enabled
1172     * @see #setPluginsEnabled
1173     * @deprecated This method has been replaced by {@link #getPluginState}
1174     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1175     */
1176    @SystemApi
1177    @Deprecated
1178    public abstract boolean getPluginsEnabled();
1179
1180    /**
1181     * Gets the current state regarding whether plugins are enabled.
1182     *
1183     * @return the plugin state as a {@link PluginState} value
1184     * @see #setPluginState
1185     * @deprecated Plugins will not be supported in future, and should not be used.
1186     */
1187    @Deprecated
1188    public abstract PluginState getPluginState();
1189
1190    /**
1191     * Gets the directory that contains the plugin libraries. This method is
1192     * obsolete since each plugin is now loaded from its own package.
1193     *
1194     * @return an empty string
1195     * @deprecated This method is no longer used as plugins are loaded from
1196     * their own APK via the system's package manager.
1197     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1198     */
1199    @Deprecated
1200    public String getPluginsPath() {
1201        // Unconditionally returns empty string, so no need for derived classes to override.
1202        return "";
1203    }
1204
1205    /**
1206     * Tells JavaScript to open windows automatically. This applies to the
1207     * JavaScript function {@code window.open()}. The default is {@code false}.
1208     *
1209     * @param flag {@code true} if JavaScript can open windows automatically
1210     */
1211    public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean flag);
1212
1213    /**
1214     * Gets whether JavaScript can open windows automatically.
1215     *
1216     * @return {@code true} if JavaScript can open windows automatically during
1217     *         {@code window.open()}
1218     * @see #setJavaScriptCanOpenWindowsAutomatically
1219     */
1220    public abstract boolean getJavaScriptCanOpenWindowsAutomatically();
1221
1222    /**
1223     * Sets the default text encoding name to use when decoding html pages.
1224     * The default is "UTF-8".
1225     *
1226     * @param encoding the text encoding name
1227     */
1228    public abstract void setDefaultTextEncodingName(String encoding);
1229
1230    /**
1231     * Gets the default text encoding name.
1232     *
1233     * @return the default text encoding name as a string
1234     * @see #setDefaultTextEncodingName
1235     */
1236    public abstract String getDefaultTextEncodingName();
1237
1238    /**
1239     * Sets the WebView's user-agent string. If the string is {@code null} or empty,
1240     * the system default value will be used.
1241     *
1242     * Note that starting from {@link android.os.Build.VERSION_CODES#KITKAT} Android
1243     * version, changing the user-agent while loading a web page causes WebView
1244     * to initiate loading once again.
1245     *
1246     * @param ua new user-agent string
1247     */
1248    public abstract void setUserAgentString(@Nullable String ua);
1249
1250    /**
1251     * Gets the WebView's user-agent string.
1252     *
1253     * @return the WebView's user-agent string
1254     * @see #setUserAgentString
1255     */
1256    public abstract String getUserAgentString();
1257
1258    /**
1259     * Returns the default User-Agent used by a WebView.
1260     * An instance of WebView could use a different User-Agent if a call
1261     * is made to {@link WebSettings#setUserAgentString(String)}.
1262     *
1263     * @param context a Context object used to access application assets
1264     */
1265    public static String getDefaultUserAgent(Context context) {
1266        return WebViewFactory.getProvider().getStatics().getDefaultUserAgent(context);
1267    }
1268
1269    /**
1270     * Tells the WebView whether it needs to set a node to have focus when
1271     * {@link WebView#requestFocus(int, android.graphics.Rect)} is called. The
1272     * default value is {@code true}.
1273     *
1274     * @param flag whether the WebView needs to set a node
1275     */
1276    public abstract void setNeedInitialFocus(boolean flag);
1277
1278    /**
1279     * Sets the priority of the Render thread. Unlike the other settings, this
1280     * one only needs to be called once per process. The default value is
1281     * {@link RenderPriority#NORMAL}.
1282     *
1283     * @param priority the priority
1284     * @deprecated It is not recommended to adjust thread priorities, and this will
1285     *             not be supported in future versions.
1286     */
1287    @Deprecated
1288    public abstract void setRenderPriority(RenderPriority priority);
1289
1290    /**
1291     * Overrides the way the cache is used. The way the cache is used is based
1292     * on the navigation type. For a normal page load, the cache is checked
1293     * and content is re-validated as needed. When navigating back, content is
1294     * not revalidated, instead the content is just retrieved from the cache.
1295     * This method allows the client to override this behavior by specifying
1296     * one of {@link #LOAD_DEFAULT},
1297     * {@link #LOAD_CACHE_ELSE_NETWORK}, {@link #LOAD_NO_CACHE} or
1298     * {@link #LOAD_CACHE_ONLY}. The default value is {@link #LOAD_DEFAULT}.
1299     *
1300     * @param mode the mode to use
1301     */
1302    public abstract void setCacheMode(@CacheMode int mode);
1303
1304    /**
1305     * Gets the current setting for overriding the cache mode.
1306     *
1307     * @return the current setting for overriding the cache mode
1308     * @see #setCacheMode
1309     */
1310    @CacheMode
1311    public abstract int getCacheMode();
1312
1313    /**
1314     * Configures the WebView's behavior when a secure origin attempts to load a resource from an
1315     * insecure origin.
1316     *
1317     * By default, apps that target {@link android.os.Build.VERSION_CODES#KITKAT} or below default
1318     * to {@link #MIXED_CONTENT_ALWAYS_ALLOW}. Apps targeting
1319     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} default to {@link #MIXED_CONTENT_NEVER_ALLOW}.
1320     *
1321     * The preferred and most secure mode of operation for the WebView is
1322     * {@link #MIXED_CONTENT_NEVER_ALLOW} and use of {@link #MIXED_CONTENT_ALWAYS_ALLOW} is
1323     * strongly discouraged.
1324     *
1325     * @param mode The mixed content mode to use. One of {@link #MIXED_CONTENT_NEVER_ALLOW},
1326     *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
1327     */
1328    public abstract void setMixedContentMode(int mode);
1329
1330    /**
1331     * Gets the current behavior of the WebView with regard to loading insecure content from a
1332     * secure origin.
1333     * @return The current setting, one of {@link #MIXED_CONTENT_NEVER_ALLOW},
1334     *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
1335     */
1336    public abstract int getMixedContentMode();
1337
1338    /**
1339     * Sets whether to use a video overlay for embedded encrypted video.
1340     * In API levels prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, encrypted video can
1341     * only be rendered directly on a secure video surface, so it had been a hard problem to play
1342     * encrypted video in HTML.  When this flag is on, WebView can play encrypted video (MSE/EME)
1343     * by using a video overlay (aka hole-punching) for videos embedded using HTML &lt;video&gt;
1344     * tag.<br>
1345     * Caution: This setting is intended for use only in a narrow set of circumstances and apps
1346     * should only enable it if they require playback of encrypted video content. It will impose
1347     * the following limitations on the WebView:
1348     * <ul>
1349     * <li> Only one video overlay can be played at a time.
1350     * <li> Changes made to position or dimensions of a video element may be propagated to the
1351     * corresponding video overlay with a noticeable delay.
1352     * <li> The video overlay is not visible to web APIs and as such may not interact with
1353     * script or styling. For example, CSS styles applied to the &lt;video&gt; tag may be ignored.
1354     * </ul>
1355     * This is not an exhaustive set of constraints and it may vary with new versions of the
1356     * WebView.
1357     * @hide
1358     */
1359    @SystemApi
1360    public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean flag);
1361
1362    /**
1363     * Gets whether a video overlay will be used for embedded encrypted video.
1364     *
1365     * @return {@code true} if WebView uses a video overlay for embedded encrypted video.
1366     * @see #setVideoOverlayForEmbeddedEncryptedVideoEnabled
1367     * @hide
1368     */
1369    @SystemApi
1370    public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
1371
1372    /**
1373     * Sets whether this WebView should raster tiles when it is
1374     * offscreen but attached to a window. Turning this on can avoid
1375     * rendering artifacts when animating an offscreen WebView on-screen.
1376     * Offscreen WebViews in this mode use more memory. The default value is
1377     * false.<br>
1378     * Please follow these guidelines to limit memory usage:
1379     * <ul>
1380     * <li> WebView size should be not be larger than the device screen size.
1381     * <li> Limit use of this mode to a small number of WebViews. Use it for
1382     *   visible WebViews and WebViews about to be animated to visible.
1383     * </ul>
1384     */
1385    public abstract void setOffscreenPreRaster(boolean enabled);
1386
1387    /**
1388     * Gets whether this WebView should raster tiles when it is
1389     * offscreen but attached to a window.
1390     * @return {@code true} if this WebView will raster tiles when it is
1391     * offscreen but attached to a window.
1392     */
1393    public abstract boolean getOffscreenPreRaster();
1394
1395
1396    /**
1397     * Sets whether Safe Browsing is enabled. Safe Browsing allows WebView to
1398     * protect against malware and phishing attacks by verifying the links.
1399     *
1400     * <p>
1401     * Safe Browsing can be disabled for all WebViews using a manifest tag (read <a
1402     * href="{@docRoot}reference/android/webkit/WebView.html">general Safe Browsing info</a>). The
1403     * manifest tag has a lower precedence than this API.
1404     *
1405     * <p>
1406     * Safe Browsing is enabled by default for devices which support it.
1407     *
1408     * @param enabled Whether Safe Browsing is enabled.
1409     */
1410    public abstract void setSafeBrowsingEnabled(boolean enabled);
1411
1412    /**
1413     * Gets whether Safe Browsing is enabled.
1414     * See {@link #setSafeBrowsingEnabled}.
1415     *
1416     * @return {@code true} if Safe Browsing is enabled and {@code false} otherwise.
1417     */
1418    public abstract boolean getSafeBrowsingEnabled();
1419
1420
1421    /**
1422     * @hide
1423     */
1424    @IntDef(flag = true, prefix = { "MENU_ITEM_" }, value = {
1425            MENU_ITEM_NONE,
1426            MENU_ITEM_SHARE,
1427            MENU_ITEM_WEB_SEARCH,
1428            MENU_ITEM_PROCESS_TEXT
1429    })
1430    @Retention(RetentionPolicy.SOURCE)
1431    @Target({ElementType.PARAMETER, ElementType.METHOD})
1432    private @interface MenuItemFlags {}
1433
1434    /**
1435     * Disables the action mode menu items according to {@code menuItems} flag.
1436     * @param menuItems an integer field flag for the menu items to be disabled.
1437     */
1438    public abstract void setDisabledActionModeMenuItems(@MenuItemFlags int menuItems);
1439
1440    /**
1441     * Gets the action mode menu items that are disabled, expressed in an integer field flag.
1442     * The default value is {@link #MENU_ITEM_NONE}
1443     *
1444     * @return all the disabled menu item flags combined with bitwise OR.
1445     */
1446    public abstract @MenuItemFlags int getDisabledActionModeMenuItems();
1447
1448    /**
1449     * Used with {@link #setDisabledActionModeMenuItems}.
1450     *
1451     * No menu items should be disabled.
1452     */
1453    public static final int MENU_ITEM_NONE = 0;
1454
1455    /**
1456     * Used with {@link #setDisabledActionModeMenuItems}.
1457     *
1458     * Disable menu item "Share".
1459     */
1460    public static final int MENU_ITEM_SHARE = 1 << 0;
1461
1462    /**
1463     * Used with {@link #setDisabledActionModeMenuItems}.
1464     *
1465     * Disable menu item "Web Search".
1466     */
1467    public static final int MENU_ITEM_WEB_SEARCH = 1 << 1;
1468
1469    /**
1470     * Used with {@link #setDisabledActionModeMenuItems}.
1471     *
1472     * Disable all the action mode menu items for text processing.
1473     * By default WebView searches for activities that are able to handle
1474     * {@link android.content.Intent#ACTION_PROCESS_TEXT} and show them in the
1475     * action mode menu. If this flag is set via {@link
1476     * #setDisabledActionModeMenuItems}, these menu items will be disabled.
1477     */
1478    public static final int MENU_ITEM_PROCESS_TEXT = 1 << 2;
1479}
1480