1 /*
2  * Copyright (C) 2018 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 #ifndef DRM_METRICS_H_
18 #define DRM_METRICS_H_
19 
20 #include <map>
21 
22 #include <android/hardware/drm/1.0/types.h>
23 #include <android/hardware/drm/1.1/types.h>
24 #include <android/hardware/drm/1.2/types.h>
25 #include <binder/PersistableBundle.h>
26 #include <media/CounterMetric.h>
27 #include <media/EventMetric.h>
28 #include <sys/types.h>
29 
30 namespace android {
31 
32 /**
33  * This class contains the definition of metrics captured within MediaDrm.
34  * It also contains a method for exporting all of the metrics to a
35  * PersistableBundle.
36  */
37 class MediaDrmMetrics {
38  public:
39   explicit MediaDrmMetrics();
~MediaDrmMetrics()40   virtual ~MediaDrmMetrics() {};
41   // Count of openSession calls.
42   CounterMetric<status_t> mOpenSessionCounter;
43   // Count of closeSession calls.
44   CounterMetric<status_t> mCloseSessionCounter;
45   // Count and timing of getKeyRequest calls.
46   EventMetric<status_t> mGetKeyRequestTimeUs;
47   // Count and timing of provideKeyResponse calls.
48   EventMetric<status_t> mProvideKeyResponseTimeUs;
49   // Count of getProvisionRequest calls.
50   CounterMetric<status_t> mGetProvisionRequestCounter;
51   // Count of provideProvisionResponse calls.
52   CounterMetric<status_t> mProvideProvisionResponseCounter;
53 
54   // Count of key status events broken out by status type.
55   CounterMetric<::android::hardware::drm::V1_2::KeyStatusType>
56       mKeyStatusChangeCounter;
57   // Count of events broken out by event type
58   CounterMetric<::android::hardware::drm::V1_0::EventType> mEventCounter;
59 
60   // Count getPropertyByteArray calls to retrieve the device unique id.
61   CounterMetric<status_t> mGetDeviceUniqueIdCounter;
62 
63   // Adds a session start time record.
64   void SetSessionStart(const Vector<uint8_t>& sessionId);
65 
66   // Adds a session end time record.
67   void SetSessionEnd(const Vector<uint8_t>& sessionId);
68 
69   // The app package name is the application package name that is using the
70   // instance. The app package name is held here for convenience. It is not
71   // serialized or exported with the metrics.
SetAppPackageName(const String8 & appPackageName)72   void SetAppPackageName(const String8& appPackageName) { mAppPackageName = appPackageName; }
GetAppPackageName()73   const String8& GetAppPackageName() { return mAppPackageName; }
74 
SetAppUid(uid_t appUid)75   void SetAppUid(uid_t appUid) { mAppUid = appUid; }
GetAppUid()76   uid_t GetAppUid() const { return mAppUid; }
77 
78   // Get the serialized metrics. Metrics are formatted as a serialized
79   // DrmFrameworkMetrics proto. If there is a failure serializing the metrics,
80   // this returns an error. The parameter |serlializedMetrics| is owned by the
81   // caller and must not be null.
82   status_t GetSerializedMetrics(std::string* serializedMetrics);
83 
84   // Get copy of session lifetimes.
85   std::map<std::string, std::pair<int64_t, int64_t>> GetSessionLifespans() const;
86 
87  protected:
88   // This is visible for testing only.
89   virtual int64_t GetCurrentTimeMs();
90 
91  private:
92   // Session lifetimes. A pair of values representing the milliseconds since
93   // epoch, UTC. The first value is the start time, the second is the end time.
94   std::map<std::string, std::pair<int64_t, int64_t>> mSessionLifespans;
95 
96   String8 mAppPackageName;
97   uid_t mAppUid{~0u};
98 };
99 
100 }  // namespace android
101 
102 #endif  // DRM_METRICS_H_
103