StrictModeViolationDialog.java revision 438d0595121a7a2cdf19741e76e3c0e21a5c173d
1afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber/*
2afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Copyright (C) 2006 The Android Open Source Project
3afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
4afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * you may not use this file except in compliance with the License.
6afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * You may obtain a copy of the License at
7afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
8afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
10afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Unless required by applicable law or agreed to in writing, software
11afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * See the License for the specific language governing permissions and
14afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * limitations under the License.
15afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber */
16afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
17afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberpackage com.android.server.am;
18afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
19afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
20afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
21afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport android.content.Context;
22afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport android.content.DialogInterface;
23afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport android.content.res.Resources;
24afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport android.os.Handler;
25afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberimport android.os.Message;
263423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shihimport android.util.Slog;
273423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
28afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberclass StrictModeViolationDialog extends BaseErrorDialog {
29afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    private final static String TAG = "StrictModeViolationDialog";
30802768790c131f8237364906fd13981a6bb91193Ronghua Wu
31802768790c131f8237364906fd13981a6bb91193Ronghua Wu    private final AppErrorResult mResult;
32afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    private final ProcessRecord mProc;
33afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
34afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    // Event 'what' codes
35bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    static final int ACTION_OK = 0;
36afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    static final int ACTION_OK_AND_REPORT = 1;
373423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
38d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    // 1-minute timeout, then we automatically dismiss the violation
392a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    // dialog
40afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    static final long DISMISS_TIMEOUT = 1000 * 60 * 1;
41afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
423de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang    public StrictModeViolationDialog(Context context, AppErrorResult result, ProcessRecord app) {
433de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang        super(context);
44bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang
451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        Resources res = context.getResources();
46afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
473de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang        mProc = app;
48afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mResult = result;
49bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang        CharSequence name;
50afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if ((app.pkgList.size() == 1) &&
519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                (name=context.getPackageManager().getApplicationLabel(app.info)) != null) {
529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            setMessage(res.getString(
53afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    com.android.internal.R.string.smv_application,
54802768790c131f8237364906fd13981a6bb91193Ronghua Wu                    name.toString(), app.info.processName));
55802768790c131f8237364906fd13981a6bb91193Ronghua Wu        } else {
56802768790c131f8237364906fd13981a6bb91193Ronghua Wu            name = app.processName;
57afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            setMessage(res.getString(
5848296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang                    com.android.internal.R.string.smv_process,
5948296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang                    name.toString()));
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
62f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen        setCancelable(false);
63f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        setButton(DialogInterface.BUTTON_POSITIVE,
65afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                  res.getText(com.android.internal.R.string.dlg_ok),
66afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                  mHandler.obtainMessage(ACTION_OK));
67dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih
68dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih        if (app.errorReportReceiver != null) {
69e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            setButton(DialogInterface.BUTTON_NEGATIVE,
706ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih                      res.getText(com.android.internal.R.string.report),
71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                      mHandler.obtainMessage(ACTION_OK_AND_REPORT));
72b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        }
73cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar
74cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar        setTitle(res.getText(com.android.internal.R.string.aerr_title));
75afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        getWindow().addFlags(FLAG_SYSTEM_ERROR);
76afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
77afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
783423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        // After the timeout, pretend the user clicked the quit button
793423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        mHandler.sendMessageDelayed(
80840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                mHandler.obtainMessage(ACTION_OK),
81840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                DISMISS_TIMEOUT);
82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
841228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    public void onStop() {
853423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    }
86e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar
873423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    private final Handler mHandler = new Handler() {
88e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar        public void handleMessage(Message msg) {
893423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            synchronized (mProc) {
902a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang                if (mProc != null && mProc.crashDialog == StrictModeViolationDialog.this) {
9117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih                    mProc.crashDialog = null;
9217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih                }
9317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih            }
9417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih            mResult.set(msg.what);
9517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
962abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung            // If this is a timeout we won't be automatically closed, so go
97efbb61950db36a5eb789be83f077246172507c67Chong Zhang            // ahead and explicitly dismiss ourselves just in case.
98efbb61950db36a5eb789be83f077246172507c67Chong Zhang            dismiss();
993423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        }
1003423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    };
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
102dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih