1c5c2eed7Sopenharmony_ci/*
2c5c2eed7Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c5c2eed7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c5c2eed7Sopenharmony_ci * you may not use this file except in compliance with the License.
5c5c2eed7Sopenharmony_ci * You may obtain a copy of the License at
6c5c2eed7Sopenharmony_ci *
7c5c2eed7Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c5c2eed7Sopenharmony_ci *
9c5c2eed7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c5c2eed7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c5c2eed7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c5c2eed7Sopenharmony_ci * See the License for the specific language governing permissions and
13c5c2eed7Sopenharmony_ci * limitations under the License.
14c5c2eed7Sopenharmony_ci */
15c5c2eed7Sopenharmony_ci
16c5c2eed7Sopenharmony_ciimport UIAbility from '@ohos.app.ability.UIAbility';
17c5c2eed7Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
18c5c2eed7Sopenharmony_ciimport bundleMonitor from '@ohos.bundle.bundleMonitor';
19c5c2eed7Sopenharmony_ciimport account_osAccount from '@ohos.account.osAccount';
20c5c2eed7Sopenharmony_ciimport { GlobalContext } from '../common/utils/globalContext';
21c5c2eed7Sopenharmony_ci
22c5c2eed7Sopenharmony_ciconst TAG = 'PermissionManager_Log:';
23c5c2eed7Sopenharmony_ciconst USER_ID = 100;
24c5c2eed7Sopenharmony_ci
25c5c2eed7Sopenharmony_ciexport default class MainAbility extends UIAbility {
26c5c2eed7Sopenharmony_ci  onCreate(want, launchParam): void {
27c5c2eed7Sopenharmony_ci    console.log(TAG + 'MainAbility onCreate, ability name is ' + want.abilityName + '.');
28c5c2eed7Sopenharmony_ci
29c5c2eed7Sopenharmony_ci    globalThis.bundleName = want.parameters.bundleName;
30c5c2eed7Sopenharmony_ci    GlobalContext.store('bundleName', want.parameters.bundleName);
31c5c2eed7Sopenharmony_ci    GlobalContext.store('context', this.context);
32c5c2eed7Sopenharmony_ci  }
33c5c2eed7Sopenharmony_ci
34c5c2eed7Sopenharmony_ci  onWindowStageCreate(windowStage): void {
35c5c2eed7Sopenharmony_ci    // Main window is created, set main page for this ability
36c5c2eed7Sopenharmony_ci    console.log(TAG + 'MainAbility onWindowStageCreate.');
37c5c2eed7Sopenharmony_ci    globalThis.windowStage = windowStage;
38c5c2eed7Sopenharmony_ci    globalThis.refresh = false;
39c5c2eed7Sopenharmony_ci
40c5c2eed7Sopenharmony_ci    if (globalThis.bundleName) {
41c5c2eed7Sopenharmony_ci      globalThis.currentApp = globalThis.bundleName;
42c5c2eed7Sopenharmony_ci      this.getSperifiedApplication(globalThis.bundleName);
43c5c2eed7Sopenharmony_ci    } else {
44c5c2eed7Sopenharmony_ci      globalThis.currentApp = 'all';
45c5c2eed7Sopenharmony_ci      this.getAllApplications();
46c5c2eed7Sopenharmony_ci    }
47c5c2eed7Sopenharmony_ci
48c5c2eed7Sopenharmony_ci    try {
49c5c2eed7Sopenharmony_ci      bundleMonitor.on('add', (bundleChangeInfo) => {
50c5c2eed7Sopenharmony_ci        console.log(`${TAG} bundleMonitor.add: ${JSON.stringify(bundleChangeInfo)}`);
51c5c2eed7Sopenharmony_ci        if (globalThis.currentApp === 'all') {
52c5c2eed7Sopenharmony_ci          this.getAllApplications();
53c5c2eed7Sopenharmony_ci          globalThis.refresh = true;
54c5c2eed7Sopenharmony_ci        }
55c5c2eed7Sopenharmony_ci      });
56c5c2eed7Sopenharmony_ci      bundleMonitor.on('remove', (bundleChangeInfo) => {
57c5c2eed7Sopenharmony_ci        console.log(`${TAG} bundleMonitor.remove: ${JSON.stringify(bundleChangeInfo)}`);
58c5c2eed7Sopenharmony_ci        if (globalThis.currentApp === 'all') {
59c5c2eed7Sopenharmony_ci          this.getAllApplications();
60c5c2eed7Sopenharmony_ci          globalThis.refresh = true;
61c5c2eed7Sopenharmony_ci        }
62c5c2eed7Sopenharmony_ci      });
63c5c2eed7Sopenharmony_ci      bundleMonitor.on('update', (bundleChangeInfo) => {
64c5c2eed7Sopenharmony_ci        console.log(`${TAG} bundleMonitor.update: ${JSON.stringify(bundleChangeInfo)}`);
65c5c2eed7Sopenharmony_ci        if (globalThis.currentApp === 'all') {
66c5c2eed7Sopenharmony_ci          this.getAllApplications();
67c5c2eed7Sopenharmony_ci          globalThis.refresh = true;
68c5c2eed7Sopenharmony_ci        }
69c5c2eed7Sopenharmony_ci      });
70c5c2eed7Sopenharmony_ci    } catch (error) {
71c5c2eed7Sopenharmony_ci      console.error(TAG + 'bundleMonitor failed.');
72c5c2eed7Sopenharmony_ci    }
73c5c2eed7Sopenharmony_ci
74c5c2eed7Sopenharmony_ci  }
75c5c2eed7Sopenharmony_ci
76c5c2eed7Sopenharmony_ci  onNewWant(want): void {
77c5c2eed7Sopenharmony_ci    console.log(TAG + 'MainAbility onNewWant. want: ' + JSON.stringify(want));
78c5c2eed7Sopenharmony_ci    console.log(TAG + 'MainAbility onNewWant. bundleName: ' + JSON.stringify(want.parameters.bundleName));
79c5c2eed7Sopenharmony_ci
80c5c2eed7Sopenharmony_ci    let bundleName = want.parameters.bundleName ? want.parameters.bundleName : 'all';
81c5c2eed7Sopenharmony_ci    if (globalThis.currentApp === 'all') {
82c5c2eed7Sopenharmony_ci      if (globalThis.currentApp !== bundleName) {
83c5c2eed7Sopenharmony_ci        console.log(TAG + 'MainAbility onNewWant. all -> app');
84c5c2eed7Sopenharmony_ci        globalThis.windowStage?.setUIContent(this.context, 'pages/transition', null);
85c5c2eed7Sopenharmony_ci        globalThis.currentApp = bundleName;
86c5c2eed7Sopenharmony_ci        GlobalContext.store('bundleName', bundleName);
87c5c2eed7Sopenharmony_ci        this.getSperifiedApplication(bundleName);
88c5c2eed7Sopenharmony_ci      } else {
89c5c2eed7Sopenharmony_ci        if (globalThis.refresh === true) {
90c5c2eed7Sopenharmony_ci          globalThis.windowStage?.setUIContent(this.context, 'pages/transition', null);
91c5c2eed7Sopenharmony_ci          this.getAllApplications();
92c5c2eed7Sopenharmony_ci          globalThis.refresh = false;
93c5c2eed7Sopenharmony_ci        }
94c5c2eed7Sopenharmony_ci      }
95c5c2eed7Sopenharmony_ci    } else {
96c5c2eed7Sopenharmony_ci      if (bundleName === 'all') {
97c5c2eed7Sopenharmony_ci        console.log(TAG + 'MainAbility onNewWant. app -> all');
98c5c2eed7Sopenharmony_ci        globalThis.windowStage?.setUIContent(this.context, 'pages/transition', null);
99c5c2eed7Sopenharmony_ci        globalThis.currentApp = 'all';
100c5c2eed7Sopenharmony_ci        this.getAllApplications();
101c5c2eed7Sopenharmony_ci      } else {
102c5c2eed7Sopenharmony_ci        if (globalThis.currentApp !== bundleName) {
103c5c2eed7Sopenharmony_ci          console.log(TAG + 'MainAbility onNewWant. app -> app');
104c5c2eed7Sopenharmony_ci          globalThis.windowStage?.setUIContent(this.context, 'pages/transition', null);
105c5c2eed7Sopenharmony_ci          globalThis.currentApp = bundleName;
106c5c2eed7Sopenharmony_ci          GlobalContext.store('bundleName', bundleName);
107c5c2eed7Sopenharmony_ci          this.getSperifiedApplication(bundleName);
108c5c2eed7Sopenharmony_ci        }
109c5c2eed7Sopenharmony_ci      }
110c5c2eed7Sopenharmony_ci    }
111c5c2eed7Sopenharmony_ci
112c5c2eed7Sopenharmony_ci  }
113c5c2eed7Sopenharmony_ci
114c5c2eed7Sopenharmony_ci  onWindowStageDestroy(): void {
115c5c2eed7Sopenharmony_ci    try {
116c5c2eed7Sopenharmony_ci      bundleMonitor.off('add');
117c5c2eed7Sopenharmony_ci      bundleMonitor.off('remove');
118c5c2eed7Sopenharmony_ci      bundleMonitor.off('update');
119c5c2eed7Sopenharmony_ci      console.log(TAG + 'MainAbility onWindowStageDestroy.');
120c5c2eed7Sopenharmony_ci    } catch (err) {
121c5c2eed7Sopenharmony_ci      console.log(`errData is errCode:${err.code}  message:${err.message}`);
122c5c2eed7Sopenharmony_ci    }
123c5c2eed7Sopenharmony_ci  }
124c5c2eed7Sopenharmony_ci
125c5c2eed7Sopenharmony_ci  onBackground(): void {
126c5c2eed7Sopenharmony_ci    console.log(TAG + ' onBackground.');
127c5c2eed7Sopenharmony_ci  }
128c5c2eed7Sopenharmony_ci
129c5c2eed7Sopenharmony_ci  onDestroy(): void {
130c5c2eed7Sopenharmony_ci    console.log(TAG + ' onDestroy.');
131c5c2eed7Sopenharmony_ci  }
132c5c2eed7Sopenharmony_ci
133c5c2eed7Sopenharmony_ci  onForeground(): void {
134c5c2eed7Sopenharmony_ci    console.log(TAG + ' onForeground.');
135c5c2eed7Sopenharmony_ci  }
136c5c2eed7Sopenharmony_ci
137c5c2eed7Sopenharmony_ci  getAllApplications(): void {
138c5c2eed7Sopenharmony_ci    const flag =
139c5c2eed7Sopenharmony_ci      bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
140c5c2eed7Sopenharmony_ci      bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION;
141c5c2eed7Sopenharmony_ci    let accountManager = account_osAccount.getAccountManager();
142c5c2eed7Sopenharmony_ci    try {
143c5c2eed7Sopenharmony_ci      accountManager.getActivatedOsAccountLocalIds((err, idArray: number[])=>{
144c5c2eed7Sopenharmony_ci        console.log(TAG + 'getActivatedOsAccountLocalIds err:' + JSON.stringify(err));
145c5c2eed7Sopenharmony_ci        console.log(TAG + 'getActivatedOsAccountLocalIds idArray: ' + JSON.stringify(idArray));
146c5c2eed7Sopenharmony_ci        let userId = idArray[0];
147c5c2eed7Sopenharmony_ci        bundleManager.getAllBundleInfo(flag, userId || USER_ID).then(async(bundleInfos) => {
148c5c2eed7Sopenharmony_ci          if (bundleInfos.length <= 0) {
149c5c2eed7Sopenharmony_ci            console.info(TAG + 'bundle.getAllBundleInfo result.length less than or equal to zero');
150c5c2eed7Sopenharmony_ci            return;
151c5c2eed7Sopenharmony_ci          }
152c5c2eed7Sopenharmony_ci          let initialGroups = [];
153c5c2eed7Sopenharmony_ci          for (let i = 0; i < bundleInfos.length; i++) {
154c5c2eed7Sopenharmony_ci            let info = bundleInfos[i];
155c5c2eed7Sopenharmony_ci            // Filter blank icon icon and text label resources
156c5c2eed7Sopenharmony_ci            try {
157c5c2eed7Sopenharmony_ci              await bundleManager.queryAbilityInfo({
158c5c2eed7Sopenharmony_ci                bundleName: info.name,
159c5c2eed7Sopenharmony_ci                action: 'action.system.home',
160c5c2eed7Sopenharmony_ci                entities: ['entity.system.home']
161c5c2eed7Sopenharmony_ci              }, bundleManager.AbilityFlag.GET_ABILITY_INFO_WITH_APPLICATION);
162c5c2eed7Sopenharmony_ci            } catch (error) {
163c5c2eed7Sopenharmony_ci              console.error(
164c5c2eed7Sopenharmony_ci                TAG + 'queryAbilityByWant catch app: ' + JSON.stringify(info.name) + 'err: ' + JSON.stringify(error)
165c5c2eed7Sopenharmony_ci              );
166c5c2eed7Sopenharmony_ci              continue;
167c5c2eed7Sopenharmony_ci            }
168c5c2eed7Sopenharmony_ci
169c5c2eed7Sopenharmony_ci            initialGroups.push(info);
170c5c2eed7Sopenharmony_ci          }
171c5c2eed7Sopenharmony_ci          let storage: LocalStorage = new LocalStorage({ 'initialGroups': initialGroups });
172c5c2eed7Sopenharmony_ci          globalThis.windowStage?.loadContent('pages/authority-management', storage);
173c5c2eed7Sopenharmony_ci        }).catch((error) => {
174c5c2eed7Sopenharmony_ci          console.error(TAG + 'bundle.getAllBundleInfo failed. Cause: ' + JSON.stringify(error));
175c5c2eed7Sopenharmony_ci        });
176c5c2eed7Sopenharmony_ci      });
177c5c2eed7Sopenharmony_ci    } catch (e) {
178c5c2eed7Sopenharmony_ci      console.error(TAG + 'getActivatedOsAccountLocalIds exception: ' + JSON.stringify(e));
179c5c2eed7Sopenharmony_ci    }
180c5c2eed7Sopenharmony_ci  }
181c5c2eed7Sopenharmony_ci
182c5c2eed7Sopenharmony_ci  getSperifiedApplication(bundleName): void {
183c5c2eed7Sopenharmony_ci    const flag =
184c5c2eed7Sopenharmony_ci      bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
185c5c2eed7Sopenharmony_ci      bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION;
186c5c2eed7Sopenharmony_ci    try {
187c5c2eed7Sopenharmony_ci      bundleManager.getBundleInfo(bundleName, flag).then(bundleInfo => {
188c5c2eed7Sopenharmony_ci        let reqPermissions: Array<string> = [];
189c5c2eed7Sopenharmony_ci        bundleInfo.reqPermissionDetails.forEach(item => {
190c5c2eed7Sopenharmony_ci          reqPermissions.push(item.name);
191c5c2eed7Sopenharmony_ci        });
192c5c2eed7Sopenharmony_ci
193c5c2eed7Sopenharmony_ci        let info = {
194c5c2eed7Sopenharmony_ci          'bundleName': bundleInfo.name,
195c5c2eed7Sopenharmony_ci          'api': bundleInfo.targetVersion,
196c5c2eed7Sopenharmony_ci          'tokenId': bundleInfo.appInfo.accessTokenId,
197c5c2eed7Sopenharmony_ci          'icon': '',
198c5c2eed7Sopenharmony_ci          'iconId': bundleInfo.appInfo.iconId,
199c5c2eed7Sopenharmony_ci          'iconResource': bundleInfo.appInfo.iconResource,
200c5c2eed7Sopenharmony_ci          'label': '',
201c5c2eed7Sopenharmony_ci          'labelId': bundleInfo.appInfo.labelId,
202c5c2eed7Sopenharmony_ci          'labelResource': bundleInfo.appInfo.labelResource,
203c5c2eed7Sopenharmony_ci          'permissions': reqPermissions,
204c5c2eed7Sopenharmony_ci          'groupId': [],
205c5c2eed7Sopenharmony_ci          'zhTag': '',
206c5c2eed7Sopenharmony_ci          'indexTag': '',
207c5c2eed7Sopenharmony_ci          'language': ''
208c5c2eed7Sopenharmony_ci        };
209c5c2eed7Sopenharmony_ci        GlobalContext.store('applicationInfo', info);
210c5c2eed7Sopenharmony_ci        globalThis.windowStage?.setUIContent(this.context, 'pages/application-secondary', null);
211c5c2eed7Sopenharmony_ci      }).catch((error) => {
212c5c2eed7Sopenharmony_ci        console.log(TAG + 'Special branch getBundleInfo failed:' + JSON.stringify(error));
213c5c2eed7Sopenharmony_ci        this.context.terminateSelf();
214c5c2eed7Sopenharmony_ci      });
215c5c2eed7Sopenharmony_ci    } catch (error) {
216c5c2eed7Sopenharmony_ci      console.error(TAG + 'Special branch failed: ' + JSON.stringify(error));
217c5c2eed7Sopenharmony_ci    }
218c5c2eed7Sopenharmony_ci  }
219c5c2eed7Sopenharmony_ci};
220