AppErrorDialog.java revision 890f1f372e9bdaeefc1707acbbd97de95709db39
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 1920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport android.app.ActivityManagerInternal; 2020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport android.app.ActivityOptions; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 2220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport android.content.pm.IPackageDataObserver; 2320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport android.content.pm.PackageManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 25a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.os.Bundle; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 28890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roosimport android.text.BidiFormatter; 2920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport android.util.Slog; 30a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.view.LayoutInflater; 31a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.view.View; 3238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackbornimport android.view.WindowManager; 33a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.widget.FrameLayout; 34a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.widget.TextView; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport java.util.List; 3720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 3820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport static com.android.server.am.ActivityManagerService.IS_USER_BUILD; 3920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 4020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosfinal class AppErrorDialog extends BaseErrorDialog implements View.OnClickListener { 419046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 42d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn private final ActivityManagerService mService; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final AppErrorResult mResult; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ProcessRecord mProc; 4520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos private final boolean mRepeating; 4620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 47a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski private CharSequence mName; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int CANT_SHOW = -1; 509046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int BACKGROUND_USER = -2; 519046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int ALREADY_SHOWING = -3; 529046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Event 'what' codes 5420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT = 1; 5520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT_AND_REPORT = 2; 5620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int RESTART = 3; 5720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int RESET = 4; 5820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int MUTE = 5; 599046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static final int TIMEOUT = 6; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5-minute timeout, then we automatically dismiss the crash dialog 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final long DISMISS_TIMEOUT = 1000 * 60 * 5; 63a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 6420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public AppErrorDialog(Context context, ActivityManagerService service, Data data) { 6520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos super(context); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = context.getResources(); 67a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 68d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mService = service; 6920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mProc = data.proc; 7020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult = data.result; 7120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating = data.repeating; 72890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos BidiFormatter bidi = BidiFormatter.getInstance(); 73890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos 7420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if ((mProc.pkgList.size() == 1) && 7520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos (mName = context.getPackageManager().getApplicationLabel(mProc.info)) != null) { 7620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 7720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_application_repeated 7820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_application, 79890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()), 80890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mProc.info.processName))); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mName = mProc.processName; 8320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 8420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_process_repeated 8520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_process, 86890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()))); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCancelable(false); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 915fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowManager.LayoutParams attrs = getWindow().getAttributes(); 9220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos attrs.setTitle("Application Error: " + mProc.info.processName); 9395c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR 9495c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski | WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 955fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn getWindow().setAttributes(attrs); 9620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if (mProc.persistent) { 9738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 9838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // After the timeout, pretend the user clicked the quit button 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageDelayed( 1029046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos mHandler.obtainMessage(TIMEOUT), 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DISMISS_TIMEOUT); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 105b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 106a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski @Override 107a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski protected void onCreate(Bundle savedInstanceState) { 108a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski super.onCreate(savedInstanceState); 10920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final FrameLayout frame = (FrameLayout) findViewById(android.R.id.custom); 11020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final Context context = getContext(); 11120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos LayoutInflater.from(context).inflate( 11220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos com.android.internal.R.layout.app_error_dialog, frame, true); 11320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 11420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart); 11520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos restart.setOnClickListener(this); 11620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos restart.setVisibility(!mRepeating ? View.VISIBLE : View.GONE); 11720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView reset = (TextView) findViewById(com.android.internal.R.id.aerr_reset); 11820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos reset.setOnClickListener(this); 11920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos reset.setVisibility(mRepeating ? View.VISIBLE : View.GONE); 12020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView report = (TextView) findViewById(com.android.internal.R.id.aerr_report); 12120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setOnClickListener(this); 12220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final boolean hasReceiver = mProc.errorReportReceiver != null; 12320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); 12420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); 12520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos close.setOnClickListener(this); 12620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView mute = (TextView) findViewById(com.android.internal.R.id.aerr_mute); 12720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mute.setOnClickListener(this); 12820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mute.setVisibility(!IS_USER_BUILD ? View.VISIBLE : View.GONE); 12920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 13020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); 131a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski } 132a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Handler mHandler = new Handler() { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 13520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final int result = msg.what; 13620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 137d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn synchronized (mService) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProc != null && mProc.crashDialog == AppErrorDialog.this) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProc.crashDialog = null; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult.set(result); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144b1a8a89697fbe714c0fa447fec2a73628555a656Dianne Hackborn // Make sure we don't have time timeout still hanging around. 1459046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos removeMessages(TIMEOUT); 146b1a8a89697fbe714c0fa447fec2a73628555a656Dianne Hackborn 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 15031dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale 15131dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale @Override 15231dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale public void dismiss() { 15331dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale if (!mResult.mHasResult) { 15431dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale // We are dismissing and the result has not been set...go ahead and set. 15531dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale mResult.set(FORCE_QUIT); 15631dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 15731dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale super.dismiss(); 15831dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 15920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 16020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos @Override 16120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public void onClick(View v) { 16220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos switch (v.getId()) { 16320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_restart: 16420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(RESTART).sendToTarget(); 16520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 16620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_reset: 16720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(RESET).sendToTarget(); 16820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 16920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_report: 17020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); 17120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 17220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_close: 17320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT).sendToTarget(); 17420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 17520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_mute: 17620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(MUTE).sendToTarget(); 17720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 17820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos default: 17920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 18120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 18220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 18320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static class Data { 18420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos AppErrorResult result; 18520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos TaskRecord task; 18620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos boolean repeating; 18720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos ProcessRecord proc; 18820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 190