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 import android.util.Log; 30 31 import androidx.preference.Preference; 32 33 import com.android.internal.annotations.VisibleForTesting; 34 import com.android.settings.R; 35 import com.android.settings.core.TogglePreferenceController; 36 37 public class AutoTimePreferenceController extends TogglePreferenceController { 38 39 private static final String TAG = "AutoTimePreferenceController"; 40 41 private UpdateTimeAndDateCallback mCallback; 42 private final TimeManager mTimeManager; 43 AutoTimePreferenceController(Context context, String preferenceKey)44 public AutoTimePreferenceController(Context context, String preferenceKey) { 45 super(context, preferenceKey); 46 mTimeManager = context.getSystemService(TimeManager.class); 47 // This is a no-op implementation of UpdateTimeAndDateCallback to avoid a NPE when 48 // setTimeAndDateCallback() isn't called, e.g. for slices and other cases where the 49 // controller is instantiated outside of the context of the real Date & Time settings 50 // screen. 51 mCallback = (c) -> {}; 52 } 53 setDateAndTimeCallback(UpdateTimeAndDateCallback callback)54 public void setDateAndTimeCallback(UpdateTimeAndDateCallback callback) { 55 mCallback = callback; 56 } 57 58 @Override getAvailabilityStatus()59 public int getAvailabilityStatus() { 60 TimeCapabilities timeCapabilities = 61 getTimeCapabilitiesAndConfig().getCapabilities(); 62 int capability = timeCapabilities.getConfigureAutoDetectionEnabledCapability(); 63 64 // The preference has three states: visible, not visible, and visible but disabled. 65 // This method handles the "is visible?" check. 66 switch (capability) { 67 case CAPABILITY_NOT_SUPPORTED: 68 return DISABLED_DEPENDENT_SETTING; 69 case CAPABILITY_POSSESSED: 70 case CAPABILITY_NOT_ALLOWED: 71 // This case is expected for enterprise restrictions, where the toggle should be 72 // present but disabled. Disabling is handled declaratively via the 73 // settings:userRestriction attribute in .xml. The client-side logic is expected to 74 // concur with the capabilities logic in the system server. 75 case CAPABILITY_NOT_APPLICABLE: 76 // CAPABILITY_NOT_APPLICABLE is not currently expected, so this is return value is 77 // arbitrary. 78 return AVAILABLE; 79 default: 80 Log.e(TAG, "Unknown capability=" + capability); 81 return UNSUPPORTED_ON_DEVICE; 82 } 83 } 84 85 @Override updateState(Preference preference)86 public void updateState(Preference preference) { 87 super.updateState(preference); 88 refreshSummary(preference); 89 } 90 91 @Override getSummary()92 public CharSequence getSummary() { 93 return mContext.getString(R.string.date_time_auto_summary); 94 } 95 96 @Override isChecked()97 public boolean isChecked() { 98 return isEnabled(); 99 } 100 101 @Override setChecked(boolean isChecked)102 public boolean setChecked(boolean isChecked) { 103 TimeConfiguration configuration = new TimeConfiguration.Builder() 104 .setAutoDetectionEnabled(isChecked) 105 .build(); 106 boolean result = mTimeManager.updateTimeConfiguration(configuration); 107 108 mCallback.updateTimeAndDateDisplay(mContext); 109 return result; 110 } 111 112 @Override getSliceHighlightMenuRes()113 public int getSliceHighlightMenuRes() { 114 return R.string.menu_key_system; 115 } 116 117 /** Returns whether the preference should be "checked", i.e. set to the "on" position. */ 118 @VisibleForTesting isEnabled()119 public boolean isEnabled() { 120 TimeConfiguration config = getTimeCapabilitiesAndConfig().getConfiguration(); 121 return config.isAutoDetectionEnabled(); 122 } 123 getTimeCapabilitiesAndConfig()124 private TimeCapabilitiesAndConfig getTimeCapabilitiesAndConfig() { 125 return mTimeManager.getTimeCapabilitiesAndConfig(); 126 } 127 } 128