Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c6c69e7
Add .claude/settings.json
wf9a5m75 Oct 28, 2026
0f4633a
Add a GroundImage(bounds, imageUrl) overload
wf9a5m75 Nov 6, 2026
1bab798
Merge pull request #8 from MapConductor/feat/image-icon-url
wf9a5m75 Nov 6, 2026
c3ee157
Default Circle strokeWidth to 1.dp and GroundImage opacity to 1.0f, l…
wf9a5m75 Nov 7, 2026
189a7b3
Merge pull request #9 from MapConductor/fix/shape-defaults
wf9a5m75 Nov 7, 2026
2fa68f5
Make InfoBubble follow the marker's icon and keep its entry stable
wf9a5m75 Nov 7, 2026
1034c73
Merge pull request #10 from MapConductor/fix/infobubble-content
wf9a5m75 Nov 7, 2026
720a139
Save uiSettings and camera paddings across configuration changes
wf9a5m75 Nov 7, 2026
bad1cf0
Merge pull request #11 from MapConductor/fix/saver-state
wf9a5m75 Nov 7, 2026
b8eae5b
Add Polygons(states) to register many polygons in one effect
wf9a5m75 Nov 7, 2026
06d6992
Release the map view when MapViewBase leaves the composition
wf9a5m75 Nov 7, 2026
cb498c1
Add MapViewLifecycleOwner, a map view's own lifecycle
wf9a5m75 Nov 7, 2026
34b14dd
Detach the destroyed controller from the state; drop the old signature
wf9a5m75 Nov 8, 2026
39a52de
Detach from the state the controller was attached to; drop style muta…
wf9a5m75 Nov 8, 2026
365f753
CI: build against core's branch of the same name when there is one
wf9a5m75 Nov 8, 2026
406bfb7
Merge pull request #12 from MapConductor/fix/mapview-teardown
wf9a5m75 Nov 8, 2026
2f919ec
Merge remote-tracking branch 'origin/develop' into feat/polygons
wf9a5m75 Nov 9, 2026
003a8e0
Merge pull request #13 from MapConductor/feat/polygons
wf9a5m75 Nov 9, 2026
60d3a46
Add Polylines(states) and PolylineTiling(options)
wf9a5m75 Nov 9, 2026
64d2df5
Merge pull request #14 from MapConductor/feat/polyline-tiling
wf9a5m75 Nov 10, 2026
1e77bbc
Support bulk Circles with raster tiles
wf9a5m75 Nov 11, 2026
eafea10
Merge pull request #15 from MapConductor/feat/circles-bulk-cache
wf9a5m75 Nov 11, 2026
a31dfec
Add onAddStart/onAddProgress/onAddEnd to Markers, Circles, Polylines,…
wf9a5m75 Nov 13, 2026
4607971
Merge pull request #16 from MapConductor/feat/add-progress
wf9a5m75 Nov 13, 2026
4dfb021
Release 1.4.0
wf9a5m75 Nov 13, 2026
c16e43c
Merge pull request #17 from MapConductor/release/1.4.0
wf9a5m75 Nov 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"attribution": {
"commit": "",
"pr": ""
}
}
14 changes: 13 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,21 @@ jobs:
java-version: '17'
cache: 'gradle'

