- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / android / testshell / java / src / org / chromium / chrome / testshell / ChromiumTestShellActivity.java
1 // Copyright (c) 2012 The Chromium Authors. 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.chromium.chrome.testshell;
6
7 import android.app.Activity;
8 import android.content.Intent;
9 import android.os.Bundle;
10 import android.text.TextUtils;
11 import android.util.Log;
12 import android.view.KeyEvent;
13 import android.view.Menu;
14 import android.view.MenuInflater;
15 import android.view.MenuItem;
16 import android.widget.Toast;
17
18 import org.chromium.base.MemoryPressureListener;
19 import org.chromium.chrome.browser.DevToolsServer;
20 import org.chromium.chrome.testshell.sync.SyncController;
21 import org.chromium.content.browser.ActivityContentVideoViewClient;
22 import org.chromium.content.browser.BrowserStartupController;
23 import org.chromium.content.browser.ContentVideoViewClient;
24 import org.chromium.content.browser.ContentView;
25 import org.chromium.content.browser.ContentViewClient;
26 import org.chromium.content.browser.DeviceUtils;
27 import org.chromium.content.browser.TracingControllerAndroid;
28 import org.chromium.content.common.CommandLine;
29 import org.chromium.sync.signin.ChromeSigninController;
30 import org.chromium.ui.WindowAndroid;
31
32 /**
33  * The {@link android.app.Activity} component of a basic test shell to test Chrome features.
34  */
35 public class ChromiumTestShellActivity extends Activity implements MenuHandler {
36     private static final String TAG = "ChromiumTestShellActivity";
37
38     private WindowAndroid mWindow;
39     private TabManager mTabManager;
40     private DevToolsServer mDevToolsServer;
41     private SyncController mSyncController;
42
43     @Override
44     protected void onCreate(final Bundle savedInstanceState) {
45         super.onCreate(savedInstanceState);
46
47         ChromiumTestShellApplication.initCommandLine();
48         waitForDebuggerIfNeeded();
49
50         DeviceUtils.addDeviceSpecificUserAgentSwitch(this);
51
52         BrowserStartupController.StartupCallback callback =
53                 new BrowserStartupController.StartupCallback() {
54                     @Override
55                     public void onSuccess(boolean alreadyStarted) {
56                         finishInitialization(savedInstanceState);
57                     }
58
59                     @Override
60                     public void onFailure() {
61                         Toast.makeText(ChromiumTestShellActivity.this,
62                                        R.string.browser_process_initialization_failed,
63                                        Toast.LENGTH_SHORT).show();
64                         Log.e(TAG, "Chromium browser process initialization failed");
65                         finish();
66                     }
67                 };
68         BrowserStartupController.get(this).startBrowserProcessesAsync(callback);
69     }
70
71     private void finishInitialization(final Bundle savedInstanceState) {
72         setContentView(R.layout.testshell_activity);
73         mTabManager = (TabManager) findViewById(R.id.tab_manager);
74         String startupUrl = getUrlFromIntent(getIntent());
75         if (!TextUtils.isEmpty(startupUrl)) {
76             mTabManager.setStartupUrl(startupUrl);
77         }
78         TestShellToolbar mToolbar = (TestShellToolbar) findViewById(R.id.toolbar);
79         mToolbar.setMenuHandler(this);
80
81         mWindow = new WindowAndroid(this);
82         mWindow.restoreInstanceState(savedInstanceState);
83         mTabManager.setWindow(mWindow);
84
85         mDevToolsServer = new DevToolsServer("chromium_testshell");
86         mDevToolsServer.setRemoteDebuggingEnabled(true);
87         mSyncController = SyncController.get(this);
88         // In case this method is called after the first onStart(), we need to inform the
89         // SyncController that we have started.
90         mSyncController.onStart();
91     }
92
93     @Override
94     protected void onDestroy() {
95         super.onDestroy();
96
97         if (mDevToolsServer != null)
98             mDevToolsServer.destroy();
99         mDevToolsServer = null;
100     }
101
102     @Override
103     protected void onSaveInstanceState(Bundle outState) {
104         // TODO(dtrainor): Save/restore the tab state.
105         mWindow.saveInstanceState(outState);
106     }
107
108     @Override
109     public boolean onKeyUp(int keyCode, KeyEvent event) {
110         if (keyCode == KeyEvent.KEYCODE_BACK) {
111             TestShellTab tab = getActiveTab();
112             if (tab != null && tab.getContentView().canGoBack()) {
113                 tab.getContentView().goBack();
114                 return true;
115             }
116         }
117
118         return super.onKeyUp(keyCode, event);
119     }
120
121     @Override
122     protected void onNewIntent(Intent intent) {
123         if (MemoryPressureListener.handleDebugIntent(this, intent.getAction())) return;
124
125         String url = getUrlFromIntent(intent);
126         if (!TextUtils.isEmpty(url)) {
127             TestShellTab tab = getActiveTab();
128             if (tab != null) tab.loadUrlWithSanitization(url);
129         }
130     }
131
132     @Override
133     protected void onStop() {
134         super.onStop();
135
136         ContentView view = getActiveContentView();
137         if (view != null) view.onHide();
138     }
139
140     @Override
141     protected void onStart() {
142         super.onStart();
143
144         ContentView view = getActiveContentView();
145         if (view != null) view.onShow();
146
147         if (mSyncController != null) {
148             mSyncController.onStart();
149         }
150     }
151
152     @Override
153     public void onActivityResult(int requestCode, int resultCode, Intent data) {
154         mWindow.onActivityResult(requestCode, resultCode, data);
155     }
156
157     /**
158      * @return The {@link TestShellTab} that is currently visible.
159      */
160     public TestShellTab getActiveTab() {
161         return mTabManager != null ? mTabManager.getCurrentTab() : null;
162     }
163
164     /**
165      * @return The ContentView of the active tab.
166      */
167     public ContentView getActiveContentView() {
168         TestShellTab tab = getActiveTab();
169         return tab != null ? tab.getContentView() : null;
170     }
171
172     /**
173      * Creates a {@link TestShellTab} with a URL specified by {@code url}.
174      *
175      * @param url The URL the new {@link TestShellTab} should start with.
176      */
177     public void createTab(String url) {
178         mTabManager.createTab(url);
179         getActiveContentView().setContentViewClient(new ContentViewClient() {
180             @Override
181             public ContentVideoViewClient getContentVideoViewClient() {
182                 return new ActivityContentVideoViewClient(ChromiumTestShellActivity.this);
183             }
184         });
185     }
186
187     /**
188      * From {@link MenuHandler}.
189      */
190     @Override
191     public void showPopupMenu() {
192         openOptionsMenu();
193     }
194
195     @Override
196     public boolean onCreateOptionsMenu(Menu menu) {
197         MenuInflater inflater = getMenuInflater();
198         inflater.inflate(R.menu.main_menu, menu);
199         return true;
200     }
201
202     @Override
203     public boolean onOptionsItemSelected(MenuItem item) {
204         switch (item.getItemId()) {
205             case R.id.signin:
206                 if (ChromeSigninController.get(this).isSignedIn())
207                     SyncController.openSignOutDialog(getFragmentManager());
208                 else
209                     SyncController.openSigninDialog(getFragmentManager());
210                 return true;
211             default:
212                 return super.onOptionsItemSelected(item);
213         }
214     }
215
216     @Override
217     public boolean onPrepareOptionsMenu(Menu menu) {
218         menu.setGroupVisible(R.id.MAIN_MENU, true);
219         MenuItem signinItem = menu.findItem(R.id.signin);
220         if (ChromeSigninController.get(this).isSignedIn())
221             signinItem.setTitle(ChromeSigninController.get(this).getSignedInAccountName());
222         else
223             signinItem.setTitle(R.string.signin_sign_in);
224         return true;
225     }
226
227     private void waitForDebuggerIfNeeded() {
228         if (CommandLine.getInstance().hasSwitch(CommandLine.WAIT_FOR_JAVA_DEBUGGER)) {
229             Log.e(TAG, "Waiting for Java debugger to connect...");
230             android.os.Debug.waitForDebugger();
231             Log.e(TAG, "Java debugger connected. Resuming execution.");
232         }
233     }
234
235     private static String getUrlFromIntent(Intent intent) {
236         return intent != null ? intent.getDataString() : null;
237     }
238 }