Extract SharingMessageSender

SharingMessageSender replaces ResponseCallbackHelper. This ensures
SharingFCMSender does not need to surface any other API.

Bug: 1018274
Change-Id: Ieb9f7010ddeedc694fcfe72ff49c5659d758690d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1895660
Commit-Queue: Himanshu Jaju <[email protected]>
Reviewed-by: Alex Chau <[email protected]>
Cr-Commit-Position: refs/heads/master@{#712218}
diff --git a/chrome/browser/sharing/sharing_message_sender.h b/chrome/browser/sharing/sharing_message_sender.h
new file mode 100644
index 0000000..b44a4e6
--- /dev/null
+++ b/chrome/browser/sharing/sharing_message_sender.h
@@ -0,0 +1,83 @@
+// Copyright 2019 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 CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
+#define CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
+
+#include <map>
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+
+namespace chrome_browser_sharing {
+enum MessageType : int;
+class ResponseMessage;
+class SharingMessage;
+}  // namespace chrome_browser_sharing
+
+namespace syncer {
+class LocalDeviceInfoProvider;
+}  // namespace syncer
+
+class SharingFCMSender;
+class SharingSyncPreference;
+enum class SharingSendMessageResult;
+
+class SharingMessageSender {
+ public:
+  using ResponseCallback = base::OnceCallback<void(
+      SharingSendMessageResult,
+      std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
+
+  SharingMessageSender(
+      SharingFCMSender* sharing_fcm_sender,
+      SharingSyncPreference* sync_prefs,
+      syncer::LocalDeviceInfoProvider* local_device_info_provider);
+  virtual ~SharingMessageSender();
+
+  virtual void SendMessageToDevice(
+      const std::string& device_guid,
+      base::TimeDelta response_timeout,
+      chrome_browser_sharing::SharingMessage message,
+      ResponseCallback callback);
+
+  virtual void OnAckReceived(
+      chrome_browser_sharing::MessageType message_type,
+      const std::string& message_id,
+      std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
+
+ private:
+  void OnMessageSent(base::TimeTicks start_time,
+                     const std::string& message_guid,
+                     chrome_browser_sharing::MessageType message_type,
+                     SharingSendMessageResult result,
+                     base::Optional<std::string> message_id);
+
+  void InvokeSendMessageCallback(
+      const std::string& message_guid,
+      chrome_browser_sharing::MessageType message_type,
+      SharingSendMessageResult result,
+      std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
+
+  SharingFCMSender* fcm_sender_;
+  SharingSyncPreference* sync_prefs_;
+  syncer::LocalDeviceInfoProvider* local_device_info_provider_;
+
+  // Map of random GUID to SendMessageCallback.
+  std::map<std::string, ResponseCallback> send_message_callbacks_;
+  // Map of FCM message_id to time at start of send message request to FCM.
+  std::map<std::string, base::TimeTicks> send_message_times_;
+  // Map of FCM message_id to random GUID.
+  std::map<std::string, std::string> message_guids_;
+
+  base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(SharingMessageSender);
+};
+
+#endif  // CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_