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