0.3.0

PiperOrigin-RevId: 605179968
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6732ec5..ba5078e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+0.3.0
+- Support generating regression test reports.
+
 0.2.2
 - Support running Google Home App of version `3.13.46.1`.
 
diff --git a/README.md b/README.md
index d86c39f..ff95473 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
 #### Python 3
 
 You need a python 3 environment to run the script.
-Google Home UI Automator requires python 3.9 or newer.
+Google Home UI Automator requires python 3.11 or newer.
 
 #### Android phone
 
@@ -52,7 +52,7 @@
 ### Regression Test
 
 ```shell
-$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME --regtest [--repeat <REPEAT_TIMES>]
+$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME --regtest [--repeat <REPEAT_TIMES>] [--hub <HUB_VERSION>] [--dut <MODEL>,<TYPE>,<PROTOCOL>] [--fw <DEVICE_FIRMWARE>]
 ```
 
 *   flag `--regtest` is required
@@ -60,8 +60,16 @@
 *   regression test now only supports commissioning/decommissioning cycle
 *   defaultly, regression test will run until users use keyboard interrupt to
     stop the process
-*   add `--repeat` to run regression test in limited times
-*   `REPEAT_TIMES`: repeated times for regression test
+*   optionally add `--repeat` to run regression test in limited times
+    *   `REPEAT_TIMES`: repeated times for regression test
+*   optionally add `--hub` to include hub version in produced test report
+    *   `HUB_VERSION`: version of hub for controlling devices on GHA
+*   optionally add `--dut` to include device under test in produced test report
+    *   `MODEL`: Model of the device. e.g. `X123123`
+    *   `TYPE`: Type of the device. e.g. `LIGHT`
+    *   `PROTOCOL`: Used protocol of the device. e.g. `MATTER`
+*   optionally add `--fw` to include device firmware in produced test report
+    *   `DEVICE_FIRMWARE`: Firmware of test device.
 
 ## Roadmap
 
diff --git a/setup.py b/setup.py
index 06ff8fa..bc82854 100644
--- a/setup.py
+++ b/setup.py
@@ -55,15 +55,13 @@
     description='Google Home UI Automator',
     long_description=_get_readme(),
     long_description_content_type='text/markdown',
-    python_requires='>=3.9',
+    python_requires='>=3.11',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
         'License :: OSI Approved :: Apache Software License',
         'Operating System :: MacOS',
         'Operating System :: POSIX :: Linux',
-        'Programming Language :: Python :: 3.9',
-        'Programming Language :: Python :: 3.10',
         'Programming Language :: Python :: 3.11',
         'Programming Language :: Python :: 3.12',
         'Programming Language :: Python :: 3.13',
diff --git a/ui_automator/android/app/snippet-0.3.0-rc.2.apk b/ui_automator/android/app/snippet-0.3.0.apk
similarity index 98%
rename from ui_automator/android/app/snippet-0.3.0-rc.2.apk
rename to ui_automator/android/app/snippet-0.3.0.apk
index a92f561..621fed4 100644
--- a/ui_automator/android/app/snippet-0.3.0-rc.2.apk
+++ b/ui_automator/android/app/snippet-0.3.0.apk
Binary files differ
diff --git a/ui_automator/ui_automator.py b/ui_automator/ui_automator.py
index 86eb59f..4baae59 100644
--- a/ui_automator/ui_automator.py
+++ b/ui_automator/ui_automator.py
@@ -447,7 +447,7 @@
         os.path.dirname(os.path.abspath(__file__)),
         'android',
         'app',
-        'snippet-0.3.0-rc.2.apk',
+        'snippet-0.3.0.apk',
     )
 
   def _add_test_to_commission_test_suite(
diff --git a/ui_automator/ui_automator_test.py b/ui_automator/ui_automator_test.py
index 6f9d2c6..69ae320 100644
--- a/ui_automator/ui_automator_test.py
+++ b/ui_automator/ui_automator_test.py
@@ -211,7 +211,7 @@
     self.ui_automator.load_snippet()
 
     self.mock_android_device.adb.install.assert_called_once_with(
-        ['-r', '-g', '/path/to/android/app/snippet-0.3.0-rc.2.apk']
+        ['-r', '-g', '/path/to/android/app/snippet-0.3.0.apk']
     )
     self.mock_android_device.adb.uninstall.assert_not_called()
     mock_dirname.assert_called_once()
@@ -256,7 +256,7 @@
         'com.chip.interop.moblysnippet'
     )
     self.mock_android_device.adb.install.assert_called_once_with(
-        ['-r', '-g', '/path/to/android/app/snippet-0.3.0-rc.2.apk']
+        ['-r', '-g', '/path/to/android/app/snippet-0.3.0.apk']
     )
     mock_dirname.assert_called_once()
 
@@ -278,7 +278,7 @@
 
     self.mock_android_device.adb.uninstall.assert_not_called()
     self.mock_android_device.adb.install.assert_called_once_with(
-        ['-r', '-g', '/path/to/android/app/snippet-0.3.0-rc.2.apk']
+        ['-r', '-g', '/path/to/android/app/snippet-0.3.0.apk']
     )
     mock_dirname.assert_called_once()
 
diff --git a/ui_automator/version.py b/ui_automator/version.py
index ae527e8..a094c30 100644
--- a/ui_automator/version.py
+++ b/ui_automator/version.py
@@ -17,6 +17,6 @@
 from typing import Optional
 
 
-_SEMANTIC_VERSION = "0.3.0-rc.2"
+_SEMANTIC_VERSION = "0.3.0"
 
 VERSION = _SEMANTIC_VERSION