AppNotRespondingDialog.java revision 40a9784d48211048fa3731a3ffdccda475750090
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.ActivityNotFoundException;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
23f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.DialogInterface;
24f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.Intent;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
298a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AppNotRespondingDialog extends BaseErrorDialog {
32f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    private static final String TAG = "AppNotRespondingDialog";
33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    // Event 'what' codes
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int FORCE_CLOSE = 1;
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int WAIT = 2;
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int WAIT_AND_REPORT = 3;
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ActivityManagerService mService;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ProcessRecord mProc;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AppNotRespondingDialog(ActivityManagerService service, Context context,
4301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn            ProcessRecord app, ActivityRecord activity) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProc = app;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res = context.getResources();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCancelable(false);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resid;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence name1 = activity != null
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? activity.info.loadLabel(context.getPackageManager())
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : null;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence name2 = null;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((app.pkgList.size() == 1) &&
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (name2=context.getPackageManager().getApplicationLabel(app.info)) != null) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name1 != null) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_activity_application;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name1 = name2;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name2 = app.processName;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_application_process;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name1 != null) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name2 = app.processName;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_activity_process;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name1 = app.processName;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_process;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMessage(name2 != null
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? res.getString(resid, name1.toString(), name2.toString())
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : res.getString(resid, name1.toString()));
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8040a9784d48211048fa3731a3ffdccda475750090Adam Powell        setButton(DialogInterface.BUTTON_POSITIVE,
81f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                res.getText(com.android.internal.R.string.force_close),
82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                mHandler.obtainMessage(FORCE_CLOSE));
8340a9784d48211048fa3731a3ffdccda475750090Adam Powell        setButton(DialogInterface.BUTTON_NEGATIVE,
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                res.getText(com.android.internal.R.string.wait),
85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                mHandler.obtainMessage(WAIT));
86f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        if (app.errorReportReceiver != null) {
8840a9784d48211048fa3731a3ffdccda475750090Adam Powell            setButton(DialogInterface.BUTTON_NEUTRAL,
89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    res.getText(com.android.internal.R.string.report),
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    mHandler.obtainMessage(WAIT_AND_REPORT));
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(res.getText(com.android.internal.R.string.anr_title));
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().addFlags(FLAG_SYSTEM_ERROR);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getWindow().setTitle("Application Not Responding: " + app.info.processName);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStop() {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Handler mHandler = new Handler() {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            Intent appErrorIntent = null;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case FORCE_CLOSE:
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Kill the application.
10742471dd5552a346dd82a58a663159875ccc4fb79Dan Egnor                    mService.killAppAtUsersRequest(mProc, AppNotRespondingDialog.this);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case WAIT_AND_REPORT:
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case WAIT:
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Continue waiting for the application.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mService) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ProcessRecord app = mProc;
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                        if (msg.what == WAIT_AND_REPORT) {
11641a9fd55ac0f50afb3d70b1ba0786dbb316eebceJacek Surazski                            appErrorIntent = mService.createAppErrorIntentLocked(app,
11741a9fd55ac0f50afb3d70b1ba0786dbb316eebceJacek Surazski                                    System.currentTimeMillis(), null);
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                        }
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        app.notResponding = false;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        app.notRespondingReport = null;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (app.anrDialog == AppNotRespondingDialog.this) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            app.anrDialog = null;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            if (appErrorIntent != null) {
130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                try {
131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    getContext().startActivity(appErrorIntent);
132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                } catch (ActivityNotFoundException e) {
1338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "bug report receiver dissappeared", e);
134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                }
135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
139