1f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine/* 2f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * Copyright (C) 2012 The Android Open Source Project 3f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * 4f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * Licensed under the Apache License, Version 2.0 (the "License"); 5f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * you may not use this file except in compliance with the License. 6f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * You may obtain a copy of the License at 7f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * 8f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * http://www.apache.org/licenses/LICENSE-2.0 9f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * 10f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * Unless required by applicable law or agreed to in writing, software 11f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * distributed under the License is distributed on an "AS IS" BASIS, 12f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * See the License for the specific language governing permissions and 14f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * limitations under the License. 15f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine */ 16f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavinepackage com.android.tests.applaunch; 17f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 18f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.app.ActivityManager; 19f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.app.ActivityManager.ProcessErrorStateInfo; 20f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.app.ActivityManagerNative; 21f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.app.IActivityManager; 2213f77349778fbe95d665542be6f05006879854e2Guang Zhuimport android.app.IActivityManager.WaitResult; 23f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.content.Context; 24f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.content.Intent; 25f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.content.pm.PackageManager; 26f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.content.pm.PackageManager.NameNotFoundException; 27f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.content.pm.ResolveInfo; 28f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.os.Bundle; 29f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.os.RemoteException; 30f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.os.UserHandle; 31f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.test.InstrumentationTestCase; 32f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.test.InstrumentationTestRunner; 33f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport android.util.Log; 34f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 35c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhuimport java.util.LinkedHashMap; 36f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport java.util.List; 37f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavineimport java.util.Map; 38f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 39f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine/** 40f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * This test is intended to measure the time it takes for the apps to start. 41f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * Names of the applications are passed in command line, and the 42f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * test starts each application, and reports the start up time in milliseconds. 43f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * The instrumentation expects the following key to be passed on the command line: 44f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * apps - A list of applications to start and their corresponding result keys 45f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * in the following format: 46f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine * -e apps <app name>^<result key>|<app name>^<result key> 47f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine */ 48f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavinepublic class AppLaunch extends InstrumentationTestCase { 49f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 50f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private static final int JOIN_TIMEOUT = 10000; 51f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private static final String TAG = "AppLaunch"; 52f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private static final String KEY_APPS = "apps"; 53f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 54f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private Map<String, Intent> mNameToIntent; 55f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private Map<String, String> mNameToProcess; 56f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private Map<String, String> mNameToResultKey; 57f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 58f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private IActivityManager mAm; 59f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 60f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine public void testMeasureStartUpTime() throws RemoteException { 61f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine InstrumentationTestRunner instrumentation = 62f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine (InstrumentationTestRunner)getInstrumentation(); 63f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Bundle args = instrumentation.getBundle(); 64f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mAm = ActivityManagerNative.getDefault(); 65f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 66f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine createMappings(); 67f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine parseArgs(args); 68f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 69f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Bundle results = new Bundle(); 70f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine for (String app : mNameToResultKey.keySet()) { 71f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine try { 72f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine startApp(app, results); 7313f77349778fbe95d665542be6f05006879854e2Guang Zhu sleep(750); 7413f77349778fbe95d665542be6f05006879854e2Guang Zhu closeApp(app); 7513f77349778fbe95d665542be6f05006879854e2Guang Zhu sleep(2000); 76f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } catch (NameNotFoundException e) { 77f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.i(TAG, "Application " + app + " not found"); 78f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 79f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 80f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 81f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine instrumentation.sendStatus(0, results); 82f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 83f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 84f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private void parseArgs(Bundle args) { 85c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu mNameToResultKey = new LinkedHashMap<String, String>(); 86f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine String appList = args.getString(KEY_APPS); 87f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 88f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (appList == null) 89f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine return; 90f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 91f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine String appNames[] = appList.split("\\|"); 92f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine for (String pair : appNames) { 93f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine String[] parts = pair.split("\\^"); 94f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (parts.length != 2) { 95f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.e(TAG, "The apps key is incorectly formatted"); 96f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine fail(); 97f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 98f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 99f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mNameToResultKey.put(parts[0], parts[1]); 100f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 101f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 102f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 103f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private void createMappings() { 104c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu mNameToIntent = new LinkedHashMap<String, Intent>(); 105c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu mNameToProcess = new LinkedHashMap<String, String>(); 106f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 107f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine PackageManager pm = getInstrumentation().getContext() 108f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine .getPackageManager(); 109f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Intent intentToResolve = new Intent(Intent.ACTION_MAIN); 110f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); 111f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine List<ResolveInfo> ris = pm.queryIntentActivities(intentToResolve, 0); 112f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (ris == null || ris.isEmpty()) { 113f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.i(TAG, "Could not find any apps"); 114f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } else { 115f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine for (ResolveInfo ri : ris) { 116f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Intent startIntent = new Intent(intentToResolve); 117f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 118f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 119f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine startIntent.setClassName(ri.activityInfo.packageName, 120f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine ri.activityInfo.name); 121f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mNameToIntent.put(ri.loadLabel(pm).toString(), startIntent); 122f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mNameToProcess.put(ri.loadLabel(pm).toString(), 123f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine ri.activityInfo.processName); 124f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 125f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 126f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 127f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 128f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private void startApp(String appName, Bundle results) 129f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine throws NameNotFoundException, RemoteException { 130f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.i(TAG, "Starting " + appName); 131f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 132f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Intent startIntent = mNameToIntent.get(appName); 133c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu if (startIntent == null) { 134c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu Log.w(TAG, "App does not exist: " + appName); 135c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu return; 136c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu } 137f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent); 138f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Thread t = new Thread(runnable); 139f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine t.start(); 140f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine try { 141f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine t.join(JOIN_TIMEOUT); 142f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } catch (InterruptedException e) { 143f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine // ignore 144f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 145c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu WaitResult result = runnable.getResult(); 146c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu if(t.isAlive() || (result != null && result.result != ActivityManager.START_SUCCESS)) { 147f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.w(TAG, "Assuming app " + appName + " crashed."); 148f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine reportError(appName, mNameToProcess.get(appName), results); 149f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine return; 150f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 151c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu results.putString(mNameToResultKey.get(appName), String.valueOf(result.thisTime)); 152f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 153f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 15413f77349778fbe95d665542be6f05006879854e2Guang Zhu private void closeApp(String appName) { 155f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Intent homeIntent = new Intent(Intent.ACTION_MAIN); 156f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine homeIntent.addCategory(Intent.CATEGORY_HOME); 157f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 158f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 159f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine getInstrumentation().getContext().startActivity(homeIntent); 16013f77349778fbe95d665542be6f05006879854e2Guang Zhu Intent startIntent = mNameToIntent.get(appName); 16113f77349778fbe95d665542be6f05006879854e2Guang Zhu if (startIntent != null) { 16213f77349778fbe95d665542be6f05006879854e2Guang Zhu String packageName = startIntent.getComponent().getPackageName(); 16313f77349778fbe95d665542be6f05006879854e2Guang Zhu try { 16413f77349778fbe95d665542be6f05006879854e2Guang Zhu mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT); 16513f77349778fbe95d665542be6f05006879854e2Guang Zhu } catch (RemoteException e) { 16613f77349778fbe95d665542be6f05006879854e2Guang Zhu Log.w(TAG, "Error closing app", e); 16713f77349778fbe95d665542be6f05006879854e2Guang Zhu } 16813f77349778fbe95d665542be6f05006879854e2Guang Zhu } 169f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 170f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 171f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private void sleep(int time) { 172f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine try { 173f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Thread.sleep(time); 174f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } catch (InterruptedException e) { 175f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine // ignore 176f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 177f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 178f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 179f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private void reportError(String appName, String processName, Bundle results) { 180f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine ActivityManager am = (ActivityManager) getInstrumentation() 181f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine .getContext().getSystemService(Context.ACTIVITY_SERVICE); 182f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine List<ProcessErrorStateInfo> crashes = am.getProcessesInErrorState(); 183f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (crashes != null) { 184f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine for (ProcessErrorStateInfo crash : crashes) { 185f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (!crash.processName.equals(processName)) 186f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine continue; 187f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 188f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.w(TAG, appName + " crashed: " + crash.shortMsg); 189f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine results.putString(mNameToResultKey.get(appName), crash.shortMsg); 190f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine return; 191f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 192f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 193f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 194f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine results.putString(mNameToResultKey.get(appName), 195f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine "Crashed for unknown reason"); 196f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.w(TAG, appName 197f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine + " not found in process list, most likely it is crashed"); 198f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 199f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 200f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private class AppLaunchRunnable implements Runnable { 201f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private Intent mLaunchIntent; 202f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine private IActivityManager.WaitResult mResult; 203f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine public AppLaunchRunnable(Intent intent) { 204f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mLaunchIntent = intent; 205f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 206f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 207f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine public IActivityManager.WaitResult getResult() { 208f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine return mResult; 209f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 210f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 211f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine public void run() { 212f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine try { 213c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu String packageName = mLaunchIntent.getComponent().getPackageName(); 214c28a062ffd7edbdbd936c750fa3ec3f81b0d1b44Guang Zhu mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT); 215f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine String mimeType = mLaunchIntent.getType(); 216f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine if (mimeType == null && mLaunchIntent.getData() != null 217f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine && "content".equals(mLaunchIntent.getData().getScheme())) { 218f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mimeType = mAm.getProviderMimeType(mLaunchIntent.getData(), 219f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine UserHandle.USER_CURRENT); 220f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 221f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine 222f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine mResult = mAm.startActivityAndWait(null, mLaunchIntent, mimeType, 223f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine null, null, 0, mLaunchIntent.getFlags(), null, null, null, 224f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine UserHandle.USER_CURRENT); 225f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } catch (RemoteException e) { 226f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine Log.w(TAG, "Error launching app", e); 227f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 228f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 229f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine } 230f58e5b6cdcecee6184784b3a6ac33f60341de170Maxim Siniavine} 231