// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_LOCK_SCREEN_ACTION_LOCK_SCREEN_NOTE_DISPLAY_STATE_HANDLER_H_
#define ASH_LOCK_SCREEN_ACTION_LOCK_SCREEN_NOTE_DISPLAY_STATE_HANDLER_H_

#include <memory>

#include "ash/system/power/backlights_forced_off_setter.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h"
#include "base/timer/timer.h"

namespace ash {

class LockScreenNoteLauncher;
class ScopedBacklightsForcedOff;

// Handles display state changes related to lock screen note state.
// For example it will close any active lock screen notes if the display is
// forced off.
// This class also handles a lock screen note launch when stylus is ejected.
// When the note is launched while the screen is off, note launch forces the
// display off, in order to delay screen being turned on (which happens, among
// other things, when the stylus gets ejected) until the lock screen note is
// visible. This is to prevent a flash of the lock screen UI as the lock screen
// note app window is being shown.
class LockScreenNoteDisplayStateHandler
    : public BacklightsForcedOffSetter::Observer {
 public:
  explicit LockScreenNoteDisplayStateHandler(
      BacklightsForcedOffSetter* backlights_forced_off_setter);
  ~LockScreenNoteDisplayStateHandler() override;

  base::OneShotTimer* launch_timer_for_test() { return &launch_timer_; }

  // BacklightsForcedOffSetter::Observer:
  void OnBacklightsForcedOffChanged(bool backlights_forced_off) override;
  void OnScreenStateChanged(
      BacklightsForcedOffSetter::ScreenState screen_state) override;

  // If lock screen note action is available, it requests a new lock screen note
  // with launch reason set to stylus eject.
  void AttemptNoteLaunchForStylusEject();

  // Resets the internal state, cancelling any in progress launch.
  void Reset();

 private:
  // Runs lock screen note launcher, which starts lock screen app launch.
  void RunLockScreenNoteLauncher();

  // Whether the backlights should be forced off during lock screen note
  // launch.
  bool ShouldForceBacklightsOffForNoteLaunch() const;

  // Whether a lock screen note is currently being launched by |this|.
  bool NoteLaunchInProgressOrDelayed() const;

  // Called by |lock_screen_note_launcher_| when lock screen note launch is
  // done.
  void NoteLaunchDone(bool success);

  // Object used to force the backlights off.
  BacklightsForcedOffSetter* const backlights_forced_off_setter_;

  // Whether lock screen note launch is delayed until the screen is reported to
  // be off - this is used if lock screen note launch is requested when
  // backlights have been forced off, but the power manager still reports screen
  // to be on.
  bool note_launch_delayed_until_screen_off_ = false;

  std::unique_ptr<LockScreenNoteLauncher> lock_screen_note_launcher_;

  // Scoped backlights forced off request - this is returned by
  // |backlights_forced_off_setter_->ForceBacklightsOff()|, and will keep the
  // backlights in forced-off state until they are reset.
  std::unique_ptr<ScopedBacklightsForcedOff> backlights_forced_off_;

  // Timer used to set up timeout for lock screen note launch.
  base::OneShotTimer launch_timer_;

  ScopedObserver<BacklightsForcedOffSetter, BacklightsForcedOffSetter::Observer>
      backlights_forced_off_observer_;

  base::WeakPtrFactory<LockScreenNoteDisplayStateHandler> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(LockScreenNoteDisplayStateHandler);
};

}  // namespace ash

#endif  // ASH_LOCK_SCREEN_ACTION_LOCK_SCREEN_NOTE_DISPLAY_STATE_HANDLER_H_
