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