1.0.5-rc.0

PiperOrigin-RevId: 755145813
diff --git a/README.md b/README.md
index ca887fc..bcba18f 100644
--- a/README.md
+++ b/README.md
@@ -8,8 +8,8 @@
 
 #### Python 3
 
-You need a python 3 environment to run the script.
-Google Home UI Automator requires python 3.11 or newer.
+You need a python 3 environment to run the script. Google Home UI Automator
+requires python 3.11 or newer.
 
 #### Android phone
 
@@ -20,7 +20,8 @@
 
 1.  You need to install Google Home App on your Android phone.
 1.  Login to your Google Home App.
-1.  Make sure the Google Home App's version is between `3.1.1.14` and `3.25.1.4`.
+1.  Make sure the Google Home App's version is between `3.1.1.14` and
+    `3.25.1.4`.
 
 NOTE: Please select the correct Google account on Google Home App.
 
@@ -29,17 +30,21 @@
 ### Installation
 
 #### PyPI (recommended)
+
 ```shell
 $ pip install google-home-ui-automator
 ```
 
 #### Build from source code
+
 1.  clone this repo.
 
     ```shell
     $ git clone https://testsuite-smarthome-matter.googlesource.com/ui-automator
     ```
+
 2.  `cd` to the folder.
+
 3.  Run `pip install .`
 
 ## Usage
@@ -49,44 +54,55 @@
 Follow the steps below to automatically commission a matter device.
 
 ```shell
-$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME
+$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME [--google_account <GOOGLE_ACCOUNT>]
 ```
+
 *   `DEVICE_NAME`: desired Matter device, e.g. `m5stack`
 *   `PAIRING_CODE`: pairing code of your Matter device, e.g. `34970112332`
 *   `ROOM_NAME`: room that is going to be assigned, e.g. `Office`
+*   `GOOGLE_ACCOUNT`: Optional. Account to use in Google Home App, e.g.
+    `test@gmail.com`
 
 ### Decommissioning Matter device
 
 Follow the steps below to decommission a matter device.
 
 ```shell
-$ ui-automator --decommission DEVICE_NAME
+$ ui-automator --decommission DEVICE_NAME [--google_account <GOOGLE_ACCOUNT>]
 ```
-*   `DEVICE_NAME`: display name of commissioned Matter device on GHA, e.g. `m5stack`
+
+*   `DEVICE_NAME`: display name of commissioned Matter device on GHA, e.g.
+    `m5stack`
+*   `GOOGLE_ACCOUNT`: Optional. Account to use in Google Home App, e.g.
+    `test@gmail.com`
 
 ### Regression Test
 
 Follow the steps below to run a regression test.
 
 ```shell
-$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME --regtest [--repeat <REPEAT_TIMES>] [--hub <HUB_VERSION>] [--dut <MODEL>,<TYPE>,<PROTOCOL>] [--fw <DEVICE_FIRMWARE>]
+$ ui-automator --commission DEVICE_NAME,PAIRING_CODE,ROOM_NAME --regtest [--repeat <REPEAT_TIMES>] [--hub <HUB_VERSION>] [--dut <MODEL>,<TYPE>,<PROTOCOL>] [--fw <DEVICE_FIRMWARE>] [--google_account <GOOGLE_ACCOUNT>]
 ```
 
-*   flag `--regtest` is required
-*   regression test need to be used with flag `--commission`
-*   regression test now only supports commissioning/decommissioning cycle
-*   defaultly, regression test will run until users use keyboard interrupt to
-    stop the process
-*   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
+*   `DEVICE_NAME`: desired Matter device, e.g. `m5stack`
+*   `PAIRING_CODE`: pairing code of your Matter device, e.g. `34970112332`
+*   `ROOM_NAME`: room that is going to be assigned, e.g. `Office`
+*   `--repeat`: Optional. Specifies the number of times to repeat the regression
+    test.
+    *   `REPEAT_TIMES`: Number of times to repeat the regression test, e.g.,
+        `10`.
+*   `--hub`: Optional. Includes the hub version in the test report.
+    *   `HUB_VERSION`: Version of the hub controlling the devices in GHA, e.g.,
+        `1.0.0`
+*   `--dut`: Optional. Includes the device under test information in the 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
+    *   `PROTOCOL`: Protocol used by the device. e.g. `MATTER`
+*   `--fw`: Optional. Includes the device firmware in the test report.
     *   `DEVICE_FIRMWARE`: Firmware of test device.
