• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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