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.net.Uri;
12 import android.os.Build.VERSION;
13 import android.os.Build.VERSION_CODES;
14 import android.view.KeyEvent;
15 import android.view.View;
16 import android.view.WindowManager;
17 import android.webkit.ValueCallback;
18 import android.widget.EditText;
21 * This is the implementation of XWalkUIClient if callers don't specify one.
23 public class XWalkUIClientImpl extends XWalkUIClient {
25 // Strings for displaying Dialog.
26 private static String mJSAlertTitle;
27 private static String mJSConfirmTitle;
28 private static String mJSPromptTitle;
29 private static String mOKButton;
30 private static String mCancelButton;
32 private Context mContext;
33 private AlertDialog mDialog;
34 private EditText mPromptText;
35 private int mSystemUiFlag;
36 private View mDecorView;
37 private XWalkView mXWalkView;
38 private boolean mOriginalFullscreen;
40 public XWalkUIClientImpl(Context context, XWalkView view) {
42 mDecorView = view.getActivity().getWindow().getDecorView();
43 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
44 mSystemUiFlag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
45 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
46 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
49 initResources(context);
52 private static void initResources(Context context) {
53 if (mJSAlertTitle != null) return;
54 mJSAlertTitle = context.getString(R.string.js_alert_title);
55 mJSConfirmTitle = context.getString(R.string.js_confirm_title);
56 mJSPromptTitle = context.getString(R.string.js_prompt_title);
57 mOKButton = context.getString(android.R.string.ok);
58 mCancelButton = context.getString(android.R.string.cancel);
62 public void onJavascriptCloseWindow(XWalkView view) {
63 if (view != null && view.getActivity() != null) {
64 view.getActivity().finish();
69 public boolean onJavascriptModalDialog(XWalkView view, JavascriptMessageType type, String url,
70 String message, String defaultValue, XWalkJavascriptResult result) {
72 case JAVASCRIPT_ALERT:
73 return onJsAlert(view, url, message, result);
74 case JAVASCRIPT_CONFIRM:
75 return onJsConfirm(view, url, message, result);
76 case JAVASCRIPT_PROMPT:
77 return onJsPrompt(view, url, message, defaultValue, result);
78 case JAVASCRIPT_BEFOREUNLOAD:
79 // Reuse onJsConfirm to show the dialog.
80 return onJsConfirm(view, url, message, result);
88 private boolean onJsAlert(XWalkView view, String url, String message,
89 XWalkJavascriptResult result) {
90 final XWalkJavascriptResult fResult = result;
91 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
92 dialogBuilder.setTitle(mJSAlertTitle)
95 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
97 public void onClick(DialogInterface dialog, int which) {
101 }).setOnKeyListener(new DialogInterface.OnKeyListener() {
103 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
104 if (keyCode == KeyEvent.KEYCODE_BACK) {
112 mDialog = dialogBuilder.create();
117 private boolean onJsConfirm(XWalkView view, String url, String message,
118 XWalkJavascriptResult result) {
119 final XWalkJavascriptResult fResult = result;
120 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
121 dialogBuilder.setTitle(mJSConfirmTitle)
124 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
126 public void onClick(DialogInterface dialog, int which) {
131 .setNegativeButton(mCancelButton, null)
132 .setOnCancelListener(new DialogInterface.OnCancelListener() {
134 public void onCancel(DialogInterface dialog) {
137 }).setOnKeyListener(new DialogInterface.OnKeyListener() {
139 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
140 if (keyCode == KeyEvent.KEYCODE_BACK) {
148 mDialog = dialogBuilder.create();
153 private boolean onJsPrompt(XWalkView view, String url, String message,
154 String defaultValue, XWalkJavascriptResult result) {
155 final XWalkJavascriptResult fResult = result;
156 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
157 dialogBuilder.setTitle(mJSPromptTitle)
159 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
161 public void onClick(DialogInterface dialog, int which) {
162 fResult.confirmWithResult(mPromptText.getText().toString());
166 .setNegativeButton(mCancelButton, null)
167 .setOnCancelListener(new DialogInterface.OnCancelListener() {
169 public void onCancel(DialogInterface dialog) {
173 mPromptText = new EditText(mContext);
174 mPromptText.setVisibility(View.VISIBLE);
175 mPromptText.setText(defaultValue);
176 mPromptText.selectAll();
178 dialogBuilder.setView(mPromptText);
179 mDialog = dialogBuilder.create();
185 public void onFullscreenToggled(XWalkView view, boolean enterFullscreen) {
186 Activity activity = view.getActivity();
187 if (enterFullscreen) {
188 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
189 mSystemUiFlag = mDecorView.getSystemUiVisibility();
190 mDecorView.setSystemUiVisibility(
191 View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
192 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
193 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
194 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
195 View.SYSTEM_UI_FLAG_FULLSCREEN |
196 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
198 if ((activity.getWindow().getAttributes().flags &
199 WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) {
200 mOriginalFullscreen = true;
202 mOriginalFullscreen = false;
204 if (!mOriginalFullscreen) {
205 activity.getWindow().setFlags(
206 WindowManager.LayoutParams.FLAG_FULLSCREEN,
207 WindowManager.LayoutParams.FLAG_FULLSCREEN);
211 if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
212 mDecorView.setSystemUiVisibility(mSystemUiFlag);
214 // Clear the activity fullscreen flag.
215 if (!mOriginalFullscreen) {
216 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);