- update src.
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core_shell / src / org / xwalk / core / xwview / shell / XWalkViewShellActivity.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.xwview.shell;
6
7 import android.app.Activity;
8 import android.content.BroadcastReceiver;
9 import android.content.Intent;
10 import android.content.Context;
11 import android.content.IntentFilter;
12 import android.graphics.drawable.ClipDrawable;
13 import android.os.Bundle;
14 import android.os.Looper;
15 import android.os.MessageQueue;
16 import android.util.Log;
17 import android.view.KeyEvent;
18 import android.view.View;
19 import android.view.View.OnClickListener;
20 import android.view.View.OnFocusChangeListener;
21 import android.view.inputmethod.EditorInfo;
22 import android.view.inputmethod.InputMethodManager;
23 import android.widget.EditText;
24 import android.widget.ImageButton;
25 import android.widget.LinearLayout;
26 import android.widget.TextView;
27 import android.widget.TextView.OnEditorActionListener;
28
29 import org.chromium.content.app.LibraryLoader;
30 import org.chromium.content.browser.TracingControllerAndroid;
31 import org.chromium.content.common.CommandLine;
32 import org.xwalk.core.client.XWalkDefaultWebChromeClient;
33 import org.xwalk.core.XWalkView;
34
35 public class XWalkViewShellActivity extends Activity {
36     public static final String COMMAND_LINE_FILE = "/data/local/tmp/xwview-shell-command-line";
37     private static final String TAG = XWalkViewShellActivity.class.getName();
38     public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
39     private static final long COMPLETED_PROGRESS_TIMEOUT_MS = 200;
40     private static final String ACTION_LAUNCH_URL = "org.xwalk.core.xwview.shell.launch";
41
42     private LinearLayout mToolbar;
43     private EditText mUrlTextView;
44     private ImageButton mPrevButton;
45     private ImageButton mNextButton;
46     private ImageButton mStopButton;
47     private ImageButton mReloadButton;
48     private ClipDrawable mProgressDrawable;
49     private XWalkView mView;
50     private TracingControllerAndroid mTracingController;
51     private BroadcastReceiver mReceiver;
52
53     private Runnable mClearProgressRunnable = new Runnable() {
54         @Override
55         public void run() {
56             mProgressDrawable.setLevel(0);
57         }
58     };
59
60     TracingControllerAndroid getTracingController() {
61         if (mTracingController == null) {
62             mTracingController = new TracingControllerAndroid(this);
63         }
64         return mTracingController;
65     }
66
67     private void registerTracingReceiverWhenIdle() {
68         // Delay tracing receiver registration until the main loop is idle.
69         Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
70             @Override
71             public boolean queueIdle() {
72                 // Will retry if the native library is not initialized yet.
73                 if (!LibraryLoader.isInitialized()) return true;
74                 try {
75                     getTracingController().registerReceiver(XWalkViewShellActivity.this);
76                 } catch (SecurityException e) {
77                     Log.w(TAG, "failed to register tracing receiver: " + e.getMessage());
78                 }
79                 return false;
80             }
81         });
82     }
83
84     private void unregisterTracingReceiver() {
85         try {
86             getTracingController().unregisterReceiver(this);
87         } catch (SecurityException e) {
88             Log.w(TAG, "failed to unregister tracing receiver: " + e.getMessage());
89         }
90     }
91
92     @Override
93     public void onCreate(Bundle savedInstanceState) {
94         super.onCreate(savedInstanceState);
95
96         registerTracingReceiverWhenIdle();
97
98         if (!CommandLine.isInitialized()) {
99             CommandLine.initFromFile(COMMAND_LINE_FILE);
100             String[] commandLineParams = getCommandLineParamsFromIntent(getIntent());
101             if (commandLineParams != null) {
102                 CommandLine.getInstance().appendSwitchesAndArguments(commandLineParams);
103             }
104         }
105
106         waitForDebuggerIfNeeded();
107
108         setContentView(R.layout.testshell_activity);
109
110         mView = (XWalkView) findViewById(R.id.content_container);
111         mToolbar = (LinearLayout) findViewById(R.id.toolbar);
112         mProgressDrawable = (ClipDrawable) findViewById(R.id.toolbar).getBackground();
113
114         initializeUrlField();
115         initializeButtons();
116         initializeXWalkViewClients();
117
118         IntentFilter intentFilter = new IntentFilter(ACTION_LAUNCH_URL);
119         mReceiver = new BroadcastReceiver() {
120             @Override
121             public void onReceive(Context context, Intent intent) {
122                 Bundle bundle = intent.getExtras();
123                 if (bundle == null)
124                     return;
125
126                 if (bundle.containsKey("url")) {
127                     String extra = bundle.getString("url");
128                     mView.loadUrl(sanitizeUrl(extra));
129                 }
130             }
131         };
132         registerReceiver(mReceiver, intentFilter);
133         mView.enableRemoteDebugging();
134     }
135
136     @Override
137     public void onPause() {
138         super.onPause();
139         mView.onPause();
140     }
141
142     @Override
143     public void onResume() {
144         super.onResume();
145         mView.onResume();
146     }
147
148     @Override
149     public void onDestroy() {
150         super.onDestroy();
151         unregisterReceiver(mReceiver);
152         unregisterTracingReceiver();
153         mView.onDestroy();
154     }
155
156     @Override
157     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
158         mView.onActivityResult(requestCode, resultCode, data);
159     }
160
161     @Override
162     public boolean onKeyUp(int keyCode, KeyEvent event) {
163         return mView.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
164     }
165
166     private void waitForDebuggerIfNeeded() {
167         if (CommandLine.getInstance().hasSwitch(CommandLine.WAIT_FOR_JAVA_DEBUGGER)) {
168             Log.e(TAG, "Waiting for Java debugger to connect...");
169             android.os.Debug.waitForDebugger();
170             Log.e(TAG, "Java debugger connected. Resuming execution.");
171         }
172     }
173
174     private static String[] getCommandLineParamsFromIntent(Intent intent) {
175         return intent != null ? intent.getStringArrayExtra(COMMAND_LINE_ARGS_KEY) : null;
176     }
177
178     private static String sanitizeUrl(String url) {
179         if (url == null) return url;
180         if (url.startsWith("www.") || url.indexOf(":") == -1) url = "http://" + url;
181         return url;
182     }
183
184     private void initializeUrlField() {
185         mUrlTextView = (EditText) findViewById(R.id.url);
186         mUrlTextView.setOnEditorActionListener(new OnEditorActionListener() {
187             @Override
188             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
189                 if ((actionId != EditorInfo.IME_ACTION_GO) && (event == null ||
190                         event.getKeyCode() != KeyEvent.KEYCODE_ENTER ||
191                         event.getAction() != KeyEvent.ACTION_DOWN)) {
192                     return false;
193                 }
194
195                 mView.loadUrl(sanitizeUrl(mUrlTextView.getText().toString()));
196                 mUrlTextView.clearFocus();
197                 setKeyboardVisibilityForUrl(false);
198                 return true;
199             }
200         });
201         mUrlTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
202             @Override
203             public void onFocusChange(View v, boolean hasFocus) {
204                 setKeyboardVisibilityForUrl(hasFocus);
205                 mNextButton.setVisibility(hasFocus ? View.GONE : View.VISIBLE);
206                 mPrevButton.setVisibility(hasFocus ? View.GONE : View.VISIBLE);
207                 mStopButton.setVisibility(hasFocus ? View.GONE : View.VISIBLE);
208                 mReloadButton.setVisibility(hasFocus ? View.GONE : View.VISIBLE);
209                 if (!hasFocus) {
210                     mUrlTextView.setText(mView.getUrl());
211                 }
212             }
213         });
214
215     }
216
217     private void initializeButtons() {
218         mPrevButton = (ImageButton) findViewById(R.id.prev);
219         mPrevButton.setOnClickListener(new OnClickListener() {
220             @Override
221             public void onClick(View v) {
222                 if (mView.canGoBack()) mView.goBack();
223             }
224         });
225
226         mNextButton = (ImageButton) findViewById(R.id.next);
227         mNextButton.setOnClickListener(new OnClickListener() {
228             @Override
229             public void onClick(View v) {
230                 if (mView.canGoForward()) mView.goForward();
231             }
232         });
233
234         mStopButton = (ImageButton) findViewById(R.id.stop);
235         mStopButton.setOnClickListener(new OnClickListener() {
236             @Override
237             public void onClick(View v) {
238                 mView.stopLoading();
239             }
240         });
241
242         mReloadButton = (ImageButton) findViewById(R.id.reload);
243         mReloadButton.setOnClickListener(new OnClickListener() {
244             @Override
245             public void onClick(View v) {
246                 mView.reload();
247             }
248         });
249     }
250
251     private void initializeXWalkViewClients() {
252         mView.setXWalkWebChromeClient(new XWalkDefaultWebChromeClient(this, mView) {
253             public void onProgressChanged(XWalkView view, int newProgress) {
254                 mToolbar.removeCallbacks(mClearProgressRunnable);
255
256                 mProgressDrawable.setLevel((int) (100.0 * newProgress));
257                 if (newProgress == 100)
258                     mToolbar.postDelayed(mClearProgressRunnable, COMPLETED_PROGRESS_TIMEOUT_MS);
259                     mUrlTextView.setText(mView.getUrl());
260             }
261         });
262     }
263     private void setKeyboardVisibilityForUrl(boolean visible) {
264         InputMethodManager imm = (InputMethodManager) getSystemService(
265                 Context.INPUT_METHOD_SERVICE);
266         if (visible) {
267             imm.showSoftInput(mUrlTextView, InputMethodManager.SHOW_IMPLICIT);
268         } else {
269             imm.hideSoftInputFromWindow(mUrlTextView.getWindowToken(), 0);
270         }
271     }
272 }