summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/functions/SourceFunction.java
blob: 33f436ae7197aa9087d2536182354dda73d991f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.mapbox.mapboxsdk.style.functions;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.mapbox.mapboxsdk.style.functions.stops.Stops;
import com.mapbox.mapboxsdk.style.layers.PropertyValue;

import java.util.Map;

/**
 * Source functions take Feature property names as input.
 * <p>
 * Source functions allow the appearance of a map feature to change with
 * its properties. Source functions can be used to visually differentiate
 * types of features within the same layer or create data visualizations.
 * Each stop is an array with two elements, the first is a property input
 * value and the second is a function output value. Note that support for
 * property functions is not available across all properties and platforms
 * at this time.
 *
 * @param <I> the input type
 * @param <O> the output type
 * @see Function#property
 */
public class SourceFunction<I, O> extends Function<I, O> {

  private final String property;
  private PropertyValue<O> defaultValue;

  SourceFunction(@NonNull String property, @NonNull Stops<I, O> stops) {
    this(null, property, stops);
  }

  /**
   * JNI Constructor
   */
  private SourceFunction(@Nullable O defaultValue, @NonNull String property, @NonNull Stops<I, O> stops) {
    super(stops);
    this.property = property;
    this.defaultValue = defaultValue != null ? new PropertyValue<>(property, defaultValue) : null;
  }


  /**
   * INTERNAL USAGE ONLY
   *
   * @return The feature property name
   */
  public String getProperty() {
    return property;
  }

  /**
   * Set the default value
   *
   * @param defaultValue the default value to use when no other applies
   * @return this (for chaining)
   */
  public SourceFunction<I, O> withDefaultValue(PropertyValue<O> defaultValue) {
    this.defaultValue = defaultValue;
    return this;
  }

  /**
   * @return the defaultValue
   */
  @Nullable
  public PropertyValue<O> getDefaultValue() {
    return defaultValue;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public Map<String, Object> toValueObject() {
    Map<String, Object> valueObject = super.toValueObject();
    valueObject.put(PROPERTY_KEY, property);
    if (defaultValue != null) {
      valueObject.put(DEFAULT_VALUE_KEY, defaultValue.value);
    }
    return valueObject;
  }
}