+*   `GOOGLE_ACCOUNT`: Optional. Account to use in Google Home App, e.g.
+    `test@gmail.com`
 
 ## Roadmap
 
@@ -111,6 +127,6 @@
 
 ## Disclaimer
 
-This project is not an official Google project. It is not supported by
-Google and Google specifically disclaims all warranties as to its quality,
+This project is not an official Google project. It is not supported by Google
+and Google specifically disclaims all warranties as to its quality,
 merchantability, or fitness for a particular purpose.
diff --git a/ui_automator/android/app/snippet.apk b/ui_automator/android/app/snippet.apk
index 74e4c13..656b663 100644
--- a/ui_automator/android/app/snippet.apk
+++ b/ui_automator/android/app/snippet.apk
Binary files differ
diff --git a/ui_automator/ui_automator.py b/ui_automator/ui_automator.py
index 74698f0..8402af3 100644
--- a/ui_automator/ui_automator.py
+++ b/ui_automator/ui_automator.py
@@ -116,6 +116,14 @@
 _THIRD_PARTY_LICENSE_FILE_PATH = os.path.join(
     os.path.dirname(__file__), 'THIRD_PARTY_NOTICES.txt'
 )
+_GOOGLE_ACCOUNT = flags.DEFINE_string(
+    name='google_account',
+    default=None,
+    help=(
+        'Use --google_account {GOOGLE_ACCOUNT} to specify the GHA account to'
+        ' use.'
+    ),
+)
 _NO_DEVICE_CONNECTED_ERROR_MESSAGE = (
     'No Android device connected to the host computer.'
 )
@@ -332,7 +340,7 @@
 
     try:
       self._connected_device.mbs.commissionDevice(
-          _GOOGLE_HOME_APP, matter_device
+          _GOOGLE_HOME_APP, matter_device, _GOOGLE_ACCOUNT.value
       )
       self._logger.info('Successfully commission the device on GHA.')
     # TODO(google-home-testsuite-dev+ui-automator): Narrow exception type.
@@ -362,7 +370,9 @@
 
     self._logger.info('Start removing the device.')
     try:
-      self._connected_device.mbs.removeDevice(device_name)
+      self._connected_device.mbs.removeDevice(
+          device_name, _GOOGLE_ACCOUNT.value
+      )
       self._logger.info('Successfully remove the device on GHA.')
     # TODO(google-home-testsuite-dev+ui-automator): Narrow exception type.
     except Exception as e:
