Skip to content

Commit 42d4219

Browse files
committed
WIP
1 parent 28f5534 commit 42d4219

21 files changed

Lines changed: 206 additions & 240 deletions

File tree

api/src/main/java/io/split/android/client/api/EventMetadata.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import androidx.annotation.Nullable;
55

66
import java.util.Collection;
7-
import java.util.Map;
8-
import java.util.Set;
97

108
/**
119
* Represents metadata associated with SDK events.
@@ -15,44 +13,38 @@
1513
public interface EventMetadata {
1614

1715
/**
18-
* Returns the set of keys in this metadata.
19-
*
20-
* @return set of keys
16+
* Returns the number of entries in this metadata.
2117
*/
22-
@NonNull
23-
Set<String> keys();
18+
int size();
19+
20+
/**
21+
* Returns whether this metadata has no entries.
22+
*/
23+
default boolean isEmpty() {
24+
return size() == 0;
25+
}
2426

2527
/**
2628
* Returns the collection of values in this metadata.
27-
*
28-
* @return collection of values
2929
*/
3030
@NonNull
3131
Collection<Object> values();
3232

3333
/**
34-
* Returns the value associated with the given key.
34+
* Returns the value associated with the given typed key.
3535
*
36-
* @param key the key to look up
37-
* @return the value associated with the key, or null if not found
36+
* @param key the typed key to look up
37+
* @return the typed value associated with the key, or null if not found
3838
*/
3939
@Nullable
40-
Object get(@NonNull String key);
40+
<T> T get(@NonNull MetadataKey<T> key);
4141

4242
/**
43-
* Returns whether this metadata contains the given key.
43+
* Returns whether this metadata contains the given typed key.
4444
*
45-
* @param key the key to check
45+
* @param key the typed key to check
4646
* @return true if the key exists, false otherwise
4747
*/
48-
boolean containsKey(@NonNull String key);
49-
50-
/**
51-
* Returns a copy of the underlying data as a Map.
52-
*
53-
* @return a copy of the metadata map
54-
*/
55-
@NonNull
56-
Map<String, Object> toMap();
48+
boolean containsKey(@NonNull MetadataKey<?> key);
5749
}
5850

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.split.android.client.api;
2+
3+
import androidx.annotation.NonNull;
4+
5+
/**
6+
* A typed metadata key used to retrieve values from {@link EventMetadata} without manual casting.
7+
* <p>
8+
* Instances are exposed as public constants grouped by event (e.g. {@link SdkUpdateMetadataKeys}).
9+
*/
10+
public final class MetadataKey<T> {
11+
12+
private final String mName;
13+
14+
public MetadataKey(@NonNull String name) {
15+
mName = name;
16+
}
17+
18+
@NonNull
19+
public String name() {
20+
return mName;
21+
}
22+
}
23+
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.split.android.client.api;
2+
3+
/**
4+
* Typed metadata keys for {@code sdkReadyFromCache} event metadata.
5+
*/
6+
public final class SdkReadyFromCacheMetadataKeys {
7+
private SdkReadyFromCacheMetadataKeys() {
8+
// no instances
9+
}
10+
11+
/**
12+
* True if this is a fresh install with no usable cache.
13+
*/
14+
public static final MetadataKey<Boolean> FRESH_INSTALL = new MetadataKey<>("freshInstall");
15+
16+
/**
17+
* Last successful cache timestamp in milliseconds since epoch.
18+
* <p>
19+
* May be absent when not available.
20+
*/
21+
public static final MetadataKey<Long> LAST_UPDATE_TIMESTAMP = new MetadataKey<>("lastUpdateTimestamp");
22+
}
23+
24+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.split.android.client.api;
2+
3+
import java.util.List;
4+
5+
/**
6+
* Typed metadata keys for {@code sdkUpdate} event metadata.
7+
*/
8+
public final class SdkUpdateMetadataKeys {
9+
private SdkUpdateMetadataKeys() {
10+
// no instances
11+
}
12+
13+
/**
14+
* Names of flags that changed in this update.
15+
*/
16+
public static final MetadataKey<List<String>> UPDATED_FLAGS = new MetadataKey<>("updatedFlags");
17+
}

