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