• 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 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