Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
MapSnapshot attribution (#10362)
Browse files Browse the repository at this point in the history
* [android] - add attribution

* [android] - optimise attribution sources

* [android] - rework datamodel to attribution class

* [android] - refactor Attribution, add tests

* [android] - add getter for attribution string

* [android] - rework attribution to include small logo, add layout placement

* [android] - finalise integration and layout logic
  • Loading branch information
tobrun authored and Guardiola31337 committed Nov 14, 2017
1 parent a9bd09c commit f0f113b
Show file tree
Hide file tree
Showing 20 changed files with 1,128 additions and 77 deletions.
5 changes: 4 additions & 1 deletion platform/android/MapboxGLAndroidSDK/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dependencies {
}
testCompile rootProject.ext.dep.junit
testCompile rootProject.ext.dep.mockito
testCompile rootProject.ext.dep.robolectric

// Mapbox Android Services (GeoJSON support)
compile(rootProject.ext.dep.mapboxJavaGeoJSON) {
Expand Down Expand Up @@ -126,7 +127,9 @@ android {
}

testOptions {
unitTests.returnDefaultValues = true
unitTests{
returnDefaultValues = true
}
}

buildTypes {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.mapbox.mapboxsdk.attribution;

public class Attribution {

private static final String OPENSTREETMAP = "OpenStreetMap";
private static final String OPENSTREETMAP_ABBR = "OSM";
static final String TELEMETRY = "Telemetry Settings";

static final String IMPROVE_MAP_URL = "https://www.mapbox.com/map-feedback/";
static final String MAPBOX_URL = "https://www.mapbox.com/about/maps/";
static final String TELEMETRY_URL = "https://www.mapbox.com/telemetry/";

private String title;
private String url;

Attribution(String title, String url) {
this.title = title;
this.url = url;
}

public String getTitle() {
return title;
}

public String getTitleAbbreviated() {
if (title.equals(OPENSTREETMAP)) {
return OPENSTREETMAP_ABBR;
}
return title;
}

public String getUrl() {
return url;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

Attribution that = (Attribution) o;

if (title != null ? !title.equals(that.title) : that.title != null) {
return false;
}
return url != null ? url.equals(that.url) : that.url == null;
}

@Override
public int hashCode() {
int result = title != null ? title.hashCode() : 0;
result = 31 * result + (url != null ? url.hashCode() : 0);
return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.mapbox.mapboxsdk.attribution;

import android.graphics.Bitmap;
import android.graphics.PointF;
import android.support.annotation.Nullable;

public class AttributionLayout {

private Bitmap logo;
private PointF anchorPoint;
private boolean shortText;

public AttributionLayout(@Nullable Bitmap logo, @Nullable PointF anchorPoint, boolean shortText) {
this.logo = logo;
this.anchorPoint = anchorPoint;
this.shortText = shortText;
}

public Bitmap getLogo() {
return logo;
}

public PointF getAnchorPoint() {
return anchorPoint;
}

public boolean isShortText() {
return shortText;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

AttributionLayout that = (AttributionLayout) o;

if (logo != null ? !logo.equals(that.logo) : that.logo != null) {
return false;
}
return anchorPoint != null ? anchorPoint.equals(that.anchorPoint) : that.anchorPoint == null;
}

@Override
public int hashCode() {
int result = logo != null ? logo.hashCode() : 0;
result = 31 * result + (anchorPoint != null ? anchorPoint.hashCode() : 0);
return result;
}

@Override
public String toString() {
return "AttributionLayout{"
+ "logo=" + logo
+ ", anchorPoint=" + anchorPoint
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
package com.mapbox.mapboxsdk.attribution;

import android.graphics.Bitmap;
import android.graphics.PointF;
import android.widget.TextView;

import java.util.Arrays;
import java.util.List;

public class AttributionMeasure {

private Bitmap logo;
private Bitmap logoSmall;
private Bitmap snapshot;
private TextView textView;
private TextView textViewShort;
private float margin;

private boolean shorterText;

AttributionMeasure(Bitmap snapshot, Bitmap logo, Bitmap logoSmall, TextView tv, TextView tvShort, float margin) {
this.snapshot = snapshot;
this.logo = logo;
this.logoSmall = logoSmall;
this.textView = tv;
this.textViewShort = tvShort;
this.margin = margin;
}

public AttributionLayout measure() {
Chain chain = new Chain(
new FullLogoLongTextCommand(),
new FullLogoShortTextCommand(),
new SmallLogoLongTextCommand(),
new SmallLogoShortTextCommand(),
new LongTextCommand(),
new ShortTextCommand(),
new NoTextCommand()
);

AttributionLayout attributionLayout = chain.start(this);
shorterText = attributionLayout.isShortText();
return attributionLayout;
}


private static class FullLogoLongTextCommand implements Command {
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getLogoContainerWidth() + measure.getTextViewContainerWidth();
boolean fitBounds = width <= measure.getMaxSize();
if (fitBounds) {
PointF anchor = calculateAnchor(measure.snapshot, measure.textView, measure.margin);
return new AttributionLayout(measure.logo, anchor, false);
}
return null;
}
}

private static class FullLogoShortTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getLogoContainerWidth() + measure.getTextViewShortContainerWidth();
boolean fitBounds = width <= measure.getMaxSizeShort();
if (fitBounds) {
PointF anchor = calculateAnchor(measure.snapshot, measure.textView, measure.margin);
return new AttributionLayout(measure.logo, anchor, true);
}
return null;
}
}

private static class SmallLogoLongTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getLogoSmallContainerWidth() + measure.getTextViewContainerWidth();
boolean fitBounds = width <= measure.getMaxSize();
if (fitBounds) {
PointF anchor = calculateAnchor(measure.snapshot, measure.textView, measure.margin);
return new AttributionLayout(measure.logoSmall, anchor, false);
}
return null;
}
}

private static class SmallLogoShortTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getLogoContainerWidth() + measure.getTextViewShortContainerWidth();
boolean fitBounds = width <= measure.getMaxSizeShort();
if (fitBounds) {
PointF anchor = calculateAnchor(measure.snapshot, measure.textViewShort, measure.margin);
return new AttributionLayout(measure.logoSmall, anchor, true);
}
return null;
}
}

private static class LongTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getTextViewContainerWidth() + measure.margin;
boolean fitBounds = width <= measure.getMaxSize();
if (fitBounds) {
return new AttributionLayout(null, calculateAnchor(measure.snapshot, measure.textView, measure.margin), false);
}
return null;
}
}

