Loading core/proto/android/app/location_time_zone_manager.proto +14 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,19 @@ import "frameworks/base/core/proto/android/privacy.proto"; option java_multiple_files = true; option java_outer_classname = "LocationTimeZoneManagerProto"; // A state enum that matches states for LocationTimeZoneProviderController. See that class for // details. enum ControllerStateEnum { CONTROLLER_STATE_UNKNOWN = 0; CONTROLLER_STATE_PROVIDERS_INITIALIZING = 1; CONTROLLER_STATE_STOPPED = 2; CONTROLLER_STATE_INITIALIZING = 3; CONTROLLER_STATE_UNCERTAIN = 4; CONTROLLER_STATE_CERTAIN = 5; CONTROLLER_STATE_FAILED = 6; CONTROLLER_STATE_DESTROYED = 7; } // Represents the state of the LocationTimeZoneManagerService for use in tests. message LocationTimeZoneManagerServiceStateProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; Loading @@ -30,6 +43,7 @@ message LocationTimeZoneManagerServiceStateProto { optional GeolocationTimeZoneSuggestionProto last_suggestion = 1; repeated TimeZoneProviderStateProto primary_provider_states = 2; repeated TimeZoneProviderStateProto secondary_provider_states = 3; repeated ControllerStateEnum controller_states = 4; } // The state tracked for a LocationTimeZoneProvider. Loading services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java +4 −3 Original line number Diff line number Diff line Loading @@ -172,12 +172,13 @@ public interface ServiceConfigAccessor { * Enables/disables the state recording mode for tests. The value is reset with {@link * #resetVolatileTestConfig()}. */ void setRecordProviderStateChanges(boolean enabled); void setRecordStateChangesForTests(boolean enabled); /** * Returns {@code true} if providers are expected to record their state changes for tests. * Returns {@code true} if the controller / providers are expected to record their state changes * for tests. */ boolean getRecordProviderStateChanges(); boolean getRecordStateChangesForTests(); /** * Returns the mode for the primary location time zone provider. Loading services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -150,7 +150,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { * See also {@link #resetVolatileTestConfig()}. */ @GuardedBy("this") private boolean mRecordProviderStateChanges; private boolean mRecordStateChangesForTests; private ServiceConfigAccessorImpl(@NonNull Context context) { mContext = Objects.requireNonNull(context); Loading Loading @@ -453,13 +453,13 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { } @Override public synchronized void setRecordProviderStateChanges(boolean enabled) { mRecordProviderStateChanges = enabled; public synchronized void setRecordStateChangesForTests(boolean enabled) { mRecordStateChangesForTests = enabled; } @Override public synchronized boolean getRecordProviderStateChanges() { return mRecordProviderStateChanges; public synchronized boolean getRecordStateChangesForTests() { return mRecordStateChangesForTests; } @Override Loading Loading @@ -548,7 +548,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { mTestPrimaryLocationTimeZoneProviderMode = null; mTestSecondaryLocationTimeZoneProviderPackageName = null; mTestSecondaryLocationTimeZoneProviderMode = null; mRecordProviderStateChanges = false; mRecordStateChangesForTests = false; } private boolean isTelephonyFallbackSupported() { Loading services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java +16 −7 Original line number Diff line number Diff line Loading @@ -247,8 +247,7 @@ public class LocationTimeZoneManagerService extends Binder { * completion, it cannot be called from the {@code mThreadingDomain} thread. */ void startWithTestProviders(@Nullable String testPrimaryProviderPackageName, @Nullable String testSecondaryProviderPackageName, boolean recordProviderStateChanges) { @Nullable String testSecondaryProviderPackageName, boolean recordStateChanges) { enforceManageTimeZoneDetectorPermission(); if (testPrimaryProviderPackageName == null && testSecondaryProviderPackageName == null) { Loading @@ -263,7 +262,7 @@ public class LocationTimeZoneManagerService extends Binder { testPrimaryProviderPackageName); mServiceConfigAccessor.setTestSecondaryLocationTimeZoneProviderPackageName( testSecondaryProviderPackageName); mServiceConfigAccessor.setRecordProviderStateChanges(recordProviderStateChanges); mServiceConfigAccessor.setRecordStateChangesForTests(recordStateChanges); startOnDomainThread(); } }, BLOCKING_OP_WAIT_DURATION_MILLIS); Loading @@ -281,10 +280,20 @@ public class LocationTimeZoneManagerService extends Binder { if (mLocationTimeZoneProviderController == null) { LocationTimeZoneProvider primary = mPrimaryProviderConfig.createProvider(); LocationTimeZoneProvider secondary = mSecondaryProviderConfig.createProvider(); LocationTimeZoneProviderController.MetricsLogger metricsLogger = new LocationTimeZoneProviderController.MetricsLogger() { @Override public void onStateChange( @LocationTimeZoneProviderController.State String state) { // TODO b/200279201 - wire this up to metrics code // No-op. } }; boolean recordStateChanges = mServiceConfigAccessor.getRecordStateChangesForTests(); LocationTimeZoneProviderController controller = new LocationTimeZoneProviderController( mThreadingDomain, primary, secondary); new LocationTimeZoneProviderController(mThreadingDomain, metricsLogger, primary, secondary, recordStateChanges); LocationTimeZoneProviderControllerEnvironmentImpl environment = new LocationTimeZoneProviderControllerEnvironmentImpl( mThreadingDomain, mServiceConfigAccessor, controller); Loading Loading @@ -342,7 +351,7 @@ public class LocationTimeZoneManagerService extends Binder { mThreadingDomain.postAndWait(() -> { synchronized (mSharedLock) { if (mLocationTimeZoneProviderController != null) { mLocationTimeZoneProviderController.clearRecordedProviderStates(); mLocationTimeZoneProviderController.clearRecordedStates(); } } }, BLOCKING_OP_WAIT_DURATION_MILLIS); Loading Loading @@ -450,7 +459,7 @@ public class LocationTimeZoneManagerService extends Binder { ProviderMetricsLogger providerMetricsLogger = new RealProviderMetricsLogger(mIndex); return new BinderLocationTimeZoneProvider( providerMetricsLogger, mThreadingDomain, mName, proxy, mServiceConfigAccessor.getRecordProviderStateChanges()); mServiceConfigAccessor.getRecordStateChangesForTests()); } @Override Loading services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerServiceState.java +31 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.Nullable; import com.android.server.timezonedetector.GeolocationTimeZoneSuggestion; import com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState; import com.android.server.timezonedetector.location.LocationTimeZoneProviderController.State; import java.util.ArrayList; import java.util.Collections; Loading @@ -30,21 +31,34 @@ import java.util.Objects; /** A snapshot of the location time zone manager service's state for tests. */ final class LocationTimeZoneManagerServiceState { private final @State String mControllerState; @Nullable private final GeolocationTimeZoneSuggestion mLastSuggestion; @NonNull private final List<@State String> mControllerStates; @NonNull private final List<ProviderState> mPrimaryProviderStates; @NonNull private final List<ProviderState> mSecondaryProviderStates; LocationTimeZoneManagerServiceState(@NonNull Builder builder) { mControllerState = builder.mControllerState; mLastSuggestion = builder.mLastSuggestion; mControllerStates = Objects.requireNonNull(builder.mControllerStates); mPrimaryProviderStates = Objects.requireNonNull(builder.mPrimaryProviderStates); mSecondaryProviderStates = Objects.requireNonNull(builder.mSecondaryProviderStates); } public @State String getControllerState() { return mControllerState; } @Nullable public GeolocationTimeZoneSuggestion getLastSuggestion() { return mLastSuggestion; } @NonNull public List<@State String> getControllerStates() { return mControllerStates; } @NonNull public List<ProviderState> getPrimaryProviderStates() { return Collections.unmodifiableList(mPrimaryProviderStates); Loading @@ -58,7 +72,9 @@ final class LocationTimeZoneManagerServiceState { @Override public String toString() { return "LocationTimeZoneManagerServiceState{" + "mLastSuggestion=" + mLastSuggestion + "mControllerState=" + mControllerState + ", mLastSuggestion=" + mLastSuggestion + ", mControllerStates=" + mControllerStates + ", mPrimaryProviderStates=" + mPrimaryProviderStates + ", mSecondaryProviderStates=" + mSecondaryProviderStates + '}'; Loading @@ -66,16 +82,30 @@ final class LocationTimeZoneManagerServiceState { static final class Builder { private @State String mControllerState; private GeolocationTimeZoneSuggestion mLastSuggestion; private List<@State String> mControllerStates; private List<ProviderState> mPrimaryProviderStates; private List<ProviderState> mSecondaryProviderStates; @NonNull public Builder setControllerState(@State String stateEnum) { mControllerState = stateEnum; return this; } @NonNull Builder setLastSuggestion(@NonNull GeolocationTimeZoneSuggestion lastSuggestion) { mLastSuggestion = Objects.requireNonNull(lastSuggestion); return this; } @NonNull public Builder setStateChanges(@NonNull List<@State String> states) { mControllerStates = new ArrayList<>(states); return this; } @NonNull Builder setPrimaryProviderStateChanges(@NonNull List<ProviderState> primaryProviderStates) { mPrimaryProviderStates = new ArrayList<>(primaryProviderStates); Loading Loading
core/proto/android/app/location_time_zone_manager.proto +14 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,19 @@ import "frameworks/base/core/proto/android/privacy.proto"; option java_multiple_files = true; option java_outer_classname = "LocationTimeZoneManagerProto"; // A state enum that matches states for LocationTimeZoneProviderController. See that class for // details. enum ControllerStateEnum { CONTROLLER_STATE_UNKNOWN = 0; CONTROLLER_STATE_PROVIDERS_INITIALIZING = 1; CONTROLLER_STATE_STOPPED = 2; CONTROLLER_STATE_INITIALIZING = 3; CONTROLLER_STATE_UNCERTAIN = 4; CONTROLLER_STATE_CERTAIN = 5; CONTROLLER_STATE_FAILED = 6; CONTROLLER_STATE_DESTROYED = 7; } // Represents the state of the LocationTimeZoneManagerService for use in tests. message LocationTimeZoneManagerServiceStateProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; Loading @@ -30,6 +43,7 @@ message LocationTimeZoneManagerServiceStateProto { optional GeolocationTimeZoneSuggestionProto last_suggestion = 1; repeated TimeZoneProviderStateProto primary_provider_states = 2; repeated TimeZoneProviderStateProto secondary_provider_states = 3; repeated ControllerStateEnum controller_states = 4; } // The state tracked for a LocationTimeZoneProvider. Loading
services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java +4 −3 Original line number Diff line number Diff line Loading @@ -172,12 +172,13 @@ public interface ServiceConfigAccessor { * Enables/disables the state recording mode for tests. The value is reset with {@link * #resetVolatileTestConfig()}. */ void setRecordProviderStateChanges(boolean enabled); void setRecordStateChangesForTests(boolean enabled); /** * Returns {@code true} if providers are expected to record their state changes for tests. * Returns {@code true} if the controller / providers are expected to record their state changes * for tests. */ boolean getRecordProviderStateChanges(); boolean getRecordStateChangesForTests(); /** * Returns the mode for the primary location time zone provider. Loading
services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -150,7 +150,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { * See also {@link #resetVolatileTestConfig()}. */ @GuardedBy("this") private boolean mRecordProviderStateChanges; private boolean mRecordStateChangesForTests; private ServiceConfigAccessorImpl(@NonNull Context context) { mContext = Objects.requireNonNull(context); Loading Loading @@ -453,13 +453,13 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { } @Override public synchronized void setRecordProviderStateChanges(boolean enabled) { mRecordProviderStateChanges = enabled; public synchronized void setRecordStateChangesForTests(boolean enabled) { mRecordStateChangesForTests = enabled; } @Override public synchronized boolean getRecordProviderStateChanges() { return mRecordProviderStateChanges; public synchronized boolean getRecordStateChangesForTests() { return mRecordStateChangesForTests; } @Override Loading Loading @@ -548,7 +548,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { mTestPrimaryLocationTimeZoneProviderMode = null; mTestSecondaryLocationTimeZoneProviderPackageName = null; mTestSecondaryLocationTimeZoneProviderMode = null; mRecordProviderStateChanges = false; mRecordStateChangesForTests = false; } private boolean isTelephonyFallbackSupported() { Loading
services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java +16 −7 Original line number Diff line number Diff line Loading @@ -247,8 +247,7 @@ public class LocationTimeZoneManagerService extends Binder { * completion, it cannot be called from the {@code mThreadingDomain} thread. */ void startWithTestProviders(@Nullable String testPrimaryProviderPackageName, @Nullable String testSecondaryProviderPackageName, boolean recordProviderStateChanges) { @Nullable String testSecondaryProviderPackageName, boolean recordStateChanges) { enforceManageTimeZoneDetectorPermission(); if (testPrimaryProviderPackageName == null && testSecondaryProviderPackageName == null) { Loading @@ -263,7 +262,7 @@ public class LocationTimeZoneManagerService extends Binder { testPrimaryProviderPackageName); mServiceConfigAccessor.setTestSecondaryLocationTimeZoneProviderPackageName( testSecondaryProviderPackageName); mServiceConfigAccessor.setRecordProviderStateChanges(recordProviderStateChanges); mServiceConfigAccessor.setRecordStateChangesForTests(recordStateChanges); startOnDomainThread(); } }, BLOCKING_OP_WAIT_DURATION_MILLIS); Loading @@ -281,10 +280,20 @@ public class LocationTimeZoneManagerService extends Binder { if (mLocationTimeZoneProviderController == null) { LocationTimeZoneProvider primary = mPrimaryProviderConfig.createProvider(); LocationTimeZoneProvider secondary = mSecondaryProviderConfig.createProvider(); LocationTimeZoneProviderController.MetricsLogger metricsLogger = new LocationTimeZoneProviderController.MetricsLogger() { @Override public void onStateChange( @LocationTimeZoneProviderController.State String state) { // TODO b/200279201 - wire this up to metrics code // No-op. } }; boolean recordStateChanges = mServiceConfigAccessor.getRecordStateChangesForTests(); LocationTimeZoneProviderController controller = new LocationTimeZoneProviderController( mThreadingDomain, primary, secondary); new LocationTimeZoneProviderController(mThreadingDomain, metricsLogger, primary, secondary, recordStateChanges); LocationTimeZoneProviderControllerEnvironmentImpl environment = new LocationTimeZoneProviderControllerEnvironmentImpl( mThreadingDomain, mServiceConfigAccessor, controller); Loading Loading @@ -342,7 +351,7 @@ public class LocationTimeZoneManagerService extends Binder { mThreadingDomain.postAndWait(() -> { synchronized (mSharedLock) { if (mLocationTimeZoneProviderController != null) { mLocationTimeZoneProviderController.clearRecordedProviderStates(); mLocationTimeZoneProviderController.clearRecordedStates(); } } }, BLOCKING_OP_WAIT_DURATION_MILLIS); Loading Loading @@ -450,7 +459,7 @@ public class LocationTimeZoneManagerService extends Binder { ProviderMetricsLogger providerMetricsLogger = new RealProviderMetricsLogger(mIndex); return new BinderLocationTimeZoneProvider( providerMetricsLogger, mThreadingDomain, mName, proxy, mServiceConfigAccessor.getRecordProviderStateChanges()); mServiceConfigAccessor.getRecordStateChangesForTests()); } @Override Loading
services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerServiceState.java +31 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.Nullable; import com.android.server.timezonedetector.GeolocationTimeZoneSuggestion; import com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState; import com.android.server.timezonedetector.location.LocationTimeZoneProviderController.State; import java.util.ArrayList; import java.util.Collections; Loading @@ -30,21 +31,34 @@ import java.util.Objects; /** A snapshot of the location time zone manager service's state for tests. */ final class LocationTimeZoneManagerServiceState { private final @State String mControllerState; @Nullable private final GeolocationTimeZoneSuggestion mLastSuggestion; @NonNull private final List<@State String> mControllerStates; @NonNull private final List<ProviderState> mPrimaryProviderStates; @NonNull private final List<ProviderState> mSecondaryProviderStates; LocationTimeZoneManagerServiceState(@NonNull Builder builder) { mControllerState = builder.mControllerState; mLastSuggestion = builder.mLastSuggestion; mControllerStates = Objects.requireNonNull(builder.mControllerStates); mPrimaryProviderStates = Objects.requireNonNull(builder.mPrimaryProviderStates); mSecondaryProviderStates = Objects.requireNonNull(builder.mSecondaryProviderStates); } public @State String getControllerState() { return mControllerState; } @Nullable public GeolocationTimeZoneSuggestion getLastSuggestion() { return mLastSuggestion; } @NonNull public List<@State String> getControllerStates() { return mControllerStates; } @NonNull public List<ProviderState> getPrimaryProviderStates() { return Collections.unmodifiableList(mPrimaryProviderStates); Loading @@ -58,7 +72,9 @@ final class LocationTimeZoneManagerServiceState { @Override public String toString() { return "LocationTimeZoneManagerServiceState{" + "mLastSuggestion=" + mLastSuggestion + "mControllerState=" + mControllerState + ", mLastSuggestion=" + mLastSuggestion + ", mControllerStates=" + mControllerStates + ", mPrimaryProviderStates=" + mPrimaryProviderStates + ", mSecondaryProviderStates=" + mSecondaryProviderStates + '}'; Loading @@ -66,16 +82,30 @@ final class LocationTimeZoneManagerServiceState { static final class Builder { private @State String mControllerState; private GeolocationTimeZoneSuggestion mLastSuggestion; private List<@State String> mControllerStates; private List<ProviderState> mPrimaryProviderStates; private List<ProviderState> mSecondaryProviderStates; @NonNull public Builder setControllerState(@State String stateEnum) { mControllerState = stateEnum; return this; } @NonNull Builder setLastSuggestion(@NonNull GeolocationTimeZoneSuggestion lastSuggestion) { mLastSuggestion = Objects.requireNonNull(lastSuggestion); return this; } @NonNull public Builder setStateChanges(@NonNull List<@State String> states) { mControllerStates = new ArrayList<>(states); return this; } @NonNull Builder setPrimaryProviderStateChanges(@NonNull List<ProviderState> primaryProviderStates) { mPrimaryProviderStates = new ArrayList<>(primaryProviderStates); Loading