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 19ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roosimport android.content.BroadcastReceiver; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 21ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roosimport android.content.Intent; 22ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roosimport android.content.IntentFilter; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 245ab024333065c60620867e58eaa27f27dfa85752Jeff Sharkeyimport android.os.Build; 25a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.os.Bundle; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 28ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roosimport android.provider.Settings; 29890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roosimport android.text.BidiFormatter; 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 Roosfinal class AppErrorDialog extends BaseErrorDialog implements View.OnClickListener { 379046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 38d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn private final ActivityManagerService mService; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final AppErrorResult mResult; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ProcessRecord mProc; 41805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos private final boolean mIsRestartable; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int CANT_SHOW = -1; 449046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int BACKGROUND_USER = -2; 459046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int ALREADY_SHOWING = -3; 469046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Event 'what' codes 4820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT = 1; 4920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT_AND_REPORT = 2; 5020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int RESTART = 3; 5120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int MUTE = 5; 529046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static final int TIMEOUT = 6; 53ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos static final int CANCEL = 7; 545b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein static final int APP_INFO = 8; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5-minute timeout, then we automatically dismiss the crash dialog 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final long DISMISS_TIMEOUT = 1000 * 60 * 5; 58a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 5920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public AppErrorDialog(Context context, ActivityManagerService service, Data data) { 6020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos super(context); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = context.getResources(); 62a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 63d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mService = service; 6420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mProc = data.proc; 6520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult = data.result; 665b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein mIsRestartable = (data.task != null || data.isRestartableForService) 675b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein && Settings.Global.getInt(context.getContentResolver(), 685b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein Settings.Global.SHOW_RESTART_IN_CRASH_DIALOG, 0) != 0; 69890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos BidiFormatter bidi = BidiFormatter.getInstance(); 70890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos 715b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein CharSequence name; 7220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if ((mProc.pkgList.size() == 1) && 735b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein (name = context.getPackageManager().getApplicationLabel(mProc.info)) != null) { 7420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 755b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein data.repeating ? com.android.internal.R.string.aerr_application_repeated 7620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_application, 775b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein bidi.unicodeWrap(name.toString()), 78890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mProc.info.processName))); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 805b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein name = mProc.processName; 8120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 825b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein data.repeating ? com.android.internal.R.string.aerr_process_repeated 8320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_process, 845b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein bidi.unicodeWrap(name.toString()))); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelable(true); 88ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelMessage(mHandler.obtainMessage(CANCEL)); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 905fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowManager.LayoutParams attrs = getWindow().getAttributes(); 9120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos attrs.setTitle("Application Error: " + mProc.info.processName); 9295c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR 9395c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski | WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 945fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn getWindow().setAttributes(attrs); 9520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if (mProc.persistent) { 9638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 9738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // After the timeout, pretend the user clicked the quit button 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageDelayed( 1019046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos mHandler.obtainMessage(TIMEOUT), 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DISMISS_TIMEOUT); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 104b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 105a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski @Override 106a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski protected void onCreate(Bundle savedInstanceState) { 107a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski super.onCreate(savedInstanceState); 10851efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final FrameLayout frame = findViewById(android.R.id.custom); 10920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final Context context = getContext(); 11020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos LayoutInflater.from(context).inflate( 11120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos com.android.internal.R.layout.app_error_dialog, frame, true); 11220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 113ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos final boolean hasReceiver = mProc.errorReportReceiver != null; 114ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 11551efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView restart = findViewById(com.android.internal.R.id.aerr_restart); 11620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos restart.setOnClickListener(this); 117b0c8a887299a7f462c41408edda6043202143233Amith Yamasani restart.setVisibility(mIsRestartable ? View.VISIBLE : View.GONE); 11851efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView report = findViewById(com.android.internal.R.id.aerr_report); 11920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setOnClickListener(this); 12020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); 12151efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView close = findViewById(com.android.internal.R.id.aerr_close); 12220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos close.setOnClickListener(this); 1235b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein final TextView appInfo = findViewById(com.android.internal.R.id.aerr_app_info); 1245b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein appInfo.setOnClickListener(this); 125ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 1265ab024333065c60620867e58eaa27f27dfa85752Jeff Sharkey boolean showMute = !Build.IS_USER && Settings.Global.getInt(context.getContentResolver(), 1275b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0 1285b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein && Settings.Global.getInt(context.getContentResolver(), 1295b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein Settings.Global.SHOW_MUTE_IN_CRASH_DIALOG, 0) != 0; 13051efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView mute = findViewById(com.android.internal.R.id.aerr_mute); 13120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mute.setOnClickListener(this); 132ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos mute.setVisibility(showMute ? View.VISIBLE : View.GONE); 13320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 13420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); 135a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski } 136a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 137ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 138ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onStart() { 139ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStart(); 140ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().registerReceiver(mReceiver, 141ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); 142ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 143ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 144ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 145ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos protected void onStop() { 146ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStop(); 147ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().unregisterReceiver(mReceiver); 148ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 149ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Handler mHandler = new Handler() { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1520da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos setResult(msg.what); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 15631dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale 15731dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale @Override 15831dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale public void dismiss() { 15931dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale if (!mResult.mHasResult) { 16031dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale // We are dismissing and the result has not been set...go ahead and set. 1610da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos setResult(FORCE_QUIT); 16231dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 16331dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale super.dismiss(); 16431dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 16520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 1660da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos private void setResult(int result) { 1670da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos synchronized (mService) { 1680da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos if (mProc != null && mProc.crashDialog == AppErrorDialog.this) { 1690da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mProc.crashDialog = null; 1700da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1710da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1720da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mResult.set(result); 1730da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos 1740da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos // Make sure we don't have time timeout still hanging around. 1750da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mHandler.removeMessages(TIMEOUT); 1760da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1770da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos 17820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos @Override 17920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public void onClick(View v) { 18020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos switch (v.getId()) { 18120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_restart: 18220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(RESTART).sendToTarget(); 18320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_report: 18520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); 18620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_close: 18820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT).sendToTarget(); 18920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 1905b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein case com.android.internal.R.id.aerr_app_info: 1915b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein mHandler.obtainMessage(APP_INFO).sendToTarget(); 1925b679c4d177b18435d362e34a2fce43e0d63e4aeAndrew Sapperstein break; 19320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_mute: 19420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(MUTE).sendToTarget(); 19520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 19620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos default: 19720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 19820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 19920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 20020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 201ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 202ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 203ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onReceive(Context context, Intent intent) { 204ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { 205ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos cancel(); 206ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 207ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 208ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos }; 209ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 21020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static class Data { 21120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos AppErrorResult result; 21220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos TaskRecord task; 21320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos boolean repeating; 21420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos ProcessRecord proc; 215805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos boolean isRestartableForService; 21620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 218