diff --git a/OAT.xml b/OAT.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ce194aa6eb212bc7dd6af2d0201253b8dc9aca5
--- /dev/null
+++ b/OAT.xml
@@ -0,0 +1,58 @@
+
+
+
+ LICENSE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index e9c0ddf4f0a729355806d7866a2d800c47ad5c76..7d854b638b6c5447ed34a02b9c1da3e9bc289437 100644
--- a/README.md
+++ b/README.md
@@ -1,91 +1,13 @@
-# `@react-native-community/toolbar-android`
-[](https://circleci.com/gh/react-native-toolbar-android/toolbar-android/tree/master)   [](https://www.npmjs.com/package/@react-native-community/toolbar-android) [](https://github.com/facebook/react-native/issues/23313)
+# @react-native-ohos/toolbar-android
-## What is it?
-A React component that wraps the Android-only [Toolbar widget](https://developer.android.com/reference/android/widget/Toolbar).
+This project is based on [toolbar-android](https://github.com/react-native-oh-library/toolbar-android)
-This is extracted from react-native per [lean core](https://github.com/facebook/react-native/issues/23313) initiative, which removed `ToolbarAndroid` at v0.61. The goal of this repo is to house the original component and continue to improve and maintain a lean wrapper with zero dependency other than react and react-native.
+## Documentation
+- [中文](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/react-native-community-toolbar-android.md)
-
-
-## Getting started
-
-`yarn add @react-native-community/toolbar-android`
-
-or
-
-`npm install @react-native-community/toolbar-android --save`
-
-Now link the native code with your project:
-
-```
-# RN >= 0.60
-npx pod-install
-
-# RN < 0.60
-react-native link @react-native-community/toolbar-android
-```
-
-### Manual installation
-
-
-Manually link the library on Android
-
-#### `android/settings.gradle`
-```groovy
-include ':react-native-community-toolbar-android'
-project(':react-native-community-toolbar-android').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/toolbar-android/android')
-```
-
-#### `android/app/build.gradle`
-```groovy
-dependencies {
- ...
- implementation project(':react-native-community-toolbar-android')
-}
-```
-
-#### `android/app/src/main/.../MainApplication.java`
-On top, where imports are:
-
-```java
-import com.reactnativecommunity.toolbarandroid.ReactToolbarPackage;
-```
-
-Add the `toolbar-android` class to your list of exported packages.
-
-```java
-@Override
-protected List getPackages() {
- return Arrays.asList(
- new MainReactPackage(),
- new ReactToolbarPackage()
- );
-}
-```
-
-
-## Migrating from the core `react-native` module
-This module was created when the ToolbarAndroid was split out from the core of React Native. To migrate to this module you need to follow the installation instructions above and then change you imports from:
-
-```javascript
-import { ToolbarAndroid } from 'react-native';
-```
-
-to:
-
-```javascript
-import ToolbarAndroid from '@react-native-community/toolbar-android';
-```
-
-## Usage
-
-see [ToolbarAndroid](./doc/toolbarandroid.md)
-
-## Contributors
-
-This module was extracted from `react-native` core.
+- [English](https://gitee.com/react-native-oh-library/usage-docs/blob/master/en/react-native-community-toolbar-android.md)
## License
-The library is released under the MIT licence. For more information see `LICENSE`.
+
+This library is licensed under [The MIT License (MIT)](https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE)
\ No newline at end of file
diff --git a/harmony/toolbar_android.har b/harmony/toolbar_android.har
new file mode 100644
index 0000000000000000000000000000000000000000..c11f55969c2710a0e044e23cdc28fe6409bb33dd
Binary files /dev/null and b/harmony/toolbar_android.har differ
diff --git a/harmony/toolbar_android/Index.ets b/harmony/toolbar_android/Index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..d90b786c59ac3f4d577d6cf3b3d48dee3eb384c1
--- /dev/null
+++ b/harmony/toolbar_android/Index.ets
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
+ * Licensed under the MIT 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
+ *
+ * https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE
+ *
+ * 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.
+ */
+
+export { RNCToolbarAndroid } from './src/main/ets/RNCToolbarAndroid'
diff --git a/harmony/toolbar_android/build-profile.json5 b/harmony/toolbar_android/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..79961f96a6fe0507354b7952a378c3be2ae4bfab
--- /dev/null
+++ b/harmony/toolbar_android/build-profile.json5
@@ -0,0 +1,10 @@
+{
+ "apiType": "stageMode",
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default"
+ }
+ ]
+}
diff --git a/harmony/toolbar_android/hvigorfile.ts b/harmony/toolbar_android/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..42187071482d292588ad40babeda74f7b8d97a23
--- /dev/null
+++ b/harmony/toolbar_android/hvigorfile.ts
@@ -0,0 +1,6 @@
+import { harTasks } from '@ohos/hvigor-ohos-plugin';
+
+export default {
+ system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
+ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
+}
diff --git a/harmony/toolbar_android/oh-package.json5 b/harmony/toolbar_android/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..24d76c8438b3ecfcfe2a061e12f0f23e0675d03a
--- /dev/null
+++ b/harmony/toolbar_android/oh-package.json5
@@ -0,0 +1,10 @@
+{
+ "name": "rnoh-toolbar-android",
+ "version": "0.2.1",
+ "description": "",
+ "type": "module",
+ "main": "Index.ets",
+ "author": "",
+ "license": "ISC",
+ "dependencies": {}
+}
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/cpp/CMakeLists.txt b/harmony/toolbar_android/src/main/cpp/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..354b509c53f46059433e9543c84c24b142e1bedd
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/CMakeLists.txt
@@ -0,0 +1,10 @@
+# the minimum version of CMake
+cmake_minimum_required(VERSION 3.13)
+set(CMAKE_VERBOSE_MAKEFILE on)
+
+set(rnoh_toolbar_android_generated_dir "${CMAKE_CURRENT_SOURCE_DIR}/generated")
+file(GLOB_RECURSE rnoh_toolbar_android_generated_SRC "${rnoh_toolbar_android_generated_dir}/**/*.cpp")
+file(GLOB rnoh_toolbar_android_SRC CONFIGURE_DEPENDS *.cpp)
+add_library(rnoh_toolbar_android SHARED ${rnoh_toolbar_android_SRC} ${rnoh_toolbar_android_generated_SRC})
+target_include_directories(rnoh_toolbar_android PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${rnoh_toolbar_android_generated_dir})
+target_link_libraries(rnoh_toolbar_android PUBLIC rnoh)
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/cpp/ToolbarAndroidPackage.h b/harmony/toolbar_android/src/main/cpp/ToolbarAndroidPackage.h
new file mode 100644
index 0000000000000000000000000000000000000000..35e54c6b8c97fb56d197398176c2e849c9c6c10d
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/ToolbarAndroidPackage.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
+ * Licensed under the MIT 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
+ *
+ * https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include "generated/RNOH/generated/BaseToolbarAndroidPackage.h"
+
+namespace rnoh {
+class ToolbarAndroidPackage : public BaseToolbarAndroidPackage {
+ using Super = BaseToolbarAndroidPackage;
+ using Super::Super;
+};
+} // namespace rnoh
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/BaseToolbarAndroidPackage.h b/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/BaseToolbarAndroidPackage.h
new file mode 100644
index 0000000000000000000000000000000000000000..d81cdf5212e12ce46832475c80c349e7d8977e23
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/BaseToolbarAndroidPackage.h
@@ -0,0 +1,68 @@
+/**
+ * This code was generated by "react-native codegen-lib-harmony"
+ */
+
+#pragma once
+
+#include
+#include "RNOH/Package.h"
+#include "RNOH/ArkTSTurboModule.h"
+#include "RNOH/generated/components/ToolbarAndroidJSIBinder.h"
+
+namespace rnoh {
+
+class BaseToolbarAndroidPackageTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
+ public:
+ SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override {
+ return nullptr;
+ };
+};
+
+class BaseToolbarAndroidPackageEventEmitRequestHandler : public EventEmitRequestHandler {
+ public:
+ void handleEvent(Context const &ctx) override {
+ auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter(ctx.tag);
+ if (eventEmitter == nullptr) {
+ return;
+ }
+
+ std::vector supportedEventNames = {
+ "select",
+ "actionSelected",
+ "iconClicked",
+ };
+ if (std::find(supportedEventNames.begin(), supportedEventNames.end(), ctx.eventName) != supportedEventNames.end()) {
+ eventEmitter->dispatchEvent(ctx.eventName, ArkJS(ctx.env).getDynamic(ctx.payload));
+ }
+ }
+};
+
+
+class BaseToolbarAndroidPackage : public Package {
+ public:
+ BaseToolbarAndroidPackage(Package::Context ctx) : Package(ctx){};
+
+ std::unique_ptr createTurboModuleFactoryDelegate() override {
+ return std::make_unique();
+ }
+
+ std::vector createComponentDescriptorProviders() override {
+ return {
+ facebook::react::concreteComponentDescriptorProvider(),
+ };
+ }
+
+ ComponentJSIBinderByString createComponentJSIBinderByName() override {
+ return {
+ {"ToolbarAndroid", std::make_shared()},
+ };
+ };
+
+ EventEmitRequestHandlers createEventEmitRequestHandlers() override {
+ return {
+ std::make_shared(),
+ };
+ }
+};
+
+} // namespace rnoh
diff --git a/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/components/ToolbarAndroidJSIBinder.h b/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/components/ToolbarAndroidJSIBinder.h
new file mode 100644
index 0000000000000000000000000000000000000000..67bef0bb871ac946c50ca06e02ad628eb4a4dd49
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/RNOH/generated/components/ToolbarAndroidJSIBinder.h
@@ -0,0 +1,42 @@
+/**
+ * This code was generated by "react-native codegen-lib-harmony"
+ */
+
+#pragma once
+#include "RNOHCorePackage/ComponentBinders/ViewComponentJSIBinder.h"
+
+namespace rnoh {
+class ToolbarAndroidJSIBinder : public ViewComponentJSIBinder {
+ protected:
+ facebook::jsi::Object createNativeProps(facebook::jsi::Runtime &rt) override {
+ auto object = ViewComponentJSIBinder::createNativeProps(rt);
+ object.setProperty(rt, "nativeActions", true);
+ object.setProperty(rt, "actions", true);
+ object.setProperty(rt, "logo", true);
+ object.setProperty(rt, "navIcon", true);
+ object.setProperty(rt, "overflowIcon", true);
+ object.setProperty(rt, "subtitle", true);
+ object.setProperty(rt, "subtitleColor", true);
+ object.setProperty(rt, "title", true);
+ object.setProperty(rt, "titleColor", true);
+ object.setProperty(rt, "contentInsetStart", true);
+ object.setProperty(rt, "contentInsetEnd", true);
+ object.setProperty(rt, "rtl", true);
+ object.setProperty(rt, "testID", true);
+ return object;
+ }
+
+ facebook::jsi::Object createBubblingEventTypes(facebook::jsi::Runtime &rt) override {
+ facebook::jsi::Object events(rt);
+ return events;
+ }
+
+ facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {
+ facebook::jsi::Object events(rt);
+ events.setProperty(rt, "topSelect", createDirectEvent(rt, "onSelect"));
+ events.setProperty(rt, "topActionSelected", createDirectEvent(rt, "onActionSelected"));
+ events.setProperty(rt, "topIconClicked", createDirectEvent(rt, "onIconClicked"));
+ return events;
+ }
+};
+} // namespace rnoh
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ComponentDescriptors.h b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ComponentDescriptors.h
new file mode 100644
index 0000000000000000000000000000000000000000..13be61e283fed66d574d794f9458d9a10d7bea9e
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ComponentDescriptors.h
@@ -0,0 +1,22 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateComponentDescriptorH.js
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace facebook {
+namespace react {
+
+using ToolbarAndroidComponentDescriptor = ConcreteComponentDescriptor;
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.cpp b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..71726e674ac8f8b46f114e0fad16398dd48fc945
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.cpp
@@ -0,0 +1,44 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateEventEmitterCpp.js
+ */
+
+#include
+
+
+namespace facebook {
+namespace react {
+
+void ToolbarAndroidEventEmitter::onSelect(OnSelect $event) const {
+ dispatchEvent("select", [$event=std::move($event)](jsi::Runtime &runtime) {
+ auto $payload = jsi::Object(runtime);
+ $payload.setProperty(runtime, "position", $event.position);
+ return $payload;
+ });
+}
+
+
+void ToolbarAndroidEventEmitter::onActionSelected(OnActionSelected $event) const {
+ dispatchEvent("actionSelected", [$event=std::move($event)](jsi::Runtime &runtime) {
+ auto $payload = jsi::Object(runtime);
+ $payload.setProperty(runtime, "position", $event.position);
+ return $payload;
+ });
+}
+
+
+void ToolbarAndroidEventEmitter::onIconClicked(OnIconClicked $event) const {
+ dispatchEvent("iconClicked", [](jsi::Runtime &runtime) {
+ auto $payload = jsi::Object(runtime);
+
+ return $payload;
+ });
+}
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.h b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.h
new file mode 100644
index 0000000000000000000000000000000000000000..69b47713e5c1f6e7dd2d3d37ba7d6a4a2f30696e
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/EventEmitters.h
@@ -0,0 +1,39 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateEventEmitterH.js
+ */
+#pragma once
+
+#include
+
+
+namespace facebook {
+namespace react {
+class ToolbarAndroidEventEmitter : public ViewEventEmitter {
+ public:
+ using ViewEventEmitter::ViewEventEmitter;
+
+ struct OnSelect {
+ int position;
+ };
+
+ struct OnActionSelected {
+ int position;
+ };
+
+ struct OnIconClicked {
+
+ };
+ void onSelect(OnSelect value) const;
+
+ void onActionSelected(OnActionSelected value) const;
+
+ void onIconClicked(OnIconClicked value) const;
+};
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.cpp b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b0a19b794fa42774a871a599ad8c25a7b9eb4913
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.cpp
@@ -0,0 +1,41 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GeneratePropsCpp.js
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+namespace facebook {
+namespace react {
+
+ToolbarAndroidProps::ToolbarAndroidProps(
+ const PropsParserContext &context,
+ const ToolbarAndroidProps &sourceProps,
+ const RawProps &rawProps): ViewProps(context, sourceProps, rawProps),
+
+ nativeActions(convertRawProp(context, rawProps, "nativeActions", sourceProps.nativeActions, {})),
+ actions(convertRawProp(context, rawProps, "actions", sourceProps.actions, {})),
+ logo(convertRawProp(context, rawProps, "logo", sourceProps.logo, {})),
+ navIcon(convertRawProp(context, rawProps, "navIcon", sourceProps.navIcon, {})),
+ overflowIcon(convertRawProp(context, rawProps, "overflowIcon", sourceProps.overflowIcon, {})),
+ subtitle(convertRawProp(context, rawProps, "subtitle", sourceProps.subtitle, {})),
+ subtitleColor(convertRawProp(context, rawProps, "subtitleColor", sourceProps.subtitleColor, {})),
+ title(convertRawProp(context, rawProps, "title", sourceProps.title, {})),
+ titleColor(convertRawProp(context, rawProps, "titleColor", sourceProps.titleColor, {})),
+ contentInsetStart(convertRawProp(context, rawProps, "contentInsetStart", sourceProps.contentInsetStart, {0})),
+ contentInsetEnd(convertRawProp(context, rawProps, "contentInsetEnd", sourceProps.contentInsetEnd, {0})),
+ rtl(convertRawProp(context, rawProps, "rtl", sourceProps.rtl, {false})),
+ testID(convertRawProp(context, rawProps, "testID", sourceProps.testID, {}))
+ {}
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.h b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.h
new file mode 100644
index 0000000000000000000000000000000000000000..2652ca1b910b9fd04df8acf6059d325e0fbe6cb0
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/Props.h
@@ -0,0 +1,42 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GeneratePropsH.js
+ */
+#pragma once
+
+#include
+#include
+#include
+
+namespace facebook {
+namespace react {
+
+class ToolbarAndroidProps final : public ViewProps {
+ public:
+ ToolbarAndroidProps() = default;
+ ToolbarAndroidProps(const PropsParserContext& context, const ToolbarAndroidProps &sourceProps, const RawProps &rawProps);
+
+#pragma mark - Props
+
+ folly::dynamic nativeActions{};
+ folly::dynamic actions{};
+ ImageSource logo{};
+ ImageSource navIcon{};
+ ImageSource overflowIcon{};
+ std::string subtitle{};
+ std::string subtitleColor{};
+ std::string title{};
+ std::string titleColor{};
+ int contentInsetStart{0};
+ int contentInsetEnd{0};
+ bool rtl{false};
+ std::string testID{};
+};
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.cpp b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e0376829f5e3b7e4febc85823e7d5c7c3ea63583
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.cpp
@@ -0,0 +1,19 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateShadowNodeCpp.js
+ */
+
+#include
+
+namespace facebook {
+namespace react {
+
+extern const char ToolbarAndroidComponentName[] = "ToolbarAndroid";
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.h b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.h
new file mode 100644
index 0000000000000000000000000000000000000000..0758651011df63f450b3bcde91ce3a9ef000cdbf
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/ShadowNodes.h
@@ -0,0 +1,34 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateShadowNodeH.js
+ */
+
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+
+namespace facebook {
+namespace react {
+
+JSI_EXPORT extern const char ToolbarAndroidComponentName[];
+
+/*
+ * `ShadowNode` for component.
+ */
+using ToolbarAndroidShadowNode = ConcreteViewShadowNode<
+ ToolbarAndroidComponentName,
+ ToolbarAndroidProps,
+ ToolbarAndroidEventEmitter,
+ ToolbarAndroidState>;
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.cpp b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c676b58024415422bb76b877188023befb3942a0
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.cpp
@@ -0,0 +1,18 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateStateCpp.js
+ */
+#include
+
+namespace facebook {
+namespace react {
+
+
+
+} // namespace react
+} // namespace facebook
diff --git a/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.h b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.h
new file mode 100644
index 0000000000000000000000000000000000000000..665a9d5537b9d6a52e6dda720bc7bbaf43ce7da1
--- /dev/null
+++ b/harmony/toolbar_android/src/main/cpp/generated/react/renderer/components/toolbar_android/States.h
@@ -0,0 +1,36 @@
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateStateH.js
+ */
+#pragma once
+
+#ifdef ANDROID
+#include
+#include
+#include
+#endif
+
+namespace facebook {
+namespace react {
+
+class ToolbarAndroidState {
+public:
+ ToolbarAndroidState() = default;
+
+#ifdef ANDROID
+ ToolbarAndroidState(ToolbarAndroidState const &previousState, folly::dynamic data){};
+ folly::dynamic getDynamic() const {
+ return {};
+ };
+ MapBuffer getMapBuffer() const {
+ return MapBufferBuilder::EMPTY();
+ };
+#endif
+};
+
+} // namespace react
+} // namespace facebook
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/ets/Constants.ets b/harmony/toolbar_android/src/main/ets/Constants.ets
new file mode 100644
index 0000000000000000000000000000000000000000..6f048f3b691733622ac3b02ed07c1ec7e041ea61
--- /dev/null
+++ b/harmony/toolbar_android/src/main/ets/Constants.ets
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
+ * Licensed under the MIT 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
+ *
+ * https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE
+ *
+ * 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.
+ */
+
+export class Constants {
+ public static EVENT_NAME = 'ToolbarAndroid';
+
+ public static DEFAULT_WINDOW_WIDTH = 1080;
+
+ public static DEFAULT_NAV_ICON_SIZE = 56;
+
+ public static DEFAULT_LOGO_SIZE = 48;
+
+ public static DEFAULT_MENU_ITEM_SIZE = 36;
+
+ public static DEFAULT_MENU_ITEM_MARGIN = 8;
+
+ public static DEFAULT_MORE_ICON_SIZE = 24;
+}
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/ets/RNCToolbarAndroid.ets b/harmony/toolbar_android/src/main/ets/RNCToolbarAndroid.ets
new file mode 100644
index 0000000000000000000000000000000000000000..4021ab5f18416480a855a653c2f75f3bebb63f6b
--- /dev/null
+++ b/harmony/toolbar_android/src/main/ets/RNCToolbarAndroid.ets
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
+ * Licensed under the MIT 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
+ *
+ * https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE
+ *
+ * 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 { RNComponentContext, RNViewBase } from '@rnoh/react-native-openharmony';
+import { ToolbarAndroid as GENERATED } from './generated/components/ToolbarAndroid'
+import { Toolbar } from './Toolbar';
+
+
+@Component
+export struct RNCToolbarAndroid {
+ public static readonly NAME = GENERATED.NAME
+ public ctx!: RNComponentContext
+ public tag: number = 0
+ @State private descriptorWrapper: GENERATED.DescriptorWrapper = {} as GENERATED.DescriptorWrapper
+ @State private descriptor: GENERATED.Descriptor = {} as GENERATED.Descriptor
+ private cleanUpCallbacks: (() => void)[] = []
+
+ aboutToAppear(){
+ this.descriptor = this.ctx.descriptorRegistry.getDescriptor(this.tag);
+ this.onDescriptorWrapperChange(this.ctx.descriptorRegistry.findDescriptorWrapperByTag(this.tag)!)
+ this.cleanUpCallbacks.push(this.ctx.descriptorRegistry.subscribeToDescriptorChanges(this.tag,
+ (_descriptor, newDescriptorWrapper) => {
+ this.onDescriptorWrapperChange(newDescriptorWrapper! as GENERATED.DescriptorWrapper)
+ }
+ ))
+ }
+
+ private onDescriptorWrapperChange(descriptorWrapper: GENERATED.DescriptorWrapper){
+ this.descriptorWrapper = descriptorWrapper
+ }
+
+ aboutToDisappear(){
+ this.cleanUpCallbacks.forEach(cb => cb())
+ }
+
+ build(){
+ RNViewBase({ ctx: this.ctx, tag: this.tag }) {
+ Toolbar({
+ ctx: this.ctx,
+ tag: this.tag,
+ descriptorWrapper: this.descriptorWrapper,
+ layoutSize: this.descriptor.layoutMetrics.frame.size
+ })
+ }
+ }
+}
\ No newline at end of file
diff --git a/harmony/toolbar_android/src/main/ets/Toolbar.ets b/harmony/toolbar_android/src/main/ets/Toolbar.ets
new file mode 100644
index 0000000000000000000000000000000000000000..5470597b99ef4ba54a170fb84ccbd1455b6cbba9
--- /dev/null
+++ b/harmony/toolbar_android/src/main/ets/Toolbar.ets
@@ -0,0 +1,600 @@
+/*
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
+ * Licensed under the MIT 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
+ *
+ * https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE
+ *
+ * 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 { image } from '@kit.ImageKit';
+import { http } from '@kit.NetworkKit';
+import measure from '@ohos.measure';
+import ResponseCode from '@ohos.net.http';
+import { RNOHContext, Size } from '@rnoh/react-native-openharmony';
+import { Constants } from './Constants';
+import { ToolbarAndroid as GENERATED } from './generated/components/ToolbarAndroid'
+
+interface ImageSource {
+ uri: string,
+ width: number,
+ height: number
+}
+
+interface Action {
+ title: string,
+ icon?: ImageSource,
+ show?: string,
+ showWithText?: boolean
+};
+
+enum ShowAsAction {
+ SHOW_AS_ACTION_NEVER = 0,
+ SHOW_AS_ACTION_IF_ROOM = 1,
+ SHOW_AS_ACTION_ALWAYS = 2,
+ SHOW_AS_ACTION_WITH_TEXT = 4
+}
+
+class MenuItem {
+ value: ResourceStr;
+ icon?: ImageSource | undefined;
+ action?: () => void;
+ showAsAction: ShowAsAction;
+ order: number
+
+ constructor(value: ResourceStr, icon: ImageSource | undefined, showAsAction: ShowAsAction, order: number){
+ this.value = value
+ this.icon = icon
+ this.showAsAction = showAsAction
+ this.order = order
+ }
+}
+
+@Component
+export struct Toolbar {
+ private ctx!: RNOHContext;
+ private tag: number = 0;
+ private descriptorWrapper: GENERATED.DescriptorWrapper | undefined = undefined;
+ private layoutSize?: Size;
+ @State navIcon: ImageSource | undefined = undefined;
+ @State navImage: PixelMap | Resource | undefined = undefined;
+ @State isTouchNav: boolean = false;
+ @State logo: ImageSource | undefined = undefined;
+ @State logoImage: PixelMap | Resource | undefined = undefined;
+ @State overflowIcon: ImageSource | undefined = undefined;
+ @State overflowImage: PixelMap | Resource | undefined = undefined;
+ @State isLogoShow: boolean = true;
+ @State isTitleShow: boolean = true;
+ @State touchActionIndex: number = -1;
+ @State isPressAction: boolean = false;
+ @State isTouchMore: boolean = false;
+ @State isInitFinish: boolean = false;
+ @State isShowMenu: boolean = false;
+ @State touchMenuIndex: number = -1;
+ private title: string | undefined= '';
+ private titleColor: string | undefined = '';
+ private subtitle: string | undefined = '';
+ private subtitleColor: string | undefined = '';
+ private actions: Array | undefined = [];
+ private showActions: Array