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.client;
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 public class XWalkDefaultWebChromeClient extends XWalkWebChromeClient {
36 // Strings for displaying Dialog.
37 private static String mJSAlertTitle;
38 private static String mJSConfirmTitle;
39 private static String mJSPromptTitle;
40 private static String mOKButton;
41 private static String mCancelButton;
43 private Context mContext;
44 private AlertDialog mDialog;
45 private EditText mPromptText;
46 private int mSystemUiFlag;
47 private View mCustomView;
48 private View mDecorView;
49 private XWalkView mView;
50 private XWalkWebChromeClient.CustomViewCallback mCustomViewCallback;
51 private boolean mOriginalFullscreen;
52 private boolean mIsFullscreen = false;
54 public XWalkDefaultWebChromeClient(Context context, XWalkView view) {
56 mDecorView = view.getActivity().getWindow().getDecorView();
57 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
58 mSystemUiFlag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
59 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
60 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
63 initResources(context);
66 private static void initResources(Context context) {
67 if (mJSAlertTitle != null) return;
68 mJSAlertTitle = context.getString(R.string.js_alert_title);
69 mJSConfirmTitle = context.getString(R.string.js_confirm_title);
70 mJSPromptTitle = context.getString(R.string.js_prompt_title);
71 mOKButton = context.getString(android.R.string.ok);
72 mCancelButton = context.getString(android.R.string.cancel);
76 public boolean onJsAlert(XWalkView view, String url, String message,
77 final JsResult result) {
78 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
79 dialogBuilder.setTitle(mJSAlertTitle)
82 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
84 public void onClick(DialogInterface dialog, int which) {
89 mDialog = dialogBuilder.create();
95 public boolean onJsConfirm(XWalkView view, String url, String message,
96 final JsResult result) {
97 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
98 dialogBuilder.setTitle(mJSConfirmTitle)
100 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
102 public void onClick(DialogInterface dialog, int which) {
107 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
109 public void onClick(DialogInterface dialog, int which) {
114 mDialog = dialogBuilder.create();
120 public boolean onJsPrompt(XWalkView view, String url, String message,
121 String defaultValue, final JsPromptResult result) {
122 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
123 dialogBuilder.setTitle(mJSPromptTitle)
125 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
127 public void onClick(DialogInterface dialog, int which) {
128 result.confirm(mPromptText.getText().toString());
132 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
134 public void onClick(DialogInterface dialog, int which) {
139 mPromptText = new EditText(mContext);
140 mPromptText.setVisibility(View.VISIBLE);
141 mPromptText.setText(defaultValue);
142 mPromptText.selectAll();
144 dialogBuilder.setView(mPromptText);
145 mDialog = dialogBuilder.create();
151 public void onShowCustomView(View view, CustomViewCallback callback) {
152 Activity activity = mView.getActivity();
154 if (mCustomView != null || activity == null) {
155 callback.onCustomViewHidden();
160 mCustomViewCallback = callback;
162 onToggleFullscreen(true);
164 // Add the video view to the activity's ContentView.
165 activity.getWindow().addContentView(view,
166 new FrameLayout.LayoutParams(
167 ViewGroup.LayoutParams.MATCH_PARENT,
168 ViewGroup.LayoutParams.MATCH_PARENT,
173 public void onHideCustomView() {
174 Activity activity = mView.getActivity();
176 if (mCustomView == null || activity == null) return;
178 onToggleFullscreen(false);
180 // Remove video view from activity's ContentView.
181 FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView();
182 decor.removeView(mCustomView);
183 mCustomViewCallback.onCustomViewHidden();
186 mCustomViewCallback = null;
190 public void onGeolocationPermissionsShowPrompt(String origin,
191 XWalkGeolocationPermissions.Callback callback) {
192 // Allow all origins for geolocation requests here for Crosswalk.
193 // TODO(yongsheng): Need to define a UI prompt?
194 callback.invoke(origin, true, true);
198 public void onToggleFullscreen(boolean enterFullscreen) {
199 Activity activity = mView.getActivity();
200 if (enterFullscreen) {
201 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
202 mSystemUiFlag = mDecorView.getSystemUiVisibility();
203 mDecorView.setSystemUiVisibility(
204 View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
205 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
206 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
207 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
208 View.SYSTEM_UI_FLAG_FULLSCREEN |
209 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
211 if ((activity.getWindow().getAttributes().flags &
212 WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) {
213 mOriginalFullscreen = true;
215 mOriginalFullscreen = false;
217 if (!mOriginalFullscreen) {
218 activity.getWindow().setFlags(
219 WindowManager.LayoutParams.FLAG_FULLSCREEN,
220 WindowManager.LayoutParams.FLAG_FULLSCREEN);
224 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
225 mDecorView.setSystemUiVisibility(mSystemUiFlag);
227 // Clear the activity fullscreen flag.
228 if (!mOriginalFullscreen) {
229 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
233 mIsFullscreen = enterFullscreen;
237 public boolean isFullscreen() {
238 return mIsFullscreen;