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