* @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(HttpCommandExecutor executor, Capabilities capabilities) {
- super(executor, updateDefaultPlatformName(capabilities, ANDROID_PLATFORM));
+ super(executor, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
* Creates a new instance based on Appium server URL and {@code capabilities}.
*
* @param remoteAddress is the address of remotely/locally started Appium server
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(URL remoteAddress, Capabilities desiredCapabilities) {
- super(remoteAddress, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(URL remoteAddress, Capabilities capabilities) {
+ super(remoteAddress, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
@@ -95,22 +113,21 @@ public AndroidDriver(URL remoteAddress, Capabilities desiredCapabilities) {
*
* @param remoteAddress is the address of remotely/locally started Appium server
* @param httpClientFactory take a look at {@link HttpClient.Factory}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(URL remoteAddress, HttpClient.Factory httpClientFactory,
- Capabilities desiredCapabilities) {
- super(remoteAddress, httpClientFactory,
- updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(
+ URL remoteAddress, HttpClient.Factory httpClientFactory, Capabilities capabilities) {
+ super(remoteAddress, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
* Creates a new instance based on Appium driver local service and {@code capabilities}.
*
* @param service take a look at {@link AppiumDriverLocalService}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(AppiumDriverLocalService service, Capabilities desiredCapabilities) {
- super(service, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(AppiumDriverLocalService service, Capabilities capabilities) {
+ super(service, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
@@ -118,22 +135,21 @@ public AndroidDriver(AppiumDriverLocalService service, Capabilities desiredCapab
*
* @param service take a look at {@link AppiumDriverLocalService}
* @param httpClientFactory take a look at {@link HttpClient.Factory}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(AppiumDriverLocalService service, HttpClient.Factory httpClientFactory,
- Capabilities desiredCapabilities) {
- super(service, httpClientFactory,
- updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(
+ AppiumDriverLocalService service, HttpClient.Factory httpClientFactory, Capabilities capabilities) {
+ super(service, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
* Creates a new instance based on Appium service builder and {@code capabilities}.
*
* @param builder take a look at {@link AppiumServiceBuilder}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(AppiumServiceBuilder builder, Capabilities desiredCapabilities) {
- super(builder, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(AppiumServiceBuilder builder, Capabilities capabilities) {
+ super(builder, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
@@ -141,65 +157,103 @@ public AndroidDriver(AppiumServiceBuilder builder, Capabilities desiredCapabilit
*
* @param builder take a look at {@link AppiumServiceBuilder}
* @param httpClientFactory take a look at {@link HttpClient.Factory}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
public AndroidDriver(AppiumServiceBuilder builder, HttpClient.Factory httpClientFactory,
- Capabilities desiredCapabilities) {
- super(builder, httpClientFactory,
- updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ Capabilities capabilities) {
+ super(builder, httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
* Creates a new instance based on HTTP client factory and {@code capabilities}.
*
* @param httpClientFactory take a look at {@link HttpClient.Factory}
- * @param desiredCapabilities take a look at {@link Capabilities}
+ * @param capabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(HttpClient.Factory httpClientFactory, Capabilities desiredCapabilities) {
- super(httpClientFactory, updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(HttpClient.Factory httpClientFactory, Capabilities capabilities) {
+ super(httpClientFactory, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
- * Creates a new instance based on {@code capabilities}.
+ * Creates a new instance based on the given ClientConfig and {@code capabilities}.
+ * The HTTP client is default client generated by {@link HttpCommandExecutor#getDefaultClientFactory}.
+ * For example:
+ *
+ *
+ *
+ * ClientConfig clientConfig = ClientConfig.defaultConfig()
+ * .baseUri(URI.create("WebDriver URL"))
+ * .readTimeout(Duration.ofMinutes(5));
+ * UiAutomator2Options options = new UiAutomator2Options();
+ * AndroidDriver driver = new AndroidDriver(clientConfig, options);
+ *
+ *
+ *
+ * @param clientConfig take a look at {@link ClientConfig}
+ * @param capabilities take a look at {@link Capabilities}
*
- * @param desiredCapabilities take a look at {@link Capabilities}
*/
- public AndroidDriver(Capabilities desiredCapabilities) {
- super(updateDefaultPlatformName(desiredCapabilities, ANDROID_PLATFORM));
+ public AndroidDriver(ClientConfig clientConfig, Capabilities capabilities) {
+ super(AppiumClientConfig.fromClientConfig(clientConfig), ensurePlatformName(capabilities,
+ ANDROID_PLATFORM));
}
/**
- * Get test-coverage data.
+ * Creates a new instance based on the given ClientConfig and {@code capabilities}.
+ * The HTTP client is default client generated by {@link HttpCommandExecutor#getDefaultClientFactory}.
+ * For example:
+ *
+ *
+ *
+ * AppiumClientConfig appiumClientConfig = AppiumClientConfig.defaultConfig()
+ * .directConnect(true)
+ * .baseUri(URI.create("WebDriver URL"))
+ * .readTimeout(Duration.ofMinutes(5));
+ * UiAutomator2Options options = new UiAutomator2Options();
+ * AndroidDriver driver = new AndroidDriver(appiumClientConfig, options);
+ *
+ *
+ *
+ * @param appiumClientConfig take a look at {@link AppiumClientConfig}
+ * @param capabilities take a look at {@link Capabilities}
*
- * @param intent intent to broadcast.
- * @param path path to .ec file.
*/
- public void endTestCoverage(String intent, String path) {
- CommandExecutionHelper.execute(this, endTestCoverageCommand(intent, path));
+ public AndroidDriver(AppiumClientConfig appiumClientConfig, Capabilities capabilities) {
+ super(appiumClientConfig, ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
/**
- * Open the notification shade, on Android devices.
+ * Creates a new instance based on {@code capabilities}.
+ *
+ * @param capabilities take a look at {@link Capabilities}
*/
- public void openNotifications() {
- CommandExecutionHelper.execute(this, openNotificationsCommand());
+ public AndroidDriver(Capabilities capabilities) {
+ super(ensurePlatformName(capabilities, ANDROID_PLATFORM));
}
- public void toggleLocationServices() {
- CommandExecutionHelper.execute(this, toggleLocationServicesCommand());
+ /**
+ * This is a special constructor used to connect to a running driver instance.
+ * It does not do any necessary verifications, but rather assumes the given
+ * driver session is already running at `remoteSessionAddress`.
+ * The maintenance of driver state(s) is the caller's responsibility.
+ * !!! This API is supposed to be used for **debugging purposes only**.
+ *
+ * @param remoteSessionAddress The address of the **running** session including the session identifier.
+ * @param automationName The name of the target automation.
+ */
+ public AndroidDriver(URL remoteSessionAddress, String automationName) {
+ super(remoteSessionAddress, ANDROID_PLATFORM, automationName);
}
- @SuppressWarnings("unchecked")
@Override
public AndroidBatteryInfo getBatteryInfo() {
- return new AndroidBatteryInfo((Map) execute(EXECUTE_SCRIPT, ImmutableMap.of(
- "script", "mobile: batteryInfo", "args", Collections.emptyList())).getValue());
+ return new AndroidBatteryInfo(CommandExecutionHelper.executeScript(this, "mobile: batteryInfo"));
}
@Override
public synchronized StringWebSocketClient getLogcatClient() {
if (logcatClient == null) {
- logcatClient = new StringWebSocketClient();
+ logcatClient = new StringWebSocketClient(getHttpClient());
}
return logcatClient;
}
diff --git a/src/main/java/io/appium/java_client/android/AndroidElement.java b/src/main/java/io/appium/java_client/android/AndroidElement.java
deleted file mode 100644
index 5c1231c24..000000000
--- a/src/main/java/io/appium/java_client/android/AndroidElement.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- * 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 io.appium.java_client.android;
-
-import static io.appium.java_client.android.AndroidMobileCommandHelper.replaceElementValueCommand;
-
-import io.appium.java_client.CommandExecutionHelper;
-import io.appium.java_client.MobileElement;
-
-public class AndroidElement extends MobileElement {
- /**
- * This method replace current text value.
- * @param value a new value
- */
- public void replaceValue(String value) {
- CommandExecutionHelper.execute(this, replaceElementValueCommand(this, value));
- }
-}
diff --git a/src/main/java/io/appium/java_client/android/AndroidMobileCommandHelper.java b/src/main/java/io/appium/java_client/android/AndroidMobileCommandHelper.java
index 867e96fdd..cacc04137 100644
--- a/src/main/java/io/appium/java_client/android/AndroidMobileCommandHelper.java
+++ b/src/main/java/io/appium/java_client/android/AndroidMobileCommandHelper.java
@@ -16,18 +16,13 @@
package io.appium.java_client.android;
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.collect.ImmutableMap;
-
import io.appium.java_client.MobileCommand;
-
-import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.remote.RemoteWebElement;
-import java.util.AbstractMap;
import java.util.Map;
+import static java.util.Locale.ROOT;
+
/**
* This util class helps to prepare parameters of Android-specific JSONWP
* commands.
@@ -39,8 +34,9 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> currentActivityCommand() {
- return new AbstractMap.SimpleEntry<>(CURRENT_ACTIVITY, ImmutableMap.of());
+ return Map.entry(CURRENT_ACTIVITY, Map.of());
}
/**
@@ -48,23 +44,9 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> currentPackageCommand() {
- return new AbstractMap.SimpleEntry<>(GET_CURRENT_PACKAGE, ImmutableMap.of());
- }
-
- /**
- * This method forms a {@link Map} of parameters for the ending of the test coverage.
- *
- * @param intent intent to broadcast.
- * @param path path to .ec file.
- * @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
- */
- public static Map.Entry> endTestCoverageCommand(String intent,
- String path) {
- String[] parameters = new String[] {"intent", "path"};
- Object[] values = new Object[] {intent, path};
- return new AbstractMap.SimpleEntry<>(
- END_TEST_COVERAGE, prepareArguments(parameters, values));
+ return Map.entry(GET_CURRENT_PACKAGE, Map.of());
}
/**
@@ -75,7 +57,7 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*
*/
public static Map.Entry> getSupportedPerformanceDataTypesCommand() {
- return new AbstractMap.SimpleEntry<>(GET_SUPPORTED_PERFORMANCE_DATA_TYPES, ImmutableMap.of());
+ return Map.entry(GET_SUPPORTED_PERFORMANCE_DATA_TYPES, Map.of());
}
/**
@@ -108,51 +90,52 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*/
public static Map.Entry> getPerformanceDataCommand(
String packageName, String dataType, int dataReadTimeout) {
- String[] parameters = new String[] {"packageName", "dataType", "dataReadTimeout"};
- Object[] values = new Object[] {packageName, dataType, dataReadTimeout};
- return new AbstractMap.SimpleEntry<>(
- GET_PERFORMANCE_DATA, prepareArguments(parameters, values));
+ return Map.entry(GET_PERFORMANCE_DATA, Map.of(
+ "packageName", packageName,
+ "dataType", dataType,
+ "dataReadTimeout", dataReadTimeout
+ ));
}
/**
- * This method forms a {@link Map} of parameters to
- * Retrieve the display density of the Android device.
+ * This method forms a {@link Map} of parameters to retrieve the display density of the Android device.
*
- * @return a key-value pair. The key is the command name. The value is a
- * {@link Map} command arguments.
+ * @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> getDisplayDensityCommand() {
- return new AbstractMap.SimpleEntry<>(GET_DISPLAY_DENSITY, ImmutableMap.of());
+ return Map.entry(GET_DISPLAY_DENSITY, Map.of());
}
/**
* This method forms a {@link Map} of parameters for the getting of a network connection value.
*
- * @return a key-value pair. The key is the command name. The value is a
- * {@link Map} command arguments.
+ * @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> getNetworkConnectionCommand() {
- return new AbstractMap.SimpleEntry<>(GET_NETWORK_CONNECTION, ImmutableMap.of());
+ return Map.entry(GET_NETWORK_CONNECTION, Map.of());
}
/**
- * This method forms a {@link Map} of parameters to
- * Retrieve visibility and bounds information of the status and navigation bars.
+ * This method forms a {@link Map} of parameters to retrieve visibility and bounds information of the status and
+ * navigation bars.
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> getSystemBarsCommand() {
- return new AbstractMap.SimpleEntry<>(GET_SYSTEM_BARS, ImmutableMap.of());
+ return Map.entry(GET_SYSTEM_BARS, Map.of());
}
/**
- * This method forms a {@link java.util.Map} of parameters for the
- * finger print authentication invocation.
+ * This method forms a {@link Map} of parameters for the finger print authentication invocation.
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> isLockedCommand() {
- return new AbstractMap.SimpleEntry<>(IS_LOCKED, ImmutableMap.of());
+ return Map.entry(IS_LOCKED, Map.of());
}
/**
@@ -161,9 +144,9 @@ public class AndroidMobileCommandHelper extends MobileCommand {
* @param fingerPrintId finger prints stored in Android Keystore system (from 1 to 10)
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> fingerPrintCommand(int fingerPrintId) {
- return new AbstractMap.SimpleEntry<>(FINGER_PRINT,
- prepareArguments("fingerprintId", fingerPrintId));
+ return Map.entry(FINGER_PRINT, Map.of("fingerprintId", fingerPrintId));
}
/**
@@ -171,8 +154,9 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> openNotificationsCommand() {
- return new AbstractMap.SimpleEntry<>(OPEN_NOTIFICATIONS, ImmutableMap.of());
+ return Map.entry(OPEN_NOTIFICATIONS, Map.of());
}
/**
@@ -181,58 +165,12 @@ public class AndroidMobileCommandHelper extends MobileCommand {
* @param bitMask The bitmask of the desired connection
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> setConnectionCommand(long bitMask) {
- String[] parameters = new String[] {"name", "parameters"};
- Object[] values = new Object[] {"network_connection", ImmutableMap.of("type", bitMask)};
- return new AbstractMap.SimpleEntry<>(
- SET_NETWORK_CONNECTION, prepareArguments(parameters, values));
- }
-
- /**
- * This method forms a {@link Map} of parameters for the activity starting.
- *
- * @param appPackage The package containing the activity. [Required]
- * @param appActivity The activity to start. [Required]
- * @param appWaitPackage Automation will begin after this package starts. [Optional]
- * @param appWaitActivity Automation will begin after this activity starts. [Optional]
- * @param intentAction Intent action which will be used to start activity [Optional]
- * @param intentCategory Intent category which will be used to start activity [Optional]
- * @param intentFlags Flags that will be used to start activity [Optional]
- * @param optionalIntentArguments Additional intent arguments that will be used to
- * start activity [Optional]
- * @param stopApp Stop app on reset or not
- * @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
- * @throws IllegalArgumentException when any required argument is empty
- */
- public static Map.Entry> startActivityCommand(String appPackage,
- String appActivity, String appWaitPackage, String appWaitActivity,
- String intentAction, String intentCategory, String intentFlags,
- String optionalIntentArguments, boolean stopApp) throws IllegalArgumentException {
-
- checkArgument((!StringUtils.isBlank(appPackage)
- && !StringUtils.isBlank(appActivity)),
- String.format("'%s' and '%s' are required.", "appPackage", "appActivity"));
-
- String targetWaitPackage = !StringUtils.isBlank(appWaitPackage) ? appWaitPackage : "";
- String targetWaitActivity = !StringUtils.isBlank(appWaitActivity) ? appWaitActivity : "";
- String targetIntentAction = !StringUtils.isBlank(intentAction) ? intentAction : "";
- String targetIntentCategory = !StringUtils.isBlank(intentCategory) ? intentCategory : "";
- String targetIntentFlags = !StringUtils.isBlank(intentFlags) ? intentFlags : "";
- String targetOptionalIntentArguments = !StringUtils.isBlank(optionalIntentArguments)
- ? optionalIntentArguments : "";
-
- ImmutableMap parameters = ImmutableMap
- .builder().put("appPackage", appPackage)
- .put("appActivity", appActivity)
- .put("appWaitPackage", targetWaitPackage)
- .put("appWaitActivity", targetWaitActivity)
- .put("dontStopAppOnReset", !stopApp)
- .put("intentAction", targetIntentAction)
- .put("intentCategory", targetIntentCategory)
- .put("intentFlags", targetIntentFlags)
- .put("optionalIntentArguments", targetOptionalIntentArguments)
- .build();
- return new AbstractMap.SimpleEntry<>(START_ACTIVITY, parameters);
+ return Map.entry(SET_NETWORK_CONNECTION, Map.of(
+ "name", "network_connection",
+ "parameters", Map.of("type", bitMask)
+ ));
}
/**
@@ -240,17 +178,19 @@ public class AndroidMobileCommandHelper extends MobileCommand {
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> toggleLocationServicesCommand() {
- return new AbstractMap.SimpleEntry<>(TOGGLE_LOCATION_SERVICES, ImmutableMap.of());
+ return Map.entry(TOGGLE_LOCATION_SERVICES, Map.of());
}
/**
- * This method forms a {@link java.util.Map} of parameters for the element.
+ * This method forms a {@link Map} of parameters for the element.
*
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
+ @Deprecated
public static Map.Entry> unlockCommand() {
- return new AbstractMap.SimpleEntry<>(UNLOCK, ImmutableMap.of());
+ return Map.entry(UNLOCK, Map.of());
}
@@ -262,14 +202,13 @@ public class AndroidMobileCommandHelper extends MobileCommand {
* @param value a new value
* @return a key-value pair. The key is the command name. The value is a {@link Map} command arguments.
*/
- public static Map.Entry