1c5c2eed7Sopenharmony_ci/*
2c5c2eed7Sopenharmony_ci * Copyright (c) 2024 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 abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
17c5c2eed7Sopenharmony_ciimport { BusinessError } from '@ohos.base';
18c5c2eed7Sopenharmony_ciimport audio from '@ohos.multimedia.audio';
19c5c2eed7Sopenharmony_ciimport camera from '@ohos.multimedia.camera';
20c5c2eed7Sopenharmony_ciimport { CustomContentDialog } from '@ohos.arkui.advanced.Dialog';
21c5c2eed7Sopenharmony_ciimport { Log, PermissionDialogException, PermissionDialogReturn } from '../common/utils/utils';
22c5c2eed7Sopenharmony_ciimport { GroupInfo, WantInfo } from '../common/model/typedef';
23c5c2eed7Sopenharmony_ciimport { GlobalContext } from '../common/utils/globalContext';
24c5c2eed7Sopenharmony_ciimport Constants from '../common/utils/constant';
25c5c2eed7Sopenharmony_ciimport { globalGroup, groups } from '../common/model/permissionGroup';
26c5c2eed7Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
27c5c2eed7Sopenharmony_ciimport { getCallerBundleInfo } from './PermissionStateSheetDialog';
28c5c2eed7Sopenharmony_ciimport UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
29c5c2eed7Sopenharmony_ciimport common from '@ohos.app.ability.common';
30c5c2eed7Sopenharmony_ci
31c5c2eed7Sopenharmony_ci
32c5c2eed7Sopenharmony_cilet globalIsOn: boolean;
33c5c2eed7Sopenharmony_cilet session: UIExtensionContentSession;
34c5c2eed7Sopenharmony_cilet storage = LocalStorage.getShared();
35c5c2eed7Sopenharmony_cilet bundleName = '';
36c5c2eed7Sopenharmony_ci
37c5c2eed7Sopenharmony_ci@Entry(storage)
38c5c2eed7Sopenharmony_ci@Component
39c5c2eed7Sopenharmony_cistruct GlobalSwitchSheetDialog {
40c5c2eed7Sopenharmony_ci  @LocalStorageLink('want') want: Want | null = storage.get<Want>('want') || null;
41c5c2eed7Sopenharmony_ci  @LocalStorageLink('session') session: UIExtensionContentSession =
42c5c2eed7Sopenharmony_ci    storage.get<UIExtensionContentSession>('session') as UIExtensionContentSession;
43c5c2eed7Sopenharmony_ci  private context = getContext(this) as common.ServiceExtensionContext;
44c5c2eed7Sopenharmony_ci  private muteSuppoted = false;
45c5c2eed7Sopenharmony_ci  private groupName: string = '';
46c5c2eed7Sopenharmony_ci  dialogController: CustomDialogController | null = new CustomDialogController({
47c5c2eed7Sopenharmony_ci    builder: CustomContentDialog({
48c5c2eed7Sopenharmony_ci      contentBuilder: () => {
49c5c2eed7Sopenharmony_ci        this.buildDialog();
50c5c2eed7Sopenharmony_ci      },
51c5c2eed7Sopenharmony_ci      contentAreaPadding: {left: 0, right: 0}
52c5c2eed7Sopenharmony_ci    }),
53c5c2eed7Sopenharmony_ci    offset: { dx: 0, dy: `-${GlobalContext.load('avoidAreaHeight') as string}` }, // unit included in globalContext
54c5c2eed7Sopenharmony_ci    alignment: DialogAlignment.Bottom,
55c5c2eed7Sopenharmony_ci    customStyle: false,
56c5c2eed7Sopenharmony_ci    isModal: true,
57c5c2eed7Sopenharmony_ci    width: '100%',
58c5c2eed7Sopenharmony_ci    autoCancel: false,
59c5c2eed7Sopenharmony_ci    cornerRadius: {
60c5c2eed7Sopenharmony_ci      topLeft: 32,
61c5c2eed7Sopenharmony_ci      topRight: 32,
62c5c2eed7Sopenharmony_ci      bottomLeft: 0,
63c5c2eed7Sopenharmony_ci      bottomRight: 0
64c5c2eed7Sopenharmony_ci    },
65c5c2eed7Sopenharmony_ci    cancel: () => {
66c5c2eed7Sopenharmony_ci      PermissionDialogReturn([Constants.ERR_GLOBAL_SWITCH_EXCEPTION], session);
67c5c2eed7Sopenharmony_ci      this.context.terminateSelf();
68c5c2eed7Sopenharmony_ci      this.dialogController?.close();
69c5c2eed7Sopenharmony_ci    }
70c5c2eed7Sopenharmony_ci  });
71c5c2eed7Sopenharmony_ci
72c5c2eed7Sopenharmony_ci  @Builder
73c5c2eed7Sopenharmony_ci  buildDialog() {
74c5c2eed7Sopenharmony_ci    applicationItem({
75c5c2eed7Sopenharmony_ci      isMuteSupported: this.muteSuppoted,
76c5c2eed7Sopenharmony_ci      currentGroup: this.groupName
77c5c2eed7Sopenharmony_ci    })
78c5c2eed7Sopenharmony_ci  }
79c5c2eed7Sopenharmony_ci
80c5c2eed7Sopenharmony_ci  async aboutToAppear() {
81c5c2eed7Sopenharmony_ci    session = this.session;
82c5c2eed7Sopenharmony_ci    Log.info('GlobalSwitchSheetDialog aboutToAppear');
83c5c2eed7Sopenharmony_ci    Log.info('GlobalSwitchSheetDialog getWant' + JSON.stringify(this.want));
84c5c2eed7Sopenharmony_ci    let callerBundle = getCallerBundleInfo(this.want as Object as WantInfo);
85c5c2eed7Sopenharmony_ci    Log.info('GlobalSwitchSheetDialog bundleName ' + callerBundle.bundleName);
86c5c2eed7Sopenharmony_ci    let globalSwitch = callerBundle.globSwitch;
87c5c2eed7Sopenharmony_ci    bundleName = callerBundle.bundleName;
88c5c2eed7Sopenharmony_ci
89c5c2eed7Sopenharmony_ci    if (globalSwitch === Constants.GLOBAL_SWITCH_CAMERA) {
90c5c2eed7Sopenharmony_ci      this.groupName = 'CAMERA';
91c5c2eed7Sopenharmony_ci    } else if (globalSwitch === Constants.GLOBAL_SWITCH_MICROPHONE) {
92c5c2eed7Sopenharmony_ci      this.groupName = 'MICROPHONE';
93c5c2eed7Sopenharmony_ci    } else {
94c5c2eed7Sopenharmony_ci      Log.error('global switch not suppoted');
95c5c2eed7Sopenharmony_ci      PermissionDialogException(Constants.ERR_GLOBAL_SWITCH_NOT_SUPPORTED, session);
96c5c2eed7Sopenharmony_ci      this.context.terminateSelf();
97c5c2eed7Sopenharmony_ci      return;
98c5c2eed7Sopenharmony_ci    }
99c5c2eed7Sopenharmony_ci
100c5c2eed7Sopenharmony_ci    if (this.groupName == 'MICROPHONE') {
101c5c2eed7Sopenharmony_ci      let audioManager = audio.getAudioManager();
102c5c2eed7Sopenharmony_ci      let audioVolumeManager = audioManager.getVolumeManager();
103c5c2eed7Sopenharmony_ci      let groupid = audio.DEFAULT_VOLUME_GROUP_ID;
104c5c2eed7Sopenharmony_ci      let audioVolumeGroupManager = await audioVolumeManager.getVolumeGroupManager(groupid);
105c5c2eed7Sopenharmony_ci      this.muteSuppoted = true;
106c5c2eed7Sopenharmony_ci      globalIsOn = !audioVolumeGroupManager.isPersistentMicMute();
107c5c2eed7Sopenharmony_ci    } else {
108c5c2eed7Sopenharmony_ci      let cameraManager = camera.getCameraManager(GlobalContext.load('context'));
109c5c2eed7Sopenharmony_ci      this.muteSuppoted = cameraManager.isCameraMuteSupported();
110c5c2eed7Sopenharmony_ci      globalIsOn = !cameraManager.isCameraMuted();
111c5c2eed7Sopenharmony_ci    }
112c5c2eed7Sopenharmony_ci
113c5c2eed7Sopenharmony_ci    if (this.muteSuppoted == false) {
114c5c2eed7Sopenharmony_ci      Log.error('global switch muted');
115c5c2eed7Sopenharmony_ci      PermissionDialogException(Constants.ERR_GLOBAL_SWITCH_NOT_SUPPORTED, session);
116c5c2eed7Sopenharmony_ci      this.context.terminateSelf();
117c5c2eed7Sopenharmony_ci      return;
118c5c2eed7Sopenharmony_ci    }
119c5c2eed7Sopenharmony_ci
120c5c2eed7Sopenharmony_ci    if (globalIsOn) {
121c5c2eed7Sopenharmony_ci      Log.error('global switch is on');
122c5c2eed7Sopenharmony_ci      PermissionDialogException(Constants.ERR_GLOBAL_SWITCH_IS_ON, session);
123c5c2eed7Sopenharmony_ci      this.context.terminateSelf();
124c5c2eed7Sopenharmony_ci      return;
125c5c2eed7Sopenharmony_ci    }
126c5c2eed7Sopenharmony_ci
127c5c2eed7Sopenharmony_ci    Log.info('isMuted ' + globalIsOn);
128c5c2eed7Sopenharmony_ci    this.dialogController?.open();
129c5c2eed7Sopenharmony_ci  }
130c5c2eed7Sopenharmony_ci
131c5c2eed7Sopenharmony_ci  onPageShow(): void {
132c5c2eed7Sopenharmony_ci    Log.info('GlobalSwitchSheetDialog onPageShow' );
133c5c2eed7Sopenharmony_ci  }
134c5c2eed7Sopenharmony_ci
135c5c2eed7Sopenharmony_ci  build() {
136c5c2eed7Sopenharmony_ci  }
137c5c2eed7Sopenharmony_ci}
138c5c2eed7Sopenharmony_ci
139c5c2eed7Sopenharmony_ci@CustomDialog
140c5c2eed7Sopenharmony_cistruct applicationItem {
141c5c2eed7Sopenharmony_ci  private context = getContext(this) as common.ServiceExtensionContext;
142c5c2eed7Sopenharmony_ci  @State globalIsOn: boolean = false;
143c5c2eed7Sopenharmony_ci  @State backTitle: string = '';
144c5c2eed7Sopenharmony_ci  @State groupInfo: GroupInfo = new GroupInfo('', '', '', '', [], '', [], false);
145c5c2eed7Sopenharmony_ci  @State currentGroup: string = '';
146c5c2eed7Sopenharmony_ci  @State isMuteSupported: boolean = false;
147c5c2eed7Sopenharmony_ci  @State appName: ResourceStr = '';
148c5c2eed7Sopenharmony_ci  private controller: CustomDialogController;
149c5c2eed7Sopenharmony_ci
150c5c2eed7Sopenharmony_ci  dialogController: CustomDialogController | null = new CustomDialogController({
151c5c2eed7Sopenharmony_ci    builder: CustomContentDialog({
152c5c2eed7Sopenharmony_ci      contentBuilder: () => {
153c5c2eed7Sopenharmony_ci        this.buildContent();
154c5c2eed7Sopenharmony_ci      },
155c5c2eed7Sopenharmony_ci      contentAreaPadding: { left: Constants.PADDING_24, right: Constants.PADDING_24 },
156c5c2eed7Sopenharmony_ci      buttons: [
157c5c2eed7Sopenharmony_ci        {
158c5c2eed7Sopenharmony_ci          value: $r('app.string.cancel'),
159c5c2eed7Sopenharmony_ci          buttonStyle: ButtonStyleMode.TEXTUAL,
160c5c2eed7Sopenharmony_ci          action: () => {
161c5c2eed7Sopenharmony_ci            Log.info('global cancel');
162c5c2eed7Sopenharmony_ci            if (this.dialogController !== null) {
163c5c2eed7Sopenharmony_ci              this.dialogController.close();
164c5c2eed7Sopenharmony_ci            }
165c5c2eed7Sopenharmony_ci          }
166c5c2eed7Sopenharmony_ci        },
167c5c2eed7Sopenharmony_ci        {
168c5c2eed7Sopenharmony_ci          value: $r('app.string.close'),
169c5c2eed7Sopenharmony_ci          buttonStyle: ButtonStyleMode.TEXTUAL,
170c5c2eed7Sopenharmony_ci          action: () => {
171c5c2eed7Sopenharmony_ci            Log.info('global accept');
172c5c2eed7Sopenharmony_ci            if (this.currentGroup == 'MICROPHONE') {
173c5c2eed7Sopenharmony_ci              let audioManager = audio.getAudioManager();
174c5c2eed7Sopenharmony_ci              let audioVolumeManager = audioManager.getVolumeManager();
175c5c2eed7Sopenharmony_ci              audioVolumeManager.getVolumeGroupManager(audio.DEFAULT_VOLUME_GROUP_ID).then(audioVolumeGroupManager => {
176c5c2eed7Sopenharmony_ci                audioVolumeGroupManager.setMicMutePersistent(true, audio.PolicyType.PRIVACY).then(() => {
177c5c2eed7Sopenharmony_ci                  Log.info('microphone muted');
178c5c2eed7Sopenharmony_ci                  if (this.dialogController !== null) {
179c5c2eed7Sopenharmony_ci                    this.dialogController.close();
180c5c2eed7Sopenharmony_ci                  }
181c5c2eed7Sopenharmony_ci                })
182c5c2eed7Sopenharmony_ci              })
183c5c2eed7Sopenharmony_ci            } else {
184c5c2eed7Sopenharmony_ci              let cameraManager = camera.getCameraManager(this.context);
185c5c2eed7Sopenharmony_ci              cameraManager.muteCamera(true);
186c5c2eed7Sopenharmony_ci              if (this.dialogController !== null) {
187c5c2eed7Sopenharmony_ci                this.dialogController.close();
188c5c2eed7Sopenharmony_ci              }
189c5c2eed7Sopenharmony_ci            }
190c5c2eed7Sopenharmony_ci          }
191c5c2eed7Sopenharmony_ci        }
192c5c2eed7Sopenharmony_ci      ],
193c5c2eed7Sopenharmony_ci    }),
194c5c2eed7Sopenharmony_ci    autoCancel: false
195c5c2eed7Sopenharmony_ci  });
196c5c2eed7Sopenharmony_ci
197c5c2eed7Sopenharmony_ci  globalListen() {
198c5c2eed7Sopenharmony_ci    if (this.currentGroup == 'CAMERA') {
199c5c2eed7Sopenharmony_ci      let cameraManager = camera.getCameraManager(GlobalContext.load('context'));
200c5c2eed7Sopenharmony_ci      cameraManager.on('cameraMute', (err, curMuted) => {
201c5c2eed7Sopenharmony_ci        Log.info('curMuted: ' + JSON.stringify(curMuted) + ' err: ' + JSON.stringify(err));
202c5c2eed7Sopenharmony_ci        this.globalIsOn = !curMuted;
203c5c2eed7Sopenharmony_ci      })
204c5c2eed7Sopenharmony_ci    } else {
205c5c2eed7Sopenharmony_ci      let audioManager = audio.getAudioManager();
206c5c2eed7Sopenharmony_ci      let audioVolumeManager = audioManager.getVolumeManager();
207c5c2eed7Sopenharmony_ci      let groupId = audio.DEFAULT_VOLUME_GROUP_ID;
208c5c2eed7Sopenharmony_ci      audioVolumeManager.getVolumeGroupManager(groupId).then(audioVolumeGroupManager => {
209c5c2eed7Sopenharmony_ci        audioVolumeGroupManager.on('micStateChange', micStateChange => {
210c5c2eed7Sopenharmony_ci          Log.info('micStateChange: ' + JSON.stringify(micStateChange));
211c5c2eed7Sopenharmony_ci          this.globalIsOn = !micStateChange.mute;
212c5c2eed7Sopenharmony_ci        })
213c5c2eed7Sopenharmony_ci      })
214c5c2eed7Sopenharmony_ci    }
215c5c2eed7Sopenharmony_ci  }
216c5c2eed7Sopenharmony_ci
217c5c2eed7Sopenharmony_ci  @Builder
218c5c2eed7Sopenharmony_ci  buildContent(): void {
219c5c2eed7Sopenharmony_ci    Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
220c5c2eed7Sopenharmony_ci      Column() {
221c5c2eed7Sopenharmony_ci        Text(this.currentGroup == 'CAMERA' ? $r('app.string.close_camera') : $r('app.string.close_microphone'))
222c5c2eed7Sopenharmony_ci          .fontSize(Constants.TEXT_BIG_FONT_SIZE)
223c5c2eed7Sopenharmony_ci          .fontColor($r('sys.color.font_primary'))
224c5c2eed7Sopenharmony_ci          .fontWeight(FontWeight.Medium)
225c5c2eed7Sopenharmony_ci          .lineHeight(Constants.TEXT_BIG_LINE_HEIGHT)
226c5c2eed7Sopenharmony_ci          .width(Constants.FULL_WIDTH)
227c5c2eed7Sopenharmony_ci          .padding({ top: Constants.PADDING_14, bottom: Constants.PADDING_14 })
228c5c2eed7Sopenharmony_ci        Text(
229c5c2eed7Sopenharmony_ci          this.currentGroup == 'CAMERA' ?
230c5c2eed7Sopenharmony_ci          $r('app.string.close_camera_desc') :
231c5c2eed7Sopenharmony_ci          $r('app.string.close_microphone_desc')
232c5c2eed7Sopenharmony_ci        )
233c5c2eed7Sopenharmony_ci          .fontSize(Constants.TEXT_MIDDLE_FONT_SIZE)
234c5c2eed7Sopenharmony_ci          .fontColor($r('sys.color.font_primary'))
235c5c2eed7Sopenharmony_ci          .lineHeight(Constants.TEXT_LINE_HEIGHT)
236c5c2eed7Sopenharmony_ci      }
237c5c2eed7Sopenharmony_ci      .clip(true)
238c5c2eed7Sopenharmony_ci    }
239c5c2eed7Sopenharmony_ci  }
240c5c2eed7Sopenharmony_ci
241c5c2eed7Sopenharmony_ci  /**
242c5c2eed7Sopenharmony_ci   * Grant permissions to the app
243c5c2eed7Sopenharmony_ci   * @param {Number} accessTokenId
244c5c2eed7Sopenharmony_ci   * @param {String} permission permission name
245c5c2eed7Sopenharmony_ci   * @param {Number} index Array index to modify permission status
246c5c2eed7Sopenharmony_ci   */
247c5c2eed7Sopenharmony_ci  grantUserGrantedPermission(accessTokenId: number, permission: Permissions, resolve: (value: number) => void) {
248c5c2eed7Sopenharmony_ci    abilityAccessCtrl.createAtManager().grantUserGrantedPermission(accessTokenId, permission, Constants.PERMISSION_FLAG)
249c5c2eed7Sopenharmony_ci      .then(() => {
250c5c2eed7Sopenharmony_ci        resolve(0);
251c5c2eed7Sopenharmony_ci      }).catch((error: BusinessError) => {
252c5c2eed7Sopenharmony_ci      resolve(-1);
253c5c2eed7Sopenharmony_ci      Log.error('grantUserGrantedPermission failed. Cause: ' + JSON.stringify(error));
254c5c2eed7Sopenharmony_ci    })
255c5c2eed7Sopenharmony_ci  }
256c5c2eed7Sopenharmony_ci
257c5c2eed7Sopenharmony_ci  /**
258c5c2eed7Sopenharmony_ci   * Deauthorize the app
259c5c2eed7Sopenharmony_ci   * @param {Number} accessTokenId
260c5c2eed7Sopenharmony_ci   * @param {String} permission permission name
261c5c2eed7Sopenharmony_ci   * @param {Number} index Array index to modify permission status
262c5c2eed7Sopenharmony_ci   */
263c5c2eed7Sopenharmony_ci  revokeUserGrantedPermission(accessTokenId: number, permission: Permissions, resolve: (value: number) => void) {
264c5c2eed7Sopenharmony_ci    abilityAccessCtrl.createAtManager().revokeUserGrantedPermission(
265c5c2eed7Sopenharmony_ci      accessTokenId, permission, Constants.PERMISSION_FLAG
266c5c2eed7Sopenharmony_ci    ).then(() => {
267c5c2eed7Sopenharmony_ci      resolve(0);
268c5c2eed7Sopenharmony_ci    }).catch((error: BusinessError) => {
269c5c2eed7Sopenharmony_ci      resolve(-1);
270c5c2eed7Sopenharmony_ci      Log.error('revokeUserGrantedPermission failed. Cause: ' + JSON.stringify(error));
271c5c2eed7Sopenharmony_ci    })
272c5c2eed7Sopenharmony_ci  }
273c5c2eed7Sopenharmony_ci
274c5c2eed7Sopenharmony_ci  /**
275c5c2eed7Sopenharmony_ci   * Lifecycle function, executed when the page is initialized
276c5c2eed7Sopenharmony_ci   */
277c5c2eed7Sopenharmony_ci  async aboutToAppear() {
278c5c2eed7Sopenharmony_ci    try {
279c5c2eed7Sopenharmony_ci      let bundleInfo = await bundleManager.getBundleInfo(
280c5c2eed7Sopenharmony_ci        bundleName,
281c5c2eed7Sopenharmony_ci        bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
282c5c2eed7Sopenharmony_ci      let manager = this.context.createBundleContext(bundleName).resourceManager;
283c5c2eed7Sopenharmony_ci      this.appName = await manager.getStringValue(bundleInfo.appInfo.labelId);
284c5c2eed7Sopenharmony_ci    } catch (e) {
285c5c2eed7Sopenharmony_ci      Log.error('get appName failed ' + JSON.stringify(e));
286c5c2eed7Sopenharmony_ci    }
287c5c2eed7Sopenharmony_ci    groups.forEach(group => {
288c5c2eed7Sopenharmony_ci      if (group.name === this.currentGroup) {
289c5c2eed7Sopenharmony_ci        this.groupInfo = group;
290c5c2eed7Sopenharmony_ci      }
291c5c2eed7Sopenharmony_ci    })
292c5c2eed7Sopenharmony_ci    this.backTitle = this.groupInfo.label;
293c5c2eed7Sopenharmony_ci    this.globalIsOn = globalIsOn;
294c5c2eed7Sopenharmony_ci    if (globalGroup.indexOf(this.currentGroup) !== -1) {
295c5c2eed7Sopenharmony_ci      this.globalListen();
296c5c2eed7Sopenharmony_ci    }
297c5c2eed7Sopenharmony_ci  }
298c5c2eed7Sopenharmony_ci
299c5c2eed7Sopenharmony_ci  aboutToDisappear() {
300c5c2eed7Sopenharmony_ci    this.dialogController = null;
301c5c2eed7Sopenharmony_ci  }
302c5c2eed7Sopenharmony_ci
303c5c2eed7Sopenharmony_ci  build() {
304c5c2eed7Sopenharmony_ci    Column() {
305c5c2eed7Sopenharmony_ci      Row() {
306c5c2eed7Sopenharmony_ci        Flex({ alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) {
307c5c2eed7Sopenharmony_ci          Column() {
308c5c2eed7Sopenharmony_ci            Column() {
309c5c2eed7Sopenharmony_ci              Text($r(this.backTitle, this.appName))
310c5c2eed7Sopenharmony_ci                .align(Alignment.Start)
311c5c2eed7Sopenharmony_ci                .fontColor($r('sys.color.font_primary'))
312c5c2eed7Sopenharmony_ci                .maxLines(Constants.MAXIMUM_HEADER_LINES)
313c5c2eed7Sopenharmony_ci                .textOverflow({ overflow: TextOverflow.Ellipsis })
314c5c2eed7Sopenharmony_ci                .fontSize(Constants.TEXT_BIG_FONT_SIZE)
315c5c2eed7Sopenharmony_ci                .flexGrow(Constants.FLEX_GROW)
316c5c2eed7Sopenharmony_ci                .fontWeight(FontWeight.Bold)
317c5c2eed7Sopenharmony_ci                .padding({left: Constants.PADDING_10, top: Constants.PADDING_20})
318c5c2eed7Sopenharmony_ci            }
319c5c2eed7Sopenharmony_ci            .width(Constants.FULL_WIDTH)
320c5c2eed7Sopenharmony_ci            .alignItems(HorizontalAlign.Start)
321c5c2eed7Sopenharmony_ci            if (globalGroup.indexOf(this.currentGroup) !== -1 && this.isMuteSupported === true) {
322c5c2eed7Sopenharmony_ci              Row() {
323c5c2eed7Sopenharmony_ci                Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
324c5c2eed7Sopenharmony_ci                  Text(this.currentGroup == 'CAMERA' ? $r('app.string.camera') : $r('app.string.microphone'))
325c5c2eed7Sopenharmony_ci                    .fontSize(Constants.TEXT_MIDDLE_FONT_SIZE).fontColor($r('sys.color.font_primary'))
326c5c2eed7Sopenharmony_ci                    .fontWeight(FontWeight.Medium)
327c5c2eed7Sopenharmony_ci                  Row() {
328c5c2eed7Sopenharmony_ci                    Toggle({ type: ToggleType.Switch, isOn: this.globalIsOn })
329c5c2eed7Sopenharmony_ci                      .selectedColor($r('sys.color.icon_emphasize'))
330c5c2eed7Sopenharmony_ci                      .switchPointColor($r('sys.color.comp_background_primary_contrary'))
331c5c2eed7Sopenharmony_ci                      .onChange((isOn: boolean) => {
332c5c2eed7Sopenharmony_ci                        if (isOn) {
333c5c2eed7Sopenharmony_ci                          if (this.currentGroup == 'CAMERA') {
334c5c2eed7Sopenharmony_ci                            let cameraManager = camera.getCameraManager(GlobalContext.load('context'));
335c5c2eed7Sopenharmony_ci                            cameraManager.muteCamera(false);
336c5c2eed7Sopenharmony_ci                            PermissionDialogReturn([Constants.PERMISSION_DIALOG_SUCCESS], session);
337c5c2eed7Sopenharmony_ci                            this.context.terminateSelf();
338c5c2eed7Sopenharmony_ci                          } else {
339c5c2eed7Sopenharmony_ci                            let audioManager = audio.getAudioManager();
340c5c2eed7Sopenharmony_ci                            let audioVolumeManager = audioManager.getVolumeManager();
341c5c2eed7Sopenharmony_ci                            let groupId = audio.DEFAULT_VOLUME_GROUP_ID;
342c5c2eed7Sopenharmony_ci                            audioVolumeManager.getVolumeGroupManager(groupId).then(audioVolumeGroupManager => {
343c5c2eed7Sopenharmony_ci                              audioVolumeGroupManager.setMicMutePersistent(false, audio.PolicyType.PRIVACY);
344c5c2eed7Sopenharmony_ci                              PermissionDialogReturn([Constants.PERMISSION_DIALOG_SUCCESS], session);
345c5c2eed7Sopenharmony_ci                              this.context.terminateSelf();
346c5c2eed7Sopenharmony_ci                            })
347c5c2eed7Sopenharmony_ci                          }
348c5c2eed7Sopenharmony_ci                        }
349c5c2eed7Sopenharmony_ci                      })
350c5c2eed7Sopenharmony_ci                    Row().onClick(() => {
351c5c2eed7Sopenharmony_ci                      if (this.dialogController !== null) {
352c5c2eed7Sopenharmony_ci                        this.dialogController.open();
353c5c2eed7Sopenharmony_ci                      }
354c5c2eed7Sopenharmony_ci                    })
355c5c2eed7Sopenharmony_ci                      .width(Constants.DEFAULT_SLIDER_WIDTH).height(Constants.DEFAULT_SLIDER_HEIGHT)
356c5c2eed7Sopenharmony_ci                      .position({ x: this.globalIsOn ? 0 : Constants.OFFSET, y: 0 })
357c5c2eed7Sopenharmony_ci                  }.clip(true)
358c5c2eed7Sopenharmony_ci                }.height(Constants.LISTITEM_ROW_HEIGHT)
359c5c2eed7Sopenharmony_ci                .padding({ left: Constants.DEFAULT_PADDING_START, right: Constants.DEFAULT_PADDING_END })
360c5c2eed7Sopenharmony_ci              }.padding({ top: Constants.LIST_PADDING_TOP, bottom: Constants.LIST_PADDING_BOTTOM })
361c5c2eed7Sopenharmony_ci              .backgroundColor($r('sys.color.comp_background_list_card'))
362c5c2eed7Sopenharmony_ci              .borderRadius($r('sys.float.ohos_id_corner_radius_card'))
363c5c2eed7Sopenharmony_ci              .margin({ top: Constants.MARGIN_16 })
364c5c2eed7Sopenharmony_ci            }
365c5c2eed7Sopenharmony_ci          }.padding({ left: Constants.AUTHORITY_LISTITEM_PADDING_LEFT })
366c5c2eed7Sopenharmony_ci        }.flexGrow(Constants.FLEX_GROW)
367c5c2eed7Sopenharmony_ci      }
368c5c2eed7Sopenharmony_ci    }
369c5c2eed7Sopenharmony_ci  }
370c5c2eed7Sopenharmony_ci}