From 371ce0dce6cef631739edd9394c58e653ed07210 Mon Sep 17 00:00:00 2001 From: libuyan Date: Fri, 10 May 2024 16:56:35 +0800 Subject: [PATCH] audio picker Signed-off-by: libuyan --- .../kits/picker/include/picker_n_exporter.h | 2 + interfaces/kits/picker/picker.js | 79 ++++++++++++------- .../kits/picker/src/modal_ui_callback.cpp | 4 + .../kits/picker/src/picker_n_exporter.cpp | 32 +++++++- 4 files changed, 87 insertions(+), 30 deletions(-) diff --git a/interfaces/kits/picker/include/picker_n_exporter.h b/interfaces/kits/picker/include/picker_n_exporter.h index 09f58890..4f442a7e 100644 --- a/interfaces/kits/picker/include/picker_n_exporter.h +++ b/interfaces/kits/picker/include/picker_n_exporter.h @@ -40,6 +40,7 @@ struct PickerCallBack { bool ready = false; int32_t resultCode; string uri; + vector uriArr; }; struct PickerAsyncContext { @@ -55,6 +56,7 @@ class PickerNExporter final : public FileManagement::LibN::NExporter { public: inline static const std::string className_ = "Picker"; static napi_value StartModalPicker(napi_env env, napi_callback_info info); + static napi_value MakeNValWithUriArr(napi_env env, const vector &uriArr); bool Export() override; std::string GetClassName() override; PickerNExporter(napi_env env, napi_value exports); diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index 88beed41..a076f6f6 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -36,6 +36,7 @@ const DocumentPickerMode = { const ExtTypes = { DOWNLOAD_TYPE: 'filePicker', + AUDIO_PICKER_TYPE: 'audioPicker', }; const PickerDetailType = { @@ -256,6 +257,23 @@ function parseDocumentPickerSelectOption(args, action) { return config; } +function parseAudioPickerSelectOption(args, action) { + let config = { + action: action, + parameters: { + extType: ExtTypes.AUDIO_PICKER_TYPE, + } + }; + if (args.length > ARGS_ZERO && typeof args[ARGS_ZERO] === 'object') { + let option = args[ARGS_ZERO]; + if ((option.maxSelectNumber !== undefined) && option.maxSelectNumber > 0) { + config.parameters.key_pick_num = option.maxSelectNumber; + } + } + console.log('modal picker: audio select config: ' + JSON.stringify(config)); + return config; +} + function getDocumentPickerSelectResult(args) { let selectResult = { error: undefined, @@ -377,9 +395,9 @@ function getModalPickerResult(args) { let saveResult = { error: undefined, data: undefined - } + }; if (args) { - var dataArr = []; + let dataArr = []; dataArr.push(args.uri); saveResult.data = dataArr; } @@ -387,6 +405,20 @@ function getModalPickerResult(args) { return saveResult; } +function getModalPickerArrResult(args) { + let saveResult = { + error: undefined, + data: undefined + }; + let dataArr = []; + if (args && args.uriArr) { + dataArr = args.uriArr; + } + saveResult.data = dataArr; + console.log('modal picker: download saveResult: ' + JSON.stringify(saveResult)); + return saveResult; +} + function getDocumentPickerSaveResult(args) { let saveResult = { error: undefined, @@ -428,7 +460,7 @@ function startModalPicker(context, config) { } gContext = context; if (pickerHelper === undefined) { - console.log('modal picker: pickerHelper undefined.') + console.log('modal picker: pickerHelper undefined.'); } let helper = pickerHelper.startModalPicker(gContext, config); if (helper === undefined) { @@ -441,10 +473,10 @@ async function modalPicker(args, context, config) { try { console.log('modal picker: config: ' + JSON.stringify(config)); let modalSaveResult = await startModalPicker(context, config); - const saveResult = getModalPickerResult(modalSaveResult); - return saveResult; + return modalSaveResult; } catch (resultError) { console.error('modal picker: Result error: ' + resultError); + return undefined; } } @@ -454,23 +486,21 @@ async function documentPickerSave(...args) { console.log('[picker] Document Save Invalid argument'); throw checkDocumentSaveArgsResult; } - let documentSaveContext = undefined; let documentSaveConfig = undefined; let documentSaveResult = undefined; let saveResult = undefined; - try { documentSaveContext = getContext(this); } catch (getContextError) { console.error('[picker] getContext error: ' + getContextError); throw getErr(ErrCode.CONTEXT_NO_EXIST); } - documentSaveConfig = parseDocumentPickerSaveOption(args, ACTION.SAVE_ACTION_MODAL); if (documentSaveConfig.parameters.pickerMode === DocumentPickerMode.DOWNLOAD) { console.log('modal picker: will start modal picker process. (DOWNLOAD)'); - saveResult = await modalPicker(args, documentSaveContext, documentSaveConfig); + let modalSaveResult = await modalPicker(args, documentSaveContext, documentSaveConfig); + saveResult = getModalPickerResult(modalSaveResult); } else { try { if (documentSaveContext === undefined) { @@ -491,7 +521,15 @@ async function documentPickerSave(...args) { console.log('[picker] document save result: ' + JSON.stringify(documentSaveResult)); saveResult = getDocumentPickerSaveResult(documentSaveResult); } + return sendResult(args, saveResult); +} + +async function sendResult(args, saveResult) { try { + if (saveResult === undefined) { + console.log('modal picker: saveResult is undefined'); + return undefined; + } if (args.length === ARGS_TWO && typeof args[ARGS_ONE] === 'function') { return args[ARGS_ONE](saveResult.error, saveResult.data); } else if (args.length === ARGS_ONE && typeof args[ARGS_ZERO] === 'function') { @@ -503,7 +541,7 @@ async function documentPickerSave(...args) { } else { reject(saveResult.error); } - }) + }); } catch (resultError) { console.error('[picker] Result error: ' + resultError); } @@ -517,7 +555,7 @@ async function audioPickerSelect(...args) { throw checkAudioArgsResult; } - const audioSelectConfig = parseDocumentPickerSelectOption(args, ACTION.SELECT_ACTION); + const audioSelectConfig = parseAudioPickerSelectOption(args, ACTION.SELECT_ACTION); console.log('[picker] audio select config: ' + JSON.stringify(audioSelectConfig)); let audioSelectContext = undefined; @@ -531,22 +569,9 @@ async function audioPickerSelect(...args) { if (audioSelectContext === undefined) { throw getErr(ErrCode.CONTEXT_NO_EXIST); } - let result = await audioSelectContext.startAbilityForResult(audioSelectConfig, {windowMode: 0}); - console.log('[picker] audio select result: ' + JSON.stringify(result)); - const audioSelectResult = getDocumentPickerSelectResult(result); - console.log('[picker] documentSelectResult: ' + JSON.stringify(audioSelectResult)); - if (args.length === ARGS_TWO && typeof args[ARGS_ONE] === 'function') { - return args[ARGS_ONE](audioSelectResult.error, audioSelectResult.data); - } else if (args.length === ARGS_ONE && typeof args[ARGS_ZERO] === 'function') { - return args[ARGS_ZERO](audioSelectResult.error, audioSelectResult.data); - } - return new Promise((resolve, reject) => { - if (audioSelectResult.data !== undefined) { - resolve(audioSelectResult.data); - } else { - reject(audioSelectResult.error); - } - }) + let modalSelectResult = await modalPicker(args, audioSelectContext, audioSelectConfig); + let saveResult = getModalPickerArrResult(modalSelectResult); + return sendResult(args, saveResult); } catch (error) { console.error('[picker] audio select error: ' + error); } diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index 97140dec..2957f82c 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -51,6 +51,10 @@ void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Wa HILOG_INFO("modal picker: downloadNewUri exit."); pickerCallBack_->uri = result.GetStringParam("downloadNewUri"); } + if (result.GetParams().HasParam("uriArr")) { + HILOG_INFO("modal picker: uriArr exit."); + pickerCallBack_->uriArr = result.GetStringArrayParam("uriArr"); + } pickerCallBack_->resultCode = resultCode; pickerCallBack_->ready = true; } diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 740f4fc9..09af3331 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -45,6 +45,27 @@ string PickerNExporter::GetClassName() return PickerNExporter::className_; } +static napi_value MakeNValWithUriArr(napi_env env, const vector &uriArr) { + if (uriArr.size() == 0) { + return nullptr; + } + napi_value jsUris = nullptr; + napi_create_array_with_length(env, uriArr.size(), &jsUris); + for(size_t i = 0; i< uriArr.size(); i++) { + HILOG_DEBUG("modal picker: uriArr[%{public}d] is %{public}s.", i, uriArr[i].c_str()); + napi_value jsUri = nullptr; + napi_status status = napi_create_string_utf8(env, uriArr[i].c_str(), NAPI_AUTO_LENGTH, &jsUri); + if (status != napi_ok) { + HILOG_ERROR("modal picker: uriArr napi_create_string_utf8 failed."); + } + if ((jsUri == nullptr) || (napi_set_element(env, jsUris, i, jsUri) != napi_ok)) { + HILOG_ERROR("modal picker: jsUri == nullptr or uriArr napi_set_element failed."); + break; + } + } + return jsUris; +} + static void StartModalPickerExecute(napi_env env, void *data) { HILOG_INFO("modal picker: StartModalPickerExecute begin"); @@ -63,10 +84,8 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat HILOG_ERROR("Async context is null"); return; } - auto jsContext = make_unique(); jsContext->status = false; - status = napi_get_undefined(env, &jsContext->data); if (status != napi_ok) { HILOG_ERROR("modal picker: napi_get_undefined jsContext->data failed"); @@ -79,7 +98,6 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat HILOG_DEBUG("modal picker: uri is %{public}s.", uri.c_str()); napi_value jsUri = nullptr; status = napi_create_string_utf8(env, uri.c_str(), NAPI_AUTO_LENGTH, &jsUri); - if (jsUri == nullptr) { HILOG_ERROR("jsUri is nullptr."); } @@ -89,6 +107,14 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat if (status != napi_ok) { HILOG_ERROR("modal picker: napi_set_named_property uri failed"); } + const vector uriArr = context->pickerCallBack->uriArr; + if (uriArr.size() > 0) { + napi_value jsUriArr = MakeNValWithUriArr(env, uriArr); + status = napi_set_named_property(env, result, "uriArr", jsUriArr); + if (status != napi_ok) { + HILOG_ERROR("modal picker: napi_set_named_property uriArr failed"); + } + } if (result != nullptr) { jsContext->data = result; jsContext->status = true; -- Gitee