AppErrorDialog.java revision 805ea307e726e31a179a3ac9856b0588450bcc63
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; 24a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.os.Bundle; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 27ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roosimport android.provider.Settings; 28890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roosimport android.text.BidiFormatter; 29a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.view.LayoutInflater; 30a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.view.View; 3138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackbornimport android.view.WindowManager; 32a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.widget.FrameLayout; 33a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynskiimport android.widget.TextView; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosimport static com.android.server.am.ActivityManagerService.IS_USER_BUILD; 3620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 3720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roosfinal class AppErrorDialog extends BaseErrorDialog implements View.OnClickListener { 389046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 39d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn private final ActivityManagerService mService; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final AppErrorResult mResult; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ProcessRecord mProc; 4220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos private final boolean mRepeating; 43805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos private final boolean mIsRestartable; 4420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 45a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski private CharSequence mName; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int CANT_SHOW = -1; 489046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int BACKGROUND_USER = -2; 499046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int ALREADY_SHOWING = -3; 509046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Event 'what' codes 5220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT = 1; 5320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT_AND_REPORT = 2; 5420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int RESTART = 3; 5520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int MUTE = 5; 569046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static final int TIMEOUT = 6; 57ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos static final int CANCEL = 7; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5-minute timeout, then we automatically dismiss the crash dialog 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final long DISMISS_TIMEOUT = 1000 * 60 * 5; 61a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 6220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public AppErrorDialog(Context context, ActivityManagerService service, Data data) { 6320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos super(context); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = context.getResources(); 65a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 66d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mService = service; 6720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mProc = data.proc; 6820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult = data.result; 6920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating = data.repeating; 70805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos mIsRestartable = data.task != null || data.isRestartableForService; 71890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos BidiFormatter bidi = BidiFormatter.getInstance(); 72890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos 7320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if ((mProc.pkgList.size() == 1) && 7420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos (mName = context.getPackageManager().getApplicationLabel(mProc.info)) != null) { 7520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 7620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_application_repeated 7720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_application, 78890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()), 79890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mProc.info.processName))); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mName = mProc.processName; 8220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 8320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_process_repeated 8420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_process, 85890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()))); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 88ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelable(true); 89ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelMessage(mHandler.obtainMessage(CANCEL)); 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 114805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos boolean hasRestart = !mRepeating && mIsRestartable; 115ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos final boolean hasReceiver = mProc.errorReportReceiver != null; 116ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 11720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart); 11820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos restart.setOnClickListener(this); 119ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos restart.setVisibility(hasRestart ? 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 report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); 12320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); 124ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE); 12520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos close.setOnClickListener(this); 126ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 127ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(), 128ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 12920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final TextView mute = (TextView) findViewById(com.android.internal.R.id.aerr_mute); 13020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mute.setOnClickListener(this); 131ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos mute.setVisibility(showMute ? View.VISIBLE : View.GONE); 13220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 13320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); 134a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski } 135a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 136ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 137ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onStart() { 138ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStart(); 139ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().registerReceiver(mReceiver, 140ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); 141ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 142ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 143ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 144ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos protected void onStop() { 145ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStop(); 146ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().unregisterReceiver(mReceiver); 147ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 148ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Handler mHandler = new Handler() { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 15120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final int result = msg.what; 15220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 153d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn synchronized (mService) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProc != null && mProc.crashDialog == AppErrorDialog.this) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProc.crashDialog = null; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult.set(result); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 160b1a8a89697fbe714c0fa447fec2a73628555a656Dianne Hackborn // Make sure we don't have time timeout still hanging around. 1619046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos removeMessages(TIMEOUT); 162b1a8a89697fbe714c0fa447fec2a73628555a656Dianne Hackborn 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 16631dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale 16731dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale @Override 16831dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale public void dismiss() { 16931dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale if (!mResult.mHasResult) { 17031dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale // We are dismissing and the result has not been set...go ahead and set. 17131dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale mResult.set(FORCE_QUIT); 17231dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 17331dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale super.dismiss(); 17431dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 17520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 17620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos @Override 17720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public void onClick(View v) { 17820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos switch (v.getId()) { 17920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_restart: 18020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(RESTART).sendToTarget(); 18120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_report: 18320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); 18420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_close: 18620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT).sendToTarget(); 18720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_mute: 18920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(MUTE).sendToTarget(); 19020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 19120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos default: 19220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 19320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 19420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 19520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 196ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 197ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 198ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onReceive(Context context, Intent intent) { 199ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { 200ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos cancel(); 201ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 202ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 203ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos }; 204ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 20520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static class Data { 20620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos AppErrorResult result; 20720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos TaskRecord task; 20820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos boolean repeating; 20920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos ProcessRecord proc; 210805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos boolean isRestartableForService; 21120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 213