/*
 * Copyright (C) 2011 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 android.util;

import android.net.SntpClient;
import android.os.SystemClock;

/**
 * {@link TrustedTime} that connects with a remote NTP server as its remote
 * trusted time source.
 *
 * @hide
 */
public class NtpTrustedTime implements TrustedTime {
    private String mNtpServer;
    private long mNtpTimeout;

    private boolean mHasCache;
    private long mCachedNtpTime;
    private long mCachedNtpElapsedRealtime;
    private long mCachedNtpCertainty;

    public NtpTrustedTime() {
    }

    public void setNtpServer(String server, long timeout) {
        mNtpServer = server;
        mNtpTimeout = timeout;
    }

    /** {@inheritDoc} */
    public boolean forceRefresh() {
        if (mNtpServer == null) {
            // missing server, so no trusted time available
            return false;
        }

        final SntpClient client = new SntpClient();
        if (client.requestTime(mNtpServer, (int) mNtpTimeout)) {
            mHasCache = true;
            mCachedNtpTime = client.getNtpTime();
            mCachedNtpElapsedRealtime = client.getNtpTimeReference();
            mCachedNtpCertainty = client.getRoundTripTime() / 2;
            return true;
        } else {
            return false;
        }
    }

    /** {@inheritDoc} */
    public boolean hasCache() {
        return mHasCache;
    }

    /** {@inheritDoc} */
    public long getCacheAge() {
        if (mHasCache) {
            return SystemClock.elapsedRealtime() - mCachedNtpElapsedRealtime;
        } else {
            return Long.MAX_VALUE;
        }
    }

    /** {@inheritDoc} */
    public long getCacheCertainty() {
        if (mHasCache) {
            return mCachedNtpCertainty;
        } else {
            return Long.MAX_VALUE;
        }
    }

    /** {@inheritDoc} */
    public long currentTimeMillis() {
        if (!mHasCache) {
            throw new IllegalStateException("Missing authoritative time source");
        }

        // current time is age after the last ntp cache; callers who
        // want fresh values will hit makeAuthoritative() first.
        return mCachedNtpTime + getCacheAge();
    }
}
