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