diff --git a/UI/MultiModeInput/README_en.md b/UI/MultiModeInput/README_en.md
new file mode 100644
index 0000000000000000000000000000000000000000..1217eb07fc3969a23643758adf9dd72a7da084f6
--- /dev/null
+++ b/UI/MultiModeInput/README_en.md
@@ -0,0 +1,21 @@
+# Multimodal Input
+
+##### Introduction
+
+This sample app of multimodal input illustrates how to use APIs such as **KeyEventListener**, **TouchEventListener**, and **SpeechEventListener** to handle corresponding key, touch, and speech events.
+
+##### Usage
+
+The home page of the sample app contains the **touchEvent**, **keyEvent**, **mouseEvent**, and **speechEvent** buttons. The specific implementation is as follows:
+
+1. When you tap the **touchEvent** button, you will be redirected to another page. If you tap the **touch** button on that page, a popup dialog indicating a touch event will be displayed.
+2. When you tap the **keyEvent** button, you will be redirected to another page. If you press the volume key on the phone, a popup dialog indicating a key pressing event will be displayed.
+3. When you tap the **mouseEvent** button, you will be redirected to another page. If you tap the **mouse** button on that page by pressing the left key of the mouse, a popup dialog indicating a mouse click event will be displayed.
+4. When you tap the **speechEvent** button, you will be redirected to another page. If you press the voice assistant button on the remote control of HUAWEI Vision, a popup dialog indicating a speech event will be displayed.
+
+##### Constraints
+
+This sample can only be run on standard-system devices.
+
+The support for multimodal input events varies depending on device types. For details, see [Multimodal Input Overview](https://developer.harmonyos.com/en/docs/documentation/doc-guides/ui-multimodal-overview-0000000000031876).
+
diff --git a/UI/MultiModeInput/README_zh.md b/UI/MultiModeInput/README_zh.md
new file mode 100644
index 0000000000000000000000000000000000000000..84c77269ad4f88953a1293ea4d91d64724386cbc
--- /dev/null
+++ b/UI/MultiModeInput/README_zh.md
@@ -0,0 +1,21 @@
+# 多模输入
+
+##### 简介
+
+本示例通过实现相关接口KeyEventListener、TouchEventListener、SpeechEventListener等,对相应的事件进行处理,例如按键事件、触摸事件、语音事件等。
+
+##### 使用说明
+
+本事例主页面包含触摸事件按钮、按键事件按钮、鼠标事件按钮、语音事件按钮;
+
+1. 当点击触摸事件按钮时,跳转到另一个页面,用手指触摸当前页面上的按钮,页面上会弹出提示框显示触摸事件;
+2. 当点击按键事件按钮时,跳转到另一个页面,按手机的音量键,页面上会弹出提示框显示按键事件;
+3. 当点击鼠标事件按钮时,跳转到另一个页面,用鼠标左键点击当前页面上的按钮,页面上会弹出提示框显示鼠标事件;
+4. 当点击语音事件按钮时,跳转到另一个页面,按智慧屏遥控器上的语音按钮,页面上会弹出提示框显示语音事件。
+
+##### 约束与限制
+
+本示例仅支持在标准系统上运行;
+
+多模输入事件在不同形态产品支持的情况请[点击链接](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-multimodal-overview-0000000000031876)查看。
+
diff --git a/UI/MultiModeInput/build.gradle b/UI/MultiModeInput/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..53acf4ea9a983c94dae8756817c76dff347e9cbd
--- /dev/null
+++ b/UI/MultiModeInput/build.gradle
@@ -0,0 +1,35 @@
+apply plugin: 'com.huawei.ohos.app'
+
+ohos {
+ compileSdkVersion 5
+ defaultConfig {
+ compatibleSdkVersion 4
+ }
+}
+
+buildscript {
+ repositories {
+ maven {
+ url 'https://repo.huaweicloud.com/repository/maven/'
+ }
+ maven {
+ url 'https://developer.huawei.com/repo/'
+ }
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.huawei.ohos:hap:2.4.4.2'
+ }
+}
+
+allprojects {
+ repositories {
+ maven {
+ url 'https://repo.huaweicloud.com/repository/maven/'
+ }
+ maven {
+ url 'https://developer.huawei.com/repo/'
+ }
+ jcenter()
+ }
+}
diff --git a/UI/MultiModeInput/entry/build.gradle b/UI/MultiModeInput/entry/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d63e339a8369962efa34b5ec64b6522249f14218
--- /dev/null
+++ b/UI/MultiModeInput/entry/build.gradle
@@ -0,0 +1,19 @@
+apply plugin: 'com.huawei.ohos.hap'
+ohos {
+ compileSdkVersion 5
+ defaultConfig {
+ compatibleSdkVersion 4
+ }
+ buildTypes {
+ release {
+ proguardOpt {
+ proguardEnabled false
+ rulesFiles 'proguard-rules.pro'
+ }
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
+}
diff --git a/UI/MultiModeInput/entry/src/main/config.json b/UI/MultiModeInput/entry/src/main/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..4745d739415ac6f4521efca17e9d9d8ca2162629
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/config.json
@@ -0,0 +1,65 @@
+{
+ "app": {
+ "bundleName": "ohos.samples.multimodeinput",
+ "version": {
+ "code": 1000000,
+ "name": "1.0"
+ }
+ },
+ "deviceConfig": {},
+ "module": {
+ "package": "ohos.samples.multimodeinput",
+ "name": ".MyApplication",
+ "deviceType": [
+ "default"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "entry",
+ "moduleType": "entry"
+ },
+ "abilities": [
+ {
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ],
+ "orientation": "unspecified",
+ "name": "ohos.samples.multimodeinput.MainAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ }
+ ],
+ "reqPermissions": [
+ {
+ "name": "ohos.permission.MULTIMODAL_INTERACTIVE",
+ "reason": "",
+ "usedScene": {
+ "ability": [
+ ".MainAbility"
+ ],
+ "when": "inuse"
+ }
+ },
+ {
+ "name": "ohos.permission.WRITE_EXTERNAL_STORAGE",
+ "reason": "",
+ "usedScene": {
+ "ability": [
+ ".MainAbility"
+ ],
+ "when": "inuse"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MainAbility.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MainAbility.java
new file mode 100644
index 0000000000000000000000000000000000000000..59407a020c29845f09fcd204b19efd3a3334a9c8
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MainAbility.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput;
+
+import ohos.samples.multimodeinput.slice.MainAbilitySlice;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+
+/**
+ * MainAbility
+ *
+ * @since 2021-05-20
+ */
+public class MainAbility extends Ability {
+ @Override
+ public void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setMainRoute(MainAbilitySlice.class.getName());
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MyApplication.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MyApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..d82ee4bc2e647776f9212372b354884b8672c568
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/MyApplication.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput;
+
+import ohos.aafwk.ability.AbilityPackage;
+
+/**
+ * MyApplication
+ *
+ * @since 2021-05-20
+ */
+public class MyApplication extends AbilityPackage {
+ @Override
+ public void onInitialize() {
+ super.onInitialize();
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/KeyEventAbilitySlice.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/KeyEventAbilitySlice.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2e028c217616debd717cdbdeb99bc314e057aa1
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/KeyEventAbilitySlice.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.slice;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.KeyEvent;
+import ohos.samples.multimodeinput.ResourceTable;
+import ohos.samples.multimodeinput.utils.Utils;
+
+import java.lang.ref.WeakReference;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * KeyAbilitySlice
+ *
+ * @since 2021-05-12
+ */
+public class KeyEventAbilitySlice extends AbilitySlice {
+ private static final String TAG = "KeyEventAbilitySlice";
+
+ private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
+
+ /**
+ * BACK_KEY_CODE BACK KEY KEYCODE
+ */
+ private static final int BACK_KEY_CODE = 2;
+
+ private Component componentKey;
+
+ private Utils utils = Utils.getInstance();
+
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ setUIContent(ResourceTable.Layout_key_main_ability_slice);
+ componentKey = findComponentById(ResourceTable.Id_key_event_text);
+ HiLog.info(LABEL_LOG, "setKeyEventListener");
+ componentKey.setKeyEventListener(onKeyEvent);
+ componentKey.setTouchFocusable(true);
+ componentKey.setFocusable(Component.FOCUS_ENABLE);
+ componentKey.requestFocus();
+ }
+
+ private void showKeyEvent(KeyEvent keyEvent) {
+ WeakReference referenceContext = new WeakReference<>(getContext());
+ String[] items = new String[] {
+ "This is keyEvent",
+ "Current Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(new Date().getTime()),
+ "keyCode Value: " + keyEvent.getKeyCode(),
+ "Key press duration: " + keyEvent.getKeyDownDuration(),
+ "Is Key Pressed: " + keyEvent.isKeyDown()
+ };
+ utils.showDialogBox(items, referenceContext.get());
+ }
+
+ private Component.KeyEventListener onKeyEvent = new Component.KeyEventListener() {
+ @Override
+ public boolean onKeyEvent(Component component, KeyEvent keyEvent) {
+ HiLog.info(LABEL_LOG, "onKeyEvent");
+ if (keyEvent.isKeyDown()) {
+ int keyCode = keyEvent.getKeyCode();
+ if (keyCode != BACK_KEY_CODE) {
+ showKeyEvent(keyEvent);
+ }
+ }
+ return false;
+ }
+ };
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ utils.distroyDialogBox();
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MainAbilitySlice.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MainAbilitySlice.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1bd29c338e9a5e48f7e9abf6b9c7b10664e85ef
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MainAbilitySlice.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.slice;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.samples.multimodeinput.ResourceTable;
+
+/**
+ * MainAbilitySlice
+ *
+ * @since 2021-05-12
+ */
+public class MainAbilitySlice extends AbilitySlice {
+ @Override
+ public void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_main_ability_slice);
+ Component componentTouch = findComponentById(ResourceTable.Id_touchEvent);
+ componentTouch.setClickedListener(listener -> present(new TouchAbilitySlice(), new Intent()));
+
+ Component componentKey = findComponentById(ResourceTable.Id_keyEvent);
+ componentKey.setClickedListener(listener -> present(new KeyEventAbilitySlice(), new Intent()));
+
+ Component componentMouse = findComponentById(ResourceTable.Id_mouseEvent);
+ componentMouse.setClickedListener(listener -> present(new MouseEventSlice(), new Intent()));
+
+ Component componentSpeech = findComponentById(ResourceTable.Id_speechEvent);
+ componentSpeech.setClickedListener(listener -> present(new SpeechAbilitySlice(), new Intent()));
+ }
+
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MouseEventSlice.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MouseEventSlice.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ed86c1009b4f15f47f92363b31faa32fc362981
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/MouseEventSlice.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.slice;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.MouseEvent;
+import ohos.multimodalinput.event.TouchEvent;
+import ohos.multimodalinput.standard.MultimodalEventHandle;
+import ohos.multimodalinput.standard.TouchEventHandle;
+import ohos.samples.multimodeinput.ResourceTable;
+import ohos.samples.multimodeinput.utils.Utils;
+
+import java.lang.ref.WeakReference;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * MouseEventSlice
+ *
+ * @since 2021-06-30
+ */
+public class MouseEventSlice extends AbilitySlice {
+ private static final String TAG = "MouseEventSlice";
+
+ private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
+
+ private Utils utils = Utils.getInstance();
+
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ setUIContent(ResourceTable.Layout_mouse_ability_slice);
+ MultimodalEventHandle.registerStandardizedEventHandle(getAbility(), touchEvent);
+ }
+
+ private TouchEventHandle touchEvent = event -> {
+ HiLog.info(LABEL_LOG, "mouseEvent");
+ if (event.getMultimodalEvent() instanceof MouseEvent) {
+ MouseEvent mouseEvent = (MouseEvent) event.getMultimodalEvent();
+ showMouseEvent(mouseEvent);
+ } else {
+ showTouchEvent(event);
+ }
+ return false;
+ };
+
+ private void showMouseEvent(MouseEvent mouseEvent) {
+ WeakReference referenceContext = new WeakReference<>(getContext());
+ String[] items = new String[] {
+ "This is MouseEvent",
+ "Current Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(new Date().getTime()),
+ "Mouse Button Pressed:" + mouseEvent.getPressedButtons()
+ };
+ utils.showDialogBox(items, referenceContext.get());
+ }
+
+ private void showTouchEvent(TouchEvent touchEvent) {
+ Date date = new Date();
+ WeakReference referenceContext = new WeakReference<>(getContext());
+ String[] items = new String[] {
+ "This is TouchEvent",
+ "Current Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(date.getTime()),
+ "Operation Start Time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(date.getTime() - touchEvent.getStartTime()),
+ "Event Phase: " + touchEvent.getPhase()
+ };
+ utils.showDialogBox(items, referenceContext.get());
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ utils.distroyDialogBox();
+ MultimodalEventHandle.unregisterStandardizedEventHandle(getAbility(), touchEvent);
+ }
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/SpeechAbilitySlice.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/SpeechAbilitySlice.java
new file mode 100644
index 0000000000000000000000000000000000000000..697407f797e2d0403f63eb5339ce6f26d9d24b19
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/SpeechAbilitySlice.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.slice;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.SpeechEvent;
+import ohos.samples.multimodeinput.ResourceTable;
+import ohos.samples.multimodeinput.utils.Utils;
+
+import java.lang.ref.WeakReference;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * MmiPointAbilitySlice
+ *
+ * @since 2021-05-12
+ */
+public class SpeechAbilitySlice extends AbilitySlice {
+ private static final String TAG = "SpeechAbilitySlice";
+
+ private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
+
+ private static final String VOICE_EVENT_KEY = "MOVE";
+
+ private Component componentSpeech;
+
+ private Utils utils = Utils.getInstance();
+
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_second_main_ability_slice);
+ componentSpeech = findComponentById(ResourceTable.Id_speech_event_button);
+ componentSpeech.subscribeVoiceEvents(new Component.VoiceEvent(VOICE_EVENT_KEY));
+ componentSpeech.setSpeechEventListener(onSpeechEvent);
+ }
+
+ private Component.SpeechEventListener onSpeechEvent = new Component.SpeechEventListener() {
+ @Override
+ public boolean onSpeechEvent(Component component, SpeechEvent speechEvent) {
+ HiLog.info(LABEL_LOG, "onSpeechEvent");
+ if (speechEvent.getActionProperty() == VOICE_EVENT_KEY) {
+ showSpeechEvent();
+ }
+ return false;
+ }
+ };
+
+ private void showSpeechEvent() {
+ WeakReference referenceContext = new WeakReference<>(getContext());
+ String[] items = new String[] {
+ "This is speechEvent",
+ "Current Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(new Date().getTime())
+ };
+ utils.showDialogBox(items, referenceContext.get());
+ }
+
+ @Override
+ protected void onActive() {
+ super.onActive();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ utils.distroyDialogBox();
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/TouchAbilitySlice.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/TouchAbilitySlice.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbe6791fb7e5b270fd50ba0fb1f8a23e303c6efa
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/slice/TouchAbilitySlice.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.slice;
+
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.TouchEvent;
+import ohos.samples.multimodeinput.ResourceTable;
+import ohos.samples.multimodeinput.utils.Utils;
+
+import java.lang.ref.WeakReference;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * KeyAbilitySlice
+ *
+ * @since 2021-05-12
+ */
+public class TouchAbilitySlice extends AbilitySlice {
+ private static final String TAG = "TouchAbilitySlice";
+
+ private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
+
+ private Component componentTouch;
+
+ private Utils utils = Utils.getInstance();
+
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ setUIContent(ResourceTable.Layout_first_main_ability_slice);
+
+ componentTouch = findComponentById(ResourceTable.Id_touch_event_button);
+ HiLog.info(LABEL_LOG, "setTouchEventListener");
+ componentTouch.setTouchEventListener(onTouchEvent);
+ }
+
+ private void showTouchEvent(TouchEvent touchEvent) {
+ Date date = new Date();
+ WeakReference referenceContext = new WeakReference<>(getContext());
+ String[] items = new String[] {
+ "This is TouchEvent",
+ "Current Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(date.getTime()),
+ "Operation Start Time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
+ Locale.getDefault()).format(date.getTime() - touchEvent.getStartTime()),
+ "Event Phase: " + touchEvent.getPhase()
+ };
+ utils.showDialogBox(items, referenceContext.get());
+ }
+
+ private Component.TouchEventListener onTouchEvent = new Component.TouchEventListener() {
+ @Override
+ public boolean onTouchEvent(Component component, TouchEvent touchEvent) {
+ HiLog.info(LABEL_LOG, "onTouchEvent");
+ showTouchEvent(touchEvent);
+ return true;
+ }
+ };
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ utils.distroyDialogBox();
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/utils/Utils.java b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/utils/Utils.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba8b4d761c56fcdec7d3baff4111221e4a55c1f7
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/java/ohos/samples/multimodeinput/utils/Utils.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+
+package ohos.samples.multimodeinput.utils;
+
+import ohos.agp.utils.TextAlignment;
+import ohos.agp.window.dialog.ListDialog;
+import ohos.app.Context;
+
+import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
+
+/**
+ * Utils
+ *
+ * @since 2021-06-08
+ */
+public class Utils {
+ private static final int DIALOG_BOX_WIDTH = 985;
+
+ /**
+ * listDialog ListDialog
+ */
+ private ListDialog listDialog;
+
+ private static Utils instance;
+
+ private Utils (){
+ }
+
+ public static synchronized Utils getInstance() {
+ if (instance == null) {
+ instance = new Utils();
+ }
+ return instance;
+ }
+
+ /**
+ * showDialogBox
+ *
+ * @param items string array
+ * @param context Context
+ */
+ public void showDialogBox(String[] items, Context context) {
+ listDialog = new ListDialog(context);
+ listDialog.setAlignment(TextAlignment.CENTER);
+ listDialog.setSize(DIALOG_BOX_WIDTH, MATCH_CONTENT);
+ listDialog.setAutoClosable(true);
+ listDialog.setItems(items);
+ listDialog.show();
+ }
+
+ /**
+ * distroyDialogBox
+ */
+ public void distroyDialogBox() {
+ if (listDialog != null) {
+ listDialog.destroy();
+ }
+ }
+}
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/element/color.json b/UI/MultiModeInput/entry/src/main/resources/base/element/color.json
new file mode 100644
index 0000000000000000000000000000000000000000..9c4751cd0da876ca926a9a5d3c7b1238b5786ac5
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/element/color.json
@@ -0,0 +1,64 @@
+{
+ "color": [
+ {
+ "name": "color_button_blue_empty",
+ "value": "#0000FF"
+ },
+ {
+ "name": "color_button_blue_pressed",
+ "value": "#0000CC"
+ },
+ {
+ "name": "color_button_blue_text",
+ "value": "#FFFFFF"
+ },
+ {
+ "name": "color_button_gray_empty",
+ "value": "#E5E5E5"
+ },
+ {
+ "name": "color_button_gray_pressed",
+ "value": "#D0D0D0"
+ },
+ {
+ "name": "color_button_gray_text",
+ "value": "#0F0F0F"
+ },
+ {
+ "name": "color_button_white_empty",
+ "value": "#FAFAFA"
+ },
+ {
+ "name": "color_button_white_pressed",
+ "value": "#E5E5E5"
+ },
+ {
+ "name": "color_button_white_text",
+ "value": "#0F0F0F"
+ },
+ {
+ "name": "color_transparent",
+ "value": "#00000000"
+ },
+ {
+ "name": "color_white",
+ "value": "#FFFFFF"
+ },
+ {
+ "name": "color_dialog_title_text",
+ "value": "#000000"
+ },
+ {
+ "name": "color_dialog_content_text",
+ "value": "#5F5F5F"
+ },
+ {
+ "name": "color_dialog_button_text_blue",
+ "value": "#0044FF"
+ },
+ {
+ "name": "color_dialog_button_line",
+ "value": "#9F9F9F"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/element/float.json b/UI/MultiModeInput/entry/src/main/resources/base/element/float.json
new file mode 100644
index 0000000000000000000000000000000000000000..39d19dd54faa22f3ef074e8f1dcc9837390636ff
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/element/float.json
@@ -0,0 +1,44 @@
+{
+ "float": [
+ {
+ "name": "button_height",
+ "value": "40vp"
+ },
+ {
+ "name": "button_width",
+ "value": "280vp"
+ },
+ {
+ "name": "button_margin",
+ "value": "10vp"
+ },
+ {
+ "name": "button_text_size",
+ "value": "18fp"
+ },
+ {
+ "name": "dialog_padding",
+ "value": "20vp"
+ },
+ {
+ "name": "dialog_content_padding",
+ "value": "10vp"
+ },
+ {
+ "name": "title_text_size",
+ "value": "18fp"
+ },
+ {
+ "name": "content_text_size",
+ "value": "16fp"
+ },
+ {
+ "name": "dialog_button_height",
+ "value": "40vp"
+ },
+ {
+ "name": "dialog_check_box_size",
+ "value": "20vp"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/element/string.json b/UI/MultiModeInput/entry/src/main/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..c5c72108637ec896126d1109520aeaf7d730b5d1
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/element/string.json
@@ -0,0 +1,44 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "MultiModeInput"
+ },
+ {
+ "name": "mainability_description",
+ "value": "Java_Phone_Empty Feature Ability"
+ },
+ {
+ "name": "key_text",
+ "value": "Please Press Key"
+ },
+ {
+ "name": "touch_event",
+ "value": "touchEvent"
+ },
+ {
+ "name": "key_event",
+ "value": "keyEvent"
+ },
+ {
+ "name": "mouse_event",
+ "value": "mouseEvent"
+ },
+ {
+ "name": "speech_event",
+ "value": "speechEvent"
+ },
+ {
+ "name": "touch_button",
+ "value": "button"
+ },
+ {
+ "name": "mouse_button",
+ "value": "Left mouse click"
+ },
+ {
+ "name": "speech_button",
+ "value": "button"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_ability_main.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_ability_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..44fb1387798e43f7b7fdf3f4886d8213bcc2618b
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_ability_main.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_dialog.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_dialog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..36020615303d6dbf24954e19c885bc50c6a979eb
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/background_dialog.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_bg.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_bg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6fd0ed08caa486a06b4c48358121e5b7985d916c
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_bg.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c7ac8a58fa538cb49c2002099764577c5465bfe3
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_empty.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_empty.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7d0ecf30a505dffd62934daa194486c7de10e3f1
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_empty.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_pressed.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_pressed.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1d11532e05a71249462cc31a5731bfd43f7ebe91
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_blue_pressed.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f2859423912e99acb8f835cea1d5d487079c290
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_empty.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_empty.xml
new file mode 100644
index 0000000000000000000000000000000000000000..20ffd312b56126e6d2ebffc59dda5789f0e2d302
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_empty.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_pressed.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_pressed.xml
new file mode 100644
index 0000000000000000000000000000000000000000..29132e747d6d0eda3fededa72b86be6c69447047
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_gray_pressed.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e0079165aed84710c26eb2bab5e088c9af0c711
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_empty.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_empty.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d4bb25a22b2091992a9e1a216ffaa7b8dca3abb7
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_empty.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_pressed.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_pressed.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b90569bb1a429101bb969f061a84e482a2ee756e
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/button_white_pressed.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/dialog_button.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/dialog_button.xml
new file mode 100644
index 0000000000000000000000000000000000000000..174065f8b2c407743f6b64418d02411cfb18311b
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/dialog_button.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e7a8dff1bb775f84fa271aa9d44ecfab75b98350
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_clicked.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_clicked.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5242e7b270579ac58fdba9d0fc7a0942e613a805
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_clicked.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_nomral.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_nomral.xml
new file mode 100644
index 0000000000000000000000000000000000000000..85330edb5fc89c9d4a053fd22d75fb5ce6ff372a
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/list_item_nomral.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e5a6084e7df501b413a9d4e4c435690346e8b28
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_checked.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_checked.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dadda3763a5d06b797630c3f28d6a0e79cdb3f6f
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_checked.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_normal.xml b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_normal.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4aa73988b20bc6e3c1d9c8b1d3f8e733c4f1a259
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/graphic/single_box_normal.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/layout/first_main_ability_slice.xml b/UI/MultiModeInput/entry/src/main/resources/base/layout/first_main_ability_slice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a78c91629ad0ad757d6dd213f69c2407bd67877b
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/layout/first_main_ability_slice.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/layout/key_main_ability_slice.xml b/UI/MultiModeInput/entry/src/main/resources/base/layout/key_main_ability_slice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4a567f1c85807d46cd4d7d10b09ca78daabe19db
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/layout/key_main_ability_slice.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/layout/main_ability_slice.xml b/UI/MultiModeInput/entry/src/main/resources/base/layout/main_ability_slice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c4b32806d7f8cc85941eb5a68d95f22a6b18b65
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/layout/main_ability_slice.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/layout/mouse_ability_slice.xml b/UI/MultiModeInput/entry/src/main/resources/base/layout/mouse_ability_slice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a033dd34069a0d82ca93423aaac18ef63057837
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/layout/mouse_ability_slice.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/layout/second_main_ability_slice.xml b/UI/MultiModeInput/entry/src/main/resources/base/layout/second_main_ability_slice.xml
new file mode 100644
index 0000000000000000000000000000000000000000..df0de1286d5ab2309c8e2828cc688e69785924e8
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/base/layout/second_main_ability_slice.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/base/media/icon.png b/UI/MultiModeInput/entry/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/UI/MultiModeInput/entry/src/main/resources/base/media/icon.png differ
diff --git a/UI/MultiModeInput/entry/src/main/resources/en/element/string.json b/UI/MultiModeInput/entry/src/main/resources/en/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..c5c72108637ec896126d1109520aeaf7d730b5d1
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/en/element/string.json
@@ -0,0 +1,44 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "MultiModeInput"
+ },
+ {
+ "name": "mainability_description",
+ "value": "Java_Phone_Empty Feature Ability"
+ },
+ {
+ "name": "key_text",
+ "value": "Please Press Key"
+ },
+ {
+ "name": "touch_event",
+ "value": "touchEvent"
+ },
+ {
+ "name": "key_event",
+ "value": "keyEvent"
+ },
+ {
+ "name": "mouse_event",
+ "value": "mouseEvent"
+ },
+ {
+ "name": "speech_event",
+ "value": "speechEvent"
+ },
+ {
+ "name": "touch_button",
+ "value": "button"
+ },
+ {
+ "name": "mouse_button",
+ "value": "Left mouse click"
+ },
+ {
+ "name": "speech_button",
+ "value": "button"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/entry/src/main/resources/zh/element/string.json b/UI/MultiModeInput/entry/src/main/resources/zh/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..cace7bd7ad4c5b5b2497517f135780eb67402428
--- /dev/null
+++ b/UI/MultiModeInput/entry/src/main/resources/zh/element/string.json
@@ -0,0 +1,44 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "多模输入"
+ },
+ {
+ "name": "mainability_description",
+ "value": "Java_Phone_Empty Feature Ability"
+ },
+ {
+ "name": "key_text",
+ "value": "请按音量键"
+ },
+ {
+ "name": "touch_event",
+ "value": "触摸事件"
+ },
+ {
+ "name": "key_event",
+ "value": "按键事件"
+ },
+ {
+ "name": "mouse_event",
+ "value": "鼠标事件"
+ },
+ {
+ "name": "speech_event",
+ "value": "语音事件"
+ },
+ {
+ "name": "touch_button",
+ "value": "按钮"
+ },
+ {
+ "name": "mouse_button",
+ "value": "鼠标左键点击"
+ },
+ {
+ "name": "speech_button",
+ "value": "按钮"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/UI/MultiModeInput/screenshots/device/button.png b/UI/MultiModeInput/screenshots/device/button.png
new file mode 100644
index 0000000000000000000000000000000000000000..3398024c1967173ab27f01f18009b62403ee3ac0
Binary files /dev/null and b/UI/MultiModeInput/screenshots/device/button.png differ
diff --git a/UI/MultiModeInput/screenshots/device/keyevent.png b/UI/MultiModeInput/screenshots/device/keyevent.png
new file mode 100644
index 0000000000000000000000000000000000000000..db7d342e5445c3de1bb5d273d853c17a793d1b4c
Binary files /dev/null and b/UI/MultiModeInput/screenshots/device/keyevent.png differ
diff --git a/UI/MultiModeInput/screenshots/device/touchevent.png b/UI/MultiModeInput/screenshots/device/touchevent.png
new file mode 100644
index 0000000000000000000000000000000000000000..1550eef0f33452009a4e7e02c3ac6b13a848f50e
Binary files /dev/null and b/UI/MultiModeInput/screenshots/device/touchevent.png differ
diff --git a/UI/MultiModeInput/settings.gradle b/UI/MultiModeInput/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..7dc3285c045cc590e49d231a4280ef52ba646d91
--- /dev/null
+++ b/UI/MultiModeInput/settings.gradle
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+include ':entry'