@nativescript/google-maps
Version:
Google Maps SDK
407 lines • 14.3 kB
JavaScript
import { ImageSource, Utils } from '@nativescript/core';
import { intoNativeColor } from './common';
import { JointType } from '../common';
export function hueFromColor(color) {
const colors = Array.create('float', 3);
if (typeof color === 'number') {
android.graphics.Color.colorToHSV(color, colors);
}
else {
android.graphics.Color.colorToHSV(color.android, colors);
}
return colors[0];
}
export function toJointType(type) {
switch (type) {
case com.google.android.gms.maps.model.JointType.ROUND:
return JointType.Round;
case com.google.android.gms.maps.model.JointType.BEVEL:
return JointType.Bevel;
default:
return JointType.Default;
}
}
export function intoNativeJointType(type) {
switch (type) {
case JointType.Round:
return com.google.android.gms.maps.model.JointType.ROUND;
case JointType.Bevel:
return com.google.android.gms.maps.model.JointType.BEVEL;
default:
return com.google.android.gms.maps.model.JointType.DEFAULT;
}
}
export function intoNativeMarkerOptions(options) {
const opts = new com.google.android.gms.maps.model.MarkerOptions();
if (typeof options?.draggable === 'boolean') {
opts.draggable(options.draggable);
}
if (typeof options?.anchorU === 'number' || typeof options?.anchorV === 'number') {
const anchorU = options?.anchorU ?? opts.getAnchorU();
const anchorV = options?.anchorV ?? opts?.getAnchorV();
opts.anchor(anchorU, anchorV);
}
if (options?.position) {
opts.position(new com.google.android.gms.maps.model.LatLng(options.position.lat, options.position.lng));
}
if (options?.title) {
opts.title(options.title);
}
if (options?.snippet) {
opts.snippet(options.snippet);
}
if (options?.icon) {
if (options?.icon instanceof android.graphics.Bitmap) {
const desc = com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(options.icon);
opts.icon(desc);
}
else if (options?.icon instanceof ImageSource) {
const desc = com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(options.icon.android);
opts.icon(desc);
}
}
const color = intoNativeColor(options.color);
if (color !== null) {
opts.icon(com.google.android.gms.maps.model.BitmapDescriptorFactory.defaultMarker(hueFromColor(color)));
}
if (typeof options?.opacity === 'number') {
opts.alpha(options.opacity);
}
if (typeof options?.rotation === 'number') {
opts.rotation(options.rotation);
}
if (typeof options?.visible === 'boolean') {
opts.visible(options.visible);
}
if (typeof options?.flat === 'boolean') {
opts.flat(options.flat);
}
if (typeof options?.zIndex === 'number') {
opts.zIndex(options.zIndex);
}
return opts;
}
export function intoNativeCircleOptions(options) {
const opts = new com.google.android.gms.maps.model.CircleOptions();
if (typeof options?.radius === 'number') {
opts.radius(options.radius);
}
const strokeColor = intoNativeColor(options?.strokeColor);
if (strokeColor !== null) {
opts.strokeColor(strokeColor);
}
const fillColor = intoNativeColor(options?.fillColor);
if (fillColor !== null) {
opts.fillColor(fillColor);
}
if (typeof options?.tappable === 'boolean') {
opts.clickable(options.tappable);
}
if (typeof options?.strokeWidth === 'number') {
opts.strokeWidth(Utils.layout.toDevicePixels(options.strokeWidth));
}
if (options?.center) {
opts.center(new com.google.android.gms.maps.model.LatLng(options.center.lat, options.center.lng));
}
if (Array.isArray(options.strokePattern)) {
const list = new java.util.ArrayList(options.strokePattern.length);
for (const item of options.strokePattern) {
list.add(item.native);
}
opts.strokePattern(list);
}
if (typeof options?.zIndex === 'number') {
opts.zIndex(options.zIndex);
}
return opts;
}
export function intoNativePolygonOptions(options) {
const opts = new com.google.android.gms.maps.model.PolygonOptions();
if (Array.isArray(options?.points)) {
for (const point of options.points) {
opts.add(new com.google.android.gms.maps.model.LatLng(point.lat, point.lng));
}
}
if (Array.isArray(options?.holes)) {
for (const hole of options.holes) {
if (Array.isArray(hole) && hole.length) {
const nativeHole = new java.util.ArrayList(hole.length);
for (const coordinate of hole) {
nativeHole.add(new com.google.android.gms.maps.model.LatLng(coordinate.lat, coordinate.lng));
}
opts.addHole(nativeHole);
}
}
}
if (typeof options?.tappable === 'boolean') {
opts.clickable(options.tappable);
}
const strokeColor = intoNativeColor(options?.strokeColor);
if (strokeColor !== null) {
opts.strokeColor(strokeColor);
}
const fillColor = intoNativeColor(options?.fillColor);
if (fillColor !== null) {
opts.fillColor(fillColor);
}
if (typeof options?.strokeWidth === 'number') {
opts.strokeWidth(Utils.layout.toDevicePixels(options.strokeWidth));
}
if (typeof options?.geodesic === 'boolean') {
opts.geodesic(options.geodesic);
}
if (options?.strokeJointType) {
opts.strokeJointType(intoNativeJointType(options.strokeJointType));
}
if (Array.isArray(options.strokePattern)) {
const list = new java.util.ArrayList(options.strokePattern.length);
for (const item of options.strokePattern) {
list.add(item.native);
}
opts.strokePattern(list);
}
if (typeof options?.zIndex === 'number') {
opts.zIndex(options.zIndex);
}
return opts;
}
export function intoNativePolylineOptions(options) {
const opts = new com.google.android.gms.maps.model.PolylineOptions();
if (typeof options?.width === 'number') {
opts.width(Utils.layout.toDevicePixels(options.width));
}
if (Array.isArray(options?.points)) {
for (const point of options.points) {
opts.add(new com.google.android.gms.maps.model.LatLng(point.lat, point.lng));
}
}
if (typeof options?.tappable === 'boolean') {
opts.clickable(options.tappable);
}
const color = intoNativeColor(options?.color);
if (color !== null) {
opts.color(color);
}
if (typeof options?.geodesic === 'boolean') {
opts.geodesic(options.geodesic);
}
if (options?.jointType) {
opts.jointType(intoNativeJointType(options.jointType));
}
if (Array.isArray(options.pattern)) {
const list = new java.util.ArrayList(options.pattern.length);
for (const item of options.pattern) {
list.add(item.native);
}
opts.pattern(list);
}
if (typeof options?.zIndex === 'number') {
opts.zIndex(options.zIndex);
}
if (options?.startCap?.native) {
opts.startCap(options.startCap.native);
}
if (options?.endCap?.native) {
opts.endCap(options.endCap.native);
}
return opts;
}
export function intoNativeGroundOverlayOptions(options) {
const opts = new com.google.android.gms.maps.model.GroundOverlayOptions();
if (options?.position) {
const coords = options.position;
opts.position(new com.google.android.gms.maps.model.LatLng(coords.lat, coords.lng), options.width);
}
if (typeof options?.width === 'number') {
opts.position(opts.getLocation(), options.width);
}
if (typeof options?.height === 'number') {
opts.position(opts.getLocation(), opts.getWidth(), options.height);
}
if (options?.bounds) {
opts.positionFromBounds(new com.google.android.gms.maps.model.LatLngBounds(new com.google.android.gms.maps.model.LatLng(options.bounds.southwest.lat, options.bounds.southwest.lng), new com.google.android.gms.maps.model.LatLng(options.bounds.northeast.lat, options.bounds.northeast.lng)));
}
if (typeof options?.transparency === 'number') {
opts.transparency(options.transparency);
}
if (typeof options?.anchorU === 'number' || typeof options?.anchorV === 'number') {
opts.anchor(options?.anchorU ?? opts.getAnchorU(), options?.anchorV ?? opts.getAnchorV());
}
if (typeof options?.tappable === 'boolean') {
opts.clickable(options.tappable);
}
if (typeof options?.tappable === 'boolean') {
opts.clickable(options.tappable);
}
if (typeof options?.bearing === 'number') {
opts.bearing(options.bearing);
}
if (options?.image instanceof android.graphics.Bitmap) {
opts.image(com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(options?.image));
}
else if (options?.image instanceof ImageSource) {
opts.image(com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(options?.image.android));
}
if (typeof options?.zIndex === 'number') {
opts.zIndex(options.zIndex);
}
return opts;
}
export function intoNativeTileOverlayOptions(options) {
const opts = new com.google.android.gms.maps.model.TileOverlayOptions();
if (typeof options?.fadeIn === 'boolean') {
opts.fadeIn(options.fadeIn);
}
if (typeof options?.transparency === 'number') {
opts.transparency(options.transparency);
}
if (typeof options?.visible === 'number') {
opts.visible(options.visible);
}
if (options?.tileProvider) {
opts.tileProvider(options.tileProvider.native);
}
if (options?.zIndex) {
opts.zIndex(options.zIndex);
}
return opts;
}
export function deserialize(data) {
if (data === null || typeof data !== 'object') {
return data;
}
let store;
switch (data.getClass().getName()) {
case 'java.lang.String': {
return String(data);
}
case 'java.lang.Boolean': {
return String(data) === 'true';
}
case 'java.lang.Float':
case 'java.lang.Integer':
case 'java.lang.Long':
case 'java.lang.Double':
case 'java.lang.Short': {
return Number(data);
}
case 'org.json.JSONArray': {
store = [];
for (let j = 0; j < data.length(); j++) {
store[j] = deserialize(data.get(j));
}
break;
}
case 'org.json.JSONObject': {
store = {};
const i = data.keys();
while (i.hasNext()) {
const key = i.next();
store[key] = deserialize(data.get(key));
}
break;
}
case 'androidx.collection.SimpleArrayMap': {
const count = data.size();
for (let l = 0; l < count; l++) {
const key = data.keyAt(l);
store[key] = deserialize(data.get(key));
}
break;
}
case 'androidx.collection.ArrayMap':
case 'android.os.Bundle':
case 'java.util.HashMap':
case 'java.util.Map': {
store = {};
const keys = data.keySet().toArray();
for (let k = 0; k < keys.length; k++) {
const key = keys[k];
store[key] = deserialize(data.get(key));
}
break;
}
case 'java.util.Date': {
return new Date(data.getTime());
}
default:
if (typeof data === 'object' && data instanceof java.util.List) {
const array = [];
const size = data.size();
for (let i = 0, n = size; i < n; i++) {
array[i] = deserialize(data.get(i));
}
store = array;
}
else {
store = null;
}
break;
}
return store;
}
function numberHasDecimals(item) {
return !(item % 1 === 0);
}
function numberIs64Bit(item) {
return item < -Math.pow(2, 31) + 1 || item > Math.pow(2, 31) - 1;
}
export function serialize(data) {
let store;
switch (typeof data) {
case 'string':
case 'boolean': {
if (typeof data === 'string') {
return java.lang.String.valueOf(data);
}
return java.lang.Boolean.valueOf(data);
}
case 'number': {
const hasDecimals = numberHasDecimals(data);
if (numberIs64Bit(data)) {
if (hasDecimals) {
return java.lang.Double.valueOf(data);
}
else {
return java.lang.Long.valueOf(data);
}
}
else {
if (hasDecimals) {
return java.lang.Float.valueOf(data);
}
else {
return java.lang.Integer.valueOf(data);
}
}
}
case 'object': {
if (!data) {
return null;
}
if (data instanceof Date) {
return new java.util.Date(data.getTime());
}
if (Array.isArray(data)) {
store = new java.util.ArrayList(data.length);
for (const item of data) {
store.add(serialize(item));
}
return store;
}
if (data.native) {
return data.native;
}
const keys = Object.keys(data);
store = new java.util.HashMap(keys.length);
for (const key of keys) {
const value = data[key];
store.put(key, serialize(value));
}
return store;
}
default:
return null;
}
}
//# sourceMappingURL=index.android.js.map