@@ -386,7 +396,9 @@
         True if the device exists on GHA.
     """
     try:
-      return self._connected_device.mbs.isDeviceExist(device_name)
+      return self._connected_device.mbs.isDeviceExist(
+          device_name, _GOOGLE_ACCOUNT.value
+      )
     except Exception as e:
       raise errors.MoblySnippetError(
           f'Unable to check if {device_name} exists on GHA'
diff --git a/ui_automator/ui_automator_test.py b/ui_automator/ui_automator_test.py
index 8c27e91..5663b10 100644
--- a/ui_automator/ui_automator_test.py
+++ b/ui_automator/ui_automator_test.py
@@ -83,6 +83,7 @@
 ]
 _FAKE_PROJECT_FOLDER = '/path/to/'
 _EXPECTED_APK_PATH = f'{_FAKE_PROJECT_FOLDER}android/app/snippet.apk'
+_FAKE_GOOGLE_ACCOUNT = 'fake_google_account'
 
 
 class UIAutomatorTest(unittest.TestCase):
@@ -473,14 +474,17 @@
         'roomName': _FAKE_GHA_ROOM,
     }
 
-    self.ui_automator.commission_device(
-        _FAKE_MATTER_DEVICE_NAME,
-        _FAKE_PAIRING_CODE,
-        _FAKE_GHA_ROOM,
-    )
+    with flagsaver.as_parsed(
+        (ui_automator._GOOGLE_ACCOUNT, _FAKE_GOOGLE_ACCOUNT)
+    ):
+      self.ui_automator.commission_device(
+          _FAKE_MATTER_DEVICE_NAME,
+          _FAKE_PAIRING_CODE,
+          _FAKE_GHA_ROOM,
+      )
 
     self.mock_android_device.mbs.commissionDevice.assert_called_once_with(
-        _GOOGLE_HOME_APP, expected_matter_device
+        _GOOGLE_HOME_APP, expected_matter_device, _FAKE_GOOGLE_ACCOUNT
     )
 
   @mock.patch.object(android_device, 'get_all_instances', autospec=True)
@@ -664,6 +668,7 @@
 
     self.assertIn(expected_error_message, str(exc.exception))
 
+  @flagsaver.flagsaver((ui_automator._GOOGLE_ACCOUNT, _FAKE_GOOGLE_ACCOUNT))
   @mock.patch.object(android_device, 'get_all_instances', autospec=True)
   def test_decommission_device_successfully_removes_a_device(
       self, mock_get_all_instances
@@ -674,7 +679,7 @@
       self.ui_automator.decommission_device(_FAKE_MATTER_DEVICE_NAME)
 
     self.mock_android_device.mbs.removeDevice.assert_called_once_with(
-        _FAKE_MATTER_DEVICE_NAME
+        _FAKE_MATTER_DEVICE_NAME, _FAKE_GOOGLE_ACCOUNT
     )
     self.assertEqual(
         cm.output[2], 'INFO:root:Successfully remove the device on GHA.'
@@ -1021,7 +1026,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(0)),
         'test_name': 'test_commission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'run',
         'result': 'FAIL',
         'message': xml_reporter._escape_xml_attr(str(err[1])),
@@ -1032,7 +1040,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(2)),
         'test_name': 'test_decommission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'notrun',
         'result': 'N/A',
         'properties': (
@@ -1045,7 +1056,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(4)),
         'test_name': 'test_commission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'run',
         'result': 'PASS',
     }
@@ -1053,7 +1067,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(6)),
         'test_name': 'test_decommission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'run',
         'result': 'PASS',
     }
@@ -1061,7 +1078,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(8)),
         'test_name': 'test_commission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'run',
         'result': 'PASS',
     }
@@ -1069,7 +1089,10 @@
         'run_time': 1,
         'start_time': re.escape(unit_test_utils.iso_timestamp(10)),
         'test_name': 'test_decommission',
-        'class_name': 'google3.java.com.google.assistant.verticals.homeautomation.partners.ui_automator.commission_reg_test.CommissionRegTest',
+        'class_name': (
+            'google3.java.com.google.assistant.verticals.homeautomation.'
+            'partners.ui_automator.commission_reg_test.CommissionRegTest'
+        ),
         'status': 'run',
         'result': 'FAIL',
         'message': xml_reporter._escape_xml_attr(str(err[1])),
@@ -1266,6 +1289,7 @@
     mock_load_snippet.assert_called_once()
     self.assertDictEqual(report_info, {})
 
+  @flagsaver.flagsaver((ui_automator._GOOGLE_ACCOUNT, _FAKE_GOOGLE_ACCOUNT))
   @mock.patch.object(android_device, 'get_all_instances', autospec=True)
   def test_is_device_exist_returns_true_when_device_exists(
       self, mock_get_all_instances
@@ -1274,6 +1298,9 @@
     self.mock_android_device.mbs.isDeviceExist.return_value = True
 
     self.assertTrue(self.ui_automator.is_device_exist(_FAKE_MATTER_DEVICE_NAME))
+    self.mock_android_device.mbs.isDeviceExist.assert_called_once_with(
+        _FAKE_MATTER_DEVICE_NAME, _FAKE_GOOGLE_ACCOUNT
+    )
 
   @mock.patch.object(android_device, 'get_all_instances', autospec=True)
   def test_is_device_exist_returns_false_when_device_does_not_exist(
diff --git a/ui_automator/version.py b/ui_automator/version.py
index 36b5370..79de502 100644
--- a/ui_automator/version.py
+++ b/ui_automator/version.py
@@ -17,6 +17,6 @@
 from typing import Optional
 
 
-_SEMANTIC_VERSION = "1.0.4"
+_SEMANTIC_VERSION = "1.0.5-rc.0"
 
 VERSION = _SEMANTIC_VERSION