Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a86476d authored by Neil Fuller's avatar Neil Fuller Committed by Android (Google) Code Review
Browse files

Merge changes from topic "initialization_apis"

* changes:
  Implement proposed device initialization APIs
  Improve debug / bug report logging for time zones
parents b0a9e788 2537e5d5
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -2153,7 +2153,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    void setTimeZoneImpl(String tzId, @TimeZoneConfidence int confidence) {
    void setTimeZoneImpl(String tzId, @TimeZoneConfidence int confidence, String logInfo) {
        if (TextUtils.isEmpty(tzId)) {
        if (TextUtils.isEmpty(tzId)) {
            return;
            return;
        }
        }
@@ -2166,7 +2166,7 @@ public class AlarmManagerService extends SystemService {
            // TimeZone.getTimeZone() can return a time zone with a different ID (e.g. it can return
            // TimeZone.getTimeZone() can return a time zone with a different ID (e.g. it can return
            // "GMT" if the ID is unrecognized). The parameter ID is used here rather than
            // "GMT" if the ID is unrecognized). The parameter ID is used here rather than
            // newZone.getId(). It will be rejected if it is invalid.
            // newZone.getId(). It will be rejected if it is invalid.
            timeZoneWasChanged = SystemTimeZone.setTimeZoneId(tzId, confidence);
            timeZoneWasChanged = SystemTimeZone.setTimeZoneId(tzId, confidence, logInfo);


            if (KERNEL_TIME_ZONE_SYNC_ENABLED) {
            if (KERNEL_TIME_ZONE_SYNC_ENABLED) {
                // Update the kernel timezone information
                // Update the kernel timezone information
@@ -2706,8 +2706,9 @@ public class AlarmManagerService extends SystemService {
        }
        }


        @Override
        @Override
        public void setTimeZone(String tzId, @TimeZoneConfidence int confidence) {
        public void setTimeZone(String tzId, @TimeZoneConfidence int confidence,
            setTimeZoneImpl(tzId, confidence);
                String logInfo) {
            setTimeZoneImpl(tzId, confidence, logInfo);
        }
        }


        @Override
        @Override
@@ -3010,7 +3011,7 @@ public class AlarmManagerService extends SystemService {
                // of confidence, but since the time zone ID should come either from apps working on
                // of confidence, but since the time zone ID should come either from apps working on
                // behalf of the user or a developer, confidence is assumed "high".
                // behalf of the user or a developer, confidence is assumed "high".
                final int timeZoneConfidence = TIME_ZONE_CONFIDENCE_HIGH;
                final int timeZoneConfidence = TIME_ZONE_CONFIDENCE_HIGH;
                setTimeZoneImpl(tz, timeZoneConfidence);
                setTimeZoneImpl(tz, timeZoneConfidence, "AlarmManager.setTimeZone() called");
            } finally {
            } finally {
                Binder.restoreCallingIdentity(oldId);
                Binder.restoreCallingIdentity(oldId);
            }
            }
+19 −18
Original line number Original line Diff line number Diff line
@@ -57,21 +57,21 @@ public final class TimeCapabilities implements Parcelable {
    @NonNull
    @NonNull
    private final UserHandle mUserHandle;
    private final UserHandle mUserHandle;
    private final @CapabilityState int mConfigureAutoDetectionEnabledCapability;
    private final @CapabilityState int mConfigureAutoDetectionEnabledCapability;
    private final @CapabilityState int mSuggestManualTimeCapability;
    private final @CapabilityState int mSetManualTimeCapability;


    private TimeCapabilities(@NonNull Builder builder) {
    private TimeCapabilities(@NonNull Builder builder) {
        this.mUserHandle = Objects.requireNonNull(builder.mUserHandle);
        this.mUserHandle = Objects.requireNonNull(builder.mUserHandle);
        this.mConfigureAutoDetectionEnabledCapability =
        this.mConfigureAutoDetectionEnabledCapability =
                builder.mConfigureAutoDetectionEnabledCapability;
                builder.mConfigureAutoDetectionEnabledCapability;
        this.mSuggestManualTimeCapability = builder.mSuggestManualTimeCapability;
        this.mSetManualTimeCapability = builder.mSetManualTimeCapability;
    }
    }


    @NonNull
    @NonNull
    private static TimeCapabilities createFromParcel(Parcel in) {
    private static TimeCapabilities createFromParcel(@NonNull Parcel in) {
        UserHandle userHandle = UserHandle.readFromParcel(in);
        UserHandle userHandle = UserHandle.readFromParcel(in);
        return new TimeCapabilities.Builder(userHandle)
        return new TimeCapabilities.Builder(userHandle)
                .setConfigureAutoDetectionEnabledCapability(in.readInt())
                .setConfigureAutoDetectionEnabledCapability(in.readInt())
                .setSuggestManualTimeCapability(in.readInt())
                .setSetManualTimeCapability(in.readInt())
                .build();
                .build();
    }
    }


@@ -79,7 +79,7 @@ public final class TimeCapabilities implements Parcelable {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        UserHandle.writeToParcel(mUserHandle, dest);
        UserHandle.writeToParcel(mUserHandle, dest);
        dest.writeInt(mConfigureAutoDetectionEnabledCapability);
        dest.writeInt(mConfigureAutoDetectionEnabledCapability);
        dest.writeInt(mSuggestManualTimeCapability);
        dest.writeInt(mSetManualTimeCapability);
    }
    }


    /**
    /**
@@ -94,11 +94,12 @@ public final class TimeCapabilities implements Parcelable {


    /**
    /**
     * Returns the capability state associated with the user's ability to manually set time on a
     * Returns the capability state associated with the user's ability to manually set time on a
     * device.
     * device. The setting can be updated via {@link
     * TimeManager#updateTimeConfiguration(TimeConfiguration)}.
     */
     */
    @CapabilityState
    @CapabilityState
    public int getSuggestManualTimeCapability() {
    public int getSetManualTimeCapability() {
        return mSuggestManualTimeCapability;
        return mSetManualTimeCapability;
    }
    }


    /**
    /**
@@ -136,14 +137,14 @@ public final class TimeCapabilities implements Parcelable {
        TimeCapabilities that = (TimeCapabilities) o;
        TimeCapabilities that = (TimeCapabilities) o;
        return mConfigureAutoDetectionEnabledCapability
        return mConfigureAutoDetectionEnabledCapability
                == that.mConfigureAutoDetectionEnabledCapability
                == that.mConfigureAutoDetectionEnabledCapability
                && mSuggestManualTimeCapability == that.mSuggestManualTimeCapability
                && mSetManualTimeCapability == that.mSetManualTimeCapability
                && mUserHandle.equals(that.mUserHandle);
                && mUserHandle.equals(that.mUserHandle);
    }
    }


    @Override
    @Override
    public int hashCode() {
    public int hashCode() {
        return Objects.hash(mUserHandle, mConfigureAutoDetectionEnabledCapability,
        return Objects.hash(mUserHandle, mConfigureAutoDetectionEnabledCapability,
                mSuggestManualTimeCapability);
                mSetManualTimeCapability);
    }
    }


    @Override
    @Override
@@ -152,7 +153,7 @@ public final class TimeCapabilities implements Parcelable {
                + "mUserHandle=" + mUserHandle
                + "mUserHandle=" + mUserHandle
                + ", mConfigureAutoDetectionEnabledCapability="
                + ", mConfigureAutoDetectionEnabledCapability="
                + mConfigureAutoDetectionEnabledCapability
                + mConfigureAutoDetectionEnabledCapability
                + ", mSuggestManualTimeCapability=" + mSuggestManualTimeCapability
                + ", mSetManualTimeCapability=" + mSetManualTimeCapability
                + '}';
                + '}';
    }
    }


@@ -165,7 +166,7 @@ public final class TimeCapabilities implements Parcelable {


        @NonNull private final UserHandle mUserHandle;
        @NonNull private final UserHandle mUserHandle;
        private @CapabilityState int mConfigureAutoDetectionEnabledCapability;
        private @CapabilityState int mConfigureAutoDetectionEnabledCapability;
        private @CapabilityState int mSuggestManualTimeCapability;
        private @CapabilityState int mSetManualTimeCapability;


        public Builder(@NonNull UserHandle userHandle) {
        public Builder(@NonNull UserHandle userHandle) {
            this.mUserHandle = Objects.requireNonNull(userHandle);
            this.mUserHandle = Objects.requireNonNull(userHandle);
@@ -176,18 +177,18 @@ public final class TimeCapabilities implements Parcelable {
            this.mUserHandle = timeCapabilities.mUserHandle;
            this.mUserHandle = timeCapabilities.mUserHandle;
            this.mConfigureAutoDetectionEnabledCapability =
            this.mConfigureAutoDetectionEnabledCapability =
                    timeCapabilities.mConfigureAutoDetectionEnabledCapability;
                    timeCapabilities.mConfigureAutoDetectionEnabledCapability;
            this.mSuggestManualTimeCapability = timeCapabilities.mSuggestManualTimeCapability;
            this.mSetManualTimeCapability = timeCapabilities.mSetManualTimeCapability;
        }
        }


        /** Sets the state for automatic time detection config. */
        /** Sets the value for the "configure automatic time detection" capability. */
        public Builder setConfigureAutoDetectionEnabledCapability(@CapabilityState int value) {
        public Builder setConfigureAutoDetectionEnabledCapability(@CapabilityState int value) {
            this.mConfigureAutoDetectionEnabledCapability = value;
            this.mConfigureAutoDetectionEnabledCapability = value;
            return this;
            return this;
        }
        }


        /** Sets the state for manual time change. */
        /** Sets the value for the "set manual time" capability. */
        public Builder setSuggestManualTimeCapability(@CapabilityState int value) {
        public Builder setSetManualTimeCapability(@CapabilityState int value) {
            this.mSuggestManualTimeCapability = value;
            this.mSetManualTimeCapability = value;
            return this;
            return this;
        }
        }


@@ -195,7 +196,7 @@ public final class TimeCapabilities implements Parcelable {
        public TimeCapabilities build() {
        public TimeCapabilities build() {
            verifyCapabilitySet(mConfigureAutoDetectionEnabledCapability,
            verifyCapabilitySet(mConfigureAutoDetectionEnabledCapability,
                    "configureAutoDetectionEnabledCapability");
                    "configureAutoDetectionEnabledCapability");
            verifyCapabilitySet(mSuggestManualTimeCapability, "mSuggestManualTimeCapability");
            verifyCapabilitySet(mSetManualTimeCapability, "mSetManualTimeCapability");
            return new TimeCapabilities(this);
            return new TimeCapabilities(this);
        }
        }


+0 −4
Original line number Original line Diff line number Diff line
@@ -71,8 +71,6 @@ public final class TimeCapabilitiesAndConfig implements Parcelable {


    /**
    /**
     * Returns the user's time behaviour capabilities.
     * Returns the user's time behaviour capabilities.
     *
     * @hide
     */
     */
    @NonNull
    @NonNull
    public TimeCapabilities getCapabilities() {
    public TimeCapabilities getCapabilities() {
@@ -81,8 +79,6 @@ public final class TimeCapabilitiesAndConfig implements Parcelable {


    /**
    /**
     * Returns the user's time behaviour configuration.
     * Returns the user's time behaviour configuration.
     *
     * @hide
     */
     */
    @NonNull
    @NonNull
    public TimeConfiguration getConfiguration() {
    public TimeConfiguration getConfiguration() {
+6 −0
Original line number Original line Diff line number Diff line
@@ -55,10 +55,16 @@ public final class TimeConfiguration implements Parcelable {
                }
                }
            };
            };


    /**
     * All configuration properties
     *
     * @hide
     */
    @StringDef(SETTING_AUTO_DETECTION_ENABLED)
    @StringDef(SETTING_AUTO_DETECTION_ENABLED)
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    @interface Setting {}
    @interface Setting {}


    /** See {@link TimeConfiguration#isAutoDetectionEnabled()} for details. */
    @Setting
    @Setting
    private static final String SETTING_AUTO_DETECTION_ENABLED = "autoDetectionEnabled";
    private static final String SETTING_AUTO_DETECTION_ENABLED = "autoDetectionEnabled";


+151 −0
Original line number Original line Diff line number Diff line
@@ -21,11 +21,14 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.SystemService;
import android.app.timedetector.ITimeDetectorService;
import android.app.timedetector.ITimeDetectorService;
import android.app.timedetector.ManualTimeSuggestion;
import android.app.timezonedetector.ITimeZoneDetectorService;
import android.app.timezonedetector.ITimeZoneDetectorService;
import android.app.timezonedetector.ManualTimeZoneSuggestion;
import android.content.Context;
import android.content.Context;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.TimestampedValue;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Log;


@@ -274,4 +277,152 @@ public final class TimeManager {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
    }
    }

    /**
     * Returns a snapshot of the device's current system clock time state. See also {@link
     * #confirmTime(UnixEpochTime)} for how this information can be used.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    @NonNull
    public TimeState getTimeState() {
        if (DEBUG) {
            Log.d(TAG, "getTimeState called");
        }
        try {
            return mITimeDetectorService.getTimeState();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Confirms the device's current time during device setup, raising the system's confidence in
     * the time if needed. Unlike {@link #setManualTime(UnixEpochTime)}, which can only be used when
     * automatic time detection is currently disabled, this method can be used regardless of the
     * automatic time detection setting, but only to confirm the current time (which may have been
     * set via automatic means). Use {@link #getTimeState()} to obtain the time state to confirm.
     *
     * <p>Returns {@code false} if the confirmation is invalid, i.e. if the time being
     * confirmed is no longer the time the device is currently set to. Confirming a time
     * in which the system already has high confidence will return {@code true}.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    public boolean confirmTime(@NonNull UnixEpochTime unixEpochTime) {
        if (DEBUG) {
            Log.d(TAG, "confirmTime called: " + unixEpochTime);
        }
        try {
            return mITimeDetectorService.confirmTime(unixEpochTime);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Attempts to set the device's time, expected to be determined from the user's manually entered
     * information.
     *
     * <p>Returns {@code false} if the time is invalid, or the device configuration / user
     * capabilities prevents the time being accepted, e.g. if the device is currently set to
     * "automatic time detection". This method returns {@code true} if the time was accepted even
     * if it is the same as the current device time.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    public boolean setManualTime(@NonNull UnixEpochTime unixEpochTime) {
        if (DEBUG) {
            Log.d(TAG, "setTime called: " + unixEpochTime);
        }
        try {
            TimestampedValue<Long> manualTime = new TimestampedValue<>(
                    unixEpochTime.getElapsedRealtimeMillis(),
                    unixEpochTime.getUnixEpochTimeMillis());
            ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(manualTime);
            manualTimeSuggestion.addDebugInfo("TimeManager.setTime()");
            manualTimeSuggestion.addDebugInfo("UID: " + android.os.Process.myUid());
            manualTimeSuggestion.addDebugInfo("UserHandle: " + android.os.Process.myUserHandle());
            manualTimeSuggestion.addDebugInfo("Process: " + android.os.Process.myProcessName());
            return mITimeDetectorService.setManualTime(manualTimeSuggestion);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Returns a snapshot of the device's current time zone state. See also {@link
     * #confirmTimeZone(String)} and {@link #setManualTimeZone(String)} for how this information may
     * be used.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    @NonNull
    public TimeZoneState getTimeZoneState() {
        if (DEBUG) {
            Log.d(TAG, "getTimeZoneState called");
        }
        try {
            return mITimeZoneDetectorService.getTimeZoneState();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Confirms the device's current time zone ID, raising the system's confidence in the time zone
     * if needed. Unlike {@link #setManualTimeZone(String)}, which can only be used when automatic
     * time zone detection is currently disabled, this method can be used regardless of the
     * automatic time zone detection setting, but only to confirm the current value (which may have
     * been set via automatic means).
     *
     * <p>Returns {@code false} if the confirmation is invalid, i.e. if the time zone ID being
     * confirmed is no longer the time zone ID the device is currently set to. Confirming a time
     * zone ID in which the system already has high confidence returns {@code true}.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    public boolean confirmTimeZone(@NonNull String timeZoneId) {
        if (DEBUG) {
            Log.d(TAG, "confirmTimeZone called: " + timeZoneId);
        }
        try {
            return mITimeZoneDetectorService.confirmTimeZone(timeZoneId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Attempts to set the device's time zone, expected to be determined from a user's manually
     * entered information.
     *
     * <p>Returns {@code false} if the time zone is invalid, or the device configuration / user
     * capabilities prevents the time zone being accepted, e.g. if the device is currently set to
     * "automatic time zone detection". {@code true} is returned if the time zone is accepted. A
     * time zone that is accepted and matches the current device time zone returns {@code true}.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION)
    public boolean setManualTimeZone(@NonNull String timeZoneId) {
        if (DEBUG) {
            Log.d(TAG, "setManualTimeZone called: " + timeZoneId);
        }
        try {
            ManualTimeZoneSuggestion manualTimeZoneSuggestion =
                    new ManualTimeZoneSuggestion(timeZoneId);
            manualTimeZoneSuggestion.addDebugInfo("TimeManager.setManualTimeZone()");
            manualTimeZoneSuggestion.addDebugInfo("UID: " + android.os.Process.myUid());
            manualTimeZoneSuggestion.addDebugInfo("Process: " + android.os.Process.myProcessName());
            return mITimeZoneDetectorService.setManualTimeZone(manualTimeZoneSuggestion);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
}
}
Loading