/*
 * Copyright (C) 2015 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.os;

import android.os.IUpdateEngineCallback;
import android.os.ParcelFileDescriptor;

/** @hide */
interface IUpdateEngine {
  /** @hide */
  void applyPayload(String url,
                    in long payload_offset,
                    in long payload_size,
                    in String[] headerKeyValuePairs);
  /** @hide */
  void applyPayloadFd(in ParcelFileDescriptor pfd,
                      in long payload_offset,
                      in long payload_size,
                      in String[] headerKeyValuePairs);
  /** @hide */
  boolean bind(IUpdateEngineCallback callback);
  /** @hide */
  boolean unbind(IUpdateEngineCallback callback);
  /** @hide */
  void suspend();
  /** @hide */
  void resume();
  /** @hide */
  void cancel();
  /** @hide */
  void resetStatus();
  /** @hide */
  boolean verifyPayloadApplicable(in String metadataFilename);
  /**
   * Allocate space on userdata partition.
   *
   * @return 0 indicates allocation is successful.
   *   Non-zero indicates space is insufficient. The returned value is the
   *   total required space (in bytes) on userdata partition.
   *
   * @throws ServiceSpecificException for other errors.
   *
   * @hide
   */
  long allocateSpaceForPayload(in String metadataFilename,
                               in String[] headerKeyValuePairs);
  /** @hide
   *
   * Wait for merge to finish, and clean up necessary files.
   *
   * @param callback Report status updates in callback (not the one previously
   * bound with {@link #bind()}).
   * {@link IUpdateEngineCallback#onStatusUpdate} is called with
   * CLEANUP_PREVIOUS_UPDATE and a progress value during the cleanup.
   * {@link IUpdateEngineCallback#onPayloadApplicationComplete} is called at
   * the end with SUCCESS if successful. ERROR if transient errors (e.g. merged
   * but needs reboot). DEVICE_CORRUPTED for permanent errors.
   */
  void cleanupSuccessfulUpdate(IUpdateEngineCallback callback);
}
