Files
app_Settings/src/com/android/settings/location/TimeZoneDetectionPreferenceController.java
Neil Fuller 4a6663c10a Changes to location settings for geotz
This change adds a new entry for geolocation-based time zone detection
(shorthand: "geotz") to the location settings.

The UI code uses information retrieved via the TimeManager API to keep
the conditional logic in one place, i.e. to avoid the UI needing to know
too much about the various conditions that affect the availability /
applicability of the toggle.

Screen variations / conditions / other info:

Location settings screen:

1) The entry only shows up on a device at all if geotz detection is
enabled for the device (currently a compile time setting, off by
default).
2) The new entry is hidden on the screen when the user first opens it.
To see it, the user has to expand "Advanced". The setting is in the
shared (non-GMS) section of the screen.
3) When visible, the entry has a summary that shows the current status:
either a reason why the setting is not applicable, or the user's current
setting value.
4) Selecting the entry opens a sub-screen.

The code included here distinguishes between different cases with the
summary message (i.e. the text underneath the entry). See strings.xml
for the placeholder text. Some strings will not show up currently, but
are included in case the rules change as they are valid possibilities
from the TimeManager API.

The same changes have been made for the "personal" tab when a work
profile is enabled.

Location Time Zone Detection settings screen:

1) The toggle is always enabled and always shows the user's current
configuration setting.

All manual tests run with the geotz feature enabled with:

adb shell setprop \
    persist.sys.location_time_zone_detection_feature_enabled 1

Bug: 152746236
Test: Manual: build / boot / toggle switch in SettingsUI / inspect output of adb shell dumpsys time_zone_detector
Test: Manual: build / boot / install TestDPC / toggle switch in work profile in SettingsUI / inspect output of adb shell dumpsys time_zone_detector
Test: m -j30 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.location.TimeZoneDetectionPreferenceControllerTest"
Test: m -j30 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.location.LocationTimeZoneDetectionPreferenceControllerTest"
Test: m -j30 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.location.TimeZoneDetectionSettingsTest"
Change-Id: Ia853d30bc54a113000b30f48776418f262d98358
2020-10-22 15:48:55 +01:00

98 lines
3.6 KiB
Java

/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.location;
import android.app.time.TimeManager;
import android.app.time.TimeZoneCapabilitiesAndConfig;
import android.app.time.TimeZoneConfiguration;
import android.content.Context;
import android.text.TextUtils;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settingslib.core.AbstractPreferenceController;
/**
* The controller for the "location time zone detection" switch on the location time zone detection
* screen.
*/
public class TimeZoneDetectionPreferenceController extends AbstractPreferenceController {
private static final String KEY_LOCATION_TIME_ZONE_DETECTION_ENABLED =
"location_time_zone_detection_enabled";
private final TimeManager mTimeManager;
public TimeZoneDetectionPreferenceController(Context context) {
super(context);
mTimeManager = context.getSystemService(TimeManager.class);
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return KEY_LOCATION_TIME_ZONE_DETECTION_ENABLED;
}
@Override
public void updateState(Preference preference) {
TimeZoneCapabilitiesAndConfig capabilitiesAndConfig =
mTimeManager.getTimeZoneCapabilitiesAndConfig();
setPreferenceUiState((SwitchPreference) preference, capabilitiesAndConfig);
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (TextUtils.equals(preference.getKey(), KEY_LOCATION_TIME_ZONE_DETECTION_ENABLED)) {
SwitchPreference switchPreference = (SwitchPreference) preference;
final boolean switchState = switchPreference.isChecked();
// Update the settings to match the UI.
TimeZoneConfiguration configuration = new TimeZoneConfiguration.Builder()
.setGeoDetectionEnabled(switchState)
.build();
// The return value is ignored, but the current state is read back below ensuring it
// does not matter.
mTimeManager.updateTimeZoneConfiguration(configuration);
// Configure the UI preference state from the configuration. This means that even in the
// unlikely event that the update failed, the UI should reflect current settings.
setPreferenceUiState(switchPreference, mTimeManager.getTimeZoneCapabilitiesAndConfig());
return true;
}
return false;
}
/**
* Sets the switch's checked state from the supplied {@link TimeZoneCapabilitiesAndConfig}.
*/
@android.annotation.UiThread
private void setPreferenceUiState(SwitchPreference preference,
TimeZoneCapabilitiesAndConfig timeZoneCapabilitiesAndConfig) {
TimeZoneConfiguration configuration = timeZoneCapabilitiesAndConfig.getConfiguration();
boolean checked = configuration.isGeoDetectionEnabled();
preference.setChecked(checked);
}
}