zhangbo1_wd

应用设置全屏。

@@ -98,4 +98,8 @@ export class DeviceUtil { @@ -98,4 +98,8 @@ export class DeviceUtil {
98 static isTablet(): boolean { 98 static isTablet(): boolean {
99 return deviceInfo.deviceType == 'tablet'; 99 return deviceInfo.deviceType == 'tablet';
100 } 100 }
  101 +
  102 + static is2in1(): boolean {
  103 + return deviceInfo.deviceType == '2in1';
  104 + }
101 } 105 }
@@ -43,6 +43,9 @@ export class WindowModel { @@ -43,6 +43,9 @@ export class WindowModel {
43 return this.windowClass as window.Window 43 return this.windowClass as window.Window
44 } 44 }
45 45
  46 + /**
  47 + * @deprecated 应用整体全屏,不需要再设置全屏与否了。
  48 + */
46 setMainWindowFullScreen(fullScreen: boolean) { 49 setMainWindowFullScreen(fullScreen: boolean) {
47 if (deviceInfo.deviceType != "phone") { 50 if (deviceInfo.deviceType != "phone") {
48 return 51 return
@@ -140,6 +143,9 @@ export class WindowModel { @@ -140,6 +143,9 @@ export class WindowModel {
140 return this.windowClass?.getWindowProperties() 143 return this.windowClass?.getWindowProperties()
141 } 144 }
142 145
  146 + /**
  147 + * @deprecated 应用整体全屏,不需要再设置全屏与否了。
  148 + */
143 setWindowLayoutFullScreen(isFullScreen: boolean) { 149 setWindowLayoutFullScreen(isFullScreen: boolean) {
144 this.isFullScreen = isFullScreen 150 this.isFullScreen = isFullScreen
145 this.windowClass?.setWindowLayoutFullScreen(isFullScreen) 151 this.windowClass?.setWindowLayoutFullScreen(isFullScreen)
1 import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 1 import AbilityConstant from '@ohos.app.ability.AbilityConstant';
2 import app from '@system.app'; 2 import app from '@system.app';
3 -import hilog from '@ohos.hilog';  
4 import UIAbility from '@ohos.app.ability.UIAbility'; 3 import UIAbility from '@ohos.app.ability.UIAbility';
5 import Want from '@ohos.app.ability.Want'; 4 import Want from '@ohos.app.ability.Want';
6 import window from '@ohos.window'; 5 import window from '@ohos.window';
7 import { BusinessError } from '@ohos.base'; 6 import { BusinessError } from '@ohos.base';
8 -import { DeviceUtil, EmitterEventId, EmitterUtils, WindowModel } from 'wdKit'; 7 +import { DeviceUtil, EmitterEventId, EmitterUtils, Logger, WindowModel } from 'wdKit';
9 import { ConfigurationConstant } from '@kit.AbilityKit'; 8 import { ConfigurationConstant } from '@kit.AbilityKit';
10 import { StartupManager } from '../startupmanager/StartupManager'; 9 import { StartupManager } from '../startupmanager/StartupManager';
11 -import { UIContext } from '@ohos.arkui.UIContext';  
12 10
13 let floatWindowClass: window.Window | null = null; 11 let floatWindowClass: window.Window | null = null;
  12 +const TAG = 'EntryAbility'
14 13
15 export default class EntryAbility extends UIAbility { 14 export default class EntryAbility extends UIAbility {
16 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 15 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
17 StartupManager.sharedInstance().appOnCreate(want, launchParam, this.context) 16 StartupManager.sharedInstance().appOnCreate(want, launchParam, this.context)
18 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); 17 + Logger.info(TAG, 'Ability onCreate');
19 18
20 // 还没深色模式需求,暂直接不跟随系统。 19 // 还没深色模式需求,暂直接不跟随系统。
21 this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT); 20 this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
@@ -32,13 +31,13 @@ export default class EntryAbility extends UIAbility { @@ -32,13 +31,13 @@ export default class EntryAbility extends UIAbility {
32 } 31 }
33 32
34 onDestroy(): void { 33 onDestroy(): void {
35 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); 34 + Logger.info(TAG, 'Ability onDestroy');
36 StartupManager.sharedInstance().appOnDestory() 35 StartupManager.sharedInstance().appOnDestory()
37 } 36 }
38 37
39 onWindowStageCreate(windowStage: window.WindowStage): void { 38 onWindowStageCreate(windowStage: window.WindowStage): void {
40 // Main window is created, set main page for this ability 39 // Main window is created, set main page for this ability
41 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); 40 + Logger.info(TAG, 'Ability onWindowStageCreate');
42 WindowModel.shared.setWindowStage(windowStage); 41 WindowModel.shared.setWindowStage(windowStage);
43 // 2. 获取布局避让遮挡的区域 42 // 2. 获取布局避让遮挡的区域
44 const windowClass: window.Window = windowStage.getMainWindowSync(); // 获取应用主窗口 43 const windowClass: window.Window = windowStage.getMainWindowSync(); // 获取应用主窗口
@@ -57,72 +56,50 @@ export default class EntryAbility extends UIAbility { @@ -57,72 +56,50 @@ export default class EntryAbility extends UIAbility {
57 // 音频悬浮窗初始移动位置604为ui高度 56 // 音频悬浮窗初始移动位置604为ui高度
58 let initMoveY = vp2px(604) 57 let initMoveY = vp2px(604)
59 58
60 -  
61 - // 在普通phone/折叠屏/tablet设备上以沉浸式(全屏)启动  
62 - if (DeviceUtil.isPhone() || DeviceUtil.isTablet()) {  
63 - // 设置窗口的布局是否为沉浸式布局  
64 - // 沉浸式布局是指布局不避让状态栏与导航栏,组件可能产生与其重叠的情况。  
65 - // 非沉浸式布局是指布局避让状态栏与导航栏,组件不会与其重叠。  
66 - // windowClass.setWindowLayoutFullScreen(true)  
67 - // 设置窗口全屏模式时窗口内导航栏、状态栏的属性  
68 - // windowClass.setWindowSystemBarProperties({  
69 - // statusBarContentColor: "#FFFFFF"  
70 - // })  
71 -  
72 - // 设置启动时窗口的显示方向属性,  
73 - // 普通phone以PORTRAIT/竖屏显示模式启动  
74 - // 折叠屏和tablet是以AUTO_ROTATION_RESTRICTED/受开关控制的自动旋转模式启动  
75 - WindowModel.shared.setPreferredOrientation(window.Orientation.PORTRAIT)  
76 - .then(() => {  
77 - hilog.info(0x0000, 'testTag', 'setPreferredOrientation Succeeded');  
78 - })  
79 - .catch((err: Error) => {  
80 - hilog.error(0x0000, 'testTag',  
81 - `setPreferredOrientation catch, error error.name : ${err.name}, error.message:${err.message}`);  
82 - })  
83 - } 59 + this.onWindowSetup(windowClass)
84 60
85 //../../../../../../features/wdLogin/src/main/ets/pages/launchPage/LaunchPage 61 //../../../../../../features/wdLogin/src/main/ets/pages/launchPage/LaunchPage
86 windowStage.loadContent('pages/launchPage/LaunchPage', (err, data) => { 62 windowStage.loadContent('pages/launchPage/LaunchPage', (err, data) => {
87 if (err.code) { 63 if (err.code) {
88 - hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); 64 + Logger.error(TAG, 'Failed to load the content. Cause: ' + JSON.stringify(err) ?? '');
89 return; 65 return;
90 } 66 }
91 - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); 67 + Logger.info(TAG, 'Succeeded in loading the content. Data: ' + JSON.stringify(data) ?? '');
92 }); 68 });
93 // 1.创建悬浮窗 69 // 1.创建悬浮窗
94 windowStage.createSubWindow('subWindow', (err: BusinessError, data) => { 70 windowStage.createSubWindow('subWindow', (err: BusinessError, data) => {
95 let errCode: number = err.code; 71 let errCode: number = err.code;
96 if (errCode) { 72 if (errCode) {
97 - console.error('floatWindowClass Failed to create the subwindow. Cause: ' + JSON.stringify(err)); 73 + Logger.error('floatWindowClass Failed to create the subwindow. Cause: ' + JSON.stringify(err));
98 return; 74 return;
99 } 75 }
100 - console.info('floatWindowClass Succeeded in creating the subwindow. Data: ' + JSON.stringify(data)); 76 + Logger.info('floatWindowClass Succeeded in creating the subwindow. Data: ' + JSON.stringify(data));
101 floatWindowClass = data; 77 floatWindowClass = data;
102 AppStorage.setOrCreate('floatWindowClass', floatWindowClass); 78 AppStorage.setOrCreate('floatWindowClass', floatWindowClass);
103 // 2.悬浮窗窗口创建成功后,设置悬浮窗的位置、大小及相关属性等。 79 // 2.悬浮窗窗口创建成功后,设置悬浮窗的位置、大小及相关属性等。
104 floatWindowClass.moveWindowTo(0, initMoveY, (err: BusinessError) => { 80 floatWindowClass.moveWindowTo(0, initMoveY, (err: BusinessError) => {
105 let errCode: number = err.code; 81 let errCode: number = err.code;
106 if (errCode) { 82 if (errCode) {
107 - console.error('floatWindowClass Failed to move the window. Cause:' + JSON.stringify(err)); 83 + Logger.error('floatWindowClass Failed to move the window. Cause:' + JSON.stringify(err));
108 return; 84 return;
109 } 85 }
110 - console.info('floatWindowClass Succeeded in moving the window.'); 86 + Logger.info('floatWindowClass Succeeded in moving the window.');
111 }); 87 });
112 // 3.为悬浮窗加载对应的目标页面。 88 // 3.为悬浮窗加载对应的目标页面。
113 floatWindowClass.setUIContent("pages/view/AudioComponent", (err: BusinessError) => { 89 floatWindowClass.setUIContent("pages/view/AudioComponent", (err: BusinessError) => {
114 let errCode: number = err.code; 90 let errCode: number = err.code;
115 if (errCode) { 91 if (errCode) {
116 - console.error('floatWindowClass Failed to load the content. Cause:' + JSON.stringify(err)); 92 + Logger.error('floatWindowClass Failed to load the content. Cause:' + JSON.stringify(err));
117 return; 93 return;
118 } 94 }
119 - console.info('floatWindowClass Succeeded in loading the content.'); 95 + Logger.info('floatWindowClass Succeeded in loading the content.');
120 let color: string = 'rgba(0,0,0,0)'; 96 let color: string = 'rgba(0,0,0,0)';
121 try { 97 try {
122 (floatWindowClass as window.Window).setWindowBackgroundColor(color); 98 (floatWindowClass as window.Window).setWindowBackgroundColor(color);
123 } catch (exception) { 99 } catch (exception) {
124 - console.error('Failed to set the background color. Cause: ' + JSON.stringify(exception));  
125 - }; 100 + Logger.error('Failed to set the background color. Cause: ' + JSON.stringify(exception));
  101 + }
  102 + ;
126 }); 103 });
127 104
128 floatWindowClass.on('windowEvent', (data) => { 105 floatWindowClass.on('windowEvent', (data) => {
@@ -132,33 +109,68 @@ export default class EntryAbility extends UIAbility { @@ -132,33 +109,68 @@ export default class EntryAbility extends UIAbility {
132 }); 109 });
133 } 110 }
134 111
  112 + public async onWindowSetup(mainWindow: window.Window) {
  113 + // 在普通phone/折叠屏/tablet设备上以沉浸式(全屏)启动
  114 + if (DeviceUtil.isPhone() || DeviceUtil.isTablet()) {
  115 + // 设置窗口的布局是否为沉浸式布局
  116 + // 沉浸式布局是指布局不避让状态栏与导航栏,组件可能产生与其重叠的情况。
  117 + // 非沉浸式布局是指布局避让状态栏与导航栏,,组件不会与其重叠
  118 + mainWindow.setWindowLayoutFullScreen(true)
  119 + //设置窗口全屏模式时窗口内导航栏、状态栏的属性
  120 + mainWindow.setWindowSystemBarProperties({
  121 + //statusBarColor:'#000000'
  122 + statusBarContentColor: '#FFFFFF'
  123 + })
  124 + mainWindow.setSpecificSystemBarEnabled('status', true)
  125 +
  126 + // 设置启动时窗口的显示方向属性,
  127 + // 普通phone以PORTRAIT/竖屏显示模式启动
  128 + // 折叠屏和tablet是以AUTO_ROTATION_RESTRICTED/受开关控制的自动旋转模式启动
  129 + WindowModel.shared.setPreferredOrientation(window.Orientation.PORTRAIT)
  130 + .then(() => {
  131 + Logger.info(TAG, 'setPreferredOrientation Succeeded');
  132 + })
  133 + .catch((err: Error) => {
  134 + Logger.info(TAG,
  135 + `setPreferredOrientation catch, error error.name : ${err.name}, error.message:${err.message}`);
  136 + })
  137 + } else if (DeviceUtil.is2in1()) {
  138 + // 2in1(PC)设备不支持旋转(无横竖屏模式),会以默认窗口(非全屏)显示模式启动Logger.info(TAG,`start at 2in1 window device )
  139 + Logger.info(TAG, 'start at 2in1 window device')
  140 + } else {
  141 + // 轻量级智能穿戴/lite wearable device
  142 + Logger.info(TAG, 'start at other type device')
  143 + }
  144 +
  145 + }
  146 +
135 destroyFloatWindow() { 147 destroyFloatWindow() {
136 (floatWindowClass as window.Window).destroyWindow((err: BusinessError) => { 148 (floatWindowClass as window.Window).destroyWindow((err: BusinessError) => {
137 let errCode: number = err.code; 149 let errCode: number = err.code;
138 if (errCode) { 150 if (errCode) {
139 - console.error('floatWindowClass Failed to destroy the window. Cause: ' + JSON.stringify(err)); 151 + Logger.error('floatWindowClass Failed to destroy the window. Cause: ' + JSON.stringify(err));
140 return; 152 return;
141 } 153 }
142 - console.info('floatWindowClass Succeeded in destroying the window.'); 154 + Logger.info('floatWindowClass Succeeded in destroying the window.');
143 }); 155 });
144 } 156 }
145 157
146 onWindowStageDestroy(): void { 158 onWindowStageDestroy(): void {
147 // Main window is destroyed, release UI related resources 159 // Main window is destroyed, release UI related resources
148 this.destroyFloatWindow() 160 this.destroyFloatWindow()
149 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); 161 + Logger.info(TAG, 'Ability onWindowStageDestroy');
150 } 162 }
151 163
152 onForeground(): void { 164 onForeground(): void {
153 // Ability has brought to foreground 165 // Ability has brought to foreground
154 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); 166 + Logger.info(TAG, 'Ability onForeground');
155 167
156 EmitterUtils.sendEmptyEvent(EmitterEventId.APP_ENTER_FOREGROUD) 168 EmitterUtils.sendEmptyEvent(EmitterEventId.APP_ENTER_FOREGROUD)
157 } 169 }
158 170
159 onBackground(): void { 171 onBackground(): void {
160 // Ability has back to background 172 // Ability has back to background
161 - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); 173 + Logger.info(TAG, 'Ability onBackground');
162 174
163 EmitterUtils.sendEmptyEvent(EmitterEventId.APP_ENTER_BACKGROUD) 175 EmitterUtils.sendEmptyEvent(EmitterEventId.APP_ENTER_BACKGROUD)
164 } 176 }