/*
 * Copyright (C) 2018 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 com.google.android.startop.iorap;

import com.google.android.startop.iorap.ITaskListener;

import com.google.android.startop.iorap.AppIntentEvent;
import com.google.android.startop.iorap.AppLaunchEvent;
import com.google.android.startop.iorap.DexOptEvent;
import com.google.android.startop.iorap.JobScheduledEvent;
import com.google.android.startop.iorap.PackageEvent;
import com.google.android.startop.iorap.RequestId;
import com.google.android.startop.iorap.SystemServiceEvent;
import com.google.android.startop.iorap.SystemServiceUserEvent;

/**
* IIOrap is a client interface to the input/output readahead and pin daemon (iorapd).
*
* The aim is to speed-up the cold start-up time of certain use-cases like application startup
* by utilizing trace-based pinning or readahead.
*
* Programatically, the behavior of iorapd should be treated like a black box. There is no
* "correctness", but only performance. By sending the right events at the appropriate time,
* we can squeeze more performance out of the system.
*
* If some events are not appropriately wired up, system performance may (temporarily) degrade.
*
* {@hide} */
oneway interface IIorap {
   /**
    * Set an ITaskListener which will be used to deliver notifications of in-progress/completition
    * for the onXEvent method calls below this.<br /><br />
    *
    * iorapd does all the work asynchronously and may deliver one or more onProgress events after
    * the event begins to be processed. It will always send back one onComplete that is considered
    * terminal.<br /><br />
    *
    * onProgress/onComplete are matched to the original event by the requestId. Once an onComplete
    * occurs for any given requestId, no further callbacks with the same requestId will occur.
    * It is illegal for the caller to reuse the same requestId on different invocations of IIorap.
    * <br /><br />
    *
    * onXEvent(id1) must be well-ordered w.r.t. onXEvent(id2), the assumption is that later
    * calls happen-after earlier calls and that id2 > id1. Decreasing request IDs will
    * immediately get rejected.
    * <br /><br />
    *
    * Sequence diagram of stereotypical successful event delivery and response notification:
    *
    * <pre>
    *
    *           ┌─────────────┐                ┌──────┐
    *           │system_server│                │iorapd│
    *           └──────┬──────┘                └──┬───┘
    *                  Request [01]: onSomeEvent ┌┴┐
    *                  │────────────────────────>│ │
    *                  │                         │ │
    *                  │                         │ │  ╔════════════════════════╗
    *                  │                         │ │  ║start processing event ░║
    *                  │                         │ │  ╚════════════════════════╝
    *                  │                         │ │
    * ╔═══════╤════════╪═════════════════════════╪═╪══════════════════════════════╗
    * ║ LOOP  │  1 or more times                 │ │                              ║
    * ╟───────┘        │                         │ │                              ║
    * ║                │Request [01]: onProgress │ │                              ║
    * ║                │<────────────────────────│ │                              ║
    * ║                │                         │ │                              ║
    * ║                │                         │ │────┐                         ║
    * ║                │                         │ │    │ workload in progress    ║
    * ║                │                         │ │<───┘                         ║
    * ╚════════════════╪═════════════════════════╪═╪══════════════════════════════╝
    *                  │                         └┬┘
    *                  .                          .
    *                  .                          .
    *                  .                          .
    *                  .                          .
    *                  .                          .
    *                  │                         ┌┴┐  ╔═════════════════════════╗
    *                  │                         │ │  ║finish processing event ░║
    *                  │                         │ │  ╚═════════════════════════╝
    *                  │Request [01]: onComplete │ │
    *                  │<────────────────────────│ │
    *           ┌──────┴──────┐                ┌─└┬┘──┐
    *           │system_server│                │iorapd│
    *           └─────────────┘                └──────┘
    *
    * </pre> <!-- system/iorap/docs/binder/IIorap_setTaskListener.plantuml -->
    */
    void setTaskListener(ITaskListener listener);

    // All callbacks will be done via the ITaskListener.
    // The RequestId passed in is the same RequestId sent back via the ITaskListener.
    // See above for more details.

    // Note: For each ${Type}Event, see the ${Type}Event.java for more documentation
    // in frameworks/base/startop/src/com/google/android/startop/iorap/${Type}Event.java

    // void onActivityHintEvent(in RequestId request, in ActivityHintEvent event);
    void onAppLaunchEvent(in RequestId request, in AppLaunchEvent event);
    void onDexOptEvent(in RequestId request, in DexOptEvent event);
    void onJobScheduledEvent(in RequestId request, in JobScheduledEvent event);
    void onPackageEvent(in RequestId request, in PackageEvent event);
    void onAppIntentEvent(in RequestId request, in AppIntentEvent event);
    void onSystemServiceEvent(in RequestId request, in SystemServiceEvent event);
    void onSystemServiceUserEvent(in RequestId request, in SystemServiceUserEvent event);
}
