Merge "Add "Use location" state to TimeZoneCapabilities"

This commit is contained in:
Neil Fuller
2023-01-31 15:57:43 +00:00
committed by Android (Google) Code Review
6 changed files with 150 additions and 92 deletions

View File

@@ -19,10 +19,12 @@ import android.app.time.DetectorStatusTypes;
import android.app.time.LocationTimeZoneAlgorithmStatus;
import android.app.time.TelephonyTimeZoneAlgorithmStatus;
import android.app.time.TimeManager;
import android.app.time.TimeZoneCapabilities;
import android.app.time.TimeZoneCapabilitiesAndConfig;
import android.app.time.TimeZoneDetectorStatus;
import android.content.Context;
import android.location.LocationManager;
import android.service.timezone.TimeZoneProviderStatus;
import android.service.timezone.TimeZoneProviderStatus.DependencyStatus;
import android.text.TextUtils;
import androidx.annotation.Nullable;
@@ -43,14 +45,12 @@ import java.util.concurrent.Executor;
public class LocationProviderStatusPreferenceController
extends BasePreferenceController implements TimeManager.TimeZoneDetectorListener {
private final TimeManager mTimeManager;
private final LocationManager mLocationManager;
private BannerMessagePreference mPreference = null;
public LocationProviderStatusPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mTimeManager = context.getSystemService(TimeManager.class);
mLocationManager = context.getSystemService(LocationManager.class);
Executor mainExecutor = context.getMainExecutor();
mTimeManager.addTimeZoneDetectorListener(mainExecutor, this);
@@ -123,11 +123,15 @@ public class LocationProviderStatusPreferenceController
@Override
public CharSequence getSummary() {
boolean locationEnabled = mLocationManager.isLocationEnabled();
final TimeZoneCapabilitiesAndConfig timeZoneCapabilitiesAndConfig =
mTimeManager.getTimeZoneCapabilitiesAndConfig();
final TimeZoneDetectorStatus detectorStatus =
mTimeManager.getTimeZoneCapabilitiesAndConfig().getDetectorStatus();
timeZoneCapabilitiesAndConfig.getDetectorStatus();
final TimeZoneCapabilities timeZoneCapabilities =
timeZoneCapabilitiesAndConfig.getCapabilities();
if (!locationEnabled && hasLocationTimeZoneNoTelephonyFallback(detectorStatus)) {
if (!timeZoneCapabilities.isUseLocationEnabled()
&& hasLocationTimeZoneNoTelephonyFallback(detectorStatus)) {
return mContext.getResources().getString(
R.string.location_time_zone_detection_status_summary_blocked_by_settings);
}
@@ -137,7 +141,7 @@ public class LocationProviderStatusPreferenceController
return "";
}
int status = ltzpStatus.getLocationDetectionDependencyStatus();
@DependencyStatus int status = ltzpStatus.getLocationDetectionDependencyStatus();
if (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_ENVIRONMENT) {
return mContext.getResources().getString(

View File

@@ -25,7 +25,6 @@ import android.app.time.TimeZoneCapabilities;
import android.app.time.TimeZoneCapabilitiesAndConfig;
import android.app.time.TimeZoneConfiguration;
import android.content.Context;
import android.location.LocationManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -50,7 +49,6 @@ public class LocationTimeZoneDetectionPreferenceController
private static final String TAG = "location_time_zone_detection";
private final TimeManager mTimeManager;
private final LocationManager mLocationManager;
private TimeZoneCapabilitiesAndConfig mTimeZoneCapabilitiesAndConfig;
private InstrumentedPreferenceFragment mFragment;
private Preference mPreference;
@@ -58,7 +56,6 @@ public class LocationTimeZoneDetectionPreferenceController
public LocationTimeZoneDetectionPreferenceController(Context context) {
super(context, TAG);
mTimeManager = context.getSystemService(TimeManager.class);
mLocationManager = context.getSystemService(LocationManager.class);
}
void setFragment(InstrumentedPreferenceFragment fragment) {
@@ -68,14 +65,18 @@ public class LocationTimeZoneDetectionPreferenceController
@Override
public boolean isChecked() {
TimeZoneCapabilitiesAndConfig capabilitiesAndConfig =
mTimeManager.getTimeZoneCapabilitiesAndConfig();
getTimeZoneCapabilitiesAndConfig(/*forceRefresh=*/false);
TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
return configuration.isGeoDetectionEnabled();
}
@Override
public boolean setChecked(boolean isChecked) {
if (isChecked && !mLocationManager.isLocationEnabled()) {
TimeZoneCapabilitiesAndConfig timeZoneCapabilitiesAndConfig =
getTimeZoneCapabilitiesAndConfig(/*forceRefresh=*/false);
boolean isLocationEnabled =
timeZoneCapabilitiesAndConfig.getCapabilities().isUseLocationEnabled();
if (isChecked && !isLocationEnabled) {
new LocationToggleDisabledDialogFragment(mContext)
.show(mFragment.getFragmentManager(), TAG);
// Toggle status is not updated.
@@ -157,11 +158,13 @@ public class LocationTimeZoneDetectionPreferenceController
// The preference should not be visible, but text is referenced in case this changes.
summaryResId = R.string.location_time_zone_detection_not_allowed;
} else if (configureGeoDetectionEnabledCapability == CAPABILITY_NOT_APPLICABLE) {
// The TimeZoneCapabilities deliberately doesn't provide information about why the user
// doesn't have the capability, but the user's "location enabled" being off and the
// global automatic detection setting will always be considered overriding reasons why
// location time zone detection cannot be used.
if (!mLocationManager.isLocationEnabled()) {
boolean isLocationEnabled =
timeZoneCapabilitiesAndConfig.getCapabilities().isUseLocationEnabled();
// The TimeZoneCapabilities cannot provide implementation-specific information about why
// the user doesn't have the capability, but the user's "location enabled" being off and
// the global automatic detection setting will always be considered overriding reasons
// why location time zone detection cannot be used.
if (!isLocationEnabled) {
summaryResId = R.string.location_app_permission_summary_location_off;
} else if (!configuration.isAutoDetectionEnabled()) {
summaryResId = R.string.location_time_zone_detection_auto_is_off;
@@ -184,6 +187,10 @@ public class LocationTimeZoneDetectionPreferenceController
return mContext.getString(summaryResId);
}
/**
* Implementation of {@link TimeManager.TimeZoneDetectorListener#onChange()}. Called by the
* system server after a change that affects {@link TimeZoneCapabilitiesAndConfig}.
*/
@Override
public void onChange() {
refreshUi();