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:
parent
afd11de57d
commit
ebfd9d0535
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user