15005244f10442e75c1f48973fdddce5facf3f360Adrian Roos/* 25005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * Copyright (C) 2014 The Android Open Source Project 35005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * 45005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * Licensed under the Apache License, Version 2.0 (the "License"); 55005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * you may not use this file except in compliance with the License. 65005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * You may obtain a copy of the License at 75005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * 85005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * http://www.apache.org/licenses/LICENSE-2.0 95005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * 105005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * Unless required by applicable law or agreed to in writing, software 115005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * distributed under the License is distributed on an "AS IS" BASIS, 125005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * See the License for the specific language governing permissions and 145005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * limitations under the License 155005244f10442e75c1f48973fdddce5facf3f360Adrian Roos */ 165005244f10442e75c1f48973fdddce5facf3f360Adrian Roos 175005244f10442e75c1f48973fdddce5facf3f360Adrian Roospackage com.android.systemui.statusbar.phone; 185005244f10442e75c1f48973fdddce5facf3f360Adrian Roos 195005244f10442e75c1f48973fdddce5facf3f360Adrian Roosimport android.app.AlertDialog; 209ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.app.Dialog; 219ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.content.BroadcastReceiver; 225005244f10442e75c1f48973fdddce5facf3f360Adrian Roosimport android.content.Context; 236be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikhimport android.content.DialogInterface; 249ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.content.Intent; 259ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.content.IntentFilter; 269ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.os.UserHandle; 275005244f10442e75c1f48973fdddce5facf3f360Adrian Roosimport android.view.WindowManager; 289ca184877e858782abde8c2ef3c011498845a55dJason Monkimport android.view.WindowManager.LayoutParams; 295005244f10442e75c1f48973fdddce5facf3f360Adrian Roos 309ca184877e858782abde8c2ef3c011498845a55dJason Monkimport com.android.systemui.Dependency; 31c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.R; 329ca184877e858782abde8c2ef3c011498845a55dJason Monkimport com.android.systemui.statusbar.policy.KeyguardMonitor; 33c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 346be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 355005244f10442e75c1f48973fdddce5facf3f360Adrian Roos/** 365005244f10442e75c1f48973fdddce5facf3f360Adrian Roos * Base class for dialogs that should appear over panels and keyguard. 375005244f10442e75c1f48973fdddce5facf3f360Adrian Roos */ 385005244f10442e75c1f48973fdddce5facf3f360Adrian Roospublic class SystemUIDialog extends AlertDialog { 395005244f10442e75c1f48973fdddce5facf3f360Adrian Roos 401bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock private final Context mContext; 411bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 425005244f10442e75c1f48973fdddce5facf3f360Adrian Roos public SystemUIDialog(Context context) { 435db8a4142e35d62073d81806ff7317e840e30ebcJason Monk this(context, R.style.Theme_SystemUI_Dialog); 445db8a4142e35d62073d81806ff7317e840e30ebcJason Monk } 455db8a4142e35d62073d81806ff7317e840e30ebcJason Monk 465db8a4142e35d62073d81806ff7317e840e30ebcJason Monk public SystemUIDialog(Context context, int theme) { 475db8a4142e35d62073d81806ff7317e840e30ebcJason Monk super(context, theme); 481bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock mContext = context; 491bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 5039c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk applyFlags(this); 515005244f10442e75c1f48973fdddce5facf3f360Adrian Roos WindowManager.LayoutParams attrs = getWindow().getAttributes(); 52351346092acdfbfcc1d9ebf98d539d2a1196c5e8John Spurlock attrs.setTitle(getClass().getSimpleName()); 535005244f10442e75c1f48973fdddce5facf3f360Adrian Roos getWindow().setAttributes(attrs); 54679dc2492ce1286a44c9dcd60e18dc97dd886a0aphweiss 55679dc2492ce1286a44c9dcd60e18dc97dd886a0aphweiss registerDismissListener(this); 565005244f10442e75c1f48973fdddce5facf3f360Adrian Roos } 571bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 581bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock public void setShowForAllUsers(boolean show) { 5939c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk setShowForAllUsers(this, show); 601bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock } 611bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 621bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock public void setMessage(int resId) { 631bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock setMessage(mContext.getString(resId)); 641bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock } 651bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 661bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock public void setPositiveButton(int resId, OnClickListener onClick) { 671bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock setButton(BUTTON_POSITIVE, mContext.getString(resId), onClick); 681bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock } 691bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock 701bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock public void setNegativeButton(int resId, OnClickListener onClick) { 711bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick); 721bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4John Spurlock } 7339c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk 7441d5ccf6edc2a29b082568134491594e35438e01Makoto Onuki public void setNeutralButton(int resId, OnClickListener onClick) { 7541d5ccf6edc2a29b082568134491594e35438e01Makoto Onuki setButton(BUTTON_NEUTRAL, mContext.getString(resId), onClick); 7641d5ccf6edc2a29b082568134491594e35438e01Makoto Onuki } 7741d5ccf6edc2a29b082568134491594e35438e01Makoto Onuki 789ca184877e858782abde8c2ef3c011498845a55dJason Monk public static void setShowForAllUsers(Dialog dialog, boolean show) { 7939c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk if (show) { 8039c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk dialog.getWindow().getAttributes().privateFlags |= 8139c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 8239c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } else { 8339c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk dialog.getWindow().getAttributes().privateFlags &= 8439c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk ~WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 8539c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } 8639c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } 8739c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk 889ca184877e858782abde8c2ef3c011498845a55dJason Monk public static void setWindowOnTop(Dialog dialog) { 899ca184877e858782abde8c2ef3c011498845a55dJason Monk if (Dependency.get(KeyguardMonitor.class).isShowing()) { 909ca184877e858782abde8c2ef3c011498845a55dJason Monk dialog.getWindow().setType(LayoutParams.TYPE_STATUS_BAR_PANEL); 919ca184877e858782abde8c2ef3c011498845a55dJason Monk } else { 929ca184877e858782abde8c2ef3c011498845a55dJason Monk dialog.getWindow().setType(LayoutParams.TYPE_STATUS_BAR_SUB_PANEL); 939ca184877e858782abde8c2ef3c011498845a55dJason Monk } 949ca184877e858782abde8c2ef3c011498845a55dJason Monk } 959ca184877e858782abde8c2ef3c011498845a55dJason Monk 9654ff0efbd5e9469793821cb3856a6fd5afd6fd67Jason Monk public static AlertDialog applyFlags(AlertDialog dialog) { 9739c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL); 9839c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM 9939c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 10054ff0efbd5e9469793821cb3856a6fd5afd6fd67Jason Monk return dialog; 10139c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } 1029ca184877e858782abde8c2ef3c011498845a55dJason Monk 1039ca184877e858782abde8c2ef3c011498845a55dJason Monk public static void registerDismissListener(Dialog dialog) { 1046be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh DismissReceiver dismissReceiver = new DismissReceiver(dialog); 1056be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh dismissReceiver.register(); 1069ca184877e858782abde8c2ef3c011498845a55dJason Monk } 1076be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1086be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh private static class DismissReceiver extends BroadcastReceiver implements OnDismissListener { 1096be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh private static final IntentFilter INTENT_FILTER = new IntentFilter(); 1106be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh static { 1116be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh INTENT_FILTER.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 1126be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh INTENT_FILTER.addAction(Intent.ACTION_SCREEN_OFF); 1136be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1146be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1156be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh private final Dialog mDialog; 1166be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh private boolean mRegistered; 1176be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1186be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh DismissReceiver(Dialog dialog) { 1196be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mDialog = dialog; 1206be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1216be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1226be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh void register() { 1236be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mDialog.getContext() 1246be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh .registerReceiverAsUser(this, UserHandle.CURRENT, INTENT_FILTER, null, null); 1256be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mRegistered = true; 1266be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1276be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1286be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh @Override 1296be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh public void onReceive(Context context, Intent intent) { 1306be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mDialog.dismiss(); 1316be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1326be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh 1336be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh @Override 1346be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh public void onDismiss(DialogInterface dialog) { 1356be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh if (mRegistered) { 1366be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mDialog.getContext().unregisterReceiver(this); 1376be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh mRegistered = false; 1386be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1396be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh } 1406be5368b67f8b6bee2be56373f97df7969bb97a2Amin Shaikh }} 141