package com.twotoasters.clusterkraf; import java.lang.ref.WeakReference; import java.util.ArrayList; import com.google.android.gms.maps.Projection; class ClusterTransitions { final ArrayList<AnimatedTransition> animated; final ArrayList<ClusterPoint> stationary; private ClusterTransitions(Builder builder) { this.animated = builder.animatedTransitions; this.stationary = builder.stationaryTransitions; } static class Builder { private final WeakReference<Projection> projectionRef; private final ArrayList<ClusterPoint> previousClusterPoints; private final ArrayList<AnimatedTransition> animatedTransitions = new ArrayList<AnimatedTransition>(); private final ArrayList<ClusterPoint> stationaryTransitions = new ArrayList<ClusterPoint>(); Builder(Projection projection, ArrayList<ClusterPoint> previousClusterPoints) { this.projectionRef = new WeakReference<Projection>(projection); this.previousClusterPoints = previousClusterPoints; } void add(ClusterPoint currentClusterPoint) { Projection projection = projectionRef != null ? projectionRef.get() : null; if (currentClusterPoint != null && projection != null) { boolean animated = false; if (previousClusterPoints != null) { for (ClusterPoint previousClusterPoint : previousClusterPoints) { for (InputPoint previousInputPoint : previousClusterPoint.getPointsInCluster()) { if (currentClusterPoint.containsInputPoint(previousInputPoint)) { AnimatedTransition transition = getTransition(previousInputPoint); if (transition != null) { transition.addOriginClusterRelevantInputPoint(previousInputPoint); } else { transition = new AnimatedTransition(projection, previousClusterPoint, previousInputPoint, currentClusterPoint); animatedTransitions.add(transition); animated = true; } } } } } if (animated == false) { stationaryTransitions.add(currentClusterPoint); } } } private AnimatedTransition getTransition(InputPoint relevantInputPoint) { for (AnimatedTransition at : animatedTransitions) { if (at.destinationContains(relevantInputPoint) && at.originContains(relevantInputPoint)) { return at; } } return null; } ClusterTransitions build() { return new ClusterTransitions(this); } } }