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}