1// Copyright 2014 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 COMPONENTS_METRICS_METRICS_REPORTING_SCHEDULER_H_
6#define COMPONENTS_METRICS_METRICS_REPORTING_SCHEDULER_H_
7
8#include "base/basictypes.h"
9#include "base/callback.h"
10#include "base/memory/weak_ptr.h"
11#include "base/time/time.h"
12#include "base/timer/timer.h"
13
14namespace metrics {
15
16// Scheduler task to drive a MetricsService object's uploading.
17class MetricsReportingScheduler {
18 public:
19  explicit MetricsReportingScheduler(const base::Closure& upload_callback);
20  ~MetricsReportingScheduler();
21
22  // Starts scheduling uploads. This in a no-op if the scheduler is already
23  // running, so it is safe to call more than once.
24  void Start();
25
26  // Stops scheduling uploads.
27  void Stop();
28
29  // Callback from MetricsService when the startup init task has completed.
30  void InitTaskComplete();
31
32  // Callback from MetricsService when a triggered upload finishes.
33  void UploadFinished(bool server_is_healthy, bool more_logs_remaining);
34
35  // Callback from MetricsService when a triggered upload is cancelled by the
36  // MetricsService.
37  void UploadCancelled();
38
39  // Sets the upload interval to a specific value, exposed for unit tests.
40  void SetUploadIntervalForTesting(base::TimeDelta interval);
41
42 private:
43  // Timer callback indicating it's time for the MetricsService to upload
44  // metrics.
45  void TriggerUpload();
46
47  // Schedules a future call to TriggerUpload if one isn't already pending.
48  void ScheduleNextUpload();
49
50  // Increases the upload interval each time it's called, to handle the case
51  // where the server is having issues.
52  void BackOffUploadInterval();
53
54  // The MetricsService method to call when uploading should happen.
55  const base::Closure upload_callback_;
56
57  base::OneShotTimer<MetricsReportingScheduler> upload_timer_;
58
59  // The interval between being told an upload is done and starting the next
60  // upload.
61  base::TimeDelta upload_interval_;
62
63  // Indicates that the scheduler is running (i.e., that Start has been called
64  // more recently than Stop).
65  bool running_;
66
67  // Indicates that the last triggered upload hasn't resolved yet.
68  bool callback_pending_;
69
70  // Whether the InitTaskComplete() callback has been called.
71  bool init_task_complete_;
72
73  // Whether the initial scheduled upload timer has fired before the init task
74  // has been completed.
75  bool waiting_for_init_task_complete_;
76
77  DISALLOW_COPY_AND_ASSIGN(MetricsReportingScheduler);
78};
79
80}  // namespace metrics
81
82#endif  // COMPONENTS_METRICS_METRICS_REPORTING_SCHEDULER_H_
83