private static class ShortTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
float width = measure.getTextViewShortContainerWidth() + measure.margin;
boolean fitBounds = width <= measure.getMaxSizeShort();
if (fitBounds) {
PointF anchor = calculateAnchor(measure.snapshot, measure.textViewShort, measure.margin);
return new AttributionLayout(null, anchor, true);
}
return null;
}
}

private static class NoTextCommand implements Command {
@Override
public AttributionLayout execute(AttributionMeasure measure) {
return new AttributionLayout(null, null, false);
}
}

private static PointF calculateAnchor(Bitmap snapshot, TextView textView, float margin) {
return new PointF(
snapshot.getWidth() - textView.getMeasuredWidth() - margin,
snapshot.getHeight() - margin - textView.getMeasuredHeight()
);
}

public TextView getTextView() {
return shorterText ? textViewShort : textView;
}

private class Chain {
public List<Command> commands;

Chain(Command... commands) {
this.commands = Arrays.asList(commands);
}

public AttributionLayout start(AttributionMeasure measure) {
AttributionLayout attributionLayout = null;
for (Command command : commands) {
attributionLayout = command.execute(measure);
if (attributionLayout != null) {
break;
}
}
return attributionLayout;
}
}

public interface Command {
AttributionLayout execute(AttributionMeasure measure);
}

private float getTextViewContainerWidth() {
return textView.getMeasuredWidth() + margin;
}

private float getLogoContainerWidth() {
return logo.getWidth() + (2 * margin);
}

private float getTextViewShortContainerWidth() {
return textViewShort.getMeasuredWidth() + margin;
}

private float getLogoSmallContainerWidth() {
return logoSmall.getWidth() + (2 * margin);
}

private float getMaxSize() {
return snapshot.getWidth() * 8 / 10;
}

private float getMaxSizeShort() {
return snapshot.getWidth();
}

public static class Builder {
private Bitmap snapshot;
private Bitmap logo;
private Bitmap logoSmall;
private TextView textView;
private TextView textViewShort;
private float marginPadding;

public Builder setSnapshot(Bitmap snapshot) {
this.snapshot = snapshot;
return this;
}

public Builder setLogo(Bitmap logo) {
this.logo = logo;
return this;
}

public Builder setLogoSmall(Bitmap logoSmall) {
this.logoSmall = logoSmall;
return this;
}

public Builder setTextView(TextView textView) {
this.textView = textView;
return this;
}

public Builder setTextViewShort(TextView textViewShort) {
this.textViewShort = textViewShort;
return this;
}

public Builder setMarginPadding(float marginPadding) {
this.marginPadding = marginPadding;
return this;
}

public AttributionMeasure build() {
return new AttributionMeasure(snapshot, logo, logoSmall, textView, textViewShort, marginPadding);
}
}
}
Loading

0 comments on commit f0f113b

Please sign in to comment.