4276e1a4a3e090170dd5e1b3ffa45e2273d98b3c
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core / src / org / xwalk / core / XWalkUIClientImpl.java
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.
4
5 package org.xwalk.core;
6
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;
19
20 /**
21  * This is the implementation of XWalkUIClient if callers don't specify one.
22  */
23 public class XWalkUIClientImpl extends XWalkUIClient {
24
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;
31
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;
39
40     public XWalkUIClientImpl(Context context, XWalkView view) {
41         mContext = context;
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;
47         }
48         mXWalkView = view;
49         initResources(context);
50     }
51
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);
59     }
60
61     @Override
62     public void onJavascriptCloseWindow(XWalkView view) {
63         if (view != null && view.getActivity() != null) {
64             view.getActivity().finish();
65         }
66     }
67
68     @Override
69     public boolean onJavascriptModalDialog(XWalkView view, JavascriptMessageType type, String url,
70             String message, String defaultValue, XWalkJavascriptResult result) {
71         switch(type) {
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);
81             default:
82                 break;
83         }
84         assert(false);
85         return false;
86     }
87
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)
93                 .setMessage(message)
94                 .setCancelable(true)
95                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
96                     @Override
97                     public void onClick(DialogInterface dialog, int which) {
98                         fResult.confirm();
99                         dialog.dismiss();
100                     }
101                 }).setOnKeyListener(new DialogInterface.OnKeyListener() {
102                     @Override
103                     public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
104                         if (keyCode == KeyEvent.KEYCODE_BACK) {
105                             fResult.confirm();
106                             return false;
107                         } else {
108                             return true;
109                         }
110                     }
111                 });
112         mDialog = dialogBuilder.create();
113         mDialog.show();
114         return false;
115     }
116
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)
122                 .setMessage(message)
123                 .setCancelable(true)
124                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
125                     @Override
126                     public void onClick(DialogInterface dialog, int which) {
127                         fResult.confirm();
128                         dialog.dismiss();
129                     }
130                 })
131                 .setNegativeButton(mCancelButton, null)
132                 .setOnCancelListener(new DialogInterface.OnCancelListener() {
133                     @Override
134                     public void onCancel(DialogInterface dialog) {
135                         fResult.cancel();
136                     }
137                 }).setOnKeyListener(new DialogInterface.OnKeyListener() {
138                     @Override
139                     public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
140                         if (keyCode == KeyEvent.KEYCODE_BACK) {
141                             fResult.confirm();
142                             return false;
143                         } else {
144                             return true;
145                         }
146                     }
147                 });
148         mDialog = dialogBuilder.create();
149         mDialog.show();
150         return false;
151     }
152
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)
158                 .setMessage(message)
159                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
160                     @Override
161                     public void onClick(DialogInterface dialog, int which) {
162                         fResult.confirmWithResult(mPromptText.getText().toString());
163                         dialog.dismiss();
164                     }
165                 })
166                 .setNegativeButton(mCancelButton, null)
167                 .setOnCancelListener(new DialogInterface.OnCancelListener() {
168                     @Override
169                     public void onCancel(DialogInterface dialog) {
170                         fResult.cancel();
171                     }
172                 });
173         mPromptText = new EditText(mContext);
174         mPromptText.setVisibility(View.VISIBLE);
175         mPromptText.setText(defaultValue);
176         mPromptText.selectAll();
177
178         dialogBuilder.setView(mPromptText);
179         mDialog = dialogBuilder.create();
180         mDialog.show();
181         return false;
182     }
183
184     @Override
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);
197             } else {
198                 if ((activity.getWindow().getAttributes().flags &
199                         WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) {
200                     mOriginalFullscreen = true;
201                 } else {
202                     mOriginalFullscreen = false;
203                 }
204                 if (!mOriginalFullscreen) {
205                     activity.getWindow().setFlags(
206                             WindowManager.LayoutParams.FLAG_FULLSCREEN,
207                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
208                 }
209             }
210         } else {
211             if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
212                 mDecorView.setSystemUiVisibility(mSystemUiFlag);
213             } else {
214                 // Clear the activity fullscreen flag.
215                 if (!mOriginalFullscreen) {
216                     activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
217                 }
218             }
219         }
220     }
221 }