package edu.mit.mitmobile2;
import java.util.ArrayList;
import java.util.HashMap;
import edu.mit.mitmobile2.SliderView.ScreenPosition;
import android.view.View;
/*
* This class caches all the views for each screen (this is not ideal for memory performance)
* This caching can be turned off, but may break semantics (so be careful when turning off caching)
*/
public class SliderListAdapter implements SliderView.Adapter {
public static interface OnPositionChangedListener {
void onPositionChanged(int newPosition, int oldPosition);
}
private OnPositionChangedListener mPositionChangedListener;
int mPosition = -1;
boolean mCacheScreens = true;
ArrayList<SliderInterface> mSliderInterfaces = new ArrayList<SliderInterface>();
HashMap<Integer, View> mScreens = new HashMap<Integer, View>();
public void addScreen(SliderInterface sliderInterface) {
mSliderInterfaces.add(sliderInterface);
if (mPosition == -1) {
mPosition = 0;
if (mPositionChangedListener != null) {
mPositionChangedListener.onPositionChanged(mPosition, -1);
}
}
}
public void setPosition(int position) {
if (mPosition != position) {
int oldPosition = mPosition;
mPosition = position;
mPositionChangedListener.onPositionChanged(position, oldPosition);
}
}
public void setCacheScreens(boolean cacheScreens) {
mCacheScreens = cacheScreens;
}
public void setOnPositionChangedListener(OnPositionChangedListener positionChangedListener) {
mPositionChangedListener = positionChangedListener;
}
private Integer getScreenIndex(ScreenPosition position) {
int index = -1;
switch (position) {
case Previous:
index = mPosition-1;
break;
case Current:
index = mPosition;
break;
case Next:
index = mPosition+1;
break;
}
if ((index >= 0) && (index < mSliderInterfaces.size())) {
return index;
} else {
return null;
}
}
@Override
public boolean hasScreen(ScreenPosition screenPosition) {
return (getScreenIndex(screenPosition) != null);
}
public View getScreen(int position) {
View view = mScreens.get(position);
if (view == null) {
view = mSliderInterfaces.get(position).getView();
mScreens.put(position, view);
}
return view;
}
@Override
public View getScreen(ScreenPosition screenPosition) {
Integer index = getScreenIndex(screenPosition);
if (index == null) {
return null;
}
View view;
if (mCacheScreens) {
view = mScreens.get(index);
if (view == null) {
view = mSliderInterfaces.get(index).getView();
mScreens.put(index, view);
mSliderInterfaces.get(index).updateView();
}
} else {
view = mSliderInterfaces.get(index).getView();
mSliderInterfaces.get(index).updateView();
}
return view;
}
@Override
public void destroyScreen(ScreenPosition screenPosition) {
if (!mCacheScreens) {
Integer index = getScreenIndex(screenPosition);
if (index == null) {
return;
}
mSliderInterfaces.get(index).onDestroy();
}
}
@Override
public void destroy() {
if (mCacheScreens) {
for(int key : mScreens.keySet()) {
mSliderInterfaces.get(key).onDestroy();
}
}
}
@Override
public void seek(ScreenPosition screenPosition) {
if (mSliderInterfaces.size() == 0) {
// nothing to seek
return;
}
int oldPosition = mPosition;
if (screenPosition == ScreenPosition.Previous && mPosition > 0) {
mPosition--;
} else if (screenPosition == ScreenPosition.Next && (mPosition+1) < mSliderInterfaces.size()) {
mPosition++;
}
if (oldPosition != mPosition || screenPosition == ScreenPosition.Current) {
mSliderInterfaces.get(mPosition).onSelected();
}
if (oldPosition != mPosition) {
if (mPositionChangedListener != null) {
mPositionChangedListener.onPositionChanged(mPosition, oldPosition);
}
}
}
public void seekTo(int position) {
mPosition = position;
}
public int getPosition() {
return mPosition;
}
public int getScreenCount() {
return mSliderInterfaces.size();
}
}