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
196a591f585909415a1da431a2cc76b7732724037dAdam Lesinskiimport static android.view.WindowManager.LayoutParams.PRIVATE_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 Fitzpatrick
27be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class StrictModeViolationDialog extends BaseErrorDialog {
28438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final static String TAG = "StrictModeViolationDialog";
29438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
30d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    private final ActivityManagerService mService;
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
42d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn    public StrictModeViolationDialog(Context context, ActivityManagerService service,
43d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            AppErrorResult result, ProcessRecord app) {
44438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        super(context);
45438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
46438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        Resources res = context.getResources();
47438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
48d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn        mService = service;
49438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mProc = app;
50438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mResult = result;
51438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        CharSequence name;
52438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if ((app.pkgList.size() == 1) &&
53438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                (name=context.getPackageManager().getApplicationLabel(app.info)) != null) {
54438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
55438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_application,
56438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString(), app.info.processName));
57438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        } else {
58438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            name = app.processName;
59438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setMessage(res.getString(
60438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    com.android.internal.R.string.smv_process,
61438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    name.toString()));
62438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
63438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
64438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setCancelable(false);
65438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
66438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setButton(DialogInterface.BUTTON_POSITIVE,
67438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  res.getText(com.android.internal.R.string.dlg_ok),
68438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                  mHandler.obtainMessage(ACTION_OK));
69438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
70438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        if (app.errorReportReceiver != null) {
71438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            setButton(DialogInterface.BUTTON_NEGATIVE,
72438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      res.getText(com.android.internal.R.string.report),
73438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                      mHandler.obtainMessage(ACTION_OK_AND_REPORT));
74438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
75438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
76438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        setTitle(res.getText(com.android.internal.R.string.aerr_title));
7795c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski        getWindow().addPrivateFlags(PRIVATE_FLAG_SYSTEM_ERROR);
78438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
79438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
80438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        // After the timeout, pretend the user clicked the quit button
81438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        mHandler.sendMessageDelayed(
82438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                mHandler.obtainMessage(ACTION_OK),
83438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                DISMISS_TIMEOUT);
84438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
85438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
86438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    private final Handler mHandler = new Handler() {
87438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        public void handleMessage(Message msg) {
88d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            synchronized (mService) {
89438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                if (mProc != null && mProc.crashDialog == StrictModeViolationDialog.this) {
90438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                    mProc.crashDialog = null;
91438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                }
92438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            }
93438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            mResult.set(msg.what);
94438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
95438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // If this is a timeout we won't be automatically closed, so go
96438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            // ahead and explicitly dismiss ourselves just in case.
97438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick            dismiss();
98438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        }
99438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    };
100438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick}
101