package com.smartisanos.sidebar.view;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.smartisanos.sidebar.R;
import com.smartisanos.sidebar.SidebarController;
import com.smartisanos.sidebar.util.AppItem;
import com.smartisanos.sidebar.util.AppManager;
import com.smartisanos.sidebar.util.DataManager;
import com.smartisanos.sidebar.util.LOG;
import com.smartisanos.sidebar.util.anim.Anim;
import com.smartisanos.sidebar.util.anim.AnimListener;
import com.smartisanos.sidebar.util.anim.AnimStatusManager;
import com.smartisanos.sidebar.util.anim.Vector3f;
public class AppListAdapter extends SidebarAdapter {
private static final LOG log = LOG.getInstance(AppListAdapter.class);
private Context mContext;
private List<AppItem> mAppItems;
private AppManager mManager;
private boolean mPendingUpdate = false;
private SidebarListView mListView;
public AppListAdapter(Context context, SidebarListView listview) {
mContext = context;
mListView = listview;
mListView.setUnDragNumber(1);
mManager = AppManager.getInstance(context);
mAppItems = mManager.getAddedAppItem();
mManager.addListener(resolveInfoUpdateListener);
AnimStatusManager.getInstance().addAnimFlagStatusChangedListener(
AnimStatusManager.SIDEBAR_ITEM_DRAGGING,
new AnimStatusManager.AnimFlagStatusChangedListener() {
@Override
public void onChanged() {
if (mPendingUpdate) {
updateData();
}
}
});
}
private DataManager.RecentUpdateListener resolveInfoUpdateListener = new DataManager.RecentUpdateListener() {
@Override
public void onUpdate() {
// do anim first !
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mListView.animWhenDatasetChange();
}
});
}
};
public void updateData() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (AnimStatusManager.getInstance()
.canUpdateSidebarList()) {
mAppItems = mManager.getAddedAppItem();
notifyDataSetChanged();
mPendingUpdate = false;
} else {
mPendingUpdate = true;
}
}
});
}
@Override
public void onDragStart(DragEvent event) {
/**
if (mDragEvent != null) {
mDragEvent.recycle();
mDragEvent = null;
}
mDragEvent = DragEvent.obtain(event);
updateAcceptableResolveInfos();
**/
}
@Override
public void onDragEnd() {
/**
if (mDragEvent == null) {
return;
}
mDragEvent.recycle();
mDragEvent = null;
updateAcceptableResolveInfos();
**/
}
@Override
public int getCount() {
return mAppItems.size() + 1;
}
@Override
public Object getItem(int position) {
if (position == 0) {
return null;
}
return mAppItems.get(position - 1);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void moveItemPostion(Object object, int index) {
index --;
AppItem item = (AppItem)object;
if (index < 0) {
index = 0;
}
if (index >= mAppItems.size()) {
index = mAppItems.size() - 1;
}
int now = mAppItems.indexOf(item);
if (now == -1 || now == index) {
return;
}
mAppItems.remove(item);
mAppItems.add(index, item);
onOrderChange();
}
private void onOrderChange() {
for(int i = 0; i < mAppItems.size(); ++ i){
mAppItems.get(i).setIndex(mAppItems.size() - 1 - i);
}
mManager.updateOrder();
}
private Anim mIconTouchedAnim;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
View view = LayoutInflater.from(mContext).inflate(R.layout.app_item, null);
View switchApp = view.findViewById(R.id.switch_app);
ImageView iconImage = (ImageView) view.findViewById(R.id.avatar_image_view);
iconImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View view, MotionEvent motionEvent) {
if (view == null || motionEvent == null) {
return false;
}
int action = motionEvent.getAction();
if (action != MotionEvent.ACTION_DOWN) {
return false;
}
if (mIconTouchedAnim != null) {
mIconTouchedAnim.cancel();
}
view.setAlpha(0.4f);
mIconTouchedAnim = new Anim(view, Anim.TRANSPARENT, 100, Anim.CUBIC_OUT, new Vector3f(0, 0, 0.4f), new Vector3f(0, 0, 1));
mIconTouchedAnim.setListener(new AnimListener() {
@Override
public void onStart() {
}
@Override
public void onComplete(int type) {
if (mIconTouchedAnim != null) {
view.setAlpha(1);
mIconTouchedAnim = null;
}
}
});
mIconTouchedAnim.setDelay(200);
mIconTouchedAnim.start();
return false;
}
});
holder = new ViewHolder();
holder.view = view;
holder.switchApp = switchApp;
holder.iconImageView = iconImage;
view.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.restore();
if (position == 0) {
holder.showSwitchApp();
} else {
holder.setInfo(mAppItems.get(position - 1));
}
return holder.view;
}
public static class ViewHolder {
public View view;
public View switchApp;
public ImageView iconImageView;
public void showSwitchApp() {
iconImageView.setVisibility(View.GONE);
switchApp.setVisibility(View.VISIBLE);
}
public void setInfo(AppItem ai) {
iconImageView.setVisibility(View.VISIBLE);
switchApp.setVisibility(View.GONE);
iconImageView.setImageDrawable(ai.getAvatar());
}
public void restore() {
view.setVisibility(View.VISIBLE);
view.setTranslationY(0);
}
}
}