Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20962d34 authored by Adrian Roos's avatar Adrian Roos Committed by android-build-merger
Browse files

Merge "Simplify crash dialog" into nyc-dev

am: 9764fea4

* commit '9764fea4':
  Simplify crash dialog

Change-Id: I99e6f68890067cc55422ef11686bd40a6185fd1a
parents d70126ec 9764fea4
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -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"
    />

@@ -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"
+0 −1
Original line number Diff line number Diff line
@@ -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" />
+40 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
@@ -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) &&
@@ -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);
@@ -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;
@@ -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;
@@ -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;
+1 −30
Original line number Diff line number Diff line
@@ -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);