4PM8X7&bC*{7kq_H6B2o~J4@
zow@Tbq#FE*hR&dK1c0_ASxeU`Up6wGd;L*r!qHDndcw+&HyROa99pbVj;gE5A&5SPXKa?83}fKSHz7s>k`8%J;?(VF?}rK<_dvX2HoU(VHM(e2b@27zK2>w
zSJ*BtmCZG%SbvwiAX#X_^!=j27TjnP%o`F$hjG*mzz5Oz&e0&y8!c&sj$KT(+oC^?
zN46rxn|nG
zb@b>U%|z1yp#I{ctGoGe$tYeNz!(0MeIKEsV~FN>Gj5WXA!}S?y9SCEFd^7L5zEyS
zJ{dH)U@>-%Gs4n&ix}iN>)=bsP?_&Uh)o&H=D6MK5mX|(g1bQT6zog9mLL1Z>#N8j
z6{wgI_$w9ErX+`pHRC+$+BVBa_Sf#v+2L>#(uHyl==+Oe$NYc}Vy=NTXVd!ZC-^_p
zk9Pu>A~Zny5%a&%j~Daf@AM;aRe4eaqrW3rEj|f`wY;LFd|Hf-4o&f1%CvB|YPyWF
zT=jG-UT>j-%po45kK-xYXBAi9+rg|d3You^&i*)sQUhH
zwe1Ro{FD^5T@Z{9Id?NHM&ISWXtOm&o7?uFPSRe
zM^)XEs25Csuw70=_UW&bhm|=bkm$v56K~y3Jj}vJKH&qBcmc{Up}!(q-x2Iif8q
zxM)FU{wWQO@oQE2{d^Gu7$!{0GC4OUQ`J`mG#1?}E%eY*q~vDd*dqikZw=
z&@q@u<$p|OjqL%t0DrehWS{!
zl_p-LVpoh1(ihIG5g;LF!A)}s3>Ah?_`rRLcA;&yYdd89(ah_&6pv<~qt^xEn7twx
z#;qcZ9_>oL{pRBYH+fv^ASA^ka>T8w_@A6pZmr
zN(~Kpg<%-1SzWZq0Rqc-pFI8tp|Ro2V+9!_Qg?o?tIwS9J`vnmzG+Xm1(bHLs)&E0
zDgZ#iFu;KU{xE;7-V9s-01FDpq0sZse`-0uG<&J#{QS?)rNEyG`2C+|e^7S*qlcH`
z%s_hddwB+S1)e`^S^g)BXF2EJ%Ckip@bnMrm;cG|S={-z@@&`(JpF^A;eW(@mU{lJ
zJe!^YPyb~4uf{KhpZ{TA;7PsIl#ZQ0v*!x!>ze}OM^zm#140QSb@+?^TTY0{i9>B@}5B2ze`O^Pn
z{VZSl%ewS0tY3(kzI66d%=91b3jBBfyR(1ORWD^ffB8fM#(TVM-ir$UTM^KgHGe6G
z`3uDW_^JNiQC^5+zJz(Hv-k_f7Pyf4+c3Y~r(c4+6o~r;f(INQ|2xPFxww}wFD0pd
z!5{;5=>I;*dgXVO}Z${epP{svQ4qn7_VcFY{P`ffSMc40eAxUx&AkRe;+LTvN@D~^_P;>2XH0`gi+{-w%U+!sm{;T_cjaqwI`U#6E2fPVSEk^Haz|KsDJmo0g@NBaxui|pS;`s=p5+@|`4
z@JjK&BD`3X{W)OgWm{e@_$U#6rh=E^Iz?)#Z=JRj=SY|$-lgJG!
z?lmz0&z=ud5JV7Q?7y9hqp_)qp^>#Iy|cUXpWbj{V`^e)NNi~geBV5yI}_t`VS;mV
zcC@rLCpNUV*S9saG5zOX7=a3ipkQzy&!qY{Ftv1DPBtLZc|PDlfH(g?6`)r$OLO|S
zPIk7cDv%)HAbiw1FFnL2f8^l@T0I}H|K!06=+p7{$~!R_0rSThOs!3AOl_SReyiYr
zc3enbHWq>h0`hzi{>ky>zdHW^%fRq_8R+e8&Hrs>|NP#VKQ_0A5ZI%Ce2dJ#Y3`qU
f=Z_w80zm$%um0)hx1NUtfdugYa%%X%=PUhxL4s&j
literal 0
HcmV?d00001
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/package.json" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/package.json"
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/package.json"
@@ -0,0 +1 @@
+{}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/proguard-rules.pro" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/proguard-rules.pro"
new file mode 100644
index 000000000..49a3b2f34
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/proguard-rules.pro"
@@ -0,0 +1,13 @@
+#config module specific ProGuard rules here.
+-ignorewarnings
+-keepattributes *Annotation*
+-keepattributes Exceptions
+-keepattributes InnerClasses
+-keepattributes Signature
+-keepattributes SourceFile,LineNumberTable
+-keep class com.huawei.hianalytics.**{*;}
+-keep class com.huawei.updatesdk.**{*;}
+-keep class com.huawei.hms.**{*;}
+-keep class com.huawei.harmony.**{*;}
+-keep class com.huawei.mylibrary.**{*;}
+
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/agconnect-services.json" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/agconnect-services.json"
new file mode 100644
index 000000000..cac314b84
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/agconnect-services.json"
@@ -0,0 +1,64 @@
+{
+ "agcgw":{
+ "backurl":"connect-drcn.hispace.hicloud.com",
+ "url":"connect-drcn.dbankcloud.cn",
+ "websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com",
+ "websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn"
+ },
+ "agcgw_all":{
+ "CN":"connect-drcn.dbankcloud.cn",
+ "CN_back":"connect-drcn.hispace.hicloud.com",
+ "DE":"connect-dre.dbankcloud.cn",
+ "DE_back":"connect-dre.hispace.hicloud.com",
+ "RU":"connect-drru.dbankcloud.cn",
+ "RU_back":"connect-drru.hispace.hicloud.com",
+ "SG":"connect-dra.dbankcloud.cn",
+ "SG_back":"connect-dra.hispace.hicloud.com"
+ },
+ "client":{
+ "cp_id":"2850086000421357287",
+ "product_id":"737518067794038136",
+ "client_id":"791228023054532608",
+ "client_secret":"[!000227DADD286AEF96FECA85B39C9887E5B6BE2B4AFD01DFFA39FA2A17C27E62E035A3511B4743F7D212604FEC537C20C5F1BBBD77465A550E122B9482344892DD8150AAB160B82F8B16A1FB51E15D6B708CF838CB11D339B1F958190D601FFDA9]",
+ "project_id":"737518067794038136",
+ "app_id":"105721531",
+ "api_key":"[!00A85D5D1819BF0CEE546DF2AB1E4D9BA0387D5EF2D51FC947BE7501ABBBBCB150E58240EBC0CBA0D5891E17B03FA8D22F7917E3C1B61B5A9EEB4B702640B25BB1D05A2A137301B19BD6E06875AB3E757B87B3C9759CB16DEB5A6FE65E326E42B9F173CD7F6794925B9D357BCCC45D0A78F977F875EA3395D367F96D68608F2C35]",
+ "package_name":"cn.jltf.neighbor"
+ },
+ "oauth_client":{
+ "client_id":"105721531",
+ "client_type":30
+ },
+ "app_info":{
+ "app_id":"842482320567970496",
+ "package_name":"cn.jltf.neighbor"
+ },
+ "code":{
+ "code1":"B04A54D7EE46C3754A45467032FFDA01",
+ "code2":"E1B9141D59E9C6976979C324D4C1CB9B",
+ "code3":"28B9D84F74DB33AC013F14C5B3E3AB77",
+ "code4":"094D461E954620F5E749701E991DEBF3"
+ },
+ "service":{
+ "analytics":{
+ "collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn",
+ "collector_url_ru":"datacollector-drru.dt.hicloud.com,datacollector-drru.dt.dbankcloud.cn",
+ "collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn",
+ "collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn",
+ "collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn",
+ "resource_id":"p1",
+ "channel_id":""
+ },
+ "search":{
+ "url":"https://search-drcn.cloud.huawei.com"
+ },
+ "cloudstorage":{
+ "storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn"
+ },
+ "ml":{
+ "mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"
+ }
+ },
+ "region":"CN",
+ "configuration_version":"3.0"
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/config.json" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/config.json"
new file mode 100644
index 000000000..4ca552d46
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/config.json"
@@ -0,0 +1,135 @@
+{
+ "app": {
+ "bundleName": "com.jitf.cardshow",
+ "vendor": "jltf",
+ "version": {
+ "code": 1000000,
+ "name": "1.0.0"
+ }
+ },
+ "deviceConfig": {
+ "default": {
+ "allowComponentsProxy": true,
+ "keepAlive": true,
+ "network": {
+ "cleartextTraffic": true
+ }
+ }
+ },
+ "module": {
+ "metaData": {
+ "customizeData": [
+ {
+ "name": "com.huawei.hms.client.appid",
+ "value": "105721531"
+ }
+ ]
+ },
+ "package": "com.jltf.jltf_idiom",
+ "name": ".MyApplication",
+ "mainAbility": "com.jltf.jltf_idiom.MainAbility",
+ "deviceType": [
+ "phone",
+ "tablet"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "entry",
+ "moduleType": "entry",
+ "installationFree": false
+ },
+ "abilities": [
+ {
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ],
+ "visible": true,
+ "configChanges": [
+ "density",
+ "fontSize",
+ "layout",
+ "locale",
+ "mcc",
+ "mnc",
+ "orientation",
+ "size",
+ "smallestSize",
+ "colorMode"
+ ],
+ "name": "com.jltf.jltf_idiom.MainAbility",
+ "icon": "$media:icon",
+ "description": "$string:idiom_label",
+ "formsEnabled": true,
+ "label": "$string:idiom_name",
+ "type": "page",
+ "forms": [
+ {
+ "jsComponentName": "widget",
+ "isDefault": true,
+ "scheduledUpdateTime": "10:30",
+ "defaultDimension": "2*2",
+ "name": "widget",
+ "description": "This is a service widget",
+ "colorMode": "auto",
+ "type": "JS",
+ "supportDimensions": [
+ "2*2"
+ ],
+ "updateEnabled": true,
+ "updateDuration": 1
+ }
+ ],
+ "launchType": "standard"
+ },
+ {
+ "name": "com.jltf.jltf_idiom.controller.ServiceAbility",
+ "icon": "$media:icon",
+ "description": "$string:idiom_label",
+ "type": "service",
+ "visible": true,
+ "backgroundModes": [
+ "dataTransfer",
+ "location"
+ ]
+ }
+ ],
+ "js": [
+ {
+ "pages": [
+ "pages/index/index"
+ ],
+ "name": "default",
+ "window": {
+ "designWidth": 720,
+ "autoDesignWidth": true
+ }
+ },
+ {
+ "pages": [
+ "pages/index/index"
+ ],
+ "name": "widget",
+ "window": {
+ "designWidth": 720,
+ "autoDesignWidth": true
+ },
+ "type": "form"
+ }
+ ],
+ "defPermissions": [
+ {
+ "name": "com.jltf.jltf_idiom.data.DataAbilityShellProvider.PROVIDER"
+ },
+ {
+ "name": "com.jltf.jltf_idiom.data.model.DataAbilityShellProvider.PROVIDER"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareCallback.idl" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareCallback.idl"
new file mode 100644
index 000000000..0af07f0da
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareCallback.idl"
@@ -0,0 +1,7 @@
+// IHwShareCallback.idl
+
+// Declare any non-default types here with sequenceable or interface statements
+
+interface com.huawei.hwshare.third.IHwShareCallback {
+ [oneway] void notifyState([in] int state);
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareService.idl" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareService.idl"
new file mode 100644
index 000000000..af94f085d
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/idl/com/huawei/hwshare/third/IHwShareService.idl"
@@ -0,0 +1,10 @@
+// IHwShareService.idl
+
+// Declare any non-default types here with sequenceable or interface statements
+sequenceable ohos.interwork.utils.PacMapEx;
+interface com.huawei.hwshare.third.IHwShareCallback;
+
+interface com.huawei.hwshare.third.IHwShareService {
+ int startAuth([in] String appId, [in] IHwShareCallback callback);
+ int shareFaInfo([in] PacMapEx pacMapEx);
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MainAbility.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MainAbility.java"
new file mode 100644
index 000000000..0c4da4abe
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MainAbility.java"
@@ -0,0 +1,186 @@
+package com.jltf.jltf_idiom;
+
+import com.jltf.jltf_idiom.controller.ServiceAbility;
+import com.jltf.jltf_idiom.widget.controller.*;
+import ohos.aafwk.ability.*;
+import ohos.aafwk.content.Operation;
+import ohos.ace.ability.AceAbility;
+import ohos.aafwk.content.Intent;
+import com.jltf.jltf_idiom.widget.controller.FormController;
+import com.jltf.jltf_idiom.widget.controller.FormControllerManager;
+import ohos.data.dataability.DataAbilityPredicates;
+import ohos.data.rdb.ValuesBucket;
+import ohos.data.resultset.ResultSet;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.utils.net.Uri;
+import ohos.utils.zson.ZSONObject;
+
+public class MainAbility extends AceAbility {
+ public static final int DEFAULT_DIMENSION_2X2 = 2;
+ public static final int DIMENSION_1X2 = 1;
+ public static final int DIMENSION_2X4 = 3;
+ public static final int DIMENSION_4X4 = 4;
+ private static final int INVALID_FORM_ID = -1;
+ private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, MainAbility.class.getName()+"蛟龙腾飞");
+ private String topWidgetSlice;
+
+ FormBindingData formBindingData;
+ private final Uri uri = Uri.parse("dataability:///com.jltf.jltf_idiom.data.FormDataAbility");
+
+ DataAbilityHelper helper= DataAbilityHelper.creator(this);
+
+ @Override
+ public void onStart(Intent intent) {
+
+ // 判断是否是已经同意隐私协议 ,是 直接进入主页面 , 否 进入隐私页面
+ setInstanceName("default");
+
+ setPageParams("pages/index/index",null);
+
+ super.onStart(intent);
+ }
+ @Override
+ public void onStop() {
+ super.onStop();
+ }
+
+
+ @Override
+ protected ProviderFormInfo onCreateForm(Intent intent) {
+ HiLog.info(TAG, "onCreateForm");
+ long formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, INVALID_FORM_ID);
+ String formName = intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);
+ int dimension = intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY, DEFAULT_DIMENSION_2X2);
+ HiLog.info(TAG, "onCreateForm: formId=" + formId + ",formName=" + formName);
+
+ helper = DataAbilityHelper.creator(this);
+
+ // 构造插入数据
+ ValuesBucket valuesBucket = new ValuesBucket();
+ valuesBucket.putLong("formId", formId);
+ valuesBucket.putString("formName",formName);
+ try {
+ helper.insert(uri, valuesBucket);
+ } catch (DataAbilityRemoteException e) {
+ e.printStackTrace();
+ }
+
+ FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
+ FormController formController = formControllerManager.getController(formId);
+ formController = (formController == null) ? formControllerManager.createFormController(formId,
+ formName, dimension) : formController;
+ if (formController == null) {
+ HiLog.error(TAG, "Get null controller. formId: " + formId + ", formName: " + formName);
+ return null;
+ }
+
+ ZSONObject zsonObject = new ZSONObject();
+
+ // 显示内容
+// ZSONObject zsonObject = getDataByFormName(formId,formName);
+// zsonObject.put("comment","加载中...");
+// zsonObject.put("comment1","加载中...");
+// zsonObject.put("comment2","加载中...");
+//
+// new Thread(new Runnable() {
+// @Override
+// public void run() {
+// UpdataCommect(formId,zsonObject.getString("idiom"));
+// }
+// });
+
+
+ ProviderFormInfo formInfo = new ProviderFormInfo();
+ formInfo.setJsBindingData(new FormBindingData(zsonObject));
+
+ return formInfo;
+
+ }
+
+ @Override
+ protected void onUpdateForm(long formId) {
+ HiLog.info(TAG, "onUpdateForm");
+ super.onUpdateForm(formId);
+ FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
+
+ FormController formController = formControllerManager.getController(formId);
+
+ formController.onUpdateFormData(formId);
+ }
+
+ @Override
+ protected void onDeleteForm(long formId) {
+ HiLog.info(TAG, "onDeleteForm: formId=" + formId);
+ super.onDeleteForm(formId);
+
+ try {
+ helper.delete(uri, new DataAbilityPredicates().equalTo("formId", formId));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
+ FormController formController = formControllerManager.getController(formId);
+ formController.onDeleteForm(formId);
+ formControllerManager.deleteFormController(formId);
+
+ }
+
+ @Override
+ protected void onTriggerFormEvent(long formId, String message) {
+ HiLog.info(TAG, "onTriggerFormEvent: " + message);
+
+
+ super.onTriggerFormEvent(formId, message);
+ FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
+ FormController formController = formControllerManager.getController(formId);
+ formController.onTriggerFormEvent(formId, message);
+ }
+
+ @Override
+ public void onNewIntent(Intent intent) {
+ // Only response to it when starting from a service widget.
+ if (intentFromWidget(intent)) {
+ String newWidgetSlice = getRoutePageSlice(intent);
+ if (topWidgetSlice == null || !topWidgetSlice.equals(newWidgetSlice)) {
+ topWidgetSlice = newWidgetSlice;
+ restart();
+ }
+ } else {
+ if (topWidgetSlice != null) {
+ topWidgetSlice = null;
+ restart();
+ }
+ }
+ if (intentFromWidget(intent)) {
+ String newWidgetSlice = getRoutePageSlice(intent);
+ if (topWidgetSlice == null || !topWidgetSlice.equals(newWidgetSlice)) {
+ topWidgetSlice = newWidgetSlice;
+ restart();
+ }
+ }
+ }
+
+ private boolean intentFromWidget(Intent intent) {
+ long formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, INVALID_FORM_ID);
+ return formId != INVALID_FORM_ID;
+ }
+
+ private String getRoutePageSlice(Intent intent) {
+ long formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, INVALID_FORM_ID);
+ if (formId == INVALID_FORM_ID) {
+ return null;
+ }
+ FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
+ FormController formController = formControllerManager.getController(formId);
+ if (formController == null) {
+ return null;
+ }
+ Class extends AbilitySlice> clazz = formController.getRoutePageSlice(intent);
+ if (clazz == null) {
+ return null;
+ }
+ return clazz.getName();
+ }
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MyApplication.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MyApplication.java"
new file mode 100644
index 000000000..0e8b6f8c8
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/MyApplication.java"
@@ -0,0 +1,98 @@
+package com.jltf.jltf_idiom;
+
+
+import com.huawei.hms.accountsdk.exception.ApiException;
+import com.huawei.hms.accountsdk.support.account.AccountAuthManager;
+import com.huawei.hms.accountsdk.support.account.tasks.OnFailureListener;
+import com.huawei.hms.accountsdk.support.account.tasks.OnSuccessListener;
+import com.huawei.hms.accountsdk.support.account.tasks.Task;
+import ohos.aafwk.ability.AbilityPackage;
+
+public class MyApplication extends AbilityPackage {
+
+ @Override
+
+ public void onInitialize() {
+
+ super.onInitialize();
+
+ // 调用示例initHuaweiAccountSDK方法,在鸿蒙应用初始化方法OnInitialize中进行华为帐号SDK初始化
+
+ initHuaweiAccountSDK();
+
+ }
+
+ @Override
+
+ public void onEnd() {
+
+ super.onEnd();
+
+ }
+
+
+
+
+
+ // 示例:此方法中调用华为帐号SDK的初始化方法AccountAuthManager.init()进行初始化
+
+ private void initHuaweiAccountSDK() {
+
+ System.out.println("初始化华为账号");
+
+ Task task;
+
+ try {
+
+ // 调用AccountAuthManager.init方法初始化
+
+ task = AccountAuthManager.init(this);
+
+ } catch (ApiException apiException) {
+
+ apiException.getStatusCode();
+
+ return;
+
+ }
+
+ task.addOnSuccessListener(new OnSuccessListener() {
+
+ @Override
+
+ public void onSuccess(Void v) {
+
+ //初始化成功
+ System.out.println("初始化成功");
+
+ }
+
+ });
+
+
+ task.addOnFailureListener(new OnFailureListener() {
+
+ @Override
+
+ public void onFailure(Exception e) {
+
+ // SDK初始化失败
+
+ if (e instanceof ApiException) {
+
+ ApiException apiException = (ApiException) e;
+
+ // SDK初始化失败,status code标识了失败的原因,请参考API中的错误码参考了解详细错误原因
+
+ apiException.getStatusCode();
+
+ System.out.println("初始化失败" );
+
+ }
+
+ }
+
+ });
+
+ }
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/controller/ServiceAbility.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/controller/ServiceAbility.java"
new file mode 100644
index 000000000..f1c0e5031
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/controller/ServiceAbility.java"
@@ -0,0 +1,108 @@
+package com.jltf.jltf_idiom.controller;
+
+import com.huawei.caas.messageservice.HwShareUtils;
+import com.huawei.caas.messageservice.WebPageShareMsg;
+import com.huawei.hms.accountsdk.exception.ApiException;
+import com.huawei.hms.accountsdk.support.account.AccountAuthManager;
+import com.huawei.hms.accountsdk.support.account.request.AccountAuthParams;
+import com.huawei.hms.accountsdk.support.account.request.AccountAuthParamsHelper;
+import com.huawei.hms.accountsdk.support.account.result.AuthAccount;
+import com.huawei.hms.accountsdk.support.account.service.AccountAuthService;
+import com.huawei.hms.accountsdk.support.account.tasks.OnFailureListener;
+import com.huawei.hms.accountsdk.support.account.tasks.OnSuccessListener;
+import com.huawei.hms.accountsdk.support.account.tasks.Task;
+import com.jltf.jltf_idiom.MainAbility;
+import com.jltf.jltf_idiom.ResourceTable;
+
+import com.jltf.jltf_idiom.utils.PasteboardUtils;
+
+import ohos.aafwk.ability.*;
+import ohos.aafwk.content.Intent;
+import ohos.data.dataability.DataAbilityPredicates;
+import ohos.data.rdb.ValuesBucket;
+import ohos.data.resultset.ResultSet;
+import ohos.global.resource.NotExistException;
+import ohos.interwork.utils.PacMapEx;
+import ohos.location.*;
+import ohos.media.image.PixelMap;
+import ohos.rpc.*;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.utils.net.Uri;
+import ohos.utils.zson.ZSONObject;
+
+import java.io.*;
+import java.time.Instant;
+import java.util.*;
+
+public class ServiceAbility extends Ability {
+ private static final HiLogLabel TAG = new HiLogLabel(3, 0xD001100, "蛟龙腾飞-ServiceAbility");
+
+ MyRemote remote=new MyRemote();
+
+
+ @Override
+ public void onStart(Intent intent) {
+ HiLog.error(TAG, "ServiceAbility::onStart");
+ super.onStart(intent);
+
+
+
+ }
+
+
+ // FA在请求PA服务时会调用Ability.connectAbility连接PA,连接成功后,需要在onConnect返回一个remote对象,供FA向PA发送消息
+ @Override
+ protected IRemoteObject onConnect(Intent intent) {
+ super.onConnect(intent);
+ return remote.asObject();
+ }
+
+
+ class MyRemote extends RemoteObject implements IRemoteBroker {
+ private static final int SUCCESS = 0;
+ private static final int COPYTEXT = 1013; // 复制
+ private static final int PASTETEXT = 1014; // 粘贴
+
+
+ MyRemote() {
+ super("MyService_MyRemote");
+ }
+
+ @Override
+ public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
+
+ String dataStr = data.readString();
+ ZSONObject parms = ZSONObject.stringToZSON(dataStr);
+
+ List idioms = new ArrayList();
+
+ Map result = new HashMap();
+ HiLog.info(TAG,"请求方:"+code);
+ HiLog.info(TAG,"请求方数据:"+dataStr);
+ switch (code) {
+ case COPYTEXT:
+ new PasteboardUtils(getContext()).copyText(parms.getString("text"));
+ break;
+ case PASTETEXT:
+ result.put("text",new PasteboardUtils(getContext()).pasteText() );
+ break;
+ default: {
+ result.put("abilityError", 0);
+ reply.writeString(ZSONObject.toZSONString(result));
+ return false;
+ }
+ }
+ result.put("code",code);
+ HiLog.info(TAG,"后台数据:"+result.toString());
+ reply.writeString(ZSONObject.toZSONString(result));
+ return true;
+ }
+
+ @Override
+ public IRemoteObject asObject() {
+ return this;
+ }
+ }
+
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/utils/PasteboardUtils.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/utils/PasteboardUtils.java"
new file mode 100644
index 000000000..635f1ca63
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/utils/PasteboardUtils.java"
@@ -0,0 +1,77 @@
+package com.jltf.jltf_idiom.utils;
+
+import ohos.agp.components.Component;
+import ohos.agp.window.dialog.ToastDialog;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.miscservices.pasteboard.IPasteDataChangedListener;
+import ohos.miscservices.pasteboard.PasteData;
+import ohos.miscservices.pasteboard.SystemPasteboard;
+
+
+public class PasteboardUtils {
+
+ private static final HiLogLabel TAG = new HiLogLabel(HiLog.LOG_APP,0x0,"蛟龙腾飞--粘贴版");
+
+ private SystemPasteboard pasteboard;
+
+ public PasteboardUtils(Context context) {
+ initPasteboard(context);
+ }
+ // 复制到粘贴板
+ public void copyText(String text) {
+ pasteboard.setPasteData(PasteData.creatPlainTextData(text));
+ }
+
+ // 粘贴
+ public String pasteText() {
+ String result = "";
+ PasteData pasteData = pasteboard.getPasteData();
+ if (pasteData == null) {
+ return result;
+ }
+ PasteData.DataProperty dataProperty = pasteData.getProperty();
+ boolean hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);
+ boolean hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);
+ if (hasHtml || hasText) {
+ for (int i = 0; i < pasteData.getRecordCount(); i++) {
+ PasteData.Record record = pasteData.getRecordAt(i);
+ String mimeType = record.getMimeType();
+ if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) {
+ result = record.getHtmlText();
+ } else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
+ result = record.getPlainText().toString();
+ } else {
+ HiLog.info(TAG, "%{public}s", "getPasteData mimeType :" + mimeType);
+ }
+ }
+ }
+ return result;
+ }
+
+ // 监听粘贴版内容
+ private final IPasteDataChangedListener listener = new IPasteDataChangedListener() {
+
+ @Override
+ public void onChanged() {
+ PasteData pasteData = pasteboard.getPasteData();
+ if (pasteData != null) {
+ HiLog.info(TAG,"粘贴版内容改变:"+pasteData);
+ }
+ }
+ };
+
+ // 清空粘贴板
+ public void clearPasteboard(Component component) {
+ if (pasteboard != null) {
+ pasteboard.clear();
+ }
+ }
+
+ //初始化
+ private void initPasteboard(Context context) {
+ pasteboard = SystemPasteboard.getSystemPasteboard(context);
+ pasteboard.addPasteDataChangedListener(listener);
+ }
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormController.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormController.java"
new file mode 100644
index 000000000..4c65970f4
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormController.java"
@@ -0,0 +1,97 @@
+package com.jltf.jltf_idiom.widget.controller;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.ability.ProviderFormInfo;
+import ohos.aafwk.content.Intent;
+import ohos.app.Context;
+
+/**
+ * The api set for form controller.
+ */
+public abstract class FormController {
+ /**
+ * Context of ability
+ */
+ protected final Context context;
+
+ /**
+ * The name of current form service widget
+ */
+ protected final String formName;
+
+ /**
+ * The dimension of current form service widget
+ */
+ protected final int dimension;
+
+ public FormController(Context context, String formName, Integer dimension) {
+ this.context = context;
+ this.formName = formName;
+ this.dimension = dimension;
+ }
+
+ /**
+ * Bind data for a form
+ *
+ * @return ProviderFormInfo
+ */
+ public abstract ProviderFormInfo bindFormData(long formId);
+
+ /**
+ * Update form data
+ *
+ * @param formId the id of service widget to be updated
+ * @param vars the data to update for service widget, this parameter is optional
+ */
+ public abstract void updateFormData(long formId, Object... vars);
+
+ /**
+ * Update form data on time, this update time is set in config.json by scheduledUpdateTime property
+ *
+ * @param formId the id of service widget to be updated
+ */
+ public void onUpdateFormData(long formId) {
+ }
+
+ /**
+ * Called when receive service widget message event
+ *
+ * @param formId form id
+ * @param message the message context sent by service widget message event
+ */
+ public abstract void onTriggerFormEvent(long formId, String message);
+
+ /**
+ * Get the destination ability slice to route
+ *
+ * @param intent intent of current page slice
+ * @return the destination ability slice name to route
+ */
+ public abstract Class extends AbilitySlice> getRoutePageSlice(Intent intent);
+
+ /**
+ * Delete the resource related to current service widget
+ *
+ * @param formId form id
+ */
+ public void onDeleteForm(long formId) {
+ }
+
+ /**
+ * Get the dimension of current service widget
+ *
+ * @return the dimension of current service widget
+ */
+ public int getDimension() {
+ return dimension;
+ }
+
+ /**
+ * Get the name of current service widget
+ *
+ * @return the name of current service widget
+ */
+ public String getFormName() {
+ return formName;
+ }
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormControllerManager.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormControllerManager.java"
new file mode 100644
index 000000000..ff90de844
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/controller/FormControllerManager.java"
@@ -0,0 +1,183 @@
+package com.jltf.jltf_idiom.widget.controller;
+
+import ohos.app.Context;
+import ohos.data.DatabaseHelper;
+import ohos.data.preferences.Preferences;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.utils.zson.ZSONObject;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Form controller manager.
+ */
+public class FormControllerManager {
+ private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, FormControllerManager.class.getName());
+ private static final String PACKAGE_PATH = "com.jltf.jltf_idiom.widget";
+ private static final String SHARED_SP_NAME = "form_info_sp.xml";
+ private static final String FORM_NAME = "formName";
+ private static final String DIMENSION = "dimension";
+ private volatile static FormControllerManager managerInstance = null;
+ private final HashMap controllerHashMap = new HashMap<>();
+
+ private final Context context;
+
+ private final Preferences preferences;
+
+ /**
+ * Constructor with context.
+ *
+ * @param context instance of Context.
+ */
+ private FormControllerManager(Context context) {
+ this.context = context;
+ DatabaseHelper databaseHelper = new DatabaseHelper(this.context.getApplicationContext());
+ preferences = databaseHelper.getPreferences(SHARED_SP_NAME);
+ }
+
+ /**
+ * Singleton mode.
+ *
+ * @param context instance of Context.
+ * @return FormControllerManager instance.
+ */
+ public static FormControllerManager getInstance(Context context) {
+ if (managerInstance == null) {
+ synchronized (FormControllerManager.class) {
+ if (managerInstance == null) {
+ managerInstance = new FormControllerManager(context);
+ }
+ }
+ }
+ return managerInstance;
+ }
+
+ /**
+ * Save the form id and form name.
+ *
+ * @param formId form id.
+ * @param formName form name.
+ * @param dimension form dimension
+ * @return FormController form controller
+ */
+ public FormController createFormController(long formId, String formName, int dimension) {
+ synchronized (controllerHashMap) {
+ if (formId < 0 || formName.isEmpty()) {
+ return null;
+ }
+ HiLog.info(TAG,
+ "saveFormId() formId: " + formId + ", formName: " + formName + ", preferences: " + preferences);
+ if (preferences != null) {
+ ZSONObject formObj = new ZSONObject();
+ formObj.put(FORM_NAME, formName);
+ formObj.put(DIMENSION, dimension);
+ preferences.putString(Long.toString(formId), ZSONObject.toZSONString(formObj));
+ preferences.flushSync();
+ }
+
+ // Create controller instance.
+ FormController controller = newInstance(formName, dimension, context);
+
+ // Cache the controller.
+ if (controller != null) {
+ if (!controllerHashMap.containsKey(formId)) {
+ controllerHashMap.put(formId, controller);
+ }
+ }
+
+ return controller;
+ }
+ }
+
+ /**
+ * Get the form controller instance.
+ *
+ * @param formId form id.
+ * @return the instance of form controller.
+ */
+ public FormController getController(long formId) {
+ synchronized (controllerHashMap) {
+ if (controllerHashMap.containsKey(formId)) {
+ return controllerHashMap.get(formId);
+ }
+ Map forms = preferences.getAll();
+ String formIdString = Long.toString(formId);
+ if (forms.containsKey(formIdString)) {
+ ZSONObject formObj = ZSONObject.stringToZSON((String) forms.get(formIdString));
+ String formName = formObj.getString(FORM_NAME);
+ int dimension = formObj.getIntValue(DIMENSION);
+ FormController controller = newInstance(formName, dimension, context);
+ controllerHashMap.put(formId, controller);
+ }
+ return controllerHashMap.get(formId);
+ }
+ }
+
+ private FormController newInstance(String formName, int dimension, Context context) {
+ FormController ctrInstance = null;
+ if (formName == null || formName.isEmpty()) {
+ HiLog.error(TAG, "newInstance() get empty form name");
+ return ctrInstance;
+ }
+ try {
+ String className = PACKAGE_PATH + "." + formName.toLowerCase(Locale.ROOT) + "."
+ + getClassNameByFormName(formName);
+ Class> clazz = Class.forName(className);
+ if (clazz != null) {
+ Object controllerInstance = clazz.getConstructor(Context.class, String.class, Integer.class)
+ .newInstance(context, formName, dimension);
+ if (controllerInstance instanceof FormController) {
+ ctrInstance = (FormController) controllerInstance;
+ }
+ }
+ } catch (NoSuchMethodException | InstantiationException | IllegalArgumentException | InvocationTargetException
+ | IllegalAccessException | ClassNotFoundException | SecurityException exception) {
+ HiLog.error(TAG, "newInstance() get exception: " + exception.getMessage());
+ }
+ return ctrInstance;
+ }
+
+ /**
+ * Get all form id from the share preference
+ *
+ * @return form id list
+ */
+ public List getAllFormIdFromSharePreference() {
+ List result = new ArrayList<>();
+ Map forms = preferences.getAll();
+ for (String formId : forms.keySet()) {
+ result.add(Long.parseLong(formId));
+ }
+ return result;
+ }
+
+ /**
+ * Delete a form controller
+ *
+ * @param formId form id
+ */
+ public void deleteFormController(long formId) {
+ synchronized (controllerHashMap) {
+ preferences.delete(Long.toString(formId));
+ preferences.flushSync();
+ controllerHashMap.remove(formId);
+ }
+ }
+
+ private String getClassNameByFormName(String formName) {
+ String[] strings = formName.split("_");
+ StringBuilder result = new StringBuilder();
+ for (String string : strings) {
+ result.append(string);
+ }
+ char[] charResult = result.toString().toCharArray();
+ charResult[0] = (charResult[0] >= 'a' && charResult[0] <= 'z') ? (char) (charResult[0] - 32) : charResult[0];
+ return String.copyValueOf(charResult) + "Impl";
+ }
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/widget/WidgetImpl.java" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/widget/WidgetImpl.java"
new file mode 100644
index 000000000..ae98af477
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/java/com/jltf/jltf_idiom/widget/widget/WidgetImpl.java"
@@ -0,0 +1,58 @@
+package com.jltf.jltf_idiom.widget.widget;
+
+import com.jltf.jltf_idiom.widget.controller.FormController;
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.ability.ProviderFormInfo;
+import ohos.aafwk.content.Intent;
+import ohos.aafwk.content.Operation;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.nfc.tag.TagInfo;
+import ohos.utils.zson.ZSONObject;
+
+public class WidgetImpl extends FormController {
+
+ private static final HiLogLabel TAG = new HiLogLabel(3, 0xD001100, "蛟龙腾飞-WidgetImpl");
+
+ public WidgetImpl(Context context, String formName, Integer dimension) {
+ super(context, formName, dimension);
+ }
+
+ @Override
+ public ProviderFormInfo bindFormData(long formId) {
+ return null;
+ }
+
+ @Override
+ public void updateFormData(long formId, Object... vars) {
+ }
+
+ @Override
+ public void onTriggerFormEvent(long formId, String message) {
+ ZSONObject zsonObject = ZSONObject.stringToZSON(message);
+ HiLog.info(TAG,"卡片item:"+zsonObject.getString("mAction"));
+ Item(zsonObject.getString("mAction"));
+
+ }
+
+ // 使用统一service刷新卡片
+ private void Item(String item){
+ Intent intent = new Intent();
+ Operation operation = new Intent.OperationBuilder()
+ .withBundleName("com.jltf.idiom")
+ .withAbilityName("com.jltf.jltf_idiom.service.ServiceAbility")
+ .build();
+ intent.setOperation(operation);
+ intent.setParam("item",item);
+ // 启动Service
+ context.startAbility(intent,0);
+ }
+
+
+
+ @Override
+ public Class extends AbilitySlice> getRoutePageSlice(Intent intent) {
+ return null;
+ }
+}
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/app.js" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/app.js"
new file mode 100644
index 000000000..aedcefe00
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/app.js"
@@ -0,0 +1,8 @@
+export default {
+ onCreate() {
+ console.info('AceApplication onCreate');
+ },
+ onDestroy() {
+ console.info('AceApplication onDestroy');
+ }
+};
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/comment.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/comment.css"
new file mode 100644
index 000000000..6dbb938a4
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/comment.css"
@@ -0,0 +1,34 @@
+.comment{
+ width: 100%;
+ height: 30%;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+ background-color: lightskyblue;
+ border-top-right-radius: 12px;
+ border-top-left-radius: 12px;
+}
+.comment-content{
+ width: 84%;
+ height: 90%;
+ margin-left: 5%;
+ margin-top: 5%;
+ border-radius: 12px;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+/* background-color: #cecece;*/
+}
+.list{
+ width: 90%;
+ height: 100%;
+}
+.list-item{
+ height: 40px;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+}
+.list-item-text{
+ font-size: 14x;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/icon.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/icon.css"
new file mode 100644
index 000000000..b1ca2b1ec
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/icon.css"
@@ -0,0 +1,38 @@
+.navigationIcon{
+ width: 24px;
+ height: 24px;
+ margin-right: 4px;
+}
+.navigationBackIcon{
+ width: 24px;
+ height: 24px;
+ margin: 0px 6px;
+}
+.searchIcon{
+ width: 26px;
+ height: 26px;
+ margin-left: 12px;
+}
+.iconImg{
+ width: 30px;
+ height: 30px;
+}
+.iconImg1{
+ width: 26px;
+ height: 26px;
+}
+.iconImg2{
+ width: 24px;
+ height: 24px;
+ margin-right: 4px;
+}
+.iconImg3{
+ width: 24px;
+ height: 24px;
+}
+.list-item-icon{
+ width: 18px;
+ height: 18px;
+ margin: 2px 0px;
+ margin-right: 10px;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/messageComments.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/messageComments.css"
new file mode 100644
index 000000000..18d6c816d
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/messageComments.css"
@@ -0,0 +1,49 @@
+.messageCommentsUP{
+ width: 100%;
+ height: 90%;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+.messageComments-itemUP{
+ width: 90%;
+ height: 80%;
+ flex-direction: column;
+ align-items: center;
+ background-color: #c4daf5;
+ border-radius: 12px;
+}
+.item-titleUP{
+ width: 92%;
+ height: 80px;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ border-bottom-width: 1px;
+ border-bottom-color: #999;
+}
+.item-input-contentUP{
+ width: 80%;
+ font-size: 16px;
+ color: #333;
+}
+.item-title-contentUP{
+ width: 20%;
+ text-align: center;
+ font-size: 20px;
+ color: #333;
+}
+.item-listUP{
+ width: 92%;
+}
+.item-listItemUP{
+ height: 42px;
+ width: 100%;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+}
+.messagesTextUP{
+ font-size: 16px;
+ color: #333;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationBottom.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationBottom.css"
new file mode 100644
index 000000000..6dffc4ea6
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationBottom.css"
@@ -0,0 +1,20 @@
+.toolbar{
+ position: fixed;
+ bottom: 0px;
+ width: 100%;
+ border-top-width: 1px;
+ border-top-style: solid;
+ background-color: #444;
+}
+.footer-r{
+ flex: 1;
+ width: 30%;
+ height: 40px;
+}
+
+.footer-text{
+ width: 100%;
+ text-align: center;
+ color: #fff;
+ font-size: 20px;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationTop.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationTop.css"
new file mode 100644
index 000000000..e3a7b1640
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/navigationTop.css"
@@ -0,0 +1,30 @@
+.navigationBar{
+ width: 100%;
+ height: 56px;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ background-color: #333;
+}
+.searchBox{
+ width: 60%;
+ height: 36px;
+ margin-right: 10px;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ background-color: #696969;
+ border-radius: 12px;
+}
+.title{
+ text-align: center;
+ font-size: 20px;
+ color: #fefefe;
+ placeholder-color: #ccc;
+/* border: 0px;*/
+}
+.title1{
+ margin-left: 12px;
+ font-size: 22px;
+ color: firebrick;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/share.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/share.css"
new file mode 100644
index 000000000..609dd7c2f
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/share.css"
@@ -0,0 +1,7 @@
+.content-function{
+ width: 100%;
+ height: 86%;
+ flex-direction: column;
+ align-items: flex-end;
+ justify-content: flex-end;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/subscribe.css" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/subscribe.css"
new file mode 100644
index 000000000..c23514a13
--- /dev/null
+++ "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/css/subscribe.css"
@@ -0,0 +1,32 @@
+.subscribeDiv{
+ width: 100%;
+ height: 100%;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ background-color: #fff;
+}
+.subscribeDiv-content{
+ width: 100%;
+ margin-top: 20px;
+ flex-direction: column;
+/* align-items: center;*/
+}
+.subscribeDiv-content1{
+ flex-direction: row;
+/* justify-content: center;*/
+ left: 3%;
+}
+.subscribeDiv-text{
+ margin: 10px 0px;
+ font-size: 20px;
+ color: #333;
+ width: 60px;
+ height: 30px;
+ text-align: center;
+ border-radius: 8px;
+ background-color: #cecece;
+}
+.subscribeDiv-text:active{
+ background-color: yellowgreen;
+}
\ No newline at end of file
diff --git "a/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/iconImg/clshare.png" "b/OpenHarmonyAPP\345\274\200\345\217\221\345\255\246\344\271\240\346\272\220\347\240\201\344\275\223\347\263\273/7\343\200\201DEMO\344\270\216\346\241\210\344\276\213\346\272\220\347\240\201/jltf_YKX/entry/src/main/js/default/common/iconImg/clshare.png"
new file mode 100644
index 0000000000000000000000000000000000000000..2e2acbbe2de120973496cfda7185bf330892e310
GIT binary patch
literal 5138
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