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