Upstream version 5.34.97.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core / src / org / xwalk / core / client / XWalkDefaultWebChromeClient.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.client;
6
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;
26
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;
33
34 public class XWalkDefaultWebChromeClient extends XWalkWebChromeClient {
35
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;
42
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;
53
54     public XWalkDefaultWebChromeClient(Context context, XWalkView view) {
55         mContext = context;
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;
61         }
62         mView = view;
63         initResources(context);
64     }
65
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);
73     }
74
75     @Override
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)
80                 .setMessage(message)
81                 .setCancelable(false)
82                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
83                     @Override
84                     public void onClick(DialogInterface dialog, int which) {
85                         result.confirm();
86                         dialog.dismiss();
87                     }
88                 });
89         mDialog = dialogBuilder.create();
90         mDialog.show();
91         return false;
92     }
93
94     @Override
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)
99                 .setMessage(message)
100                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
101                     @Override
102                     public void onClick(DialogInterface dialog, int which) {
103                         result.confirm();
104                         dialog.dismiss();
105                     }
106                 })
107                 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
108                     @Override
109                     public void onClick(DialogInterface dialog, int which) {
110                         result.cancel();
111                         dialog.dismiss();
112                     }
113                 });
114         mDialog = dialogBuilder.create();
115         mDialog.show();
116         return false;
117     }
118
119     @Override
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)
124                 .setMessage(message)
125                 .setPositiveButton(mOKButton, new DialogInterface.OnClickListener() {
126                     @Override
127                     public void onClick(DialogInterface dialog, int which) {
128                         result.confirm(mPromptText.getText().toString());
129                         dialog.dismiss();
130                     }
131                 })
132                 .setNegativeButton(mCancelButton, new DialogInterface.OnClickListener() {
133                     @Override
134                     public void onClick(DialogInterface dialog, int which) {
135                         result.cancel();
136                         dialog.dismiss();
137                     }
138                 });
139         mPromptText = new EditText(mContext);
140         mPromptText.setVisibility(View.VISIBLE);
141         mPromptText.setText(defaultValue);
142         mPromptText.selectAll();
143
144         dialogBuilder.setView(mPromptText);
145         mDialog = dialogBuilder.create();
146         mDialog.show();
147         return false;
148     }
149
150     @Override
151     public void onShowCustomView(View view, CustomViewCallback callback) {
152         Activity activity = mView.getActivity();
153
154         if (mCustomView != null || activity == null) {
155             callback.onCustomViewHidden();
156             return;
157         }
158
159         mCustomView = view;
160         mCustomViewCallback = callback;
161
162         onToggleFullscreen(true);
163
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,
169                         Gravity.CENTER));
170     }
171
172     @Override
173     public void onHideCustomView() {
174         Activity activity = mView.getActivity();
175
176         if (mCustomView == null || activity == null) return;
177
178         onToggleFullscreen(false);
179
180         // Remove video view from activity's ContentView.
181         FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView();
182         decor.removeView(mCustomView);
183         mCustomViewCallback.onCustomViewHidden();
184
185         mCustomView = null;
186         mCustomViewCallback = null;
187     }
188
189     @Override
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);
195     }
196
197     @Override
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);
210             } else {
211                 if ((activity.getWindow().getAttributes().flags &
212                         WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) {
213                     mOriginalFullscreen = true;
214                 } else {
215                     mOriginalFullscreen = false;
216                 }
217                 if (!mOriginalFullscreen) {
218                     activity.getWindow().setFlags(
219                             WindowManager.LayoutParams.FLAG_FULLSCREEN,
220                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
221                 }
222             }
223         } else {
224             if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
225                 mDecorView.setSystemUiVisibility(mSystemUiFlag);
226             } else {
227                 // Clear the activity fullscreen flag.
228                 if (!mOriginalFullscreen) {
229                     activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
230                 }
231             }
232         }
233         mIsFullscreen = enterFullscreen;
234     }
235
236     @Override
237     public boolean isFullscreen() {
238         return mIsFullscreen;
239     }
240 }