summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationContainer.java
blob: d27bcdf2e18a5b6e8f8c8b5047f5e2418800b84c (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
86
87
package com.mapbox.mapboxsdk.maps;


import androidx.annotation.NonNull;
import androidx.collection.LongSparseArray;

import com.mapbox.mapboxsdk.annotations.Annotation;

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

/**
 * Encapsulates {@link Annotation}'s functionality..
 */
class AnnotationContainer implements Annotations {

  private final NativeMap nativeMap;
  private final LongSparseArray<Annotation> annotations;

  AnnotationContainer(NativeMap nativeMap, LongSparseArray<Annotation> annotations) {
    this.nativeMap = nativeMap;
    this.annotations = annotations;
  }

  @Override
  public Annotation obtainBy(long id) {
    return annotations.get(id);
  }

  @NonNull
  @Override
  public List<Annotation> obtainAll() {
    List<Annotation> annotations = new ArrayList<>();
    for (int i = 0; i < this.annotations.size(); i++) {
      annotations.add(this.annotations.get(this.annotations.keyAt(i)));
    }
    return annotations;
  }

  @Override
  public void removeBy(long id) {
    if (nativeMap != null) {
      nativeMap.removeAnnotation(id);
    }
    annotations.remove(id);
  }

  @Override
  public void removeBy(@NonNull Annotation annotation) {
    long id = annotation.getId();
    removeBy(id);
  }

  @Override
  public void removeBy(@NonNull List<? extends Annotation> annotationList) {
    int count = annotationList.size();
    long[] ids = new long[count];
    for (int i = 0; i < count; i++) {
      ids[i] = annotationList.get(i).getId();
    }

    removeNativeAnnotations(ids);

    for (long id : ids) {
      annotations.remove(id);
    }
  }

  @Override
  public void removeAll() {
    int count = annotations.size();
    long[] ids = new long[count];
    for (int i = 0; i < count; i++) {
      ids[i] = annotations.keyAt(i);
    }

    removeNativeAnnotations(ids);

    annotations.clear();
  }

  private void removeNativeAnnotations(long[] ids) {
    if (nativeMap != null) {
      nativeMap.removeAnnotations(ids);
    }
  }
}