1df226684Sopenharmony_ci/*
2df226684Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3df226684Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4df226684Sopenharmony_ci * you may not use this file except in compliance with the License.
5df226684Sopenharmony_ci * You may obtain a copy of the License at
6df226684Sopenharmony_ci *
7df226684Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8df226684Sopenharmony_ci *
9df226684Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10df226684Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11df226684Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12df226684Sopenharmony_ci * See the License for the specific language governing permissions and
13df226684Sopenharmony_ci * limitations under the License.
14df226684Sopenharmony_ci */
15df226684Sopenharmony_ci
16df226684Sopenharmony_ciimport UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
17df226684Sopenharmony_ciimport UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility';
18df226684Sopenharmony_ciimport dlpPermission from '@ohos.dlpPermission';
19df226684Sopenharmony_ciimport emitter from '@ohos.events.emitter';
20df226684Sopenharmony_ciimport Want from '@ohos.app.ability.Want';
21df226684Sopenharmony_ciimport { BusinessError } from '@ohos.base';
22df226684Sopenharmony_ciimport osAccount from '@ohos.account.osAccount';
23df226684Sopenharmony_ciimport { Configuration } from '@ohos.app.ability.Configuration';
24df226684Sopenharmony_ciimport Constants from '../common/constant';
25df226684Sopenharmony_ciimport {
26df226684Sopenharmony_ci  getAuthPerm,
27df226684Sopenharmony_ci  checkDomainAccountInfo,
28df226684Sopenharmony_ci  getOsAccountInfo,
29df226684Sopenharmony_ci  judgeIsSandBox,
30df226684Sopenharmony_ci  getFileFd,
31df226684Sopenharmony_ci  getAppId,
32df226684Sopenharmony_ci  DLPInfo,
33df226684Sopenharmony_ci  getDLPInfo,
34df226684Sopenharmony_ci  sendDlpManagerAccountLogin,
35df226684Sopenharmony_ci  isValidPath,
36df226684Sopenharmony_ci  getAccountType
37df226684Sopenharmony_ci} from '../common/utils';
38df226684Sopenharmony_ciimport GlobalContext from '../common/GlobalContext';
39df226684Sopenharmony_ciimport HomeFeature from '../feature/HomeFeature';
40df226684Sopenharmony_ciimport { AccountTipsConfig } from '../common/AccountTipsConfig';
41df226684Sopenharmony_ciimport common from '@ohos.app.ability.common';
42df226684Sopenharmony_ciimport { GetAlertMessage } from '../common/GetAlertMessage';
43df226684Sopenharmony_ciimport { HiLog } from '../common/HiLog';
44df226684Sopenharmony_ciimport FileUtils from '../common/FileUtils';
45df226684Sopenharmony_ciimport AccountManager from '../manager/AccountManager';
46df226684Sopenharmony_ci
47df226684Sopenharmony_ciconst TAG = 'MainEx';
48df226684Sopenharmony_ci
49df226684Sopenharmony_cilet direction: number = -1;
50df226684Sopenharmony_ci
51df226684Sopenharmony_ciexport default class MainAbility extends UIExtensionAbility {
52df226684Sopenharmony_ci  private authPerm: dlpPermission.DLPFileAccess = dlpPermission.DLPFileAccess.READ_ONLY;
53df226684Sopenharmony_ci  private callerToken: number = 0;
54df226684Sopenharmony_ci  private homeFeature!: HomeFeature;
55df226684Sopenharmony_ci
56df226684Sopenharmony_ci  async onSessionCreate(want: Want, session: UIExtensionContentSession): Promise<void> {
57df226684Sopenharmony_ci    HiLog.info(TAG, `onSessionCreate start`);
58df226684Sopenharmony_ci    if (GlobalContext.load('session')) {
59df226684Sopenharmony_ci      this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_ENCRYPTING,
60df226684Sopenharmony_ci          data: GlobalContext.load('abilityWant').parameters?.displayName
61df226684Sopenharmony_ci        } as BusinessError);
62df226684Sopenharmony_ci      return;
63df226684Sopenharmony_ci    }
64df226684Sopenharmony_ci    GlobalContext.store('session', session);
65df226684Sopenharmony_ci    let dlpInfo:DLPInfo = await getDLPInfo();
66df226684Sopenharmony_ci    AppStorage.setOrCreate('hiPNameId', dlpInfo.name);
67df226684Sopenharmony_ci    AppStorage.setOrCreate('hiPVersionId', dlpInfo.versionCode);
68df226684Sopenharmony_ci    GlobalContext.store('abilityWant', want);
69df226684Sopenharmony_ci    GlobalContext.store('uri', want.uri ?? '');
70df226684Sopenharmony_ci    direction = this.context.config.direction ?? -1;
71df226684Sopenharmony_ci
72df226684Sopenharmony_ci    this.homeFeature = new HomeFeature(this.context);
73df226684Sopenharmony_ci    GlobalContext.store('homeFeature', this.homeFeature);
74df226684Sopenharmony_ci
75df226684Sopenharmony_ci    this.homeFeature.connectServiceExtAbility(()=>{
76df226684Sopenharmony_ci      this.getNewWantPage(want, session);
77df226684Sopenharmony_ci    });
78df226684Sopenharmony_ci
79df226684Sopenharmony_ci    AccountManager.connectAbility(this.context);
80df226684Sopenharmony_ci  }
81df226684Sopenharmony_ci
82df226684Sopenharmony_ci  onConfigurationUpdate(newConfig: Configuration): void {
83df226684Sopenharmony_ci    if (direction !== newConfig.direction) {
84df226684Sopenharmony_ci      direction = newConfig.direction ?? -1;
85df226684Sopenharmony_ci    }
86df226684Sopenharmony_ci    let eventData: emitter.EventData = {
87df226684Sopenharmony_ci      data: {
88df226684Sopenharmony_ci        'direction': direction,
89df226684Sopenharmony_ci      }};
90df226684Sopenharmony_ci    let innerEvent: emitter.InnerEvent = {
91df226684Sopenharmony_ci      eventId: Constants.ENCRYPTION_EMIT_DIRECTION_STATUS,
92df226684Sopenharmony_ci      priority: emitter.EventPriority.HIGH
93df226684Sopenharmony_ci    };
94df226684Sopenharmony_ci    emitter.emit(innerEvent, eventData);
95df226684Sopenharmony_ci  }
96df226684Sopenharmony_ci
97df226684Sopenharmony_ci  onSessionDestroy(session: UIExtensionContentSession): void {
98df226684Sopenharmony_ci    HiLog.info(TAG, `onSessionDestroy`);
99df226684Sopenharmony_ci    if (session !== GlobalContext.load('session')) {
100df226684Sopenharmony_ci      return;
101df226684Sopenharmony_ci    }
102df226684Sopenharmony_ci    if (!(GlobalContext.load('requestIsFromSandBox') as boolean)) {
103df226684Sopenharmony_ci      this.homeFeature.closeDLPFileHome(GlobalContext.load('uri'), (err: number) => {
104df226684Sopenharmony_ci        if (err !== 0) {
105df226684Sopenharmony_ci          HiLog.error(TAG, `closeDLPFile failed: ${err}`);
106df226684Sopenharmony_ci        }
107df226684Sopenharmony_ci      });
108df226684Sopenharmony_ci    }
109df226684Sopenharmony_ci    GlobalContext.store('session', '');
110df226684Sopenharmony_ci  }
111df226684Sopenharmony_ci
112df226684Sopenharmony_ci  async gotoPage(session: UIExtensionContentSession): Promise<void> {
113df226684Sopenharmony_ci    let accountInfo: osAccount.OsAccountInfo = GlobalContext.load('accountInfo');
114df226684Sopenharmony_ci    let accountName: string = accountInfo.domainInfo.accountName;
115df226684Sopenharmony_ci    this.authPerm = getAuthPerm(accountName, GlobalContext.load('dlpProperty'));
116df226684Sopenharmony_ci
117df226684Sopenharmony_ci    AppStorage.setOrCreate('authPerm', this.authPerm);
118df226684Sopenharmony_ci    AppStorage.setOrCreate<string>('contactAccount', GlobalContext.load('dlpProperty').contactAccount);
119df226684Sopenharmony_ci    AppStorage.setOrCreate('validity', GlobalContext.load('dlpProperty').expireTime)
120df226684Sopenharmony_ci    if (this.authPerm < dlpPermission.DLPFileAccess.READ_ONLY ||
121df226684Sopenharmony_ci      this.authPerm > dlpPermission.DLPFileAccess.FULL_CONTROL) {
122df226684Sopenharmony_ci      this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError);
123df226684Sopenharmony_ci      return;
124df226684Sopenharmony_ci    }
125df226684Sopenharmony_ci    if (this.authPerm === dlpPermission.DLPFileAccess.FULL_CONTROL) {
126df226684Sopenharmony_ci      try {
127df226684Sopenharmony_ci        await this.checkValidEnterpriseAndAccount(session);
128df226684Sopenharmony_ci      } catch {
129df226684Sopenharmony_ci        return;
130df226684Sopenharmony_ci      }
131df226684Sopenharmony_ci
132df226684Sopenharmony_ci      let storage: LocalStorage = new LocalStorage({
133df226684Sopenharmony_ci        'session': session,
134df226684Sopenharmony_ci      } as Record<string, UIExtensionContentSession | string>);
135df226684Sopenharmony_ci      try {
136df226684Sopenharmony_ci        session.loadContent('pages/changeEncryption', storage);
137df226684Sopenharmony_ci        session.setWindowBackgroundColor(Constants.TRANSPARENT_BACKGROUND_COLOR);
138df226684Sopenharmony_ci      } catch (exception) {
139df226684Sopenharmony_ci        HiLog.error(TAG, `Failed to set the background color. Cause: ${JSON.stringify(exception)}`);
140df226684Sopenharmony_ci      }
141df226684Sopenharmony_ci    } else {
142df226684Sopenharmony_ci      let storage: LocalStorage = new LocalStorage({
143df226684Sopenharmony_ci        'session': session,
144df226684Sopenharmony_ci      } as Record<string, UIExtensionContentSession | string>);
145df226684Sopenharmony_ci      try {
146df226684Sopenharmony_ci        session.loadContent('pages/permissionStatus', storage);
147df226684Sopenharmony_ci        session.setWindowBackgroundColor(Constants.TRANSPARENT_BACKGROUND_COLOR);
148df226684Sopenharmony_ci      } catch (exception) {
149df226684Sopenharmony_ci        HiLog.error(TAG, `Failed to set the background color. Cause: ${JSON.stringify(exception)}`);
150df226684Sopenharmony_ci      }
151df226684Sopenharmony_ci    }
152df226684Sopenharmony_ci  }
153df226684Sopenharmony_ci
154df226684Sopenharmony_ci  async checkValidWant(want: Want): Promise<boolean> {
155df226684Sopenharmony_ci    let parameters = want.parameters;
156df226684Sopenharmony_ci    if (parameters === undefined) {
157df226684Sopenharmony_ci      HiLog.error(TAG, `need parameters in want`);
158df226684Sopenharmony_ci      return false;
159df226684Sopenharmony_ci    }
160df226684Sopenharmony_ci    if (parameters.fileName === undefined) {
161df226684Sopenharmony_ci      HiLog.error(TAG, `need fileName in want.parameters`);
162df226684Sopenharmony_ci      return false;
163df226684Sopenharmony_ci    }
164df226684Sopenharmony_ci    if ((parameters.fileName as Record<string, string>).name === undefined) {
165df226684Sopenharmony_ci      HiLog.error(TAG, `need name in want.parameters.fileName`);
166df226684Sopenharmony_ci      return false;
167df226684Sopenharmony_ci    }
168df226684Sopenharmony_ci    if (want.uri === undefined) {
169df226684Sopenharmony_ci      HiLog.error(TAG, `need uri in want`);
170df226684Sopenharmony_ci      return false;
171df226684Sopenharmony_ci    }
172df226684Sopenharmony_ci    this.callerToken = parameters['ohos.aafwk.param.callerToken'] as number;
173df226684Sopenharmony_ci    let callerBundleName: string = parameters['ohos.aafwk.param.callerBundleName'] as string;
174df226684Sopenharmony_ci    if (this.callerToken === undefined || callerBundleName === undefined) {
175df226684Sopenharmony_ci      HiLog.error(TAG, `need caller info in want.parameters`);
176df226684Sopenharmony_ci      return false;
177df226684Sopenharmony_ci    }
178df226684Sopenharmony_ci    AppStorage.setOrCreate('hiPkgName', callerBundleName);
179df226684Sopenharmony_ci    let uri = String(want.uri);
180df226684Sopenharmony_ci    if (!isValidPath(uri)) {
181df226684Sopenharmony_ci      HiLog.error(TAG, `invalid uri in want.uri`);
182df226684Sopenharmony_ci      return false;
183df226684Sopenharmony_ci    }
184df226684Sopenharmony_ci    try {
185df226684Sopenharmony_ci      await new Promise<void>((resolve, reject) => {
186df226684Sopenharmony_ci        this.homeFeature.linkSetHome(uri, (err: number) => {
187df226684Sopenharmony_ci          if (err === 0) {
188df226684Sopenharmony_ci            HiLog.error(TAG, `invalid uri for opened link uri`);
189df226684Sopenharmony_ci            reject();
190df226684Sopenharmony_ci          }
191df226684Sopenharmony_ci          resolve();
192df226684Sopenharmony_ci        })
193df226684Sopenharmony_ci      })
194df226684Sopenharmony_ci    } catch {
195df226684Sopenharmony_ci      return false;
196df226684Sopenharmony_ci    }
197df226684Sopenharmony_ci
198df226684Sopenharmony_ci    if (uri.indexOf(Constants.FUSE_PATH) !== -1) {
199df226684Sopenharmony_ci      HiLog.error(TAG, `invalid uri in want.uri`);
200df226684Sopenharmony_ci      return false;
201df226684Sopenharmony_ci    }
202df226684Sopenharmony_ci    return true;
203df226684Sopenharmony_ci  }
204df226684Sopenharmony_ci
205df226684Sopenharmony_ci  async checkValidEnterpriseAndAccount(session: UIExtensionContentSession): Promise<void> {
206df226684Sopenharmony_ci    return new Promise(async (resolve, reject) => {
207df226684Sopenharmony_ci      let accountInfo: osAccount.OsAccountInfo = GlobalContext.load('accountInfo');
208df226684Sopenharmony_ci      AccountTipsConfig.getAccountInfo(accountInfo.domainInfo.accountName)
209df226684Sopenharmony_ci        .then(() => {
210df226684Sopenharmony_ci          resolve();
211df226684Sopenharmony_ci        })
212df226684Sopenharmony_ci        .catch(async (error: BusinessError) => {
213df226684Sopenharmony_ci          this.gotoAlertPage(session, error);
214df226684Sopenharmony_ci          reject();
215df226684Sopenharmony_ci          return;
216df226684Sopenharmony_ci        })
217df226684Sopenharmony_ci    })
218df226684Sopenharmony_ci  }
219df226684Sopenharmony_ci
220df226684Sopenharmony_ci  async checkValidWantAndAccount(session: UIExtensionContentSession, want: Want): Promise<void> {
221df226684Sopenharmony_ci    return new Promise(async (resolve, reject) => {
222df226684Sopenharmony_ci      if (!this.checkValidWant(want)) {
223df226684Sopenharmony_ci        this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_PARAM_ERROR } as BusinessError);
224df226684Sopenharmony_ci        reject();
225df226684Sopenharmony_ci        return;
226df226684Sopenharmony_ci      }
227df226684Sopenharmony_ci      let accountInfo: osAccount.OsAccountInfo;
228df226684Sopenharmony_ci      try {
229df226684Sopenharmony_ci        accountInfo = await getOsAccountInfo();
230df226684Sopenharmony_ci        GlobalContext.store('accountInfo', accountInfo);
231df226684Sopenharmony_ci        AppStorage.setOrCreate('accountDomain', accountInfo.domainInfo.domain);
232df226684Sopenharmony_ci        resolve();
233df226684Sopenharmony_ci      } catch (err) {
234df226684Sopenharmony_ci        HiLog.error(TAG, `getOsAccountInfo failed: ${JSON.stringify(err)}`);
235df226684Sopenharmony_ci        this.gotoAlertPage(session, { code: Constants.ERR_JS_GET_ACCOUNT_ERROR } as BusinessError);
236df226684Sopenharmony_ci        reject();
237df226684Sopenharmony_ci        return;
238df226684Sopenharmony_ci      }
239df226684Sopenharmony_ci    })
240df226684Sopenharmony_ci  }
241df226684Sopenharmony_ci
242df226684Sopenharmony_ci  async getNewWantPage(want: Want, session: UIExtensionContentSession): Promise<void> {
243df226684Sopenharmony_ci    HiLog.info(TAG, `getNewWantPage start`);
244df226684Sopenharmony_ci    try {
245df226684Sopenharmony_ci      await this.checkValidWantAndAccount(session, want)
246df226684Sopenharmony_ci    } catch {
247df226684Sopenharmony_ci      return;
248df226684Sopenharmony_ci    }
249df226684Sopenharmony_ci    let codeMessage = checkDomainAccountInfo(GlobalContext.load('accountInfo'));
250df226684Sopenharmony_ci    sendDlpManagerAccountLogin(0);
251df226684Sopenharmony_ci    if (codeMessage) {
252df226684Sopenharmony_ci      this.gotoAlertPage(session, { code: codeMessage } as BusinessError);
253df226684Sopenharmony_ci      return;
254df226684Sopenharmony_ci    }
255df226684Sopenharmony_ci    let requestIsFromSandBox: boolean = await judgeIsSandBox(want);
256df226684Sopenharmony_ci    GlobalContext.store('requestIsFromSandBox', requestIsFromSandBox);
257df226684Sopenharmony_ci    HiLog.info(TAG, `request is from sandbox: ${requestIsFromSandBox}`);
258df226684Sopenharmony_ci    if (requestIsFromSandBox) {
259df226684Sopenharmony_ci      this.requestIsFromSandBox(session, want);
260df226684Sopenharmony_ci    } else {
261df226684Sopenharmony_ci      this.requestIsNotFromSandBox(session, want);
262df226684Sopenharmony_ci    }
263df226684Sopenharmony_ci  }
264df226684Sopenharmony_ci
265df226684Sopenharmony_ci  requestIsFromSandBox(session: UIExtensionContentSession, want: Want): void {
266df226684Sopenharmony_ci    const linkFileName: string = (want.parameters?.linkFileName as Record<string, string>)?.name;
267df226684Sopenharmony_ci    this.homeFeature.sandBoxLinkFileHome(linkFileName, this.callerToken,
268df226684Sopenharmony_ci      (err: number, data: dlpPermission.DLPProperty, uri: string) => {
269df226684Sopenharmony_ci      if (err !== 0) {
270df226684Sopenharmony_ci        return;
271df226684Sopenharmony_ci      }
272df226684Sopenharmony_ci      let dlpFileName: string = (want.parameters?.fileName as Record<string, string>)?.name;
273df226684Sopenharmony_ci      GlobalContext.store('dlpFileName', dlpFileName);
274df226684Sopenharmony_ci      GlobalContext.store('linkFileName', linkFileName);
275df226684Sopenharmony_ci      GlobalContext.store('dlpProperty', data);
276df226684Sopenharmony_ci      GlobalContext.store('uri', uri ?? '');
277df226684Sopenharmony_ci      AppStorage.setOrCreate('permanent', data.expireTime === 0);
278df226684Sopenharmony_ci      if (data.expireTime !== 0) {
279df226684Sopenharmony_ci        AppStorage.setOrCreate('validity', new Date(data.expireTime as number));
280df226684Sopenharmony_ci      }
281df226684Sopenharmony_ci      this.gotoPage(session);
282df226684Sopenharmony_ci    });
283df226684Sopenharmony_ci  }
284df226684Sopenharmony_ci
285df226684Sopenharmony_ci  async requestIsNotFromSandBox(session: UIExtensionContentSession, want: Want): Promise<void> {
286df226684Sopenharmony_ci    let fileName: string = (want.parameters?.fileName as Record<string, string>)?.name;
287df226684Sopenharmony_ci    let isDlpSuffix: boolean = false;
288df226684Sopenharmony_ci    try {
289df226684Sopenharmony_ci      isDlpSuffix = await FileUtils.isDLPFile(GlobalContext.load('uri'));
290df226684Sopenharmony_ci    } catch {
291df226684Sopenharmony_ci      this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError);
292df226684Sopenharmony_ci      return;
293df226684Sopenharmony_ci    }
294df226684Sopenharmony_ci    HiLog.info(TAG, `isDlpSuffix: ${isDlpSuffix}`);
295df226684Sopenharmony_ci    if (!isDlpSuffix) {
296df226684Sopenharmony_ci      HiLog.info(TAG, `${fileName} is not a dlp file`);
297df226684Sopenharmony_ci      GlobalContext.store('originFileName', fileName);
298df226684Sopenharmony_ci      GlobalContext.store('originFd', getFileFd(GlobalContext.load('uri') as string));
299df226684Sopenharmony_ci      let storage: LocalStorage = new LocalStorage({
300df226684Sopenharmony_ci        'session': session,
301df226684Sopenharmony_ci      } as Record<string, UIExtensionContentSession | string>);
302df226684Sopenharmony_ci      try {
303df226684Sopenharmony_ci        session.loadContent('pages/encryptionProtection', storage);
304df226684Sopenharmony_ci        session.setWindowBackgroundColor(Constants.TRANSPARENT_BACKGROUND_COLOR);
305df226684Sopenharmony_ci      } catch (exception) {
306df226684Sopenharmony_ci        HiLog.error(TAG, `Failed to set the background color. Cause: ${JSON.stringify(exception)}`);
307df226684Sopenharmony_ci      }
308df226684Sopenharmony_ci      return;
309df226684Sopenharmony_ci    } else {
310df226684Sopenharmony_ci      try {
311df226684Sopenharmony_ci        let dlpFd = getFileFd(String(want.uri));
312df226684Sopenharmony_ci        let accountType = await getAccountType(this.context, dlpFd);
313df226684Sopenharmony_ci        if (accountType === dlpPermission.AccountType.DOMAIN_ACCOUNT) {
314df226684Sopenharmony_ci          this.dlpFilesToEncrypt(session, want);
315df226684Sopenharmony_ci        } else {
316df226684Sopenharmony_ci          await GetAlertMessage.phoneHandle(this.context, {
317df226684Sopenharmony_ci            code: Constants.ERR_JS_APP_CANNOT_OPEN } as BusinessError);
318df226684Sopenharmony_ci        }
319df226684Sopenharmony_ci      } catch {
320df226684Sopenharmony_ci        return;
321df226684Sopenharmony_ci      }
322df226684Sopenharmony_ci    }
323df226684Sopenharmony_ci  }
324df226684Sopenharmony_ci
325df226684Sopenharmony_ci  async dlpFilesToEncrypt(session: UIExtensionContentSession, want: Want): Promise<void> {
326df226684Sopenharmony_ci    let uri: string = GlobalContext.load('uri') as string;
327df226684Sopenharmony_ci    try {
328df226684Sopenharmony_ci      await this.findFileOpenHistoryHome(uri, session);
329df226684Sopenharmony_ci    } catch {
330df226684Sopenharmony_ci      return;
331df226684Sopenharmony_ci    }
332df226684Sopenharmony_ci    let dlpFileName: string = (want.parameters?.fileName as Record<string, string>)?.name;
333df226684Sopenharmony_ci    GlobalContext.store('dlpFileName', dlpFileName);
334df226684Sopenharmony_ci    let callerAppId: string;
335df226684Sopenharmony_ci    try {
336df226684Sopenharmony_ci      let callerBundleName = Constants.DLP_MANAGER_BUNDLE_NAME;
337df226684Sopenharmony_ci      callerAppId = await getAppId(callerBundleName);
338df226684Sopenharmony_ci      HiLog.info(TAG, `get AppId: ${callerAppId}`);
339df226684Sopenharmony_ci    } catch {
340df226684Sopenharmony_ci      HiLog.info(TAG, `get AppId failed`);
341df226684Sopenharmony_ci      return;
342df226684Sopenharmony_ci    }
343df226684Sopenharmony_ci    this.homeFeature.openDlpFileHome(uri, callerAppId,
344df226684Sopenharmony_ci      async (err: number, data: dlpPermission.DLPProperty, msg: string) => {
345df226684Sopenharmony_ci      if (err !== 0) {
346df226684Sopenharmony_ci        let ansErr: BusinessError<void> = {
347df226684Sopenharmony_ci          code: err,
348df226684Sopenharmony_ci          name: '',
349df226684Sopenharmony_ci          message: msg,
350df226684Sopenharmony_ci        }
351df226684Sopenharmony_ci        let accountFlag: boolean = true;
352df226684Sopenharmony_ci        if (err === Constants.ERR_JS_USER_NO_PERMISSION) {
353df226684Sopenharmony_ci          let accountName: string = msg.split(', contact:')?.[1];
354df226684Sopenharmony_ci          accountFlag = await GetAlertMessage.checkAccountInfo(accountName);
355df226684Sopenharmony_ci        }
356df226684Sopenharmony_ci        if (!accountFlag) {
357df226684Sopenharmony_ci          this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError);
358df226684Sopenharmony_ci          return;
359df226684Sopenharmony_ci        }
360df226684Sopenharmony_ci        this.gotoAlertPage(session, ansErr as BusinessError);
361df226684Sopenharmony_ci        return;
362df226684Sopenharmony_ci      } else {
363df226684Sopenharmony_ci        this.getOwnerAccountTypeInfo(data, session);
364df226684Sopenharmony_ci      }
365df226684Sopenharmony_ci    })
366df226684Sopenharmony_ci  }
367df226684Sopenharmony_ci
368df226684Sopenharmony_ci  async getOwnerAccountTypeInfo(data: dlpPermission.DLPProperty, session: UIExtensionContentSession) {
369df226684Sopenharmony_ci    GlobalContext.store('dlpProperty', data);
370df226684Sopenharmony_ci    AppStorage.setOrCreate('permanent', data.expireTime === 0);
371df226684Sopenharmony_ci    if (data.expireTime !== 0) {
372df226684Sopenharmony_ci      AppStorage.setOrCreate('validity', new Date(data.expireTime as number));
373df226684Sopenharmony_ci    }
374df226684Sopenharmony_ci    if (data.ownerAccountType === dlpPermission.AccountType.DOMAIN_ACCOUNT) {
375df226684Sopenharmony_ci      this.gotoPage(session);
376df226684Sopenharmony_ci    } else {
377df226684Sopenharmony_ci      this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError);
378df226684Sopenharmony_ci    }
379df226684Sopenharmony_ci  }
380df226684Sopenharmony_ci
381df226684Sopenharmony_ci  findFileOpenHistoryHome(uri: string, session: UIExtensionContentSession): Promise<void> {
382df226684Sopenharmony_ci    return new Promise<void>((resolve, reject) => {
383df226684Sopenharmony_ci      this.homeFeature.fileOpenHistoryHome(uri, async (err: number) => {
384df226684Sopenharmony_ci        if (err === 0) {
385df226684Sopenharmony_ci          this.gotoAlertPage(session, { code: Constants.ERR_JS_APP_OPEN_REJECTED } as BusinessError);
386df226684Sopenharmony_ci          reject();
387df226684Sopenharmony_ci        }
388df226684Sopenharmony_ci        resolve();
389df226684Sopenharmony_ci      })
390df226684Sopenharmony_ci    })
391df226684Sopenharmony_ci  }
392df226684Sopenharmony_ci
393df226684Sopenharmony_ci  gotoAlertPage(session: UIExtensionContentSession, error: BusinessError) {
394df226684Sopenharmony_ci    let storage: LocalStorage = new LocalStorage({
395df226684Sopenharmony_ci      'session': session,
396df226684Sopenharmony_ci      'error': error
397df226684Sopenharmony_ci    } as Record<string, UIExtensionContentSession | string | object>);
398df226684Sopenharmony_ci    try {
399df226684Sopenharmony_ci      session.loadContent('pages/alert', storage);
400df226684Sopenharmony_ci      session.setWindowBackgroundColor(Constants.TRANSPARENT_BACKGROUND_COLOR);
401df226684Sopenharmony_ci    } catch (exception) {
402df226684Sopenharmony_ci      HiLog.error(TAG, `Failed to set the background color. Cause: ${JSON.stringify(exception)}`);
403df226684Sopenharmony_ci    }
404df226684Sopenharmony_ci  }
405df226684Sopenharmony_ci
406df226684Sopenharmony_ci  onWindowStageDestroy(): void {
407df226684Sopenharmony_ci    HiLog.info(TAG, `onWindowStageDestroy`);
408df226684Sopenharmony_ci  }
409df226684Sopenharmony_ci
410df226684Sopenharmony_ci  onForeground(): void {
411df226684Sopenharmony_ci    HiLog.info(TAG, `onForeground`);
412df226684Sopenharmony_ci  }
413df226684Sopenharmony_ci
414df226684Sopenharmony_ci  onBackground() {
415df226684Sopenharmony_ci    HiLog.info(TAG, `onBackground`);
416df226684Sopenharmony_ci  }
417df226684Sopenharmony_ci};
418