Convert AbstractContentMetadata to DefaultContentMetadata

As it turns out there isn't much gain by subclassing
AbstractContentMetadata. Moved abstract onChange method to a listener
interface.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=188353673
This commit is contained in:
eguven 2018-03-08 10:40:37 -08:00 committed by Oliver Woodman
parent afd11de57d
commit ebfd9d0535
2 changed files with 48 additions and 26 deletions

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.upstream.cache; package com.google.android.exoplayer2.upstream.cache;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.upstream.cache.Cache.CacheException; import com.google.android.exoplayer2.upstream.cache.Cache.CacheException;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
@ -25,20 +26,45 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** Abstract implementation of {@link ContentMetadata}. Values are stored as byte arrays. */ /** Default implementation of {@link ContentMetadata}. Values are stored as byte arrays. */
public abstract class AbstractContentMetadata implements ContentMetadata { public final class DefaultContentMetadata implements ContentMetadata {
/** Listener for metadata change event. */
public interface ChangeListener {
/**
* Called when any metadata value is changed or removed.
*
* @param contentMetadata The reporting instance.
* @param metadataValues All metadata name, value pairs. It shouldn't be accessed out of this
* method.
*/
void onChange(DefaultContentMetadata contentMetadata, Map<String, byte[]> metadataValues)
throws CacheException;
}
private final Map<String, byte[]> metadata; private final Map<String, byte[]> metadata;
@Nullable private ChangeListener changeListener;
protected AbstractContentMetadata() { public DefaultContentMetadata() {
this.metadata = new HashMap<>(); this.metadata = new HashMap<>();
} }
/** @param metadata Initial name value pairs. */ /**
protected AbstractContentMetadata(Map<String, byte[]> metadata) { * Constructs a {@link DefaultContentMetadata} using name, value pairs data which was passed to
* {@link ChangeListener#onChange(DefaultContentMetadata, Map)}.
*
* @param metadata Initial name, value pairs.
*/
public DefaultContentMetadata(Map<String, byte[]> metadata) {
this.metadata = new HashMap<>(metadata); this.metadata = new HashMap<>(metadata);
} }
/** Sets a {@link ChangeListener}. This method can be called once. */
public void setChangeListener(ChangeListener changeListener) {
Assertions.checkState(this.changeListener == null);
this.changeListener = Assertions.checkNotNull(changeListener);
}
@Override @Override
public final Editor edit() { public final Editor edit() {
return new EditorImpl(); return new EditorImpl();
@ -86,14 +112,6 @@ public abstract class AbstractContentMetadata implements ContentMetadata {
} }
} }
/**
* Called when any metadata value is changed or removed. {@code metadataValues} shouldn't be
* accessed out of this method.
*
* @param metadataValues All metadata name, value pairs.
*/
protected abstract void onChange(Map<String, byte[]> metadataValues) throws CacheException;
private void apply(ArrayList<String> removedValues, Map<String, byte[]> editedValues) private void apply(ArrayList<String> removedValues, Map<String, byte[]> editedValues)
throws CacheException { throws CacheException {
synchronized (metadata) { synchronized (metadata) {
@ -101,7 +119,9 @@ public abstract class AbstractContentMetadata implements ContentMetadata {
metadata.remove(removedValues.get(i)); metadata.remove(removedValues.get(i));
} }
metadata.putAll(editedValues); metadata.putAll(editedValues);
onChange(Collections.unmodifiableMap(metadata)); if (changeListener != null) {
changeListener.onChange(this, Collections.unmodifiableMap(metadata));
}
} }
} }

View File

@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.upstream.cache.Cache.CacheException; import com.google.android.exoplayer2.upstream.cache.Cache.CacheException;
import com.google.android.exoplayer2.upstream.cache.ContentMetadata.Editor; import com.google.android.exoplayer2.upstream.cache.ContentMetadata.Editor;
import com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata.ChangeListener;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -30,14 +31,16 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
/** Tests {@link AbstractContentMetadata}. */ /** Tests {@link DefaultContentMetadata}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class AbstractContentMetadataTest { public class DefaultContentMetadataTest {
private FakeAbstractContentMetadata contentMetadata; private DefaultContentMetadata contentMetadata;
private FakeChangeListener changeListener;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
changeListener = new FakeChangeListener();
contentMetadata = createAbstractContentMetadata(); contentMetadata = createAbstractContentMetadata();
} }
@ -156,32 +159,31 @@ public class AbstractContentMetadataTest {
editor.set("metadata name", "edited value"); editor.set("metadata name", "edited value");
editor.remove("metadata name2"); editor.remove("metadata name2");
editor.commit(); editor.commit();
assertThat(contentMetadata.remainingValues).containsExactly("metadata name", "metadata name3"); assertThat(changeListener.remainingValues).containsExactly("metadata name", "metadata name3");
} }
private FakeAbstractContentMetadata createAbstractContentMetadata(String... pairs) { private DefaultContentMetadata createAbstractContentMetadata(String... pairs) {
assertThat(pairs.length % 2).isEqualTo(0); assertThat(pairs.length % 2).isEqualTo(0);
HashMap<String, byte[]> map = new HashMap<>(); HashMap<String, byte[]> map = new HashMap<>();
for (int i = 0; i < pairs.length; i += 2) { for (int i = 0; i < pairs.length; i += 2) {
map.put(pairs[i], getBytes(pairs[i + 1])); map.put(pairs[i], getBytes(pairs[i + 1]));
} }
return new FakeAbstractContentMetadata(Collections.unmodifiableMap(map)); DefaultContentMetadata metadata = new DefaultContentMetadata(Collections.unmodifiableMap(map));
metadata.setChangeListener(changeListener);
return metadata;
} }
private static byte[] getBytes(String value) { private static byte[] getBytes(String value) {
return value.getBytes(Charset.forName(C.UTF8_NAME)); return value.getBytes(Charset.forName(C.UTF8_NAME));
} }
private static class FakeAbstractContentMetadata extends AbstractContentMetadata { private static class FakeChangeListener implements ChangeListener {
private ArrayList<String> remainingValues; private ArrayList<String> remainingValues;
private FakeAbstractContentMetadata(Map<String, byte[]> metadataValues) {
super(metadataValues);
}
@Override @Override
protected void onChange(Map<String, byte[]> metadataValues) throws CacheException { public void onChange(DefaultContentMetadata contentMetadata, Map<String, byte[]> metadataValues)
throws CacheException {
remainingValues = new ArrayList<>(metadataValues.keySet()); remainingValues = new ArrayList<>(metadataValues.keySet());
} }
} }