Skip to content

Commit 757828d

Browse files
Add DSL like API for the QuickEditorScopeOption (#656)
* Add DSL like API for the QuickEditorScopeOption * Generate quickeditor.api file
1 parent 46f6100 commit 757828d

File tree

5 files changed

+291
-19
lines changed

5 files changed

+291
-19
lines changed

demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,10 @@ import com.gravatar.demoapp.ui.components.GravatarEmailInput
5353
import com.gravatar.demoapp.ui.components.GravatarPasswordInput
5454
import com.gravatar.demoapp.ui.components.translatedValue
5555
import com.gravatar.quickeditor.GravatarQuickEditor
56-
import com.gravatar.quickeditor.ui.editor.AboutEditorConfiguration
5756
import com.gravatar.quickeditor.ui.editor.AboutEditorResult
5857
import com.gravatar.quickeditor.ui.editor.AboutInputField
5958
import com.gravatar.quickeditor.ui.editor.AuthenticationMethod
6059
import com.gravatar.quickeditor.ui.editor.AvatarPickerAndAboutEditorConfiguration
61-
import com.gravatar.quickeditor.ui.editor.AvatarPickerConfiguration
6260
import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout
6361
import com.gravatar.quickeditor.ui.editor.AvatarPickerResult
6462
import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorParams
@@ -281,25 +279,19 @@ fun AvatarUpdateTab(modifier: Modifier = Modifier) {
281279
email = Email(userEmail)
282280
uiMode = pickerUiMode
283281
scopeOption = when (editorScope) {
284-
QuickEditorScope.Avatar -> QuickEditorScopeOption.avatarPicker(
285-
config = AvatarPickerConfiguration(
286-
contentLayout = pickerContentLayout,
287-
),
288-
)
282+
QuickEditorScope.Avatar -> QuickEditorScopeOption.avatarPicker {
283+
contentLayout = pickerContentLayout
284+
}
289285

290-
QuickEditorScope.About -> QuickEditorScopeOption.aboutEditor(
291-
config = AboutEditorConfiguration(
292-
fields = aboutFields,
293-
),
294-
)
286+
QuickEditorScope.About -> QuickEditorScopeOption.aboutEditor {
287+
fields = aboutFields
288+
}
295289

296-
QuickEditorScope.AvatarAndAbout -> QuickEditorScopeOption.avatarAndAbout(
297-
config = AvatarPickerAndAboutEditorConfiguration(
298-
contentLayout = pickerContentLayout,
299-
initialPage = editorInitialPage,
300-
fields = aboutFields,
301-
),
302-
)
290+
QuickEditorScope.AvatarAndAbout -> QuickEditorScopeOption.avatarAndAbout {
291+
contentLayout = pickerContentLayout
292+
initialPage = editorInitialPage
293+
fields = aboutFields
294+
}
303295
}
304296
},
305297
authenticationMethod = authenticationMethod,

gravatar-quickeditor/api/gravatar-quickeditor.api

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,15 @@ public final class com/gravatar/quickeditor/ui/editor/AboutEditorConfiguration :
331331
public fun writeToParcel (Landroid/os/Parcel;I)V
332332
}
333333

334+
public final class com/gravatar/quickeditor/ui/editor/AboutEditorConfiguration$Builder {
335+
public static final field $stable I
336+
public fun <init> ()V
337+
public final fun build ()Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;
338+
public final fun getFields ()Ljava/util/Set;
339+
public final fun setFields (Ljava/util/Set;)Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration$Builder;
340+
public final synthetic fun setFields (Ljava/util/Set;)V
341+
}
342+
334343
public final class com/gravatar/quickeditor/ui/editor/AboutEditorConfiguration$Creator : android/os/Parcelable$Creator {
335344
public fun <init> ()V
336345
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;
@@ -463,6 +472,21 @@ public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditor
463472
public fun writeToParcel (Landroid/os/Parcel;I)V
464473
}
465474

