Home | History | Annotate | Download | only in settings
      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 
     38     public TimeoutListPreference(Context context, AttributeSet attrs) {
     39         super(context, attrs);
     40         mInitialEntries = getEntries();
     41         mInitialValues = getEntryValues();
     42     }
     43 
     44     @Override
     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
     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 
     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 }