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