475+
public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Builder {
476+
public static final field $stable I
477+
public fun <init> ()V
478+
public final fun build ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;
479+
public final fun getContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
480+
public final fun getFields ()Ljava/util/Set;
481+
public final fun getInitialPage-Fs-4V8w ()Ljava/lang/String;
482+
public final fun setContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Builder;
483+
public final synthetic fun setContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)V
484+
public final fun setFields (Ljava/util/Set;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Builder;
485+
public final synthetic fun setFields (Ljava/util/Set;)V
486+
public final fun setInitialPage-FkoExek (Ljava/lang/String;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Builder;
487+
public final synthetic fun setInitialPage-FkoExek (Ljava/lang/String;)V
488+
}
489+
466490
public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Creator : android/os/Parcelable$Creator {
467491
public fun <init> ()V
468492
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;
@@ -517,6 +541,15 @@ public final class com/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration
517541
public fun writeToParcel (Landroid/os/Parcel;I)V
518542
}
519543

544+
public final class com/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration$Builder {
545+
public static final field $stable I
546+
public fun <init> ()V
547+
public final fun build ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;
548+
public final fun getContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
549+
public final fun setContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration$Builder;
550+
public final synthetic fun setContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)V
551+
}
552+
520553
public final class com/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration$Creator : android/os/Parcelable$Creator {
521554
public fun <init> ()V
522555
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;
@@ -681,10 +714,13 @@ public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption : a
681714

682715
public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion {
683716
public final fun aboutEditor (Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
717+
public final synthetic fun aboutEditor (Lkotlin/jvm/functions/Function1;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
684718
public static synthetic fun aboutEditor$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
685719
public final fun avatarAndAbout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
720+
public final synthetic fun avatarAndAbout (Lkotlin/jvm/functions/Function1;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
686721
public static synthetic fun avatarAndAbout$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
687722
public final fun avatarPicker (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
723+
public final synthetic fun avatarPicker (Lkotlin/jvm/functions/Function1;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
688724
public static synthetic fun avatarPicker$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
689725
}
690726

gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeConfiguration.kt

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,32 @@ public class AvatarPickerConfiguration(
2020
override fun equals(other: Any?): Boolean = other is AvatarPickerConfiguration &&
2121
contentLayout == other.contentLayout
2222

23+
/**
24+
* Builder class for AvatarPickerConfiguration.
25+
*/
26+
public class Builder {
27+
/**
28+
* The layout direction of the Avatar picker in the Quick Editor.
29+
*/
30+
@set:JvmSynthetic // Hide 'void' setter from Java
31+
public var contentLayout: AvatarPickerContentLayout = default.contentLayout
32+
33+
/**
34+
* Sets the layout direction of the Avatar picker in the Quick Editor.
35+
*
36+
* @param contentLayout The layout direction
37+
* @return This Builder instance
38+
*/
39+
public fun setContentLayout(contentLayout: AvatarPickerContentLayout): Builder = apply {
40+
this.contentLayout = contentLayout
41+
}
42+
43+
/**
44+
* Builds the AvatarPickerConfiguration.
45+
*/
46+
public fun build(): AvatarPickerConfiguration = AvatarPickerConfiguration(contentLayout)
47+
}
48+
2349
internal companion object {
2450
val default = AvatarPickerConfiguration(
2551
contentLayout = AvatarPickerContentLayout.Horizontal,
@@ -43,6 +69,32 @@ public class AboutEditorConfiguration(
4369
override fun equals(other: Any?): Boolean = other is AboutEditorConfiguration &&
4470
fields == other.fields
4571

72+
/**
73+
* Builder class for AboutEditorConfiguration.
74+
*/
75+
public class Builder {
76+
/**
77+
* The input fields to be shown in the about editor.
78+
*/
79+
@set:JvmSynthetic // Hide 'void' setter from Java
80+
public var fields: Set<AboutInputField> = default.fields
81+
82+
/**
83+
* Sets the input fields to be shown in the about editor.
84+
*
85+
* @param fields The input fields
86+
* @return This Builder instance
87+
*/
88+
public fun setFields(fields: Set<AboutInputField>): Builder = apply {
89+
this.fields = fields
90+
}
91+
92+
/**
93+
* Builds the AboutEditorConfiguration.
94+
*/
95+
public fun build(): AboutEditorConfiguration = AboutEditorConfiguration(fields)
96+
}
97+
4698
internal companion object {
4799
val default = AboutEditorConfiguration(
48100
fields = AboutInputField.all,
@@ -76,6 +128,68 @@ public class AvatarPickerAndAboutEditorConfiguration(
76128
fields == other.fields &&
77129
initialPage == other.initialPage
78130

131+
/**
132+
* Builder class for AvatarPickerAndAboutEditorConfiguration.
133+
*/
134+
public class Builder {
135+
/**
136+
* The layout direction of the Avatar picker in the Quick Editor.
137+
*/
138+
@set:JvmSynthetic // Hide 'void' setter from Java
139+
public var contentLayout: AvatarPickerContentLayout = default.contentLayout
140+
141+
/**
142+
* The input fields to be shown in the about editor.
143+
*/
144+
@set:JvmSynthetic // Hide 'void' setter from Java
145+
public var fields: Set<AboutInputField> = default.fields
146+
147+
/**
148+
* The initial page to be shown in the Quick Editor.
149+
*/
150+
@set:JvmSynthetic // Hide 'void' setter from Java
151+
public var initialPage: Page = default.initialPage
152+
153+
/**
154+
* Sets the layout direction of the Avatar picker in the Quick Editor.
155+
*
156+
* @param contentLayout The layout direction
157+
* @return This Builder instance
158+
*/
159+
public fun setContentLayout(contentLayout: AvatarPickerContentLayout): Builder = apply {
160+
this.contentLayout = contentLayout
161+
}
162+
163+
/**
164+
* Sets the input fields to be shown in the about editor.
165+
*
166+
* @param fields The input fields
167+
* @return This Builder instance
168+
*/
169+
public fun setFields(fields: Set<AboutInputField>): Builder = apply {
170+
this.fields = fields
171+
}
172+
173+
/**
174+
* Sets the initial page to be shown in the Quick Editor.
175+
*
176+
* @param initialPage The initial page
177+
* @return This Builder instance
178+
*/
179+
public fun setInitialPage(initialPage: Page): Builder = apply {
180+
this.initialPage = initialPage
181+
}
182+
183+
/**
184+
* Builds the AvatarPickerAndAboutEditorConfiguration.
185+
*/
186+
public fun build(): AvatarPickerAndAboutEditorConfiguration = AvatarPickerAndAboutEditorConfiguration(
187+
contentLayout,
188+
fields,
189+
initialPage,
190+
)
191+
}
192+
79193
/**
80194
* The page of the AvatarPickerAndAboutEditor scope.
81195
* The page corresponds to the part of your Gravatar profile that will be shown.

gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,45 @@ public class QuickEditorScopeOption private constructor(
103103
scope = Scope.AvatarPickerAndAboutEditor(config),
104104
)
105105
}
106+
107+
/**
108+
* Creates a `QuickEditorScopeOption` configured for the avatar picker scope using a DSL-style builder.
109+
*
110+
* @param initializer Function literal with AvatarPickerConfiguration.Builder as the receiver
111+
* @return A configured instance of `QuickEditorScopeOption` for the avatar picker scope
112+
*/
113+
@JvmSynthetic // Hide from Java callers who should use the static method.
114+
public fun avatarPicker(
115+
initializer: AvatarPickerConfiguration.Builder.() -> Unit,
116+
): QuickEditorScopeOption {
117+
return avatarPicker(AvatarPickerConfiguration.Builder().apply(initializer).build())
118+
}
119+
120+
/**
121+
* Creates a `QuickEditorScopeOption` configured for the about editor scope using a DSL-style builder.
122+
*
123+
* @param initializer Function literal with AboutEditorConfiguration.Builder as the receiver
124+
* @return A configured instance of `QuickEditorScopeOption` for the about editor scope
125+
*/
126+
@JvmSynthetic // Hide from Java callers who should use the static method.
127+
public fun aboutEditor(
128+
initializer: AboutEditorConfiguration.Builder.() -> Unit,
129+
): QuickEditorScopeOption {
130+
return aboutEditor(AboutEditorConfiguration.Builder().apply(initializer).build())
131+
}
132+
133+
/**
134+
* Creates a `QuickEditorScopeOption` configured for the avatar and about editor scope
135+
* using a DSL-style builder.
136+
*
137+
* @param initializer Function literal with AvatarPickerAndAboutEditorConfiguration.Builder as the receiver
138+
* @return A configured instance of `QuickEditorScopeOption` for the avatar and about editor scope
139+
*/
140+
@JvmSynthetic // Hide from Java callers who should use the static method.
141+
public fun avatarAndAbout(
142+
initializer: AvatarPickerAndAboutEditorConfiguration.Builder.() -> Unit,
143+
): QuickEditorScopeOption {
144+
return avatarAndAbout(AvatarPickerAndAboutEditorConfiguration.Builder().apply(initializer).build())
145+
}
106146
}
107147
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.gravatar.quickeditor.ui.editor
2+
3+
import org.junit.Assert.assertEquals
4+
import org.junit.Test
5+
6+
class QuickEditorScopeOptionTest {
7+
@Test
8+
fun `avatarPicker DSL creates same result as static method`() {
9+
// Using static method
10+
val staticResult = QuickEditorScopeOption.avatarPicker(
11+
AvatarPickerConfiguration(AvatarPickerContentLayout.Vertical),
12+
)
13+
14+
// Using DSL
15+
val dslResult = QuickEditorScopeOption.avatarPicker {
16+
contentLayout = AvatarPickerContentLayout.Vertical
17+
}
18+
19+
assertEquals(staticResult, dslResult)
20+
}
21+
22+
@Test
23+
fun `aboutEditor DSL creates same result as static method`() {
24+
// Using static method
25+
val staticResult = QuickEditorScopeOption.aboutEditor(
26+
AboutEditorConfiguration(setOf(AboutInputField.DisplayName, AboutInputField.FirstName)),
27+
)
28+
29+
// Using DSL
30+
val dslResult = QuickEditorScopeOption.aboutEditor {
31+
fields = setOf(AboutInputField.DisplayName, AboutInputField.FirstName)
32+
}
33+
34+
assertEquals(staticResult, dslResult)
35+
}
36+
37+
@Test
38+
fun `avatarAndAbout DSL creates same result as static method`() {
39+
// Using static method
40+
val staticResult = QuickEditorScopeOption.avatarAndAbout(
41+
AvatarPickerAndAboutEditorConfiguration(
42+
contentLayout = AvatarPickerContentLayout.Vertical,
43+
fields = setOf(AboutInputField.DisplayName, AboutInputField.FirstName),
44+
initialPage = AvatarPickerAndAboutEditorConfiguration.Page.AboutEditor,
45+
),
46+
)
47+
48+
// Using DSL
49+
val dslResult = QuickEditorScopeOption.avatarAndAbout {
50+
contentLayout = AvatarPickerContentLayout.Vertical
51+
fields = setOf(AboutInputField.DisplayName, AboutInputField.FirstName)
52+
initialPage = AvatarPickerAndAboutEditorConfiguration.Page.AboutEditor
53+
}
54+
55+
assertEquals(staticResult, dslResult)
56+
}
57+
58+
@Test
59+
fun `avatarPicker DSL with default values creates same result as static method with default values`() {
60+
// Using static method with default values
61+
val staticResult = QuickEditorScopeOption.avatarPicker()
62+
63+
// Using DSL with default values
64+
val dslResult = QuickEditorScopeOption.avatarPicker {}
65+
66+
assertEquals(staticResult, dslResult)
67+
}
68+
69+
@Test
70+
fun `aboutEditor DSL with default values creates same result as static method with default values`() {
71+
// Using static method with default values
72+
val staticResult = QuickEditorScopeOption.aboutEditor()
73+
74+
// Using DSL with default values
75+
val dslResult = QuickEditorScopeOption.aboutEditor {}
76+
77+
assertEquals(staticResult, dslResult)
78+
}
79+
80+
@Test
81+
fun `avatarAndAbout DSL with default values creates same result as static method with default values`() {
82+
// Using static method with default values
83+
val staticResult = QuickEditorScopeOption.avatarAndAbout()
84+
85+
// Using DSL with default values
86+
val dslResult = QuickEditorScopeOption.avatarAndAbout {}
87+
88+
assertEquals(staticResult, dslResult)
89+
}
90+
}

0 commit comments

Comments
 (0)