1900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka/*
2900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * Copyright (C) 2016 The Android Open Source Project
3900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka *
4900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
5900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * you may not use this file except in compliance with the License.
6900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * You may obtain a copy of the License at
7900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka *
8900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
9900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka *
10900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * Unless required by applicable law or agreed to in writing, software
11900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
12900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * See the License for the specific language governing permissions and
14900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka * limitations under the License.
15900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka */
16900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
17900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankapackage com.android.settings;
18900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
19900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.app.AlertDialog;
20900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.app.Dialog;
21900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.app.admin.DevicePolicyManager;
22900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.content.Context;
23900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.content.DialogInterface;
24900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.util.AttributeSet;
25900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport android.view.View;
26900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
27900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
28900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
29900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport java.util.ArrayList;
30900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
31900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
32900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
33900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shankapublic class TimeoutListPreference extends RestrictedListPreference {
34900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    private EnforcedAdmin mAdmin;
35900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    private final CharSequence[] mInitialEntries;
36900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    private final CharSequence[] mInitialValues;
37900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
38900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    public TimeoutListPreference(Context context, AttributeSet attrs) {
39900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        super(context, attrs);
40900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        mInitialEntries = getEntries();
41900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        mInitialValues = getEntryValues();
42900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    }
43900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
44900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    @Override
45900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
46900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            DialogInterface.OnClickListener listener) {
47900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        super.onPrepareDialogBuilder(builder, listener);
48900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (mAdmin != null) {
49900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            builder.setView(R.layout.admin_disabled_other_options_footer);
50900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        } else {
51900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            builder.setView(null);
52900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
53900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    }
54900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
55900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    @Override
56900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    protected void onDialogCreated(Dialog dialog) {
57900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        super.onDialogCreated(dialog);
58900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        dialog.create();
59900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (mAdmin != null) {
60900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            View footerView = dialog.findViewById(R.id.admin_disabled_other_options);
61900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            footerView.findViewById(R.id.admin_more_details_link).setOnClickListener(
62900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                    new View.OnClickListener() {
63900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                        @Override
64900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                        public void onClick(View view) {
65900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
66900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                                    getContext(), mAdmin);
67900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                        }
68900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                    });
69900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
70900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    }
71900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
72900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    public void removeUnusableTimeouts(long maxTimeout, EnforcedAdmin admin) {
73900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
74900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                Context.DEVICE_POLICY_SERVICE);
75900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (dpm == null) {
76900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            return;
77900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
78900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
79900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (admin == null && mAdmin == null && !isDisabledByAdmin()) {
80900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            return;
81900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
82900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (admin == null) {
83900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            maxTimeout = Long.MAX_VALUE;
84900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
85900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
86900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
87900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
88900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        for (int i = 0; i < mInitialValues.length; ++i) {
89900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            long timeout = Long.parseLong(mInitialValues[i].toString());
90900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            if (timeout <= maxTimeout) {
91900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                revisedEntries.add(mInitialEntries[i]);
92900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                revisedValues.add(mInitialValues[i]);
93900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            }
94900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
95900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
96900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        // If there are no possible options for the user, then set this preference as disabled
97900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        // by admin, otherwise remove the padlock in case it was set earlier.
98900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (revisedValues.size() == 0) {
99900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            setDisabledByAdmin(admin);
100900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            return;
101900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        } else {
102900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            setDisabledByAdmin(null);
103900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
104900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka
105900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        if (revisedEntries.size() != getEntries().length) {
106900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            final int userPreference = Integer.parseInt(getValue());
107900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            setEntries(revisedEntries.toArray(new CharSequence[0]));
108900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            setEntryValues(revisedValues.toArray(new CharSequence[0]));
109900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            mAdmin = admin;
110900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            if (userPreference <= maxTimeout) {
111900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                setValue(String.valueOf(userPreference));
112900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            } else if (revisedValues.size() > 0
113900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                    && Long.parseLong(revisedValues.get(revisedValues.size() - 1).toString())
114900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                            == maxTimeout) {
115900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // If the last one happens to be the same as the max timeout, select that
116900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                setValue(String.valueOf(maxTimeout));
117900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            } else {
118900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // There will be no highlighted selection since nothing in the list matches
119900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // maxTimeout. The user can still select anything less than maxTimeout.
120900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // TODO: maybe append maxTimeout to the list and mark selected.
121900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            }
122900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        }
123900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka    }
124900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka}