/*
* Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.content;
import android.content.Context;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import me.zhanghai.android.douya.util.CollectionUtils;
public class ResourceWriterManager<T extends ResourceWriter> {
private ResourceWriterService mService;
private List<T> mPendingWriters = new ArrayList<>();
private List<T> mRunningWriters = new ArrayList<>();
private List<T> mUnmodifiableWriters = Collections.unmodifiableList(
CollectionUtils.union(mRunningWriters, mPendingWriters));
public void onBind(ResourceWriterService service) {
mService = service;
movePendingWritersToRunning();
}
private void movePendingWritersToRunning() {
Iterator<T> iterator = mPendingWriters.iterator();
while (iterator.hasNext()) {
T writer = iterator.next();
iterator.remove();
mRunningWriters.add(writer);
writer.onStart();
}
}
public void onUnbind() {
removeRunningWriters();
mService = null;
}
private void removeRunningWriters() {
Iterator<T> iterator = mRunningWriters.iterator();
while (iterator.hasNext()) {
T writer = iterator.next();
writer.onDestroy();
iterator.remove();
}
}
protected boolean isBound() {
return mService != null;
}
public Context getContext() {
return mService;
}
protected void add(T writer, Context context) {
if (isBound()) {
mRunningWriters.add(writer);
writer.onStart();
} else {
mPendingWriters.add(writer);
context.startService(ResourceWriterService.makeIntent(context));
}
}
protected boolean remove(T writer) {
if (mRunningWriters.contains(writer)) {
writer.onDestroy();
return mRunningWriters.remove(writer);
} else {
return mPendingWriters.remove(writer);
}
}
public void stop(T writer) {
if (!remove(writer)) {
throw new IllegalStateException("stop() called with unknown writer");
}
}
protected List<T> getWriters() {
return mUnmodifiableWriters;
}
}