/*
 * 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.
 */

package android.app;

import android.annotation.IntDef;
import android.content.ComponentName;
import android.os.Parcel;
import android.os.Parcelable;

import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Information returned after waiting for an activity start.
 *
 * @hide
 */
public class WaitResult implements Parcelable {

    /**
     * The state at which a launch sequence had started.
     *
     * @see <a href="https://developer.android.com/topic/performance/vitals/launch-time"App startup
     * time</a>
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"LAUNCH_STATE_"}, value = {
            LAUNCH_STATE_COLD,
            LAUNCH_STATE_WARM,
            LAUNCH_STATE_HOT
    })
    public @interface LaunchState {
    }

    /**
     * Cold launch sequence: a new process has started.
     */
    public static final int LAUNCH_STATE_COLD = 1;

    /**
     * Warm launch sequence: process reused, but activity has to be created.
     */
    public static final int LAUNCH_STATE_WARM = 2;

    /**
     * Hot launch sequence: process reused, activity brought-to-top.
     */
    public static final int LAUNCH_STATE_HOT = 3;

    public static final int INVALID_DELAY = -1;
    public int result;
    public boolean timeout;
    public ComponentName who;
    public long totalTime;
    public @LaunchState int launchState;

    public WaitResult() {
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(result);
        dest.writeInt(timeout ? 1 : 0);
        ComponentName.writeToParcel(who, dest);
        dest.writeLong(totalTime);
        dest.writeInt(launchState);
    }

    public static final Parcelable.Creator<WaitResult> CREATOR
            = new Parcelable.Creator<WaitResult>() {
        @Override
        public WaitResult createFromParcel(Parcel source) {
            return new WaitResult(source);
        }

        @Override
        public WaitResult[] newArray(int size) {
            return new WaitResult[size];
        }
    };

    private WaitResult(Parcel source) {
        result = source.readInt();
        timeout = source.readInt() != 0;
        who = ComponentName.readFromParcel(source);
        totalTime = source.readLong();
        launchState = source.readInt();
    }

    public void dump(PrintWriter pw, String prefix) {
        pw.println(prefix + "WaitResult:");
        pw.println(prefix + "  result=" + result);
        pw.println(prefix + "  timeout=" + timeout);
        pw.println(prefix + "  who=" + who);
        pw.println(prefix + "  totalTime=" + totalTime);
        pw.println(prefix + "  launchState=" + launchState);
    }

    public static String launchStateToString(@LaunchState int type) {
        switch (type) {
            case LAUNCH_STATE_COLD:
                return "COLD";
            case LAUNCH_STATE_WARM:
                return "WARM";
            case LAUNCH_STATE_HOT:
                return "HOT";
            default:
                return "UNKNOWN (" + type + ")";
        }
    }
}