// 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/system/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_
