chromium/ash/quick_pair/companion_app/companion_app_parser.h

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

#ifndef ASH_QUICK_PAIR_COMPANION_APP_COMPANION_APP_PARSER_H_
#define ASH_QUICK_PAIR_COMPANION_APP_COMPANION_APP_PARSER_H_

#include <optional>

#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"

namespace ash {
namespace quick_pair {

class Device;
class DeviceMetadata;

// CompanionAppParser finds the name of a device's companion app
// Call GetAppPackageName to use
class CompanionAppParser {
 public:
  CompanionAppParser();
  CompanionAppParser(const CompanionAppParser&) = delete;
  CompanionAppParser& operator=(const CompanionAppParser&) = delete;
  ~CompanionAppParser();

  // Finds the name of the given device's companion app
  // The optional string in the callback will be null if an error
  // occurs or if no companion app for this device was found
  void GetAppPackageName(scoped_refptr<Device> device,
                         base::OnceCallback<void(std::optional<std::string>)>
                             on_companion_app_parsed);

 private:
  void OnDeviceMetadataRetrieved(
      scoped_refptr<Device> device,
      base::OnceCallback<void(std::optional<std::string>)> callback,
      DeviceMetadata* device_metadata,
      bool retryable_err);

  std::optional<std::string> GetCompanionAppExtra(
      const std::string& intent_as_string);

  base::WeakPtrFactory<CompanionAppParser> weak_pointer_factory_{this};
};

}  // namespace quick_pair
}  // namespace ash

#endif  // ASH_QUICK_PAIR_COMPANION_APP_COMPANION_APP_PARSER_H_