1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
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 <future>
30 
31 #include <media/IMediaAnalyticsService.h>
32 
33 namespace android {
34 
35 class MediaAnalyticsService : public BnMediaAnalyticsService
36 {
37 
38  public:
39 
40     // on this side, caller surrenders ownership
41     virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
42 
43     static  void            instantiate();
44     virtual status_t        dump(int fd, const Vector<String16>& args);
45 
46                             MediaAnalyticsService();
47     virtual                 ~MediaAnalyticsService();
48 
49     bool processExpirations();
50 
51  private:
52     MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
53 
54     // statistics about our analytics
55     int64_t mItemsSubmitted;
56     int64_t mItemsFinalized;
57     int64_t mItemsDiscarded;
58     int64_t mItemsDiscardedExpire;
59     int64_t mItemsDiscardedCount;
60     MediaAnalyticsItem::SessionID_t mLastSessionID;
61 
62     // partitioned a bit so we don't over serialize
63     mutable Mutex           mLock;
64     mutable Mutex           mLock_ids;
65     mutable Mutex           mLock_mappings;
66 
67     // limit how many records we'll retain
68     // by count (in each queue (open, finalized))
69     int32_t mMaxRecords;
70     // by time (none older than this long agan
71     nsecs_t mMaxRecordAgeNs;
72     // max to expire per expirations_l() invocation
73     int32_t mMaxRecordsExpiredAtOnce;
74     //
75     // # of sets of summaries
76     int32_t mMaxRecordSets;
77     // nsecs until we start a new record set
78     nsecs_t mNewSetInterval;
79 
80     // input validation after arrival from client
81     bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
82     bool rateLimited(MediaAnalyticsItem *);
83 
84     // (oldest at front) so it prints nicely for dumpsys
85     List<MediaAnalyticsItem *> mItems;
86     void saveItem(MediaAnalyticsItem *);
87 
88     bool expirations_l(MediaAnalyticsItem *);
89     std::future<bool> mExpireFuture;
90 
91     // support for generating output
92     int mDumpProto;
93     int mDumpProtoDefault;
94     String8 dumpQueue();
95     String8 dumpQueue(nsecs_t, const char *only);
96 
97     void dumpHeaders(String8 &result, nsecs_t ts_since);
98     void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only);
99     void dumpRecent(String8 &result, nsecs_t ts_since, const char * only);
100 
101     // mapping uids to package names
102     struct UidToPkgMap {
103         uid_t uid;
104         std::string pkg;
105         std::string installer;
106         int64_t versionCode;
107         nsecs_t expiration;
108     };
109 
110     KeyedVector<uid_t,struct UidToPkgMap>  mPkgMappings;
111     void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion);
112 
113 };
114 
115 // hook to send things off to the statsd subsystem
116 extern bool dump2Statsd(MediaAnalyticsItem *item);
117 
118 // ----------------------------------------------------------------------------
119 
120 }; // namespace android
121 
122 #endif // ANDROID_MEDIAANALYTICSSERVICE_H
123