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.
5 package org.xwalk.core.xwview.shell;
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;
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;
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;
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;
49 private Runnable mClearProgressRunnable = new Runnable() {
52 mProgressDrawable.setLevel(0);
56 TracingControllerAndroid getTracingController() {
57 if (mTracingController == null) {
58 mTracingController = new TracingControllerAndroid(this);
60 return mTracingController;
63 private void registerTracingReceiverWhenIdle() {
64 // Delay tracing receiver registration until the main loop is idle.
65 Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
67 public boolean queueIdle() {
68 // Will retry if the native library is not initialized yet.
69 if (!LibraryLoader.isInitialized()) return true;
71 getTracingController().registerReceiver(XWalkViewShellActivity.this);
72 } catch (SecurityException e) {
73 Log.w(TAG, "failed to register tracing receiver: " + e.getMessage());
80 private void unregisterTracingReceiver() {
82 getTracingController().unregisterReceiver(this);
83 } catch (SecurityException e) {
84 Log.w(TAG, "failed to unregister tracing receiver: " + e.getMessage());
89 public void onCreate(Bundle savedInstanceState) {
90 super.onCreate(savedInstanceState);
92 registerTracingReceiverWhenIdle();
94 if (!CommandLine.isInitialized()) {
95 CommandLine.initFromFile(COMMAND_LINE_FILE);
96 String[] commandLineParams = getCommandLineParamsFromIntent(getIntent());
97 if (commandLineParams != null) {
98 CommandLine.getInstance().appendSwitchesAndArguments(commandLineParams);
102 waitForDebuggerIfNeeded();
104 setContentView(R.layout.testshell_activity);
106 mView = (XWalkView) findViewById(R.id.content_container);
107 mToolbar = (LinearLayout) findViewById(R.id.toolbar);
108 mProgressDrawable = (ClipDrawable) findViewById(R.id.toolbar).getBackground();
110 initializeUrlField();
112 initializeXWalkViewClients();
114 mView.enableRemoteDebugging();
118 public void onPause() {
124 public void onResume() {
130 public void onDestroy() {
132 unregisterTracingReceiver();
137 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
138 mView.onActivityResult(requestCode, resultCode, data);
142 public boolean onKeyUp(int keyCode, KeyEvent event) {
143 return mView.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event);
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.");
154 private static String[] getCommandLineParamsFromIntent(Intent intent) {
155 return intent != null ? intent.getStringArrayExtra(COMMAND_LINE_ARGS_KEY) : null;
158 private static String sanitizeUrl(String url) {
159 if (url == null) return url;
160 if (url.startsWith("www.") || url.indexOf(":") == -1) url = "http://" + url;
164 private void initializeUrlField() {
165 mUrlTextView = (EditText) findViewById(R.id.url);
166 mUrlTextView.setOnEditorActionListener(new OnEditorActionListener() {
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)) {
175 mView.loadUrl(sanitizeUrl(mUrlTextView.getText().toString()));
176 mUrlTextView.clearFocus();
177 setKeyboardVisibilityForUrl(false);
181 mUrlTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
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);
190 mUrlTextView.setText(mView.getUrl());
197 private void initializeButtons() {
198 mPrevButton = (ImageButton) findViewById(R.id.prev);
199 mPrevButton.setOnClickListener(new OnClickListener() {
201 public void onClick(View v) {
202 if (mView.canGoBack()) mView.goBack();
206 mNextButton = (ImageButton) findViewById(R.id.next);
207 mNextButton.setOnClickListener(new OnClickListener() {
209 public void onClick(View v) {
210 if (mView.canGoForward()) mView.goForward();
214 mStopButton = (ImageButton) findViewById(R.id.stop);
215 mStopButton.setOnClickListener(new OnClickListener() {
217 public void onClick(View v) {
222 mReloadButton = (ImageButton) findViewById(R.id.reload);
223 mReloadButton.setOnClickListener(new OnClickListener() {
225 public void onClick(View v) {
231 private void initializeXWalkViewClients() {
232 mView.setXWalkWebChromeClient(new XWalkDefaultWebChromeClient(this, mView) {
233 public void onProgressChanged(XWalkView view, int newProgress) {
234 mToolbar.removeCallbacks(mClearProgressRunnable);
236 mProgressDrawable.setLevel((int) (100.0 * newProgress));
237 if (newProgress == 100)
238 mToolbar.postDelayed(mClearProgressRunnable, COMPLETED_PROGRESS_TIMEOUT_MS);
239 mUrlTextView.setText(mView.getUrl());
243 private void setKeyboardVisibilityForUrl(boolean visible) {
244 InputMethodManager imm = (InputMethodManager) getSystemService(
245 Context.INPUT_METHOD_SERVICE);
247 imm.showSoftInput(mUrlTextView, InputMethodManager.SHOW_IMPLICIT);
249 imm.hideSoftInputFromWindow(mUrlTextView.getWindowToken(), 0);