Loading core/res/res/layout/app_error_dialog.xml +3 −12 Original line number Diff line number Diff line Loading @@ -35,11 +35,11 @@ /> <Button android:id="@+id/aerr_reset" android:id="@+id/aerr_close" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/aerr_reset" android:drawableStart="@drawable/ic_refresh" android:text="@string/aerr_close" android:drawableStart="@drawable/ic_close" style="@style/aerr_list_item" /> Loading @@ -52,15 +52,6 @@ style="@style/aerr_list_item" /> <Button android:id="@+id/aerr_close" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/aerr_close" android:drawableStart="@drawable/ic_close" style="@style/aerr_list_item" /> <Button android:id="@+id/aerr_mute" android:layout_width="match_parent" Loading core/res/res/values/symbols.xml +0 −1 Original line number Diff line number Diff line Loading @@ -2445,7 +2445,6 @@ <java-symbol type="id" name="work_widget_badge_icon" /> <java-symbol type="id" name="aerr_report" /> <java-symbol type="id" name="aerr_reset" /> <java-symbol type="id" name="aerr_restart" /> <java-symbol type="id" name="aerr_close" /> <java-symbol type="id" name="aerr_mute" /> Loading services/core/java/com/android/server/am/AppErrorDialog.java +40 −11 Original line number Diff line number Diff line Loading @@ -18,13 +18,17 @@ package com.android.server.am; import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.text.BidiFormatter; import android.util.Slog; import android.view.LayoutInflater; Loading @@ -43,6 +47,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen private final AppErrorResult mResult; private final ProcessRecord mProc; private final boolean mRepeating; private final boolean mForeground; private CharSequence mName; Loading @@ -54,9 +59,9 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen static final int FORCE_QUIT = 1; static final int FORCE_QUIT_AND_REPORT = 2; static final int RESTART = 3; static final int RESET = 4; static final int MUTE = 5; static final int TIMEOUT = 6; static final int CANCEL = 7; // 5-minute timeout, then we automatically dismiss the crash dialog static final long DISMISS_TIMEOUT = 1000 * 60 * 5; Loading @@ -69,6 +74,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen mProc = data.proc; mResult = data.result; mRepeating = data.repeating; mForeground = data.task != null; BidiFormatter bidi = BidiFormatter.getInstance(); if ((mProc.pkgList.size() == 1) && Loading @@ -86,7 +92,8 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen bidi.unicodeWrap(mName.toString()))); } setCancelable(false); setCancelable(true); setCancelMessage(mHandler.obtainMessage(CANCEL)); WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.setTitle("Application Error: " + mProc.info.processName); Loading @@ -111,25 +118,41 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen LayoutInflater.from(context).inflate( com.android.internal.R.layout.app_error_dialog, frame, true); boolean hasRestart = !mRepeating && mForeground; final boolean hasReceiver = mProc.errorReportReceiver != null; final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart); restart.setOnClickListener(this); restart.setVisibility(!mRepeating ? View.VISIBLE : View.GONE); final TextView reset = (TextView) findViewById(com.android.internal.R.id.aerr_reset); reset.setOnClickListener(this); reset.setVisibility(mRepeating ? View.VISIBLE : View.GONE); restart.setVisibility(hasRestart ? View.VISIBLE : View.GONE); final TextView report = (TextView) findViewById(com.android.internal.R.id.aerr_report); report.setOnClickListener(this); final boolean hasReceiver = mProc.errorReportReceiver != null; report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE); close.setOnClickListener(this); boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; final TextView mute = (TextView) findViewById(com.android.internal.R.id.aerr_mute); mute.setOnClickListener(this); mute.setVisibility(!IS_USER_BUILD ? View.VISIBLE : View.GONE); mute.setVisibility(showMute ? View.VISIBLE : View.GONE); findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); } @Override public void onStart() { super.onStart(); getContext().registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } @Override protected void onStop() { super.onStop(); getContext().unregisterReceiver(mReceiver); } private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { final int result = msg.what; Loading Loading @@ -163,9 +186,6 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen case com.android.internal.R.id.aerr_restart: mHandler.obtainMessage(RESTART).sendToTarget(); break; case com.android.internal.R.id.aerr_reset: mHandler.obtainMessage(RESET).sendToTarget(); break; case com.android.internal.R.id.aerr_report: mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); break; Loading @@ -180,6 +200,15 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { cancel(); } } }; static class Data { AppErrorResult result; TaskRecord task; Loading services/core/java/com/android/server/am/AppErrors.java +1 −30 Original line number Diff line number Diff line Loading @@ -370,38 +370,9 @@ class AppErrors { Intent appErrorIntent = null; MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_CRASH, res); if (res == AppErrorDialog.TIMEOUT) { if (res == AppErrorDialog.TIMEOUT || res == AppErrorDialog.CANCEL) { res = AppErrorDialog.FORCE_QUIT; } if (res == AppErrorDialog.RESET) { String[] packageList = r.getPackageList(); if (packageList != null) { PackageManager pm = mContext.getPackageManager(); final Semaphore s = new Semaphore(0); for (int i = 0; i < packageList.length; i++) { if (i < packageList.length - 1) { pm.deleteApplicationCacheFiles(packageList[i], null); } else { pm.deleteApplicationCacheFiles(packageList[i], new IPackageDataObserver.Stub() { @Override public void onRemoveCompleted(String packageName, boolean succeeded) { s.release(); } }); // Wait until cache has been cleared before we restart. try { s.acquire(); } catch (InterruptedException e) { } } } } // If there was nothing to reset, just restart; res = AppErrorDialog.RESTART; } synchronized (mService) { if (res == AppErrorDialog.MUTE) { stopReportingCrashesLocked(r); Loading Loading
core/res/res/layout/app_error_dialog.xml +3 −12 Original line number Diff line number Diff line Loading @@ -35,11 +35,11 @@ /> <Button android:id="@+id/aerr_reset" android:id="@+id/aerr_close" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/aerr_reset" android:drawableStart="@drawable/ic_refresh" android:text="@string/aerr_close" android:drawableStart="@drawable/ic_close" style="@style/aerr_list_item" /> Loading @@ -52,15 +52,6 @@ style="@style/aerr_list_item" /> <Button android:id="@+id/aerr_close" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/aerr_close" android:drawableStart="@drawable/ic_close" style="@style/aerr_list_item" /> <Button android:id="@+id/aerr_mute" android:layout_width="match_parent" Loading
core/res/res/values/symbols.xml +0 −1 Original line number Diff line number Diff line Loading @@ -2445,7 +2445,6 @@ <java-symbol type="id" name="work_widget_badge_icon" /> <java-symbol type="id" name="aerr_report" /> <java-symbol type="id" name="aerr_reset" /> <java-symbol type="id" name="aerr_restart" /> <java-symbol type="id" name="aerr_close" /> <java-symbol type="id" name="aerr_mute" /> Loading
services/core/java/com/android/server/am/AppErrorDialog.java +40 −11 Original line number Diff line number Diff line Loading @@ -18,13 +18,17 @@ package com.android.server.am; import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.text.BidiFormatter; import android.util.Slog; import android.view.LayoutInflater; Loading @@ -43,6 +47,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen private final AppErrorResult mResult; private final ProcessRecord mProc; private final boolean mRepeating; private final boolean mForeground; private CharSequence mName; Loading @@ -54,9 +59,9 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen static final int FORCE_QUIT = 1; static final int FORCE_QUIT_AND_REPORT = 2; static final int RESTART = 3; static final int RESET = 4; static final int MUTE = 5; static final int TIMEOUT = 6; static final int CANCEL = 7; // 5-minute timeout, then we automatically dismiss the crash dialog static final long DISMISS_TIMEOUT = 1000 * 60 * 5; Loading @@ -69,6 +74,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen mProc = data.proc; mResult = data.result; mRepeating = data.repeating; mForeground = data.task != null; BidiFormatter bidi = BidiFormatter.getInstance(); if ((mProc.pkgList.size() == 1) && Loading @@ -86,7 +92,8 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen bidi.unicodeWrap(mName.toString()))); } setCancelable(false); setCancelable(true); setCancelMessage(mHandler.obtainMessage(CANCEL)); WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.setTitle("Application Error: " + mProc.info.processName); Loading @@ -111,25 +118,41 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen LayoutInflater.from(context).inflate( com.android.internal.R.layout.app_error_dialog, frame, true); boolean hasRestart = !mRepeating && mForeground; final boolean hasReceiver = mProc.errorReportReceiver != null; final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart); restart.setOnClickListener(this); restart.setVisibility(!mRepeating ? View.VISIBLE : View.GONE); final TextView reset = (TextView) findViewById(com.android.internal.R.id.aerr_reset); reset.setOnClickListener(this); reset.setVisibility(mRepeating ? View.VISIBLE : View.GONE); restart.setVisibility(hasRestart ? View.VISIBLE : View.GONE); final TextView report = (TextView) findViewById(com.android.internal.R.id.aerr_report); report.setOnClickListener(this); final boolean hasReceiver = mProc.errorReportReceiver != null; report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE); close.setOnClickListener(this); boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; final TextView mute = (TextView) findViewById(com.android.internal.R.id.aerr_mute); mute.setOnClickListener(this); mute.setVisibility(!IS_USER_BUILD ? View.VISIBLE : View.GONE); mute.setVisibility(showMute ? View.VISIBLE : View.GONE); findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); } @Override public void onStart() { super.onStart(); getContext().registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } @Override protected void onStop() { super.onStop(); getContext().unregisterReceiver(mReceiver); } private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { final int result = msg.what; Loading Loading @@ -163,9 +186,6 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen case com.android.internal.R.id.aerr_restart: mHandler.obtainMessage(RESTART).sendToTarget(); break; case com.android.internal.R.id.aerr_reset: mHandler.obtainMessage(RESET).sendToTarget(); break; case com.android.internal.R.id.aerr_report: mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget(); break; Loading @@ -180,6 +200,15 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { cancel(); } } }; static class Data { AppErrorResult result; TaskRecord task; Loading
services/core/java/com/android/server/am/AppErrors.java +1 −30 Original line number Diff line number Diff line Loading @@ -370,38 +370,9 @@ class AppErrors { Intent appErrorIntent = null; MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_CRASH, res); if (res == AppErrorDialog.TIMEOUT) { if (res == AppErrorDialog.TIMEOUT || res == AppErrorDialog.CANCEL) { res = AppErrorDialog.FORCE_QUIT; } if (res == AppErrorDialog.RESET) { String[] packageList = r.getPackageList(); if (packageList != null) { PackageManager pm = mContext.getPackageManager(); final Semaphore s = new Semaphore(0); for (int i = 0; i < packageList.length; i++) { if (i < packageList.length - 1) { pm.deleteApplicationCacheFiles(packageList[i], null); } else { pm.deleteApplicationCacheFiles(packageList[i], new IPackageDataObserver.Stub() { @Override public void onRemoveCompleted(String packageName, boolean succeeded) { s.release(); } }); // Wait until cache has been cleared before we restart. try { s.acquire(); } catch (InterruptedException e) { } } } } // If there was nothing to reset, just restart; res = AppErrorDialog.RESTART; } synchronized (mService) { if (res == AppErrorDialog.MUTE) { stopReportingCrashesLocked(r); Loading