1  /*
2   * Copyright (c) 2022 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #include "bundle_active_module_record.h"
17  
18  namespace OHOS {
19  namespace DeviceUsageStats {
20  namespace {
21      static const int32_t MAX_FORM_NUM = 1000;
22  }
AddOrUpdateOneFormRecord(const std::string formName,const int32_t formDimension,const int64_t formId,const int64_t timeStamp,const int32_t uid)23  void BundleActiveModuleRecord::AddOrUpdateOneFormRecord(const std::string formName, const int32_t formDimension,
24      const int64_t formId, const int64_t timeStamp, const int32_t uid)
25  {
26      BundleActiveFormRecord newFormRecord(formName, formDimension, formId, timeStamp, userId_, uid);
27      for (auto& formRecord : formRecords_) {
28          if (formRecord == newFormRecord) {
29              formRecord.UpdateFormRecord(timeStamp);
30              return;
31          }
32      }
33      formRecords_.emplace_back(newFormRecord);
34  }
35  
RemoveOneFormRecord(const std::string formName,const int32_t formDimension,const int64_t formId)36  void BundleActiveModuleRecord::RemoveOneFormRecord(const std::string formName, const int32_t formDimension,
37      const int64_t formId)
38  {
39      for (auto it = formRecords_.begin(); it != formRecords_.end(); it++) {
40          if (*it == formId) {
41              formRecords_.erase(it);
42              return;
43          }
44      }
45  }
46  
UpdateModuleRecord(int64_t timeStamp)47  void BundleActiveModuleRecord::UpdateModuleRecord(int64_t timeStamp)
48  {
49      if (lastModuleUsedTime_ < timeStamp) {
50          lastModuleUsedTime_ = timeStamp;
51          launchedCount_++;
52      }
53  }
54  
BundleActiveModuleRecord()55  BundleActiveModuleRecord::BundleActiveModuleRecord()
56  {
57      deviceId_ = "";
58      bundleName_ = ""; // in database
59      moduleName_ = ""; // in database
60      abilityName_ = "";
61      appLabelId_ = 0;
62      labelId_ = 0;
63      descriptionId_ = 0;
64      abilityLableId_ = 0;
65      abilityDescriptionId_ = 0;
66      abilityIconId_ = 0;
67      launchedCount_ = 0;
68      lastModuleUsedTime_ = -1;
69      removed_ = false;
70      installFreeSupported_ = false;
71      isNewAdded_ = false;
72      userId_ = -1;
73      uid_ = 0;
74  }
75  
Marshalling(Parcel & parcel) const76  bool BundleActiveModuleRecord::Marshalling(Parcel &parcel) const
77  {
78      if (parcel.WriteString(deviceId_) &&
79          parcel.WriteString(bundleName_) &&
80          parcel.WriteString(moduleName_) &&
81          parcel.WriteString(abilityName_) &&
82          parcel.WriteUint32(appLabelId_) &&
83          parcel.WriteUint32(descriptionId_) &&
84          parcel.WriteUint32(abilityLableId_) &&
85          parcel.WriteUint32(abilityDescriptionId_) &&
86          parcel.WriteUint32(abilityIconId_) &&
87          parcel.WriteInt32(launchedCount_) &&
88          parcel.WriteInt64(lastModuleUsedTime_) &&
89          parcel.WriteUint32(formRecords_.size()) &&
90          parcel.WriteInt32(uid_)
91          ) {
92              for (auto formRecord : formRecords_) {
93                  formRecord.Marshalling(parcel);
94              }
95              return true;
96          }
97      return false;
98  }
99  
UnMarshalling(Parcel & parcel)100  std::shared_ptr<BundleActiveModuleRecord> BundleActiveModuleRecord::UnMarshalling(Parcel &parcel)
101  {
102      std::shared_ptr<BundleActiveModuleRecord> result = std::make_shared<BundleActiveModuleRecord>();
103      result->deviceId_ = parcel.ReadString();
104      result->bundleName_ = parcel.ReadString();
105      result->moduleName_ = parcel.ReadString();
106      result->abilityName_ = parcel.ReadString();
107      result->appLabelId_ = parcel.ReadUint32();
108      result->descriptionId_ = parcel.ReadUint32();
109      result->abilityLableId_ = parcel.ReadUint32();
110      result->abilityDescriptionId_ = parcel.ReadUint32();
111      result->abilityIconId_ = parcel.ReadUint32();
112      result->launchedCount_ = parcel.ReadInt32();
113      result->lastModuleUsedTime_ = parcel.ReadInt64();
114      uint32_t size = parcel.ReadUint32();
115      result->uid_ = parcel.ReadInt32();
116      if (size > MAX_FORM_NUM) {
117          return nullptr;
118      }
119      std::shared_ptr<BundleActiveFormRecord> tmp = std::make_shared<BundleActiveFormRecord>();
120      for (uint32_t i = 0; i < size; i++) {
121          tmp = tmp->UnMarshalling(parcel);
122          if (!tmp) {
123              continue;
124          }
125          result->formRecords_.emplace_back(*tmp);
126      }
127      return result;
128  }
129  
cmp(const BundleActiveModuleRecord & moduleRecordA,const BundleActiveModuleRecord & moduleRecordB)130  bool BundleActiveModuleRecord::cmp(const BundleActiveModuleRecord& moduleRecordA,
131      const BundleActiveModuleRecord& moduleRecordB)
132  {
133      return moduleRecordA.lastModuleUsedTime_ > moduleRecordB.lastModuleUsedTime_;
134  }
135  
ToString()136  std::string BundleActiveModuleRecord::ToString()
137  {
138      return "bundle name is " + this->bundleName_ +
139          ", module name is " + this->moduleName_ +
140          ", uid is " + std::to_string(this->uid_) +
141          ", last used time stamp is " + std::to_string(this->lastModuleUsedTime_) +
142          ", module is used for " + std::to_string(this->launchedCount_) + " times\n";
143  }
144  }  // namespace DeviceUsageStats
145  }  // namespace OHOS
146  
147