/*
 * Copyright (C) 2013 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.android.internal.policy;

import android.content.Intent;
import com.android.internal.policy.IKeyguardDrawnCallback;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.policy.IKeyguardStateCallback;
import com.android.internal.policy.IKeyguardExitCallback;

import android.os.Bundle;

oneway interface IKeyguardService {

    /**
     * Sets the Keyguard as occluded when a window dismisses the Keyguard with flag
     * FLAG_SHOW_ON_LOCK_SCREEN.
     *
     * @param isOccluded Whether the Keyguard is occluded by another window.
     * @param animate Whether to play an animation for the state change.
     */
    void setOccluded(boolean isOccluded, boolean animate);

    void addStateMonitorCallback(IKeyguardStateCallback callback);
    void verifyUnlock(IKeyguardExitCallback callback);
    void dismiss(IKeyguardDismissCallback callback, CharSequence message);
    void onDreamingStarted();
    void onDreamingStopped();

    /**
     * Called when the device has started going to sleep.
     *
     * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason
     * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT.
     */
    void onStartedGoingToSleep(int pmSleepReason);

    /**
     * Called when the device has finished going to sleep.
     *
     * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason
     * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT.
     * @param powerButtonLaunchGestureTriggered whether the power button double tap gesture was
     *                               triggered between {@link #onStartedGoingToSleep} and this
     *                               method; if it's been triggered, we shouldn't lock the device.
     */
    void onFinishedGoingToSleep(int pmSleepReason, boolean powerButtonLaunchGestureTriggered);

    /**
     * Called when the device has started waking up.

     * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the reason we're waking up,
     * such as WAKE_REASON_POWER_BUTTON or WAKE_REASON_GESTURE.
     * @param powerButtonLaunchGestureTriggered Whether we're waking up due to a power button
     * double tap gesture.
     */
    void onStartedWakingUp(int pmWakeReason,  boolean powerButtonLaunchGestureTriggered);

    /**
     * Called when the device has finished waking up.
     */
    void onFinishedWakingUp();

    /**
    * Screen turning on reason: unknown
    */
    const int SCREEN_TURNING_ON_REASON_UNKNOWN = 0;

    /**
     * Screen turning on reason: the screen is turning on because of a display switch,
     * e.g. turning on the opposite screen when unfolding a foldable device
     */
    const int SCREEN_TURNING_ON_REASON_DISPLAY_SWITCH = 1;

    /**
     * Called when the device screen is turning on.
     * @param reason the reason for the screen turning on, must be one of
     *        IKeyguardService.SCREEN_TURNING_ON_REASON_*
     * @param callback the callback that should executed when SystemUI has finished preparations
     *        for turning on the screen
     */
    void onScreenTurningOn(int reason, IKeyguardDrawnCallback callback);

    /**
     * Called when the screen has actually turned on.
     */
    void onScreenTurnedOn();

    /**
     * Called when the screen starts turning off.
     */
    void onScreenTurningOff();

    /**
     * Called when the screen has turned off.
     */
    void onScreenTurnedOff();

    @UnsupportedAppUsage
    void setKeyguardEnabled(boolean enabled);
    void onSystemReady();
    @UnsupportedAppUsage
    void doKeyguardTimeout(in Bundle options);
    void setSwitchingUser(boolean switching);
    void setCurrentUser(int userId);
    void onBootCompleted();

    /**
     * Notifies that the activity behind has now been drawn and it's safe to remove the wallpaper
     * and keyguard flag.
     *
     * @param startTime the start time of the animation in uptime milliseconds
     * @param fadeoutDuration the duration of the exit animation, in milliseconds
     */
    void startKeyguardExitAnimation(long startTime, long fadeoutDuration);

    /**
     * Notifies the Keyguard that the power key was pressed while locked and launched Home rather
     * than putting the device to sleep or waking up. Note that it's called only if the device is
     * interactive.
     */
    void onShortPowerPressedGoHome();

    /**
     * Notifies the Keyguard that it needs to bring up a bouncer and then launch the intent as soon
     * as user unlocks the watch.
     */
    void dismissKeyguardToLaunch(in Intent intentToLaunch);

    /**
     * Notifies the Keyguard that a key was pressed while locked so the Keyguard can handle it.
     * Note that it's called only if the device is interactive.
     */
    void onSystemKeyPressed(int keycode);

    /**
     * Requests to show the keyguard immediately without locking the device. Keyguard will show
     * whether a screen lock was configured or not (including if screen lock is SWIPE or NONE).
     */
    void showDismissibleKeyguard();
}
