Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
6b22c99
feat(android): add „poiclick“ event
hansemannn Mar 11, 2019
5e6f870
fix: add poi-click listener to map instance
hansemannn Jul 13, 2019
bf2373e
fix: fix null-check in MapView#zoom
hansemannn Aug 2, 2019
7cef29e
fix: add „conatinsCoordinate“ method for parity
hansemannn Aug 2, 2019
2a2ba17
refactor: remove old xcode version guards
hansemannn Aug 31, 2019
fd5a51c
refactor: use TitaniumKit imports, fix all warnings and leaks
hansemannn Aug 31, 2019
8c07870
chore: remove old build scripts, require SDK 8
hansemannn Aug 31, 2019
91a76f2
Merge branch 'master' into add-poi-click
hansemannn Aug 31, 2019
a0c6cda
Merge branch 'master' into add-poi-click
hansemannn Nov 2, 2019
67816d6
feat: add containsCoordinate method
hansemannn Nov 2, 2019
7888c77
build: replace maps utils with latest version
hansemannn Nov 2, 2019
db1582a
feat(android): add new API’s
hansemannn Nov 2, 2019
fac8c27
Merge branch 'add-poi-click' of https://github.com/hansemannn/ti.map …
hansemannn Nov 2, 2019
7bc0632
fix: use current activity for permission check
hansemannn Jan 8, 2020
4c94feb
chore(ios): expose mapType
hansemannn Feb 28, 2020
409d4ce
refactor(android): use new „OnPolylineClickListener“
hansemannn Feb 28, 2020
ade2bcc
Merge branch 'master' of github.com:appcelerator-modules/ti.map into …
hansemannn May 3, 2020
d5259bb
chore: bump version
hansemannn May 3, 2020
57d57d6
fix: remove unused aar
hansemannn May 3, 2020
8c306c3
feat: add geodesic support
hansemannn May 29, 2020
7eabf4a
Merge branch 'master' into add-poi-click
hansemannn Jun 3, 2020
8542fbf
chore: use latest dependencies
hansemannn Aug 23, 2020
2380d12
fix: fix imports
hansemannn Aug 23, 2020
a300247
feat: support encoded polylines
hansemannn Aug 23, 2020
b6adf41
Merge branch 'add-poi-click' of https://github.com/hansemannn/ti.map …
hansemannn Aug 23, 2020
3626571
Merge branch 'master' of github.com:appcelerator-modules/ti.map into …
hansemannn Aug 23, 2020
ccc621c
fix: fix polyline encoding
hansemannn Sep 3, 2020
09c3510
fix(android): pass zoom level to region changed event
hansemannn Sep 3, 2020
7992bc0
feat(android): add „drawRoundedPolylineBetweenCoordinates“ method
hansemannn Oct 26, 2020
64aa434
chore: allow “userLocation: true” with “ACCESS_COARSE_LOCATION”
hansemannn Mar 12, 2021
033e7f5
fix: fix brackets
hansemannn Mar 12, 2021
26015f5
fix: guard proxy
hansemannn May 14, 2021
150a3f7
fix(android): guard markers
hansemannn May 14, 2021
121d567
chore: migrate from MKPinAnnotationView
hansemannn Jul 18, 2021
167fafa
fix: guard markers to prevent uncaught exceptions
hansemannn Oct 20, 2021
c3d2864
fix: add null check
hansemannn Oct 22, 2021
fd20292
chore: add try-catch block
hansemannn Oct 27, 2021
e239ca9
feat(android): use new map api
m1ga Oct 28, 2021
0cdf29d
lint
m1ga Oct 28, 2021
57f2de9
optimize imports, update map utils
m1ga Oct 28, 2021
70ae877
update library
m1ga Feb 19, 2022
614927d
fix: fix merge conflicts
hansemannn Feb 23, 2022
58d657e
chore: update libraries
hansemannn Oct 26, 2022
3b2383b
fix: add “ready” event again
hansemannn Oct 26, 2022
0325e1f
fix: guard invalid blob creation
hansemannn Dec 14, 2022
728750f
fix: address crashes in recycler view (#1)
janvennemann May 31, 2023
586334d
feat(android): add “customIcon” property (#3)
hansemannn Jun 2, 2023
1862757
fix: only ignore tilt and bearing in lite mode (#2)
janvennemann Jun 2, 2023
3a6566a
fix: fix typo
hansemannn Jun 2, 2023
86de79c
chore: pass font props, fix y-alignment
hansemannn Jun 5, 2023
5e6bc38
chore(android): add idle event for parity
hansemannn Aug 7, 2023
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
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright 2013 Appcelerator, Inc.
Copyright 2013-present Appcelerator, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
11 changes: 8 additions & 3 deletions android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@

dependencies {
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.maps.android:android-maps-utils:0.6.2'
implementation 'androidx.fragment:fragment:1.1.0'
// https://developers.google.com/android/guides/releases
implementation 'com.google.android.gms:play-services-maps:18.1.0'

// https://github.com/googlemaps/android-maps-utils/releases
implementation 'com.google.maps.android:android-maps-utils:2.4.0'

// https://developer.android.com/jetpack/androidx/releases/fragment
implementation 'androidx.fragment:fragment:1.5.2'
}
22 changes: 2 additions & 20 deletions android/example/app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
var IOS = (Ti.Platform.osname === 'iphone' || Ti.Platform.osname === 'ipad');
var ANDROID = (Ti.Platform.osname === 'android');
var UI = require('ui');
var Map = require('ti.map');
const Map = require('ti.map');

//=====================================================================
// Rows
Expand All @@ -14,19 +11,4 @@ var rows = [
require('tests/drawing')
];

if (IOS) {
rows.push(require('tests/camera'));
rows.push(require('tests/properties'));
}

if (ANDROID && Map.isGooglePlayServicesAvailable() != Map.SUCCESS) {
alert ("Google Play Services is not installed/updated/available");
} else {
startUI();
}

function startUI() {
UI.init(rows, function(e) {
rows[e.index].run && rows[e.index].run(UI, Map);
});
}
win.open();
2 changes: 1 addition & 1 deletion android/manifest
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# this is your module manifest and used by Titanium
# during compilation, packaging, distribution, etc.
#
version: 5.0.2
version: 5.1.0
apiversion: 4
architectures: arm64-v8a armeabi-v7a x86 x86_64
description: External version of Map module using native Google Maps library
Expand Down
4 changes: 4 additions & 0 deletions android/platform/android/res/drawable/pin_waypoint.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<vector android:height="28dp" android:viewportHeight="84"
android:viewportWidth="60" android:width="20dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#006d44" android:pathData="M28.31,0L31.56,0Q56.66,3.26 60,28.31L60,30.56Q59.5,38.86 56.19,43.94Q43.23,63.81 29.97,83.55A0.37,0.37 -43.9,0 1,29.35 83.54Q19.82,68.78 10.52,54.42Q4.05,44.45 3.59,43.53Q0.64,37.69 0,30.94L0,28.19Q3.4,3.33 28.31,0Z"/>
</vector>
6 changes: 6 additions & 0 deletions android/platform/android/res/layout/ti_map.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
8 changes: 8 additions & 0 deletions android/platform/android/res/layout/ti_map_raw.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/lite_raw_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:liteMode="true" />
3 changes: 3 additions & 0 deletions android/platform/android/res/values/dimensions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<resources>
<dimen name="pin_width">20dp</dimen>
</resources>
61 changes: 59 additions & 2 deletions android/src/ti/map/AnnotationProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,30 @@

import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Message;
import android.util.Property;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.core.content.ContextCompat;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.maps.android.ui.IconGenerator;

import java.util.HashMap;
import java.util.Locale;

import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.annotations.Kroll;
Expand All @@ -30,6 +45,7 @@
import org.appcelerator.titanium.TiPoint;
import org.appcelerator.titanium.proxy.TiViewProxy;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.util.TiUIHelper;
import org.appcelerator.titanium.view.TiDrawableReference;

@Kroll.proxy(creatableInModule = MapModule.class,
Expand Down Expand Up @@ -268,6 +284,8 @@ public void processOptions()
handleCustomView(getProperty(MapModule.PROPERTY_CUSTOM_VIEW));
} else if (hasProperty(TiC.PROPERTY_IMAGE)) {
handleImage(getProperty(TiC.PROPERTY_IMAGE));
} else if (hasProperty(MapModule.PROPERTY_CUSTOM_ICON)) {
handleCustomIcon((HashMap) getProperty(MapModule.PROPERTY_CUSTOM_ICON));
} else if (hasProperty(TiC.PROPERTY_PINCOLOR)) {
markerOptions.icon(
BitmapDescriptorFactory.defaultMarker(TiConvert.toFloat(getProperty(TiC.PROPERTY_PINCOLOR))));
Expand Down Expand Up @@ -301,6 +319,40 @@ private void handleCustomView(Object obj)
setIconImageDimensions(-1, -1);
}

private void handleCustomIcon(HashMap params) {
KrollDict customIcon = new KrollDict(params);
Context context = TiApplication.getInstance().getApplicationContext();

String title = customIcon.getString("title");
int tintColor = TiConvert.toColor(customIcon.get("tintColor"), context);
int textColor = TiConvert.toColor(customIcon.get("textColor"), context);

Drawable iconDrawable = ContextCompat.getDrawable(context, R.drawable.pin_waypoint);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
iconDrawable.setTint(tintColor);
}
IconGenerator mIconGenerator = new IconGenerator(context);
mIconGenerator.setBackground(iconDrawable);

if (title != null) {
int pinContentSize = (int) context.getResources().getDimension(R.dimen.pin_width);
TextView label = new TextView(context);
TiUIHelper.styleText(label, customIcon.getKrollDict(TiC.PROPERTY_FONT));

label.setTextColor(textColor);
label.setGravity(Gravity.CENTER);
label.setText(title);
label.setLayoutParams(new ViewGroup.LayoutParams(pinContentSize, pinContentSize));

mIconGenerator.setContentView(label);
}

Bitmap icon = mIconGenerator.makeIcon();

markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
setIconImageDimensions(icon.getWidth(), icon.getHeight());
}

private void handleImage(Object image)
{
// Image path
Expand All @@ -312,6 +364,7 @@ private void handleImage(Object image)
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
setIconImageDimensions(bitmap.getWidth(), bitmap.getHeight());
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
return;
}
Expand All @@ -321,8 +374,12 @@ private void handleImage(Object image)
if (image instanceof TiBlob) {
Bitmap bitmap = ((TiBlob) image).getImage();
if (bitmap != null) {
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
setIconImageDimensions(bitmap.getWidth(), bitmap.getHeight());
try {
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
setIconImageDimensions(bitmap.getWidth(), bitmap.getHeight());
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
return;
}
}
Expand Down
67 changes: 65 additions & 2 deletions android/src/ti/map/MapModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,39 @@
package ti.map;

import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.TiC;
import org.appcelerator.kroll.common.Log;

import android.location.Location;
import androidx.annotation.NonNull;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;

import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapsSdkInitializedCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.PolyUtil;

@Kroll.module(name = "Map", id = "ti.map")
public class MapModule extends KrollModule
public class MapModule extends KrollModule implements OnMapsSdkInitializedCallback
{
public static final String EVENT_MAP_CLICK = "mapclick";
public static final String EVENT_POI_CLICK = "poiclick";
public static final String EVENT_PIN_CHANGE_DRAG_STATE = "pinchangedragstate";
public static final String EVENT_READY = "ready";
public static final String EVENT_ON_SNAPSHOT_READY = "onsnapshotready";
public static final String EVENT_REGION_WILL_CHANGE = "regionwillchange";
public static final String EVENT_USER_LOCATION = "userLocation";
public static final String EVENT_IDLE = "idle";

public static final String PROPERTY_DRAGGABLE = "draggable";
public static final String PROPERTY_POINTS = "points";
Expand All @@ -47,6 +64,8 @@ public class MapModule extends KrollModule
public static final String PROPERTY_PADDING = "padding";
public static final String PROPERTY_TILT = "tilt";
public static final String PROPERTY_BEARING = "bearing";

public static final String PROPERTY_CUSTOM_ICON = "customIcon";
public static final String PROPERTY_ZOOM = "zoom";
public static final String PROPERTY_ZORDER_ON_TOP = "zOrderOnTop";
public static final String PROPERTY_CENTER_OFFSET = "centerOffset";
Expand All @@ -68,7 +87,9 @@ public class MapModule extends KrollModule
public static final String PROPERTY_CENTER = "center";
public static final String PROPERTY_RADIUS = "radius";
public static final String PROPERTY_INDOOR_ENABLED = "indoorEnabled";
public static final String PROPERTY_PLACE_ID = "placeID";
public static final String PROPERTY_DESELECTED = "deselected";
public static final String PROPERTY_LITE_MODE = "liteMode";

@Kroll.constant
public static final int NORMAL_TYPE = GoogleMap.MAP_TYPE_NORMAL;
Expand Down Expand Up @@ -135,7 +156,7 @@ public class MapModule extends KrollModule
public MapModule()
{
super();
MapsInitializer.initialize(TiApplication.getInstance().getApplicationContext());
MapsInitializer.initialize(TiApplication.getInstance().getApplicationContext(), MapsInitializer.Renderer.LATEST, this);
}

@Kroll.method
Expand All @@ -144,9 +165,51 @@ public int isGooglePlayServicesAvailable()
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(TiApplication.getInstance());
}

@Kroll.method
public boolean geometryContainsLocation(KrollDict dict)
{
HashMap<String, String> point = (HashMap<String, String>) dict.get("location");
LatLng location = new LatLng(TiConvert.toDouble(point.get(TiC.PROPERTY_LATITUDE)),TiConvert.toDouble(point.get(TiC.PROPERTY_LONGITUDE)));
List<LatLng> polygon = new ArrayList<>();
Object[] dictPoints =(Object[]) dict.get("points");
for (Object _point : dictPoints) {
HashMap<String, String> _location = (HashMap<String, String>)_point;
polygon.add(new LatLng(TiConvert.toDouble(_location.get(TiC.PROPERTY_LATITUDE)), TiConvert.toDouble(_location.get(TiC.PROPERTY_LONGITUDE))));
}
return PolyUtil.containsLocation(location, polygon, true);
}

@Kroll.method
public double geometryDistanceBetweenPoints(Object jsLocation1, Object jsLocation2)
{
HashMap<String, String> location1Dict = (HashMap<String, String>) jsLocation1;
HashMap<String, String> location2Dict = (HashMap<String, String>) jsLocation2;

LatLng location1 = new LatLng(TiConvert.toDouble(location1Dict.get(TiC.PROPERTY_LATITUDE)), TiConvert.toDouble(location1Dict.get(TiC.PROPERTY_LONGITUDE)));
LatLng location2 = new LatLng(TiConvert.toDouble(location2Dict.get(TiC.PROPERTY_LATITUDE)), TiConvert.toDouble(location2Dict.get(TiC.PROPERTY_LONGITUDE)));

float[] results = new float[1];
Location.distanceBetween(location1.latitude, location1.longitude, location2.latitude, location2.longitude, results);

return results[0];
}

@Override
public String getApiName()
{
return "Ti.Map";
}

@Override
public void onMapsSdkInitialized(@NonNull MapsInitializer.Renderer renderer)
{
switch (renderer) {
case LATEST:
Log.d("MapsDemo", "The latest version of the renderer is used.");
break;
case LEGACY:
Log.d("MapsDemo", "The legacy version of the renderer is used.");
break;
}
}
}
17 changes: 13 additions & 4 deletions android/src/ti/map/PolygonProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

@Kroll.proxy(name = "Polygon", creatableInModule = MapModule.class,
propertyAccessors =
Expand Down Expand Up @@ -154,21 +155,29 @@ public void addLocation(Object loc, ArrayList<LatLng> locationArray, boolean lis
}
}

public ArrayList<LatLng> processPoints(Object points, boolean list)
public List<LatLng> processPoints(Object points, boolean list)
{

ArrayList<LatLng> locationArray = new ArrayList<LatLng>();
// multiple points

// Handle an array of points
if (points instanceof Object[]) {
Object[] pointsArray = (Object[]) points;
for (int i = 0; i < pointsArray.length; i++) {
Object obj = pointsArray[i];
addLocation(obj, locationArray, list);
}

return locationArray;
// Handle encoded polyline
} else if (points instanceof String) {
for (LatLng point : PolyUtil.decode((String) points)) {
addLocation(point, locationArray, list);
}

return locationArray;
}

// single point
// Single point
addLocation(points, locationArray, list);
return locationArray;
}
Expand Down
Loading