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
31d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    private final ActivityManagerService mService;
32438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final AppErrorResult mResult;
33438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final ProcessRecord mProc;
34438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
35438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // Event 'what' codes
36438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final int ACTION_OK = 0;
37438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final int ACTION_OK_AND_REPORT = 1;
38438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
39438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // 1-minute timeout, then we automatically dismiss the violation
40438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    // dialog
41438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    static final long DISMISS_TIMEOUT = 1000 * 60 * 1;
42438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
43d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    public StrictModeViolationDialog(Context context, ActivityManagerService service,
44d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            AppErrorResult result, ProcessRecord app) {
45438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        super(context);
46438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
47438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        Resources res = context.getResources();
48438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
49d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        mService = service;
50438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mProc = app;
51438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mResult = result;
52438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        CharSequence name;
53438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if ((app.pkgList.size() == 1) &&
54438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                (name=context.getPackageManager().getApplicationLabel(app.info)) != null) {
55438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
56438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_application,
57438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString(), app.info.processName));
58438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        } else {
59438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            name = app.processName;
60438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
61438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_process,
62438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString()));
63438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
64438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
65438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setCancelable(false);
66438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
67438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setButton(DialogInterface.BUTTON_POSITIVE,
68438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  res.getText(com.android.internal.R.string.dlg_ok),
69438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  mHandler.obtainMessage(ACTION_OK));
70438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
71438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if (app.errorReportReceiver != null) {
72438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setButton(DialogInterface.BUTTON_NEGATIVE,
73438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      res.getText(com.android.internal.R.string.report),
74438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      mHandler.obtainMessage(ACTION_OK_AND_REPORT));
75438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
76438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
77438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setTitle(res.getText(com.android.internal.R.string.aerr_title));
78438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        getWindow().addFlags(FLAG_SYSTEM_ERROR);
79438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
80438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
81438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        // After the timeout, pretend the user clicked the quit button
82438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mHandler.sendMessageDelayed(
83438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                mHandler.obtainMessage(ACTION_OK),
84438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                DISMISS_TIMEOUT);
85438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
86438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
87438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final Handler mHandler = new Handler() {
88438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        public void handleMessage(Message msg) {
89d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            synchronized (mService) {
90438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                if (mProc != null && mProc.crashDialog == StrictModeViolationDialog.this) {
91438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    mProc.crashDialog = null;
92438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                }
93438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            }
94438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            mResult.set(msg.what);
95438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
96438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // If this is a timeout we won't be automatically closed, so go
97438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // ahead and explicitly dismiss ourselves just in case.
98438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            dismiss();
99438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
100438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    };
101438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick}
102