Toggle navigation
Toggle navigation
This project
Loading...
Sign in
developOne
/
harmonyPool
Go to a project
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
xugenyuan
2024-06-06 18:29:55 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
9b0e2c494fb1a8ac8f3fb97ed80b48f59573eb56
9b0e2c49
1 parent
7ba266e4
ref |> 早晚报桌面组件图片显示相关逻辑
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
279 additions
and
34 deletions
sight_harmony/commons/wdKit/Index.ets
sight_harmony/commons/wdKit/src/main/ets/utils/CrptoUtils.ets
sight_harmony/commons/wdKit/src/main/ets/utils/FileUtils.ets
sight_harmony/products/phone/src/main/ets/dailynewspaperformability/DailyNewspaperFormAbility.ets
sight_harmony/products/phone/src/main/ets/dailynewspaperformability/NewspaperDataFetcher.ets
sight_harmony/products/phone/src/main/ets/dailynewspaperwidget/common/NewspaperWidgetData.ets
sight_harmony/products/phone/src/main/ets/dailynewspaperwidget/pages/DailyNewspaperWidgetCard.ets
sight_harmony/products/phone/src/main/resources/base/profile/form_config.json
sight_harmony/commons/wdKit/Index.ets
View file @
9b0e2c4
...
...
@@ -68,3 +68,7 @@ export { FastClickUtil } from './src/main/ets/utils/FastClickUtil';
// export { PublicPopupDialogView } from "./src/main/ets/pubComps/dialog/PublicPopupDialogView"
export { PublicDialogManager, CloseAction } from "./src/main/ets/pubComps/dialog/PublicDialogManager"
export { CrptoUtils } from "./src/main/ets/utils/CrptoUtils"
export { FileUtils } from "./src/main/ets/utils/FileUtils"
\ No newline at end of file
...
...
sight_harmony/commons/wdKit/src/main/ets/utils/CrptoUtils.ets
0 → 100644
View file @
9b0e2c4
import cryptoFramework from '@ohos.security.cryptoFramework';
import buffer from '@ohos.buffer';
export class CrptoUtils {
static md5(message: string) : Promise<string> {
return CrptoUtils.mdFunc(message, 'MD5')
}
static mdFunc(message: string, algoName: string = 'MD5'): Promise<string> {
return new Promise<string>(async (reslove, fail) => {
try {
let md = cryptoFramework.createMd(algoName);
// 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制
await md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) });
let mdResult = await md.digest();
// console.info('Md result:' + mdResult.data);
// const string = mdResult.data.map((charCode, index, array) => {
// return String.fromCharCode(charCode)
// }).join("")
let string = "";
for (let i = 0; i < mdResult.data.length; i++) {
string += mdResult.data[i].toString(16).padStart(2, "0")
}
// const string = mdResult.data.join('')
reslove(string)
} catch (e) {
fail(e)
}
})
}
}
...
...
sight_harmony/commons/wdKit/src/main/ets/utils/FileUtils.ets
0 → 100644
View file @
9b0e2c4
import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
export class FileUtils {
// 文件是否存在,忽略错误
static fileExsit(path: string) : Promise<boolean> {
return new Promise((reslove, fail) => {
fs.stat(path).then(() => {
reslove(true)
}).catch((error: BusinessError) => {
if (error.code = 13900002) {
reslove(false)
} else {
reslove(true)
}
})
});
}
static makeDirIfNotExsit(path: string) : Promise<void> {
return new Promise((reslove, fail) => {
fs.stat(path).then(() => {
reslove()
}).catch((error: BusinessError) => {
if (error.code = 13900002) {
fs.mkdirSync(path)
}
reslove()
})
})
}
}
\ No newline at end of file
...
...
sight_harmony/products/phone/src/main/ets/dailynewspaperformability/DailyNewspaperFormAbility.ets
View file @
9b0e2c4
import { formBindingData, FormExtensionAbility, formInfo, formProvider } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';
import { Logger, NetworkManager, SPHelper, StringUtils } from 'wdKit/Index';
import {
FileUtils,
Logger, NetworkManager, SPHelper, StringUtils } from 'wdKit/Index';
import { BusinessError } from '@kit.BasicServicesKit';
import {
FormDataType,
NewspaperDataFetcher } from './NewspaperDataFetcher';
import { NewspaperDataFetcher } from './NewspaperDataFetcher';
import { JSON } from '@kit.ArkTS';
import { FormNewspaperPaperType } from '../dailynewspaperwidget/common/NewspaperWidgetData';
import { FormNewspaper
Data, FormNewspaper
PaperType } from '../dailynewspaperwidget/common/NewspaperWidgetData';
import { HostEnum, HostManager, WDHttp } from 'wdNetwork/Index';
import fs from '@ohos.file.fs';
const TAG = "DailyNewspaperFormAbility"
export default class DailyNewspaperFormAbility extends FormExtensionAbility {
lastDatas: Record<string, FormNewspaperData> = {}
onAddForm(want: Want) {
Logger.debug(TAG, "onAddForm with " + JSON.stringify(want))
...
...
@@ -20,18 +23,11 @@ export default class DailyNewspaperFormAbility extends FormExtensionAbility {
let isTempCard = want.parameters[formInfo.FormParam.TEMPORARY_KEY] as boolean
if (isTempCard === false) { // 如果为常态卡片,直接进行信息持久化
Logger.debug(TAG, "开始刷新数据");
NewspaperDataFetcher.refreshDailyPaper().then((data) => {
let formData = formBindingData.createFormBindingData(data);
formProvider.updateForm(formId, formData).catch((err: BusinessError) => {
Logger.debug(TAG, ` xFailed to updateForm. Code: ${err.code}, message: ${err.message}`);
});
})
this.fetchAndRefreshData(formId)
}
}
let obj: Form
DataType = {}
let obj: Form
NewspaperData = {} as FormNewspaperData
obj.paperType = FormNewspaperPaperType.unknown
let formData = formBindingData.createFormBindingData(obj);
return formData;
...
...
@@ -45,13 +41,9 @@ export default class DailyNewspaperFormAbility extends FormExtensionAbility {
onUpdateForm(formId: string) {
// 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能,则提供方需要重写该方法以支持数据更新
Logger.debug(TAG, 'onUpdateForm ' + formId);
NewspaperDataFetcher.refreshDailyPaper().then((data) => {
let formData = formBindingData.createFormBindingData(data);
formProvider.updateForm(formId, formData).catch((err: BusinessError) => {
Logger.debug(TAG, ` xFailed to updateForm. Code: ${err.code}, message: ${err.message}`);
});
})
this.initApp()
this.fetchAndRefreshData(formId)
}
onFormEvent(formId: string, message: string) {
...
...
@@ -61,7 +53,9 @@ export default class DailyNewspaperFormAbility extends FormExtensionAbility {
onRemoveForm(formId: string) {
// 当对应的卡片删除时触发的回调,入参是被删除的卡片ID
Logger.debug(TAG, 'onRemoveForm');
Logger.debug(TAG, 'onRemoveForm / formId: ' + formId);
let data = this.lastDatas[formId]
NewspaperDataFetcher.closeFilesWith(data)
}
// onConfigurationUpdate(config: Configuration) {
...
...
@@ -75,6 +69,32 @@ export default class DailyNewspaperFormAbility extends FormExtensionAbility {
return formInfo.FormState.READY;
}
fetchAndRefreshData(formId: string) {
Logger.debug(TAG, "开始刷新数据");
NewspaperDataFetcher.refreshDailyPaper().then(async (data) => {
let formData = formBindingData.createFormBindingData(data);
formProvider.updateForm(formId, formData).then(() => {
this.lastDatas[formId] = data
}).catch((err: BusinessError) => {
Logger.debug(TAG, ` xFailed to updateForm. Code: ${err.code}, message: ${err.message}`);
});
let fileDir = this.context.getApplicationContext().filesDir + "/widget-daily-newspaper"
await FileUtils.makeDirIfNotExsit(fileDir)
NewspaperDataFetcher.dealWithPictures(data, formId, fileDir, (data) => {
Logger.debug(TAG, `refresh ui with new pictuers`);
let formData = formBindingData.createFormBindingData(data);
formProvider.updateForm(formId, formData).then(() => {
this.lastDatas[formId] = data
}).catch((err: BusinessError) => {
Logger.error(TAG, ` xFailed to updateForm. Code: ${err.code}, message: ${err.message}`);
});
})
})
}
initApp() {
// KV存储
SPHelper.init(this.context);
...
...
sight_harmony/products/phone/src/main/ets/dailynewspaperformability/NewspaperDataFetcher.ets
View file @
9b0e2c4
import { CompInfoBean, ContentDTO, PageInfoBean } from 'wdBean/Index';
import { MorningEveningViewModel } from 'wdComponent/Index';
import { Logger } from 'wdKit/Index';
import {
CrptoUtils, FileUtils,
Logger } from 'wdKit/Index';
import { HttpUrlUtils, ResponseDTO, WDHttp } from 'wdNetwork/Index';
import { DeepLinkUtil } from 'wdShare/Index'
import { FormNewspaperPaperType, FormNewspaperPaperInfo, FormNewspaperPaperContent } from "../dailynewspaperwidget/common/NewspaperWidgetData"
import { FormNewspaperPaperType, FormNewspaperPaperInfo, FormNewspaperPaperContent,
FormNewspaperData } from "../dailynewspaperwidget/common/NewspaperWidgetData"
import { http } from '@kit.NetworkKit';
import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
import { JSON } from '@kit.ArkTS';
const TAG = "NewspaperDataFetcher"
export type FormDataType = Record<string, FormNewspaperPaperType | FormNewspaperPaperInfo | FormNewspaperPaperContent[]>
//
export type FormDataType = Record<string, FormNewspaperPaperType | FormNewspaperPaperInfo | FormNewspaperPaperContent[]>
export class NewspaperDataFetcher {
public static async refreshDailyPaper(): Promise<FormDataType> {
return new Promise<FormDataType>(async (reslove, fail) => {
public static async refreshDailyPaper(): Promise<FormNewspaperData> {
return new Promise<FormNewspaperData>(async (reslove, fail) => {
let data: Form
DataType = { 'paperType': FormNewspaperPaperType.unknown }
let data: Form
NewspaperData = new FormNewspaperData()
data.paperInfo = { showLeftImage: false }
try {
let page: PageInfoBean = await MorningEveningViewModel.getDailyPaperTopic()
data.paperType = page.topicInfo?.
frontFlag
|| FormNewspaperPaperType.unknown
data.paperType = page.topicInfo?.
topicPattern
|| FormNewspaperPaperType.unknown
let currentTime = new Date().getTime()
let compInfo = await MorningEveningViewModel.getMorningEveningCompInfo(
...
...
@@ -29,7 +34,7 @@ export class NewspaperDataFetcher {
page.topicInfo?.topicId
)
if (page.topicInfo.frontLinkObject) {
if (page.topicInfo
?.frontFlag && page.topicInfo
.frontLinkObject) {
data.paperInfo.showLeftImage = true
data.paperInfo.leftImageUrl = page.topicInfo.frontLinkObject.coverUrl
data.paperInfo.leftTitle = page.topicInfo.frontLinkObject.title
...
...
@@ -60,7 +65,7 @@ export class NewspaperDataFetcher {
})
}
static fakeData(): Form
DataType
{
static fakeData(): Form
NewspaperData
{
let data : FormNewspaperPaperContent = {
title: "标题标题标题标题标题标题标题标题",
coverUrl: "https://"
...
...
@@ -72,6 +77,135 @@ export class NewspaperDataFetcher {
leftTitle: "leftTitleleftTitleleftTitleleftTitleleftTitleleftTitle"
},
"paperContents": [data, data, data]
} as FormNewspaperData
}
static dealWithPictures(data: FormNewspaperData, formId: string ,tempDir: string, refreshCallback:(data: FormNewspaperData) => void) {
let donwloadCount = data.paperContents.filter((value) => {
return value.coverUrl && value.coverUrl.length > 0
}).length
let fileFDs: Record<string, string | number> = {};
if (data.paperInfo.leftImageUrl) {
donwloadCount += 1
CrptoUtils.md5(data.paperInfo.leftImageUrl).then((md5String) => {
const fileName = formId + "file" + md5String;
const filePath = tempDir + "/" + fileName
NewspaperDataFetcher.downloadUrlToPath(data.paperInfo.leftImageUrl!, filePath).then(() => {
let file = fs.openSync(filePath)
fileFDs[fileName] = file.fd
data.paperInfo.localLeftImageFileName = fileName
data.formImages = fileFDs
if (--donwloadCount == 0) { refreshCallback(data) }
}).catch((e : BusinessError) => {
Logger.debug(TAG, "download file failed.");
if (--donwloadCount == 0) { refreshCallback(data) }
})
}).catch((e: BusinessError) => {
if (--donwloadCount == 0) { refreshCallback(data) }
})
}
for (let index = 0; index < data.paperContents.length; index++) {
const content = data.paperContents[index];
if (!content.coverUrl || content.coverUrl.length == 0) {
continue
}
CrptoUtils.md5(content.coverUrl).then((md5String) => {
const fileName = formId + "file" + md5String;
const filePath = tempDir + "/" + fileName
NewspaperDataFetcher.downloadUrlToPath(content.coverUrl!, filePath).then(() => {
Logger.debug(TAG, "open file for display ");
let file = fs.openSync(filePath)
fileFDs[fileName] = file.fd
data.paperContents[index].localCoverFileName = fileName
data.formImages = fileFDs
if (--donwloadCount == 0) { refreshCallback(data) }
}).catch((e : BusinessError) => {
Logger.debug(TAG, "download file failed." + JSON.stringify(e));
if (--donwloadCount == 0) { refreshCallback(data) }
})
}).catch((e: BusinessError) => {
if (--donwloadCount == 0) { refreshCallback(data) }
})
}
}
static closeFilesWith(data?: FormNewspaperData) {
if (data && data.formImages) {
for (const obj of Object.entries(data.formImages)) {
const fileName = obj[0]
let fd: number = obj[1] as number
fs.close(fd)
}
}
}
static downloadUrlToPath(url: string, toFilePath: string): Promise<void> {
Logger.debug(TAG, "will donwload url:" + url + " ======> " + toFilePath);
return new Promise((reslove, fail) => {
FileUtils.fileExsit(toFilePath).then((exsit: boolean) => {
if (exsit) {
Logger.debug(TAG, "file is exsit. " + toFilePath);
reslove()
return
}
NewspaperDataFetcher.downloadUrlToPathWithout(url, toFilePath).then(() => {
reslove()
}).catch((e: BusinessError) => {
fail(e)
})
}).catch((e: BusinessError) => {
NewspaperDataFetcher.downloadUrlToPathWithout(url, toFilePath).then(() => {
reslove()
}).catch((e: BusinessError) => {
fail(e)
})
})
})
}
static downloadUrlToPathWithout(url: string, toFilePath: string): Promise<void> {
Logger.debug(TAG, "will donwload url:" + url + " ======> " + toFilePath);
return new Promise((reslove, fail) => {
let httpRequest = http.createHttp()
httpRequest.request(url, (err, data) => {
if (!err && data.responseCode == http.ResponseCode.OK) {
let imgFile = fs.openSync(toFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let wroteLength = 0
fs.write(imgFile.fd, data.result as ArrayBuffer).then((writeLen: number) => {
Logger.debug(TAG, "write data to file succeed and size is:" + writeLen);
wroteLength = writeLen
}).catch((err: BusinessError) => {
Logger.error(TAG, "write data to file failed with error message: " + err.message + ", error code: " + err.code);
}).finally(() => {
fs.closeSync(imgFile);
httpRequest.destroy()
wroteLength > 0 ? reslove() : fail("failed")
});
return
}
httpRequest.destroy()
fail("failed")
});
})
}
}
\ No newline at end of file
...
...
sight_harmony/products/phone/src/main/ets/dailynewspaperwidget/common/NewspaperWidgetData.ets
View file @
9b0e2c4
...
...
@@ -11,6 +11,8 @@ export class FormNewspaperPaperInfo {
showLeftImage: boolean = false
leftImageUrl?: string
localLeftImageFileName?: ResourceStr // 传递图片用
localLeftImageFileFD? : number // 传递图片用
leftTitle?: string
leftDeepLink?: string
...
...
@@ -20,5 +22,15 @@ export class FormNewspaperPaperInfo {
export class FormNewspaperPaperContent {
title: string = ""
coverUrl?: string
localCoverFileName?: ResourceStr // 传递图片用
localCoverFileFD? : number // 传递图片用
deepLink: string = ""
}
export class FormNewspaperData {
paperType: FormNewspaperPaperType = FormNewspaperPaperType.unknown
paperInfo: FormNewspaperPaperInfo = {} as FormNewspaperPaperInfo
paperContents: FormNewspaperPaperContent[] = []
formImages: Record<string, string | number> = {}
}
\ No newline at end of file
...
...
sight_harmony/products/phone/src/main/ets/dailynewspaperwidget/pages/DailyNewspaperWidgetCard.ets
View file @
9b0e2c4
...
...
@@ -43,8 +43,8 @@ struct DailyNewspaperWidgetCard {
@Builder leftImageView() {
Stack({ alignContent: Alignment.Bottom }) {
Image(this.paperInfo.leftImageUrl)
// Image($r("app.media.desktop_card_comp_place_holder_16_9"))
Image("memory://" + this.paperInfo.localLeftImageFileName)
// Image(this.paperInfo.leftImageUrl)
.alt($r("app.media.desktop_card_comp_place_holder_16_9"))
.objectFit(ImageFit.Cover)
.aspectRatio(87/116)
...
...
@@ -109,8 +109,8 @@ struct ContentCellView {
bottom: this.hasImage ? 0 : 6})
if (this.hasImage) {
Image(this.content.coverUrl)
// Image($r("app.media.desktop_card_comp_place_holder_3_4"))
Image("memory://" + this.content.localCoverFileName)
// Image(this.content.coverUrl)
.alt($r("app.media.desktop_card_comp_place_holder_3_4"))
.objectFit(ImageFit.Cover)
.height(40)
...
...
sight_harmony/products/phone/src/main/resources/base/profile/form_config.json
View file @
9b0e2c4
...
...
@@ -14,8 +14,8 @@
"isDynamic"
:
true
,
"isDefault"
:
true
,
"updateEnabled"
:
true
,
"scheduledUpdateTime"
:
"10:30"
,
"updateDuration"
:
1
,
"scheduledUpdateTime"
:
"18:26"
,
"updateDuration"
:
4
,
"defaultDimension"
:
"2*4"
,
"supportDimensions"
:
[
"2*4"
...
...
Please
register
or
login
to post a comment