api/src/main/java/io/split/android/client/events/SplitEventTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* client.on(SplitEvent.SDK_UPDATE, new SplitEventTask() {
3232
* @Override
3333
* public void onPostExecution(SplitClient client, EventMetadata metadata) {
34-
* List<String> updatedFlags = (List<String>) metadata.get("updatedFlags");
34+
* List<String> updatedFlags = metadata.get(SdkUpdateMetadataKeys.UPDATED_FLAGS);
3535
* // Handle update with metadata
3636
* }
3737
*

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ apply plugin: 'com.vanniktech.maven.publish'
1919
apply from: "$rootDir/gradle/jacoco-root.gradle"
2020

2121
ext {
22-
splitVersion = '5.5.0-rc1'
22+
splitVersion = '5.5.0-rc5'
2323
jacocoVersion = '0.8.8'
2424
}
2525

events-domain/src/main/java/io/split/android/client/events/metadata/EventMetadataHelpers.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.List;
88

99
import io.split.android.client.api.EventMetadata;
10+
import io.split.android.client.api.SdkReadyFromCacheMetadataKeys;
11+
import io.split.android.client.api.SdkUpdateMetadataKeys;
1012

1113
/**
1214
* Helper class for creating {@link EventMetadata} instances.
@@ -15,17 +17,13 @@
1517
*/
1618
public class EventMetadataHelpers {
1719

18-
private static final String KEY_UPDATED_FLAGS = "updatedFlags";
19-
private static final String KEY_LAST_UPDATE_TIMESTAMP = "lastUpdateTimestamp";
20-
private static final String KEY_FRESH_INSTALL = "freshInstall";
21-
2220
private EventMetadataHelpers() {
2321
// Utility class
2422
}
2523

2624
public static EventMetadata createUpdatedFlagsMetadata(List<String> updatedSplitNames) {
2725
return new EventMetadataBuilder()
28-
.put(KEY_UPDATED_FLAGS, new ArrayList<>(new HashSet<>(updatedSplitNames)))
26+
.put(SdkUpdateMetadataKeys.UPDATED_FLAGS.name(), new ArrayList<>(new HashSet<>(updatedSplitNames)))
2927
.build();
3028
}
3129

@@ -38,10 +36,10 @@ public static EventMetadata createUpdatedFlagsMetadata(List<String> updatedSplit
3836
*/
3937
public static EventMetadata createCacheReadyMetadata(@Nullable Long lastUpdateTimestamp, boolean freshInstall) {
4038
EventMetadataBuilder builder = new EventMetadataBuilder()
41-
.put(KEY_FRESH_INSTALL, freshInstall);
39+
.put(SdkReadyFromCacheMetadataKeys.FRESH_INSTALL.name(), freshInstall);
4240

4341
if (lastUpdateTimestamp != null) {
44-
builder.put(KEY_LAST_UPDATE_TIMESTAMP, lastUpdateTimestamp);
42+
builder.put(SdkReadyFromCacheMetadataKeys.LAST_UPDATE_TIMESTAMP.name(), lastUpdateTimestamp);
4543
}
4644

4745
return builder.build();

events-domain/src/main/java/io/split/android/client/events/metadata/EventMetadataImpl.java

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import java.util.HashMap;
1010
import java.util.List;
1111
import java.util.Map;
12-
import java.util.Set;
1312

1413
import io.split.android.client.api.EventMetadata;
14+
import io.split.android.client.api.MetadataKey;
1515

1616
/**
1717
* Implementation of {@link EventMetadata}.
@@ -34,10 +34,9 @@ class EventMetadataImpl implements EventMetadata {
3434
mData = Collections.unmodifiableMap(copy);
3535
}
3636

37-
@NonNull
3837
@Override
39-
public Set<String> keys() {
40-
return mData.keySet();
38+
public int size() {
39+
return mData.size();
4140
}
4241

4342
@NonNull
@@ -48,27 +47,13 @@ public Collection<Object> values() {
4847

4948
@Nullable
5049
@Override
51-
public Object get(@NonNull String key) {
52-
return mData.get(key);
53-
}
54-
55-
@Override
56-
public boolean containsKey(@NonNull String key) {
57-
return mData.containsKey(key);
50+
public <T> T get(@NonNull MetadataKey<T> key) {
51+
//noinspection unchecked
52+
return (T) mData.get(key.name());
5853
}
5954

60-
@NonNull
6155
@Override
62-
public Map<String, Object> toMap() {
63-
Map<String, Object> copy = new HashMap<>();
64-
for (Map.Entry<String, Object> entry : mData.entrySet()) {
65-
Object value = entry.getValue();
66-
if (value instanceof List) {
67-
copy.put(entry.getKey(), new ArrayList<>((List<?>) value));
68-
} else {
69-
copy.put(entry.getKey(), value);
70-
}
71-
}
72-
return copy;
56+
public boolean containsKey(@NonNull MetadataKey<?> key) {
57+
return mData.containsKey(key.name());
7358
}
7459
}

events-domain/src/test/java/io/split/android/client/events/metadata/EventMetadataBuilderTest.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.util.List;
1717

1818
import io.split.android.client.api.EventMetadata;
19+
import io.split.android.client.api.MetadataKey;
20+
import io.split.android.client.api.SdkUpdateMetadataKeys;
1921

2022
public class EventMetadataBuilderTest {
2123

@@ -76,7 +78,8 @@ public void putIgnoresValueWhenValidatorReturnsFalse() {
7678
.put("key", "value")
7779
.build();
7880

79-
assertFalse(metadata.containsKey("key"));
81+
MetadataKey<String> KEY = new MetadataKey<>("key");
82+
assertFalse(metadata.containsKey(KEY));
8083
}
8184

8285
@Test
@@ -87,14 +90,15 @@ public void putIncludesValueWhenValidatorReturnsTrue() {
8790
.put("key", "value")
8891
.build();
8992

90-
assertEquals("value", metadata.get("key"));
93+
MetadataKey<String> KEY = new MetadataKey<>("key");
94+
assertEquals("value", metadata.get(KEY));
9195
}
9296

9397
@Test
9498
public void buildCreatesEmptyMetadataWhenNothingAdded() {
9599
EventMetadata metadata = new EventMetadataBuilder().build();
96100

97-
assertTrue(metadata.keys().isEmpty());
101+
assertTrue(metadata.isEmpty());
98102
}
99103

100104
@Test
@@ -103,7 +107,8 @@ public void putStringAddsValue() {
103107
.put("key", "value")
104108
.build();
105109

106-
assertEquals("value", metadata.get("key"));
110+
MetadataKey<String> KEY = new MetadataKey<>("key");
111+
assertEquals("value", metadata.get(KEY));
107112
}
108113

109114
@Test
@@ -112,7 +117,8 @@ public void putIntegerAddsValue() {
112117
.put("count", 42)
113118
.build();
114119

115-
assertEquals(42, metadata.get("count"));
120+
MetadataKey<Integer> COUNT = new MetadataKey<>("count");
121+
assertEquals(Integer.valueOf(42), metadata.get(COUNT));
116122
}
117123

118124
@Test
@@ -121,7 +127,8 @@ public void putLongAddsValue() {
121127
.put("timestamp", 1234567890L)
122128
.build();
123129

124-
assertEquals(1234567890L, metadata.get("timestamp"));
130+
MetadataKey<Long> TIMESTAMP = new MetadataKey<>("timestamp");
131+
assertEquals(Long.valueOf(1234567890L), metadata.get(TIMESTAMP));
125132
}
126133

127134
@Test
@@ -130,7 +137,8 @@ public void putDoubleAddsValue() {
130137
.put("rate", 3.14)
131138
.build();
132139

133-
assertEquals(3.14, metadata.get("rate"));
140+
MetadataKey<Double> RATE = new MetadataKey<>("rate");
141+
assertEquals(Double.valueOf(3.14), metadata.get(RATE));
134142
}
135143

136144
@Test
@@ -139,7 +147,8 @@ public void putBooleanTrueAddsValue() {
139147
.put("enabled", true)
140148
.build();
141149

142-
assertEquals(true, metadata.get("enabled"));
150+
MetadataKey<Boolean> ENABLED = new MetadataKey<>("enabled");
151+
assertEquals(Boolean.TRUE, metadata.get(ENABLED));
143152
}
144153

145154
@Test
@@ -148,7 +157,8 @@ public void putBooleanFalseAddsValue() {
148157
.put("disabled", false)
149158
.build();
150159

151-
assertEquals(false, metadata.get("disabled"));
160+
MetadataKey<Boolean> DISABLED = new MetadataKey<>("disabled");
161+
assertEquals(Boolean.FALSE, metadata.get(DISABLED));
152162
}
153163

154164
@Test
@@ -159,7 +169,7 @@ public void putListOfStringsAddsValue() {
159169
.put("updatedFlags", flags)
160170
.build();
161171

162-
assertEquals(flags, metadata.get("updatedFlags"));
172+
assertEquals(flags, metadata.get(SdkUpdateMetadataKeys.UPDATED_FLAGS));
163173
}
164174

165175
@Test
@@ -171,11 +181,11 @@ public void chainingMultiplePutsWorks() {
171181
.put("list", Arrays.asList("a", "b"))
172182
.build();
173183

174-
assertEquals(4, metadata.keys().size());
175-
assertEquals("text", metadata.get("string"));
176-
assertEquals(100, metadata.get("number"));
177-
assertEquals(true, metadata.get("flag"));
178-
assertEquals(Arrays.asList("a", "b"), metadata.get("list"));
184+
assertEquals(4, metadata.size());
185+
assertEquals("text", metadata.get(new MetadataKey<String>("string")));
186+
assertEquals(Integer.valueOf(100), metadata.get(new MetadataKey<Integer>("number")));
187+
assertEquals(Boolean.TRUE, metadata.get(new MetadataKey<Boolean>("flag")));
188+
assertEquals(Arrays.asList("a", "b"), metadata.get(new MetadataKey<List<String>>("list")));
179189
}
180190

181191
@Test
@@ -185,7 +195,8 @@ public void overwritingKeyUsesLastValue() {
185195
.put("key", "second")
186196
.build();
187197

188-
assertEquals("second", metadata.get("key"));
198+
MetadataKey<String> KEY = new MetadataKey<>("key");
199+
assertEquals("second", metadata.get(KEY));
189200
}
190201

191202
@Test
@@ -196,6 +207,7 @@ public void buildReturnsNewInstanceEachTime() {
196207
EventMetadata metadata1 = builder.build();
197208
EventMetadata metadata2 = builder.build();
198209

199-
assertEquals(metadata1.get("key"), metadata2.get("key"));
210+
MetadataKey<String> KEY = new MetadataKey<>("key");
211+
assertEquals(metadata1.get(KEY), metadata2.get(KEY));
200212
}
201213
}

0 commit comments

Comments
 (0)