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