Skip to content

Commit c8078e1

Browse files
authored
Merge pull request #514 from imasahiro/issue512
Make Icon component aspect ratio customizable
2 parents 0f538f2 + cb18759 commit c8078e1

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

line-bot-model/src/main/java/com/linecorp/bot/model/message/flex/component/Icon.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
package com.linecorp.bot.model.message.flex.component;
1818

1919
import java.net.URI;
20+
import java.text.DecimalFormat;
21+
import java.util.function.Supplier;
2022

2123
import com.fasterxml.jackson.annotation.JsonInclude;
2224
import com.fasterxml.jackson.annotation.JsonInclude.Include;
23-
import com.fasterxml.jackson.annotation.JsonProperty;
2425
import com.fasterxml.jackson.annotation.JsonTypeName;
2526
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2627
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
@@ -32,6 +33,7 @@
3233

3334
import lombok.AllArgsConstructor;
3435
import lombok.Builder;
36+
import lombok.Getter;
3537
import lombok.Value;
3638

3739
@JsonTypeName("icon")
@@ -41,20 +43,21 @@
4143
@AllArgsConstructor(onConstructor = @__(@Deprecated)) // TODO: Remove next release. Use builder() instead.
4244
@JsonDeserialize(builder = Icon.IconBuilder.class)
4345
public class Icon implements FlexComponent {
46+
@AllArgsConstructor
47+
@Getter
4448
public enum IconAspectRatio {
45-
@JsonProperty("1:1")
46-
R1TO1,
47-
@JsonProperty("2:1")
48-
R2TO1,
49-
@JsonProperty("3:1")
50-
R3TO1,
49+
R1TO1("1:1"),
50+
R2TO1("2:1"),
51+
R3TO1("3:1");
52+
53+
private final String ratio;
5154
}
5255

5356
URI url;
5457

5558
FlexFontSize size;
5659

57-
IconAspectRatio aspectRatio;
60+
String aspectRatio;
5861

5962
FlexMarginSize margin;
6063

@@ -70,6 +73,8 @@ public enum IconAspectRatio {
7073

7174
@JsonPOJOBuilder(withPrefix = "")
7275
public static class IconBuilder {
76+
private static final Supplier<DecimalFormat> RATIO_FORMAT = () -> new DecimalFormat("0.#####");
77+
7378
public IconBuilder offsetTop(FlexOffsetSize offset) {
7479
offsetTop = offset.getPropertyValue();
7580
return this;
@@ -109,5 +114,21 @@ public IconBuilder offsetEnd(String offset) {
109114
offsetEnd = offset;
110115
return this;
111116
}
117+
118+
public IconBuilder aspectRatio(IconAspectRatio aspectRatio) {
119+
this.aspectRatio = aspectRatio.getRatio();
120+
return this;
121+
}
122+
123+
public IconBuilder aspectRatio(String aspectRatio) {
124+
this.aspectRatio = aspectRatio;
125+
return this;
126+
}
127+
128+
public IconBuilder aspectRatio(double width, double height) {
129+
final DecimalFormat fmt = RATIO_FORMAT.get();
130+
aspectRatio = fmt.format(width) + ':' + fmt.format(height);
131+
return this;
132+
}
112133
}
113134
}

line-bot-model/src/main/java/com/linecorp/bot/model/message/flex/component/Image.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.net.URI;
2020
import java.text.DecimalFormat;
21+
import java.util.function.Supplier;
2122

2223
import com.fasterxml.jackson.annotation.JsonInclude;
2324
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -128,7 +129,7 @@ public enum ImageAspectMode {
128129

129130
@JsonPOJOBuilder(withPrefix = "")
130131
public static class ImageBuilder {
131-
private static final DecimalFormat RATIO_FORMAT = new DecimalFormat("0.#####");
132+
private static final Supplier<DecimalFormat> RATIO_FORMAT = () -> new DecimalFormat("0.#####");
132133

133134
/**
134135
* Specify aspect ratio by keyword.
@@ -150,7 +151,8 @@ public ImageBuilder aspectRatio(String aspectRatio) {
150151
* Specify custom aspect ratio. The width and height are rounded up to 5 decimal places.
151152
*/
152153
public ImageBuilder aspectRatio(double width, double height) {
153-
this.aspectRatio = RATIO_FORMAT.format(width) + ":" + RATIO_FORMAT.format(height);
154+
final DecimalFormat fmt = RATIO_FORMAT.get();
155+
aspectRatio = fmt.format(width) + ':' + fmt.format(height);
154156
return this;
155157
}
156158

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@
2727
import org.junit.runners.Parameterized;
2828
import org.junit.runners.Parameterized.Parameters;
2929

30+
import com.linecorp.bot.model.message.flex.component.Icon.IconBuilder;
3031
import com.linecorp.bot.model.message.flex.component.Image.ImageBuilder;
3132

3233
import lombok.AllArgsConstructor;
3334
import lombok.Value;
3435

3536
@Value
3637
@RunWith(Parameterized.class)
37-
public class ImageAspectRatioFormatTest {
38+
public class AspectRatioFormatTest {
3839

3940
@Value
4041
@AllArgsConstructor
@@ -44,7 +45,7 @@ public static class Fixture {
4445
String result;
4546
}
4647

47-
private static List<Fixture> VALUES = Arrays.asList(
48+
private static final List<Fixture> VALUES = Arrays.asList(
4849
new Fixture(1, 1, "1:1"),
4950
new Fixture(1.01, 1.01, "1.01:1.01"),
5051
new Fixture(100000, 100000, "100000:100000"),
@@ -66,4 +67,13 @@ public void test() {
6667
.build();
6768
assertThat(image.getAspectRatio()).isEqualTo(fixture.getResult());
6869
}
70+
71+
@Test
72+
public void icon() {
73+
final Icon image =
74+
new IconBuilder()
75+
.aspectRatio(fixture.getWidth(), fixture.getHeight())
76+
.build();
77+
assertThat(image.getAspectRatio()).isEqualTo(fixture.getResult());
78+
}
6979
}

0 commit comments

Comments
 (0)