diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IGoogleMapDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IGoogleMapDelegate.aidl index bcb27314f2b22d02c4b3c5e33895b26ccf936cf6..6759dbbd9850ec64f65f7137b1def39b0d4e212e 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IGoogleMapDelegate.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IGoogleMapDelegate.aidl @@ -34,11 +34,12 @@ import com.google.android.gms.maps.model.MapStyleOptions; import com.google.android.gms.maps.model.PolygonOptions; import com.google.android.gms.maps.model.PolylineOptions; import com.google.android.gms.maps.model.TileOverlayOptions; -import com.google.android.gms.maps.model.internal.IPolylineDelegate; -import com.google.android.gms.maps.model.internal.IPolygonDelegate; -import com.google.android.gms.maps.model.internal.IMarkerDelegate; import com.google.android.gms.maps.model.internal.ICircleDelegate; import com.google.android.gms.maps.model.internal.IGroundOverlayDelegate; +import com.google.android.gms.maps.model.internal.IIndoorBuildingDelegate; +import com.google.android.gms.maps.model.internal.IMarkerDelegate; +import com.google.android.gms.maps.model.internal.IPolygonDelegate; +import com.google.android.gms.maps.model.internal.IPolylineDelegate; import com.google.android.gms.maps.model.internal.ITileOverlayDelegate; interface IGoogleMapDelegate { diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/ILocationSourceDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/ILocationSourceDelegate.aidl index 203ec69f12cc3bfccca1432a5ff24ef24ededd45..3f1ed56fb11492676fd5fad9f64a01afbe9e5f88 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/ILocationSourceDelegate.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/ILocationSourceDelegate.aidl @@ -1,4 +1,8 @@ package com.google.android.gms.maps.internal; +import com.google.android.gms.maps.internal.IOnLocationChangeListener; + interface ILocationSourceDelegate { + void activate(IOnLocationChangeListener listener) = 0; + void deactivate() = 1; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnIndoorStateChangeListener.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnIndoorStateChangeListener.aidl new file mode 100644 index 0000000000000000000000000000000000000000..c224c58e245ef2e63c686da1588e8a70867d9c67 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnIndoorStateChangeListener.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.maps.internal; + +interface IOnIndoorStateChangeListener { + void onIndoorBuildingFocused() = 0; + void onIndoorLevelActivated() = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnLocationChangeListener.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnLocationChangeListener.aidl new file mode 100644 index 0000000000000000000000000000000000000000..7d3897dcf4b865729ebf8261326ff545027bf837 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/internal/IOnLocationChangeListener.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.maps.internal; + +import android.location.Location; + +interface IOnLocationChangeListener { + void onLocationChanged(in Location location) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Cap.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Cap.aidl new file mode 100644 index 0000000000000000000000000000000000000000..802366f61b8dcfb4bc9da58447cd27f61c51c8d5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Cap.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.maps.model; + +parcelable Cap; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dash.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dash.aidl new file mode 100644 index 0000000000000000000000000000000000000000..256aedac9de3c55ebbadbc98d344dc75a287c671 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dash.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.maps.model; + +parcelable Dash; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dot.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dot.aidl new file mode 100644 index 0000000000000000000000000000000000000000..c8aa8afb0d23f65b263bd05e156d6f6e9df2449f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Dot.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.maps.model; + +parcelable Dot; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Gap.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Gap.aidl new file mode 100644 index 0000000000000000000000000000000000000000..fd4fde3ae30932feb14ef01709e6c6d1ac221fa2 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/Gap.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.maps.model; + +parcelable Gap; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/StyleSpan.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/StyleSpan.aidl new file mode 100644 index 0000000000000000000000000000000000000000..3dd85466bafb2799fed111bfb86127c5801591ac --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/StyleSpan.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.maps.model; + +parcelable StyleSpan; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/ICircleDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/ICircleDelegate.aidl index 8f2277e9e3fdb0658a1c1e5ebd3d40e0b5ebce93..0a2c088af8ce102d911e9f8172319916604dd439 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/ICircleDelegate.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/ICircleDelegate.aidl @@ -2,6 +2,7 @@ package com.google.android.gms.maps.model.internal; import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.PatternItem; interface ICircleDelegate { void remove(); @@ -24,8 +25,8 @@ interface ICircleDelegate { int hashCodeRemote(); void setClickable(boolean clickable); boolean isClickable(); - void setStrokePattern(IObjectWrapper object); - IObjectWrapper getStrokePattern(); + void setStrokePattern(in List items); + List getStrokePattern(); void setTag(IObjectWrapper object); IObjectWrapper getTag(); } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorBuildingDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorBuildingDelegate.aidl new file mode 100644 index 0000000000000000000000000000000000000000..3ec555d78d02c8c1a72a284d340dd3d0d0ae108c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorBuildingDelegate.aidl @@ -0,0 +1,10 @@ +package com.google.android.gms.maps.model.internal; + +interface IIndoorBuildingDelegate { + int getActiveLevelIndex() = 0; + int getDefaultLevelIndex() = 1; + List getLevels() = 2; // IIndoorLevelDelegate's + boolean isUnderground() = 3; + boolean equalsRemote(IIndoorBuildingDelegate other) = 4; + int hashCodeRemote() = 5; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorLevelDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorLevelDelegate.aidl new file mode 100644 index 0000000000000000000000000000000000000000..8c48348e0837af28b74124bb004b1ce6b489705c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IIndoorLevelDelegate.aidl @@ -0,0 +1,9 @@ +package com.google.android.gms.maps.model.internal; + +interface IIndoorLevelDelegate { + String getName() = 0; + String getShortName() = 1; + void activate() = 2; + boolean equalsRemote(IIndoorLevelDelegate other) = 3; + int hashCodeRemote() = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolygonDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolygonDelegate.aidl index 79292fc7a081457d43ae5b4d62119b0249b1aecb..ef1d273abd57007ce9e8a2cb16a79ea062c1a68f 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolygonDelegate.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolygonDelegate.aidl @@ -31,6 +31,7 @@ interface IPolygonDelegate { boolean equalsRemote(IPolygonDelegate other) = 18; int hashCodeRemote() = 19; void setClickable(boolean click) = 20; + boolean isClickable() = 21; void setStrokeJointType(int type) = 22; int getStrokeJointType() = 23; void setStrokePattern(in List items) = 24; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolylineDelegate.aidl b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolylineDelegate.aidl index ebbb336bf2729a632a43c7a8155169d2f253d9a6..0e957b2cab5c99eda4805eded590d53baffcd689 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolylineDelegate.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/maps/model/internal/IPolylineDelegate.aidl @@ -1,22 +1,39 @@ package com.google.android.gms.maps.model.internal; +import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.PatternItem; +import com.google.android.gms.maps.model.StyleSpan; interface IPolylineDelegate { - void remove(); - String getId(); - void setPoints(in List points); - List getPoints(); - void setWidth(float width); - float getWidth(); - void setColor(int color); - int getColor(); - void setZIndex(float zIndex); - float getZIndex(); - void setVisible(boolean visible); - boolean isVisible(); - void setGeodesic(boolean geod); - boolean isGeodesic(); - boolean equalsRemote(IPolylineDelegate other); - int hashCodeRemote(); + void remove() = 0; + String getId() = 1; + void setPoints(in List points) = 2; + List getPoints() = 3; + void setWidth(float width) = 4; + float getWidth() = 5; + void setColor(int color) = 6; + int getColor() = 7; + void setZIndex(float zIndex) = 8; + float getZIndex() = 9; + void setVisible(boolean visible) = 10; + boolean isVisible() = 11; + void setGeodesic(boolean geod) = 12; + boolean isGeodesic() = 13; + boolean equalsRemote(IPolylineDelegate other) = 14; + int hashCodeRemote() = 15; + void setClickable(boolean clickable) = 16; + boolean isClickable() = 17; + //void setStartCap(Cap startCap) = 18; + //Cap getStartCap() = 19; + //void setEndCap(Cap endCap) = 20; + //Cap getEndCap() = 21; + void setJointType(int jointType) = 22; + int getJointType() = 23; + void setPattern(in List pattern) = 24; + List getPattern() = 25; + void setTag(IObjectWrapper tag) = 26; + IObjectWrapper getTag() = 27; + //void setSpans(in List spans) = 28; + //List getSpans() = 29 } diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/Cap.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/Cap.java new file mode 100644 index 0000000000000000000000000000000000000000..d5d38d1f77b0b986f7b901ca4136909642498dc6 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/Cap.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.maps.model; + +import android.os.IBinder; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class Cap extends AutoSafeParcelable { + @Field(2) + private int type; + @Field(3) + private IBinder bitmap; + private BitmapDescriptor bitmapDescriptor; + @Field(4) + private float bitmapRefWidth; + public static final Creator CREATOR = new AutoCreator<>(Cap.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/CircleOptions.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/CircleOptions.java index cb14f525ded630e42a24a3f898ef8cc319195e2a..63ff492a765e1e760803390ae059061572d454e6 100644 --- a/play-services-api/src/main/java/com/google/android/gms/maps/model/CircleOptions.java +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/CircleOptions.java @@ -22,6 +22,10 @@ import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; import org.microg.safeparcel.SafeParceled; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * Defines options for a Circle. */ @@ -45,6 +49,8 @@ public class CircleOptions extends AutoSafeParcelable { private boolean visible = true; @SafeParceled(9) private boolean clickable = false; + @SafeParceled(10) + private List strokePattern = null; /** * Creates circle options. @@ -239,5 +245,24 @@ public class CircleOptions extends AutoSafeParcelable { return this; } + /** + * Specifies a stroke pattern for the circle's outline. The default stroke pattern is solid, represented by {@code null}. + * + * @return this {@link CircleOptions} object with a new stroke pattern set. + */ + public CircleOptions strokePattern(List pattern) { + this.strokePattern = pattern; + return this; + } + + /** + * Gets the stroke pattern set in this {@link CircleOptions} object for the circle's outline. + * + * @return the stroke pattern of the circle's outline. + */ + public List getStrokePattern() { + return strokePattern; + } + public static Creator CREATOR = new AutoCreator(CircleOptions.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/PatternItem.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/PatternItem.java index c964cb86c6c5e5fb154b58f85493aba476b34240..1278df94d9b5c0e29a50a16ad43f24978f8f0b4b 100644 --- a/play-services-api/src/main/java/com/google/android/gms/maps/model/PatternItem.java +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/PatternItem.java @@ -8,6 +8,8 @@ package com.google.android.gms.maps.model; +import android.os.Parcel; + import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; @@ -21,6 +23,9 @@ public class PatternItem extends AutoSafeParcelable { @Field(3) private Float length; + private PatternItem() { + } + @PublicApi(exclude = true) PatternItem(int type, Float length) { this.type = type; @@ -32,5 +37,20 @@ public class PatternItem extends AutoSafeParcelable { return "[PatternItem: type=" + type + " length=" + length + "]"; } - public static final Creator CREATOR = new AutoCreator<>(PatternItem.class); + public static final Creator CREATOR = new AutoCreator(PatternItem.class) { + @Override + public PatternItem createFromParcel(Parcel parcel) { + PatternItem item = super.createFromParcel(parcel); + switch (item.type) { + case 0: + return new Dash(item.length); + case 1: + return new Dot(); + case 2: + return new Gap(item.length); + default: + return item; + } + } + }; } diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/PolylineOptions.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/PolylineOptions.java index d9a9dc5b4225cf448b4d51472bbeb9a251bc1a26..5e2cda9b1c51fb45f6e75f5f0b4497a3d04d301b 100644 --- a/play-services-api/src/main/java/com/google/android/gms/maps/model/PolylineOptions.java +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/PolylineOptions.java @@ -1,17 +1,6 @@ /* - * Copyright (C) 2013-2017 microG Project Team - * - * 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. + * SPDX-FileCopyrightText: 2015 microG Project Team + * SPDX-License-Identifier: Apache-2.0 */ package com.google.android.gms.maps.model; @@ -20,7 +9,6 @@ import android.graphics.Color; import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.ArrayList; import java.util.List; @@ -31,20 +19,32 @@ import java.util.List; */ @PublicApi public class PolylineOptions extends AutoSafeParcelable { - @SafeParceled(1) + @Field(1) private int versionCode = 1; - @SafeParceled(value = 2, subClass = LatLng.class) + @Field(value = 2, subClass = LatLng.class) private List points = new ArrayList(); - @SafeParceled(3) + @Field(3) private float width = 10; - @SafeParceled(4) + @Field(4) private int color = Color.BLACK; - @SafeParceled(5) + @Field(5) private float zIndex = 0; - @SafeParceled(6) + @Field(6) private boolean visible = true; - @SafeParceled(7) + @Field(7) private boolean geodesic = false; + @Field(8) + private boolean clickable = false; + @Field(9) + private Cap startCap; + @Field(10) + private Cap endCap; + @Field(11) + private int jointType = JointType.DEFAULT; + @Field(value = 12, subClass = PatternItem.class) + private List pattern = null; + @Field(value = 13, subClass = StyleSpan.class) + private List spans = null; public PolylineOptions() { } @@ -68,6 +68,11 @@ public class PolylineOptions extends AutoSafeParcelable { return this; } + public PolylineOptions clickable(boolean clickable) { + this.clickable = clickable; + return this; + } + public PolylineOptions color(int color) { this.color = color; return this; @@ -82,6 +87,14 @@ public class PolylineOptions extends AutoSafeParcelable { return color; } + public int getJointType() { + return jointType; + } + + public List getPattern() { + return pattern; + } + public List getPoints() { return points; } @@ -102,6 +115,10 @@ public class PolylineOptions extends AutoSafeParcelable { return visible; } + public boolean isClickable() { + return clickable; + } + public PolylineOptions visible(boolean visible) { this.visible = visible; return this; diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/StampStyle.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/StampStyle.java new file mode 100644 index 0000000000000000000000000000000000000000..a0cf3aaff49f22dc39e55fb405a1cc20803d7302 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/StampStyle.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.maps.model; + +import android.os.IBinder; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class StampStyle extends AutoSafeParcelable { + @Field(2) + private IBinder stamp; + private BitmapDescriptor stampDescriptor; + + public static final Creator CREATOR = new AutoCreator<>(StampStyle.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/StrokeStyle.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/StrokeStyle.java new file mode 100644 index 0000000000000000000000000000000000000000..edc91583a3b73305785d3515d629e12f2159555f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/StrokeStyle.java @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.maps.model; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class StrokeStyle extends AutoSafeParcelable { + @Field(2) + private float width; + @Field(3) + private int color; + @Field(4) + private int toColor; + @Field(5) + private boolean isVisible; + @Field(6) + private StampStyle stamp; + + public static final Creator CREATOR = new AutoCreator<>(StrokeStyle.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/maps/model/StyleSpan.java b/play-services-api/src/main/java/com/google/android/gms/maps/model/StyleSpan.java new file mode 100644 index 0000000000000000000000000000000000000000..19e210141e21670ea20cc6e83ac482336d3ed788 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/maps/model/StyleSpan.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.maps.model; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class StyleSpan extends AutoSafeParcelable { + @Field(2) + private StrokeStyle style; + @Field(3) + private double segments; + + public double getSegments() { + return segments; + } + + public StrokeStyle getStyle() { + return style; + } + + public static final Creator CREATOR = new AutoCreator<>(StyleSpan.class); +} diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt index 297dc873ae66a903dd9b90b5ffbe411e6c4189c7..c666d44d6a464f3d39522de142f8e6a62f02ceed 100644 --- a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt @@ -18,6 +18,7 @@ package org.microg.gms.maps.mapbox import android.annotation.SuppressLint import android.content.Context +import android.graphics.Bitmap import android.graphics.Point import android.location.Location import android.os.* @@ -59,6 +60,8 @@ import org.microg.gms.maps.mapbox.model.InfoWindow import org.microg.gms.maps.mapbox.model.getInfoWindowViewFor import com.mapbox.mapboxsdk.camera.CameraUpdateFactory import com.mapbox.mapboxsdk.maps.OnMapReadyCallback +import com.mapbox.mapboxsdk.location.engine.LocationEngineCallback +import com.mapbox.mapboxsdk.location.engine.LocationEngineResult import org.microg.gms.maps.MapsConstants.* import org.microg.gms.maps.mapbox.model.* import org.microg.gms.maps.mapbox.utils.MapContext @@ -111,6 +114,19 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) internal var onInfoWindowCloseListener: IOnInfoWindowCloseListener? = null var currentInfoWindow: InfoWindow? = null + private var myLocationChangeListener: IOnMyLocationChangeListener? = null + + private val locationEngineCallback = object : LocationEngineCallback { + override fun onSuccess(result: LocationEngineResult?) { + result?.lastLocation?.let { location -> + Log.d(TAG, "myLocationChanged: $location") + myLocationChangeListener?.onMyLocationChanged(ObjectWrapper.wrap(location)) + } + } + override fun onFailure(e: Exception) { + Log.w(TAG, e) + } + } var lineManager: LineManager? = null val pendingLines = mutableSetOf>() @@ -126,6 +142,8 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) val markers = mutableMapOf() var markerId = 0L + val pendingBitmaps = mutableMapOf() + var groundId = 0L var tileId = 0L @@ -143,6 +161,7 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) val fakeWatermark = View(mapContext) + fakeWatermark.tag = "GoogleWatermark" fakeWatermark.layoutParams = object : RelativeLayout.LayoutParams(0, 0) { @SuppressLint("RtlHardcoded") override fun addRule(verb: Int, subject: Int) { @@ -317,7 +336,7 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) return TileOverlayImpl(this, "t${tileId++}", options) } - override fun addCircle(options: CircleOptions): ICircleDelegate? { + override fun addCircle(options: CircleOptions): ICircleDelegate { val circle = CircleImpl(this, "c${fillId++}", options) synchronized(this) { val fillManager = fillManager @@ -332,6 +351,12 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) } else { circle.line.update(lineManager) } + circle.strokePattern?.let { + addBitmap( + it.getName(circle.strokeColor, circle.strokeWidth), + it.makeBitmap(circle.strokeColor, circle.strokeWidth) + ) + } } return circle } @@ -421,6 +446,15 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) try { if (locationComponent.isLocationComponentActivated) { locationComponent.isLocationComponentEnabled = myLocation + if (myLocation) { + locationComponent.locationEngine?.requestLocationUpdates( + locationComponent.locationEngineRequest, + locationEngineCallback, + null + ) + } else { + locationComponent.locationEngine?.removeLocationUpdates(locationEngineCallback) + } } } catch (e: SecurityException) { Log.w(TAG, e) @@ -431,8 +465,9 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) } override fun getMyLocation(): Location? { - Log.d(TAG, "unimplemented Method: getMyLocation") - return null + synchronized(mapLock) { + return map?.locationComponent?.lastKnownLocation + } } override fun setLocationSource(locationSource: ILocationSourceDelegate?) { @@ -519,8 +554,7 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) } override fun setOnMyLocationChangeListener(listener: IOnMyLocationChangeListener?) { - Log.d(TAG, "unimplemented Method: setOnMyLocationChangeListener") - + myLocationChangeListener = listener } override fun setOnMyLocationButtonClickListener(listener: IOnMyLocationButtonClickListener?) { @@ -786,6 +820,9 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) pendingMarkers.forEach { it.update(symbolManager) } pendingMarkers.clear() + pendingBitmaps.forEach { map -> it.addImage(map.key, map.value) } + pendingBitmaps.clear() + val mapContext = MapContext(context) map.locationComponent.apply { activateLocationComponent(LocationComponentActivationOptions.builder(mapContext, it) @@ -796,13 +833,9 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) renderMode = RenderMode.COMPASS } + setMyLocationEnabled(locationEnabled) + synchronized(mapLock) { - try { - map.locationComponent.isLocationComponentEnabled = locationEnabled - } catch (e: SecurityException) { - Log.w(TAG, e) - locationEnabled = false - } loaded = true if (loadedCallback != null) { Log.d(TAG, "Invoking callback delayed, as map is loaded") @@ -824,11 +857,21 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) return false } + internal fun addBitmap(name: String, bitmap: Bitmap) { + val map = map + if (map != null) { + map.getStyle { + it.addImage(name, bitmap) + } + } else { + pendingBitmaps[name] = bitmap + } + } + override fun useViewLifecycleWhenInFragment(): Boolean { Log.d(TAG, "unimplemented Method: useViewLifecycleWhenInFragment") return false } - override fun onResume() = mapView?.onResume() ?: Unit override fun onPause() = mapView?.onPause() ?: Unit override fun onDestroy() { @@ -879,8 +922,8 @@ class GoogleMapImpl(private val context: Context, var options: GoogleMapOptions) override fun onExitAmbient() { Log.d(TAG, "unimplemented Method: onExitAmbient") } - override fun onLowMemory() = mapView?.onLowMemory() ?: Unit + override fun onSaveInstanceState(outState: Bundle) { val newBundle = Bundle() mapView?.onSaveInstanceState(newBundle) diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Pattern.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Pattern.kt new file mode 100644 index 0000000000000000000000000000000000000000..646a0906a72c6b82172257b4d72f6bacea806fdb --- /dev/null +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/Pattern.kt @@ -0,0 +1,83 @@ +package org.microg.gms.maps.mapbox + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Paint +import com.google.android.gms.maps.model.Dash +import com.google.android.gms.maps.model.Dot +import com.google.android.gms.maps.model.Gap +import com.google.android.gms.maps.model.PatternItem + +fun PatternItem.getName(): String = when (this) { + is Dash -> "dash${this.length}" + is Gap -> "gap${this.length}" + is Dot -> "dot" + else -> this.javaClass.name +} + +/** + * Name of pattern, to identify it after it is added to map + */ +fun MutableList.getName(color: Int, strokeWidth: Float) = joinToString("-") { + it.getName() +} + "-${color}-width${strokeWidth}" + +/** + * Gets width that a bitmap for this pattern item would have if the pattern's bitmap + * were to be drawn with respect to aspect ratio onto a canvas with height 1. + */ +fun PatternItem.getWidth(strokeWidth: Float): Float = when (this) { + is Dash -> this.length + is Gap -> this.length + is Dot -> strokeWidth + else -> 1f +} + +/** + * Gets width that a bitmap for this pattern would have if it were to be drawn + * with respect to aspect ratio onto a canvas with height 1. + */ +fun MutableList.getWidth(strokeWidth: Float) = map { it.getWidth(strokeWidth) }.sum() + +fun MutableList.makeBitmap(color: Int, strokeWidth: Float): Bitmap = makeBitmap(Paint().apply { + setColor(color) + style = Paint.Style.FILL +}, strokeWidth) + + +fun MutableList.makeBitmap(paint: Paint, strokeWidth: Float): Bitmap { + + // Pattern aspect ratio is not respected by renderer + val width = getWidth(strokeWidth).toInt() + val height = strokeWidth.toInt() // avoids squished image bugs + + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + + var drawCursor = 0f + for (item in this) { + when (item) { + is Dash -> canvas.drawRect( + drawCursor, + 0f, + drawCursor + item.length, + strokeWidth, + paint + ) + + // is Gap -> do nothing, only move cursor + + is Dot -> canvas.drawOval( + drawCursor, + 0f, + drawCursor + item.getWidth(strokeWidth), + strokeWidth, + paint + ) + } + + drawCursor += item.getWidth(strokeWidth) + } + + return bitmap +} diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Circle.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Circle.kt index d0aa04dab38b3d015a80f7c0f3235a0166fe53fb..d0a22accefe68dde79f156aa97dbd53aac03de14 100644 --- a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Circle.kt +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Circle.kt @@ -22,6 +22,7 @@ import com.google.android.gms.dynamic.IObjectWrapper import com.google.android.gms.dynamic.ObjectWrapper import com.google.android.gms.dynamic.unwrap import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.PatternItem import com.google.android.gms.maps.model.internal.ICircleDelegate import com.mapbox.geojson.LineString import com.mapbox.geojson.Point @@ -32,6 +33,8 @@ import com.mapbox.turf.TurfMeasurement import com.mapbox.turf.TurfMeta import com.mapbox.turf.TurfTransformation import org.microg.gms.maps.mapbox.GoogleMapImpl +import org.microg.gms.maps.mapbox.getName +import org.microg.gms.maps.mapbox.makeBitmap import com.google.android.gms.maps.model.CircleOptions as GmsCircleOptions val NORTH_POLE: Point = Point.fromLngLat(0.0, 90.0) @@ -50,6 +53,7 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options private var fillColor: Int = options.fillColor private var visible: Boolean = options.isVisible private var clickable: Boolean = options.isClickable + private var strokePattern: MutableList? = options.strokePattern private var tag: Any? = null internal val line: Markup = object : Markup { @@ -63,6 +67,11 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options ).withLineWidth(strokeWidth / map.dpiFactor) .withLineColor(ColorUtils.colorToRgbaString(strokeColor)) .withLineOpacity(if (visible) 1f else 0f) + .apply { + strokePattern?.let { + withLinePattern(it.getName(strokeColor, strokeWidth)) + } + } override val removed: Boolean = false } @@ -74,7 +83,6 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options FillOptions() .withGeometry(makePolygon()) .withFillColor(ColorUtils.colorToRgbaString(fillColor)) - .withFillOutlineColor(ColorUtils.colorToRgbaString(strokeColor)) .withFillOpacity(if (visible && !wrapsAroundPoles()) 1f else 0f) private fun makePolygon() = TurfTransformation.circle( @@ -179,6 +187,11 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options override fun setStrokeWidth(width: Float) { this.strokeWidth = width line.annotation?.lineWidth = width / map.dpiFactor + strokePattern?.let { + val bitmapName = it.getName(strokeColor, strokeWidth) + map.addBitmap(bitmapName, it.makeBitmap(strokeColor, width)) + line.annotation?.linePattern = bitmapName + } map.lineManager?.let { line.update(it) } } @@ -187,6 +200,11 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options override fun setStrokeColor(color: Int) { this.strokeColor = color line.annotation?.setLineColor(color) + strokePattern?.let { + val bitmapName = it.getName(color, strokeWidth) + map.addBitmap(bitmapName, it.makeBitmap(color, strokeWidth)) + line.annotation?.linePattern = bitmapName + } map.lineManager?.let { line.update(it) } } @@ -243,13 +261,17 @@ class CircleImpl(private val map: GoogleMapImpl, private val id: String, options } } - override fun setStrokePattern(pattern: IObjectWrapper?) { - Log.d(TAG, "unimplemented method: set stroke pattern") + override fun setStrokePattern(pattern: MutableList?) { + this.strokePattern = pattern + line.annotation?.linePattern = pattern?.getName(strokeColor, strokeWidth) + pattern?.let { + map.addBitmap(it.getName(strokeColor, strokeWidth), it.makeBitmap(strokeColor, strokeWidth)) + } + map.lineManager?.let { line.update(it) } } - override fun getStrokePattern(): IObjectWrapper { - Log.d(TAG, "unimplemented method: getStrokePattern") - return ObjectWrapper.wrap(null) + override fun getStrokePattern(): MutableList? { + return strokePattern } override fun setTag(o: IObjectWrapper) { diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt index c0de5468eeb814e2a83afd5bb8910236c50b1140..2c10af4a70dd638d77a9ee5c15f2d8ca5b28acc6 100644 --- a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polygon.kt @@ -8,6 +8,7 @@ package org.microg.gms.maps.mapbox.model import android.os.Parcel import android.util.Log import com.google.android.gms.dynamic.IObjectWrapper +import com.google.android.gms.dynamic.ObjectWrapper import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.PatternItem import com.google.android.gms.maps.model.PolygonOptions @@ -143,6 +144,8 @@ class PolygonImpl(private val map: GoogleMapImpl, private val id: String, option clickable = click } + override fun isClickable(): Boolean = clickable + override fun setStrokeJointType(type: Int) { strokeJointType = type } @@ -159,7 +162,7 @@ class PolygonImpl(private val map: GoogleMapImpl, private val id: String, option tag = obj } - override fun getTag(): IObjectWrapper? = tag + override fun getTag(): IObjectWrapper = tag ?: ObjectWrapper.wrap(null) override fun hashCode(): Int { return id.hashCode() diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt index f9a8f91b904cbf1e665e9c52b25adb54b844b440..15751f906f1c1fea6ac5b70ee69625dad6bf62e4 100644 --- a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/model/Polyline.kt @@ -18,7 +18,10 @@ package org.microg.gms.maps.mapbox.model import android.os.Parcel import android.util.Log +import com.google.android.gms.dynamic.IObjectWrapper +import com.google.android.gms.dynamic.ObjectWrapper import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.PatternItem import com.google.android.gms.maps.model.internal.IPolylineDelegate import com.mapbox.mapboxsdk.plugins.annotation.Line import com.mapbox.mapboxsdk.plugins.annotation.LineOptions @@ -30,8 +33,12 @@ import com.google.android.gms.maps.model.PolylineOptions as GmsLineOptions class PolylineImpl(private val map: GoogleMapImpl, private val id: String, options: GmsLineOptions) : IPolylineDelegate.Stub(), Markup { private var points = ArrayList(options.points) private var width = options.width + private var jointType = options.jointType + private var pattern = ArrayList(options.pattern.orEmpty()) private var color = options.color private var visible: Boolean = options.isVisible + private var clickable: Boolean = options.isClickable + private var tag: IObjectWrapper? = null override var annotation: Line? = null override var removed: Boolean = false @@ -103,6 +110,30 @@ class PolylineImpl(private val map: GoogleMapImpl, private val id: String, optio override fun hashCodeRemote(): Int = hashCode() + override fun setClickable(clickable: Boolean) { + this.clickable = clickable + } + + override fun isClickable(): Boolean = clickable + + override fun setJointType(jointType: Int) { + this.jointType = jointType + } + + override fun getJointType(): Int = jointType + + override fun setPattern(pattern: MutableList?) { + this.pattern = ArrayList(pattern.orEmpty()) + } + + override fun getPattern(): MutableList = pattern + + override fun setTag(tag: IObjectWrapper?) { + this.tag = tag + } + + override fun getTag(): IObjectWrapper = tag ?: ObjectWrapper.wrap(null) + override fun hashCode(): Int { return id.hashCode() } @@ -128,4 +159,4 @@ class PolylineImpl(private val map: GoogleMapImpl, private val id: String, optio companion object { private val TAG = "GmsMapPolyline" } -} \ No newline at end of file +} diff --git a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt index 2b00202a43b636549d1fea979b28331aa236db7a..a8ce14125d97f352920c2af9915fd4c2a8fa7d71 100644 --- a/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt +++ b/play-services-maps-core-mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt @@ -24,7 +24,7 @@ import android.view.LayoutInflater import org.microg.gms.common.Constants import java.io.File -class MapContext(private val context: Context) : ContextWrapper(context.createPackageContext(Constants.GMS_PACKAGE_NAME, Context.CONTEXT_INCLUDE_CODE and Context.CONTEXT_IGNORE_SECURITY)) { +class MapContext(private val context: Context) : ContextWrapper(context.createPackageContext(Constants.GMS_PACKAGE_NAME, Context.CONTEXT_INCLUDE_CODE or Context.CONTEXT_IGNORE_SECURITY)) { private var layoutInflater: LayoutInflater? = null private val appContext: Context get() = context.applicationContext ?: context @@ -77,4 +77,4 @@ class MapContext(private val context: Context) : ContextWrapper(context.createPa companion object { val TAG = "GmsMapContext" } -} \ No newline at end of file +} diff --git a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/CircleImpl.java b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/CircleImpl.java index 9fe9a05ff6297742344c8a7b14026c60379ba0c6..8a30cd21ecd2b30505f153cdaa20f209dbb52f27 100644 --- a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/CircleImpl.java +++ b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/CircleImpl.java @@ -23,6 +23,7 @@ import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; import com.google.android.gms.maps.model.CircleOptions; import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.PatternItem; import com.google.android.gms.maps.model.internal.ICircleDelegate; import org.microg.gms.maps.vtm.GmsMapsTypeHelper; @@ -31,6 +32,8 @@ import org.oscim.layers.vector.geometries.Drawable; import org.oscim.layers.vector.geometries.Style; import org.oscim.map.Map; +import java.util.List; + public class CircleImpl extends ICircleDelegate.Stub implements DrawableMarkup { private static final String TAG = "GmsMapCircle"; @@ -155,14 +158,14 @@ public class CircleImpl extends ICircleDelegate.Stub implements DrawableMarkup { } @Override - public void setStrokePattern(IObjectWrapper object) throws RemoteException { + public void setStrokePattern(List object) throws RemoteException { Log.d(TAG, "unimplemented method: setStrokePattern"); } @Override - public IObjectWrapper getStrokePattern() throws RemoteException { + public List getStrokePattern() throws RemoteException { Log.d(TAG, "unimplemented method: getStrokePattern"); - return ObjectWrapper.wrap(null); + return null; } @Override diff --git a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolygonImpl.java b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolygonImpl.java index cb1a55f53e09283e7edc0728f40de0279e347db0..23bcfc83c63b0863e764f36a6842c920c1d740be 100644 --- a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolygonImpl.java +++ b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolygonImpl.java @@ -205,6 +205,11 @@ public class PolygonImpl extends IPolygonDelegate.Stub implements DrawableMarkup } + @Override + public boolean isClickable() throws RemoteException { + return false; + } + @Override public void setStrokeJointType(int type) throws RemoteException { diff --git a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolylineImpl.java b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolylineImpl.java index b2ff4c2f3509ab2f42ea8c0b32d53737f6de9de9..7e098596e45601ed77bfd017d1fe7b645828746d 100644 --- a/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolylineImpl.java +++ b/play-services-maps-core-vtm/src/main/java/org/microg/gms/maps/vtm/markup/PolylineImpl.java @@ -19,7 +19,9 @@ package org.microg.gms.maps.vtm.markup; import android.os.RemoteException; import android.util.Log; +import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.PatternItem; import com.google.android.gms.maps.model.PolylineOptions; import com.google.android.gms.maps.model.internal.IPolylineDelegate; @@ -157,6 +159,47 @@ public class PolylineImpl extends IPolylineDelegate.Stub implements DrawableMark return id.hashCode(); } + // Not implemented + @Override + public void setClickable(boolean clickable) throws RemoteException { + + } + + @Override + public boolean isClickable() throws RemoteException { + return false; + } + + @Override + public void setJointType(int jointType) throws RemoteException { + + } + + @Override + public int getJointType() throws RemoteException { + return 0; + } + + @Override + public void setPattern(List pattern) throws RemoteException { + + } + + @Override + public List getPattern() throws RemoteException { + return null; + } + + @Override + public void setTag(IObjectWrapper tag) throws RemoteException { + + } + + @Override + public IObjectWrapper getTag() throws RemoteException { + return null; + } + @Override public Drawable getDrawable(Map map) { if (!isVisible() || removed) return null;