已开启
OpenHarmony-5.0.0-Release 合入master分支 #20
OpenHarmony-5.0.0-Release 合入master分支 #20
已开启
黑马路创建于 2025年12月22日
共 11 个文件变更+1313-2
@@ -0,0 +1,108 @@
1+/*
2+ * Copyright (C) 2024 HiHope Open Source Organization.
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+import ConfigData from '../../../../../../../common/utils/src/main/ets/default/baseUtil/ConfigData';
16+import type ISettingsController
17+ from '../../../../../../../common/component/src/main/ets/default/controller/ISettingsController';
18+import SwitchController from '../../../../../../../common/component/src/main/ets/default/controller/SwitchController';
19+import LogUtil from '../../../../../../../common/utils/src/main/ets/default/baseUtil/LogUtil';
20+import { LogAll } from '../../../../../../../common/utils/src/main/ets/default/baseUtil/LogDecorator';
21+import oneConnectShare from '@ohos.oneConnect.fileShare';
22+ 
23+const MODULE_TAG = ConfigData.TAG + '.oneConnectShareController -> ';
24+const BUNDLE_NAME = 'com.ohos.settings';
25+ 
26+@LogAll
27+export default class OneConnectShareController extends SwitchController {
28+ 
29+ private shareManager: oneConnectShare.ShareManager;
30+ private realStatus: boolean = false;
31+ 
32+ onOneConnectShareSwitchChangeCallback: (isOn: boolean) => void = (isOn: boolean) => {
33+ LogUtil.info(MODULE_TAG + `on ShareStatusChange, status: ${JSON.stringify(isOn)}`);
34+ this.isOn = isOn;
35+ this.realStatus = this.isOn;
36+ }
37+ 
38+ /**
39+ * Initialize data.
40+ */
41+ initData(): ISettingsController {
42+ super.initData();
43+ LogUtil.info(MODULE_TAG + `oneConnectShare module is ${oneConnectShare}`);
44+ this.shareManager = oneConnectShare?.createShareManager(BUNDLE_NAME);
45+ LogUtil.info(MODULE_TAG + `createShareManager result is ${this.shareManager}`);
46+ let isOn: boolean | undefined = this.shareManager?.getShareStatus();
47+ LogUtil.info(MODULE_TAG + `initData isOn = ${isOn}`);
48+ this.isOn = isOn || false;
49+ this.realStatus = this.isOn;
50+ return this;
51+ }
52+ /**
53+ * Subscribe listeners.
54+ */
55+ subscribe(): ISettingsController {
56+ LogUtil.info(MODULE_TAG + `subscribe in`);
57+ this.shareManager?.on('shareStatusChange', this.onOneConnectShareSwitchChangeCallback);
58+ AppStorage.set('shareOpenTime', this.getShareOpenTime());
59+ return this;
60+ };
61+ 
62+ unsubscribe(): ISettingsController {
63+ LogUtil.info(MODULE_TAG + `unsubscribe in`);
64+ this.shareManager?.off('shareStatusChange');
65+ oneConnectShare?.releaseShareManager(this.shareManager);
66+ this.shareManager = undefined;
67+ return this;
68+ }
69+ 
70+ /**
71+ * After current value changed event
72+ */
73+ afterCurrentValueChanged(): void {
74+ LogUtil.info(MODULE_TAG + 'afterCurrentValueChanged, ui isOn = ' + this.isOn);
75+ if (this.isOn == this.realStatus) {
76+ LogUtil.info(MODULE_TAG + ` shareStatus is already ${this.realStatus}, no need to change`);
77+ return;
78+ }
79+ if (this.isOn) {
80+ LogUtil.info(MODULE_TAG + `before enableShare`);
81+ try {
82+ this.shareManager?.enableShare();
83+ } catch (err) {
84+ LogUtil.error(MODULE_TAG + `enableShare err: ${err}, ${JSON.stringify(err)}`);
85+ }
86+ } else {
87+ LogUtil.info(MODULE_TAG + `before disableShare`);
88+ try {
89+ this.shareManager?.disableShare();
90+ } catch (err) {
91+ LogUtil.error(MODULE_TAG + `disableShare err: ${err}, ${JSON.stringify(err)}`);
92+ }
93+ };
94+ }
95+ 
96+ getShareOpenTime(): number {
97+ LogUtil.info(MODULE_TAG + 'getShareOpenTime in');
98+ let time = this.shareManager?.getShareOpenTime();
99+ LogUtil.info(MODULE_TAG + 'getShareOpenTime result is ' + time);
100+ return time;
101+ }
102+ 
103+ setShareOpenTime(time: number): void {
104+ LogUtil.info(MODULE_TAG + 'setShareOpenTime in, time = ' + time);
105+ this.shareManager?.setShareOpenTime(time);
106+ AppStorage.set('shareOpenTime', time);
107+ }
108+}
@@ -0,0 +1,2 @@
1+# 请将工程下的 product/phone/src/main/ets/controller/oneConnectShare/module/@ohos.oneConnect.fileShare.d.ts 文件拷贝至sdk下的ets/api目录下后编译
2+ 
@@ -0,0 +1,273 @@
1+/*
2+ * Copyright (C) 2024 HiHope Open Source Organization.
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+import LogUtil from '../../../../../../common/utils/src/main/ets/default/baseUtil/LogUtil';
16+import ConfigData from '../../../../../../common/utils/src/main/ets/default/baseUtil/ConfigData';
17+import HeadComponent from '../../../../../../common/component/src/main/ets/default/headComponent';
18+import SwitchComponent from '../../../../../../common/component/src/main/ets/default/switchComponent';
19+import OneConnectShareController from '../controller/oneconnectshare/OneConnectShareController';
20+import { display } from '@kit.ArkUI';
21+ 
22+const MODULE_TAG = ConfigData.TAG + '.oneConnectShare -> ';
23+ 
24+const SHARE_OPENING_TIME_10_MIN = 10;
25+const SHARE_OPENING_TIME_UNLIMITED = 0;
26+ 
27+let oneConnectShareController: OneConnectShareController = new OneConnectShareController();
28+let defaultDisplay = display.getDefaultDisplaySync();
29+ 
30+/**
31+ * mobile Network
32+ */
33+@Entry
34+@Component
35+struct OneConnectShare {
36+ @State oneConnectShareIsOn: boolean = false;
37+ @StorageLink('shareOpenTime') @Watch('refreshText') shareOpenTime: number = SHARE_OPENING_TIME_10_MIN;
38+ @State openingTimeText: Resource = $r('app.string.endTextEmpty');
39+ @State isVertical: boolean = defaultDisplay.height > defaultDisplay.width;
40+ 
41+ private openingTimeDialogController: CustomDialogController = new CustomDialogController({
42+ builder: OpeningTimeDialog({
43+ openingTimeText: $openingTimeText,
44+ isVertical: $isVertical
45+ }),
46+ alignment: this.isVertical ? DialogAlignment.Bottom : DialogAlignment.Center,
47+ offset: ({ dx: 0, dy: this.isVertical ? '-54vp' : 0 }),
48+ autoCancel: false,
49+ customStyle: true
50+ });
51+ 
52+ build() {
53+ Column() {
54+ GridContainer({ gutter: ConfigData.GRID_CONTAINER_GUTTER_24, margin: ConfigData.GRID_CONTAINER_MARGIN_24 }) {
55+ Column() {
56+ HeadComponent({ headName: $r("app.string.oneConnectShare"), isActive: true });
57+ Column() {
58+ SwitchComponent({
59+ title: $r("app.string.oneConnectShare"),
60+ summary: "",
61+ isOn: $oneConnectShareIsOn,
62+ controller: oneConnectShareController,
63+ switchHeight: $r("app.float.wh_value_56")
64+ })
65+ }
66+ .borderRadius($r("app.float.radius_16"))
67+ .backgroundColor($r("app.color.white_bg_color"))
68+ .width(ConfigData.WH_100_100)
69+ .margin({ top: $r("app.float.distance_12") })
70+ .padding({
71+ top: $r("app.float.distance_4"),
72+ bottom: $r("app.float.distance_4")
73+ })
74+ 
75+ Column() {
76+ ShareTimeComponent({
77+ openingTimeText: $openingTimeText,
78+ settingTitle: $r("app.string.share_opening_time"),
79+ })
80+ }
81+ .borderRadius($r("app.float.radius_16"))
82+ .backgroundColor($r("app.color.white_bg_color"))
83+ .width(ConfigData.WH_100_100)
84+ .margin({ top: $r("app.float.distance_10") })
85+ .padding({
86+ top: $r("app.float.distance_4"),
87+ bottom: $r("app.float.distance_4")
88+ })
89+ .onClick(() => {
90+ this.openingTimeDialogController?.open();
91+ })
92+ }
93+ .useSizeType({
94+ sm: { span: 4, offset: 0 },
95+ md: { span: 6, offset: 1 },
96+ lg: { span: 8, offset: 2 }
97+ })
98+ }
99+ .width(ConfigData.WH_100_100)
100+ .height(ConfigData.WH_100_100)
101+ }
102+ .backgroundColor($r("sys.color.ohos_id_color_sub_background"))
103+ .width(ConfigData.WH_100_100)
104+ .height(ConfigData.WH_100_100)
105+ }
106+ 
107+ aboutToAppear() {
108+ LogUtil.info(MODULE_TAG + 'aboutToAppear');
109+ this.refreshText();
110+ }
111+ 
112+ aboutToDisappear() {
113+ LogUtil.info(MODULE_TAG + 'aboutToDisappear');
114+ }
115+ 
116+ refreshText() {
117+ LogUtil.info(MODULE_TAG + 'refreshText in');
118+ this.openingTimeText =
119+ this.shareOpenTime == SHARE_OPENING_TIME_UNLIMITED ? $r("app.string.share_opening_time_unlimited") :
120+ $r("app.string.share_opening_time_minutes", this.shareOpenTime);
121+ }
122+}
123+ 
124+@Component
125+export struct ShareTimeComponent {
126+ @Link openingTimeText: Resource;
127+ @State isTouched: boolean = false;
128+ private settingTitle: string | Resource = '';
129+ 
130+ build() {
131+ Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
132+ Row() {
133+ Text(this.settingTitle)
134+ .fontSize($r("app.float.font_16"))
135+ .lineHeight($r("app.float.lineHeight_22"))
136+ .fontFamily('HarmonyHeiTi')
137+ .fontColor($r("sys.color.ohos_id_color_text_primary"))
138+ .align(Alignment.Start)
139+ .margin({
140+ left: $r("app.float.distance_12"),
141+ top: $r("app.float.distance_17"),
142+ bottom: $r("app.float.distance_17")
143+ })
144+ }
145+ .align(Alignment.Start)
146+ .height(ConfigData.WH_100_100)
147+ 
148+ Row() {
149+ Text(this.openingTimeText)
150+ .fontSize($r("app.float.font_14"))
151+ .lineHeight($r("app.float.lineHeight_19"))
152+ .align(Alignment.End)
153+ .fontWeight(FontWeight.Regular)
154+ .fontFamily('HarmonyHeiTi')
155+ .fontColor($r('sys.color.ohos_id_color_text_secondary'))
156+ .margin({ top: $r("app.float.distance_19"), bottom: $r("app.float.distance_18") });
157+ 
158+ Image('/res/image/ic_settings_arrow.svg')
159+ .width($r("app.float.wh_value_12"))
160+ .height($r("app.float.wh_value_24"))
161+ .margin({
162+ left: $r("app.float.distance_4"),
163+ right: $r("app.float.distance_8"),
164+ top: $r("app.float.distance_16"),
165+ bottom: $r("app.float.distance_16")
166+ })
167+ .fillColor($r("sys.color.ohos_id_color_fourth"))
168+ }
169+ .align(Alignment.End)
170+ .height(ConfigData.WH_100_100);
171+ }
172+ .width(ConfigData.WH_100_100)
173+ .height($r("app.float.wh_value_56"))
174+ .borderRadius($r("app.float.radius_16"))
175+ .linearGradient(this.isTouched ? {
176+ angle: 90,
177+ direction: GradientDirection.Right,
178+ colors: [[$r("app.color.DCEAF9"), 0.0], [$r("app.color.FAFAFA"), 1.0]]
179+ } : {
180+ angle: 90,
181+ direction: GradientDirection.Right,
182+ colors: [[$r("sys.color.ohos_id_color_foreground_contrary"), 1], [$r("sys.color.ohos_id_color_foreground_contrary"), 1]]
183+ })
184+ .onTouch((event?: TouchEvent | undefined) => {
185+ if (event?.type === TouchType.Down) {
186+ this.isTouched = true;
187+ }
188+ if (event?.type === TouchType.Up) {
189+ this.isTouched = false;
190+ }
191+ })
192+ }
193+}
194+ 
195+@CustomDialog
196+struct OpeningTimeDialog {
197+ controller?: CustomDialogController;
198+ private openingTime: number[] = [SHARE_OPENING_TIME_10_MIN, SHARE_OPENING_TIME_UNLIMITED];
199+ @Link isVertical : boolean ;
200+ @Link openingTimeText: Resource;
201+ @StorageLink('shareOpenTime') shareOpenTime: number = SHARE_OPENING_TIME_10_MIN;
202+ 
203+ build() {
204+ Column(){
205+ Column() {
206+ Text($r("app.string.share_opening_time"))
207+ .fontFamily("HarmonyHeiTi")
208+ .fontSize(this.isVertical ? $r('app.float.font_24') : $r('app.float.font_16'))
209+ .fontWeight(500)
210+ .height(this.isVertical ? $r("app.float.wh_value_80") : '46vp')
211+ .alignSelf(ItemAlign.Start)
212+ .fontColor('#333333')
213+ 
214+ List() {
215+ ForEach(this.openingTime, (item: number, index) => {
216+ ListItem() {
217+ Column() {
218+ Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
219+ Text(item === SHARE_OPENING_TIME_UNLIMITED ? $r("app.string.share_opening_time_unlimited") :
220+ $r("app.string.share_opening_time_minutes", item))
221+ .fontFamily("HarmonyHeiTi")
222+ .fontSize(this.isVertical ? $r('app.float.font_20') : '12fp')
223+ .fontWeight(FontWeight.Normal)
224+ .fontColor('#333333')
225+ 
226+ Radio({ value: "", group: 'radioGroup' })
227+ .checked(this.shareOpenTime === item ? true : false)
228+ .height(this.isVertical ? $r("app.float.wh_value_16") : $r("app.float.wh_value_18"))
229+ .width(this.isVertical ? $r("app.float.wh_value_16") : $r("app.float.wh_value_18"))
230+ .onChange((value: boolean) => {
231+ if (value) {
232+ this.controller?.close();
233+ LogUtil.info(MODULE_TAG + `onChange, item = ${item}`);
234+ if (item === SHARE_OPENING_TIME_10_MIN) {
235+ oneConnectShareController.setShareOpenTime(10);
236+ } else {
237+ oneConnectShareController.setShareOpenTime(0);
238+ }
239+ }
240+ })
241+ .margin({right: this.isVertical ? $r('app.float.distance_12') : $r('app.float.distance_6')})
242+ }
243+ .height(this.isVertical ? $r("app.float.wh_value_64") : '46vp')
244+ Divider()
245+ .strokeWidth('1px')
246+ .color('#D8D8D8')
247+ }
248+ }
249+ })
250+ }
251+ 
252+ Text($r("app.string.cancel_share_time"))
253+ .fontSize(this.isVertical ? $r("app.float.font_20") : $r("app.float.font_14"))
254+ .fontColor('#0959F7')
255+ .alignSelf(ItemAlign.Center)
256+ .height(this.isVertical ? $r("app.float.wh_value_64") : '46vp')
257+ .fontWeight(600)
258+ .onClick(() => {
259+ this.controller?.close();
260+ })
261+ }
262+ .padding({
263+ left: this.isVertical ? $r("app.float.padding_24") : $r("app.float.radius_16"),
264+ right: this.isVertical ? $r("app.float.padding_24") : $r("app.float.radius_16")
265+ })
266+ .alignItems(HorizontalAlign.Center)
267+ .backgroundColor($r("app.color.white_bg_color"))
268+ .borderRadius(this.isVertical ? $r("app.float.radius_24") : $r("app.float.radius_20"))
269+ }
270+ .width(this.isVertical ? ConfigData.WH_100_100 : '342vp')
271+ .padding(this.isVertical ? { left: $r("app.float.distance_12"), right: $r("app.float.distance_12")} : {})
272+ }
273+}
@@ -341,6 +341,17 @@ struct EntryComponent {
341 }341 }
342 .settingListItemFancy()342 .settingListItemFancy()
343 343 
344+ ListItem() {
345+ // accessibility
346+ SettingItemComponent({
347+ targetPage: "pages/oneConnectShare",
348+ settingTitle: $r("app.string.oneConnectShare"),
349+ settingEndText:$endTextEmpty,
350+ settingIcon: "/res/image/ic_share.svg",
351+ })
352+ }
353+ .settingListItemFancy()
354+ 
344 ListItem() {355 ListItem() {
345 // accessibility356 // accessibility
346 SettingItemComponent({357 SettingItemComponent({
@@ -0,0 +1,22 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<!-- Generator: Adobe Illustrator 26.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4+ viewBox="0 0 90 90" style="enable-background:new 0 0 90 90;" xml:space="preserve">
5+<style type="text/css">
6+ .st0{fill:none;}
7+ .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#0959F7;}
8+</style>
9+ <path class="st1" d="M44.5,26C50.3,26,55,30.7,55,36.5c0,5.8-4.7,10.6-10.6,10.6c-5.8,0-10.6-4.7-10.6-10.6
10+ C33.9,30.7,38.7,26,44.5,26z M60.5,20.3c0.7-0.5,1.5-0.7,2.3-0.6c0.8,0.1,1.6,0.6,2.1,1.3c3.2,4.4,4.8,9.6,4.8,15
11+ c0,5.5-1.7,10.7-4.8,15c-0.6,0.8-1.5,1.3-2.6,1.3c-0.7,0-1.3-0.2-1.9-0.7c-1.4-1.1-1.7-3.2-0.6-4.6c2.3-3.2,3.6-7,3.6-11.1
12+ c0-4.1-1.2-7.9-3.6-11.1C58.8,23.4,59.1,21.4,60.5,20.3z M27.2,19.7c0.8-0.1,1.7,0.1,2.3,0.6c1.4,1.1,1.7,3.2,0.6,4.6
13+ c-2.3,3.2-3.6,7-3.6,11.1c0,4.1,1.2,7.9,3.6,11.1c1.1,1.4,0.8,3.5-0.6,4.6c-0.5,0.4-1.2,0.7-1.9,0.7c-1,0-1.9-0.5-2.6-1.3
14+ c-3.2-4.4-4.8-9.6-4.8-15c0-5.5,1.7-10.7,4.8-15C25.6,20.2,26.4,19.8,27.2,19.7z M72.1,11.9c0.7-0.5,1.5-0.7,2.4-0.6
15+ c0.9,0.1,1.6,0.6,2.2,1.3c5.2,6.8,7.9,14.9,7.9,23.5s-2.7,16.7-7.9,23.5c-0.6,0.8-1.6,1.3-2.6,1.3c-0.7,0-1.4-0.2-1.9-0.6
16+ c-0.7-0.5-1.2-1.3-1.3-2.2c-0.1-0.8,0.1-1.7,0.6-2.4C75.7,49.9,78,43.1,78,36c0-7.1-2.3-13.9-6.6-19.6c-0.5-0.7-0.7-1.5-0.6-2.4
17+ C70.9,13.2,71.4,12.4,72.1,11.9z M13.4,12.5c1.1-1.4,3.1-1.7,4.6-0.6c0.7,0.5,1.2,1.3,1.3,2.2c0.1,0.8-0.1,1.7-0.6,2.4
18+ C14.3,22.1,12,28.9,12,36c0,7.1,2.3,13.9,6.6,19.6c0.5,0.7,0.7,1.5,0.6,2.4c-0.1,0.9-0.6,1.6-1.3,2.2c-0.5,0.4-1.2,0.6-2,0.6
19+ c-1,0-2-0.5-2.6-1.3C8.2,52.7,5.5,44.6,5.5,36S8.2,19.3,13.4,12.5z M45.9,55.2c0.3,0.2,0.5,0.4,0.7,0.7l12.2,19.4
20+ c0.7,1.1,0.3,2.4-0.7,3.1c-0.4,0.2-0.8,0.3-1.2,0.3H32.5c-1.2,0-2.3-1-2.3-2.3c0-0.4,0.1-0.8,0.3-1.2l12.2-19.4
21+ C43.5,54.9,44.9,54.5,45.9,55.2z"/>
22+</svg>
@@ -239,6 +239,9 @@
239 },239 },
240 {240 {
241 "name": "ohos.permission.MANAGE_USB_CONFIG"241 "name": "ohos.permission.MANAGE_USB_CONFIG"
242+ },
243+ {
244+ "name": "ohos.permission.ACCESS_SERVICE_DM"
242 }245 }
243 ]246 ]
244 }247 }
@@ -1771,6 +1771,26 @@
1771 {1771 {
1772 "name": "vpn_error_disconnect_first",1772 "name": "vpn_error_disconnect_first",
1773 "value": "请先断开VPN,再操作"1773 "value": "请先断开VPN,再操作"
1774+ },
1775+ {
1776+ "name": "oneConnectShare",
1777+ "value": "OneConnect Share"
1778+ },
1779+ {
1780+ "name": "share_opening_time",
1781+ "value" : "Opening Time"
1782+ },
1783+ {
1784+ "name": "share_opening_time_minutes",
1785+ "value" : "%d minutes"
1786+ },
1787+ {
1788+ "name": "share_opening_time_unlimited",
1789+ "value" : "Unlimited"
1790+ },
1791+ {
1792+ "name": "cancel_share_time",
1793+ "value" : "CANCEL"
1774 }1794 }
1775 ]1795 ]
1776}1796}
@@ -46,6 +46,7 @@
46 "pages/abilityDialog/accessibilityWindowShortKeyDialog",46 "pages/abilityDialog/accessibilityWindowShortKeyDialog",
47 "pages/vpn/vpnList",47 "pages/vpn/vpnList",
48 "pages/vpn/vpnEdit",48 "pages/vpn/vpnEdit",
49- "pages/vpn/vpnConnect"49+ "pages/vpn/vpnConnect",
50+ "pages/oneConnectShare"
50 ]51 ]
51-}52+}
@@ -1757,6 +1757,26 @@
1757 {1757 {
1758 "name": "vpn_error_disconnect_first",1758 "name": "vpn_error_disconnect_first",
1759 "value": "Disconnect the VPN before operating"1759 "value": "Disconnect the VPN before operating"
1760+ },
1761+ {
1762+ "name": "oneConnectShare",
1763+ "value": "OneConnect Share"
1764+ },
1765+ {
1766+ "name": "share_opening_time",
1767+ "value" : "Opening Time"
1768+ },
1769+ {
1770+ "name": "share_opening_time_minutes",
1771+ "value" : "%d minutes"
1772+ },
1773+ {
1774+ "name": "share_opening_time_unlimited",
1775+ "value" : "Unlimited"
1776+ },
1777+ {
1778+ "name": "cancel_share_time",
1779+ "value" : "CANCEL"
1760 }1780 }
1761 ]1781 ]
1762}1782}
@@ -1759,6 +1759,26 @@
1759 {1759 {
1760 "name": "vpn_error_disconnect_first",1760 "name": "vpn_error_disconnect_first",
1761 "value": "请先断开VPN,再操作"1761 "value": "请先断开VPN,再操作"
1762+ },
1763+ {
1764+ "name": "oneConnectShare",
1765+ "value": "统一互联分享"
1766+ },
1767+ {
1768+ "name": "share_opening_time",
1769+ "value" : "开启时间"
1770+ },
1771+ {
1772+ "name": "share_opening_time_minutes",
1773+ "value" : "%d分钟"
1774+ },
1775+ {
1776+ "name": "share_opening_time_unlimited",
1777+ "value" : "不自动关闭"
1778+ },
1779+ {
1780+ "name": "cancel_share_time",
1781+ "value" : "取消"
1762 }1782 }
1763 ]1783 ]
1764}1784}