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

Commit 6be5368b authored by Amin Shaikh's avatar Amin Shaikh
Browse files

Dismiss systemui QS dialogs on screen off.

CLOSE_SYSTEM_DIALOGS may not be sent if the user turns off and on the
screen quickly, resulting in systemui dialogs being displayed over the
lock screen. Dismissing these system dialogs when the SCREEN_OFF
broadcast is sent prevents this bug.

Change-Id: I097d0997d1538002b23bdd8f7aa32ecf4d32e0d4
Fixes: 78915648
Test: manual
parent 90f197ef
Loading
Loading
Loading
Loading
+38 −20
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.UserHandle;
@@ -30,6 +31,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.KeyguardMonitor;


/**
 * Base class for dialogs that should appear over panels and keyguard.
 */
@@ -99,24 +101,40 @@ public class SystemUIDialog extends AlertDialog {
    }

    public static void registerDismissListener(Dialog dialog) {
        boolean[] registered = new boolean[1];
        Context context = dialog.getContext();
        final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (dialog != null) {
                    dialog.dismiss();
        DismissReceiver dismissReceiver = new DismissReceiver(dialog);
        dismissReceiver.register();
    }

    private static class DismissReceiver extends BroadcastReceiver implements OnDismissListener {
        private static final IntentFilter INTENT_FILTER = new IntentFilter();
        static {
            INTENT_FILTER.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            INTENT_FILTER.addAction(Intent.ACTION_SCREEN_OFF);
        }

        private final Dialog mDialog;
        private boolean mRegistered;

        DismissReceiver(Dialog dialog) {
            mDialog = dialog;
        }

        void register() {
            mDialog.getContext()
                    .registerReceiverAsUser(this, UserHandle.CURRENT, INTENT_FILTER, null, null);
            mRegistered = true;
        }
        };
        context.registerReceiverAsUser(mReceiver, UserHandle.CURRENT,
                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), null, null);
        registered[0] = true;
        dialog.setOnDismissListener(d -> {
            if (registered[0]) {
                context.unregisterReceiver(mReceiver);
                registered[0] = false;

        @Override
        public void onReceive(Context context, Intent intent) {
            mDialog.dismiss();
        }
        });

        @Override
        public void onDismiss(DialogInterface dialog) {
            if (mRegistered) {
                mDialog.getContext().unregisterReceiver(this);
                mRegistered = false;
            }
        }
    }}