Update api about private_id
[platform/core/api/notification.git] / notification-ex / group_item.cc
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
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 #include <dlog.h>
18 #include <app_common.h>
19
20 #include <memory>
21 #include <vector>
22
23 #include "notification-ex/group_item.h"
24 #include "notification-ex/group_item_implementation.h"
25 #include "notification-ex/factory_manager.h"
26 #include "notification-ex/ex_util.h"
27 #include "notification-ex/exception.h"
28
29 #ifdef LOG_TAG
30 #undef LOG_TAG
31 #endif
32
33 #define LOG_TAG "NOTIFICATION_EX"
34 #define GROUP_CHILDREN_KEY "__GROUP_CHILDREN_KEY__"
35 #define GROUP_CHILDREN_TYPE_KEY "__GROUP_CHILDREN_TYPE_KEY__"
36 #define GROUP_DIRECTION_KEY "__GROUP_DIRECTION_KEY__"
37 #define GROUP_DIRECTION_VERTICAL "VERTICAL"
38 #define GROUP_DIRECTION_HORIZONTAL "HORIZONTAL"
39 #define GROUP_APP_LABEL_KEY "__GROUP_APP_LABEL_KEY__"
40
41 using namespace std;
42 using namespace tizen_base;
43 namespace notification {
44 namespace item {
45
46 GroupItem::GroupItem(string id, shared_ptr<AbstractAction> action)
47     : AbstractItem(id), impl_(new Impl(this)) {
48 }
49
50 GroupItem::GroupItem(shared_ptr<AbstractAction> action)
51     : AbstractItem(), impl_(new Impl(this)) {
52 }
53
54 GroupItem::Impl::Impl(GroupItem* parent)
55     : parent_(parent) {
56   LOGI("GroupItem created");
57   char* name;
58   int ret = app_get_name(&name);
59   if (ret != APP_ERROR_NONE) {
60     app_label_ = util::GetAppId();
61   } else {
62     app_label_ = string(name);
63     free(name);
64   }
65 }
66
67 GroupItem::~GroupItem() {
68 }
69
70 int GroupItem::GetType() const {
71   return AbstractItem::Group;
72 }
73
74 Bundle GroupItem::Serialize() const {
75   Bundle b;
76   b = AbstractItem::Serialize();
77   b.Add(GROUP_DIRECTION_KEY, impl_->is_vertical_ ?
78       GROUP_DIRECTION_VERTICAL : GROUP_DIRECTION_HORIZONTAL);
79
80   b.Add(GROUP_APP_LABEL_KEY, impl_->app_label_);
81   if (impl_->children_list_.size() == 0)
82     return b;
83
84   vector<std::string> arr;
85   for (auto& i : impl_->children_list_) {
86     Bundle serialized = i.get()->Serialize();
87     serialized.Add(
88         GROUP_CHILDREN_TYPE_KEY, to_string(static_cast<int>(i.get()->GetType())));
89     arr.push_back(reinterpret_cast<char*>(serialized.ToRaw().first.get()));
90   }
91   b.Add(GROUP_CHILDREN_KEY, arr);
92
93   return b;
94 }
95
96 void GroupItem::Deserialize(Bundle b) {
97   AbstractItem::Deserialize(b);
98   impl_->is_vertical_ =
99       (b.GetString(GROUP_DIRECTION_KEY) == GROUP_DIRECTION_VERTICAL);
100   impl_->app_label_ = b.GetString(GROUP_APP_LABEL_KEY);
101
102   vector<string> str_arr = b.GetStringArray(GROUP_CHILDREN_KEY);
103   if (str_arr.size() == 0)
104     return;
105
106   for (string str : str_arr) {
107     Bundle serialized(str);
108     string type_str = serialized.GetString(GROUP_CHILDREN_TYPE_KEY);
109     AbstractItem::Type child_type =
110         static_cast<AbstractItem::Type>(strtol(type_str.c_str(), NULL, 10));
111     shared_ptr<AbstractItem> child =
112         FactoryManager::GetInst().CreateItem(child_type);
113     child.get()->Deserialize(serialized);
114     AddChild(child);
115   }
116 }
117
118 AbstractItem& GroupItem::FindByID(std::string id) {
119   if (GetId() == id)
120     return *this;
121
122   for (auto& i : impl_->children_list_) {
123     auto& re = i.get()->FindByID(id);
124     if (re.GetId() == id)
125       return re;
126   }
127   return FactoryManager::GetInst().GetNullItem();
128 }
129
130 AbstractItem& GroupItem::FindByMainType(MainType type) {
131   if (GetMainType() == type)
132     return *this;
133
134   for (auto& i : impl_->children_list_) {
135     auto& re = i.get()->FindByMainType(type);
136     if (re.GetType() != NullObject)
137       return re;
138   }
139   return FactoryManager::GetInst().GetNullItem();
140 }
141
142 bool GroupItem::IsItemTypeExist(int type) {
143   if (GetType() == type)
144     return true;
145
146   for (auto& i : impl_->children_list_) {
147     if (i.get()->IsItemTypeExist(type))
148       return true;
149   }
150   return false;
151 }
152
153 list<string> GroupItem::GetSharedPath() const {
154   list<string> ret;
155
156   auto r = AbstractItem::GetSharedPath();
157   for (auto& shared_path_r : r)
158     ret.push_back(move(shared_path_r));
159
160   for (auto& i : impl_->children_list_) {
161     auto c = i->GetSharedPath();
162     for (auto& shared_path_c : c)
163       ret.push_back(move(shared_path_c));
164   }
165
166   return ret;
167 }
168
169 void GroupItem::SetSharedPath() {
170   for (auto& i : impl_->children_list_)
171     i->SetSharedPath();
172 }
173
174 list<map<string, string>> GroupItem::GetPathMapList() const {
175   list<map<string, string>> path_map_list;
176
177   auto r = AbstractItem::GetPathMapList();
178   for (auto& path_map_r : r)
179     path_map_list.push_back(move(path_map_r));
180
181   for (auto& i : impl_->children_list_) {
182     auto c = i->GetPathMapList();
183     for (auto& path_map_c : c)
184       path_map_list.push_back(move(path_map_c));
185   }
186
187   return path_map_list;
188 }
189
190 void GroupItem::AddChild(shared_ptr<AbstractItem> child) {
191   impl_->children_list_.emplace_back(child);
192 }
193
194 void GroupItem::RemoveChild(string itemId) {
195   for (auto& i : impl_->children_list_) {
196     if (i.get()->GetId() == itemId) {
197       impl_->children_list_.remove(i);
198       break;
199     }
200   }
201 }
202
203 void GroupItem::RemoveChildren() {
204   impl_->children_list_.clear();
205 }
206
207 list<shared_ptr<AbstractItem>> GroupItem::GetChildren() {
208   return impl_->children_list_;
209 }
210
211 void GroupItem::SetDirection(bool vertical) {
212   impl_->is_vertical_ = vertical;
213 }
214
215 bool GroupItem::IsVertical() {
216   return impl_->is_vertical_;
217 }
218
219 string GroupItem::GetAppLabel() {
220   return impl_->app_label_;
221 }
222
223 void GroupItem::SetAppLabel(string label) {
224   impl_->app_label_ = label;
225 }
226
227 }  // namespace item
228 }  // namespace notification