From a4fd8a68a01b5d2c8eed9615af69b7a100e46a21 Mon Sep 17 00:00:00 2001 From: lon9 <815882449@qq.com> Date: Mon, 22 Jul 2024 15:56:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E5=A4=9A=E8=B4=AD=E7=89=A9=E6=AF=94?= =?UTF-8?q?=E4=BB=B7=E6=9E=B6=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +-- commons/base/hvigorfile.ts | 4 +- .../main/ets/constants/CommonConstants.ets | 5 -- .../base/src/main/ets/utils/AvPlayerUtil.ets | 6 +-- commons/base/src/main/module.json5 | 5 +- features/detail/Index.ets | 4 ++ features/detail/hvigorfile.ts | 4 +- .../main/ets/constants/DetailConstants.ets | 5 -- features/detail/src/main/ets/view/Live.ets | 3 +- .../LiveIndex.ets => view/LiveHome.ets} | 18 +++---- .../detail/src/main/ets/view/LiverHeader.ets | 20 ++++++- .../src/main/ets/view/ProductDetail.ets | 17 +++--- .../{pages/Index.ets => view/ProductHome.ets} | 50 +++-------------- .../ets/{pages => view}/ProductMoreDetail.ets | 13 +++-- .../src/main/ets/view/ProductUtilView.ets | 5 +- features/detail/src/main/module.json5 | 6 +-- .../resources/base/profile/main_pages.json | 5 -- features/home/Index.ets | 3 +- features/home/hvigorfile.ts | 4 +- .../main/ets/constants/ClassifyConstants.ets | 4 +- features/home/src/main/ets/pages/Index.ets | 29 ---------- .../src/main/ets/view/ClassifyShopList.ets | 4 +- features/home/src/main/module.json5 | 6 +-- .../resources/base/profile/main_pages.json | 5 -- products/phone/oh-package.json5 | 3 +- .../main/ets/entryability/EntryAbility.ets | 14 ----- products/phone/src/main/ets/pages/Index.ets | 51 +++++++++++++++++- .../main/ets/secondability/SecondAbility.ets | 2 +- screenshots/device/config.png | Bin 28556 -> 0 bytes screenshots/device/run.png | Bin 221 -> 0 bytes 30 files changed, 125 insertions(+), 177 deletions(-) rename features/detail/src/main/ets/{pages/LiveIndex.ets => view/LiveHome.ets} (92%) rename features/detail/src/main/ets/{pages/Index.ets => view/ProductHome.ets} (82%) rename features/detail/src/main/ets/{pages => view}/ProductMoreDetail.ets (91%) delete mode 100644 features/detail/src/main/resources/base/profile/main_pages.json delete mode 100644 features/home/src/main/ets/pages/Index.ets delete mode 100644 features/home/src/main/resources/base/profile/main_pages.json delete mode 100644 screenshots/device/config.png delete mode 100644 screenshots/device/run.png diff --git a/README.md b/README.md index f1f13e0..8d49a19 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 一多开发实例-购物比价 +# 优秀实践-一多开发实例-购物比价 ### 简介 @@ -51,8 +51,3 @@ 2. HarmonyOS系统:HarmonyOS NEXT Developer Beta1及以上。 3. DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。 4. HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。 - -### 注意 - -运行时需设置引用所有HSP模块。点击Run > Edit Configurations,选择Deploy Multi Hap标签页,勾选Deploy Multi Hap Packages, 选择使用方模块(phone)和所有HSP模块,点击OK。单击Run > Run “模块名称”(如Run ”entry“)或![](screenshots/device/run.png)来启动应用/服务的编译构建。 -![](screenshots/device/config.png) \ No newline at end of file diff --git a/commons/base/hvigorfile.ts b/commons/base/hvigorfile.ts index d993120..4218707 100644 --- a/commons/base/hvigorfile.ts +++ b/commons/base/hvigorfile.ts @@ -1,6 +1,6 @@ -import { hspTasks } from '@ohos/hvigor-ohos-plugin'; +import { harTasks } from '@ohos/hvigor-ohos-plugin'; export default { - system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ } diff --git a/commons/base/src/main/ets/constants/CommonConstants.ets b/commons/base/src/main/ets/constants/CommonConstants.ets index 0264295..b836e78 100644 --- a/commons/base/src/main/ets/constants/CommonConstants.ets +++ b/commons/base/src/main/ets/constants/CommonConstants.ets @@ -144,11 +144,6 @@ export class CommonConstants { */ static readonly LIVE_VIDEO_NAME: string = 'live.mp4'; - /** - * Detail hsp name. - */ - static readonly DETAIL_HSP: string = 'detail'; - /** * Pip window util. */ diff --git a/commons/base/src/main/ets/utils/AvPlayerUtil.ets b/commons/base/src/main/ets/utils/AvPlayerUtil.ets index f05dc3c..2234b0c 100644 --- a/commons/base/src/main/ets/utils/AvPlayerUtil.ets +++ b/commons/base/src/main/ets/utils/AvPlayerUtil.ets @@ -41,8 +41,7 @@ export class AvPlayerUtil { } switch (state) { case CommonConstants.AV_PLAYER_IDLE_STATE: - this.url = await this.context.createModuleContext(CommonConstants.DETAIL_HSP).resourceManager - .getRawFd(CommonConstants.LIVE_VIDEO_NAME); + this.url = await this.context.resourceManager.getRawFd(CommonConstants.LIVE_VIDEO_NAME); this.avPlayer.fdSrc = this.url; Logger.info('AVPlayer state idle called.'); break; @@ -106,8 +105,7 @@ export class AvPlayerUtil { this.surfaceId = surfaceId; Logger.info('Created AvPlayer successfully.'); // Entering idle state. - this.url = await this.context.createModuleContext(CommonConstants.DETAIL_HSP).resourceManager - .getRawFd(CommonConstants.LIVE_VIDEO_NAME); + this.url = await this.context.resourceManager.getRawFd(CommonConstants.LIVE_VIDEO_NAME); this.avPlayer.fdSrc = this.url; this.setAVPlayerCallback(); } else { diff --git a/commons/base/src/main/module.json5 b/commons/base/src/main/module.json5 index ad5984b..292befa 100644 --- a/commons/base/src/main/module.json5 +++ b/commons/base/src/main/module.json5 @@ -1,13 +1,12 @@ { "module": { "name": "base", - "type": "shared", + "type": "har", "description": "$string:shared_desc", "deviceTypes": [ "phone", "2in1", "tablet" - ], - "deliveryWithInstall": true + ] } } \ No newline at end of file diff --git a/features/detail/Index.ets b/features/detail/Index.ets index e69de29..a4ce645 100644 --- a/features/detail/Index.ets +++ b/features/detail/Index.ets @@ -0,0 +1,4 @@ +export { ProductHome } from './src/main/ets/view/ProductHome'; +export { LiveHome } from './src/main/ets/view/LiveHome'; +export { ProductMoreDetail } from './src/main/ets/view/ProductMoreDetail'; +export { DetailConstants } from './src/main/ets/constants/DetailConstants'; \ No newline at end of file diff --git a/features/detail/hvigorfile.ts b/features/detail/hvigorfile.ts index d993120..4218707 100644 --- a/features/detail/hvigorfile.ts +++ b/features/detail/hvigorfile.ts @@ -1,6 +1,6 @@ -import { hspTasks } from '@ohos/hvigor-ohos-plugin'; +import { harTasks } from '@ohos/hvigor-ohos-plugin'; export default { - system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ } diff --git a/features/detail/src/main/ets/constants/DetailConstants.ets b/features/detail/src/main/ets/constants/DetailConstants.ets index ee30393..aaf1d7d 100644 --- a/features/detail/src/main/ets/constants/DetailConstants.ets +++ b/features/detail/src/main/ets/constants/DetailConstants.ets @@ -162,9 +162,4 @@ export class DetailConstants { * Navigation id. */ static readonly NAVIGATION_ID: string = 'navId'; - - /** - * Page info list. - */ - static readonly PAGE_INFO_LIST: string[] = ['liveIndex', 'moreDetail']; } \ No newline at end of file diff --git a/features/detail/src/main/ets/view/Live.ets b/features/detail/src/main/ets/view/Live.ets index 1f41dc2..9ef9d26 100644 --- a/features/detail/src/main/ets/view/Live.ets +++ b/features/detail/src/main/ets/view/Live.ets @@ -29,7 +29,6 @@ export struct Live { @Builder shopCarBuilder() {}; @Builder liveCloseBuilder() {}; @BuilderParam shopCarButton: () => void = this.shopCarBuilder; - @BuilderParam liveCloseButton: () => void = this.liveCloseBuilder; @Consume('pageInfos') pageInfos: NavPathStack; private pipWindowUtil: PipWindowUtil | undefined = PipWindowUtil.getPipWindowUtil(); private surfaceId: string = ''; @@ -71,7 +70,7 @@ export struct Live { .alignItems(HorizontalAlign.Center) Column() { - LiverHeader({ liveCloseButton: (): void => { this.liveCloseButton() }}) + LiverHeader() LiveMaskLayer({ currentBreakpoint:this.currentBreakpoint, detailType:this.detailType, diff --git a/features/detail/src/main/ets/pages/LiveIndex.ets b/features/detail/src/main/ets/view/LiveHome.ets similarity index 92% rename from features/detail/src/main/ets/pages/LiveIndex.ets rename to features/detail/src/main/ets/view/LiveHome.ets index a405c84..f0b522a 100644 --- a/features/detail/src/main/ets/pages/LiveIndex.ets +++ b/features/detail/src/main/ets/view/LiveHome.ets @@ -16,15 +16,15 @@ import { display } from '@kit.ArkUI'; import { Callback, deviceInfo } from '@kit.BasicServicesKit'; import { BreakpointConstants, BreakpointType, CommonConstants, Logger, ResourceUtil } from '@ohos/commons'; -import { Live } from '../view/Live'; -import { ShopBag } from '../view/ShopBag'; +import { Live } from './Live'; +import { ShopBag } from './ShopBag'; import { LiveConstants } from '../constants/LiveConstants'; -import { PayCard } from '../view/PayCard'; -import { ProductUtilView } from '../view/ProductUtilView'; -import { ProductInfo, ProductPicture } from '../view/ProductDetail'; +import { PayCard } from './PayCard'; +import { ProductUtilView } from './ProductUtilView'; +import { ProductInfo, ProductPicture } from './ProductDetail'; @Component -export struct LiveIndex { +export struct LiveHome { @StorageLink('currentBreakpoint') currentBreakpoint: string = BreakpointConstants.BREAKPOINT_LG; @StorageLink('topRectHeight') topRectHeight: number = 0; @State isMoreDetail: boolean = false; @@ -34,8 +34,6 @@ export struct LiveIndex { @State utilShoppingBag: boolean = false; @State utilCustomerService: boolean = false; @Consume('pageInfos') pageInfos: NavPathStack; - @Builder liveCloseBuilder() {}; - @BuilderParam liveCloseButton: () => void = this.liveCloseBuilder; private onFoldStatusChange: Callback = (data: display.FoldStatus) => { if (data === display.FoldStatus.FOLD_STATUS_FOLDED && this.detailType === CommonConstants.BIND_SHEET_PAGE_TYPES[2]) { @@ -123,7 +121,6 @@ export struct LiveIndex { Column() { Live({ shopCarButton: (): void => { this.shopCarButton() }, - liveCloseButton: (): void => { this.liveCloseButton() }, currentBreakpoint: this.isMoreDetail ? new BreakpointType(BreakpointConstants.BREAKPOINT_SM, BreakpointConstants.BREAKPOINT_SM, BreakpointConstants.BREAKPOINT_MD).getValue(this.currentBreakpoint) : this.currentBreakpoint, @@ -152,8 +149,7 @@ export struct LiveIndex { Column() { Scroll() { Column() { - ProductPicture({ pageBreakpoint: BreakpointConstants.BREAKPOINT_SM, isMoreLiveDetail: $isMoreDetail, - isNav: true }) + ProductPicture({ pageBreakpoint: BreakpointConstants.BREAKPOINT_SM, isMoreLiveDetail: $isMoreDetail }) ProductInfo({ pageBreakpoint: BreakpointConstants.BREAKPOINT_SM }) } .padding({ bottom: deviceInfo.deviceType !== CommonConstants.DEVICE_TYPES[0] ? diff --git a/features/detail/src/main/ets/view/LiverHeader.ets b/features/detail/src/main/ets/view/LiverHeader.ets index 1875b3d..c9baf69 100644 --- a/features/detail/src/main/ets/view/LiverHeader.ets +++ b/features/detail/src/main/ets/view/LiverHeader.ets @@ -13,7 +13,9 @@ * limitations under the License. */ -import { BreakpointConstants, CommonConstants,ResourceUtil } from '@ohos/commons'; +import { deviceInfo } from '@kit.BasicServicesKit'; +import { BreakpointConstants, CommonConstants, PipWindowUtil,ResourceUtil } from '@ohos/commons'; +import { DetailConstants } from '../constants/DetailConstants'; @Component export struct LiverHeader { @@ -21,6 +23,7 @@ export struct LiverHeader { @Consume('pageInfos') pageInfos: NavPathStack; @Builder liveCloseBuilder() {}; @BuilderParam liveCloseButton: () => void = this.liveCloseBuilder; + private pipWindowUtil: PipWindowUtil | undefined = PipWindowUtil.getPipWindowUtil(); build() { Row() { @@ -44,7 +47,20 @@ export struct LiverHeader { .backgroundColor($r('app.color.store_background_color')) .border({ radius: $r('app.float.store_border_radius') }) - this.liveCloseButton() + Image($r('app.media.icon_close_3')) + .width(ResourceUtil.getCommonImgSize()[0]) + .height(ResourceUtil.getCommonImgSize()[0]) + .onClick(() => { + if (deviceInfo.deviceType !== CommonConstants.DEVICE_TYPES[0]) { + if (this.pipWindowUtil === undefined) { + return; + } + this.pipWindowUtil.startPip(DetailConstants.NAVIGATION_ID, this.pipWindowUtil.getXComponentController(), + getContext(this), this.pageInfos); + } else { + this.pageInfos.pop(); + } + }) } .width(CommonConstants.FULL_PERCENT) .height($r('app.float.store_height')) diff --git a/features/detail/src/main/ets/view/ProductDetail.ets b/features/detail/src/main/ets/view/ProductDetail.ets index a8f9e29..651345f 100644 --- a/features/detail/src/main/ets/view/ProductDetail.ets +++ b/features/detail/src/main/ets/view/ProductDetail.ets @@ -14,13 +14,13 @@ */ import { BusinessError, deviceInfo } from '@kit.BasicServicesKit'; -import { router } from '@kit.ArkUI'; +import { AbilityConstant, common, StartOptions, Want } from '@kit.AbilityKit'; +import { ClassifyConstants } from '@ohos/home'; import { BreakpointConstants, BreakpointType, CommonConstants, Logger, PipWindowUtil, ResourceUtil } from '@ohos/commons'; import { DetailConstants } from '../constants/DetailConstants'; import { ProductPrice } from './ProductPrice'; import { ProductDiscount } from './ProductDiscount'; import { ProductConfig, UserComments } from './ProductConfig'; -import { AbilityConstant, common, StartOptions, Want } from '@kit.AbilityKit'; @Component export struct ProductPicture { @@ -31,7 +31,6 @@ export struct ProductPicture { @Prop pageBreakpoint: string; @Link isMoreLiveDetail: boolean; @Consume('pageInfos') pageInfos: NavPathStack; - private isNav: boolean = false; private pipWindowUtil: PipWindowUtil | undefined = PipWindowUtil.getPipWindowUtil(); private abilityName: string = (getContext(this) as common.UIAbilityContext).abilityInfo.name; @@ -75,11 +74,7 @@ export struct ProductPicture { if (this.isMoreLiveDetail) { this.isMoreLiveDetail = false; } else { - if (this.isNav) { - this.pageInfos.pop(); - } else { - router.back(); - } + this.pageInfos.pop(); } }) Image($r('app.media.ic_zoom_out')) @@ -143,15 +138,15 @@ export struct ProductPicture { } if (this.pipWindowUtil.getIsShowingPip()) { this.pipWindowUtil.stopPip().then(() => { - this.pageInfos.pushPath({ name: DetailConstants.PAGE_INFO_LIST[0] }); + this.pageInfos.pushPath({ name: ClassifyConstants.PAGE_INFO_LIST[0] }); }).catch((err: BusinessError) => { Logger.error(`Failed to stop pip. Cause: ${err.code}, message: ${err.message}`); }); } else { - this.pageInfos.pushPath({ name: DetailConstants.PAGE_INFO_LIST[0] }); + this.pageInfos.pushPath({ name: ClassifyConstants.PAGE_INFO_LIST[0] }); } } else { - this.pageInfos.pushPath({ name: DetailConstants.PAGE_INFO_LIST[0] }); + this.pageInfos.pushPath({ name: ClassifyConstants.PAGE_INFO_LIST[0] }); } }) .margin({ diff --git a/features/detail/src/main/ets/pages/Index.ets b/features/detail/src/main/ets/view/ProductHome.ets similarity index 82% rename from features/detail/src/main/ets/pages/Index.ets rename to features/detail/src/main/ets/view/ProductHome.ets index 83ef00f..20049da 100644 --- a/features/detail/src/main/ets/pages/Index.ets +++ b/features/detail/src/main/ets/view/ProductHome.ets @@ -16,17 +16,13 @@ import { deviceInfo } from '@kit.BasicServicesKit'; import { AbilityConstant, common, StartOptions, Want } from '@kit.AbilityKit'; import { BreakpointConstants, CommonConstants, PipWindowUtil, ResourceUtil } from '@ohos/commons'; -import { ProductInfo, ProductPicture } from '../view/ProductDetail'; -import { ProductUtilView } from '../view/ProductUtilView'; -import { DetailTopIcon } from '../view/CommonView'; -import { AllComments } from '../view/ProductConfig'; -import { LiveIndex } from './LiveIndex'; -import { ProductMoreDetail } from './ProductMoreDetail'; -import { DetailConstants } from '../constants/DetailConstants'; +import { ProductInfo, ProductPicture } from './ProductDetail'; +import { ProductUtilView } from './ProductUtilView'; +import { DetailTopIcon } from './CommonView'; +import { AllComments } from './ProductConfig'; -@Entry @Component -struct Index { +export struct ProductHome { @StorageLink('currentBreakpoint') currentBreakpoint: string = BreakpointConstants.BREAKPOINT_LG; @StorageLink('topRectHeight') topRectHeight: number = 0; @StorageLink('windowWidth') windowWidth: number = 0; @@ -38,8 +34,7 @@ struct Index { @State isDialogOpen: boolean = false; @State detailType: string = CommonConstants.BIND_SHEET_PAGE_TYPES[3]; @State isLiveMoreDetail: boolean = false; - @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack(); - private navId: string = DetailConstants.NAVIGATION_ID; + @Consume('pageInfos') pageInfos: NavPathStack; private pipWindowUtil: PipWindowUtil | undefined = PipWindowUtil.getPipWindowUtil(); aboutToDisappear(): void { @@ -51,36 +46,8 @@ struct Index { } } - @Builder - PageMap(name: string) { - if (name === DetailConstants.PAGE_INFO_LIST[0]) { - LiveIndex({ liveCloseButton: (): void => { this.LiveClose() } }) - } - if (name === DetailConstants.PAGE_INFO_LIST[1]) { - ProductMoreDetail() - } - } - - @Builder - LiveClose() { - Image($r('app.media.icon_close_3')) - .width(ResourceUtil.getCommonImgSize()[0]) - .height(ResourceUtil.getCommonImgSize()[0]) - .onClick(() => { - if (deviceInfo.deviceType !== CommonConstants.DEVICE_TYPES[0]) { - if (this.pipWindowUtil === undefined) { - return; - } - this.pipWindowUtil.startPip(this.navId, this.pipWindowUtil.getXComponentController(), getContext(this), - this.pageInfos); - } else { - this.pageInfos.pop(); - } - }) - } - build() { - Navigation(this.pageInfos) { + NavDestination() { SideBarContainer() { Column() { Image($r('app.media.icon_close_4')) @@ -198,9 +165,6 @@ struct Index { .maxSideBarWidth(px2vp(this.windowWidth) / CommonConstants.THREE) .autoHide(false) } - .navDestination(this.PageMap) - .mode(NavigationMode.Stack) - .id(this.navId) .hideTitleBar(true) } } \ No newline at end of file diff --git a/features/detail/src/main/ets/pages/ProductMoreDetail.ets b/features/detail/src/main/ets/view/ProductMoreDetail.ets similarity index 91% rename from features/detail/src/main/ets/pages/ProductMoreDetail.ets rename to features/detail/src/main/ets/view/ProductMoreDetail.ets index 84f56a1..9afa64a 100644 --- a/features/detail/src/main/ets/pages/ProductMoreDetail.ets +++ b/features/detail/src/main/ets/view/ProductMoreDetail.ets @@ -15,10 +15,10 @@ import { deviceInfo } from '@kit.BasicServicesKit'; import { BreakpointConstants, BreakpointType, CommonConstants, ResourceUtil } from '@ohos/commons'; -import { DetailShoppingBagView } from '@ohos/home'; -import { CustomerServiceView } from '../view/CustomerServiceView'; -import { ProductInfo, ProductPicture } from '../view/ProductDetail'; -import { ProductUtilView } from '../view/ProductUtilView'; +import { ClassifyConstants, DetailShoppingBagView } from '@ohos/home'; +import { CustomerServiceView } from './CustomerServiceView'; +import { ProductInfo, ProductPicture } from './ProductDetail'; +import { ProductUtilView } from './ProductUtilView'; import { DetailConstants } from '../constants/DetailConstants'; @Component @@ -32,7 +32,7 @@ export struct ProductMoreDetail { @Consume('pageInfos') pageInfos: NavPathStack; aboutToAppear(): void { - let navParams: string = JSON.stringify(this.pageInfos.getParamByName(DetailConstants.PAGE_INFO_LIST[1])); + let navParams: string = JSON.stringify(this.pageInfos.getParamByName(ClassifyConstants.PAGE_INFO_LIST[1])); if (navParams.includes(DetailConstants.PARAM_STRING_LIST[0])) { this.isShoppingBag = true; } @@ -55,8 +55,7 @@ export struct ProductMoreDetail { ProductPicture({ pageBreakpoint: new BreakpointType(BreakpointConstants.BREAKPOINT_SM, BreakpointConstants.BREAKPOINT_SM, BreakpointConstants.BREAKPOINT_MD).getValue(this.currentBreakpoint), - isMoreLiveDetail: $isLiveMoreDetail, - isNav: true + isMoreLiveDetail: $isLiveMoreDetail }) ProductInfo({ pageBreakpoint: new BreakpointType(BreakpointConstants.BREAKPOINT_SM, diff --git a/features/detail/src/main/ets/view/ProductUtilView.ets b/features/detail/src/main/ets/view/ProductUtilView.ets index ff14687..ece8d3f 100644 --- a/features/detail/src/main/ets/view/ProductUtilView.ets +++ b/features/detail/src/main/ets/view/ProductUtilView.ets @@ -14,6 +14,7 @@ */ import { deviceInfo } from '@kit.BasicServicesKit'; +import { ClassifyConstants } from '@ohos/home'; import { BreakpointConstants, CommonConstants, ResourceUtil } from '@ohos/commons'; import { DetailConstants } from '../constants/DetailConstants'; import { PayCard } from './PayCard'; @@ -80,7 +81,7 @@ export struct ProductUtilView { this.isCustomerService = true; this.isShoppingBag = false; } else { - this.pageInfos.pushPathByName(DetailConstants.PAGE_INFO_LIST[1], + this.pageInfos.pushPathByName(ClassifyConstants.PAGE_INFO_LIST[1], new NavParams(DetailConstants.PARAM_STRING_LIST[1])); } }) @@ -92,7 +93,7 @@ export struct ProductUtilView { this.isShoppingBag = true; this.isCustomerService = false; } else { - this.pageInfos.pushPathByName(DetailConstants.PAGE_INFO_LIST[1], + this.pageInfos.pushPathByName(ClassifyConstants.PAGE_INFO_LIST[1], new NavParams(DetailConstants.PARAM_STRING_LIST[0])); } }) diff --git a/features/detail/src/main/module.json5 b/features/detail/src/main/module.json5 index ecd5624..be0ff17 100644 --- a/features/detail/src/main/module.json5 +++ b/features/detail/src/main/module.json5 @@ -1,14 +1,12 @@ { "module": { "name": "detail", - "type": "shared", + "type": "har", "description": "$string:shared_desc", "deviceTypes": [ "phone", "2in1", "tablet" - ], - "deliveryWithInstall": true, - "pages": "$profile:main_pages" + ] } } \ No newline at end of file diff --git a/features/detail/src/main/resources/base/profile/main_pages.json b/features/detail/src/main/resources/base/profile/main_pages.json deleted file mode 100644 index 55c3f00..0000000 --- a/features/detail/src/main/resources/base/profile/main_pages.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "src": [ - "pages/Index" - ] -} \ No newline at end of file diff --git a/features/home/Index.ets b/features/home/Index.ets index 5f44841..1ac3f1d 100644 --- a/features/home/Index.ets +++ b/features/home/Index.ets @@ -1,2 +1,3 @@ export { Home } from './src/main/ets/view/Home'; -export { DetailShoppingBagView } from './src/main/ets/view/ShoppingBagContent'; \ No newline at end of file +export { DetailShoppingBagView } from './src/main/ets/view/ShoppingBagContent'; +export { ClassifyConstants } from './src/main/ets/constants/ClassifyConstants'; \ No newline at end of file diff --git a/features/home/hvigorfile.ts b/features/home/hvigorfile.ts index d993120..4218707 100644 --- a/features/home/hvigorfile.ts +++ b/features/home/hvigorfile.ts @@ -1,6 +1,6 @@ -import { hspTasks } from '@ohos/hvigor-ohos-plugin'; +import { harTasks } from '@ohos/hvigor-ohos-plugin'; export default { - system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ } diff --git a/features/home/src/main/ets/constants/ClassifyConstants.ets b/features/home/src/main/ets/constants/ClassifyConstants.ets index 0f6bf38..dfb6dc4 100644 --- a/features/home/src/main/ets/constants/ClassifyConstants.ets +++ b/features/home/src/main/ets/constants/ClassifyConstants.ets @@ -84,7 +84,7 @@ export class ClassifyConstants { static readonly GRID_ROW_GUTTERS: number[] = [24, 8, 16, 12]; /** - * Router urls. + * Page info list. */ - static readonly ROUTER_URLS: string[] = ['@bundle:com.huawei.multishoppingpricecomparison/detail/ets/pages/Index']; + static readonly PAGE_INFO_LIST: string[] = ['liveHome', 'moreDetail', 'productHome']; } \ No newline at end of file diff --git a/features/home/src/main/ets/pages/Index.ets b/features/home/src/main/ets/pages/Index.ets deleted file mode 100644 index 97fc7cc..0000000 --- a/features/home/src/main/ets/pages/Index.ets +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2024 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonConstants } from '@ohos/commons/Index'; -import { Home } from '../view/Home'; - -@Entry -@Component -struct Index { - build() { - Column() { - Home() - } - .width(CommonConstants.FULL_PERCENT) - .height(CommonConstants.FULL_PERCENT) - } -} \ No newline at end of file diff --git a/features/home/src/main/ets/view/ClassifyShopList.ets b/features/home/src/main/ets/view/ClassifyShopList.ets index 2e5e0d9..c587324 100644 --- a/features/home/src/main/ets/view/ClassifyShopList.ets +++ b/features/home/src/main/ets/view/ClassifyShopList.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import { router } from '@kit.ArkUI'; import { BreakpointConstants, BreakpointType, CommonConstants, ResourceUtil } from '@ohos/commons'; import { ClassifyConstants } from '../constants/ClassifyConstants'; import { ShopListViewModel, ShopListItem, ShopItem } from '../viewmodel/ShopListViewModel'; @@ -21,6 +20,7 @@ import { ShopListViewModel, ShopListItem, ShopItem } from '../viewmodel/ShopList @Component export struct ClassifyShopList { @StorageLink('currentBreakpoint') currentBreakpoint: string = BreakpointConstants.BREAKPOINT_LG; + @Consume('pageInfos') pageInfos: NavPathStack; private shopList: ShopListViewModel = new ShopListViewModel(); build() { @@ -62,7 +62,7 @@ export struct ClassifyShopList { .textOverflow({ overflow: TextOverflow.Ellipsis }) } .onClick(() => { - router.pushUrl({ url: ClassifyConstants.ROUTER_URLS[0] }); + this.pageInfos.pushPath({ name: ClassifyConstants.PAGE_INFO_LIST[2] }); }) } }, (item: ShopItem, index: number) => JSON.stringify(item) + index) diff --git a/features/home/src/main/module.json5 b/features/home/src/main/module.json5 index a58d299..a911a60 100644 --- a/features/home/src/main/module.json5 +++ b/features/home/src/main/module.json5 @@ -1,14 +1,12 @@ { "module": { "name": "home", - "type": "shared", + "type": "har", "description": "$string:shared_desc", "deviceTypes": [ "phone", "2in1", "tablet" - ], - "deliveryWithInstall": true, - "pages": "$profile:main_pages" + ] } } \ No newline at end of file diff --git a/features/home/src/main/resources/base/profile/main_pages.json b/features/home/src/main/resources/base/profile/main_pages.json deleted file mode 100644 index 1898d94..0000000 --- a/features/home/src/main/resources/base/profile/main_pages.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "src": [ - "pages/Index" - ] -} diff --git a/products/phone/oh-package.json5 b/products/phone/oh-package.json5 index 996db70..741122e 100644 --- a/products/phone/oh-package.json5 +++ b/products/phone/oh-package.json5 @@ -9,6 +9,7 @@ "dynamicDependencies": {}, "dependencies": { "@ohos/commons": "file:../../commons/base", - "@ohos/home": "file:../../features/home" + "@ohos/home": "file:../../features/home", + "@ohos/detail": "file:../../features/detail" } } diff --git a/products/phone/src/main/ets/entryability/EntryAbility.ets b/products/phone/src/main/ets/entryability/EntryAbility.ets index bfb4941..a43263c 100644 --- a/products/phone/src/main/ets/entryability/EntryAbility.ets +++ b/products/phone/src/main/ets/entryability/EntryAbility.ets @@ -22,7 +22,6 @@ import { CommonConstants, Logger, WindowUtil } from '@ohos/commons'; export default class EntryAbility extends UIAbility { private windowObj?: window.Window; private windowUtil?: WindowUtil; - private mainWindow?: window.Window; private onWindowSizeChange: (windowSize: window.Size) => void = (windowSize: window.Size) => { this.windowUtil?.updateBreakpoint(windowSize.width); AppStorage.setOrCreate('windowWidth', windowSize.width); @@ -39,19 +38,6 @@ export default class EntryAbility extends UIAbility { onDestroy(): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); - if (this.windowUtil === undefined) { - return; - } - this.mainWindow = this.windowUtil.getMainWindow(); - if (this.mainWindow === undefined) { - return; - } - try { - this.mainWindow.off('windowSizeChange'); - this.mainWindow.off('windowStatusChange'); - } catch (exception) { - Logger.error('Failed to unregister the window callback. Code: ' + JSON.stringify(exception)); - } } async onWindowStageCreate(windowStage: window.WindowStage): Promise { diff --git a/products/phone/src/main/ets/pages/Index.ets b/products/phone/src/main/ets/pages/Index.ets index f47e37f..8bf43fc 100644 --- a/products/phone/src/main/ets/pages/Index.ets +++ b/products/phone/src/main/ets/pages/Index.ets @@ -13,17 +13,64 @@ * limitations under the License. */ -import { CommonConstants } from '@ohos/commons/Index'; +import { window } from '@kit.ArkUI'; +import { CommonConstants, Logger, WindowUtil } from '@ohos/commons/Index'; +import { DetailConstants, ProductHome } from '@ohos/detail/Index'; +import { ProductMoreDetail } from '@ohos/detail/Index'; +import { LiveHome } from '@ohos/detail/Index'; import { Home } from '@ohos/home/Index'; +import { ClassifyConstants } from '@ohos/home/Index'; @Entry @Component struct Index { + @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack(); + @StorageLink('isSplitMode') isSplitMode: boolean = false; + private windowUtil?: WindowUtil; + private mainWindow?: window.Window; + + aboutToAppear(): void { + if (this.isSplitMode) { + this.pageInfos.pushPath({ name: ClassifyConstants.PAGE_INFO_LIST[2] }) + } + } + + aboutToDisappear(): void { + if (this.windowUtil === undefined) { + return; + } + this.mainWindow = this.windowUtil.getMainWindow(); + if (this.mainWindow === undefined) { + return; + } + try { + this.mainWindow.off('windowSizeChange'); + this.mainWindow.off('windowStatusChange'); + } catch (exception) { + Logger.error('Failed to unregister the window callback. Code: ' + JSON.stringify(exception)); + } + } + + @Builder + PageMap(name: string) { + if (name === ClassifyConstants.PAGE_INFO_LIST[0]) { + LiveHome() + } else if (name === ClassifyConstants.PAGE_INFO_LIST[1]) { + ProductMoreDetail() + } else { + ProductHome() + } + } + build() { - Column() { + Navigation(this.pageInfos) { Home() } .width(CommonConstants.FULL_PERCENT) .height(CommonConstants.FULL_PERCENT) + .navDestination(this.PageMap) + .mode(NavigationMode.Stack) + .id(DetailConstants.NAVIGATION_ID) + .hideTitleBar(true) } } \ No newline at end of file diff --git a/products/phone/src/main/ets/secondability/SecondAbility.ets b/products/phone/src/main/ets/secondability/SecondAbility.ets index a28c4e6..82b8060 100644 --- a/products/phone/src/main/ets/secondability/SecondAbility.ets +++ b/products/phone/src/main/ets/secondability/SecondAbility.ets @@ -80,7 +80,7 @@ export default class SecondAbility extends UIAbility { } } - windowStage.loadContent('@bundle:com.huawei.multishoppingpricecomparison/detail/ets/pages/Index', (err, data) => { + windowStage.loadContent('pages/Index', (err, data) => { if (err.code) { hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; diff --git a/screenshots/device/config.png b/screenshots/device/config.png deleted file mode 100644 index 13b3a81dfbd46254c388b6136abcf671760f2958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28556 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 C!T);z diff --git a/screenshots/device/run.png b/screenshots/device/run.png deleted file mode 100644 index 7655fa7e041bb067e028029d820bd2d320e2cd83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Lo9le|9p9Qxt@)SL0EOx zMk#}@XPDZ|@81*5W#Ha*U}^Yu$#whp9)7Sc<@|$%PYxV7b;fHJw*(N>{r`J*!_#ka zZEc5Zd8Wt5s^4XhsQCO=_V5&A?hjSmhq-Ss*yRh#a_`vVT4*Bll$8w#!qURl#3`I& zur>5;E6}xP6Vy|@6r*rR^@za2r^gp)FY65E4P!2_oUXzA!BSj0LFU694u-Ouw&(3$ S)#L!(%i!ti=d#Wzp$P!&;!{xo -- Gitee