13c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski/* 23c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Copyright (C) 2010 The Android Open Source Project 33c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * 43c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License"); 53c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * you may not use this file except in compliance with the License. 63c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * You may obtain a copy of the License at 73c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * 83c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * http://www.apache.org/licenses/LICENSE-2.0 93c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * 103c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Unless required by applicable law or agreed to in writing, software 113c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS, 123c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * See the License for the specific language governing permissions and 143c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * limitations under the License. 153c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski */ 163c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 173c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskipackage com.android.dumprendertree2; 183c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 192aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport com.android.dumprendertree2.scriptsupport.OnEverythingFinishedCallback; 202aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu 213c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.app.Activity; 223c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.app.ProgressDialog; 233c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.content.Intent; 241b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowskiimport android.content.res.Configuration; 253c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.os.Bundle; 263c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.os.Handler; 273c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.os.Message; 281b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowskiimport android.view.Gravity; 293c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.view.Window; 301b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowskiimport android.webkit.WebView; 311b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowskiimport android.widget.Toast; 323c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 332aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport java.io.File; 345f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowskiimport java.util.ArrayList; 355f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski 363c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski/** 375f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * An Activity that generates a list of tests and sends the intent to 385f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * LayoutTestsExecuter to run them. It also restarts the LayoutTestsExecuter 3923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * after it crashes. 403c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski */ 415f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowskipublic class TestsListActivity extends Activity { 423c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 435f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski private static final int MSG_TEST_LIST_PRELOADER_DONE = 0; 443c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 453c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski /** Constants for adding extras to an intent */ 463c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski public static final String EXTRA_TEST_PATH = "TestPath"; 473c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 483c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski private static ProgressDialog sProgressDialog; 493c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 503c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski private Handler mHandler = new Handler() { 513c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski @Override 523c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski public void handleMessage(Message msg) { 533c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski switch (msg.what) { 545f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski case MSG_TEST_LIST_PRELOADER_DONE: 553c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski sProgressDialog.dismiss(); 565f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski mTestsList = (ArrayList<String>)msg.obj; 575f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski mTotalTestCount = mTestsList.size(); 585f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski restartExecutor(0); 593c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski break; 603c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski } 613c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski } 623c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski }; 633c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 645f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski private ArrayList<String> mTestsList; 655f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski private int mTotalTestCount; 665f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski 675fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski private OnEverythingFinishedCallback mOnEverythingFinishedCallback; 685fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski private boolean mEverythingFinished; 695fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 703c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski @Override 713c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski protected void onCreate(Bundle savedInstanceState) { 723c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski super.onCreate(savedInstanceState); 733c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 743c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski /** Prepare the progress dialog */ 755f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski sProgressDialog = new ProgressDialog(TestsListActivity.this); 763c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski sProgressDialog.setCancelable(false); 773c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski sProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 783c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski sProgressDialog.setTitle(R.string.dialog_progress_title); 793c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski sProgressDialog.setMessage(getText(R.string.dialog_progress_msg)); 803c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 813c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski requestWindowFeature(Window.FEATURE_PROGRESS); 823c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 833c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski Intent intent = getIntent(); 843c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski if (!intent.getAction().equals(Intent.ACTION_RUN)) { 853c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski return; 863c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski } 873c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski String path = intent.getStringExtra(EXTRA_TEST_PATH); 883c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski 895f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski sProgressDialog.show(); 905f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski Message doneMsg = Message.obtain(mHandler, MSG_TEST_LIST_PRELOADER_DONE); 915f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski 9223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski Intent serviceIntent = new Intent(this, ManagerService.class); 932e64bb7afdd97c954491877306ccb8318f8ec3ceMaksymilian Osowski serviceIntent.putExtra("path", path); 9423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski startService(serviceIntent); 9523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 965f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski new TestsListPreloaderThread(path, doneMsg).start(); 974ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski } 984ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski 99c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski @Override 100c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski protected void onNewIntent(Intent intent) { 101c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski if (intent.getAction().equals(Intent.ACTION_REBOOT)) { 102c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski onCrashIntent(intent); 103c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski } else if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { 104c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski onEverythingFinishedIntent(intent); 105c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski } 106c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski } 107c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski 1085f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski /** 10923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * This method handles an intent that comes from ManageService when crash is detected. 11023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * The intent contains an index in mTestsList of the test that crashed. TestsListActivity 11123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * restarts the LayoutTestsExecutor from the following test in mTestsList, by sending 11223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * an intent to it. This new intent contains a list of remaining tests to run, 11323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * total count of all tests, and the index of the first test to run after restarting. 11423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * LayoutTestExecutor runs then as usual, sending reports to ManagerService. If it 11523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski * detects the crash it sends a new intent and the flow repeats. 11623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski */ 117c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski private void onCrashIntent(Intent intent) { 11823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski int nextTestToRun = intent.getIntExtra("crashedTestIndex", -1) + 1; 11923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski if (nextTestToRun > 0 && nextTestToRun <= mTotalTestCount) { 12023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski restartExecutor(nextTestToRun); 12123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } 12223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } 12323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 1245fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski public void registerOnEverythingFinishedCallback(OnEverythingFinishedCallback callback) { 1255fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski mOnEverythingFinishedCallback = callback; 1265fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski if (mEverythingFinished) { 1275fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski mOnEverythingFinishedCallback.onFinished(); 1285fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski } 1295fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski } 1305fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 131c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski private void onEverythingFinishedIntent(Intent intent) { 1321b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski Toast toast = Toast.makeText(this, 1331b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski "All tests finished.\nPress back key to return to the tests' list.", 1341b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski Toast.LENGTH_LONG); 1351b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski toast.setGravity(Gravity.CENTER, -40, 0); 1361b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski toast.show(); 1371b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski 1381b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski /** Show the details to the user */ 1391b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski WebView webView = new WebView(this); 1401b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski webView.getSettings().setJavaScriptEnabled(true); 1411b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski webView.getSettings().setBuiltInZoomControls(true); 1421b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski webView.getSettings().setEnableSmoothTransition(true); 1431b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski /** This enables double-tap to zoom */ 1441b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski webView.getSettings().setUseWideViewPort(true); 1451b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski 1461b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski setContentView(webView); 1471b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski webView.loadUrl(Summarizer.getDetailsUri().toString()); 1481b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski 1495fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski mEverythingFinished = true; 1505fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski if (mOnEverythingFinishedCallback != null) { 1515fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski mOnEverythingFinishedCallback.onFinished(); 1525fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski } 153c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski } 154c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski 1551b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski /** 1561b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski * This, together with android:configChanges="orientation" in manifest file, prevents 1571b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski * the activity from restarting on orientation change. 1581b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski */ 1591b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski @Override 1601b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski public void onConfigurationChanged(Configuration newConfig) { 1611b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski super.onConfigurationChanged(newConfig); 1621b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski } 1631b034781f4c45608e4d57e46cd46dfab9fc64746Maksymilian Osowski 16423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski @Override 16523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski protected void onSaveInstanceState(Bundle outState) { 16623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski outState.putStringArrayList("testsList", mTestsList); 16723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski outState.putInt("totalCount", mTotalTestCount); 16823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 16923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski super.onSaveInstanceState(outState); 17023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } 17123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 17223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski @Override 17323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski protected void onRestoreInstanceState(Bundle savedInstanceState) { 17423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski super.onRestoreInstanceState(savedInstanceState); 17523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 17623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski mTestsList = savedInstanceState.getStringArrayList("testsList"); 17723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski mTotalTestCount = savedInstanceState.getInt("totalCount"); 17823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } 17923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 18023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski /** 1815f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * (Re)starts the executer activity from the given test number (inclusive, 0-based). 1825f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * This number is an index in mTestsList, not the sublist passed in the intent. 1835f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * 1845f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * @param startFrom 1855f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski * test index in mTestsList to start the tests from (inclusive, 0-based) 1865f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski */ 1875f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski private void restartExecutor(int startFrom) { 1885f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski Intent intent = new Intent(); 1895f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski intent.setClass(this, LayoutTestsExecutor.class); 1905f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski intent.setAction(Intent.ACTION_RUN); 19123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 19223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski if (startFrom < mTotalTestCount) { 1932aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu File testListFile = new File(getExternalFilesDir(null), "test_list.txt"); 1942aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu FsUtils.saveTestListToStorage(testListFile, startFrom, mTestsList); 1952aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, testListFile.getAbsolutePath()); 19623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski intent.putExtra(LayoutTestsExecutor.EXTRA_TEST_INDEX, startFrom); 19723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } else { 1982aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, ""); 19923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski } 20023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski 2015f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski startActivity(intent); 2023c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski } 2033c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski}