package com.smartisanos.sidebar.setting;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.smartisanos.sidebar.R;
import com.smartisanos.sidebar.util.AppItem;
import com.smartisanos.sidebar.util.AppManager;
public final class AddApplicationAdapter extends BaseAdapter {
private List<ViewItem> mItems = new ArrayList<ViewItem>();
private Context mContext;
public AddApplicationAdapter(Context context) {
mContext = context;
refreshData();
}
private AppManager.RecentUpdateListener mUpdateListener = new AppManager.RecentUpdateListener() {
@Override
public void onUpdate() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
onDataChange();
}
});
}
};
private void onDataChange() {
for (ViewItem vi : mItems) {
boolean added = AppManager.getInstance(mContext).isAppItemAdded(vi.appItem);
vi.selected = added;
}
notifyDataSetChanged();
}
public void onStart() {
refreshData();
notifyDataSetChanged();
AppManager.getInstance(mContext).addListener(mUpdateListener);
}
public void onStop() {
AppManager.getInstance(mContext).removeListener(mUpdateListener);
}
public void refreshData() {
mItems.clear();
for(AppItem ai: AppManager.getInstance(mContext).getAddedAppItem()) {
mItems.add(new ViewItem(ai, true));
}
for(AppItem ai: AppManager.getInstance(mContext).getUnAddedAppItem()) {
mItems.add(new ViewItem(ai, false));
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return (mItems.size() + 2) / 3;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
ViewHolder mHolder = null;
if (view == null) {
mHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.app_picker_item, null);
mHolder.spaceViewTop = view.findViewById(R.id.space_top);
mHolder.subViews[0] = (AppPickerSubView) view.findViewById(R.id.app_picker_sub_view_1);
mHolder.subViews[1] = (AppPickerSubView) view.findViewById(R.id.app_picker_sub_view_2);
mHolder.subViews[2] = (AppPickerSubView) view.findViewById(R.id.app_picker_sub_view_3);
mHolder.view = view;
view.setTag(mHolder);
} else {
mHolder = (ViewHolder) view.getTag();
}
int index = position * 3;
for (int i = 0; i < 3; ++i) {
final AppPickerSubView apsv = mHolder.subViews[i];
final int pos = index + i;
if (pos < mItems.size()) {
final ViewItem ai = mItems.get(pos);
apsv.setVisibility(View.VISIBLE);
apsv.setImageDrawable(ai.appItem.getAvatar());
apsv.setText(ai.appItem.getDisplayName());
apsv.setSelected(ai.selected);
apsv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!apsv.isSelected()) {
if (AppManager.getInstance(mContext).addAppItem(ai.appItem)) {
mItems.get(pos).selected = true;
apsv.setSelected(true);
}
} else {
AppManager.getInstance(mContext).removeAppItem(ai.appItem);
mItems.get(pos).selected = false;
apsv.setSelected(false);
}
}
});
} else {
apsv.setVisibility(View.INVISIBLE);
}
}
mHolder.updateSpace(position, getCount());
int bgRes = getBackgrondResId(position, getCount());
if (bgRes > 0) {
mHolder.view.setBackgroundResource(bgRes);
}
return view;
}
private int getBackgrondResId(int position, int count) {
if (count <= 0 || position < 0 || position >= count) {
return 0;
}
int bgRes = 0;
if (count == 1) {
bgRes = R.drawable.common_icon_picker_bg_single;
} else {
if (position == 0) {
bgRes = R.drawable.common_icon_picker_bg_top;
} else if (position == count - 1) {
bgRes = R.drawable.common_icon_picker_bg_bottom;
} else {
bgRes = R.drawable.common_icon_picker_bg_middle;
}
}
return bgRes;
}
class ViewHolder {
View view;
View spaceViewTop;
AppPickerSubView[] subViews = new AppPickerSubView[3];
public void updateSpace(int postion, int all) {
spaceViewTop.setVisibility(postion == 0 ? View.VISIBLE
: View.GONE);
}
}
class ViewItem {
public AppItem appItem;
public boolean selected;
public ViewItem(AppItem ai, boolean selected) {
this.appItem = ai;
this.selected = selected;
}
}
}