diff --git a/src/main/java/io/appium/java_client/ExecuteCDPCommand.java b/src/main/java/io/appium/java_client/ExecuteCDPCommand.java index 5af5e1f83..8b9f18317 100644 --- a/src/main/java/io/appium/java_client/ExecuteCDPCommand.java +++ b/src/main/java/io/appium/java_client/ExecuteCDPCommand.java @@ -16,7 +16,6 @@ package io.appium.java_client; -import com.google.common.collect.ImmutableMap; import org.openqa.selenium.remote.Response; import javax.annotation.Nullable; @@ -44,7 +43,7 @@ default Map executeCdpCommand(String command, @Nullable Map) response.getValue()); + return Collections.unmodifiableMap((Map) response.getValue()); } /** diff --git a/src/main/java/io/appium/java_client/InteractsWithApps.java b/src/main/java/io/appium/java_client/InteractsWithApps.java index e254f6aa6..9fe25dc24 100644 --- a/src/main/java/io/appium/java_client/InteractsWithApps.java +++ b/src/main/java/io/appium/java_client/InteractsWithApps.java @@ -16,7 +16,6 @@ package io.appium.java_client; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.appmanagement.ApplicationState; import io.appium.java_client.appmanagement.BaseActivateApplicationOptions; import io.appium.java_client.appmanagement.BaseInstallApplicationOptions; @@ -28,9 +27,8 @@ import javax.annotation.Nullable; import java.time.Duration; -import java.util.Collections; +import java.util.HashMap; import java.util.Map; -import java.util.Optional; import static io.appium.java_client.MobileCommand.ACTIVATE_APP; import static io.appium.java_client.MobileCommand.INSTALL_APP; @@ -40,6 +38,7 @@ import static io.appium.java_client.MobileCommand.RUN_APP_IN_BACKGROUND; import static io.appium.java_client.MobileCommand.TERMINATE_APP; import static java.util.Objects.requireNonNull; +import static java.util.Optional.ofNullable; @SuppressWarnings({"rawtypes", "unchecked"}) public interface InteractsWithApps extends ExecutesMethod, CanRememberExtensionPresence { @@ -63,23 +62,17 @@ default void installApp(String appPath) { default void installApp(String appPath, @Nullable BaseInstallApplicationOptions options) { final String extName = "mobile: installApp"; try { - Map args = ImmutableMap.builder() - .put("app", appPath) - .put("appPath", appPath) - .putAll(Optional.ofNullable(options).map(BaseOptions::build).orElseGet(Collections::emptyMap)) - .build(); + var args = new HashMap(); + args.put("app", appPath); + args.put("appPath", appPath); + ofNullable(options).map(BaseOptions::build).ifPresent(args::putAll); CommandExecutionHelper.executeScript(assertExtensionExists(extName), extName, args); } catch (UnsupportedCommandException | InvalidArgumentException e) { // TODO: Remove the fallback - Map args = ImmutableMap.builder() - .put("appPath", appPath) - .putAll(Optional.ofNullable(options).map( - opts -> Map.of("options", opts.build()) - ).orElseGet(Map::of)) - .build(); - CommandExecutionHelper.execute( - markExtensionAbsence(extName), Map.entry(INSTALL_APP, args) - ); + var args = new HashMap(); + args.put("appPath", appPath); + ofNullable(options).map(BaseOptions::build).ifPresent(opts -> args.put("options", opts)); + CommandExecutionHelper.execute(markExtensionAbsence(extName), Map.entry(INSTALL_APP, args)); } } @@ -153,22 +146,18 @@ default boolean removeApp(String bundleId) { default boolean removeApp(String bundleId, @Nullable BaseRemoveApplicationOptions options) { final String extName = "mobile: removeApp"; try { - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .put("appId", bundleId) - .putAll(Optional.ofNullable(options).map(BaseOptions::build).orElseGet(Collections::emptyMap)) - .build(); + var args = new HashMap(); + args.put("bundleId", bundleId); + args.put("appId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(args::putAll); return requireNonNull( CommandExecutionHelper.executeScript(assertExtensionExists(extName), extName, args) ); } catch (UnsupportedCommandException | InvalidArgumentException e) { // TODO: Remove the fallback - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .putAll(Optional.ofNullable(options).map( - opts -> Map.of("options", opts.build()) - ).orElseGet(Map::of)) - .build(); + var args = new HashMap(); + args.put("bundleId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(opts -> args.put("options", opts)); //noinspection RedundantCast return requireNonNull( (Boolean) CommandExecutionHelper.execute( @@ -200,23 +189,17 @@ default void activateApp(String bundleId) { default void activateApp(String bundleId, @Nullable BaseActivateApplicationOptions options) { final String extName = "mobile: activateApp"; try { - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .put("appId", bundleId) - .putAll(Optional.ofNullable(options).map(BaseOptions::build).orElseGet(Collections::emptyMap)) - .build(); + var args = new HashMap(); + args.put("bundleId", bundleId); + args.put("appId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(args::putAll); CommandExecutionHelper.executeScript(assertExtensionExists(extName), extName, args); } catch (UnsupportedCommandException | InvalidArgumentException e) { // TODO: Remove the fallback - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .putAll(Optional.ofNullable(options).map( - opts -> Map.of("options", opts.build()) - ).orElseGet(Map::of)) - .build(); - CommandExecutionHelper.execute( - markExtensionAbsence(extName), Map.entry(ACTIVATE_APP, args) - ); + var args = new HashMap(); + args.put("bundleId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(opts -> args.put("options", opts)); + CommandExecutionHelper.execute(markExtensionAbsence(extName), Map.entry(ACTIVATE_APP, args)); } } @@ -274,22 +257,18 @@ default boolean terminateApp(String bundleId) { default boolean terminateApp(String bundleId, @Nullable BaseTerminateApplicationOptions options) { final String extName = "mobile: terminateApp"; try { - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .put("appId", bundleId) - .putAll(Optional.ofNullable(options).map(BaseOptions::build).orElseGet(Collections::emptyMap)) - .build(); + var args = new HashMap(); + args.put("bundleId", bundleId); + args.put("appId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(args::putAll); return requireNonNull( CommandExecutionHelper.executeScript(assertExtensionExists(extName), extName, args) ); } catch (UnsupportedCommandException | InvalidArgumentException e) { // TODO: Remove the fallback - Map args = ImmutableMap.builder() - .put("bundleId", bundleId) - .putAll(Optional.ofNullable(options).map( - opts -> Map.of("options", opts.build()) - ).orElseGet(Map::of)) - .build(); + var args = new HashMap(); + args.put("bundleId", bundleId); + ofNullable(options).map(BaseOptions::build).ifPresent(opts -> args.put("options", opts)); //noinspection RedundantCast return requireNonNull( (Boolean) CommandExecutionHelper.execute( diff --git a/src/main/java/io/appium/java_client/MobileCommand.java b/src/main/java/io/appium/java_client/MobileCommand.java index 6f7eafb34..029c1abb7 100644 --- a/src/main/java/io/appium/java_client/MobileCommand.java +++ b/src/main/java/io/appium/java_client/MobileCommand.java @@ -27,6 +27,7 @@ import javax.annotation.Nullable; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -610,12 +611,12 @@ public static ImmutableMap prepareArguments(String[] params, public static Map.Entry> compareImagesCommand(ComparisonMode mode, byte[] img1Data, byte[] img2Data, @Nullable BaseComparisonOptions options) { - ImmutableMap.Builder argsBuilder = ImmutableMap.builder() - .put("mode", mode.toString()) - .put("firstImage", new String(img1Data, StandardCharsets.UTF_8)) - .put("secondImage", new String(img2Data, StandardCharsets.UTF_8)); - Optional.ofNullable(options).ifPresent(opts -> argsBuilder.put("options", options.build())); - return Map.entry(COMPARE_IMAGES, argsBuilder.build()); + var args = new HashMap(); + args.put("mode", mode.toString()); + args.put("firstImage", new String(img1Data, StandardCharsets.UTF_8)); + args.put("secondImage", new String(img2Data, StandardCharsets.UTF_8)); + Optional.ofNullable(options).ifPresent(opts -> args.put("options", options.build())); + return Map.entry(COMPARE_IMAGES, Collections.unmodifiableMap(args)); } /** diff --git a/src/main/java/io/appium/java_client/MultiTouchAction.java b/src/main/java/io/appium/java_client/MultiTouchAction.java index 0a133756e..d82b47b1f 100644 --- a/src/main/java/io/appium/java_client/MultiTouchAction.java +++ b/src/main/java/io/appium/java_client/MultiTouchAction.java @@ -16,8 +16,7 @@ package io.appium.java_client; -import com.google.common.collect.ImmutableList; - +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -53,12 +52,12 @@ @Deprecated public class MultiTouchAction implements PerformsActions { - private ImmutableList.Builder actions; + private List actions; private PerformsTouchActions performsTouchActions; public MultiTouchAction(PerformsTouchActions performsTouchActions) { this.performsTouchActions = performsTouchActions; - actions = ImmutableList.builder(); + actions = new ArrayList<>(); } /** @@ -76,21 +75,19 @@ public MultiTouchAction add(TouchAction action) { * Perform the multi-touch action on the mobile performsTouchActions. */ public MultiTouchAction perform() { - List touchActions = actions.build(); - checkArgument(touchActions.size() > 0, + checkArgument(!actions.isEmpty(), "MultiTouch action must have at least one TouchAction added before it can be performed"); - if (touchActions.size() > 1) { + if (actions.size() > 1) { performsTouchActions.performMultiTouchAction(this); return this; } //android doesn't like having multi-touch actions with only a single TouchAction... - performsTouchActions.performTouchAction(touchActions.get(0)); + performsTouchActions.performTouchAction(actions.get(0)); return this; } protected Map> getParameters() { return Map.of("actions", - actions.build().stream().map(touchAction -> - touchAction.getParameters().get("actions")).collect(toList()) + actions.stream().map(touchAction -> touchAction.getParameters().get("actions")).collect(toList()) ); } @@ -100,7 +97,7 @@ protected Map> getParameters() { * @return this MultiTouchAction, for possible segmented-touches. */ protected MultiTouchAction clearActions() { - actions = ImmutableList.builder(); + actions = new ArrayList<>(); return this; } } diff --git a/src/main/java/io/appium/java_client/TouchAction.java b/src/main/java/io/appium/java_client/TouchAction.java index be76d1610..6f6621f0b 100644 --- a/src/main/java/io/appium/java_client/TouchAction.java +++ b/src/main/java/io/appium/java_client/TouchAction.java @@ -16,8 +16,6 @@ package io.appium.java_client; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.touch.ActionOptions; import io.appium.java_client.touch.LongPressOptions; import io.appium.java_client.touch.TapOptions; @@ -25,10 +23,12 @@ import io.appium.java_client.touch.offset.ElementOption; import io.appium.java_client.touch.offset.PointOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; -import static com.google.common.collect.ImmutableList.builder; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toList; @@ -54,12 +54,12 @@ @Deprecated public class TouchAction> implements PerformsActions { - protected ImmutableList.Builder parameterBuilder; + protected List parameters; private PerformsTouchActions performsTouchActions; public TouchAction(PerformsTouchActions performsTouchActions) { this.performsTouchActions = requireNonNull(performsTouchActions); - parameterBuilder = builder(); + parameters = new ArrayList<>(); } /** @@ -69,7 +69,7 @@ public TouchAction(PerformsTouchActions performsTouchActions) { * @return this TouchAction, for chaining. */ public T press(PointOption pressOptions) { - parameterBuilder.add(new ActionParameter("press", pressOptions)); + parameters.add(new ActionParameter("press", pressOptions)); //noinspection unchecked return (T) this; } @@ -80,8 +80,7 @@ public T press(PointOption pressOptions) { * @return this TouchAction, for chaining. */ public T release() { - ActionParameter action = new ActionParameter("release"); - parameterBuilder.add(action); + parameters.add(new ActionParameter("release")); //noinspection unchecked return (T) this; } @@ -98,8 +97,7 @@ public T release() { * @return this TouchAction, for chaining. */ public T moveTo(PointOption moveToOptions) { - ActionParameter action = new ActionParameter("moveTo", moveToOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("moveTo", moveToOptions)); return (T) this; } @@ -110,8 +108,7 @@ public T moveTo(PointOption moveToOptions) { * @return this TouchAction, for chaining. */ public T tap(TapOptions tapOptions) { - ActionParameter action = new ActionParameter("tap", tapOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("tap", tapOptions)); return (T) this; } @@ -122,8 +119,7 @@ public T tap(TapOptions tapOptions) { * @return this TouchAction, for chaining. */ public T tap(PointOption tapOptions) { - ActionParameter action = new ActionParameter("tap", tapOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("tap", tapOptions)); return (T) this; } @@ -133,8 +129,7 @@ public T tap(PointOption tapOptions) { * @return this TouchAction, for chaining. */ public T waitAction() { - ActionParameter action = new ActionParameter("wait"); - parameterBuilder.add(action); + parameters.add(new ActionParameter("wait")); //noinspection unchecked return (T) this; } @@ -146,8 +141,7 @@ public T waitAction() { * @return this TouchAction, for chaining. */ public T waitAction(WaitOptions waitOptions) { - ActionParameter action = new ActionParameter("wait", waitOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("wait", waitOptions)); //noinspection unchecked return (T) this; } @@ -159,8 +153,7 @@ public T waitAction(WaitOptions waitOptions) { * @return this TouchAction, for chaining. */ public T longPress(LongPressOptions longPressOptions) { - ActionParameter action = new ActionParameter("longPress", longPressOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("longPress", longPressOptions)); //noinspection unchecked return (T) this; } @@ -172,8 +165,7 @@ public T longPress(LongPressOptions longPressOptions) { * @return this TouchAction, for chaining. */ public T longPress(PointOption longPressOptions) { - ActionParameter action = new ActionParameter("longPress", longPressOptions); - parameterBuilder.add(action); + parameters.add(new ActionParameter("longPress", longPressOptions)); //noinspection unchecked return (T) this; } @@ -182,8 +174,7 @@ public T longPress(PointOption longPressOptions) { * Cancel this action, if it was partially completed by the performsTouchActions. */ public void cancel() { - ActionParameter action = new ActionParameter("cancel"); - parameterBuilder.add(action); + parameters.add(new ActionParameter("cancel")); this.perform(); } @@ -205,7 +196,7 @@ public T perform() { */ protected Map> getParameters() { return Map.of("actions", - parameterBuilder.build().stream().map(ActionParameter::getParameterMap).collect(toList()) + parameters.stream().map(ActionParameter::getParameterMap).collect(toList()) ); } @@ -215,7 +206,7 @@ protected Map> getParameters() { * @return this TouchAction, for possible segmented-touches. */ protected T clearParameters() { - parameterBuilder = builder(); + parameters = new ArrayList<>(); //noinspection unchecked return (T) this; } @@ -224,26 +215,25 @@ protected T clearParameters() { * Just holds values to eventually return the parameters required for the mjsonwp. */ protected class ActionParameter { - private String actionName; - private ImmutableMap.Builder optionsBuilder; + private final String actionName; + private final Map options; public ActionParameter(String actionName) { this.actionName = actionName; - optionsBuilder = ImmutableMap.builder(); + options = new HashMap<>(); } public ActionParameter(String actionName, ActionOptions opts) { + this(actionName); requireNonNull(opts); - this.actionName = actionName; - optionsBuilder = ImmutableMap.builder(); //noinspection unchecked - optionsBuilder.putAll(opts.build()); + options.putAll(opts.build()); } public Map getParameterMap() { return Map.of( "action", actionName, - "options", optionsBuilder.build() + "options", Collections.unmodifiableMap(options) ); } } diff --git a/src/main/java/io/appium/java_client/android/AndroidStartScreenRecordingOptions.java b/src/main/java/io/appium/java_client/android/AndroidStartScreenRecordingOptions.java index 14c575208..dd6ee2b2f 100644 --- a/src/main/java/io/appium/java_client/android/AndroidStartScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/android/AndroidStartScreenRecordingOptions.java @@ -16,11 +16,12 @@ package io.appium.java_client.android; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.screenrecording.BaseStartScreenRecordingOptions; import io.appium.java_client.screenrecording.ScreenRecordingUploadOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -105,11 +106,10 @@ public AndroidStartScreenRecordingOptions withTimeLimit(Duration timeLimit) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(bitRate).ifPresent(x -> builder.put("bitRate", x)); - ofNullable(videoSize).ifPresent(x -> builder.put("videoSize", x)); - ofNullable(isBugReportEnabled).ifPresent(x -> builder.put("bugReport", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(bitRate).ifPresent(x -> map.put("bitRate", x)); + ofNullable(videoSize).ifPresent(x -> map.put("videoSize", x)); + ofNullable(isBugReportEnabled).ifPresent(x -> map.put("bugReport", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/appmanagement/AndroidInstallApplicationOptions.java b/src/main/java/io/appium/java_client/android/appmanagement/AndroidInstallApplicationOptions.java index 27ce3e4a6..216641b84 100644 --- a/src/main/java/io/appium/java_client/android/appmanagement/AndroidInstallApplicationOptions.java +++ b/src/main/java/io/appium/java_client/android/appmanagement/AndroidInstallApplicationOptions.java @@ -16,10 +16,11 @@ package io.appium.java_client.android.appmanagement; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.appmanagement.BaseInstallApplicationOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; @@ -138,12 +139,12 @@ public AndroidInstallApplicationOptions withGrantPermissionsDisabled() { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(replace).ifPresent(x -> builder.put("replace", x)); - ofNullable(timeout).ifPresent(x -> builder.put("timeout", x.toMillis())); - ofNullable(allowTestPackages).ifPresent(x -> builder.put("allowTestPackages", x)); - ofNullable(useSdcard).ifPresent(x -> builder.put("useSdcard", x)); - ofNullable(grantPermissions).ifPresent(x -> builder.put("grantPermissions", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(replace).ifPresent(x -> map.put("replace", x)); + ofNullable(timeout).ifPresent(x -> map.put("timeout", x.toMillis())); + ofNullable(allowTestPackages).ifPresent(x -> map.put("allowTestPackages", x)); + ofNullable(useSdcard).ifPresent(x -> map.put("useSdcard", x)); + ofNullable(grantPermissions).ifPresent(x -> map.put("grantPermissions", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/appmanagement/AndroidRemoveApplicationOptions.java b/src/main/java/io/appium/java_client/android/appmanagement/AndroidRemoveApplicationOptions.java index 9783d9fda..fe68a0073 100644 --- a/src/main/java/io/appium/java_client/android/appmanagement/AndroidRemoveApplicationOptions.java +++ b/src/main/java/io/appium/java_client/android/appmanagement/AndroidRemoveApplicationOptions.java @@ -16,10 +16,11 @@ package io.appium.java_client.android.appmanagement; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.appmanagement.BaseRemoveApplicationOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; @@ -68,9 +69,9 @@ public AndroidRemoveApplicationOptions withKeepDataDisabled() { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(timeout).ifPresent(x -> builder.put("timeout", x.toMillis())); - ofNullable(keepData).ifPresent(x -> builder.put("keepData", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(timeout).ifPresent(x -> map.put("timeout", x.toMillis())); + ofNullable(keepData).ifPresent(x -> map.put("keepData", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/appmanagement/AndroidTerminateApplicationOptions.java b/src/main/java/io/appium/java_client/android/appmanagement/AndroidTerminateApplicationOptions.java index c9a0a02d8..b683c5a8f 100644 --- a/src/main/java/io/appium/java_client/android/appmanagement/AndroidTerminateApplicationOptions.java +++ b/src/main/java/io/appium/java_client/android/appmanagement/AndroidTerminateApplicationOptions.java @@ -16,10 +16,11 @@ package io.appium.java_client.android.appmanagement; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.appmanagement.BaseTerminateApplicationOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; @@ -45,8 +46,8 @@ public AndroidTerminateApplicationOptions withTimeout(Duration timeout) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(timeout).ifPresent(x -> builder.put("timeout", x.toMillis())); - return builder.build(); + var map = new HashMap(); + ofNullable(timeout).ifPresent(x -> map.put("timeout", x.toMillis())); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/geolocation/AndroidGeoLocation.java b/src/main/java/io/appium/java_client/android/geolocation/AndroidGeoLocation.java index 7cd53e698..f8e2d24c7 100644 --- a/src/main/java/io/appium/java_client/android/geolocation/AndroidGeoLocation.java +++ b/src/main/java/io/appium/java_client/android/geolocation/AndroidGeoLocation.java @@ -16,8 +16,8 @@ package io.appium.java_client.android.geolocation; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -110,16 +110,14 @@ public AndroidGeoLocation withSpeed(double speed) { * @return Parameters mapping */ public Map build() { - ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(longitude).map(x -> builder.put("longitude", x)) - .orElseThrow(() -> new IllegalArgumentException( - "A valid 'longitude' must be provided")); - ofNullable(latitude).map(x -> builder.put("latitude", x)) - .orElseThrow(() -> new IllegalArgumentException( - "A valid 'latitude' must be provided")); - ofNullable(altitude).ifPresent(x -> builder.put("altitude", x)); - ofNullable(satellites).ifPresent(x -> builder.put("satellites", x)); - ofNullable(speed).ifPresent(x -> builder.put("speed", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(longitude).map(x -> map.put("longitude", x)).orElseThrow(() -> new IllegalArgumentException( + "A valid 'longitude' must be provided")); + ofNullable(latitude).map(x -> map.put("latitude", x)).orElseThrow(() -> new IllegalArgumentException( + "A valid 'latitude' must be provided")); + ofNullable(altitude).ifPresent(x -> map.put("altitude", x)); + ofNullable(satellites).ifPresent(x -> map.put("satellites", x)); + ofNullable(speed).ifPresent(x -> map.put("speed", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/nativekey/KeyEvent.java b/src/main/java/io/appium/java_client/android/nativekey/KeyEvent.java index 8bf0a99e2..3d695e4c3 100644 --- a/src/main/java/io/appium/java_client/android/nativekey/KeyEvent.java +++ b/src/main/java/io/appium/java_client/android/nativekey/KeyEvent.java @@ -16,8 +16,8 @@ package io.appium.java_client.android.nativekey; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -82,13 +82,12 @@ public KeyEvent withFlag(KeyEventFlag keyEventFlag) { * @throws IllegalStateException if key code is not set */ public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - final int keyCode = ofNullable(this.keyCode) - .orElseThrow(() -> new IllegalStateException("The key code must be set")); - builder.put("keycode", keyCode); - ofNullable(this.metaState).ifPresent(x -> builder.put("metastate", x)); - ofNullable(this.flags).ifPresent(x -> builder.put("flags", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(this.keyCode).map(x -> map.put("keycode", x)).orElseThrow(() -> new IllegalStateException( + "The key code must be set")); + ofNullable(this.metaState).ifPresent(x -> map.put("metastate", x)); + ofNullable(this.flags).ifPresent(x -> map.put("flags", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/android/nativekey/PressesKey.java b/src/main/java/io/appium/java_client/android/nativekey/PressesKey.java index 641087050..af633a1d9 100644 --- a/src/main/java/io/appium/java_client/android/nativekey/PressesKey.java +++ b/src/main/java/io/appium/java_client/android/nativekey/PressesKey.java @@ -16,12 +16,12 @@ package io.appium.java_client.android.nativekey; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.CanRememberExtensionPresence; import io.appium.java_client.CommandExecutionHelper; import io.appium.java_client.ExecutesMethod; import org.openqa.selenium.UnsupportedCommandException; +import java.util.HashMap; import java.util.Map; import static io.appium.java_client.MobileCommand.LONG_PRESS_KEY_CODE; @@ -55,10 +55,8 @@ default void pressKey(KeyEvent keyEvent) { default void longPressKey(KeyEvent keyEvent) { final String extName = "mobile: pressKey"; try { - Map args = ImmutableMap.builder() - .putAll(keyEvent.build()) - .put("isLongPress", true) - .build(); + var args = new HashMap<>(keyEvent.build()); + args.put("isLongPress", true); CommandExecutionHelper.executeScript(assertExtensionExists(extName), extName, args); } catch (UnsupportedCommandException e) { // TODO: Remove the fallback diff --git a/src/main/java/io/appium/java_client/driverscripts/ScriptOptions.java b/src/main/java/io/appium/java_client/driverscripts/ScriptOptions.java index 11c4f650a..41b5cd78e 100644 --- a/src/main/java/io/appium/java_client/driverscripts/ScriptOptions.java +++ b/src/main/java/io/appium/java_client/driverscripts/ScriptOptions.java @@ -16,8 +16,8 @@ package io.appium.java_client.driverscripts; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Objects.requireNonNull; @@ -58,9 +58,9 @@ public ScriptOptions withTimeout(long timeoutMs) { * @return The map containing the provided options */ public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(scriptType).ifPresent(x -> builder.put("type", x.name().toLowerCase())); - ofNullable(timeoutMs).ifPresent(x -> builder.put("timeout", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(scriptType).ifPresent(x -> map.put("type", x.name().toLowerCase())); + ofNullable(timeoutMs).ifPresent(x -> map.put("timeout", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/imagecomparison/BaseComparisonOptions.java b/src/main/java/io/appium/java_client/imagecomparison/BaseComparisonOptions.java index b91974009..bd20f884a 100644 --- a/src/main/java/io/appium/java_client/imagecomparison/BaseComparisonOptions.java +++ b/src/main/java/io/appium/java_client/imagecomparison/BaseComparisonOptions.java @@ -16,8 +16,8 @@ package io.appium.java_client.imagecomparison; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -45,8 +45,8 @@ public T withEnabledVisualization() { * @return comparison options mapping. */ public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(visualize).ifPresent(x -> builder.put("visualize", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(visualize).ifPresent(x -> map.put("visualize", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/imagecomparison/FeaturesMatchingOptions.java b/src/main/java/io/appium/java_client/imagecomparison/FeaturesMatchingOptions.java index 42e4cd976..3fd56517c 100644 --- a/src/main/java/io/appium/java_client/imagecomparison/FeaturesMatchingOptions.java +++ b/src/main/java/io/appium/java_client/imagecomparison/FeaturesMatchingOptions.java @@ -16,8 +16,8 @@ package io.appium.java_client.imagecomparison; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; @@ -68,11 +68,10 @@ public FeaturesMatchingOptions withGoodMatchesFactor(int factor) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(detectorName).ifPresent(x -> builder.put("detectorName", x)); - ofNullable(matchFunc).ifPresent(x -> builder.put("matchFunc", x)); - ofNullable(goodMatchesFactor).ifPresent(x -> builder.put("goodMatchesFactor", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(detectorName).ifPresent(x -> map.put("detectorName", x)); + ofNullable(matchFunc).ifPresent(x -> map.put("matchFunc", x)); + ofNullable(goodMatchesFactor).ifPresent(x -> map.put("goodMatchesFactor", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/imagecomparison/OccurrenceMatchingOptions.java b/src/main/java/io/appium/java_client/imagecomparison/OccurrenceMatchingOptions.java index d75e1d7e1..314a237dc 100644 --- a/src/main/java/io/appium/java_client/imagecomparison/OccurrenceMatchingOptions.java +++ b/src/main/java/io/appium/java_client/imagecomparison/OccurrenceMatchingOptions.java @@ -16,8 +16,8 @@ package io.appium.java_client.imagecomparison; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -66,11 +66,10 @@ public OccurrenceMatchingOptions withMatchNeighbourThreshold(int threshold) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(threshold).ifPresent(x -> builder.put("threshold", x)); - ofNullable(matchNeighbourThreshold).ifPresent(x -> builder.put("matchNeighbourThreshold", x)); - ofNullable(multiple).ifPresent(x -> builder.put("multiple", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(threshold).ifPresent(x -> map.put("threshold", x)); + ofNullable(matchNeighbourThreshold).ifPresent(x -> map.put("matchNeighbourThreshold", x)); + ofNullable(multiple).ifPresent(x -> map.put("multiple", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/ios/IOSStartScreenRecordingOptions.java b/src/main/java/io/appium/java_client/ios/IOSStartScreenRecordingOptions.java index b0673a5e0..a608cae0f 100644 --- a/src/main/java/io/appium/java_client/ios/IOSStartScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/ios/IOSStartScreenRecordingOptions.java @@ -16,11 +16,12 @@ package io.appium.java_client.ios; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.screenrecording.BaseStartScreenRecordingOptions; import io.appium.java_client.screenrecording.ScreenRecordingUploadOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Objects.requireNonNull; @@ -133,13 +134,12 @@ public IOSStartScreenRecordingOptions withVideoFilters(String filters) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(videoType).map(x -> builder.put("videoType", x)); - ofNullable(videoQuality).map(x -> builder.put("videoQuality", x)); - ofNullable(videoScale).map(x -> builder.put("videoScale", x)); - ofNullable(videoFilters).map(x -> builder.put("videoFilters", x)); - ofNullable(fps).map(x -> builder.put("videoFps", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(videoType).map(x -> map.put("videoType", x)); + ofNullable(videoQuality).map(x -> map.put("videoQuality", x)); + ofNullable(videoScale).map(x -> map.put("videoScale", x)); + ofNullable(videoFilters).map(x -> map.put("videoFilters", x)); + ofNullable(fps).map(x -> map.put("videoFps", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/ios/IOSTouchAction.java b/src/main/java/io/appium/java_client/ios/IOSTouchAction.java index 01a98f9e5..aca87955d 100644 --- a/src/main/java/io/appium/java_client/ios/IOSTouchAction.java +++ b/src/main/java/io/appium/java_client/ios/IOSTouchAction.java @@ -48,9 +48,7 @@ public IOSTouchAction(PerformsTouchActions performsTouchActions) { * @return self-reference */ public IOSTouchAction doubleTap(PointOption doubleTapOption) { - ActionParameter action = new ActionParameter("doubleTap", - doubleTapOption); - parameterBuilder.add(action); + parameters.add(new ActionParameter("doubleTap", doubleTapOption)); return this; } @@ -61,7 +59,7 @@ public IOSTouchAction doubleTap(PointOption doubleTapOption) { * @return this TouchAction, for chaining. */ public IOSTouchAction press(IOSPressOptions pressOptions) { - parameterBuilder.add(new ActionParameter("press", pressOptions)); + parameters.add(new ActionParameter("press", pressOptions)); return this; } } diff --git a/src/main/java/io/appium/java_client/mac/Mac2StartScreenRecordingOptions.java b/src/main/java/io/appium/java_client/mac/Mac2StartScreenRecordingOptions.java index 45c573126..342598b62 100644 --- a/src/main/java/io/appium/java_client/mac/Mac2StartScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/mac/Mac2StartScreenRecordingOptions.java @@ -16,10 +16,11 @@ package io.appium.java_client.mac; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.screenrecording.BaseStartScreenRecordingOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -139,14 +140,13 @@ public Mac2StartScreenRecordingOptions withTimeLimit(Duration timeLimit) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(fps).map(x -> builder.put("fps", x)); - ofNullable(preset).map(x -> builder.put("preset", x)); - ofNullable(videoFilter).map(x -> builder.put("videoFilter", x)); - ofNullable(captureClicks).map(x -> builder.put("captureClicks", x)); - ofNullable(captureCursor).map(x -> builder.put("captureCursor", x)); - ofNullable(deviceId).map(x -> builder.put("deviceId", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(fps).map(x -> map.put("fps", x)); + ofNullable(preset).map(x -> map.put("preset", x)); + ofNullable(videoFilter).map(x -> map.put("videoFilter", x)); + ofNullable(captureClicks).map(x -> map.put("captureClicks", x)); + ofNullable(captureCursor).map(x -> map.put("captureCursor", x)); + ofNullable(deviceId).map(x -> map.put("deviceId", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/remote/AppiumNewSessionCommandPayload.java b/src/main/java/io/appium/java_client/remote/AppiumNewSessionCommandPayload.java index 5f7655c2d..63fc663a5 100644 --- a/src/main/java/io/appium/java_client/remote/AppiumNewSessionCommandPayload.java +++ b/src/main/java/io/appium/java_client/remote/AppiumNewSessionCommandPayload.java @@ -16,7 +16,6 @@ package io.appium.java_client.remote; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.remote.options.BaseOptions; import org.openqa.selenium.Capabilities; import org.openqa.selenium.internal.Require; @@ -24,6 +23,7 @@ import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static org.openqa.selenium.remote.DriverCommand.NEW_SESSION; @@ -37,7 +37,7 @@ public class AppiumNewSessionCommandPayload extends CommandPayload { private static Map makeW3CSafe(Capabilities possiblyInvalidCapabilities) { return Require.nonNull("Capabilities", possiblyInvalidCapabilities) .asMap().entrySet().stream() - .collect(ImmutableMap.toImmutableMap( + .collect(Collectors.toUnmodifiableMap( entry -> BaseOptions.toW3cName(entry.getKey()), Map.Entry::getValue )); diff --git a/src/main/java/io/appium/java_client/remote/SupportsLocation.java b/src/main/java/io/appium/java_client/remote/SupportsLocation.java index 45d81f36c..91e12f0fa 100644 --- a/src/main/java/io/appium/java_client/remote/SupportsLocation.java +++ b/src/main/java/io/appium/java_client/remote/SupportsLocation.java @@ -16,7 +16,6 @@ package io.appium.java_client.remote; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.CommandExecutionHelper; import io.appium.java_client.ExecutesMethod; import io.appium.java_client.MobileCommand; @@ -26,6 +25,7 @@ import org.openqa.selenium.html5.LocationContext; import org.openqa.selenium.remote.html5.RemoteLocationContext; +import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -86,10 +86,10 @@ default void setLocation(Location location) { * @param location A {@link Location} containing the new location information. */ default void setLocation(io.appium.java_client.Location location) { - ImmutableMap.Builder locationParameters = ImmutableMap.builder(); + var locationParameters = new HashMap(); locationParameters.put("latitude", location.getLatitude()); locationParameters.put("longitude", location.getLongitude()); Optional.ofNullable(location.getAltitude()).ifPresent(altitude -> locationParameters.put("altitude", altitude)); - execute(MobileCommand.SET_LOCATION, Map.of("location", locationParameters.build())); + execute(MobileCommand.SET_LOCATION, Map.of("location", locationParameters)); } } diff --git a/src/main/java/io/appium/java_client/screenrecording/BaseScreenRecordingOptions.java b/src/main/java/io/appium/java_client/screenrecording/BaseScreenRecordingOptions.java index e4e3797ad..fd75dc2d6 100644 --- a/src/main/java/io/appium/java_client/screenrecording/BaseScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/screenrecording/BaseScreenRecordingOptions.java @@ -16,8 +16,6 @@ package io.appium.java_client.screenrecording; -import com.google.common.collect.ImmutableMap; - import java.util.Map; import static java.util.Objects.requireNonNull; @@ -46,9 +44,6 @@ protected T withUploadOptions(ScreenRecordingUploadOptions uploadOptions) { * @return arguments mapping. */ public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - //noinspection unchecked - ofNullable(uploadOptions).map(x -> builder.putAll(x.build())); - return builder.build(); + return ofNullable(uploadOptions).map(ScreenRecordingUploadOptions::build).orElseGet(Map::of); } } diff --git a/src/main/java/io/appium/java_client/screenrecording/BaseStartScreenRecordingOptions.java b/src/main/java/io/appium/java_client/screenrecording/BaseStartScreenRecordingOptions.java index 1ce5af766..55716b622 100644 --- a/src/main/java/io/appium/java_client/screenrecording/BaseStartScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/screenrecording/BaseStartScreenRecordingOptions.java @@ -16,9 +16,9 @@ package io.appium.java_client.screenrecording; -import com.google.common.collect.ImmutableMap; - import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Objects.requireNonNull; @@ -66,10 +66,9 @@ public T disableForcedRestart() { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(timeLimit).map(x -> builder.put("timeLimit", x.getSeconds())); - ofNullable(forceRestart).map(x -> builder.put("forceRestart", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(timeLimit).map(x -> map.put("timeLimit", x.getSeconds())); + ofNullable(forceRestart).map(x -> map.put("forceRestart", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/screenrecording/ScreenRecordingUploadOptions.java b/src/main/java/io/appium/java_client/screenrecording/ScreenRecordingUploadOptions.java index 97115a253..e018b47ea 100644 --- a/src/main/java/io/appium/java_client/screenrecording/ScreenRecordingUploadOptions.java +++ b/src/main/java/io/appium/java_client/screenrecording/ScreenRecordingUploadOptions.java @@ -16,8 +16,8 @@ package io.appium.java_client.screenrecording; -import com.google.common.collect.ImmutableMap; - +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Objects.requireNonNull; @@ -123,14 +123,14 @@ public ScreenRecordingUploadOptions withHeaders(Map headers) { * @return arguments mapping. */ public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - ofNullable(remotePath).map(x -> builder.put("remotePath", x)); - ofNullable(user).map(x -> builder.put("user", x)); - ofNullable(pass).map(x -> builder.put("pass", x)); - ofNullable(method).map(x -> builder.put("method", x)); - ofNullable(fileFieldName).map(x -> builder.put("fileFieldName", x)); - ofNullable(formFields).map(x -> builder.put("formFields", x)); - ofNullable(headers).map(x -> builder.put("headers", x)); - return builder.build(); + var map = new HashMap(); + ofNullable(remotePath).map(x -> map.put("remotePath", x)); + ofNullable(user).map(x -> map.put("user", x)); + ofNullable(pass).map(x -> map.put("pass", x)); + ofNullable(method).map(x -> map.put("method", x)); + ofNullable(fileFieldName).map(x -> map.put("fileFieldName", x)); + ofNullable(formFields).map(x -> map.put("formFields", x)); + ofNullable(headers).map(x -> map.put("headers", x)); + return Collections.unmodifiableMap(map); } } diff --git a/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java b/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java index a8690c78b..ad3729e77 100644 --- a/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java +++ b/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java @@ -16,7 +16,6 @@ package io.appium.java_client.service.local; -import com.google.common.collect.ImmutableList; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import io.appium.java_client.android.options.context.SupportsChromedriverExecutableOption; @@ -42,6 +41,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -395,7 +395,7 @@ protected List createArgs() { argList.add(capabilitiesToCmdlineArg()); } - return new ImmutableList.Builder().addAll(argList).build(); + return Collections.unmodifiableList(argList); } @Override diff --git a/src/main/java/io/appium/java_client/windows/WindowsStartScreenRecordingOptions.java b/src/main/java/io/appium/java_client/windows/WindowsStartScreenRecordingOptions.java index ff90a08f2..8f5d5bc72 100644 --- a/src/main/java/io/appium/java_client/windows/WindowsStartScreenRecordingOptions.java +++ b/src/main/java/io/appium/java_client/windows/WindowsStartScreenRecordingOptions.java @@ -16,10 +16,11 @@ package io.appium.java_client.windows; -import com.google.common.collect.ImmutableMap; import io.appium.java_client.screenrecording.BaseStartScreenRecordingOptions; import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static java.util.Optional.ofNullable; @@ -138,14 +139,13 @@ public WindowsStartScreenRecordingOptions withTimeLimit(Duration timeLimit) { @Override public Map build() { - final ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.putAll(super.build()); - ofNullable(fps).map(x -> builder.put("fps", x)); - ofNullable(preset).map(x -> builder.put("preset", x)); - ofNullable(videoFilter).map(x -> builder.put("videoFilter", x)); - ofNullable(captureClicks).map(x -> builder.put("captureClicks", x)); - ofNullable(captureCursor).map(x -> builder.put("captureCursor", x)); - ofNullable(audioInput).map(x -> builder.put("audioInput", x)); - return builder.build(); + var map = new HashMap<>(super.build()); + ofNullable(fps).map(x -> map.put("fps", x)); + ofNullable(preset).map(x -> map.put("preset", x)); + ofNullable(videoFilter).map(x -> map.put("videoFilter", x)); + ofNullable(captureClicks).map(x -> map.put("captureClicks", x)); + ofNullable(captureCursor).map(x -> map.put("captureCursor", x)); + ofNullable(audioInput).map(x -> map.put("audioInput", x)); + return Collections.unmodifiableMap(map); } }