1 // Copyright (c) 2013 Intel Corporation. All rights reserved
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.xwalk.core;
7 import android.app.Activity;
8 import android.app.AlertDialog;
9 import android.content.Context;
10 import android.content.DialogInterface;
11 import android.content.pm.ActivityInfo;
12 import android.graphics.Bitmap;
13 import android.net.Uri;
14 import android.os.Build.VERSION;
15 import android.os.Build.VERSION_CODES;
16 import android.os.Message;
17 import android.view.Gravity;
18 import android.view.View;
19 import android.view.ViewGroup;
20 import android.view.WindowManager;
21 import android.webkit.WebStorage;
22 import android.webkit.ConsoleMessage;
23 import android.webkit.ValueCallback;
24 import android.widget.EditText;
25 import android.widget.FrameLayout;
27 import org.xwalk.core.JsPromptResult;
28 import org.xwalk.core.JsResult;
29 import org.xwalk.core.R;
30 import org.xwalk.core.XWalkGeolocationPermissions;
31 import org.xwalk.core.XWalkView;
32 import org.xwalk.core.XWalkWebChromeClient;
34 // Provisionally set it as public.
35 // TODO(yongsheng): remove public modifier.
36 public class XWalkDefaultWebChromeClient extends XWalkWebChromeClient {
38 // Strings for displaying Dialog.
39 private static String mJSAlertTitle;
40 private static String mJSConfirmTitle;
41 private static String mJSPromptTitle;
42 private static String mOKButton;
43 private static String mCancelButton;
45 private Context mContext;
46 private AlertDialog mDialog;
47 private EditText mPromptText;
48 private int mSystemUiFlag;
49 private View mCustomView;
50 private View mDecorView;
51 private XWalkView mView;
52 private XWalkWebChromeClient.CustomViewCallback mCustomViewCallback;
53 private boolean mOriginalFullscreen;
54 private boolean mIsFullscreen = false;
56 public XWalkDefaultWebChromeClient(Context context, XWalkView view) {
58 mDecorView = view.getActivity().getWindow().getDecorView();
59 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
60 mSystemUiFlag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
61 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
62 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
65 initResources(context);
68 private static void initResources(Context context) {
69 if (mJSAlertTitle != null) return;
70 mJSAlertTitle = context.getString(R.string.js_alert_title);
71 mJSConfirmTitle = context.getString(R.string.js_confirm_title);
72 mJSPromptTitle = context.getString(R.string.js_prompt_title);
73 mOKButton = context.getString(android.R.string.ok);
74 mCancelButton = context.getString(android.R.string.cancel);
78 public boolean onJsAlert(XWalkView view, String url, String message,
79 final JsResult result) {
80 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
81 dialogBuilder.setTitle(mJSAlertTitle)
84 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
86 public void onClick(DialogInterface dialog, int which) {
91 mDialog = dialogBuilder.create();
97 public boolean onJsConfirm(XWalkView view, String url, String message,
98 final JsResult result) {
99 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
100 dialogBuilder.setTitle(mJSConfirmTitle)
102 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
104 public void onClick(DialogInterface dialog, int which) {
109 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
111 public void onClick(DialogInterface dialog, int which) {
116 mDialog = dialogBuilder.create();
122 public boolean onJsPrompt(XWalkView view, String url, String message,
123 String defaultValue, final JsPromptResult result) {
124 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
125 dialogBuilder.setTitle(mJSPromptTitle)
127 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
129 public void onClick(DialogInterface dialog, int which) {
130 result.confirm(mPromptText.getText().toString());
134 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
136 public void onClick(DialogInterface dialog, int which) {
141 mPromptText = new EditText(mContext);
142 mPromptText.setVisibility(View.VISIBLE);
143 mPromptText.setText(defaultValue);
144 mPromptText.selectAll();
146 dialogBuilder.setView(mPromptText);
147 mDialog = dialogBuilder.create();
153 public void onShowCustomView(View view, CustomViewCallback callback) {
154 Activity activity = mView.getActivity();
156 if (mCustomView != null || activity == null) {
157 callback.onCustomViewHidden();
162 mCustomViewCallback = callback;
164 onToggleFullscreen(true);
166 // Add the video view to the activity's ContentView.
167 activity.getWindow().addContentView(view,
168 new FrameLayout.LayoutParams(
169 ViewGroup.LayoutParams.MATCH_PARENT,
170 ViewGroup.LayoutParams.MATCH_PARENT,
175 public void onHideCustomView() {
176 Activity activity = mView.getActivity();
178 if (mCustomView == null || activity == null) return;
180 onToggleFullscreen(false);
182 // Remove video view from activity's ContentView.
183 FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView();
184 decor.removeView(mCustomView);
185 mCustomViewCallback.onCustomViewHidden();
188 mCustomViewCallback = null;
192 public void onGeolocationPermissionsShowPrompt(String origin,
193 XWalkGeolocationPermissions.Callback callback) {
194 // Allow all origins for geolocation requests here for Crosswalk.
195 // TODO(yongsheng): Need to define a UI prompt?
196 callback.invoke(origin, true, true);
200 public void onToggleFullscreen(boolean enterFullscreen) {
201 Activity activity = mView.getActivity();
202 if (enterFullscreen) {
203 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
204 mSystemUiFlag = mDecorView.getSystemUiVisibility();
205 mDecorView.setSystemUiVisibility(
206 View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
207 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
208 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
209 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
210 View.SYSTEM_UI_FLAG_FULLSCREEN |
211 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
213 if ((activity.getWindow().getAttributes().flags &
214 WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) {
215 mOriginalFullscreen = true;
217 mOriginalFullscreen = false;
219 if (!mOriginalFullscreen) {
220 activity.getWindow().setFlags(
221 WindowManager.LayoutParams.FLAG_FULLSCREEN,
222 WindowManager.LayoutParams.FLAG_FULLSCREEN);
226 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
227 mDecorView.setSystemUiVisibility(mSystemUiFlag);
229 // Clear the activity fullscreen flag.
230 if (!mOriginalFullscreen) {
231 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
235 mIsFullscreen = enterFullscreen;
239 public boolean isFullscreen() {
240 return mIsFullscreen;