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
19f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.ActivityNotFoundException;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
21f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.DialogInterface;
22f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.content.Intent;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
268a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
275fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.view.WindowManager;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class AppNotRespondingDialog extends BaseErrorDialog {
30f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    private static final String TAG = "AppNotRespondingDialog";
31f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
32f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    // Event 'what' codes
33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int FORCE_CLOSE = 1;
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int WAIT = 2;
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    static final int WAIT_AND_REPORT = 3;
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ActivityManagerService mService;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ProcessRecord mProc;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AppNotRespondingDialog(ActivityManagerService service, Context context,
415fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            ProcessRecord app, ActivityRecord activity, boolean aboveSystem) {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProc = app;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res = context.getResources();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCancelable(false);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resid;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence name1 = activity != null
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? activity.info.loadLabel(context.getPackageManager())
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : null;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence name2 = null;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((app.pkgList.size() == 1) &&
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (name2=context.getPackageManager().getApplicationLabel(app.info)) != null) {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name1 != null) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_activity_application;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name1 = name2;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name2 = app.processName;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_application_process;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name1 != null) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name2 = app.processName;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_activity_process;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name1 = app.processName;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.string.anr_process;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMessage(name2 != null
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? res.getString(resid, name1.toString(), name2.toString())
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : res.getString(resid, name1.toString()));
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7840a9784d48211048fa3731a3ffdccda475750090Adam Powell        setButton(DialogInterface.BUTTON_POSITIVE,
79f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                res.getText(com.android.internal.R.string.force_close),
80f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                mHandler.obtainMessage(FORCE_CLOSE));
8140a9784d48211048fa3731a3ffdccda475750090Adam Powell        setButton(DialogInterface.BUTTON_NEGATIVE,
82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                res.getText(com.android.internal.R.string.wait),
83f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                mHandler.obtainMessage(WAIT));
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        if (app.errorReportReceiver != null) {
8640a9784d48211048fa3731a3ffdccda475750090Adam Powell            setButton(DialogInterface.BUTTON_NEUTRAL,
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    res.getText(com.android.internal.R.string.report),
88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    mHandler.obtainMessage(WAIT_AND_REPORT));
89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(res.getText(com.android.internal.R.string.anr_title));
925fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        if (aboveSystem) {
935fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
945fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        }
955fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        WindowManager.LayoutParams attrs = getWindow().getAttributes();
965fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        attrs.setTitle("Application Not Responding: " + app.info.processName);
9795c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski        attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR |
9895c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski                WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
995fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        getWindow().setAttributes(attrs);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStop() {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Handler mHandler = new Handler() {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            Intent appErrorIntent = null;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case FORCE_CLOSE:
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Kill the application.
11142471dd5552a346dd82a58a663159875ccc4fb79Dan Egnor                    mService.killAppAtUsersRequest(mProc, AppNotRespondingDialog.this);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case WAIT_AND_REPORT:
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                case WAIT:
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Continue waiting for the application.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mService) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ProcessRecord app = mProc;
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                        if (msg.what == WAIT_AND_REPORT) {
12041a9fd55ac0f50afb3d70b1ba0786dbb316eebceJacek Surazski                            appErrorIntent = mService.createAppErrorIntentLocked(app,
12141a9fd55ac0f50afb3d70b1ba0786dbb316eebceJacek Surazski                                    System.currentTimeMillis(), null);
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                        }
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        app.notResponding = false;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        app.notRespondingReport = null;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (app.anrDialog == AppNotRespondingDialog.this) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            app.anrDialog = null;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1292be00933163bb2bfa6b43cf2e1ddde7c284c7c4cDianne Hackborn                        mService.mServices.scheduleServiceTimeoutLocked(app);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            if (appErrorIntent != null) {
135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                try {
136f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    getContext().startActivity(appErrorIntent);
137f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                } catch (ActivityNotFoundException e) {
1388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "bug report receiver dissappeared", e);
139f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                }
140f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
144