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