diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets index 7eba67a0d0c2b2959e5875d6646807a8045586bc..01902264841595a7865cb4979cef7165dc8803b9 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets @@ -21,9 +21,9 @@ import FlutterNapi from '../../../ets/embedding/engine/FlutterNapi'; export const getContext: (a: number) => napiContext; export class napiContext { - onPageShow(); + onPageShow(): void; - onPageHide(); + onPageHide(): void; } /** diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/LocalizationChannel.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/LocalizationChannel.ets index d34d81816a6382de13bdef7a7690421c2363c318..4834b04653d84ccdb9a84076c4bd2e1fcba96752 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/LocalizationChannel.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/LocalizationChannel.ets @@ -67,5 +67,5 @@ export default class LocalizationChannel implements MethodCallHandler{ } export interface LocalizationMessageHandler { - getStringResource(key: string, local: string); + getStringResource(key: string, local: string): void; } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/SettingsChannel.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/SettingsChannel.ets index b40cd5536a335c48b0d9c9defabc02cfdea50f7e..dcb7e2fd91c1bee627b39184cb45393ad8adb2ea 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/SettingsChannel.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/SettingsChannel.ets @@ -45,45 +45,96 @@ export default class SettingsChannel { class MessageBuilder { private channel: BasicMessageChannel; - private message: Map = new Map(); - + private settingsMessage: SettingsMessage = new SettingsMessage(); constructor(channel: BasicMessageChannel) { this.channel = channel; } setTextScaleFactor(textScaleFactor: Number): MessageBuilder { - this.message.set(TEXT_SCALE_FACTOR, textScaleFactor); + this.settingsMessage.setTextScaleFactor(textScaleFactor); return this; } setNativeSpellCheckServiceDefined(nativeSpellCheckServiceDefined: boolean): MessageBuilder { - this.message.set(NATIVE_SPELL_CHECK_SERVICE_DEFINED, nativeSpellCheckServiceDefined); + this.settingsMessage.setNativeSpellCheckServiceDefined(nativeSpellCheckServiceDefined); return this; } setBrieflyShowPassword(brieflyShowPassword: boolean): MessageBuilder { - this.message.set(BRIEFLY_SHOW_PASSWORD, brieflyShowPassword); + this.settingsMessage.setBrieflyShowPassword(brieflyShowPassword); return this; } setAlwaysUse24HourFormat(alwaysUse24HourFormat: boolean): MessageBuilder { - this.message.set(ALWAYS_USE_24_HOUR_FORMAT, alwaysUse24HourFormat); + this.settingsMessage.setAlwaysUse24HourFormat(alwaysUse24HourFormat); return this; } setPlatformBrightness(platformBrightness: PlatformBrightness): MessageBuilder { - this.message.set(PLATFORM_BRIGHTNESS, platformBrightness); + this.settingsMessage.setPlatformBrightness(platformBrightness); return this; } send(): void { Log.i(TAG, "Sending message: \n" - + "textScaleFactor: " - + this.message.get(TEXT_SCALE_FACTOR) - + "alwaysUse24HourFormat: " - + this.message.get(ALWAYS_USE_24_HOUR_FORMAT) - + "platformBrightness: " - + this.message.get(PLATFORM_BRIGHTNESS)) - this.channel.send(this.message) + + TEXT_SCALE_FACTOR + " : " + + this.settingsMessage.getTextScaleFactor() + + ", " + NATIVE_SPELL_CHECK_SERVICE_DEFINED + " : " + + this.settingsMessage.getNativeSpellCheckServiceDefined() + + ", " + BRIEFLY_SHOW_PASSWORD + " : " + + this.settingsMessage.getBrieflyShowPassword() + + ", " + ALWAYS_USE_24_HOUR_FORMAT + " : " + + this.settingsMessage.getAlwaysUse24HourFormat() + + ", " + PLATFORM_BRIGHTNESS + " : " + + this.settingsMessage.getPlatformBrightness()); + this.channel.send(this.settingsMessage) + } +} + +class SettingsMessage { + private textScaleFactor: Number = 1.0; + private nativeSpellCheckServiceDefined: boolean = false; + private brieflyShowPassword: boolean = false; + private alwaysUse24HourFormat: boolean = false; + private platformBrightness: PlatformBrightness = PlatformBrightness.LIGHT; + + setTextScaleFactor(textScaleFactor: Number): void { + this.textScaleFactor = textScaleFactor; + } + + setNativeSpellCheckServiceDefined(nativeSpellCheckServiceDefined: boolean): void { + this.nativeSpellCheckServiceDefined = nativeSpellCheckServiceDefined; + } + + setBrieflyShowPassword(brieflyShowPassword: boolean): void { + this.brieflyShowPassword = brieflyShowPassword; + } + + setAlwaysUse24HourFormat(alwaysUse24HourFormat: boolean): void { + this.alwaysUse24HourFormat = alwaysUse24HourFormat; + } + + setPlatformBrightness(platformBrightness: PlatformBrightness): void { + this.platformBrightness = platformBrightness; + } + + getTextScaleFactor(): Number { + return this.textScaleFactor; + } + + getNativeSpellCheckServiceDefined(): boolean { + return this.nativeSpellCheckServiceDefined; + } + + getBrieflyShowPassword(): boolean { + return this.brieflyShowPassword; + } + + getAlwaysUse24HourFormat(): boolean { + return this.alwaysUse24HourFormat; + } + + getPlatformBrightness(): PlatformBrightness { + return this.platformBrightness; } } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets index ee499033a1ba49e0277fb532935d02d28bed484a..22b808584ec6aa758fa6ab312fad4ca227b35b44 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets @@ -86,7 +86,7 @@ export class FlutterAbility extends UIAbility implements Host { */ async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { Log.i(TAG, "bundleCodeDir=" + this.context.bundleCodeDir); - // globalThis.flutterAbility = this + this.displayInfo = display.getDefaultDisplaySync(); this.viewportMetrics.devicePixelRatio = this.displayInfo?.densityPixels @@ -95,14 +95,13 @@ export class FlutterAbility extends UIAbility implements Host { Log.i(TAG, 'onAttach end'); this?.delegate?.platformPlugin?.setUIAbilityContext(this.context); this?.delegate?.onRestoreInstanceState(want); - this?.delegate?.sendSettings(); if (this.stillAttachedForEvent("onCreate")) { this.delegate?.onCreate(); } console.log('MyAbility onCreate'); - // globalThis.applicationContext = this.context.getApplicationContext(); + this.context.eventHub.on(EVENT_BACK_PRESS, () => { this.delegate?.flutterEngine?.getNavigationChannel()?.popRoute(); }); @@ -183,6 +182,12 @@ export class FlutterAbility extends UIAbility implements Host { Log.e(TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } + + let mainWindow = this.windowStage?.getMainWindowSync(); + let _UIContext = mainWindow?.getUIContext(); + this.delegate?.setUIContext(_UIContext); + this.delegate?.sendSettings(); + this.onWindowPropertiesUpdated(); Log.i(TAG, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); }); diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbilityDelegate.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbilityDelegate.ets index ec1657e4d275239384bde67fa0297f2d4a9a7223..cbe0e80830d86a1bb73990f10d993efef4e31a87 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbilityDelegate.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbilityDelegate.ets @@ -37,6 +37,7 @@ import Settings from './Settings'; import FlutterNapi from '../engine/FlutterNapi'; import List from '@ohos.util.List'; import GeneratedPluginRegister from '../engine/plugins/util/GeneratedPluginRegister'; +import { UIContext } from '@ohos.arkui.UIContext'; const TAG = "FlutterAbilityDelegate"; const PLUGINS_RESTORATION_BUNDLE_KEY = "plugins"; @@ -52,6 +53,7 @@ class FlutterAbilityDelegate implements ExclusiveAppComponent { flutterEngine?: FlutterEngine | null; platformPlugin?: PlatformPlugin; private context?: common.Context; + private uiContext?: UIContext | undefined; private textInputPlugin?: TextInputPlugin; private isFlutterEngineFromHost: boolean = false; private engineGroup?: FlutterEngineGroup; @@ -410,7 +412,16 @@ class FlutterAbilityDelegate implements ExclusiveAppComponent { } sendSettings(): void { - this.settings?.sendSettings() + if (this.uiContext != undefined) { + this.settings?.sendSettings(this.uiContext.getMediaQuery()); + } else { + Log.e(TAG, "UIContext is null, cannot send Settings!"); + } + + } + + setUIContext(uiContext: UIContext | undefined): void { + this.uiContext = uiContext; } } @@ -426,7 +437,7 @@ interface Host extends FlutterEngineProvider, FlutterEngineConfigurator, Platfor shouldDispatchAppLifecycleState(): boolean; - detachFromFlutterEngine(); + detachFromFlutterEngine(): void; shouldAttachEngineToActivity(): boolean; diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterEngineConfigurator.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterEngineConfigurator.ets index 7953cad0836a9be4bf6bfd940594fdc787f45d66..168baf5a1c52e94d96c723b8f4c89a6045aa2eb5 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterEngineConfigurator.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterEngineConfigurator.ets @@ -17,7 +17,7 @@ import FlutterEngine from '../engine/FlutterEngine'; export default interface FlutterEngineConfigurator { - configureFlutterEngine(flutterEngine: FlutterEngine); + configureFlutterEngine(flutterEngine: FlutterEngine): void; - cleanUpFlutterEngine(flutterEngine: FlutterEngine); + cleanUpFlutterEngine(flutterEngine: FlutterEngine): void; } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/Settings.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/Settings.ets index d8ced27e5a16fffa1be79bc836bb790bfc81d07e..f90df8cf28a98f50e69520497b09e088e713d2a4 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/Settings.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/Settings.ets @@ -15,7 +15,11 @@ import SettingsChannel, { PlatformBrightness } from '../engine/systemchannels/SettingsChannel' import I18n from '@ohos.i18n' +import Log from '../../util/Log'; +import { MediaQuery } from '@ohos.arkui.UIContext'; + +const TAG = "Settings"; export default class Settings { settingsChannel: SettingsChannel | null; @@ -23,13 +27,25 @@ export default class Settings { this.settingsChannel = settingsChannel; } - sendSettings(): void { + sendSettings(mediaQuery: MediaQuery): void { this.settingsChannel?.startMessage() .setAlwaysUse24HourFormat(I18n.System.is24HourClock()) .setTextScaleFactor(1.0) .setNativeSpellCheckServiceDefined(false) .setBrieflyShowPassword(false) - .setPlatformBrightness(PlatformBrightness.LIGHT) + .setPlatformBrightness(this.getDarkMode(mediaQuery)) .send(); } + + getDarkMode(mediaQuery: MediaQuery): PlatformBrightness { + + let listener = mediaQuery.matchMediaSync('(dark-mode: true)'); + if (listener.matches) { + Log.i(TAG,"return dark"); + return PlatformBrightness.DARK; + } else { + Log.i(TAG,"return light"); + return PlatformBrightness.LIGHT; + } + } } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/common/StandardMessageCodec.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/common/StandardMessageCodec.ets index ba68df9fd6020ddde43d96ae245ba60b9f6b7a04..2ee2ef39b25336d660cf74425d99f5477f11032e 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/common/StandardMessageCodec.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/common/StandardMessageCodec.ets @@ -272,8 +272,8 @@ export default class StandardMessageCodec implements MessageCodec { result = buffer.readFloat64(true) break; case StandardMessageCodec.STRING: { - let bytes = this.readBytes(buffer); - result = StringUtils.arrayBufferToString(bytes.buffer); + let bytes: Uint8Array = this.readBytes(buffer); + result = StringUtils.uint8ArrayToString(bytes); break; } case StandardMessageCodec.UINT8_ARRAY: { diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/editing/ListenableEditingState.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/editing/ListenableEditingState.ets index bb7bec773d1bf039f1c390fd191af245e8b6f4f9..8b51a6671ae0a988f9f65bab40134247ab39663a 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/editing/ListenableEditingState.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/editing/ListenableEditingState.ets @@ -282,5 +282,5 @@ export class ListenableEditingState { export interface EditingStateWatcher { // Changing the editing state in a didChangeEditingState callback may cause unexpected // behavior. - didChangeEditingState(textChanged: boolean, selectionChanged: boolean, composingRegionChanged: boolean); + didChangeEditingState(textChanged: boolean, selectionChanged: boolean, composingRegionChanged: boolean): void; } \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/util/StringUtils.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/util/StringUtils.ets index a2e47f2b756bbad6377d014ac5eb14fd5a9af1c7..ad7f50bb0b569fcf8040cc2a964fae26b63a9faf 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/util/StringUtils.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/util/StringUtils.ets @@ -29,7 +29,12 @@ export default class StringUtils { static arrayBufferToString(buffer: ArrayBuffer): string { let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM : true }) - return textDecoder.decode(new Uint8Array(buffer)) + return textDecoder.decode(new Uint8Array(buffer)); + } + + static uint8ArrayToString(buffer: Uint8Array): string { + let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM : true }) + return textDecoder.decodeWithStream(buffer); } static isNotEmpty(str: string): boolean {