1d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos/*
2d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * Copyright (C) 2016 The Android Open Source Project
3d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos *
4d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * Licensed under the Apache License, Version 2.0 (the "License");
5d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * you may not use this file except in compliance with the License.
6d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * You may obtain a copy of the License at
7d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos *
8d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos *      http://www.apache.org/licenses/LICENSE-2.0
9d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos *
10d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * Unless required by applicable law or agreed to in writing, software
11d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * distributed under the License is distributed on an "AS IS" BASIS,
12d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * See the License for the specific language governing permissions and
14d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos * limitations under the License
15d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos */
16d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
17d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roospackage com.android.settings.notification;
18d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
19d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport com.android.settings.R;
20d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport com.android.settings.RestrictedListPreference;
21af67c3b57677d7680d094575a85ad160f739dfafRicky Waiimport com.android.settings.Utils;
22059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roosimport com.android.settingslib.RestrictedLockUtils;
23d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
24d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.app.AlertDialog;
25d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.app.Dialog;
26d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.content.Context;
27d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.content.DialogInterface;
284bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roosimport android.os.Bundle;
29af67c3b57677d7680d094575a85ad160f739dfafRicky Waiimport android.os.UserHandle;
30af67c3b57677d7680d094575a85ad160f739dfafRicky Waiimport android.os.UserManager;
31d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.provider.Settings;
32d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.util.AttributeSet;
33d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.view.View;
34d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.widget.CheckBox;
35d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.widget.CompoundButton;
36059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roosimport android.widget.ImageView;
37d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roosimport android.widget.ListAdapter;
3854dc9d52d0f35843510dbd7dbc8951389bb85039Sudheer Shankaimport android.widget.ListView;
39d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
40d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roospublic class NotificationLockscreenPreference extends RestrictedListPreference {
41d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
42d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    private boolean mAllowRemoteInput;
43d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    private Listener mListener;
44d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    private boolean mShowRemoteInput;
459b753da2b73de4b54785298658a65331747468e2Ricky Wai    private boolean mRemoteInputCheckBoxEnabled = true;
46af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    private int mUserId = UserHandle.myUserId();
47059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos    private RestrictedLockUtils.EnforcedAdmin mAdminRestrictingRemoteInput;
48d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
49d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    public NotificationLockscreenPreference(Context context, AttributeSet attrs) {
50d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        super(context, attrs);
51d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
52d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
539b753da2b73de4b54785298658a65331747468e2Ricky Wai    public void setRemoteInputCheckBoxEnabled(boolean enabled) {
549b753da2b73de4b54785298658a65331747468e2Ricky Wai        mRemoteInputCheckBoxEnabled = enabled;
559b753da2b73de4b54785298658a65331747468e2Ricky Wai    }
569b753da2b73de4b54785298658a65331747468e2Ricky Wai
57059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos    public void setRemoteInputRestricted(RestrictedLockUtils.EnforcedAdmin admin) {
58059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        mAdminRestrictingRemoteInput = admin;
59059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos    }
60059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos
61d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    @Override
62af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    protected void onClick() {
63af67c3b57677d7680d094575a85ad160f739dfafRicky Wai        final Context context = getContext();
64af67c3b57677d7680d094575a85ad160f739dfafRicky Wai        if (!Utils.startQuietModeDialogIfNecessary(context, UserManager.get(context), mUserId)) {
65af67c3b57677d7680d094575a85ad160f739dfafRicky Wai            // Call super to create preference dialog only when work mode is on
66af67c3b57677d7680d094575a85ad160f739dfafRicky Wai            // startQuietModeDialogIfNecessary will return false if mUserId is not a managed user
67af67c3b57677d7680d094575a85ad160f739dfafRicky Wai            super.onClick();
68af67c3b57677d7680d094575a85ad160f739dfafRicky Wai        }
69af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    }
70af67c3b57677d7680d094575a85ad160f739dfafRicky Wai
71af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    public void setUserId(int userId) {
72af67c3b57677d7680d094575a85ad160f739dfafRicky Wai        mUserId = userId;
73af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    }
74af67c3b57677d7680d094575a85ad160f739dfafRicky Wai
75af67c3b57677d7680d094575a85ad160f739dfafRicky Wai    @Override
76d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
77d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            DialogInterface.OnClickListener innerListener) {
78d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
79d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        mListener = new Listener(innerListener);
804bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos        builder.setSingleChoiceItems(createListAdapter(), getSelectedValuePos(), mListener);
81d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        mShowRemoteInput = getEntryValues().length == 3;
82d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        mAllowRemoteInput = Settings.Secure.getInt(getContext().getContentResolver(),
83d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos                Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, 0) != 0;
84d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        builder.setView(R.layout.lockscreen_remote_input);
85d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
86d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
87d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    @Override
88d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    protected void onDialogCreated(Dialog dialog) {
89d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        super.onDialogCreated(dialog);
90d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        dialog.create();
91059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        CheckBox checkbox = (CheckBox) dialog.findViewById(R.id.lockscreen_remote_input);
92059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        checkbox.setChecked(!mAllowRemoteInput);
93059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        checkbox.setOnCheckedChangeListener(mListener);
94059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        checkbox.setEnabled(mAdminRestrictingRemoteInput == null);
95059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos
96059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        View restricted = dialog.findViewById(R.id.restricted_lock_icon_remote_input);
97059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        restricted.setVisibility(mAdminRestrictingRemoteInput == null ? View.GONE : View.VISIBLE);
98059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos
99059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        if (mAdminRestrictingRemoteInput != null) {
100059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos            checkbox.setClickable(false);
101059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos            dialog.findViewById(com.android.internal.R.id.customPanel)
102059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos                    .setOnClickListener(mListener);
103059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        }
1044bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos    }
1054bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos
1064bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos    @Override
1074bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos    protected void onDialogStateRestored(Dialog dialog, Bundle savedInstanceState) {
1084bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos        super.onDialogStateRestored(dialog, savedInstanceState);
1094bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos        ListView listView = ((AlertDialog) dialog).getListView();
1104bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos        int selectedPosition = listView.getCheckedItemPosition();
1114bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos
112d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        View panel = dialog.findViewById(com.android.internal.R.id.customPanel);
1134bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos        panel.setVisibility(checkboxVisibilityForSelectedIndex(selectedPosition,
1144bd42073d4b373db2951e86fbc8daa3afc8f40afAdrian Roos                mShowRemoteInput));
115d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        mListener.setView(panel);
116d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
117d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
118d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    @Override
119d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    protected ListAdapter createListAdapter() {
120d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        return new RestrictedArrayAdapter(getContext(), getEntries(), -1);
121d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
122d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
123d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    @Override
124d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    protected void onDialogClosed(boolean positiveResult) {
125d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        super.onDialogClosed(positiveResult);
126d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        Settings.Secure.putInt(getContext().getContentResolver(),
127d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos                Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, mAllowRemoteInput ? 1 : 0);
128d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
129d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
130d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    @Override
131d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    protected boolean isAutoClosePreference() {
132d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        return false;
133d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
134d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
1359b753da2b73de4b54785298658a65331747468e2Ricky Wai    private int checkboxVisibilityForSelectedIndex(int selected,
1369b753da2b73de4b54785298658a65331747468e2Ricky Wai            boolean showRemoteAtAll) {
1379b753da2b73de4b54785298658a65331747468e2Ricky Wai        return selected == 1 && showRemoteAtAll && mRemoteInputCheckBoxEnabled ? View.VISIBLE
1389b753da2b73de4b54785298658a65331747468e2Ricky Wai                : View.GONE;
139d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
140d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
141d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    private class Listener implements DialogInterface.OnClickListener,
142059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos            CompoundButton.OnCheckedChangeListener, View.OnClickListener {
143d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
144d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        private final DialogInterface.OnClickListener mInner;
145d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        private View mView;
146d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
147d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        public Listener(DialogInterface.OnClickListener inner) {
148d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            mInner = inner;
149d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        }
150d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
151d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        @Override
152d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        public void onClick(DialogInterface dialog, int which) {
153d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            mInner.onClick(dialog, which);
15454dc9d52d0f35843510dbd7dbc8951389bb85039Sudheer Shanka            ListView listView = ((AlertDialog) dialog).getListView();
15554dc9d52d0f35843510dbd7dbc8951389bb85039Sudheer Shanka            int selectedPosition = listView.getCheckedItemPosition();
156d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            if (mView != null) {
15754dc9d52d0f35843510dbd7dbc8951389bb85039Sudheer Shanka                mView.setVisibility(
15854dc9d52d0f35843510dbd7dbc8951389bb85039Sudheer Shanka                        checkboxVisibilityForSelectedIndex(selectedPosition, mShowRemoteInput));
159d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            }
160d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        }
161d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
162d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        @Override
163d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
164e6d60877b201e911752f74db556c44db6c4838d7Adrian Roos            mAllowRemoteInput = !isChecked;
165d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        }
166d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos
167d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        public void setView(View view) {
168d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos            mView = view;
169d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos        }
170059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos
171059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        @Override
172059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        public void onClick(View v) {
173059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos            if (v.getId() == com.android.internal.R.id.customPanel) {
174059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos                RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
175059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos                        mAdminRestrictingRemoteInput);
176059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos            }
177059b0fa060b8805c6c6199ccd9a4e13e64ad6995Adrian Roos        }
178d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos    }
179d553f4f9a94a16bb19463fb42294212dbc21c09aAdrian Roos}
180