1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings; 18 19 import android.app.AlertDialog; 20 import android.app.Dialog; 21 import android.app.admin.DevicePolicyManager; 22 import android.content.Context; 23 import android.content.DialogInterface; 24 import android.util.AttributeSet; 25 import android.view.View; 26 27 import com.android.settingslib.RestrictedLockUtils; 28 29 import java.util.ArrayList; 30 31 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 32 33 public class TimeoutListPreference extends RestrictedListPreference { 34 private EnforcedAdmin mAdmin; 35 private final CharSequence[] mInitialEntries; 36 private final CharSequence[] mInitialValues; 37 TimeoutListPreference(Context context, AttributeSet attrs)38 public TimeoutListPreference(Context context, AttributeSet attrs) { 39 super(context, attrs); 40 mInitialEntries = getEntries(); 41 mInitialValues = getEntryValues(); 42 } 43 44 @Override onPrepareDialogBuilder(AlertDialog.Builder builder, DialogInterface.OnClickListener listener)45 protected void onPrepareDialogBuilder(AlertDialog.Builder builder, 46 DialogInterface.OnClickListener listener) { 47 super.onPrepareDialogBuilder(builder, listener); 48 if (mAdmin != null) { 49 builder.setView(R.layout.admin_disabled_other_options_footer); 50 } else { 51 builder.setView(null); 52 } 53 } 54 55 @Override onDialogCreated(Dialog dialog)56 protected void onDialogCreated(Dialog dialog) { 57 super.onDialogCreated(dialog); 58 dialog.create(); 59 if (mAdmin != null) { 60 View footerView = dialog.findViewById(R.id.admin_disabled_other_options); 61 footerView.findViewById(R.id.admin_more_details_link).setOnClickListener( 62 new View.OnClickListener() { 63 @Override 64 public void onClick(View view) { 65 RestrictedLockUtils.sendShowAdminSupportDetailsIntent( 66 getContext(), mAdmin); 67 } 68 }); 69 } 70 } 71 removeUnusableTimeouts(long maxTimeout, EnforcedAdmin admin)72 public void removeUnusableTimeouts(long maxTimeout, EnforcedAdmin admin) { 73 final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService( 74 Context.DEVICE_POLICY_SERVICE); 75 if (dpm == null) { 76 return; 77 } 78 79 if (admin == null && mAdmin == null && !isDisabledByAdmin()) { 80 return; 81 } 82 if (admin == null) { 83 maxTimeout = Long.MAX_VALUE; 84 } 85 86 ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>(); 87 ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>(); 88 for (int i = 0; i < mInitialValues.length; ++i) { 89 long timeout = Long.parseLong(mInitialValues[i].toString()); 90 if (timeout <= maxTimeout) { 91 revisedEntries.add(mInitialEntries[i]); 92 revisedValues.add(mInitialValues[i]); 93 } 94 } 95 96 // If there are no possible options for the user, then set this preference as disabled 97 // by admin, otherwise remove the padlock in case it was set earlier. 98 if (revisedValues.size() == 0) { 99 setDisabledByAdmin(admin); 100 return; 101 } else { 102 setDisabledByAdmin(null); 103 } 104 105 if (revisedEntries.size() != getEntries().length) { 106 final int userPreference = Integer.parseInt(getValue()); 107 setEntries(revisedEntries.toArray(new CharSequence[0])); 108 setEntryValues(revisedValues.toArray(new CharSequence[0])); 109 mAdmin = admin; 110 if (userPreference <= maxTimeout) { 111 setValue(String.valueOf(userPreference)); 112 } else if (revisedValues.size() > 0 113 && Long.parseLong(revisedValues.get(revisedValues.size() - 1).toString()) 114 == maxTimeout) { 115 // If the last one happens to be the same as the max timeout, select that 116 setValue(String.valueOf(maxTimeout)); 117 } else { 118 // There will be no highlighted selection since nothing in the list matches 119 // maxTimeout. The user can still select anything less than maxTimeout. 120 // TODO: maybe append maxTimeout to the list and mark selected. 121 } 122 } 123 } 124 }