短信编辑器是不支持“退出时自动保存文字”的功能的,也没有compile option可以打开来支持。如果要支持需要进行新的设计完成这个功能,下面提供一些设计思路:
编辑器退出(Home key和Back key两种case)的时候,将短信内容保存到文件或一个全局变量(大小需要2K)。建议使用全局变量,用文件需要很多error handling会比较复杂。但是全局变量有个缺点就是关机之后信息会丢失。
1. 保存短信内容
Back Key --> 在VappComposerMainPage()::onBack() 函数的最开头部分加入保存短信的代码;
Home Key --> 在VcuiUcMainCui()::onProcessClose() 函数的结尾部分,return VFX_APP_CLOSE_ANSWER_YES 语句之前,加入保存短信的代码;
VappComposerMainPage中取text的方法: textEditorBody->getText()
VcuiUcMainCui取text的方法:m_scr->comoser_page->textEditorBody->getText()
2. 读取并恢复短信内容
在VappComposerMainPage()::onEntered() 函数的结尾部分加入读取并恢复短信的代码
设置editor的文字: textEditorBody->setText()
3. 如果希望只是新建一条新短信的时候进入编辑器才恢复之前的文字,其他情况(如:reply, forward,share picture from gallery ...)都不需要恢复之前的文字,那么需要在新建短信的时候设置一个flag,在前面提到的读取和恢复短信的代码之前检查这个flag,如果flag有置位才进行恢复操作。
设置flag的位置:在VcuiUcMainCui()::handleData() 中 语句 if(!data) 条件满足的时候,表示是新建一条短信。
补充一下,在VappComposerMainPage()::onEntered() 中去恢复保存的文字时可以使用 VappComposerMainPage()::insertTextString() 可以更方便,且不易出错,建议改用这个API。
具体修改代码如下:vapp_uc_core.cpp文件中
//-------------add code start
VfxWChar g_sms_txtbuffer[2048] = {0};
BOOL g_is_new_message = FALSE;
//-------------add code end
VfxBool VcuiUcMainCui::handleData(void* args, VfxU32 argsize)
{
VappUcEntryStruct *data = (VappUcEntryStruct *)args;
VFX_ALLOC_NEW(m_app_data, VappUcAppData, this);
m_app_data->vappUcSetAppData();
m_app_data->m_parent = (void *)this;
m_app_data->appBaseId = ucGetAppBaseId(data,this->getGroupId());
if( m_app_data->appBaseId == 0 )
{
MMI_ASSERT(0);
vappUcDeInitData();
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(STR_GLOBAL_NOT_AVAILABLE)), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
m_app_data->p_vapp_uc_asm = (VappUcAppDataAfterSerializeBuffer *)vadpAsmAlloc(getGroupId(), VAPP_UC_SERIALIZE_ASM_SIZE);
if( !(m_app_data->p_vapp_uc_asm) )
MMI_ASSERT(0);
m_app_data->main = &(m_app_data->p_vapp_uc_asm->main);
m_app_data->send_info = &(m_app_data->p_vapp_uc_asm->send_info);
m_app_data->done = &(m_app_data->p_vapp_uc_asm->done);
m_app_data->m_service_cntxt = &(m_app_data->p_vapp_uc_asm->m_service_cntxt);
memset(m_app_data->main, 0, sizeof(VappUcMainStruct));
memset(m_app_data->send_info, 0, sizeof(VappUcSendInfoStruct));
memset(m_app_data->done, 0, sizeof(VappUcDoneStruct));
memset(m_app_data->m_service_cntxt, 0, sizeof(srv_uc_cntxt_reference_struct));
if( VFX_FALSE == m_app_data->getServiceContext() )
{
vappUcDeInitData();
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(STR_GLOBAL_NOT_AVAILABLE)), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
#ifdef __MMI_COSMOS_UC_VOLUNTEER_FREE_SUPPORT__
vappUcResetSerialize(m_app_data->main->instance);
#endif
#ifdef __MMI_COSMOS_UC_END_KEY_SAVE_SUPPORT__
EndKeyHandle[m_app_data->main->instance].EndKeyAppData = m_app_data;
#endif
m_app_data->m_service_cntxt->main->app_id = getGroupId();
{
/*kuldeep_gplus*/
VfxS16 error;
U8 get_sim_id = 0;
ReadValue(NVRAM_UC_APP_PREFER_SIM, &get_sim_id, DS_BYTE, &error);
m_app_data->nvram_sim_id = (srv_uc_sim_id)get_sim_id ;
}
if(m_app_data->m_service_cntxt->send_info->action != SRV_UC_ACTION_IDLE)
{
vappUcDisplayPopup((WCHAR*)((UI_string_type) GetString(STR_GLOBAL_NOT_AVAILABLE)), MMI_NMGR_BALLOON_TYPE_FAILURE);
vappUcDeInitData();
return VFX_FALSE;
}
m_app_data->m_signalTerminate.connect(m_app_data, &VappUcAppData::vappUcTerminateWithPopup);
m_app_data->m_signalTerminateWtPopUp.connect(this, &VcuiUcMainCui::vappUcTerminate);
m_app_data->main->max_text_limit = UC_MMS_MAX_TEXT_CHAR_COUNT;
#ifdef __MMI_EMAIL__
if (data && data->edit_mode == SRV_UC_MMS_EDIT_MODE_EMAIL)
{
m_app_data->main->max_text_limit = UC_EMAIL_MAX_TEXT_CHAR_COUNT;
}
#endif
m_app_data->m_useSecondStage = VFX_TRUE;
g_is_new_message = FALSE;//---------------owner add code
if(!data) /* WRITE MESSAGE only from UM*/
{
g_is_new_message = TRUE;//-----------------owner add code
m_app_data->m_useSecondStage = VFX_FALSE;
m_app_data->m_service_cntxt->main->state = SRV_UC_STATE_WRITE_NEW_MSG;
m_app_data->resetApp();
m_app_data->m_service_cntxt->msg_type->setting_msg_type = srv_uc_get_setting_msg_type();
m_app_data->m_service_cntxt->msg_type->curr_msg_type = m_app_data->m_service_cntxt->msg_type->setting_msg_type;
#ifdef __MMI_MMS_STANDALONE_COMPOSER__
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_MMS_ONLY;
#else /* __MMI_MMS_STANDALONE_COMPOSER__ */
#ifndef __MMI_MMS_2__
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_SMS_ONLY;
#else
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_DEFAULT;
#endif
#endif /* __MMI_MMS_STANDALONE_COMPOSER__ */
m_app_data->m_service_cntxt->msg_type->backup_msg_type = SRV_UC_MSG_TYPE_DEFAULT;
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
VfxS32 result = srv_uc_check_uc_folder(m_app_data->main->instance);
if (result < 0)
{
//vappUcTerminate();
vappUcDeInitData();
//vappUcDisplayPopup((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
if(m_app_data->m_service_cntxt->main->state != SRV_UC_STATE_WRITE_NEW_MSG)
{
/* TODO: Show progressing screen */
}
srv_uc_get_sms_setting(m_app_data->main->instance);
if(!m_app_data->getMmsSetting())
{
vappUcDeInitData();
return VFX_FALSE;
}
}
else if(data->type == SRV_UC_STATE_WRITE_NEW_MSG || /* WRITE MESSAGE from any application */
(data->info_type == SRV_UC_INFO_TYPE_EMAIL && data->type == SRV_UC_STATE_EDIT_EXISTED_MSG ) ||
(data->info_type == SRV_UC_INFO_TYPE_SMS_TEMPLATE && data->type == SRV_UC_STATE_EDIT_EXISTED_MSG ) )
//else if(data->file_path) /* WRITE MESSAGE from filemanager */
{
#ifdef __MMI_MESSAGES_TEMPLATE__
if(data->operation == UC_OPERATION_WRITE_NEW_SMS_TEMPLATE)
{
m_app_data->operation_type = (vappUcMsgOperationEnum)UC_OPERATION_WRITE_NEW_SMS_TEMPLATE;
m_app_data->m_service_cntxt->msg_type->setting_msg_type = SRV_UC_MSG_TYPE_SMS_PREFER;
m_app_data->m_service_cntxt->msg_type->curr_msg_type = SRV_UC_MSG_TYPE_SMS_PREFER;
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_SMS_ONLY;
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
m_app_data->main->max_text_limit = SRV_SMS_TEMPLATE_MAX_CHAR_NUM;
VfxS32 result = srv_uc_check_uc_folder(m_app_data->main->instance);
if (result < 0)
{
//vappUcTerminate();
vappUcDeInitData();
//vappUcDisplayPopup((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
srv_uc_get_sms_setting(m_app_data->main->instance);
if(!m_app_data->getMmsSetting())
{
vappUcDeInitData();
return VFX_FALSE;
}
}
else
#endif
#ifdef __MMI_MMS_TEMPLATE_SUPPORT__
if(data->operation == UC_OPERATION_WRITE_NEW_MMS_TEMPLATE)
{
/* Create a new MMS Template */
m_app_data->operation_type = (vappUcMsgOperationEnum)UC_OPERATION_WRITE_NEW_MMS_TEMPLATE;
m_app_data->m_service_cntxt->msg_type->setting_msg_type = SRV_UC_MSG_TYPE_MMS_PREFER;
m_app_data->m_service_cntxt->msg_type->curr_msg_type = SRV_UC_MSG_TYPE_MMS_PREFER;
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_MMS_ONLY;
VfxS32 result = srv_uc_check_uc_folder(m_app_data->main->instance);
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
if (result < 0)
{
//vappUcTerminate();
vappUcDeInitData();
//vappUcDisplayPopup((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
srv_uc_get_sms_setting(m_app_data->main->instance);
if(!m_app_data->getMmsSetting())
{
vappUcDeInitData();
return VFX_FALSE;
}
}
else
#endif
if(data->info_type == SRV_UC_INFO_TYPE_EMAIL && data->type == SRV_UC_STATE_EDIT_EXISTED_MSG )
{
#ifdef __MMI_EMAIL__
m_app_data->m_service_cntxt->msg_type->MMS_edit_mode = (srv_uc_MMS_edit_mode_enum)data->edit_mode;
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
if (m_app_data->m_service_cntxt->msg_type->MMS_edit_mode == SRV_UC_MMS_EDIT_MODE_EMAIL)
{
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_MMS_ONLY;
}
#endif /* __MMI_EMAIL__ */
if(!m_app_data->ucEntryWriteMsgWithContent(data))
{
vappUcDeInitData();
return VFX_FALSE;
}
}
else if(data->operation == UC_OPERATION_EDIT_SMS_TEMPLATE)
{
#ifdef __MMI_MESSAGES_TEMPLATE__
m_app_data->m_service_cntxt->msg_type->MMS_edit_mode = (srv_uc_MMS_edit_mode_enum)data->edit_mode;
m_app_data->m_service_cntxt->main->state = SRV_UC_STATE_EDIT_EXISTED_MSG;
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_SMS_ONLY;
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
m_app_data->operation_type = data->operation;
m_app_data->main->max_text_limit = SRV_SMS_TEMPLATE_MAX_CHAR_NUM;
if(!m_app_data->ucEntryWriteMsgWithContent(data))
{
vappUcDeInitData();
return VFX_FALSE;
}
#endif
}
else
{
m_app_data->m_service_cntxt->msg_type->MMS_edit_mode = (srv_uc_MMS_edit_mode_enum)data->edit_mode;
m_app_data->m_service_cntxt->main->state = SRV_UC_STATE_WRITE_NEW_MSG;
if(data->launch_mode != UC_LAUNCH_MODE_NONE)
{
m_app_data->m_service_cntxt->send_info->send_sim_id = data->sim_id;
}
else
{
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
}
m_app_data->operation_type = data->operation;
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = data->msg_type;
m_app_data->main->launch_mode = data->launch_mode;
if(!m_app_data->ucEntryWriteMsgWithContent(data))
{
vappUcDeInitData();
return VFX_FALSE;
}
}
}
#ifdef __MMI_MMS_2__
else if(data->info_type == SRV_UC_INFO_TYPE_MMS)
{
m_app_data->resetApp();
m_app_data->m_service_cntxt->main->state = (srv_uc_state_enum)srv_uc_convert_mms_app_mode_to_uc_state(data->mode);
if (m_app_data->m_service_cntxt->main->state == SRV_UC_STATE_FORWARD)
{
m_app_data->m_service_cntxt->main->mode = SRV_UC_FORWARD_WITHOUT_EDIT_MODE;
m_app_data->m_service_cntxt->main->state = SRV_UC_STATE_EDIT_EXISTED_MSG;
}
else if (m_app_data->m_service_cntxt->main->state == SRV_UC_STATE_SEND)
{
m_app_data->send_info->curr_folder = (U16) mma_get_box(data->msg_id);
}
m_app_data->m_service_cntxt->send_info->existed_msg_id = data->msg_id;
m_app_data->send_info->existed_msg_storage = (mma_msg_storage_type_enum) data->curr_storage;
m_app_data->m_service_cntxt->send_info->existed_msg_type = SRV_UC_MSG_TYPE_MMS_PREFER;
if (m_app_data->m_service_cntxt->main->state == SRV_UC_STATE_REPLY || m_app_data->m_service_cntxt->main->state == SRV_UC_STATE_REPLY_ALL)
{
m_app_data->m_service_cntxt->send_info->send_sim_id = srv_uc_convert_sim_id(data->sim_id);
}
else
{
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
}
m_app_data->operation_type = data->operation;
m_app_data->main->launch_mode = data->launch_mode;
m_app_data->m_service_cntxt->msg_type->setting_msg_type = srv_uc_get_setting_msg_type();
m_app_data->m_service_cntxt->msg_type->curr_msg_type = m_app_data->m_service_cntxt->msg_type->setting_msg_type;
#ifdef __MMI_MMS_STANDALONE_COMPOSER__
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_MMS_ONLY;
#else
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_DEFAULT;
#endif
m_app_data->m_service_cntxt->msg_type->backup_msg_type = SRV_UC_MSG_TYPE_DEFAULT;
#ifdef __MMI_MMS_TEMPLATE_SUPPORT__
if(m_app_data->operation_type == UC_OPERATION_EDIT_MMS_TEMPLATE)
{
m_app_data->m_service_cntxt->msg_type->caller_specific_msg_type = SRV_UC_MSG_TYPE_MMS_ONLY;
}
#endif
#if /*__MMI_OP01_202_MMS_REPLY_BY_SMS_MMS_SUPPORT__*/ 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif /* __MMI_OP01_202_MMS_REPLY_BY_SMS_MMS_SUPPORT__ */
VfxS32 result = srv_uc_check_uc_folder(m_app_data->main->instance);
if (result < 0)
{
//vappUcTerminate();
vappUcDeInitData();
//vappUcDisplayPopup((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
m_app_data->m_signalTerminate.postEmit((WCHAR*)((UI_string_type) GetString(srv_fmgr_fs_error_get_string(result))), MMI_NMGR_BALLOON_TYPE_FAILURE);
return VFX_FALSE;
}
m_app_data->main->busy_getting_data = 1;
if(!m_app_data->getMmsSetting())
{
vappUcDeInitData();
return VFX_FALSE;
}
}
#endif
else if(data->info_type == SRV_UC_INFO_TYPE_SMS)
{
/* TODO: Show progress screen */
VFX_SYS_ALLOC_MEM(m_app_data->otherAppTempUcInfo, sizeof(VappUcEntryStruct));
if(m_app_data->otherAppTempUcInfo)
{
memset(m_app_data->otherAppTempUcInfo, 0, sizeof(VappUcEntryStruct));
}
else
{
ASSERT(0);
}
m_app_data->m_service_cntxt->send_info->send_sim_id = vappUcGetCurrSimId();
m_app_data->main->busy_getting_data = 1;
m_app_data->ucSmsMsgOperationTrigger(data);
}
/* else if(data->info_type == SRV_UC_INFO_TYPE_EMAIL)
{
VFX_SYS_ALLOC_MEM(m_app_data->otherAppTempUcInfo, sizeof(VappUcEntryStruct));
if(m_app_data->otherAppTempUcInfo)
{
memset(m_app_data->otherAppTempUcInfo, 0, sizeof(VappUcEntryStruct));
}
else
{
ASSERT(0);
}
m_app_data->main->busy_getting_data = 1;
m_app_data->ucSmsMsgOperationTrigger(data);
} */
vappUcDeInitData();
return VFX_TRUE;
}
#ifdef __MMI_MMS_USE_ASM__
VfxAppCloseAnswerEnum VcuiUcMainCui::onProcessClose(VfxAppCloseOption options)
{
m_inCloseProcess = VFX_TRUE;
if(m_app_data)
{
if(isWaitToBeClose())
{
return VFX_APP_CLOSE_ANSWER_LATER;
}
}
m_inCloseProcess = VFX_FALSE;
//------------add code start
if(g_is_new_message)
{
mmi_ucs2ncpy((S8*)g_sms_txtbuffer, (S8*)(m_app_data->m_service_cntxt->main->text_buffer), 2048);
}
g_is_new_message = FALSE;
//-------------add code end
return VFX_APP_CLOSE_ANSWER_YES;
}
vapp_uc_screen.cpp文件
//add code start
extern VfxWChar g_sms_txtbuffer[2048];
extern BOOL g_is_new_message;
//add code end
void VappComposerMainPage::onEntered()
{
VfxPage::onEntered();
if( NULL != composer_form)
composer_form->setIsAnimEnabled(VFX_TRUE);
//add owner code
if(g_is_new_message)
{
insertTextString(g_sms_txtbuffer,TRUE);
}
//add owner code
}
void VappComposerMainPage::onBack(void)
{
VcpContactSelector* recipientHead= m_contactSelectorTo;
VcpTextEditor* r_editor = NULL;
VappUCMainScr* scr = (VappUCMainScr*)getMainScr();
VappUcAppData* app = (VappUcAppData*)(scr->m_app_data);
srv_uc_address_group_type_enum type = (srv_uc_address_group_type_enum)app->getContactInsertType();
switch(type)
{
case SRV_UC_ADDRESS_GROUP_TYPE_TO:
recipientHead = m_contactSelectorTo;
break;
case SRV_UC_ADDRESS_GROUP_TYPE_CC:
recipientHead = m_contactSelectorCc;
break;
case SRV_UC_ADDRESS_GROUP_TYPE_BCC:
recipientHead = m_contactSelectorBcc;
break;
}
if(recipientHead)
{
r_editor = recipientHead->getInputbox();
r_editor->deleteAll();
r_editor->setEnterKeyEnabled(VFX_FALSE);
}
if( NULL != composer_form)
composer_form->setIsAnimEnabled(VFX_FALSE);
app->main->skip_save_on_deinit = VFX_FALSE;
//--------------add code
if(g_is_new_message)
{
mmi_ucs2ncpy((S8*)g_sms_txtbuffer, (S8*)textEditorBody->getText(), 2048);
}
g_is_new_message = FALSE;
//--------------add code
VfxPage::onBack();
}