blob: 6685967ca5d95965a23e56e3d920c4be6649e245 [file] [log] [blame]
Ray Essick3938dc62016-11-01 08:56:56 -07001/*
Ray Essick845eb1e2017-05-02 15:59:47 -07002 * Copyright (C) 2017 The Android Open Source Project
Ray Essick3938dc62016-11-01 08:56:56 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18#ifndef ANDROID_MEDIAANALYTICSSERVICE_H
19#define ANDROID_MEDIAANALYTICSSERVICE_H
20
21#include <arpa/inet.h>
22
23#include <utils/threads.h>
24#include <utils/Errors.h>
25#include <utils/KeyedVector.h>
26#include <utils/String8.h>
27#include <utils/List.h>
28
29#include <media/IMediaAnalyticsService.h>
30
Ray Essick845eb1e2017-05-02 15:59:47 -070031#include "MetricsSummarizer.h"
32
Ray Essick3938dc62016-11-01 08:56:56 -070033
34namespace android {
35
36class MediaAnalyticsService : public BnMediaAnalyticsService
37{
38
39 public:
40
Ray Essickb5fac8e2016-12-12 11:33:56 -080041 // on this side, caller surrenders ownership
42 virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
Ray Essick3938dc62016-11-01 08:56:56 -070043
Ray Essick3938dc62016-11-01 08:56:56 -070044 static void instantiate();
45 virtual status_t dump(int fd, const Vector<String16>& args);
46
47 MediaAnalyticsService();
48 virtual ~MediaAnalyticsService();
49
50 private:
51 MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
52
53 // statistics about our analytics
54 int64_t mItemsSubmitted;
55 int64_t mItemsFinalized;
56 int64_t mItemsDiscarded;
Ray Essick845eb1e2017-05-02 15:59:47 -070057 int64_t mSetsDiscarded;
Ray Essick3938dc62016-11-01 08:56:56 -070058 MediaAnalyticsItem::SessionID_t mLastSessionID;
59
60 // partitioned a bit so we don't over serialize
61 mutable Mutex mLock;
62 mutable Mutex mLock_ids;
63
64 // the most we hold in memory
65 // up to this many in each queue (open, finalized)
66 int32_t mMaxRecords;
Ray Essick845eb1e2017-05-02 15:59:47 -070067 // # of sets of summaries
68 int32_t mMaxRecordSets;
69 // nsecs until we start a new record set
70 nsecs_t mNewSetInterval;
Ray Essick3938dc62016-11-01 08:56:56 -070071
72 // input validation after arrival from client
Ray Essickd38e1742017-01-23 15:17:06 -080073 bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
Ray Essickb5fac8e2016-12-12 11:33:56 -080074 bool rateLimited(MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -070075
76 // the ones that are still open
77 // (newest at front) since we keep looking for them
Ray Essickb5fac8e2016-12-12 11:33:56 -080078 List<MediaAnalyticsItem *> *mOpen;
Ray Essick3938dc62016-11-01 08:56:56 -070079 // the ones we've finalized
80 // (oldest at front) so it prints nicely for dumpsys
Ray Essickb5fac8e2016-12-12 11:33:56 -080081 List<MediaAnalyticsItem *> *mFinalized;
Ray Essick3938dc62016-11-01 08:56:56 -070082 // searching within these queues: queue, key
Ray Essickb5fac8e2016-12-12 11:33:56 -080083 MediaAnalyticsItem *findItem(List<MediaAnalyticsItem *> *,
84 MediaAnalyticsItem *, bool removeit);
Ray Essick3938dc62016-11-01 08:56:56 -070085
Ray Essick845eb1e2017-05-02 15:59:47 -070086 // summarizers
87 void summarize(MediaAnalyticsItem *item);
88 class SummarizerSet {
89 nsecs_t mStarted;
90 List<MetricsSummarizer *> *mSummarizers;
91
92 public:
93 void appendSummarizer(MetricsSummarizer *s) {
94 if (s) {
95 mSummarizers->push_back(s);
96 }
97 };
98 nsecs_t getStarted() { return mStarted;}
99 void setStarted(nsecs_t started) {mStarted = started;}
100 List<MetricsSummarizer *> *getSummarizers() { return mSummarizers;}
101
102 SummarizerSet();
103 ~SummarizerSet();
104 };
105 void newSummarizerSet();
106 List<SummarizerSet *> *mSummarizerSets;
107 SummarizerSet *mCurrentSet;
108 List<MetricsSummarizer *> *getFirstSet() {
109 List<SummarizerSet *>::iterator first = mSummarizerSets->begin();
110 if (first != mSummarizerSets->end()) {
111 return (*first)->getSummarizers();
112 }
113 return NULL;
114 }
115
Ray Essickb5fac8e2016-12-12 11:33:56 -0800116 void saveItem(MediaAnalyticsItem);
117 void saveItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *, int);
118 void deleteItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -0700119
Ray Essick845eb1e2017-05-02 15:59:47 -0700120 // support for generating output
Ray Essickb5fac8e2016-12-12 11:33:56 -0800121 String8 dumpQueue(List<MediaAnalyticsItem*> *);
Ray Essick845eb1e2017-05-02 15:59:47 -0700122 String8 dumpQueue(List<MediaAnalyticsItem*> *, nsecs_t, const char *only);
123
124 void dumpHeaders(String8 &result, nsecs_t ts_since);
125 void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only);
126 void dumpRecent(String8 &result, nsecs_t ts_since, const char * only);
Ray Essick3938dc62016-11-01 08:56:56 -0700127
128};
129
130// ----------------------------------------------------------------------------
131
132}; // namespace android
133
134#endif // ANDROID_MEDIAANALYTICSSERVICE_H