diff options
3 files changed, 58 insertions, 31 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index f0d7d6c87833..2fc9fc7b09b0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -34,6 +34,7 @@ import android.view.View.OnAttachStateChangeListener; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.widget.Button; 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.QSHost; 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.CastDevice; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -139,25 +141,15 @@ public class CastTile extends QSTileImpl<BooleanState> { Dependency.get(ActivityStarter.class) .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()); - registerReceiver(); 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 public CharSequence getTileLabel() { 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 LinkedHashMap<String, CastDevice> mVisibleOrder = new LinkedHashMap<>(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 1e78e650bbf9..0e0f949ce42f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -17,6 +17,7 @@ package com.android.systemui.qs.tiles; import android.app.AlertDialog; +import android.app.AlertDialog.Builder; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -27,12 +28,14 @@ import android.service.quicksettings.Tile; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager.LayoutParams; import android.widget.Switch; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.net.DataUsageController; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.R.string; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSIconView; @@ -111,11 +114,9 @@ public class CellularTile extends QSTileImpl<SignalState> { protected void handleClick() { if (mDataController.isMobileDataEnabled()) { if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) { - mActivityStarter.postQSRunnableDismissingKeyguard(() -> { - showDisableDialog(); - }); + mActivityStarter.postQSRunnableDismissingKeyguard(this::showDisableDialog); } else { - showDisableDialog(); + mUiHandler.post(this::showDisableDialog); } } else { mDataController.setMobileDataEnabled(true); @@ -124,13 +125,18 @@ public class CellularTile extends QSTileImpl<SignalState> { private void showDisableDialog() { mHost.collapsePanels(); - SystemUIDialog.applyFlags(new AlertDialog.Builder(mContext) - .setMessage(R.string.data_usage_disable_mobile) + AlertDialog dialog = new Builder(mContext) + .setMessage(string.data_usage_disable_mobile) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton( com.android.internal.R.string.alert_windows_notification_turn_off_action, (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 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java index 7b6725bfa392..9b0179dc4552 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java @@ -17,10 +17,18 @@ package com.android.systemui.statusbar.phone; import android.app.AlertDialog; +import android.app.Dialog; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.UserHandle; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; +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. @@ -59,7 +67,7 @@ public class SystemUIDialog extends AlertDialog { 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) { dialog.getWindow().getAttributes().privateFlags |= 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) { dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL); dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 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; + } + }); + } } |