AppErrorDialog.java revision b0c8a887299a7f462c41408edda6043202143233
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; 4120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos private final boolean mRepeating; 42805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos private final boolean mIsRestartable; 43a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski private CharSequence mName; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int CANT_SHOW = -1; 469046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int BACKGROUND_USER = -2; 479046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static int ALREADY_SHOWING = -3; 489046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Event 'what' codes 5020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT = 1; 5120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int FORCE_QUIT_AND_REPORT = 2; 5220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int RESTART = 3; 5320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static final int MUTE = 5; 549046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos static final int TIMEOUT = 6; 55ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos static final int CANCEL = 7; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5-minute timeout, then we automatically dismiss the crash dialog 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final long DISMISS_TIMEOUT = 1000 * 60 * 5; 59a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 6020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public AppErrorDialog(Context context, ActivityManagerService service, Data data) { 6120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos super(context); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = context.getResources(); 63a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 64d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mService = service; 6520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mProc = data.proc; 6620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mResult = data.result; 6720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating = data.repeating; 68805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos mIsRestartable = data.task != null || data.isRestartableForService; 69890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos BidiFormatter bidi = BidiFormatter.getInstance(); 70890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos 7120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if ((mProc.pkgList.size() == 1) && 7220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos (mName = context.getPackageManager().getApplicationLabel(mProc.info)) != null) { 7320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 7420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_application_repeated 7520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_application, 76890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()), 77890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mProc.info.processName))); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mName = mProc.processName; 8020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos setTitle(res.getString( 8120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mRepeating ? com.android.internal.R.string.aerr_process_repeated 8220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos : com.android.internal.R.string.aerr_process, 83890f1f372e9bdaeefc1707acbbd97de95709db39Adrian Roos bidi.unicodeWrap(mName.toString()))); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelable(true); 87ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos setCancelMessage(mHandler.obtainMessage(CANCEL)); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 895fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowManager.LayoutParams attrs = getWindow().getAttributes(); 9020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos attrs.setTitle("Application Error: " + mProc.info.processName); 9195c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR 9295c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski | WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 935fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn getWindow().setAttributes(attrs); 9420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos if (mProc.persistent) { 9538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 9638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // After the timeout, pretend the user clicked the quit button 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageDelayed( 1009046222cb2b1bd57278ddbf71d9f628f8dd254aeAdrian Roos mHandler.obtainMessage(TIMEOUT), 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DISMISS_TIMEOUT); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 103b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 104a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski @Override 105a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski protected void onCreate(Bundle savedInstanceState) { 106a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski super.onCreate(savedInstanceState); 10751efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final FrameLayout frame = findViewById(android.R.id.custom); 10820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos final Context context = getContext(); 10920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos LayoutInflater.from(context).inflate( 11020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos com.android.internal.R.layout.app_error_dialog, frame, true); 11120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 112ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos final boolean hasReceiver = mProc.errorReportReceiver != null; 113ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 11451efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView restart = findViewById(com.android.internal.R.id.aerr_restart); 11520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos restart.setOnClickListener(this); 116b0c8a887299a7f462c41408edda6043202143233Amith Yamasani restart.setVisibility(mIsRestartable ? View.VISIBLE : View.GONE); 11751efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView report = findViewById(com.android.internal.R.id.aerr_report); 11820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setOnClickListener(this); 11920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); 12051efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView close = findViewById(com.android.internal.R.id.aerr_close); 121b0c8a887299a7f462c41408edda6043202143233Amith Yamasani close.setVisibility(mRepeating ? View.VISIBLE : View.GONE); 12220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos close.setOnClickListener(this); 123ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 1245ab024333065c60620867e58eaa27f27dfa85752Jeff Sharkey boolean showMute = !Build.IS_USER && Settings.Global.getInt(context.getContentResolver(), 125ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 12651efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette final TextView mute = findViewById(com.android.internal.R.id.aerr_mute); 12720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mute.setOnClickListener(this); 128ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos mute.setVisibility(showMute ? View.VISIBLE : View.GONE); 12920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 13020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); 131a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski } 132a925f1897f9e8fa0db7cf8b72b53d7c56dc3921cFilip Gruszczynski 133ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 134ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onStart() { 135ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStart(); 136ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().registerReceiver(mReceiver, 137ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); 138ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 139ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 140ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 141ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos protected void onStop() { 142ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos super.onStop(); 143ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos getContext().unregisterReceiver(mReceiver); 144ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 145ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Handler mHandler = new Handler() { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1480da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos setResult(msg.what); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 15231dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale 15331dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale @Override 15431dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale public void dismiss() { 15531dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale if (!mResult.mHasResult) { 15631dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale // We are dismissing and the result has not been set...go ahead and set. 1570da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos setResult(FORCE_QUIT); 15831dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 15931dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale super.dismiss(); 16031dd3a74c1d5a6746eec6b7f1260fae11f488af0Wale Ogunwale } 16120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 1620da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos private void setResult(int result) { 1630da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos synchronized (mService) { 1640da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos if (mProc != null && mProc.crashDialog == AppErrorDialog.this) { 1650da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mProc.crashDialog = null; 1660da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1670da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1680da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mResult.set(result); 1690da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos 1700da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos // Make sure we don't have time timeout still hanging around. 1710da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos mHandler.removeMessages(TIMEOUT); 1720da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos } 1730da67d661e20a3361f0ee4f10a19d1b8edf5e73dAdrian Roos 17420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos @Override 17520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos public void onClick(View v) { 17620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos switch (v.getId()) { 17720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_restart: 17820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(RESTART).sendToTarget(); 17920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_report: 18120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); 18220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_close: 18420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(FORCE_QUIT).sendToTarget(); 18520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos case com.android.internal.R.id.aerr_mute: 18720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos mHandler.obtainMessage(MUTE).sendToTarget(); 18820d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 18920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos default: 19020d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos break; 19120d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 19220d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 19320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos 194ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 195ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos @Override 196ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos public void onReceive(Context context, Intent intent) { 197ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { 198ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos cancel(); 199ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 200ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos } 201ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos }; 202ad028c1616be016e6bef0d9a664d3a0054804e01Adrian Roos 20320d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos static class Data { 20420d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos AppErrorResult result; 20520d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos TaskRecord task; 20620d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos boolean repeating; 20720d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos ProcessRecord proc; 208805ea307e726e31a179a3ac9856b0588450bcc63Adrian Roos boolean isRestartableForService; 20920d7df3c3ff0000678a208b25fcf7ddf90c5abe4Adrian Roos } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 211