// Copyright 2019 The Chromium OS 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 BIOD_POWER_BUTTON_FILTER_H_
#define BIOD_POWER_BUTTON_FILTER_H_

#include <memory>
#include <string>

#include <base/time/tick_clock.h>
#include <base/time/time.h>
#include <base/sys_info.h>
#include <cros_config/cros_config_interface.h>

#include <dbus/bus.h>

#include "biod/power_button_filter_interface.h"
#include "biod/power_manager_client.h"

namespace biod {

constexpr char kCrosConfigFPPath[] = "/fingerprint";
constexpr char kFingerprintSensorTypePrefName[] = "fingerprint-sensor-type";
constexpr char kFingerprintSensorTypeOverlapped[] = "on-power-button";
constexpr char kFingerprintSensorTypeStandAlone[] = "stand-alone";

// Number of msecs to ignore fp match after seeing a power button down event on
// devices with fp overlapped on power button. This is picked based on max
// time taken to match/nomatch fp during an auth session
// (http://shortn/_O6PdXwhIqy ). Note that |kAuthIgnoreTimeoutmsecs| is padded
// above the current maximum time (600msecs) FP sensor takes to process a touch
// to accommodate minor regressions in the future.
// TODO(ravisadineni): Add autotest to verify that the time taken to fp match is
// less than 1000 msecs..
constexpr int64_t kAuthIgnoreTimeoutmsecs = 1000;

class PowerButtonFilter : public PowerButtonFilterInterface,
                          public PowerEventObserver {
 public:
  static std::unique_ptr<PowerButtonFilterInterface> Create(
      const scoped_refptr<dbus::Bus>& bus);
  static std::unique_ptr<PowerButtonFilterInterface>
  create_power_button_filter_for_test(
      std::unique_ptr<PowerManagerClientInterface> power_manager_client,
      std::unique_ptr<brillo::CrosConfigInterface> cros_config_prefs,
      std::unique_ptr<base::TickClock> tick_clock);
  ~PowerButtonFilter() override = default;

  void Init(std::unique_ptr<PowerManagerClientInterface> power_manager_client,
            std::unique_ptr<brillo::CrosConfigInterface> cros_config_prefs,
            std::unique_ptr<base::TickClock> tick_clock);

  // PowerButtonFilterInterface implementation.
  bool ShouldFilterFingerprintMatch() override;

  // Implements PowerEventObserver.
  void PowerButtonEventReceived(bool down,
                                const base::TimeTicks& timestamp) override;

 private:
  PowerButtonFilter() = default;

  // Timestamp of last power button event.
  base::TimeTicks last_power_button_event_;
  // Is fp touch already filtered for the latest power button event? This helps
  // us from filtering multiple fingerprint touch events for the same power
  // button event. This is added to prevent powerbutton events before suspend
  // from filtering fingerprint events after (responsible for) resume as
  // DefaultTick clock and powerbutton event timestamp (sent by powerd) use
  // CLOCK_MONOTONIC which stands still in suspend (on linux). Defaulted to true
  // to prevent filtering before any power button press.
  bool is_already_filtered_ = true;
  std::unique_ptr<PowerManagerClientInterface> power_manager_client_;
  std::unique_ptr<brillo::CrosConfigInterface> cros_config_prefs_;
  std::unique_ptr<base::TickClock> tick_clock_;

  bool fp_on_power_button_ = false;

  DISALLOW_COPY_AND_ASSIGN(PowerButtonFilter);
};

}  // namespace biod

#endif  // BIOD_POWER_BUTTON_FILTER_H_
