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

Commit 9ca18487 authored by Jason Monk's avatar Jason Monk
Browse files

Cleanup QS dialogs

Test: manual
Change-Id: I3a87b171d9000ac6628f3d83fc2a817136dc3010
Fixes: 64159285
Fixes: 64158814
parent 7eca0300
Loading
Loading
Loading
Loading
+6 −23
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnClickListener;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.Button;


import com.android.internal.app.MediaRouteChooserDialog;
import com.android.internal.app.MediaRouteChooserDialog;
@@ -50,6 +51,7 @@ import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -139,25 +141,15 @@ public class CastTile extends QSTileImpl<BooleanState> {
                        Dependency.get(ActivityStarter.class)
                        Dependency.get(ActivityStarter.class)
                                .postStartActivityDismissingKeyguard(getLongClickIntent(), 0);
                                .postStartActivityDismissingKeyguard(getLongClickIntent(), 0);
                    });
                    });
            mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
            mDialog.getWindow().setType(LayoutParams.TYPE_KEYGUARD_DIALOG);
            SystemUIDialog.setShowForAllUsers(mDialog, true);
            SystemUIDialog.registerDismissListener(mDialog);
            SystemUIDialog.setWindowOnTop(mDialog);
            mUiHandler.post(() -> mDialog.show());
            mUiHandler.post(() -> mDialog.show());
            registerReceiver();
            mHost.collapsePanels();
            mHost.collapsePanels();
        });
        });
    }
    }


    private void registerReceiver() {
        mContext.registerReceiverAsUser(mReceiver, UserHandle.CURRENT,
                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), null, null);
        mRegistered = true;
        mDialog.setOnDismissListener(dialog -> {
            if (mRegistered) {
                mContext.unregisterReceiver(mReceiver);
                mRegistered = false;
            }
        });
    }

    @Override
    @Override
    public CharSequence getTileLabel() {
    public CharSequence getTileLabel() {
        return mContext.getString(R.string.quick_settings_cast_title);
        return mContext.getString(R.string.quick_settings_cast_title);
@@ -223,15 +215,6 @@ public class CastTile extends QSTileImpl<BooleanState> {
        }
        }
    };
    };


    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (mDialog != null) {
                mDialog.dismiss();
            }
        }
    };

    private final class CastDetailAdapter implements DetailAdapter, QSDetailItems.Callback {
    private final class CastDetailAdapter implements DetailAdapter, QSDetailItems.Callback {
        private final LinkedHashMap<String, CastDevice> mVisibleOrder = new LinkedHashMap<>();
        private final LinkedHashMap<String, CastDevice> mVisibleOrder = new LinkedHashMap<>();


+13 −7
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.qs.tiles;
package com.android.systemui.qs.tiles;


import android.app.AlertDialog;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
@@ -25,6 +26,7 @@ import android.service.quicksettings.Tile;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
import android.widget.Switch;
import android.widget.Switch;


import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsLogger;
@@ -32,6 +34,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.net.DataUsageController;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.R.string;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSIconView;
@@ -101,11 +104,9 @@ public class CellularTile extends QSTileImpl<SignalState> {
    protected void handleClick() {
    protected void handleClick() {
        if (mDataController.isMobileDataEnabled()) {
        if (mDataController.isMobileDataEnabled()) {
            if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
            if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
                mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
                mActivityStarter.postQSRunnableDismissingKeyguard(this::showDisableDialog);
                    showDisableDialog();
                });
            } else {
            } else {
                showDisableDialog();
                mUiHandler.post(this::showDisableDialog);
            }
            }
        } else {
        } else {
            mDataController.setMobileDataEnabled(true);
            mDataController.setMobileDataEnabled(true);
@@ -114,13 +115,18 @@ public class CellularTile extends QSTileImpl<SignalState> {


    private void showDisableDialog() {
    private void showDisableDialog() {
        mHost.collapsePanels();
        mHost.collapsePanels();
        SystemUIDialog.applyFlags(new AlertDialog.Builder(mContext)
        AlertDialog dialog = new Builder(mContext)
                .setMessage(R.string.data_usage_disable_mobile)
                .setMessage(string.data_usage_disable_mobile)
                .setNegativeButton(android.R.string.cancel, null)
                .setNegativeButton(android.R.string.cancel, null)
                .setPositiveButton(
                .setPositiveButton(
                        com.android.internal.R.string.alert_windows_notification_turn_off_action,
                        com.android.internal.R.string.alert_windows_notification_turn_off_action,
                        (d, w) -> mDataController.setMobileDataEnabled(false))
                        (d, w) -> mDataController.setMobileDataEnabled(false))
                .create()).show();
                .create();
        dialog.getWindow().setType(LayoutParams.TYPE_KEYGUARD_DIALOG);
        SystemUIDialog.setShowForAllUsers(dialog, true);
        SystemUIDialog.registerDismissListener(dialog);
        SystemUIDialog.setWindowOnTop(dialog);
        dialog.show();
    }
    }


    @Override
    @Override
+39 −1
Original line number Original line Diff line number Diff line
@@ -17,10 +17,18 @@
package com.android.systemui.statusbar.phone;
package com.android.systemui.statusbar.phone;


import android.app.AlertDialog;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.UserHandle;
import android.view.WindowManager;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;


import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.KeyguardMonitor;


/**
/**
 * Base class for dialogs that should appear over panels and keyguard.
 * Base class for dialogs that should appear over panels and keyguard.
@@ -59,7 +67,7 @@ public class SystemUIDialog extends AlertDialog {
        setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
        setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
    }
    }


    public static void setShowForAllUsers(AlertDialog dialog, boolean show) {
    public static void setShowForAllUsers(Dialog dialog, boolean show) {
        if (show) {
        if (show) {
            dialog.getWindow().getAttributes().privateFlags |=
            dialog.getWindow().getAttributes().privateFlags |=
                    WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
                    WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
@@ -69,10 +77,40 @@ public class SystemUIDialog extends AlertDialog {
        }
        }
    }
    }


    public static void setWindowOnTop(Dialog dialog) {
        if (Dependency.get(KeyguardMonitor.class).isShowing()) {
            dialog.getWindow().setType(LayoutParams.TYPE_STATUS_BAR_PANEL);
        } else {
            dialog.getWindow().setType(LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
        }
    }

    public static AlertDialog applyFlags(AlertDialog dialog) {
    public static AlertDialog applyFlags(AlertDialog dialog) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
        dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
        dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        return dialog;
        return dialog;
    }
    }

    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();
                }
            }
        };
        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;
            }
        });
    }
}
}