# core と同時に出した変更(同じ名前のブランチ)は、その core と組む。
# 既定ブランチの core では、まだ入っていない API を使う PR が必ず落ちる。
# core に同じ名前のブランチが無ければ、これまでどおり既定ブランチを使う。
- name: Build core locally
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git clone --depth 1 https://github.com/MapConductor/android-sdk-core.git _core
CORE=https://github.com/MapConductor/android-sdk-core.git
if [ -n "$HEAD_REF" ] && git ls-remote --exit-code --heads "$CORE" "$HEAD_REF" > /dev/null; then
echo "core: $HEAD_REF"
git clone --depth 1 --branch "$HEAD_REF" "$CORE" _core
else
echo "core: default branch"
git clone --depth 1 "$CORE" _core
fi
cd _core
./gradlew --no-daemon publishToMavenLocal
cd ..
Expand Down
17 changes: 15 additions & 2 deletions api/android-sdk-compose.api
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ public class com.mapconductor.compose.MapViewScope {
public final kotlinx.coroutines.flow.MutableStateFlow<java.util.Map<java.lang.String, com.mapconductor.compose.info.InfoBubbleEntry>> getBubbleFlow();
public final kotlinx.coroutines.flow.MutableStateFlow<java.util.Map<java.lang.String, com.mapconductor.core.marker.MarkerAnimationOverlayEntry>> getMarkerAnimationFlow();
public final com.mapconductor.core.OverlayCollector<com.mapconductor.core.polyline.PolylineState> getPolylineCollector();
public final kotlinx.coroutines.flow.MutableStateFlow<com.mapconductor.core.polyline.PolylineTilingOptions> getPolylineTilingOptions();
public final com.mapconductor.core.OverlayCollector<com.mapconductor.core.circle.CircleState> getCircleCollector();
public final kotlinx.coroutines.flow.MutableStateFlow<com.mapconductor.core.circle.CircleTilingOptions> getCircleTilingOptions();
public final com.mapconductor.core.OverlayCollector<com.mapconductor.core.polygon.PolygonState> getPolygonCollector();
public final com.mapconductor.core.OverlayCollector<com.mapconductor.core.groundimage.GroundImageState> getGroundImageCollector();
public final com.mapconductor.core.OverlayCollector<com.mapconductor.core.raster.RasterLayerState> getRasterLayerCollector();
Expand All @@ -15,6 +17,8 @@ public final class com.mapconductor.compose.OverlayProviderKt {
}
public final class com.mapconductor.compose.circle.CircleComposeKt {
public static final void Circle(com.mapconductor.compose.MapViewScope, com.mapconductor.core.circle.CircleState, androidx.compose.runtime.Composer, int);
public static final void Circles(com.mapconductor.compose.MapViewScope, java.util.List<com.mapconductor.core.circle.CircleState>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function2<? super java.lang.Integer, ? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void CircleTiling(com.mapconductor.compose.MapViewScope, com.mapconductor.core.circle.CircleTilingOptions, androidx.compose.runtime.Composer, int);
public static final void Circle-6pqZqJ8(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoPointInterface, double, java.lang.String, boolean, boolean, long, float, long, java.lang.Integer, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.circle.CircleEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int, int);
}
public final class com.mapconductor.compose.circle.LocalCircleCollectorKt {
Expand All @@ -23,6 +27,7 @@ public final class com.mapconductor.compose.circle.LocalCircleCollectorKt {
public final class com.mapconductor.compose.groundimage.GroundImageComponentKt {
public static final void GroundImage(com.mapconductor.compose.MapViewScope, com.mapconductor.core.groundimage.GroundImageState, androidx.compose.runtime.Composer, int);
public static final void GroundImage(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoRectBounds, android.graphics.drawable.Drawable, float, int, java.lang.String, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.groundimage.GroundImageEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void GroundImage(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoRectBounds, java.lang.String, float, int, java.lang.String, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.groundimage.GroundImageEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
}
public final class com.mapconductor.compose.groundimage.LocalGroundImageCollectorKt {
public static final androidx.compose.runtime.ProvidableCompositionLocal<com.mapconductor.core.OverlayCollectorInterface<com.mapconductor.core.groundimage.GroundImageState>> getLocalGroundImageCollector();
Expand Down Expand Up @@ -60,7 +65,12 @@ public final class com.mapconductor.compose.map.MapAttributionOverlayKt {
public static final void MapAttributionOverlay(java.util.List<java.lang.String>, androidx.compose.runtime.Composer, int);
}
public final class com.mapconductor.compose.map.MapViewBaseKt {
public static final <SpecificState extends com.mapconductor.core.map.MapViewStateInterface<?>, SpecificController extends com.mapconductor.core.controller.BaseMapViewController, ActualMapView extends android.view.View, ActualMap, SpecificScope extends com.mapconductor.compose.MapViewScope, SpecificHolder extends com.mapconductor.core.map.MapViewHolderInterface<ActualMapView, ActualMap>> void MapViewBase(SpecificState, androidx.compose.runtime.MutableState<com.mapconductor.core.map.MapCameraPositionInterface>, androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.Composer, ? super java.lang.Integer, ? extends ActualMapView>, SpecificScope, com.mapconductor.core.map.MapOverlayRegistry, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super java.lang.Boolean>, ? extends java.lang.Object>, kotlin.jvm.functions.Function2<? super ActualMapView, ? super kotlin.coroutines.Continuation<? super SpecificHolder>, ? extends java.lang.Object>, kotlin.jvm.functions.Function2<? super SpecificHolder, ? super kotlin.coroutines.Continuation<? super SpecificController>, ? extends java.lang.Object>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.map.MapViewStateInterface<?>, kotlin.Unit>, kotlin.jvm.functions.Function4<? super com.mapconductor.core.map.InitState, ? super androidx.compose.ui.node.Ref<SpecificHolder>, ? super androidx.compose.runtime.Composer, ? super java.lang.Integer, kotlin.Unit>, com.mapconductor.core.map.MapViewStyle, kotlin.jvm.functions.Function1<? super java.util.List<java.lang.String>, kotlin.Unit>, kotlin.jvm.functions.Function3<? super SpecificScope, ? super androidx.compose.runtime.Composer, ? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int, int);
public static final <SpecificState extends com.mapconductor.core.map.MapViewStateInterface<?>, SpecificController extends com.mapconductor.core.controller.BaseMapViewController, ActualMapView extends android.view.View, ActualMap, SpecificScope extends com.mapconductor.compose.MapViewScope, SpecificHolder extends com.mapconductor.core.map.MapViewHolderInterface<ActualMapView, ActualMap>> void MapViewBase(SpecificState, androidx.compose.runtime.MutableState<com.mapconductor.core.map.MapCameraPositionInterface>, androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.Composer, ? super java.lang.Integer, ? extends ActualMapView>, SpecificScope, com.mapconductor.core.map.MapOverlayRegistry, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super java.lang.Boolean>, ? extends java.lang.Object>, kotlin.jvm.functions.Function2<? super ActualMapView, ? super kotlin.coroutines.Continuation<? super SpecificHolder>, ? extends java.lang.Object>, kotlin.jvm.functions.Function2<? super SpecificHolder, ? super kotlin.coroutines.Continuation<? super SpecificController>, ? extends java.lang.Object>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.map.MapViewStateInterface<?>, kotlin.Unit>, kotlin.jvm.functions.Function4<? super com.mapconductor.core.map.InitState, ? super androidx.compose.ui.node.Ref<SpecificHolder>, ? super androidx.compose.runtime.Composer, ? super java.lang.Integer, kotlin.Unit>, com.mapconductor.core.map.MapViewStyle, kotlin.jvm.functions.Function1<? super java.util.List<java.lang.String>, kotlin.Unit>, kotlin.jvm.functions.Function1<? super ActualMapView, kotlin.Unit>, kotlin.jvm.functions.Function3<? super SpecificScope, ? super androidx.compose.runtime.Composer, ? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int, int);
}
public final class com.mapconductor.compose.map.MapViewLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
public com.mapconductor.compose.map.MapViewLifecycleOwner(androidx.lifecycle.Lifecycle);
public androidx.lifecycle.Lifecycle getLifecycle();
public final void destroy();
}
public final class com.mapconductor.compose.marker.LocalMarkerCollectorKt {
public static final androidx.compose.runtime.ProvidableCompositionLocal<com.mapconductor.core.OverlayCollectorInterface<com.mapconductor.core.marker.MarkerState>> getLocalMarkerCollector();
Expand All @@ -70,14 +80,15 @@ public final class com.mapconductor.compose.marker.MarkerAnimationLayerKt {
}
public final class com.mapconductor.compose.marker.MarkerComposeKt {
public static final void Marker(com.mapconductor.compose.MapViewScope, com.mapconductor.core.marker.MarkerState, androidx.compose.runtime.Composer, int);
public static final void Markers(com.mapconductor.compose.MapViewScope, java.util.List<com.mapconductor.core.marker.MarkerState>, androidx.compose.runtime.Composer, int);
public static final void Markers(com.mapconductor.compose.MapViewScope, java.util.List<com.mapconductor.core.marker.MarkerState>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function2<? super java.lang.Integer, ? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void Marker(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoPointInterface, java.lang.String, java.lang.Integer, boolean, boolean, com.mapconductor.core.marker.MarkerIconInterface, com.mapconductor.core.marker.MarkerAnimation, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, kotlin.jvm.functions.Function1<? super com.mapconductor.core.marker.MarkerState, kotlin.Unit>, androidx.compose.runtime.Composer, int, int, int);
}
public final class com.mapconductor.compose.polygon.LocalPolygonCollectorKt {
public static final androidx.compose.runtime.ProvidableCompositionLocal<com.mapconductor.core.OverlayCollectorInterface<com.mapconductor.core.polygon.PolygonState>> getLocalPolygonCollector();
}
public final class com.mapconductor.compose.polygon.PolygonComponentKt {
public static final void Polygon(com.mapconductor.compose.MapViewScope, com.mapconductor.core.polygon.PolygonState, androidx.compose.runtime.Composer, int);
public static final void Polygons(com.mapconductor.compose.MapViewScope, java.util.List<com.mapconductor.core.polygon.PolygonState>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function2<? super java.lang.Integer, ? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void Polygon-YoVAMyA(com.mapconductor.compose.MapViewScope, java.util.List<? extends com.mapconductor.core.features.GeoPointInterface>, java.util.List<? extends java.util.List<? extends com.mapconductor.core.features.GeoPointInterface>>, java.lang.String, long, float, long, boolean, int, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.polygon.PolygonEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int, int);
public static final void Polygon-IvR-a-0(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoRectBounds, java.lang.String, long, float, long, boolean, int, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.polygon.PolygonEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
}
Expand All @@ -86,6 +97,8 @@ public final class com.mapconductor.compose.polyline.LocalPolylineCollectorKt {
}
public final class com.mapconductor.compose.polyline.PolylineComponentKt {
public static final void Polyline(com.mapconductor.compose.MapViewScope, com.mapconductor.core.polyline.PolylineState, androidx.compose.runtime.Composer, int);
public static final void Polylines(com.mapconductor.compose.MapViewScope, java.util.List<com.mapconductor.core.polyline.PolylineState>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function2<? super java.lang.Integer, ? super java.lang.Integer, kotlin.Unit>, kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void PolylineTiling(com.mapconductor.compose.MapViewScope, com.mapconductor.core.polyline.PolylineTilingOptions, androidx.compose.runtime.Composer, int);
public static final void Polyline-bbrV0mI(com.mapconductor.compose.MapViewScope, java.util.List<? extends com.mapconductor.core.features.GeoPointInterface>, java.lang.String, long, float, boolean, int, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.polyline.PolylineEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
public static final void Polyline-bbrV0mI(com.mapconductor.compose.MapViewScope, com.mapconductor.core.features.GeoRectBounds, java.lang.String, long, float, boolean, int, java.io.Serializable, kotlin.jvm.functions.Function1<? super com.mapconductor.core.polyline.PolylineEvent, kotlin.Unit>, androidx.compose.runtime.Composer, int, int);
}
Expand Down
7 changes: 7 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ android {
compose = true
}

testOptions {
// JVM 単体テストで Compose ランタイムを回すと android.os.Trace を呼ぶ。
// スタブの既定値(何もしない)で通す。InfoBubbleRegistrationTest を参照。
unitTests.isReturnDefaultValues = true
}

publishing {
singleVariant("release") {
withSourcesJar()
Expand Down Expand Up @@ -88,6 +94,7 @@ dependencies {
implementation(libs.kotlinx.coroutines.android)

testImplementation(libs.junit)
testImplementation(libs.kotlinx.coroutines.test)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
}
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ minSdk=26
javaVersion=17
jvmTarget=17

libraryVersion=1.3.1
coreLibraryVersion=1.3.1
libraryVersion=1.4.0
coreLibraryVersion=1.4.0
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ androidx-compose-ui-unit = { group = "androidx.compose.ui", name = "ui-unit", ve

# Coroutines
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" }
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" }

# Test
junit = { group = "junit", name = "junit", version.ref = "junit" }
Expand Down
Loading
Loading