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.datetime; 18 19 import static android.app.time.Capabilities.CAPABILITY_NOT_ALLOWED; 20 import static android.app.time.Capabilities.CAPABILITY_NOT_APPLICABLE; 21 import static android.app.time.Capabilities.CAPABILITY_NOT_SUPPORTED; 22 import static android.app.time.Capabilities.CAPABILITY_POSSESSED; 23 24 import android.app.time.TimeCapabilities; 25 import android.app.time.TimeCapabilitiesAndConfig; 26 import android.app.time.TimeConfiguration; 27 import android.app.time.TimeManager; 28 import android.content.Context; 29 30 import androidx.preference.Preference; 31 import androidx.preference.SwitchPreference; 32 33 import com.android.internal.annotations.VisibleForTesting; 34 import com.android.settings.core.PreferenceControllerMixin; 35 import com.android.settingslib.core.AbstractPreferenceController; 36 37 public class AutoTimePreferenceController extends AbstractPreferenceController 38 implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener { 39 40 private static final String KEY_AUTO_TIME = "auto_time"; 41 private final UpdateTimeAndDateCallback mCallback; 42 private final TimeManager mTimeManager; 43 AutoTimePreferenceController(Context context, UpdateTimeAndDateCallback callback)44 public AutoTimePreferenceController(Context context, UpdateTimeAndDateCallback callback) { 45 super(context); 46 mTimeManager = context.getSystemService(TimeManager.class); 47 mCallback = callback; 48 } 49 50 @Override isAvailable()51 public boolean isAvailable() { 52 TimeCapabilities timeCapabilities = 53 getTimeCapabilitiesAndConfig().getCapabilities(); 54 int capability = timeCapabilities.getConfigureAutoDetectionEnabledCapability(); 55 56 // The preference has three states: visible, not visible, and visible but disabled. 57 // This method handles the "is visible?" check. 58 switch (capability) { 59 case CAPABILITY_NOT_SUPPORTED: 60 return false; 61 case CAPABILITY_POSSESSED: 62 return true; 63 case CAPABILITY_NOT_ALLOWED: 64 // This case is expected for enterprise restrictions, where the toggle should be 65 // present but disabled. Disabling is handled declaratively via the 66 // settings:userRestriction attribute in .xml. The client-side logic is expected to 67 // concur with the capabilities logic in the system server. 68 return true; 69 case CAPABILITY_NOT_APPLICABLE: 70 // CAPABILITY_NOT_APPLICABLE is not currently expected, so this is return value is 71 // arbitrary. 72 return true; 73 default: 74 throw new IllegalStateException("Unknown capability=" + capability); 75 } 76 } 77 78 @Override updateState(Preference preference)79 public void updateState(Preference preference) { 80 if (!(preference instanceof SwitchPreference)) { 81 return; 82 } 83 84 ((SwitchPreference) preference).setChecked(isEnabled()); 85 } 86 87 @Override getPreferenceKey()88 public String getPreferenceKey() { 89 return KEY_AUTO_TIME; 90 } 91 92 @Override onPreferenceChange(Preference preference, Object newValue)93 public boolean onPreferenceChange(Preference preference, Object newValue) { 94 boolean autoTimeEnabled = (Boolean) newValue; 95 TimeConfiguration configuration = new TimeConfiguration.Builder() 96 .setAutoDetectionEnabled(autoTimeEnabled) 97 .build(); 98 boolean result = mTimeManager.updateTimeConfiguration(configuration); 99 100 mCallback.updateTimeAndDateDisplay(mContext); 101 return result; 102 } 103 104 /** Returns whether the preference should be "checked", i.e. set to the "on" position. */ 105 @VisibleForTesting isEnabled()106 public boolean isEnabled() { 107 TimeConfiguration config = getTimeCapabilitiesAndConfig().getConfiguration(); 108 return config.isAutoDetectionEnabled(); 109 } 110 getTimeCapabilitiesAndConfig()111 private TimeCapabilitiesAndConfig getTimeCapabilitiesAndConfig() { 112 return mTimeManager.getTimeCapabilitiesAndConfig(); 113 } 114 } 115