//
// Copyright (C) 2016 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.
//

#ifndef UPDATE_ENGINE_UPDATE_ENGINE_STATUS_H_
#define UPDATE_ENGINE_UPDATE_ENGINE_STATUS_H_

#include <binder/Parcelable.h>
#include <utils/String16.h>

#include "update_engine/client_library/include/update_engine/update_status.h"

namespace android {
namespace brillo {

// Parcelable object containing the current status of update engine, to be sent
// over binder to clients from the server.
class ParcelableUpdateEngineStatus : public Parcelable {
 public:
  ParcelableUpdateEngineStatus() = default;
  explicit ParcelableUpdateEngineStatus(
      const update_engine::UpdateEngineStatus& status);
  virtual ~ParcelableUpdateEngineStatus() = default;

  status_t writeToParcel(Parcel* parcel) const override;
  status_t readFromParcel(const Parcel* parcel) override;

  // This list is kept in the Parcelable serialization order.

  // When the update_engine last checked for updates (ms since Epoch)
  int64_t last_checked_time_;
  // The current status/operation of the update_engine.
  android::String16 current_operation_;
  // The current progress (0.0f-1.0f).
  double progress_;
  // The current product version.
  android::String16 current_version_;
  // The current system version.
  android::String16 current_system_version_;
  // The size of the update (bytes).  This is int64_t for java compatibility.
  int64_t new_size_;
  // The new product version.
  android::String16 new_version_;
  // The new system version, if there is one (empty, otherwise).
  android::String16 new_system_version_;
};

}  // namespace brillo
}  // namespace android

#endif  // UPDATE_ENGINE_UPDATE_ENGINE_STATUS_H_
