• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}