/*
* Copyright (c) 2017 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.item.content;
import android.os.Bundle;
import com.android.volley.VolleyError;
import me.zhanghai.android.douya.content.ResourceFragment;
import me.zhanghai.android.douya.network.api.ApiRequest;
import me.zhanghai.android.douya.network.api.info.frodo.CollectableItem;
import me.zhanghai.android.douya.util.FragmentUtils;
public abstract class BaseItemResource<SimpleItemType extends CollectableItem,
ItemType extends SimpleItemType> extends ResourceFragment<ItemType, ItemType> {
private final String KEY_PREFIX = getClass().getName() + '.';
private final String EXTRA_ITEM_ID = KEY_PREFIX + "item_id";
private final String EXTRA_SIMPLE_ITEM = KEY_PREFIX + "simple_item";
private final String EXTRA_ITEM = KEY_PREFIX + "item";
private static final int ITEM_ID_INVALID = -1;
private long mItemId = ITEM_ID_INVALID;
private SimpleItemType mSimpleItem;
private ItemType mExtraItem;
protected BaseItemResource setArguments(long itemId, SimpleItemType simpleItem, ItemType item) {
Bundle arguments = FragmentUtils.ensureArguments(this);
arguments.putLong(EXTRA_ITEM_ID, itemId);
arguments.putParcelable(EXTRA_SIMPLE_ITEM, simpleItem);
arguments.putParcelable(EXTRA_ITEM, item);
return this;
}
public long getItemId() {
ensureArguments();
return mItemId;
}
public SimpleItemType getSimpleItem() {
// Can be called before onCreate() is called.
ensureArguments();
return mSimpleItem;
}
public boolean hasSimpleItem() {
return getSimpleItem() != null;
}
@Override
public ItemType get() {
ItemType item = super.get();
if (item == null) {
// Can be called before onCreate() is called.
ensureArguments();
item = mExtraItem;
}
return item;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ensureArguments();
}
private void ensureArguments() {
if (mItemId != ITEM_ID_INVALID) {
return;
}
Bundle arguments = getArguments();
mExtraItem = arguments.getParcelable(EXTRA_ITEM);
if (mExtraItem != null) {
mSimpleItem = mExtraItem;
mItemId = mExtraItem.id;
} else {
mSimpleItem = arguments.getParcelable(EXTRA_SIMPLE_ITEM);
if (mSimpleItem != null) {
mItemId = mSimpleItem.id;
} else {
mItemId = arguments.getLong(EXTRA_ITEM_ID);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (has()) {
ItemType item = get();
setArguments(item.id, item, item);
}
}
@Override
protected ApiRequest<ItemType> onCreateRequest() {
return onCreateRequest(mItemId);
}
protected abstract ApiRequest<ItemType> onCreateRequest(long itemId);
@Override
protected void onLoadStarted() {
getListener().onLoadItemStarted(getRequestCode());
}
@Override
protected void onLoadFinished(boolean successful, ItemType response, VolleyError error) {
getListener().onLoadItemFinished(getRequestCode());
if (successful) {
set(response);
getListener().onItemChanged(getRequestCode(), get());
} else {
getListener().onLoadItemError(getRequestCode(), error);
}
}
private Listener<ItemType> getListener() {
//noinspection unchecked
return (Listener<ItemType>) getTarget();
}
public interface Listener<ItemType> {
void onLoadItemStarted(int requestCode);
void onLoadItemFinished(int requestCode);
void onLoadItemError(int requestCode, VolleyError error);
void onItemChanged(int requestCode, ItemType newItem);
}
}