1/**
2 * Copyright (c) 2022-2024 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 CmAppCredAuthPresenter from '../presenter/CmAppCredAuthPresenter';
17import router from '@ohos.router';
18import { WidthPercent, ConfigValue } from '../common/util/ConfigData';
19import { CredentialAbstractVo } from '../model/CertManagerVo/CredentialAbstractVo';
20import { RouterAppUidVo } from '../model/CertManagerVo/RouterInfoVo';
21import { CustomContentDialog } from '@ohos.arkui.advanced.Dialog';
22
23@Entry
24@Component
25struct RadioAuth {
26  @State mAppCredAuthPresenter: CmAppCredAuthPresenter = CmAppCredAuthPresenter.getInstance();
27  selectUri: string = '';
28  private authScroller: Scroller = new Scroller();
29
30  dialogController: CustomDialogController = new CustomDialogController({
31    cancel: () => {
32      this.mAppCredAuthPresenter.cancelProcess();
33    },
34    builder: CustomContentDialog({
35      contentBuilder: () => {
36        this.dialogControllerContent();
37      },
38      contentAreaPadding: {right: $r('app.float.wh_value_0')},
39      buttons: [
40        {
41          value: $r('app.string.requestAuthCancel'),
42          buttonStyle: ButtonStyleMode.TEXTUAL,
43          action: () => {
44            this.mAppCredAuthPresenter.cancelProcess();
45            this.dialogController?.close();
46          }
47        },
48        {
49          value: $r('app.string.requestAuthFinish'),
50          buttonStyle: ButtonStyleMode.TEXTUAL,
51          action: () => {
52            console.debug('requestAuthorize uri: ' + this.selectUri);
53            let appUidInfo: RouterAppUidVo = router.getParams() as RouterAppUidVo;
54            if (appUidInfo !== undefined && appUidInfo.appUid != undefined) {
55              console.debug('requestAuthorize appUid: ' + appUidInfo.appUid);
56              this.mAppCredAuthPresenter.requestAuthorize(this.selectUri, appUidInfo.appUid);
57              this.dialogController?.close();
58            } else {
59              console.info('requestAuthorize fail');
60            }
61          }
62        }
63      ]
64    }),
65  })
66
67  @Builder
68  dialogControllerContent(): void {
69    Column() {
70      Text($r('app.string.pickCredToAuth'))
71        .fontSize($r('sys.float.ohos_id_text_size_dialog_tittle'))
72        .height($r('app.float.wh_value_56'))
73        .fontColor($r('sys.color.ohos_id_color_text_primary'))
74        .fontWeight(FontWeight.Medium)
75        .margin({
76          left: $r('app.float.wh_value_24'),
77          right: $r('app.float.wh_value_24')
78        })
79        .alignSelf(ItemAlign.Start)
80
81      Text($r('app.string.requestAuthMsg', this.mAppCredAuthPresenter.appName))
82        .fontSize($r('sys.float.ohos_id_text_size_body1'))
83        .fontColor($r('sys.color.ohos_id_color_text_primary'))
84        .fontWeight(FontWeight.Regular)
85        .margin({
86          left: $r('app.float.wh_value_24'),
87          right: $r('app.float.wh_value_24')
88        })
89        .alignSelf(ItemAlign.Start)
90
91      if (this.mAppCredAuthPresenter.credList.length > ConfigValue.REQUEST_AUTH_MAX_LENGTH) {
92        Stack({ alignContent: Alignment.End }) {
93          Scroll(this.authScroller) {
94            List() {
95              ForEach(this.mAppCredAuthPresenter.credList, (item: CredentialAbstractVo, index: number) => {
96                ListItem() {
97                  Column() {
98                    Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
99                      Column() {
100                        Text(item.alias)
101                          .fontSize($r('app.float.font_18'))
102                          .fontColor($r('sys.color.ohos_id_color_text_primary'))
103                          .fontWeight(FontWeight.Medium)
104                          .textAlign(TextAlign.Start);
105                      }
106                      .alignItems(HorizontalAlign.Start)
107
108                      Column() {
109                        Radio({ value: item.alias, group: 'appCredGroup' })
110                          .checked(false)
111                          .onChange((value: boolean) => {
112                            console.info(item.alias + ' status is ' + value);
113                            if (value) {
114                              this.selectUri = item.keyUri;
115                            }
116                          })
117                      }
118                      .alignItems(HorizontalAlign.End)
119                    }
120                    .width(WidthPercent.WH_100_100)
121
122                    Divider()
123                      .color($r('sys.color.ohos_id_color_list_separator'))
124                      .margin({
125                        top: $r('app.float.distance_12')
126                      })
127                      .visibility(index === (this.mAppCredAuthPresenter.credList.length - 1)
128                        ? Visibility.None : Visibility.Visible)
129                  }
130                }
131                .height($r('app.float.wh_value_64'))
132              }, (item: CredentialAbstractVo) => JSON.stringify(item))
133            }
134            .scrollBar(BarState.Off)
135            .backgroundColor($r('sys.color.ohos_id_color_dialog_bg'))
136            .visibility(this.mAppCredAuthPresenter.credList.length > 0 ? Visibility.Visible : Visibility.None)
137          }
138          .scrollBar(BarState.Off)
139          .margin({
140            left: $r('app.float.wh_value_24'),
141            right: $r('app.float.wh_value_24')
142          })
143
144          ScrollBar({ scroller: this.authScroller, direction: ScrollBarDirection.Vertical,
145            state: BarState.Auto }) {
146            Text()
147              .width($r('app.float.wh_value_3'))
148              .height($r('app.float.wh_value_50'))
149              .borderRadius($r('app.float.wh_value_10'))
150              .backgroundColor($r('sys.color.ohos_id_color_foreground'))
151              .opacity($r('app.float.text_opacity_0_4'))
152          }
153          .width($r('app.float.wh_value_3'))
154          .margin({
155            right: $r('app.float.wh_value_3')
156          })
157        }
158        .height(WidthPercent.WH_50_100)
159      } else {
160        List() {
161          ForEach(this.mAppCredAuthPresenter.credList, (item: CredentialAbstractVo, index: number) => {
162            ListItem() {
163              Column() {
164                Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
165                  Column() {
166                    Text(item.alias)
167                      .fontSize($r('app.float.font_18'))
168                      .fontColor($r('sys.color.ohos_id_color_text_primary'))
169                      .fontWeight(FontWeight.Medium)
170                      .textAlign(TextAlign.Start);
171                  }
172                  .alignItems(HorizontalAlign.Start)
173
174                  Column() {
175                    Radio({ value: item.alias, group: 'appCredGroup' })
176                      .checked(false)
177                      .onChange((value: boolean) => {
178                        console.info(item.alias + ' status is ' + value);
179                        if (value) {
180                          this.selectUri = item.keyUri;
181                        }
182                      })
183                  }
184                  .alignItems(HorizontalAlign.End)
185                }
186                .width(WidthPercent.WH_100_100)
187
188                Divider()
189                  .color($r('sys.color.ohos_id_color_list_separator'))
190                  .margin({
191                    top: $r('app.float.distance_12')
192                  })
193                  .visibility(index === (this.mAppCredAuthPresenter.credList.length - 1)
194                    ? Visibility.None : Visibility.Visible)
195              }
196            }
197            .height($r('app.float.wh_value_64'))
198          }, (item: CredentialAbstractVo) => JSON.stringify(item))
199          ListItem() {
200            Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
201              Column() {
202                Text()
203              }
204              .alignItems(HorizontalAlign.Start)
205
206              Column() {
207                Radio({ value: 'null', group: 'appCredGroup' })
208                  .checked(false)
209                  .onChange((value: boolean) => {
210                    if (value) {
211                      this.selectUri = 'null';
212                    }
213                  })
214              }
215            }
216            .visibility(Visibility.None)
217          }
218        }
219        .margin({
220          left: $r('app.float.wh_value_24'),
221          right: $r('app.float.wh_value_24')
222        })
223        .scrollBar(BarState.Off)
224        .backgroundColor($r('sys.color.ohos_id_color_dialog_bg'))
225        .visibility(this.mAppCredAuthPresenter.credList.length > 0 ? Visibility.Visible : Visibility.None)
226      }
227    }
228    .width(WidthPercent.WH_100_100)
229    .borderRadius($r('app.float.user_list_divider_borderRadius_value'))
230    .backgroundColor($r('sys.color.ohos_id_color_dialog_bg'))
231  }
232
233  aboutToAppear() {
234    console.debug('enter requestAuth page');
235    let appUidInfo: RouterAppUidVo = router.getParams() as RouterAppUidVo;
236    if (appUidInfo !== undefined && appUidInfo.appUid != undefined) {
237      this.mAppCredAuthPresenter.updateAppNameFromUid(appUidInfo.appUid as string);
238      this.mAppCredAuthPresenter.updateAppCredList();
239      this.dialogController.open();
240    } else {
241      console.error('requestAuth appear failed');
242      router.pushUrl({ url: 'pages/certManagerFa' });
243    }
244  }
245
246  build() {
247
248  }
249}
250