1/** 2 * Copyright (c) 2021-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 16import { 17 Log, 18 PinyinSort, 19 CheckEmptyUtils, 20 EventConstants, 21 CommonConstants, 22 BaseViewModel, 23 SettingsModel, 24 PageDesktopModel, 25 ResourceManager, 26 localEventManager, 27 layoutConfigManager, 28 FolderLayoutConfig 29} from '@ohos/common'; 30import { BigFolderModel } from '../model/BigFolderModel'; 31import { BigFolderStyleConfig } from '../common/BigFolderStyleConfig'; 32import { BigFolderConstants } from '../common/constants/BigFolderConstants'; 33import { BigFolderStyleConstants } from '../common/constants/BigFolderStyleConstants'; 34 35const TAG = 'BigFolderViewModel'; 36const HEXADECIMAL_VALUE = 36; 37 38export class BigFolderViewModel extends BaseViewModel { 39 private readonly mSettingsModel: SettingsModel; 40 private readonly mBigFolderModel: BigFolderModel; 41 private readonly mPageDesktopModel: PageDesktopModel; 42 private readonly mPinyinSort: PinyinSort; 43 private readonly mGridConfig; 44 private mPageIndex = 0; 45 private readonly mFolderStyleConfig: BigFolderStyleConfig; 46 private readonly mFolderLayoutConfig: FolderLayoutConfig; 47 private readonly mLocalEventListener = { 48 onReceiveEvent: (event, params) => { 49 Log.showDebug(TAG, `onReceiveEvent receive event: ${event}, params: ${JSON.stringify(params)}`); 50 const openStatus = AppStorage.get('openFolderStatus'); 51 if (event === EventConstants.EVENT_BADGE_UPDATE && (openStatus == BigFolderConstants.OPEN_FOLDER_STATUS_OPEN || openStatus == BigFolderConstants.OPEN_FOLDER_STATUS_STATIC)) { 52 const openFolderData: { 53 layoutInfo: [[]] 54 } = AppStorage.get('openFolderData'); 55 this.updateBadge(openFolderData, params); 56 } else if (event === EventConstants.EVENT_FOLDER_PACKAGE_REMOVED) { 57 this.deleteAppFromFolderByUninstall(params); 58 } else if (event === EventConstants.EVENT_OPEN_FOLDER_TO_CLOSE) { 59 this.closeFolder(); 60 } 61 } 62 }; 63 64 // badge will be designed lastly 65 private updateBadge(openFolderData, params): void { 66 for (let i = 0; i < openFolderData.layoutInfo.length; i++) { 67 const appInfo: any = openFolderData.layoutInfo[i].find(item => { 68 return item.bundleName == params.bundleName; 69 }); 70 if (appInfo != undefined && appInfo.bundleName.length > 0) { 71 const index = openFolderData.layoutInfo[i].indexOf(appInfo); 72 appInfo.badgeNumber = params.badgeNumber; 73 openFolderData.layoutInfo[i][index] = appInfo; 74 break; 75 } 76 } 77 Log.showDebug(TAG, `mLocalEventListener openFolderData: ${JSON.stringify(openFolderData)}`); 78 this.refreshFolder(openFolderData); 79 } 80 81 private constructor() { 82 super(); 83 this.mBigFolderModel = BigFolderModel.getInstance(); 84 this.mSettingsModel = SettingsModel.getInstance(); 85 this.mPageDesktopModel = PageDesktopModel.getInstance(); 86 this.mGridConfig = this.mSettingsModel.getGridConfig(); 87 this.mPinyinSort = new PinyinSort(); 88 this.mBigFolderModel.registerFolderUpdateEvent(this.mLocalEventListener); 89 this.mFolderStyleConfig = layoutConfigManager.getStyleConfig(BigFolderStyleConfig.APP_LIST_STYLE_CONFIG, 90 BigFolderConstants.FEATURE_NAME); 91 this.mFolderLayoutConfig = layoutConfigManager.getFunctionConfig(FolderLayoutConfig.FOLDER_GRID_LAYOUT_INFO); 92 } 93 94 static getInstance(): BigFolderViewModel { 95 if (globalThis.BigFolderViewModelInstance == null) { 96 globalThis.BigFolderViewModelInstance = new BigFolderViewModel(); 97 } 98 return globalThis.BigFolderViewModelInstance; 99 } 100 101 /** 102 * return BigFolderStyleConfig 103 */ 104 getFolderStyleConfig(): BigFolderStyleConfig { 105 return this.mFolderStyleConfig; 106 } 107 108 /** 109 * return folderOpenLayoutTable 110 */ 111 getFolderLayoutConfig(): any { 112 return this.mFolderLayoutConfig.getFolderLayoutInfo().folderOpenLayoutTable; 113 } 114 115 /** 116 * add new folder 117 * 118 * @param {any} appLayoutInfo (two app for create new folder). 119 */ 120 async addNewFolder(appLayoutInfo) { 121 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 122 const settingAppInfoList = this.mSettingsModel.getAppListInfo(); 123 const folderAppInfo = []; 124 for (let j = 0; j < appLayoutInfo.length; j++) { 125 Log.showDebug(TAG, `addNewFolder appLayoutInfo: ${JSON.stringify(appLayoutInfo[j])}`) 126 for (let i = 0; i < settingAppInfoList.length; i++) { 127 if (settingAppInfoList[i].keyName === appLayoutInfo[j].keyName) { 128 folderAppInfo.push(settingAppInfoList[i]); 129 break; 130 } 131 } 132 } 133 134 // sum all app badgeNumber 135 let badgeNumber = 0; 136 for (let i = 0; i < folderAppInfo.length; i++) { 137 if (folderAppInfo[i].badgeNumber && folderAppInfo[i].badgeNumber > 0) { 138 badgeNumber = badgeNumber + folderAppInfo[i].badgeNumber; 139 } 140 } 141 142 // Delete {the app list} from desktop app list 143 for (let i = 0; i < appLayoutInfo.length; i++) { 144 const index = gridLayoutInfo.layoutInfo.indexOf(appLayoutInfo[i]); 145 if (index != CommonConstants.INVALID_VALUE) { 146 gridLayoutInfo.layoutInfo.splice(index, 1); 147 } 148 } 149 150 const folderInfo = await this.createNewFolderInfo(); 151 folderInfo.layoutInfo.push(folderAppInfo); 152 folderInfo.badgeNumber = badgeNumber; 153 154 const needNewPage: boolean = this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfo, folderInfo); 155 if (needNewPage) { 156 gridLayoutInfo.layoutDescription.pageCount = gridLayoutInfo.layoutDescription.pageCount + 1; 157 for (let index = 0; index < gridLayoutInfo.layoutInfo.length; index++) { 158 if (gridLayoutInfo.layoutInfo[index].page > this.mPageDesktopModel.getPageIndex()) { 159 gridLayoutInfo.layoutInfo[index].page++; 160 } 161 } 162 } 163 164 // Push folder into the layoutInfo,include {the app list} 165 gridLayoutInfo.layoutInfo.push(folderInfo); 166 this.deleteAppLayoutItems(gridLayoutInfo, appLayoutInfo); 167 if (needNewPage) { 168 this.mPageDesktopModel.setPageIndex(this.mPageDesktopModel.getPageIndex() + 1); 169 } 170 } 171 172 /** 173 * add app to folder 174 * 175 * @param appInfo AppInfo 176 * @param folderId folderId 177 */ 178 addOneAppToFolder(appInfo, folderId): void { 179 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 180 let appListInfo = this.mSettingsModel.getAppListInfo(); 181 appListInfo = appListInfo.filter(item => item.keyName !== appInfo.keyName); 182 // add App 183 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 184 const layoutInfo = gridLayoutInfo.layoutInfo[i]; 185 if (layoutInfo.typeId === CommonConstants.TYPE_FOLDER && layoutInfo.folderId === folderId) { 186 const info = layoutInfo.layoutInfo; 187 if (layoutInfo.badgeNumber && layoutInfo.badgeNumber > 0) { 188 if (appInfo.badgeNumber && appInfo.badgeNumber > 0) { 189 layoutInfo.badgeNumber = layoutInfo.badgeNumber + appInfo.badgeNumber; 190 } 191 } else { 192 layoutInfo.badgeNumber = appInfo.badgeNumber; 193 } 194 const lastPageItems = info[info.length - 1]; 195 if (lastPageItems[lastPageItems.length - 1].typeId == CommonConstants.TYPE_ADD) { 196 lastPageItems[lastPageItems.length - 1] = appInfo; 197 } else { 198 const openFolderConfig = this.mBigFolderModel.getFolderOpenLayout(); 199 if (lastPageItems.length == openFolderConfig.column * openFolderConfig.row) { 200 info.push([appInfo]); 201 } else { 202 lastPageItems.push(appInfo); 203 } 204 } 205 break; 206 } 207 } 208 209 // delete app from desktop 210 this.mSettingsModel.setAppListInfo(appListInfo); 211 this.deleteAppLayoutItems(gridLayoutInfo, [appInfo]); 212 } 213 214 /** 215 * delete apps in pageDesktop 216 * @param appListInfo 217 */ 218 private deleteAppLayoutItems(gridLayoutInfo, appLayoutInfo) { 219 for (let i = 0; i < appLayoutInfo.length; i++) { 220 gridLayoutInfo.layoutInfo = gridLayoutInfo.layoutInfo.filter(item => item.keyName != appLayoutInfo[i].keyName); 221 } 222 Log.showDebug(TAG, `deleteAppItems gridLayoutInfo.layoutInfo: ${gridLayoutInfo.layoutInfo.length}`); 223 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 224 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 225 } 226 227 /** 228 * Delete app from folder by dragging 229 * 230 * @param {any} folderAppList. 231 * @param {number} index. 232 */ 233 deleteAppByDraging(folderAppList, index): boolean { 234 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 235 if (folderAppList.length == 0 || folderAppList.length <= index) { 236 return false; 237 } 238 const dragAppInfo = folderAppList[index]; 239 if (folderAppList.length > 2) { 240 const needNewPage: boolean = this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfo, dragAppInfo); 241 Log.showDebug(TAG, `deleteAppByDraging needNewPage: ${needNewPage}`); 242 if (needNewPage) { 243 return false; 244 } 245 } 246 247 folderAppList.splice(index, 1); 248 if (folderAppList.length > 0 && folderAppList[folderAppList.length - 1].typeId == CommonConstants.TYPE_ADD) { 249 folderAppList.pop(); 250 } 251 const folderLayoutInfo = this.filterFolderPage(folderAppList); 252 const openFolderData: { 253 folderId: string, 254 layoutInfo: any 255 } = AppStorage.get('openFolderData'); 256 const removeAppInfos = [dragAppInfo]; 257 const folderIndex = gridLayoutInfo.layoutInfo.findIndex(item => { 258 return item.typeId === CommonConstants.TYPE_FOLDER && item.folderId === openFolderData.folderId; 259 }); 260 261 if (folderLayoutInfo.length == 1 && folderLayoutInfo[0].length == 1) { 262 // delete folder and add app to desktop 263 removeAppInfos.push(folderLayoutInfo[0][0]); 264 gridLayoutInfo.layoutInfo.splice(folderIndex, 1); 265 } else { 266 this.updateBadgeNumber(gridLayoutInfo.layoutInfo[folderIndex], dragAppInfo); 267 openFolderData.layoutInfo = folderLayoutInfo; 268 } 269 270 const appListInfo = this.mSettingsModel.getAppListInfo(); 271 for (let i = 0; i < removeAppInfos.length; i++) { 272 this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfo, removeAppInfos[i]); 273 const gridLayout = this.createAppLayoutInfo(removeAppInfos[i]); 274 gridLayoutInfo.layoutInfo.push(gridLayout); 275 appListInfo.push(removeAppInfos[i]); 276 } 277 this.mSettingsModel.setAppListInfo(appListInfo); 278 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 279 return true; 280 } 281 282 /** 283 * create new app layoutInfo 284 * 285 * @param appInfo 286 */ 287 private createAppLayoutInfo(appInfo): any { 288 const appLayout = { 289 bundleName: appInfo.bundleName, 290 abilityName: appInfo.abilityName, 291 moduleName: appInfo.moduleName, 292 keyName: appInfo.keyName, 293 typeId: appInfo.typeId, 294 area: appInfo.area, 295 page: appInfo.page, 296 column: appInfo.column, 297 row: appInfo.row 298 }; 299 return appLayout; 300 } 301 302 /** 303 * update folder badgeNumber 304 * 305 * @param folderLayoutInfo 306 * @param dragAppInfo 307 */ 308 private updateBadgeNumber(folderLayoutInfo, dragAppInfo): void { 309 let folderBadgeNumber = 0; 310 if (folderLayoutInfo.badgeNumber && folderLayoutInfo.badgeNumber > 0) { 311 folderBadgeNumber = folderLayoutInfo.badgeNumber; 312 if (dragAppInfo.badgeNumber && dragAppInfo.badgeNumber > 0) { 313 folderBadgeNumber = folderBadgeNumber - dragAppInfo.badgeNumber; 314 } 315 } 316 folderLayoutInfo.badgeNumber = folderBadgeNumber; 317 } 318 319 /** 320 * Delete app from open folder 321 * 322 * @param {any} appInfo. 323 */ 324 deleteAppFromOpenFolder(appInfo): any { 325 let openFolderData: { 326 folderId: string, 327 layoutInfo: any 328 } = AppStorage.get('openFolderData'); 329 const folderLayoutInfo = this.getFolderLayoutInfo(openFolderData, appInfo); 330 331 // Delete app from the folder 332 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 333 const folderIndex = gridLayoutInfo.layoutInfo.findIndex(item => { 334 return item.typeId === CommonConstants.TYPE_FOLDER && item.folderId === openFolderData.folderId; 335 }); 336 337 const appListInfo = this.mSettingsModel.getAppListInfo(); 338 if (folderLayoutInfo.length == 1 && folderLayoutInfo[0].length == 1) { 339 // delete from folder and add app to desktop 340 const appLayout = { 341 bundleName: folderLayoutInfo[0][0].bundleName, 342 abilityName: folderLayoutInfo[0][0].abilityName, 343 moduleName: folderLayoutInfo[0][0].moduleName, 344 keyName: folderLayoutInfo[0][0].keyName, 345 typeId: folderLayoutInfo[0][0].typeId, 346 area: folderLayoutInfo[0][0].area, 347 page: gridLayoutInfo.layoutInfo[folderIndex].page, 348 column: gridLayoutInfo.layoutInfo[folderIndex].column, 349 row: gridLayoutInfo.layoutInfo[folderIndex].row 350 }; 351 gridLayoutInfo.layoutInfo.push(appLayout); 352 appListInfo.push(folderLayoutInfo[0][0]); 353 gridLayoutInfo.layoutInfo.splice(folderIndex, 1); 354 openFolderData = { 355 folderId: '', layoutInfo: [] 356 }; 357 } else { 358 this.updateBadgeNumber(gridLayoutInfo.layoutInfo[folderIndex], appInfo); 359 openFolderData.layoutInfo = folderLayoutInfo; 360 } 361 this.mSettingsModel.setAppListInfo(appListInfo); 362 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 363 return openFolderData; 364 } 365 366 /** 367 * update folder app list info 368 * 369 * @param {any} appInfos. 370 * @param {any} folderItem. 371 */ 372 async updateFolderAppList(appInfos, folderItem) { 373 Log.showDebug(TAG, 'updateFolderAppList start'); 374 let removeFolderApp = []; 375 let gridLayoutInfoTemp: any; 376 let gridLayoutInfo = { 377 layoutInfo: [] 378 }; 379 gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 380 gridLayoutInfoTemp = this.mSettingsModel.getLayoutInfo(); 381 removeFolderApp = this.layoutInfoToList(folderItem); 382 // checked app <= 1 383 if (appInfos.length <= CommonConstants.FOLDER_APP_VALUE) { 384 for (let i = 0; i < gridLayoutInfoTemp.layoutInfo.length; i++) { 385 if (gridLayoutInfoTemp.layoutInfo[i].folderId === folderItem.folderId) { 386 gridLayoutInfoTemp.layoutInfo.splice(i, 1); 387 break; 388 } 389 } 390 folderItem.layoutInfo = [[]]; 391 for (let i = 0; i < removeFolderApp.length; i++) { 392 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_ADD, removeFolderApp[i]); 393 this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfoTemp, removeFolderApp[i]); 394 const gridLayout = this.createAppLayoutInfo(removeFolderApp[i]); 395 gridLayoutInfoTemp.layoutInfo.push(gridLayout); 396 } 397 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 398 } else { 399 // checked app's count >= 2 400 // update badgeNumber of folder 401 this.updateFolderBadgeNumber(appInfos, folderItem, gridLayoutInfo, gridLayoutInfoTemp); 402 // move app from other folder 403 this.moveAppFromOtherFolders(appInfos, folderItem, gridLayoutInfo, gridLayoutInfoTemp); 404 // move apps from desktop to folder 405 this.moveAppFromDesktopToFolder(appInfos, gridLayoutInfo, gridLayoutInfoTemp); 406 // move apps from folder to desktop 407 this.moveAppFromFolderToDesktop(appInfos, removeFolderApp, gridLayoutInfoTemp); 408 // delete blank page 409 this.deleteBlankPage(); 410 } 411 Log.showDebug(TAG, 'updateFolderAppList end'); 412 } 413 414 /** 415 * delete blank page 416 */ 417 private deleteBlankPage(): void { 418 const layoutInfo = this.mSettingsModel.getLayoutInfo(); 419 const pageItemMap = new Map<string, number>(); 420 for (let i = 0; i < layoutInfo.layoutDescription.pageCount; i++) { 421 pageItemMap.set(i.toString(), 0); 422 } 423 424 for (let i = 0; i < layoutInfo.layoutInfo.length; i++) { 425 const tmpPage = layoutInfo.layoutInfo[i].page.toString(); 426 pageItemMap.set(tmpPage, pageItemMap.get(tmpPage) + 1); 427 } 428 429 const blankPages = []; 430 for (let [page, count] of pageItemMap) { 431 if (count === 0) { 432 layoutInfo.layoutDescription.pageCount--; 433 blankPages.push(page); 434 } 435 } 436 for (let m = 0; m < layoutInfo.layoutInfo.length; m++) { 437 let pageMinus = 0; 438 for (let n = 0; n < blankPages.length; n++) { 439 if (layoutInfo.layoutInfo[m].page > blankPages[n]) { 440 pageMinus++; 441 } 442 } 443 if (pageMinus != 0) { 444 layoutInfo.layoutInfo[m].page = layoutInfo.layoutInfo[m].page - pageMinus; 445 } 446 } 447 this.mSettingsModel.setLayoutInfo(layoutInfo); 448 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 449 } 450 451 /** 452 * get apps in checked appinfos, not in folderAppList 453 * 454 * @param appInfos 455 * @param folderAppList 456 */ 457 getAppRemainInOtherFolder(appInfos, folderAppList): any[] { 458 const appInfosRemaining = []; 459 for (let m = 0; m < folderAppList.length; m++) { 460 const appIndex = appInfos.findIndex(item => { 461 return item.keyName === folderAppList[m].keyName; 462 }); 463 if (appIndex == CommonConstants.INVALID_VALUE) { 464 appInfosRemaining.push(folderAppList[m]); 465 } 466 } 467 return appInfosRemaining; 468 } 469 470 /** 471 * update badgeNumber of folder 472 * 473 * @param appInfos 474 * @param folderItem 475 * @param gridLayoutInfo 476 */ 477 private updateFolderBadgeNumber(appInfos, folderItem, gridLayoutInfo, gridLayoutInfoTemp): void { 478 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 479 if (gridLayoutInfo.layoutInfo[i].typeId === CommonConstants.TYPE_FOLDER 480 && gridLayoutInfo.layoutInfo[i].folderId === folderItem.folderId) { 481 let badgeNumber = 0; 482 appInfos.forEach((item) => { 483 if (item.badgeNumber && item.badgeNumber > 0) { 484 badgeNumber = badgeNumber + item.badgeNumber; 485 } 486 }); 487 const folderLayoutInfo = this.filterFolderPage(appInfos); 488 folderItem.layoutInfo = folderLayoutInfo; 489 folderItem.badgeNumber = badgeNumber; 490 gridLayoutInfoTemp.layoutInfo[i].layoutInfo = JSON.parse(JSON.stringify(folderLayoutInfo)); 491 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 492 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 493 break; 494 } 495 } 496 } 497 498 /** 499 * move app from other folders to folder or to desktop 500 * 501 * @param appInfos 502 * @param gridLayoutInfo 503 * @param gridLayoutInfoTemp 504 */ 505 private moveAppFromOtherFolders(appInfos, folderItem, gridLayoutInfo, gridLayoutInfoTemp): void { 506 for (let i = gridLayoutInfo.layoutInfo.length - 1; i >= 0; i--) { 507 if (gridLayoutInfo.layoutInfo[i].typeId === CommonConstants.TYPE_FOLDER 508 && gridLayoutInfo.layoutInfo[i].folderId !== folderItem.folderId) { 509 const folderAppList = this.layoutInfoToList(gridLayoutInfo.layoutInfo[i]); 510 const appInfosRemaining = this.getAppRemainInOtherFolder(appInfos, folderAppList); 511 const thisFolderItemIndex = gridLayoutInfoTemp.layoutInfo.findIndex(item => { 512 return item.folderId === gridLayoutInfo.layoutInfo[i].folderId; 513 }); 514 515 if (appInfosRemaining.length === 0) { 516 gridLayoutInfoTemp.layoutInfo.splice(thisFolderItemIndex, 1); 517 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 518 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 519 } else if (appInfosRemaining.length === CommonConstants.FOLDER_APP_VALUE) { 520 gridLayoutInfoTemp.layoutInfo.splice(thisFolderItemIndex, 1); 521 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 522 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_ADD, appInfosRemaining[0]); 523 } else { 524 let badgeNumber = 0; 525 appInfosRemaining.forEach((item) => { 526 if (item.badgeNumber && item.badgeNumber > 0) { 527 badgeNumber = badgeNumber + item.badgeNumber; 528 } 529 }); 530 gridLayoutInfoTemp.layoutInfo[thisFolderItemIndex].badgeNumber = badgeNumber; 531 gridLayoutInfoTemp.layoutInfo[thisFolderItemIndex].layoutInfo = this.filterFolderPage(appInfosRemaining); 532 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 533 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 534 } 535 } 536 } 537 } 538 539 /** 540 * move apps from desktop to folder 541 * 542 * @param appInfos 543 * @param gridLayoutInfo 544 * @param gridLayoutInfoTemp 545 */ 546 private moveAppFromDesktopToFolder(appInfos, gridLayoutInfo, gridLayoutInfoTemp): void { 547 const appDesktopToFolder = []; 548 for (let i = 0; i < appInfos.length; i++) { 549 for (let j = 0; j < gridLayoutInfo.layoutInfo.length; j++) { 550 if (gridLayoutInfo.layoutInfo[j].typeId == CommonConstants.TYPE_APP && 551 appInfos[i].keyName == gridLayoutInfo.layoutInfo[j].keyName) { 552 appDesktopToFolder.push(gridLayoutInfo.layoutInfo[j]); 553 break; 554 } 555 } 556 } 557 558 if (appDesktopToFolder.length > 0) { 559 this.deleteAppLayoutItems(gridLayoutInfoTemp, appDesktopToFolder); 560 } 561 } 562 563 /** 564 * move app from folder to desktop 565 * 566 * @param appInfos 567 * @param removeFolderApp 568 * @param gridLayoutInfoTemp 569 */ 570 private moveAppFromFolderToDesktop(appInfos, removeFolderApp, gridLayoutInfoTemp) { 571 const appFolderToDesktop = []; 572 for (let i = 0; i < removeFolderApp.length; i++) { 573 let remainFlag = false; 574 for (let j = 0; j < appInfos.length; j++) { 575 if (appInfos[j].keyName == removeFolderApp[i].keyName) { 576 remainFlag = true; 577 break; 578 } 579 } 580 if (!remainFlag) { 581 appFolderToDesktop.push(removeFolderApp[i]); 582 } 583 } 584 585 if (appFolderToDesktop.length > 0) { 586 for (let i = 0; i < appFolderToDesktop.length; i++) { 587 const needNewPage: boolean = this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfoTemp, appFolderToDesktop[i]); 588 if (needNewPage) { 589 gridLayoutInfoTemp.layoutDescription.pageCount = gridLayoutInfoTemp.layoutDescription.pageCount + 1; 590 for (let index = 0; index < gridLayoutInfoTemp.layoutInfo.length; index++) { 591 if (gridLayoutInfoTemp.layoutInfo[index].page > this.mPageDesktopModel.getPageIndex()) { 592 gridLayoutInfoTemp.layoutInfo[index].page++; 593 } 594 } 595 } 596 const gridLayout = this.createAppLayoutInfo(appFolderToDesktop[i]); 597 gridLayoutInfoTemp.layoutInfo.push(gridLayout); 598 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_ADD, appFolderToDesktop[i]); 599 } 600 this.mSettingsModel.setLayoutInfo(gridLayoutInfoTemp); 601 } 602 } 603 604 /** 605 * get folder app list 606 * 607 * @param {array} folderId. 608 * @return {array} folderAppList. 609 */ 610 async getFolderAppList(folderId) { 611 Log.showDebug(TAG, 'getFolderAppList start'); 612 let folderAppList = []; 613 let gridLayoutInfo = { 614 layoutInfo: [] 615 }; 616 gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 617 618 // Get folder app list form the layout info 619 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 620 const layoutInfo = gridLayoutInfo.layoutInfo[i]; 621 if (layoutInfo.typeId === CommonConstants.TYPE_FOLDER && layoutInfo.folderId === folderId) { 622 for (let j = 0; j < layoutInfo.layoutInfo.length; j++) { 623 folderAppList = folderAppList.concat(layoutInfo.layoutInfo[j]); 624 } 625 } 626 } 627 if (folderAppList.length > 0 && folderAppList[folderAppList.length - 1].typeId == CommonConstants.TYPE_ADD) { 628 folderAppList.pop(); 629 } 630 AppStorage.setOrCreate('folderAppList', folderAppList); 631 return folderAppList; 632 } 633 634 /** 635 * get all folder list 636 * 637 * @return {array} folderList. 638 */ 639 async getAllFolderList() { 640 Log.showDebug(TAG, 'getAllFolderList start'); 641 const folderList = []; 642 let gridLayoutInfo = { 643 layoutInfo: [] 644 }; 645 gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 646 647 // Get folder list form the layout info 648 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 649 if (gridLayoutInfo.layoutInfo[i].typeId === CommonConstants.TYPE_FOLDER) { 650 folderList.push(gridLayoutInfo.layoutInfo[i]); 651 } 652 } 653 AppStorage.setOrCreate('allFolderList', folderList); 654 return folderList; 655 } 656 657 /** 658 * get the all app list for folder 659 * 660 * @param {number} folderId 661 * 662 */ 663 async getFolderAddAppList(folderId) { 664 Log.showDebug(TAG, 'getFolderAddAppList start'); 665 if (CheckEmptyUtils.checkStrIsEmpty(folderId)) { 666 Log.showDebug(TAG, 'getFolderAddAppList folderId is Empty'); 667 return; 668 } 669 let allAppList = []; 670 let appInfos: any; 671 let gridLayoutInfo = { 672 layoutInfo: [] 673 }; 674 gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 675 const appListInfo = await this.mAppModel.getAppList(); 676 677 // first push this current app 678 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 679 const layoutInfo = gridLayoutInfo.layoutInfo[i]; 680 if (layoutInfo.typeId === CommonConstants.TYPE_FOLDER && layoutInfo.folderId === folderId) { 681 for (let j = 0; j < layoutInfo.layoutInfo.length; j++) { 682 appInfos = layoutInfo.layoutInfo[j]; 683 for (let k = 0; k < appInfos.length; k++) { 684 appInfos[k].checked = true; 685 allAppList.push(appInfos[k]); 686 } 687 } 688 break; 689 } 690 } 691 692 if (allAppList.length > 0 && allAppList[allAppList.length - 1].typeId == CommonConstants.TYPE_ADD) { 693 allAppList.pop(); 694 } 695 696 for (let i = 0; i < appListInfo.length; i++) { 697 let isExist = false; 698 for (let j = 0; j < allAppList.length; j++) { 699 if (appListInfo[i].keyName === allAppList[j].keyName) { 700 isExist = true; 701 break; 702 } 703 } 704 if (!isExist) { 705 appListInfo[i].checked = false; 706 allAppList.push(appListInfo[i]); 707 } 708 } 709 if (!this.getIsPad()) { 710 let bottomAppList: any = AppStorage.get('residentList'); 711 if (!CheckEmptyUtils.isEmptyArr(bottomAppList)) { 712 for (let i = 0; i < bottomAppList.length; i++) { 713 allAppList = allAppList.filter((item) => { 714 if (bottomAppList[i].keyName == item.keyName) { 715 return false; 716 } 717 return true; 718 }) 719 } 720 } 721 } 722 AppStorage.setOrCreate('allAppListForFolder', allAppList); 723 return allAppList; 724 } 725 726 /** 727 * open folder 728 * 729 * @param {any} folderInfo. 730 */ 731 addAddIcon(folderItem: any): any { 732 Log.showDebug(TAG, 'addAddIcon start'); 733 734 if (folderItem.layoutInfo.length == 0) { 735 return folderItem; 736 } 737 const lastPageItem = folderItem.layoutInfo[folderItem.layoutInfo.length - 1]; 738 if (lastPageItem[lastPageItem.length - 1].typeId === CommonConstants.TYPE_ADD) { 739 return folderItem; 740 } 741 742 const openFolderConfig = this.mBigFolderModel.getFolderOpenLayout(); 743 const column = openFolderConfig.column; 744 const row = openFolderConfig.row; 745 const addInfo = { 746 typeId: CommonConstants.TYPE_ADD, 747 appName: $r('app.string.add'), 748 bundleName: '', 749 appIconId: BigFolderStyleConstants.DEFAULT_ADD_FOLDER_APP_IMAGE, 750 appLabelId: 0 751 }; 752 if (folderItem.layoutInfo[folderItem.layoutInfo.length - 1].length === column * row) { 753 folderItem.layoutInfo.push([addInfo]); 754 } else { 755 folderItem.layoutInfo[folderItem.layoutInfo.length - 1].push(addInfo); 756 } 757 758 Log.showDebug(TAG, 'addAddIcon end'); 759 return folderItem; 760 } 761 762 /** 763 * open folder 764 * 765 * @param {any} folderInfo. 766 */ 767 delAddIcon(folderItem: any): any { 768 Log.showDebug(TAG, 'delAddIcon start'); 769 770 if (folderItem.layoutInfo.length == 0) { 771 return folderItem; 772 } 773 const lastPageItem = folderItem.layoutInfo[folderItem.layoutInfo.length - 1]; 774 if (lastPageItem[lastPageItem.length - 1].typeId !== CommonConstants.TYPE_ADD) { 775 return folderItem; 776 } 777 lastPageItem.pop(); 778 if (lastPageItem.length == 0) { 779 folderItem.layoutInfo.pop(); 780 } else { 781 folderItem.layoutInfo[folderItem.layoutInfo.length - 1] = lastPageItem; 782 } 783 784 Log.showDebug(TAG, 'delAddIcon end'); 785 return folderItem; 786 } 787 788 /** 789 * open folder 790 * 791 * @param {any} folderInfo. 792 */ 793 async openFolder(isRename: boolean, folderItem: any) { 794 Log.showDebug(TAG, 'openFolder start'); 795 folderItem.enterEditing = isRename; 796 797 AppStorage.setOrCreate('openFolderData', folderItem); 798 this.mPageIndex = 0; 799 AppStorage.setOrCreate('openFolderPageIndex', this.mPageIndex); 800 AppStorage.setOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_OPEN); 801 Log.showDebug(TAG, 'openFolder end'); 802 } 803 804 /** 805 * close folder 806 */ 807 async closeFolder() { 808 Log.showDebug(TAG, 'closeFolder start'); 809 810 this.mPageIndex = 0; 811 AppStorage.setOrCreate('openFolderPageIndex', this.mPageIndex); 812 AppStorage.setOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); 813 } 814 815 /** 816 * refresh folder data 817 * 818 * @param folderItem 819 */ 820 async refreshFolder(folderItem: any) { 821 Log.showDebug(TAG, 'refreshFolder start'); 822 folderItem.enterEditing = false; 823 this.updateOpenFolderStatus(folderItem); 824 Log.showDebug(TAG, 'refreshFolder end'); 825 } 826 827 /** 828 * get device type 829 * 830 * @return {boolean} isPad. 831 */ 832 getIsPad(): boolean { 833 return CommonConstants.PAD_DEVICE_TYPE == AppStorage.get('deviceType'); 834 } 835 836 /** 837 * modify folder name 838 * 839 * @param {any} folderModel. 840 */ 841 modifyFolderName(folderModel): void { 842 let gridLayoutInfo = { 843 layoutInfo: [] 844 }; 845 gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 846 847 for (let i = 0; i < gridLayoutInfo.layoutInfo.length; i++) { 848 if (gridLayoutInfo.layoutInfo[i].typeId === CommonConstants.TYPE_FOLDER && 849 gridLayoutInfo.layoutInfo[i].folderId === folderModel.folderId) { 850 gridLayoutInfo.layoutInfo[i].folderName = folderModel.folderName; 851 } 852 } 853 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 854 } 855 856 /** 857 * make the applist into folder page 858 * 859 * @param appInfos 860 */ 861 filterFolderPage(appInfos): any[] { 862 const folderLayoutInfo = []; 863 const appListInfo = JSON.parse(JSON.stringify(appInfos)); 864 const openFolderConfig = this.mBigFolderModel.getFolderOpenLayout(); 865 866 const itemCountByPage = openFolderConfig.column * openFolderConfig.row; 867 let pageCount = Math.floor(appListInfo.length / itemCountByPage); 868 if (appListInfo.length % itemCountByPage != 0) { 869 pageCount = pageCount + 1; 870 } 871 Log.showDebug(TAG, `filterFolderPage pageCount: ${pageCount}`); 872 for (let i = 0; i < pageCount; i++) { 873 let pageInfo = []; 874 if (itemCountByPage > appListInfo.length) { 875 pageInfo = appListInfo.splice(0, appListInfo.length); 876 } else { 877 pageInfo = appListInfo.splice(0, itemCountByPage); 878 } 879 folderLayoutInfo.push(pageInfo); 880 } 881 return folderLayoutInfo; 882 } 883 884 /** 885 * make the folder layoutInfo into list 886 * 887 * @param folderInfo 888 */ 889 private layoutInfoToList(folderInfo): any[] { 890 let appInfo = []; 891 for (let i = 0; i < folderInfo.layoutInfo.length; i++) { 892 for (let j = 0; j < folderInfo.layoutInfo[i].length; j++) { 893 if (folderInfo.layoutInfo[i][j].typeId != CommonConstants.TYPE_ADD) { 894 appInfo = appInfo.concat(folderInfo.layoutInfo[i][j]); 895 } 896 } 897 } 898 return appInfo; 899 } 900 901 /** 902 * create folder info 903 * 904 * @return {any} folderInfo. 905 */ 906 private async createNewFolderInfo() { 907 const folderConfig = this.mBigFolderModel.getFolderLayout(); 908 const folderName = await this.generateFolderName(); 909 // Create new folder info 910 const folderInfo = { 911 folderId: this.getUUID(), 912 folderName: folderName, 913 layoutInfo: [], 914 typeId: CommonConstants.TYPE_FOLDER, 915 area: folderConfig.area, 916 badgeNumber: 0 917 }; 918 return folderInfo; 919 } 920 921 /** 922 * generate folder name 923 * 924 * @return {string} folderName. 925 */ 926 private async generateFolderName() { 927 Log.showDebug(TAG, 'generateFolderName start'); 928 const folderList = await this.getAllFolderList(); 929 let folderName: string = await ResourceManager.getInstance().getStringByIdSync($r('app.string.new_folder_name').id); 930 const autoNameFolderList = folderList.filter((element, index, self) => { 931 return element.folderName.startsWith(folderName) && (element.folderName.length > folderName.length); 932 }); 933 934 autoNameFolderList.sort(this.mPinyinSort.sortByFolderName.bind(this.mPinyinSort)); 935 936 let nameNumber = 1; 937 let tempFolderName = folderName + nameNumber; 938 for (let i = 0; i < autoNameFolderList.length; i++) { 939 if (autoNameFolderList[i].folderName == tempFolderName) { 940 nameNumber = nameNumber + 1; 941 tempFolderName = folderName + nameNumber; 942 } else { 943 break; 944 } 945 } 946 folderName = folderName + nameNumber; 947 return folderName; 948 } 949 950 /** 951 * generate a non duplicate ID 952 * 953 * @param {string} idLength 954 */ 955 private getUUID(): string { 956 Log.showDebug(TAG, 'getUUID start'); 957 let id = Date.now().toString(HEXADECIMAL_VALUE); 958 id += Math.random().toString(HEXADECIMAL_VALUE).substr(2); 959 return id; 960 } 961 962 /** 963 * change the open folder page number. 964 * 965 * @param idx: Page number 966 */ 967 changeIndex(idx): void { 968 this.mPageIndex = idx; 969 AppStorage.setOrCreate('openFolderPageIndex', this.mPageIndex); 970 } 971 972 /** 973 * get the open folder page number. 974 */ 975 getIndex(): number { 976 return this.mPageIndex; 977 } 978 979 /** 980 * get addlist dialog's column 981 */ 982 getAddListColumn(): number { 983 return this.mBigFolderModel.getFolderAddAppLayout().column; 984 } 985 986 /** 987 * get add app dialog's height 988 * 989 * @param appList 990 */ 991 getDialogHeight(appList: []): number { 992 let height = 0; 993 const styleConfig = this.mFolderStyleConfig; 994 const column = this.mBigFolderModel.getFolderAddAppLayout().column; 995 const row = this.mBigFolderModel.getFolderAddAppLayout().row; 996 const num = Math.ceil(appList.length / column); 997 if (num <= row) { 998 height = styleConfig.mAddFolderDialogHeight; 999 } else { 1000 const gridHeight = num * (this.mFolderStyleConfig.mAddFolderIconSize + this.mFolderStyleConfig.mAddFolderTextLines) + num * styleConfig.mAddFolderGridGap + 1001 styleConfig.mAddFolderGridMargin * 2; 1002 height = gridHeight + BigFolderStyleConstants.DEFAULT_APP_ADD_TITLE_SIZE + 1003 BigFolderStyleConstants.DEFAULT_BUTTON_HEIGHT + BigFolderStyleConstants.DEFAULT_DIALOG_BOTTOM_MARGIN; 1004 if (height > styleConfig.mAddFolderMaxHeight) { 1005 height = styleConfig.mAddFolderMaxHeight; 1006 } 1007 } 1008 return height; 1009 } 1010 1011 /** 1012 * delete app from folder 1013 * 1014 * @param bundleName 1015 */ 1016 deleteAppFromFolderByUninstall(bundleName): void { 1017 Log.showDebug(TAG, 'deleteAppFromFolderByUninstall start'); 1018 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 1019 const layoutInfo = gridLayoutInfo.layoutInfo; 1020 for (let i = 0; i < layoutInfo.length; i++) { 1021 if (layoutInfo[i].typeId == CommonConstants.TYPE_FOLDER) { 1022 let folderAppList = this.layoutInfoToList(layoutInfo[i]); 1023 folderAppList = folderAppList.filter(item => item.bundleName != bundleName); 1024 this.updateFolderInfo(folderAppList, gridLayoutInfo, i); 1025 } 1026 } 1027 Log.showDebug(TAG, 'deleteAppFromFolderByUninstall end'); 1028 } 1029 1030 /** 1031 * update layoutInfo when only one item in the folder 1032 * 1033 * @param folderAppList 1034 * @param gridLayoutInfo 1035 * @param index 1036 */ 1037 private updateFolderInfo(folderAppList, gridLayoutInfo, index): void { 1038 if (folderAppList.length == 0) { 1039 gridLayoutInfo.layoutInfo.splice(index, 1); 1040 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 1041 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 1042 } else if (folderAppList.length == 1) { 1043 const appLayoutInfo = { 1044 bundleName: folderAppList[0].bundleName, 1045 abilityName: folderAppList[0].abilityName, 1046 moduleName: folderAppList[0].moduleName, 1047 keyName: folderAppList[0].keyName, 1048 typeId: CommonConstants.TYPE_APP, 1049 area: [1, 1], 1050 page: gridLayoutInfo.layoutInfo[index].page, 1051 column: gridLayoutInfo.layoutInfo[index].column, 1052 row: gridLayoutInfo.layoutInfo[index].row 1053 }; 1054 gridLayoutInfo.layoutInfo.splice(index, 1); 1055 gridLayoutInfo.layoutInfo.push(appLayoutInfo); 1056 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 1057 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_ADD, folderAppList[0]); 1058 } else { 1059 gridLayoutInfo.layoutInfo[index].layoutInfo = this.filterFolderPage(folderAppList); 1060 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 1061 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 1062 } 1063 } 1064 1065 /** 1066 * remove app from folder 1067 * 1068 * @param {any} appInfo. 1069 */ 1070 removeAppOutOfFolder(appInfo): void { 1071 let openFolderData: { 1072 folderId: string, 1073 layoutInfo: any 1074 } = AppStorage.get('openFolderData'); 1075 1076 const folderAppList = this.getAppListInFolder(openFolderData); 1077 this.deleteAppFromFolderAppList(appInfo, folderAppList); 1078 const folderLayoutInfo = this.filterFolderPage(folderAppList); 1079 1080 const removeAppInfos = [appInfo]; 1081 const gridLayoutInfo = this.mSettingsModel.getLayoutInfo(); 1082 const folderIndex = gridLayoutInfo.layoutInfo.findIndex(item => { 1083 return item.typeId === CommonConstants.TYPE_FOLDER && item.folderId === openFolderData.folderId; 1084 }); 1085 1086 if (folderLayoutInfo.length == 1 && folderLayoutInfo[0].length == 1) { 1087 // delete folder and add app to desktop 1088 removeAppInfos.push(folderLayoutInfo[0][0]); 1089 gridLayoutInfo.layoutInfo.splice(folderIndex, 1); 1090 openFolderData = { 1091 folderId: '', layoutInfo: [] 1092 }; 1093 } else { 1094 this.updateBadgeNumber(gridLayoutInfo.layoutInfo[folderIndex], appInfo); 1095 openFolderData.layoutInfo = folderLayoutInfo; 1096 } 1097 const appListInfo = this.mSettingsModel.getAppListInfo(); 1098 // Add app to desktop app list 1099 for (let i = 0; i < removeAppInfos.length; i++) { 1100 const needNewPage: boolean = this.mPageDesktopModel.updatePageDesktopLayoutInfo(gridLayoutInfo, removeAppInfos[i]); 1101 if (needNewPage) { 1102 gridLayoutInfo.layoutDescription.pageCount = gridLayoutInfo.layoutDescription.pageCount + 1; 1103 for (let index = 0; index < gridLayoutInfo.layoutInfo.length; index++) { 1104 if (gridLayoutInfo.layoutInfo[index].page > this.mPageDesktopModel.getPageIndex()) { 1105 gridLayoutInfo.layoutInfo[index].page++; 1106 } 1107 } 1108 } 1109 const gridLayout = this.createAppLayoutInfo(removeAppInfos[i]); 1110 gridLayoutInfo.layoutInfo.push(gridLayout); 1111 const appIndex = appListInfo.findIndex(item => { 1112 return item.keyName === removeAppInfos[i].keyName; 1113 }) 1114 if (appIndex == CommonConstants.INVALID_VALUE) { 1115 appListInfo.push(removeAppInfos[i]); 1116 } 1117 } 1118 this.mSettingsModel.setAppListInfo(appListInfo); 1119 this.mSettingsModel.setLayoutInfo(gridLayoutInfo); 1120 localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); 1121 this.updateOpenFolderStatus(openFolderData); 1122 } 1123 1124 /** 1125 * update folderData and openFolderStatus 1126 * 1127 * @param openFolderData 1128 */ 1129 private updateOpenFolderStatus(openFolderData): void { 1130 AppStorage.setOrCreate('openFolderData', openFolderData); 1131 if (openFolderData.folderId == '') { 1132 AppStorage.setOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); 1133 } else { 1134 AppStorage.setOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_REFRESH); 1135 } 1136 } 1137 1138 /** 1139 * delete appInfo from folder 1140 * 1141 * @param appInfo 1142 * @param folderAppList 1143 */ 1144 private deleteAppFromFolderAppList(appInfo, folderAppList): void { 1145 const appIndex = folderAppList.findIndex(item => { 1146 return item.keyName === appInfo.keyName; 1147 }); 1148 if (appIndex !== CommonConstants.INVALID_VALUE) { 1149 folderAppList.splice(appIndex, 1); 1150 } 1151 } 1152 1153 /** 1154 * get folder's appList from appStorage 1155 * 1156 * @param openFolderData 1157 */ 1158 private getAppListInFolder(openFolderData): any[] { 1159 let folderAppList = []; 1160 for (let i = 0; i < openFolderData.layoutInfo.length; i++) { 1161 folderAppList = folderAppList.concat(openFolderData.layoutInfo[i]); 1162 } 1163 if (folderAppList.length > 0 && folderAppList[folderAppList.length - 1].typeId == CommonConstants.TYPE_ADD) { 1164 folderAppList.pop(); 1165 } 1166 return folderAppList; 1167 } 1168 1169 /** 1170 * get folder layoutInfo after delete appInfo from folder 1171 * 1172 * @param openFolderData 1173 * @param appInfo 1174 */ 1175 private getFolderLayoutInfo(openFolderData, appInfo): any { 1176 let folderAppList = this.getAppListInFolder(openFolderData); 1177 const index = folderAppList.findIndex(item => { 1178 return item.keyName === appInfo.keyName; 1179 }); 1180 if (index !== CommonConstants.INVALID_VALUE) { 1181 folderAppList.splice(index, 1); 1182 } 1183 return this.filterFolderPage(folderAppList); 1184 } 1185}