1 /*
2 * Copyright (c) 2020 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 "gallery_ability_slice.h"
17 #include "ability_env.h"
18 #include "ability_manager.h"
19 #include "picture_ability_slice.h"
20
21 #include "gfx_utils/file.h"
22 #include "securec.h"
23
24 namespace OHOS {
REGISTER_AS(GalleryAbilitySlice)25 REGISTER_AS(GalleryAbilitySlice)
26
27 GalleryAbilitySlice::~GalleryAbilitySlice()
28 {
29 printf("~GalleryAbilitySlice() | start \n");
30 Clear();
31 printf("~GalleryAbilitySlice() | end \n");
32 }
33
Clear()34 void GalleryAbilitySlice::Clear()
35 {
36 printf("GalleryAbilitySlice::Clear() | start \n");
37 if (backIcon_ != nullptr) {
38 delete backIcon_;
39 backIcon_ = nullptr;
40 }
41 if (backIconListener_ != nullptr) {
42 delete backIconListener_;
43 backIconListener_ = nullptr;
44 }
45 if (deleteClickListener_ != nullptr) {
46 delete deleteClickListener_;
47 deleteClickListener_ = nullptr;
48 }
49 if (backArea_ != nullptr) {
50 delete backArea_;
51 backArea_ = nullptr;
52 }
53 if (titleLabel_ != nullptr) {
54 delete titleLabel_;
55 titleLabel_ = nullptr;
56 }
57 if (deleteLabel_ != nullptr) {
58 delete deleteLabel_;
59 deleteLabel_ = nullptr;
60 }
61
62 ClearThumb();
63
64 if (rootView_ != nullptr) {
65 RootView::DestroyWindowRootView(rootView_);
66 rootView_ = nullptr;
67 }
68 printf("GalleryAbilitySlice::Clear() | end \n");
69 }
70
ClearThumb()71 void GalleryAbilitySlice::ClearThumb()
72 {
73 printf("GalleryAbilitySlice::ClearThumb() | start \n");
74 if (picContainer_ != nullptr) {
75 delete picContainer_;
76 picContainer_ = nullptr;
77 }
78 if (picList_ != nullptr) {
79 ClearPictureList(picList_);
80 delete picList_;
81 picList_ = nullptr;
82 }
83 for (uint16_t i = 0; i < pictureCount_; i++) {
84 if (pictureName_[i] != nullptr) {
85 delete[] pictureName_[i];
86 pictureName_[i] = nullptr;
87 }
88 }
89 for (uint16_t i = 0; i < pictureOnClickListenerCount_; i++) {
90 if (pictureOnClickListener_[i] != nullptr) {
91 delete pictureOnClickListener_[i];
92 pictureOnClickListener_[i] = nullptr;
93 }
94 }
95 pictureCount_ = 0;
96 pictureOnClickListenerCount_ = 0;
97 printf("GalleryAbilitySlice::ClearThumb() | end \n");
98 }
99
ClearPictureList(const UIView * view)100 void GalleryAbilitySlice::ClearPictureList(const UIView* view)
101 {
102 printf("GalleryAbilitySlice::ClearPictureList() | start \n");
103 if (view == nullptr || !(view->IsViewGroup())) {
104 return;
105 }
106 UIView* child = static_cast<const UIViewGroup*>(view)->GetChildrenHead();
107 UIView* childNext = nullptr;
108 while (child != nullptr) {
109 childNext = child->GetNextSibling();
110 if (child->IsViewGroup()) {
111 ClearPictureList(child);
112 }
113 delete child;
114 child = childNext;
115 }
116 printf("GalleryAbilitySlice::ClearPictureList() | end \n");
117 }
118
InitTitle()119 void GalleryAbilitySlice::InitTitle()
120 {
121 printf("GalleryAbilitySlice::InitTitle | start \n");
122 backIcon_ = new UIImageView();
123 backIcon_->SetPosition(BACK_ICON_POSITION_X, BACK_ICON_POSITION_Y);
124 backIcon_->SetSrc(backIconAbsolutePath);
125 backIcon_->SetTouchable(true);
126
127 backArea_ = new UIViewGroup();
128 backArea_->SetPosition(0, 0, LABEL_POSITION_X, LABEL_HEIGHT);
129 backArea_->SetStyle(STYLE_BACKGROUND_OPA, 0);
130 backArea_->SetTouchable(true);
131
132 auto onClick = [this] (UIView& view, const Event& event) -> bool {
133 printf("############ Next AS enter #############\n");
134 TerminateAbility();
135 printf("############ Next AS exit #############\n");
136 return true;
137 };
138 backIconListener_ = new EventListener(onClick, nullptr);
139 backIcon_->SetOnClickListener(backIconListener_);
140 backArea_->SetOnClickListener(backIconListener_);
141
142 titleLabel_ = new UILabel();
143 titleLabel_->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_WIDTH, LABEL_HEIGHT);
144 titleLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_LEFT, UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
145 titleLabel_->SetFont(FONT_NAME, GALLERY_FONT_SIZE);
146 titleLabel_->SetText("照片");
147
148 deleteLabel_ = new UILabel();
149 deleteLabel_->SetPosition(ROOT_VIEW_WIDTH - DELETE_LABEL_WIDTH, LABEL_POSITION_Y,
150 DELETE_LABEL_WIDTH, LABEL_HEIGHT);
151 deleteLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_LEFT,
152 UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
153 deleteLabel_->SetFont(FONT_NAME, GALLERY_DELETE_FONT_SIZE);
154 deleteLabel_->SetText("全部删除");
155 deleteLabel_->SetTouchable(true);
156 auto deleteClick = [this] (UIView& view, const Event& event) -> bool {
157 printf("############ DeleteAllData click enter #############\n");
158 DeleteAllData();
159 printf("############ DeleteAllData click exit #############\n");
160 return true;
161 };
162 deleteClickListener_ = new EventListener(deleteClick, nullptr);
163 deleteLabel_->SetOnClickListener(deleteClickListener_);
164
165 backArea_->Add(backIcon_);
166 rootView_->Add(backArea_);
167 rootView_->Add(titleLabel_);
168 rootView_->Add(deleteLabel_);
169 }
170
InitPictureList()171 void GalleryAbilitySlice::InitPictureList()
172 {
173 printf("GalleryAbilitySlice::InitPictureList | start \n");
174 picContainer_ = new UIScrollView();
175 picContainer_->SetPosition(0, LABEL_POSITION_Y + LABEL_HEIGHT);
176 picContainer_->Resize(ROOT_VIEW_WIDTH, (THUMBNAIL_RESOLUTION_Y + THUMBNAIL_SPACE) * THUMBNAIL_COLUMN);
177 picContainer_->SetStyle(STYLE_BACKGROUND_OPA, 0);
178 rootView_->Add(picContainer_);
179
180 picList_ = new UIViewGroup();
181 picList_->SetPosition(0, 0, ROOT_VIEW_WIDTH, ROOT_VIEW_HEIGHT);
182 picList_->SetStyle(STYLE_BACKGROUND_OPA, 0);
183
184 int16_t numInLine = (ROOT_VIEW_WIDTH + THUMBNAIL_SPACE) / (THUMBNAIL_RESOLUTION_X + THUMBNAIL_SPACE);
185 int16_t offset = ((ROOT_VIEW_WIDTH + THUMBNAIL_SPACE) % (THUMBNAIL_RESOLUTION_X + THUMBNAIL_SPACE)) / 2; // 2: half
186 AddAllPictures(Point { offset, 0 }, numInLine);
187
188 int16_t totalHeight = (pictureCount_ / numInLine) * (THUMBNAIL_RESOLUTION_Y + THUMBNAIL_SPACE);
189 if ((pictureCount_ % numInLine) != 0) {
190 totalHeight += THUMBNAIL_RESOLUTION_Y + THUMBNAIL_SPACE;
191 }
192 picList_->Resize(ROOT_VIEW_WIDTH, totalHeight);
193 printf("------------ totalHeight : %d ------------", totalHeight);
194 picContainer_->Add(picList_);
195 }
196
AddAllPictures(const Point & pos,int16_t numInLine)197 void GalleryAbilitySlice::AddAllPictures(const Point& pos, int16_t numInLine)
198 {
199 printf("GalleryAbilitySlice::AddAllPictures | start | %d\n", numInLine);
200 Point imagePos = pos;
201 DIR* drip = opendir(THUMBNAIL_DIRECTORY);
202 if (drip == nullptr) {
203 return;
204 }
205 struct dirent* info = nullptr;
206 while ((info = readdir(drip)) != nullptr && pictureCount_ < MAX_PICTURE_COUNT) {
207 uint16_t imageNameLen = static_cast<uint16_t>(strlen(info->d_name));
208 if (imageNameLen > MAX_PATH_LENGTH || (strcmp(info->d_name, ".") == 0) || (strcmp(info->d_name, "..") == 0)) {
209 printf("GalleryAbilitySlice::AddAllPictures | imageNameLen > MAX_PATH_LENGTH | %d\n", imageNameLen);
210 continue;
211 }
212 char* imageName = new char[imageNameLen + 1]();
213 memcpy_s(imageName, imageNameLen + 1, info->d_name, imageNameLen + 1);
214 pictureName_[pictureCount_] = imageName;
215 pictureCount_++;
216
217 uint16_t pathLen = static_cast<uint16_t>(strlen(THUMBNAIL_DIRECTORY)) + imageNameLen + 1;
218 if (pathLen > MAX_PATH_LENGTH) {
219 printf("GalleryAbilitySlice::AddAllPictures | pathLen > MAX_PATH_LENGTH | %d\n", pathLen);
220 continue;
221 }
222 char* imagePath = new char[pathLen + 1]();
223 if (sprintf_s(imagePath, pathLen + 1, "%s/%s", THUMBNAIL_DIRECTORY, info->d_name) < 0) {
224 printf("GalleryAbilitySlice::AddAllPictures | sprintf_s error\n");
225 delete[] imagePath;
226 continue;
227 }
228
229 picList_->Add(CreateImageItem(imagePos, imageName, imagePath));
230 delete[] imagePath;
231
232 if ((pictureCount_ % numInLine) == 0) {
233 imagePos.x = pos.x;
234 imagePos.y += THUMBNAIL_RESOLUTION_Y + THUMBNAIL_SPACE;
235 } else {
236 imagePos.x += THUMBNAIL_RESOLUTION_X + THUMBNAIL_SPACE;
237 }
238 }
239 delete info;
240 closedir(drip);
241 }
242
CreateImageItem(const Point & pos,const char * imageName,const char * imagePath)243 UIView* GalleryAbilitySlice::CreateImageItem(const Point& pos, const char* imageName, const char* imagePath)
244 {
245 UIImageView* imageView = new UIImageView();
246 imageView->SetAutoEnable(false);
247 imageView->Resize(THUMBNAIL_RESOLUTION_X, THUMBNAIL_RESOLUTION_Y);
248 imageView->SetSrc(imagePath);
249 pictureOnClickListener_[pictureOnClickListenerCount_] = GetImageClickListener(imageName);
250 imageView->SetOnClickListener(pictureOnClickListener_[pictureOnClickListenerCount_++]);
251 imageView->SetTouchable(true);
252
253 if (strncmp(imageName, PHOTO_PREFIX, strlen(PHOTO_PREFIX)) == 0) {
254 imageView->SetPosition(pos.x, pos.y);
255 return imageView;
256 }
257 imageView->SetPosition(0, 0);
258
259 UIViewGroup* imageItem = new UIViewGroup();
260 imageItem->SetStyle(STYLE_BACKGROUND_OPA, 0);
261 imageItem->SetPosition(pos.x, pos.y, THUMBNAIL_RESOLUTION_X, THUMBNAIL_RESOLUTION_Y);
262 imageItem->SetTouchable(true);
263 imageItem->SetOnClickListener(imageView->GetOnClickListener());
264
265 UIImageView* videoTag = new UIImageView();
266 videoTag->SetPosition(VIDEO_TAG_POSITION_X, VIDEO_TAG_POSITION_Y);
267 videoTag->SetSrc(videoTagIconAbsolutePath);
268 videoTag->SetTouchable(true);
269 videoTag->SetOnClickListener(imageView->GetOnClickListener());
270
271 imageItem->Add(imageView);
272 imageItem->Add(videoTag);
273
274 return imageItem;
275 }
276
GetImageClickListener(const char * path)277 EventListener* GalleryAbilitySlice::GetImageClickListener(const char* path)
278 {
279 auto onClick = [this, path] (UIView& view, const Event& event) -> bool {
280 printf("############ Next AS enter #############\n");
281 Want wantData = { nullptr };
282 printf("------- imagePath: %s \n", path);
283 bool ret = SetWantData(&wantData, path, strlen(path) + 1);
284 if (!ret) {
285 printf("############ SetWantData error #############\n");
286 return ret;
287 }
288 AbilitySlice* nextSlice = nullptr;
289 if (strncmp(path, PHOTO_PREFIX, strlen(PHOTO_PREFIX)) == 0) {
290 printf("--------- enter PictureAbilitySlice \n");
291 nextSlice = AbilityLoader::GetInstance().GetAbilitySliceByName("PictureAbilitySlice");
292 } else {
293 printf("--------- enter PlayerAbilitySlice \n");
294 nextSlice = AbilityLoader::GetInstance().GetAbilitySliceByName("PlayerAbilitySlice");
295 }
296 if (nextSlice == nullptr) {
297 printf("undefined nextSlice\n");
298 } else {
299 Present(*nextSlice, wantData);
300 }
301 printf("############ Next AS exit #############\n");
302 return true;
303 };
304 return new EventListener(onClick, nullptr);
305 }
306
DeleteAllData()307 void GalleryAbilitySlice::DeleteAllData()
308 {
309 picContainer_->Invalidate();
310 rootView_->Remove(picContainer_);
311 ClearThumb();
312
313 DeleteAllFilesInDir(THUMBNAIL_DIRECTORY);
314 DeleteAllFilesInDir(PHOTO_DIRECTORY);
315 DeleteAllFilesInDir(VIDEO_SOURCE_DIRECTORY);
316
317 InitPictureList();
318 }
319
DeleteAllFilesInDir(const char * path)320 void GalleryAbilitySlice::DeleteAllFilesInDir(const char* path)
321 {
322 DIR* drip = opendir(path);
323 if (drip == nullptr) {
324 return;
325 }
326 struct dirent* info = nullptr;
327 while ((info = readdir(drip)) != nullptr) {
328 uint16_t fileNameLen = static_cast<uint16_t>(strlen(info->d_name));
329 uint16_t pathLen = static_cast<uint16_t>(strlen(path)) + fileNameLen + 1;
330 if (pathLen > MAX_PATH_LENGTH) {
331 printf("GalleryAbilitySlice::AddAllPictures | pathLen > MAX_PATH_LENGTH | %d\n", pathLen);
332 continue;
333 }
334 char* filePath = new char[pathLen + 1]();
335 if (sprintf_s(filePath, pathLen + 1, "%s/%s", path, info->d_name) < 0) {
336 printf("GalleryAbilitySlice::AddAllPictures | sprintf_s error\n");
337 delete[] filePath;
338 continue;
339 }
340 if (unlink(filePath) != 0) {
341 printf("unlink file error | %s\n", filePath);
342 }
343 delete[] filePath;
344 }
345 delete info;
346 closedir(drip);
347 printf("GalleryAbilitySlice::DeleteAllFilesInDir() | success | %s\n", path);
348 }
349
OnStart(const Want & want)350 void GalleryAbilitySlice::OnStart(const Want &want)
351 {
352 AbilitySlice::OnStart(want);
353
354 rootView_ = RootView::GetWindowRootView();
355 rootView_->SetPosition(ROOT_VIEW_POSITION_X, ROOT_VIEW_POSITION_Y);
356 rootView_->Resize(ROOT_VIEW_WIDTH, ROOT_VIEW_HEIGHT);
357 rootView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
358
359 const char* pathHeader = GetSrcPath();
360 if (sprintf_s(backIconAbsolutePath, MAX_PATH_LENGTH, "%s%s", pathHeader, BACK_ICON_PATH) < 0) {
361 printf("GalleryAbilitySlice::OnStart | backIconAbsolutePath error");
362 return;
363 }
364 if (sprintf_s(videoTagIconAbsolutePath, MAX_PATH_LENGTH, "%s%s", pathHeader, VIDEO_TAG_ICON_PATH) < 0) {
365 printf("GalleryAbilitySlice::OnStart | videoTagIconAbsolutePath error");
366 return;
367 }
368
369 InitTitle();
370 InitPictureList();
371 SetUIContent(rootView_);
372 }
373
OnInactive()374 void GalleryAbilitySlice::OnInactive()
375 {
376 printf("GalleryAbilitySlice::OnInactive\n");
377 AbilitySlice::OnInactive();
378 }
379
OnActive(const Want & want)380 void GalleryAbilitySlice::OnActive(const Want &want)
381 {
382 printf("GalleryAbilitySlice::OnActive\n");
383 AbilitySlice::OnActive(want);
384 }
385
OnBackground()386 void GalleryAbilitySlice::OnBackground()
387 {
388 printf("GalleryAbilitySlice::OnBackground\n");
389 AbilitySlice::OnBackground();
390 }
391
OnStop()392 void GalleryAbilitySlice::OnStop()
393 {
394 printf("GalleryAbilitySlice::OnStop\n");
395 AbilitySlice::OnStop();
396 Clear();
397 }
398 }