1/* 2 * Copyright (c) 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 16const hilog = requireNapi('hilog'); 17const Want = requireNapi('app.ability.Want'); 18const componentSnapshot = requireNapi('arkui.componentSnapshot'); 19const componentUtils = requireNapi('arkui.componentUtils'); 20const image = requireNapi('multimedia.image'); 21const util = requireNapi('util'); 22 23const tag = 'AddFormMenuItem::js::'; 24 25async function querySnapshotAsync(want, componentId, uiContext) { 26 let compInfo = uiContext.getComponentUtils().getRectangleById(componentId); 27 try { 28 const imagePackageApi = image.createImagePacker(); 29 const packOpts = { 30 format: 'image/webp', 31 quality: 50, 32 }; 33 hilog.info(0x3900, tag, 'componentId:' + componentId); 34 let packPixmap = await uiContext.getComponentSnapshot().get(componentId); 35 let arrayBuffer = await imagePackageApi.packing(packPixmap, packOpts); 36 let base64Helper = new util.Base64Helper(); 37 let uint8Arr = new Uint8Array(arrayBuffer); 38 let pixelStr = base64Helper.encodeToStringSync(uint8Arr); 39 40 !want.parameters && (want.parameters = {}); 41 want.parameters['ohos.extra.param.key.add_form_to_host_width'] = compInfo.size.width.toFixed(2); 42 want.parameters['ohos.extra.param.key.add_form_to_host_height'] = compInfo.size.height.toFixed(2); 43 want.parameters['ohos.extra.param.key.add_form_to_host_screenx'] = compInfo.screenOffset.x.toFixed(2); 44 want.parameters['ohos.extra.param.key.add_form_to_host_screeny'] = compInfo.screenOffset.y.toFixed(2); 45 want.parameters['ohos.extra.param.key.add_form_to_host_snapshot'] = pixelStr; 46 } catch (err) { 47 hilog.error(0x3900, tag, 'get pixelmap string error:' + err); 48 } 49} 50 51/** 52 * Build function of AddFormMenuItem. 53 * 54 * @param { Want } want - The want of the form to publish. 55 * @param { string } componentId - The id of the component used to get form snapshot. 56 * @param { AddFormOptions } [options] - Add form options. 57 * @syscap SystemCapability.ArkUI.ArkUI.Full 58 * @since 12 59 */ 60export function AddFormMenuItem(want, componentId, options, parent = null) { 61 this.observeComponentCreation2((elmtId, isInitialRender) => { 62 FormMenuItem.create(options?.style?.options ? options.style.options : { 63 startIcon: { 64 'id': 125832775, 65 'type': 20000, 66 params: ['sys.media.ic_form_menu_add'], 67 'bundleName': '', 68 'moduleName': '' 69 }, 70 content: { 71 'id': 125832726, 72 'type': 10003, 73 params: ['sys.string.ohos_add_form_to_desktop'], 74 'bundleName': '', 75 'moduleName': '' 76 } 77 }); 78 79 let uiContext = this.getUIContext(); 80 FormMenuItem.onClick(async () => { 81 await querySnapshotAsync(want, componentId, uiContext); 82 uiContext.runScopedTask(() => { 83 FormMenuItem.onRequestPublishFormWithSnapshot(want, options?.formBindingData?.data, options?.callback); 84 }); 85 }); 86 }, FormMenuItem); 87 FormMenuItem.pop(); 88} 89 90export default { AddFormMenuItem }; 91