* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-03-30 09:14:38\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-06-13 10:44:21\r
+ * @LastEditTime: 2024-08-26 09:44:39\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordDeleteView.h\r
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
*/\r
virtual ~RecordDeleteView();\r
static RecordDeleteView *GetInstance(void);\r
UIScrollView *RecordDeleteViewInit(void);\r
- void ClearAll(void);\r
+ void SetRecordDeleteName(const char * name);\r
\r
private:\r
UILabelExt *CreateRecordDeleteLabel(LabelConfig &labelconfig); // 设置标签\r
bool RecordDeleteScrollViewInit(void);\r
bool RecordDeleteLabelViewInit(void);\r
bool RecordDeleteButtonViewInit(void);\r
+ void ClearAll(void);\r
\r
UIScrollView *RecordDeleteViewScrollView{nullptr};\r
UILabelExt *TitleLabel{nullptr};\r
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-03-30 09:14:38\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-24 17:24:22\r
+ * @LastEditTime: 2024-08-26 16:10:38\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordListView.h\r
*/\r
#ifndef RECORD_LIST_VIEW_H\r
#include "record/include/RecordingListAdapter.h"\r
namespace OHOS\r
{\r
- static constexpr char *RECORDLISTSCROLLVIEW = "RecordListScrollView";\r
+ static constexpr const char *RECORDLISTSCROLLVIEW = "RecordListScrollView";\r
class RecordListView\r
{\r
\r
RECORDER_RESPONSE_MAX,
};
+#define MAX_RECORDING_NUM 20
+ typedef struct
+ {
+ char recordingFileName[32]; // 录音文件名
+ char recordingDuration[16]; // 录音时长
+ char recordingTime[16]; // 录音时间
+ } RecordingInfo;
+
class RecordingPlayerInterruptListener;
class RecordingModel
{
void InitRecordingListItem();
std::vector<RecordingListItem> &GetRecordinglistItems();
std::string GetCurrentPlayRecordingName(void);
- int &GetRecordingListNum();
+ int GetRecordingListNum();
+ void SetRecordingListNum(int value);
std::string GetCleanFileName(const std::string &filePath);
void SearchFiles(const std::string &directory, std::vector<std::string> &fileNames, int &mp3FileCount);
- void KeepClickRecordingIndex(int index_);
- int &GetClickRecordingIndex(void);
+ void SetClickRecordingIndex(int index_);
+ int GetClickRecordingIndex(void);
std::vector<std::string> &GetFileNames(void);
- void KeepTotalRecordDuration(std::string time);
+ void SetTotalRecordDuration(std::string time);
std::string GetTotalRecordDuration(void) const;
- std::string Getyyyymmhhh_date(void) const;
+ RecordingInfo *GetRecordingInfo();
+ void SetRecordingInfo(RecordingInfo &info, int index);
+ void UpdateRecordingInfo(int index);
+ void SetRecordFileName(std::string name);
+ std::string GetRecordFileName(void);
+ std::string Getyyyymmhhh_date(void);
std::string &Getyyyymmhhh_dateAndTotalRecordDuration(void);
std::shared_ptr<RecordingPlayerInterruptListener> GetRecordingPlayerIntrptListener(void);
void ClearActivateAudioInterrupt(void);
std::shared_ptr<Player> GetPlayerCtr(void);
void SetAudioInitStatus(bool value);
/* ----------------------------------- 定时器 ---------------------------------- */
- void Recording_StartTimer(uint32_t interval);
+ void Recording_StartTimer(uint32_t interval = 1000);
void Recording_StopTimer(void);
char *DisplayRecordDuration(void);
const char *GetRecordDirectory() const;
+ static std::string recordTempDuration; // 录音时长
+ int RecordDataWriteToFile();
+ int RecordDataReadToFile();
private:
RecordingModel();
bool isStopAndReset{false}; // 判断是否是停止还是重置状态
bool audioInitStatus{false};
/* -------------------------------------------------------------------------- */
- std::vector<std::string> fileNames; // 文件名
+ std::vector<std::string> fileNames; // 文件名数组
int RecordingMp3FileCount = 0; // 录音MP3数量
const std::string directory = "/user/userdata/recording/"; // 录音目录
- std::vector<RecordingListItem> Recordings; // 存放录音信息的动态数组
+ const std::string recordInfoFile = "/user/userdata/recording/recordinfo.bin";
+ std::vector<RecordingListItem> Recordings{0}; // 存放录音信息的动态数组
std::string recordDuration; // 录音时长
- int index; // 保存被点击录音的下标
- char *yyyymmhhh_date; // 保存年月日时间
- std::string TotalRecordDuration; // 保存录音的总时长
- std::string RecordingTimeAndDuration; // 录音日期和录音时长
+ /* -------------------------------------------------------------------------- */
+ int index; // 保存被点击录音的下标
+ std::string recordFileName; // 录音文件名
+ char *yyyymmhhh_date; // 保存年月日时间
+ std::string TotalRecordDuration; // 保存录音的总时长
+ std::string RecordingTimeAndDuration; // 录音日期和录音时长
+ RecordingInfo recordingInfo[MAX_RECORDING_NUM] = {0};
+ /* -------------------------------------------------------------------------- */
};
}
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-02-27 09:16:51\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-06-13 11:23:15\r
+ * @LastEditTime: 2024-08-26 15:23:43\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h\r
*/\r
\r
\r
static RecordingPresenter *GetInstance();\r
int convertNumericDateTime(const char *numericDateTime, char *formattedDateTime);\r
- void deleteFile(const char *filepath);\r
\r
private:\r
// 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
bool OnDrag(UIView &view, const DragEvent &event) override;\r
bool OnDragEnd(UIView &view, const DragEvent &event) override;\r
bool OnKeyAct(UIView &view, const KeyEvent &event) override;\r
+ void StartRecord(void);\r
+ void StopRecord(void);\r
RecordingModel *p_RecordingModel{nullptr};\r
};\r
}\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordDeleteView::ClearAll");\r
RecordDeleteViewScrollView->RemoveAll();\r
-\r
- delete TitleLabel;\r
- TitleLabel = nullptr;\r
-\r
- delete AttentionLabel;\r
- AttentionLabel = nullptr;\r
-\r
- delete DeleteNameLabel;\r
- DeleteNameLabel = nullptr;\r
-\r
- delete RECORD_DELETE_ON_BUTTON;\r
- RECORD_DELETE_ON_BUTTON = nullptr;\r
-\r
- delete RECORD_DELETE_OFF_BUTTON;\r
- RECORD_DELETE_OFF_BUTTON = nullptr;\r
-\r
- delete RecordDeleteViewScrollView;\r
- RecordDeleteViewScrollView = nullptr;\r
+ if (TitleLabel)\r
+ {\r
+ delete TitleLabel;\r
+ TitleLabel = nullptr;\r
+ }\r
+ if (AttentionLabel)\r
+ {\r
+ delete AttentionLabel;\r
+ AttentionLabel = nullptr;\r
+ }\r
+ if (DeleteNameLabel)\r
+ {\r
+ delete DeleteNameLabel;\r
+ DeleteNameLabel = nullptr;\r
+ }\r
+ if (RECORD_DELETE_ON_BUTTON)\r
+ {\r
+ delete RECORD_DELETE_ON_BUTTON;\r
+ RECORD_DELETE_ON_BUTTON = nullptr;\r
+ }\r
+ if (RECORD_DELETE_OFF_BUTTON)\r
+ {\r
+ delete RECORD_DELETE_OFF_BUTTON;\r
+ RECORD_DELETE_OFF_BUTTON = nullptr;\r
+ }\r
+ if (RecordDeleteViewScrollView)\r
+ {\r
+ delete RecordDeleteViewScrollView;\r
+ RecordDeleteViewScrollView = nullptr;\r
+ }\r
}\r
}\r
\r
label->SetLineBreakMode(labelconfig.lineBreakMode); // 断行模式。\r
label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);\r
+ label->SetRollSpeed(70);\r
\r
return label;\r
}\r
AttentionLabel->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));\r
RecordDeleteViewScrollView->Add(AttentionLabel);\r
/* -------------------------------------------------------------------------- */\r
- labelconfig.top = 215;\r
- labelconfig.textId = STR_AUDIO_XX;\r
- DeleteNameLabel = CreateRecordDeleteLabel(labelconfig);\r
- if (nullptr == DeleteNameLabel)\r
+ if (DeleteNameLabel == nullptr)\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordDeleteView::DeleteNameLabel is nullptr!");\r
- return false;\r
+ DeleteNameLabel = new UILabelExt();\r
+ if (DeleteNameLabel == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordDeleteView::DeleteNameLabel is nullptr!");\r
+ return false;\r
+ }\r
}\r
+ DeleteNameLabel->SetPosition(0, 0, 360, 35); // 位置大小\r
+ DeleteNameLabel->SetStyle(STYLE_TEXT_FONT, 30); // 字体大小\r
+ DeleteNameLabel->SetStyle(STYLE_LINE_HEIGHT, 35); // 字体行高\r
+ DeleteNameLabel->SetText(""); // 内容\r
+ DeleteNameLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); // 断行模式。\r
+ DeleteNameLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ DeleteNameLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
RecordDeleteViewScrollView->Add(DeleteNameLabel);\r
+ DeleteNameLabel->LayoutCenterOfParent(); // 与父视图中心对齐\r
\r
return true;\r
}\r
return RecordDeleteViewScrollView;\r
}\r
\r
+ void RecordDeleteView::SetRecordDeleteName(const char *name)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordDeleteViewInit::SetRecordDeleteName");\r
+ if (DeleteNameLabel)\r
+ {\r
+ DeleteNameLabel->SetText(name);\r
+ DeleteNameLabel->Invalidate();\r
+ }\r
+ }\r
}
\ No newline at end of file
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-02-27 09:16:50\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-24 18:35:24\r
+ * @LastEditTime: 2024-08-27 14:38:37\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp\r
*/\r
\r
void RecordListView::InitRecordingInfo(void)\r
{\r
std::vector<OHOS::RecordingListItem> &item = RecordingModel::GetInstance()->GetRecordinglistItems();\r
- for (int i = 0; i < RecordingModel::GetInstance()->GetRecordingListNum(); i++)\r
+ for (int i = 0; i < item.size(); i++)\r
{\r
AddRecordingToList(item[i]);\r
}\r
void RecordListView::RefreshRecordingListData(void)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordListView::RefreshRecordingListData");\r
- RecordingModel::GetInstance()->InitRecordingListItem(); // 这行应放到删除后调用\r
+ RecordingModel::GetInstance()->InitRecordingListItem();\r
int num = RecordingModel::GetInstance()->GetRecordingListNum();\r
if (p_RecordingListAdapter != nullptr && recordList != nullptr)\r
{\r
// 设置提醒标签是否可见\r
void RecordListView::IsVisibleLabel(bool value)\r
{\r
- if (value == true)\r
+ if (RecordListViewAttentionLabel && recordList)\r
{\r
- RecordListViewAttentionLabel->SetVisible(true);\r
- recordList->SetVisible(false); // 列表设置不可见\r
- }\r
- else\r
- {\r
- RecordListViewAttentionLabel->SetVisible(false);\r
- recordList->SetVisible(true); // 列表设置可见\r
+ if (value == true)\r
+ {\r
+ RecordListViewAttentionLabel->SetVisible(true);\r
+ recordList->SetVisible(false); // 列表设置不可见\r
+ }\r
+ else\r
+ {\r
+ RecordListViewAttentionLabel->SetVisible(false);\r
+ recordList->SetVisible(true); // 列表设置可见\r
+ }\r
}\r
}\r
\r
recordList->SetDragACCLevel(5);\r
recordList->SetSwipeACCLevel(800); /*设置手指抬起屏幕后的补偿距离。*/\r
recordList->SetReboundSize(30);\r
+ recordList->SetScrollBlankSize(30);\r
recordList->SetIntercept(true); // 设置是否拦截输入事件。如果被截获,视图在本地处理后不会将输入事件传递给父视图。\r
- // InitRecordingInfo();\r
recordList->SetAdapter(p_RecordingListAdapter);\r
- // recordList->RefreshList();\r
RecordListScrollView->Add(recordList);\r
return true;\r
}\r
#include "custom_utils.h"
#include <cmsis_os2.h>
#include <service/graphic_service.h>
+#include <cstring>
namespace OHOS
{
-
+ std::string RecordingModel::recordTempDuration = 0;
static MutexId g_mutex;
- RecordingModel::RecordingModel()
- {
- // g_mutex = MUTEX_InitValue();
- }
+ RecordingModel::RecordingModel() {}
- RecordingModel::~RecordingModel()
- {
- }
+ RecordingModel::~RecordingModel() {}
RecordingModel *RecordingModel::GetInstance(void)
{
{
char buffer[10]; // 足够存放 "00:00\0" 的字符数组
sprintf(buffer, "%02d:%02d", minutes, seconds);
- KeepTotalRecordDuration(buffer);
+ SetTotalRecordDuration(buffer);
}
else
{
char buffer[12]; // 足够存放 "00:00:00\0" 的字符数组
sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);
- KeepTotalRecordDuration(buffer);
+ SetTotalRecordDuration(buffer);
}
}
ret = PlayerCtr->GetDuration(DurationTime);
if (ret != -1)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, DurationTime, ret);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDuration:%ld, ret:%d", DurationTime, ret);
}
else
{
*/
void RecordingModel::PreviousPlayout(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
- if ((GetClickRecordingIndex() > GetRecordingListNum() - 1) || (GetClickRecordingIndex() < 0))
+ int index = GetClickRecordingIndex();
+ int num = GetRecordingListNum();
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout before index %d.", index);
+ if ((index > num - 1) || (index < 0))
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
- KeepClickRecordingIndex(0);
+ SetClickRecordingIndex(0);
return;
}
- GetClickRecordingIndex()--; // 上一曲
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
- if (GetClickRecordingIndex() < 0)
- {
- KeepClickRecordingIndex(GetRecordingListNum() - 1);
- }
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
- RecordingPlayerInit(GetClickRecordingIndex());
+ SetClickRecordingIndex(--index < 0 ? num - 1 : index); // 如果从第一首录音设置上一首,那就跳到最后一首
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout after index %d.", GetClickRecordingIndex());
SetCircleProgress(0);
}
*/
void RecordingModel::NextPlayout(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NextPlayout, index %d.", GetClickRecordingIndex());
- if ((GetClickRecordingIndex() > GetRecordingListNum() - 1) || (GetClickRecordingIndex() < 0))
+ int index = GetClickRecordingIndex();
+ int num = GetRecordingListNum();
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NextPlayout before index %d.", index);
+ if ((index > num - 1) || (index < 0))
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
- KeepClickRecordingIndex(0);
+ SetClickRecordingIndex(0);
return;
}
- GetClickRecordingIndex()++; // 下一曲
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NextPlayout, index %d.", GetClickRecordingIndex());
- if (GetClickRecordingIndex() > GetRecordingListNum() - 1)
- {
- KeepClickRecordingIndex(0);
- }
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NextPlayout, index %d.", GetClickRecordingIndex());
- RecordingPlayerInit(GetClickRecordingIndex());
+ SetClickRecordingIndex(++index > num - 1 ? 0 : index); // 如果从最后一首录音设置下一首,那就跳到第一首
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NextPlayout after index %d.", GetClickRecordingIndex());
SetCircleProgress(0);
}
*/
void RecordingModel::InitRecordingListItem(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem");
- // 获取日期
- char *yyyymmhhh_date_new = uapi_get_local_yyyymmdd_date();
- if (yyyymmhhh_date_new == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get local date");
- return; // 或者进行适当的错误处理
- }
- // 释放之前分配的日期字符串内存(如果之前有)
- if (yyyymmhhh_date != nullptr)
- {
- free(yyyymmhhh_date);
- }
- // 更新日期字符串成员
- yyyymmhhh_date = yyyymmhhh_date_new;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem");
RecordingMp3FileCount = 0;
if (!fileNames.empty())
{
Recordings.clear();
}
SearchFiles(directory, fileNames, RecordingMp3FileCount);
+ RecordDataReadToFile();
if (RecordingMp3FileCount != 0)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Total .mp3 Files Count:%d\n", RecordingMp3FileCount);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Total .mp3 Files Count:%d", RecordingMp3FileCount);
for (const auto &filename : fileNames)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "File Name::%s\n", filename.c_str());
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "File Name::%s", filename.c_str());
}
// 对 Recordings 数组进行操作
for (int i = 0; i < RecordingMp3FileCount; i++)
{
- Recordings.push_back({i, fileNames[i].c_str(), "09:51", yyyymmhhh_date});
+ for (int j = 0; j < RecordingMp3FileCount; j++)
+ {
+ if (fileNames[i] == recordingInfo[j].recordingFileName)
+ {
+ Recordings.push_back({i, recordingInfo[j].recordingFileName, recordingInfo[j].recordingDuration, recordingInfo[j].recordingTime});
+ break;
+ }
+ }
}
}
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem over!!");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem over!!");
}
/*
/*
* @brief 获取录音数量
*/
- int &RecordingModel::GetRecordingListNum(void)
+ int RecordingModel::GetRecordingListNum(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::GetRecordingListNum %d",RecordingMp3FileCount);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::GetRecordingListNum %d", RecordingMp3FileCount);
return RecordingMp3FileCount;
}
+ void RecordingModel::SetRecordingListNum(int value)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::GetRecordingListNum %d", value);
+ RecordingMp3FileCount = value;
+ }
+
/*
* @brief 保存被点击录音下标
*/
- void RecordingModel::KeepClickRecordingIndex(int index_)
+ void RecordingModel::SetClickRecordingIndex(int index_)
{
index = index_;
}
/*
* @brief 获取被点击录音下标
*/
- int &RecordingModel::GetClickRecordingIndex(void)
+ int RecordingModel::GetClickRecordingIndex(void)
{
return index;
}
}
/*
- * @brief 保存录音时长
+ * @brief 保存录音的总时长
*/
- void RecordingModel::KeepTotalRecordDuration(std::string time)
+ void RecordingModel::SetTotalRecordDuration(std::string time)
{
TotalRecordDuration = time;
}
/*
* @brief 获取录音年月日时间
*/
- std::string RecordingModel::Getyyyymmhhh_date(void) const
+ std::string RecordingModel::Getyyyymmhhh_date(void)
{
+ char *yyyymmhhh_date_new = uapi_get_local_yyyymmdd_date(); // 获取日期
+ if (yyyymmhhh_date_new == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get local date");
+ return ""; // 或者进行适当的错误处理
+ }
+ // 释放之前分配的日期字符串内存(如果之前有)
+ if (yyyymmhhh_date != nullptr)
+ {
+ free(yyyymmhhh_date);
+ }
+ // 更新日期字符串成员
+ yyyymmhhh_date = yyyymmhhh_date_new;
return yyyymmhhh_date;
}
+ RecordingInfo *RecordingModel::GetRecordingInfo()
+ {
+ return recordingInfo;
+ }
+
+ // 设置每首录音的信息
+ void RecordingModel::SetRecordingInfo(RecordingInfo &info, int index)
+ {
+ recordingInfo[index] = info;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recordingFileName = %s", recordingInfo[index].recordingFileName);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recordingDuration = %s", recordingInfo[index].recordingDuration);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recordingTime = %s", recordingInfo[index].recordingTime);
+ }
+
+ void RecordingModel::UpdateRecordingInfo(int index)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateRecordingInfo %s", recordingInfo[index].recordingFileName);
+ if (index < 0 || index > RecordingMp3FileCount)
+ {
+ return;
+ }
+ char *file_name = recordingInfo[index].recordingFileName;
+ std::string delete_filename = (directory + file_name).append(".mp3");
+ /* -------------------------------- 删除录音文件 -------------------------------- */
+ uapi_delete_files(delete_filename.c_str());
+ /* -------------------------------------------------------------------------- */
+ int i = 0;
+ for (i = index; i < (RecordingMp3FileCount - 1); i++)
+ {
+ strcpy(recordingInfo[i].recordingFileName, recordingInfo[i + 1].recordingFileName);
+ strcpy(recordingInfo[i].recordingDuration, recordingInfo[i + 1].recordingDuration);
+ strcpy(recordingInfo[i].recordingTime, recordingInfo[i + 1].recordingTime);
+
+ fileNames[i] = fileNames[i + 1];
+ }
+ RecordingMp3FileCount--;
+ RecordingInfo info = {0};
+ SetRecordingInfo(info, i);
+ fileNames[i].clear();
+ RecordDataWriteToFile();
+ }
+
+ // 设置当前的录音文件名,每次录音会更改
+ void RecordingModel::SetRecordFileName(std::string name)
+ {
+ recordFileName = name;
+ }
+
+ // 获取当前的录音文件名,每次录音会更改
+ std::string RecordingModel::GetRecordFileName(void)
+ {
+ return recordFileName;
+ }
+
/*
* @brief 获取年月日时间和录音时长
*/
std::string &RecordingModel::Getyyyymmhhh_dateAndTotalRecordDuration(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RecordingModel] Getyyyymmhhh_dateAndTotalRecordDuration\n");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RecordingModel] Getyyyymmhhh_dateAndTotalRecordDuration");
std::string yyyymmhhh_date = RecordingModel::GetInstance()->Getyyyymmhhh_date();
std::string TotalRecordDuration = RecordingModel::GetInstance()->GetTotalRecordDuration();
// 去掉日期字符串末尾的换行符
{
return directory.c_str();
}
+
+ int RecordingModel::RecordDataWriteToFile()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataWriteToFile,%d", __LINE__, RecordingMp3FileCount);
+ if (0 == RecordingMp3FileCount)
+ {
+ return OHOS_FAILURE;
+ }
+
+ FILE *fp = fopen(recordInfoFile.c_str(), "wb+");
+ if (nullptr == fp)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataWriteToFile fail", __LINE__);
+ return OHOS_FAILURE;
+ }
+
+ size_t ret = fwrite(recordingInfo, sizeof(RecordingInfo), RecordingMp3FileCount, fp);
+ if (RecordingMp3FileCount != ret)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataWriteToFile fail", __LINE__);
+ }
+ fclose(fp);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataWriteToFile success", __LINE__);
+
+ return OHOS_SUCCESS;
+ }
+
+ int RecordingModel::RecordDataReadToFile()
+ {
+ if (0 == RecordingMp3FileCount)
+ {
+ return OHOS_FAILURE;
+ }
+ FILE *fp = fopen(recordInfoFile.c_str(), "rb");
+ if (fp == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataReadToFile", __LINE__);
+ return OHOS_FAILURE;
+ }
+ fread(recordingInfo, sizeof(RecordingInfo), RecordingMp3FileCount, fp);
+ fclose(fp);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d]:RecordDataReadToFile success", __LINE__);
+ return OHOS_SUCCESS;
+ }
/* ----------------------------------- 定时器 ---------------------------------- */
// 声明定时器变量
osTimerId_t g_timer = NULL;
seconds = std::to_string(sec);
}
-#if 0
+#if 1
if (hour == 0)
{
- recordDuration = minute + ":" + seconds;
+ recordTempDuration = minute + ":" + seconds;
}
else
{
- recordDuration = hours + ":" + minute + ":" + seconds;
+ recordTempDuration = hours + ":" + minute + ":" + seconds;
}
-#endif
recordDuration = hours + ":" + minute + ":" + seconds;
+#endif
+
return (char *)recordDuration.c_str();
}
button->SetImageSrc(buttonconfig.ImageSrc, buttonconfig.ImageSrc);\r
button->SetImagePosition(20, 20);\r
button->SetStyle(STYLE_BORDER_RADIUS, 100);\r
- button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffff5a36, UIButton::PRESSED);\r
+ button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);\r
button->SetOnClickListener(clickListener);\r
return button;\r
}\r
.height = 35,\r
.fontSize = 30,\r
.lineHeigh = 35,\r
- .text = "录音3",\r
+ .text = "",\r
.lineBreakMode = UILabel::LINE_BREAK_OSCILLATION,\r
};\r
\r
labelconfig.top = 102;\r
labelconfig.fontSize = 28;\r
labelconfig.lineHeigh = 33;\r
- labelconfig.text = "2022.04.21 -20:57";\r
+ labelconfig.text = "";\r
RecordingTimeAndDuration = SetUpLabel(labelconfig);\r
if (nullptr == RecordingTimeAndDuration)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerView::RecordingTimeAndDuration is nullptr!");\r
return false;\r
}\r
+ RecordingTimeAndDuration->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));\r
return true;\r
}\r
\r
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-03-30 09:14:38\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-24 17:13:46\r
+ * @LastEditTime: 2024-08-27 17:48:39\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp\r
*/\r
\r
#include "string.h"\r
#include "record/include/RecordingPresenter.h"\r
#include <wearable_log.h>\r
-#include "../../../../../../drivers/peripheral/utils/custom_utils.h"\r
+#include "custom_utils.h"\r
#include "record/include/RecordingListitemView.h"\r
#include <service/graphic_service.h>\r
#include <unistd.h>\r
#include "record/include/RecordingModel.h"\r
+#include <cstring>\r
\r
namespace OHOS\r
{\r
p_RecordingModel->InitRecordingListItem();\r
p_RecordingModel->AudioInit();\r
Presenter<RecordingView>::OnStart();\r
- //ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);\r
+ // ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);\r
}\r
\r
void RecordingPresenter::OnPause(void)\r
{\r
Presenter<RecordingView>::OnStop();\r
p_RecordingModel->ClearRecordingPlayer();\r
- //ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);\r
+ StopRecord();\r
+\r
+ // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);\r
}\r
\r
bool RecordingPresenter::OnDrag(UIView &view, const DragEvent &event)\r
\r
switch (event.GetDragDirection())\r
{\r
- case DragEvent::DIRECTION_LEFT_TO_RIGHT:\r
+ case DragEvent::DIRECTION_LEFT_TO_RIGHT: // 右滑退出\r
switch (currentView)\r
{\r
case RECORDINGVIEW:\r
NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
break;\r
case RECORDINGPLAYERVIEW:\r
- p_RecordingView->ChangeView(RECORDINGPLAYERVIEW, RECORDINGLISTVIEW);\r
+ p_RecordingView->ChangeView(RECORDINGPLAYERVIEW, RECORDINGLISTVIEW); // 录音播放视图(subView)->录音列表视图(subView)\r
break;\r
case RECORDINGDELETEVIEW:\r
- p_RecordingView->ChangeView(RECORDINGDELETEVIEW, RECORDINGPLAYERVIEW);\r
+ p_RecordingView->ChangeView(RECORDINGDELETEVIEW, RECORDINGPLAYERVIEW); // 录音删除视图(subView)->录音播放视图(subView)\r
break;\r
case RECORDINGVOLUMESETTINGVIEW:\r
- p_RecordingView->ChangeView(RECORDINGVOLUMESETTINGVIEW, RECORDINGPLAYERVIEW);\r
+ p_RecordingView->ChangeView(RECORDINGVOLUMESETTINGVIEW, RECORDINGPLAYERVIEW); // 声音设置视图(subView)->录音播放视图(subView)\r
break;\r
default:\r
break;\r
return 1; // 转换成功\r
}\r
\r
- /*\r
- * @brief 删除文件\r
- */\r
- void RecordingPresenter::deleteFile(const char *filepath)\r
+#ifdef __cplusplus\r
+ extern "C"\r
{\r
- if (std::remove(filepath) == 0)\r
+#endif\r
+ int32_t AudioCaptureSample(int32_t argc, const char *argv[]);\r
+\r
+#ifdef __cplusplus\r
+ };\r
+#endif\r
+\r
+ /*开始录音*/\r
+ void RecordingPresenter::StartRecord(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingView StartRecord");\r
+ char *args[6] = {0};\r
+ const char *defaultArgs[6] = {"01", "mp3", "16000", "1", "16", nullptr}; // 默认参数数组\r
+ for (int i = 0; i < 5; ++i)\r
+ {\r
+ args[i] = (char *)malloc(16); // 分配内存\r
+ sprintf(args[i], "%s", defaultArgs[i]); // 设置默认参数值\r
+ }\r
+ args[5] = (char *)malloc(100); // 分配内存\r
+ /* -------------------------------------------------------------------------- */\r
+ int num = p_RecordingModel->GetRecordingListNum();\r
+ std::string recordfileNme;\r
+ if (num < 9)\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Deleted file: %s successed!", filepath);\r
+ recordfileNme = "record_0" + std::to_string(num + 1);\r
}\r
else\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to delete file!");\r
+ recordfileNme = "record_" + std::to_string(num + 1);\r
+ }\r
+ p_RecordingModel->SetRecordFileName(recordfileNme);\r
+ sprintf(args[5], "%s%s.mp3", RecordingModel::GetInstance()->GetRecordDirectory(), recordfileNme.c_str());\r
+ /* ---------------------------------- 开始录音 ---------------------------------- */\r
+ AudioCaptureSample(6, (const char **)args);\r
+ /* --------------------------------- 跳转到录音界面 -------------------------------- */\r
+ view_->ChangeView(RECORDINGVIEW, RECORDGOINGVIEW);\r
+ p_RecordingModel->Recording_StartTimer();\r
+ RecordGoingView::GetInstance()->GetRecordingDurationLabel()->SetText("00:00:00");\r
+ /* ---------------------------------- 释放内存 ---------------------------------- */\r
+ for (int i = 0; i < 6; ++i)\r
+ {\r
+ free(args[i]);\r
}\r
}\r
\r
-#ifdef __cplusplus\r
- extern "C"\r
+ // 停止录音\r
+ void RecordingPresenter::StopRecord(void)\r
{\r
-#endif\r
- int32_t AudioCaptureSample(int32_t argc, const char *argv[]);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingView StopRecord");\r
+ int32_t argc = 1;\r
+ uint8_t *argv = (uint8_t *)"stop";\r
+ AudioCaptureSample(argc, (const char **)&argv);\r
+ /* ---------------------------------- 停止定时器 --------------------------------- */\r
+ p_RecordingModel->Recording_StopTimer();\r
+ /* --------------------------------- 设置录音信息 --------------------------------- */\r
+ int index = p_RecordingModel->GetRecordingListNum(); // 保存录音的下标\r
+ std::string recordingFileName = p_RecordingModel->GetRecordFileName(); // 录音文件名\r
+ std::string yyymmhhh_date = RecordingModel::GetInstance()->Getyyyymmhhh_date(); // 保存录音年月日时间\r
+ std::string TotalRecordDuration = RecordingModel::recordTempDuration; // 录音的总时长\r
+ RecordingInfo info = {0};\r
+ strncpy_s(info.recordingFileName, 32, recordingFileName.c_str(), recordingFileName.length());\r
+ strncpy_s(info.recordingDuration, 16, TotalRecordDuration.c_str(), TotalRecordDuration.length());\r
+ strncpy_s(info.recordingTime, 16, yyymmhhh_date.c_str(), yyymmhhh_date.length());\r
+ p_RecordingModel->SetRecordingInfo(info, index);\r
+ p_RecordingModel->SetRecordingListNum(index + 1);\r
+ p_RecordingModel->RecordDataWriteToFile();\r
\r
-#ifdef __cplusplus\r
- };\r
-#endif\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingView StopRecord over!!");\r
+ }\r
\r
bool RecordingPresenter::OnClick(UIView &view, const ClickEvent &event)\r
{\r
\r
if (strcmp(view.GetViewId(), RECORD_BUTTON) == 0)\r
{\r
- char *args[6] = {0};\r
- const char *defaultArgs[6] = {"01", "mp3", "16000", "1", "16", nullptr}; // 默认参数数组\r
-\r
- for (int i = 0; i < 5; ++i)\r
- {\r
- args[i] = (char *)malloc(25); // 分配内存\r
- sprintf(args[i], "%s", defaultArgs[i]); // 设置默认参数值\r
- }\r
- args[5] = (char *)malloc(100); // 分配内存\r
-\r
- char *numericDateTime = (char *)malloc(20);\r
- uapi_get_yyyymmddhhmmss_Date(numericDateTime); // 获取形如:19700101000641格式的日期时间\r
- char formattedDateTime[80];\r
- if (convertNumericDateTime(numericDateTime, formattedDateTime))\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Formatted DateTime: %s\n", formattedDateTime);\r
- sprintf(args[5], "%s%s.mp3", RecordingModel::GetInstance()->GetRecordDirectory(), formattedDateTime);\r
- }\r
- else\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert numeric date time\n", formattedDateTime);\r
- }\r
- /* ---------------------------------- 开始录音 ---------------------------------- */\r
- AudioCaptureSample(6, (const char **)args);\r
- /* --------------------------------- 跳转到录音界面 -------------------------------- */\r
- p_RecordingView->ChangeView(RECORDINGVIEW, RECORDGOINGVIEW);\r
- p_RecordingModel->Recording_StartTimer(1000);\r
- RecordGoingView::GetInstance()->GetRecordingDurationLabel()->SetText("00:00:00");\r
- /* ---------------------------------- 释放内存 ---------------------------------- */\r
- for (int i = 0; i < 6; ++i)\r
- {\r
- free(args[i]);\r
- }\r
- free(numericDateTime);\r
- /* -------------------------------------------------------------------------- */\r
+ StartRecord();\r
return true;\r
}\r
else if (strcmp(view.GetViewId(), RECORD_GOING_BUTTON_VIEWID) == 0)\r
{\r
- int32_t argc = 1;\r
- uint8_t *argv = (uint8_t *)"stop";\r
- AudioCaptureSample(argc, (const char **)&argv);\r
- p_RecordingView->ChangeView(RECORDGOINGVIEW, RECORDINGVIEW);\r
- p_RecordingModel->Recording_StopTimer();\r
+ StopRecord();\r
+ view_->ChangeView(RECORDGOINGVIEW, RECORDINGVIEW);\r
return true;\r
}\r
- else if (strcmp(view.GetViewId(), RECORD_DELETE_ON_BUTTON_VIEWID) == 0)\r
+ else if (strcmp(view.GetViewId(), RECORD_DELETE_ON_BUTTON_VIEWID) == 0) // 若点击的是录音删除按钮\r
{\r
- std::string fileName = RecordingModel::GetInstance()->GetRecordDirectory() + p_RecordingModel->GetFileNames()[p_RecordingModel->GetClickRecordingIndex()] + ".mp3";\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fileName:%s\n", fileName.c_str());\r
- deleteFile(fileName.c_str());\r
- if (--p_RecordingModel->GetRecordingListNum() < 0)\r
- {\r
- p_RecordingModel->GetRecordingListNum() = 0;\r
- }\r
+ int index = p_RecordingModel->GetClickRecordingIndex();\r
+ // std::string delete_path = RecordingModel::GetInstance()->GetRecordDirectory();\r
+ // std::string delete_filename = p_RecordingModel->GetFileNames()[index] + ".mp3";\r
+ // std::string fileName = delete_path + delete_filename;\r
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index = %d ", index);\r
+ // uapi_delete_files(fileName.c_str());//删除录音文件\r
+ p_RecordingModel->UpdateRecordingInfo(p_RecordingModel->GetRecordingListNum() - index - 1);\r
+\r
p_RecordingView->ChangeView(RECORDINGDELETEVIEW, RECORDINGVIEW);\r
return true;\r
}\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel GetInstance fail");\r
return false;\r
}\r
- p_RecordingModel->KeepClickRecordingIndex(index);\r
+ p_RecordingModel->SetClickRecordingIndex(index);\r
/* ------------------------ 录音播放初始化,包括录音文件名,录音时间和总时长 ------------------------ */\r
if (p_RecordingModel->RecordingPlayerInit(index) != OHOS_SUCCESS)\r
{\r
return true;\r
}\r
\r
- /*\r
- * @brief 播放按钮被点击\r
- */\r
void RecordingPlayerViewOnClickListener::PlayerButtonOnClick(void)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerViewOnClickListener PlayerButtonOnClick");\r
return false;\r
}\r
\r
- if (strcmp(view.GetViewId(), RECORD_PLAY_PAUSE_CHECKBOX_VIEWID) == 0)\r
+ if (strcmp(view.GetViewId(), RECORD_PLAY_PAUSE_CHECKBOX_VIEWID) == 0) // 播放和暂停按钮被点击\r
{\r
PlayerButtonOnClick();\r
}\r
- else if (strcmp(view.GetViewId(), RECORD_PLAY_PROVE_BUTTON_VIEWID) == 0)\r
+ else if (strcmp(view.GetViewId(), RECORD_PLAY_PROVE_BUTTON_VIEWID) == 0) // 上一首按钮被点击\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player prove button being clicked!");\r
-\r
p_RecordingModel->PreviousPlayout();\r
-\r
p_RecordingPlayerView->ResetComponentStatus();\r
}\r
- else if (strcmp(view.GetViewId(), RECORD_PLAY_NEXT_BUTTON_VIEWID) == 0)\r
+ else if (strcmp(view.GetViewId(), RECORD_PLAY_NEXT_BUTTON_VIEWID) == 0) // 下一首按钮被点击\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player next button being clicked!");\r
-\r
p_RecordingModel->NextPlayout();\r
-\r
p_RecordingPlayerView->ResetComponentStatus();\r
}\r
- else if (strcmp(view.GetViewId(), RECORD_PLAY_DELETE_BUTTON_VIEWID) == 0)\r
+ else if (strcmp(view.GetViewId(), RECORD_PLAY_DELETE_BUTTON_VIEWID) == 0) // 删除按钮被点击\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player delete button being clicked!");\r
p_RecordingView->ChangeView(RECORDINGPLAYERVIEW, RECORDINGDELETEVIEW);\r
}\r
- else if (strcmp(view.GetViewId(), RECORD_PLAY_VOLUME_BUTTON_VIEWID) == 0)\r
+ else if (strcmp(view.GetViewId(), RECORD_PLAY_VOLUME_BUTTON_VIEWID) == 0) // 音量按钮被点击\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player volume button being clicked!");\r
p_RecordingView->ChangeView(RECORDINGPLAYERVIEW, RECORDINGVOLUMESETTINGVIEW);\r
}\r
return true;\r
RecordingViewScrollView[thisView] = p_RecordDeleteView->RecordDeleteViewInit();\r
container_->Add(RecordingViewScrollView[thisView]);\r
}\r
+ std::string name = RecordingModel::GetInstance()->GetCurrentPlayRecordingName();\r
+ p_RecordDeleteView->SetRecordDeleteName(name.c_str());\r
return true;\r
}\r
\r
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-03-13 17:38:18
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-24 15:42:50
+ * @LastEditTime: 2024-08-26 18:16:06
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingVolumeSettingView.cpp
*/
#include "record/include/RecordingVolumeSettingView.h"
return nullptr;
}
- p_SoundAndVibrationVolumeSettingView->GetVolumeProcess()->SetValue(ConfigModel::GetInstance()->GetSystemVolume());
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "volume:%d", AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC));
+ p_SoundAndVibrationVolumeSettingView->GetVolumeProcess()->SetValue(AudioManager::GetInstance().GetVolume(AUDIO_STREAM_MUSIC));
initViewStatus = true;
return RecordingVolumeSettingViewScrollView;