13938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick/*
22e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick * Copyright (C) 2017 The Android Open Source Project
33938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick *
43938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * Licensed under the Apache License, Version 2.0 (the "License");
53938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * you may not use this file except in compliance with the License.
63938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * You may obtain a copy of the License at
73938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick *
83938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick *      http://www.apache.org/licenses/LICENSE-2.0
93938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick *
103938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * Unless required by applicable law or agreed to in writing, software
113938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * distributed under the License is distributed on an "AS IS" BASIS,
123938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * See the License for the specific language governing permissions and
143938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * limitations under the License.
153938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick */
163938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
173938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
183938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#ifndef ANDROID_MEDIAANALYTICSSERVICE_H
193938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#define ANDROID_MEDIAANALYTICSSERVICE_H
203938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
213938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <arpa/inet.h>
223938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
233938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/threads.h>
243938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/Errors.h>
253938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/KeyedVector.h>
263938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/String8.h>
273938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/List.h>
283938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
293938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <media/IMediaAnalyticsService.h>
303938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
312e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick#include "MetricsSummarizer.h"
322e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick
333938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
343938dc6363949ef126bb6188d26b5bef6db8be4dRay Essicknamespace android {
353938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
363938dc6363949ef126bb6188d26b5bef6db8be4dRay Essickclass MediaAnalyticsService : public BnMediaAnalyticsService
373938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick{
383938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
393938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick public:
403938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
41b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    // on this side, caller surrenders ownership
42b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
433938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
443938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    static  void            instantiate();
453938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    virtual status_t        dump(int fd, const Vector<String16>& args);
463938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
473938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick                            MediaAnalyticsService();
483938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    virtual                 ~MediaAnalyticsService();
493938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
503938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick private:
513938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
523938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
533938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // statistics about our analytics
543938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    int64_t mItemsSubmitted;
553938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    int64_t mItemsFinalized;
563938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    int64_t mItemsDiscarded;
57f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    int64_t mItemsDiscardedExpire;
58f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    int64_t mItemsDiscardedCount;
592e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    int64_t mSetsDiscarded;
603938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    MediaAnalyticsItem::SessionID_t mLastSessionID;
613938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
623938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // partitioned a bit so we don't over serialize
633938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    mutable Mutex           mLock;
643938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    mutable Mutex           mLock_ids;
65fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick    mutable Mutex           mLock_mappings;
663938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
67f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    // limit how many records we'll retain
68f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    // by count (in each queue (open, finalized))
693938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    int32_t mMaxRecords;
70f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    // by time (none older than this long agan
71f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    nsecs_t mMaxRecordAgeNs;
72f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    //
732e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    // # of sets of summaries
742e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    int32_t mMaxRecordSets;
752e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    // nsecs until we start a new record set
762e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    nsecs_t mNewSetInterval;
773938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
783938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // input validation after arrival from client
79d38e174ddbde8e7419ba01deaded4ff0ead1caaaRay Essick    bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
80b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    bool rateLimited(MediaAnalyticsItem *);
813938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
823938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // the ones that are still open
833938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // (newest at front) since we keep looking for them
84b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    List<MediaAnalyticsItem *> *mOpen;
853938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // the ones we've finalized
863938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // (oldest at front) so it prints nicely for dumpsys
87b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    List<MediaAnalyticsItem *> *mFinalized;
883938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick    // searching within these queues: queue, key
89b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    MediaAnalyticsItem *findItem(List<MediaAnalyticsItem *> *,
90b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick                                     MediaAnalyticsItem *, bool removeit);
913938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
922e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    // summarizers
932e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    void summarize(MediaAnalyticsItem *item);
942e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    class SummarizerSet {
952e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        nsecs_t mStarted;
962e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        List<MetricsSummarizer *> *mSummarizers;
972e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick
982e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick      public:
992e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        void appendSummarizer(MetricsSummarizer *s) {
1002e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick            if (s) {
1012e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick                mSummarizers->push_back(s);
1022e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick            }
1032e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        };
1042e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        nsecs_t getStarted() { return mStarted;}
1052e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        void setStarted(nsecs_t started) {mStarted = started;}
1062e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        List<MetricsSummarizer *> *getSummarizers() { return mSummarizers;}
1072e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick
1082e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        SummarizerSet();
1092e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        ~SummarizerSet();
1102e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    };
1112e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    void newSummarizerSet();
1122e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    List<SummarizerSet *> *mSummarizerSets;
1132e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    SummarizerSet *mCurrentSet;
1142e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    List<MetricsSummarizer *> *getFirstSet() {
1152e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        List<SummarizerSet *>::iterator first = mSummarizerSets->begin();
1162e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        if (first != mSummarizerSets->end()) {
1172e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick            return (*first)->getSummarizers();
1182e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        }
1192e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick        return NULL;
1202e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    }
1212e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick
122b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    void saveItem(MediaAnalyticsItem);
123b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    void saveItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *, int);
124b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    void deleteItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *);
1253938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
1262e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    // support for generating output
127f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    int mDumpProto;
128b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick    String8 dumpQueue(List<MediaAnalyticsItem*> *);
1292e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    String8 dumpQueue(List<MediaAnalyticsItem*> *, nsecs_t, const char *only);
1302e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick
1312e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    void dumpHeaders(String8 &result, nsecs_t ts_since);
1322e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only);
1332e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    void dumpRecent(String8 &result, nsecs_t ts_since, const char * only);
1343938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
135f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    // mapping uids to package names
136f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    struct UidToPkgMap {
137f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        uid_t uid;
138f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        AString pkg;
139fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick        AString installer;
140fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick        int32_t versionCode;
141fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick        nsecs_t expiration;
142f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick    };
143f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
144fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick    KeyedVector<uid_t,struct UidToPkgMap>  mPkgMappings;
145fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick    void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion);
146f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
1473938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick};
1483938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
1493938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick// ----------------------------------------------------------------------------
1503938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
1513938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick}; // namespace android
1523938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick
1533938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#endif // ANDROID_MEDIAANALYTICSSERVICE_H
154