1438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick/*
2438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Copyright (C) 2006 The Android Open Source Project
3438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick *
4438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * you may not use this file except in compliance with the License.
6438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * You may obtain a copy of the License at
7438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick *
8438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick *
10438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
11438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * See the License for the specific language governing permissions and
14438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * limitations under the License.
15438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */
16438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
17438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickpackage com.android.server.am;
18438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
19438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
20438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
21438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.content.Context;
22438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.content.DialogInterface;
23438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.content.res.Resources;
24438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.os.Handler;
25438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.os.Message;
26438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.util.Slog;
27438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
28438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickclass StrictModeViolationDialog extends BaseErrorDialog {
29438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final static String TAG = "StrictModeViolationDialog";
30438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
31438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final AppErrorResult mResult;
32438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final ProcessRecord mProc;
33438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
34438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // Event 'what' codes
35438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final int ACTION_OK = 0;
36438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final int ACTION_OK_AND_REPORT = 1;
37438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
38438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // 1-minute timeout, then we automatically dismiss the violation
39438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // dialog
40438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final long DISMISS_TIMEOUT = 1000 * 60 * 1;
41438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
42438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    public StrictModeViolationDialog(Context context, AppErrorResult result, ProcessRecord app) {
43438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        super(context);
44438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
45438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        Resources res = context.getResources();
46438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
47438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mProc = app;
48438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mResult = result;
49438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        CharSequence name;
50438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if ((app.pkgList.size() == 1) &&
51438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                (name=context.getPackageManager().getApplicationLabel(app.info)) != null) {
52438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
53438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_application,
54438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString(), app.info.processName));
55438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        } else {
56438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            name = app.processName;
57438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
58438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_process,
59438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString()));
60438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
61438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
62438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setCancelable(false);
63438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
64438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setButton(DialogInterface.BUTTON_POSITIVE,
65438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  res.getText(com.android.internal.R.string.dlg_ok),
66438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  mHandler.obtainMessage(ACTION_OK));
67438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
68438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if (app.errorReportReceiver != null) {
69438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setButton(DialogInterface.BUTTON_NEGATIVE,
70438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      res.getText(com.android.internal.R.string.report),
71438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      mHandler.obtainMessage(ACTION_OK_AND_REPORT));
72438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
73438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
74438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setTitle(res.getText(com.android.internal.R.string.aerr_title));
75438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        getWindow().addFlags(FLAG_SYSTEM_ERROR);
76438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
77438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
78438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        // After the timeout, pretend the user clicked the quit button
79438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mHandler.sendMessageDelayed(
80438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                mHandler.obtainMessage(ACTION_OK),
81438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                DISMISS_TIMEOUT);
82438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
83438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
84438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final Handler mHandler = new Handler() {
85438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        public void handleMessage(Message msg) {
86438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            synchronized (mProc) {
87438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                if (mProc != null && mProc.crashDialog == StrictModeViolationDialog.this) {
88438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    mProc.crashDialog = null;
89438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                }
90438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            }
91438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            mResult.set(msg.what);
92438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
93438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // If this is a timeout we won't be automatically closed, so go
94438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // ahead and explicitly dismiss ourselves just in case.
95438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            dismiss();
96438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
97438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    };
98438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick}
99