1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_NEARBY_SHARING_CONTACTS_NEARBY_SHARE_CONTACT_DOWNLOADER_IMPL_H_
6 #define CHROME_BROWSER_NEARBY_SHARING_CONTACTS_NEARBY_SHARE_CONTACT_DOWNLOADER_IMPL_H_
7 
8 #include <memory>
9 #include <string>
10 #include <vector>
11 
12 #include "base/optional.h"
13 #include "base/time/time.h"
14 #include "base/timer/timer.h"
15 #include "chrome/browser/nearby_sharing/common/nearby_share_http_result.h"
16 #include "chrome/browser/nearby_sharing/contacts/nearby_share_contact_downloader.h"
17 #include "chrome/browser/nearby_sharing/proto/contact_rpc.pb.h"
18 #include "chrome/browser/nearby_sharing/proto/rpc_resources.pb.h"
19 
20 class NearbyShareClient;
21 class NearbyShareClientFactory;
22 
23 // An implementation of the NearbyShareContactDownloader that uses
24 // NearbyShareClients to make HTTP calls. This class enforces a timeout for all
25 // HTTP calls but does not retry failures.
26 // TODO(https://crbug.com/1114516): Use SimpleURLLoader timeout functionality
27 // after refactoring our Nearby Share HTTP client.
28 class NearbyShareContactDownloaderImpl : public NearbyShareContactDownloader {
29  public:
30   class Factory {
31    public:
32     static std::unique_ptr<NearbyShareContactDownloader> Create(
33         const std::string& device_id,
34         base::TimeDelta timeout,
35         NearbyShareClientFactory* client_factory,
36         SuccessCallback success_callback,
37         FailureCallback failure_callback);
38     static void SetFactoryForTesting(Factory* test_factory);
39 
40    protected:
41     virtual ~Factory();
42     virtual std::unique_ptr<NearbyShareContactDownloader> CreateInstance(
43         const std::string& device_id,
44         base::TimeDelta timeout,
45         NearbyShareClientFactory* client_factory,
46         SuccessCallback success_callback,
47         FailureCallback failure_callback) = 0;
48 
49    private:
50     static Factory* test_factory_;
51   };
52 
53   ~NearbyShareContactDownloaderImpl() override;
54 
55  private:
56   // |timeout|: The maximum amount of time to wait between the request and
57   //            response of each HTTP call before failing.
58   NearbyShareContactDownloaderImpl(const std::string& device_id,
59                                    base::TimeDelta timeout,
60                                    NearbyShareClientFactory* client_factory,
61                                    SuccessCallback success_callback,
62                                    FailureCallback failure_callback);
63 
64   // NearbyShareContactDownloader:
65   void OnRun() override;
66 
67   void CallListContactPeople(
68       const base::Optional<std::string>& next_page_token);
69   void OnListContactPeopleSuccess(
70       const nearbyshare::proto::ListContactPeopleResponse& response);
71   void OnListContactPeopleFailure(NearbyShareHttpError error);
72   void OnListContactPeopleTimeout();
73 
74   size_t current_page_number_ = 0;
75   std::vector<nearbyshare::proto::ContactRecord> contacts_;
76   base::TimeDelta timeout_;
77   NearbyShareClientFactory* client_factory_ = nullptr;
78   std::unique_ptr<NearbyShareClient> client_;
79   base::OneShotTimer timer_;
80 };
81 
82 #endif  // CHROME_BROWSER_NEARBY_SHARING_CONTACTS_NEARBY_SHARE_CONTACT_DOWNLOADER_IMPL_H_
83