/*
* Copyright 2012 GitHub Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.mobile.ui.user;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.github.kevinsawicki.wishlist.SingleTypeAdapter;
import com.github.mobile.R.drawable;
import com.github.mobile.R.id;
import com.github.mobile.R.layout;
import com.github.mobile.R.string;
import com.github.mobile.util.AvatarLoader;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.egit.github.core.User;
/**
* Dropdown list adapter to display orgs. and other context-related activity
* links
*/
public class HomeDropdownListAdapter extends SingleTypeAdapter<Object> {
/**
* Action for Gists
*/
public static final int ACTION_GISTS = 0;
/**
* Action for the issues dashboard
*/
public static final int ACTION_DASHBOARD = 1;
/**
* Action for bookmarks
*/
public static final int ACTION_BOOKMARKS = 2;
private static final int NON_ORG_ITEMS = 3;
private final AvatarLoader avatars;
private int selected;
private final LayoutInflater inflater;
/**
* l Create adapter with initial orgs
*
* @param context
* @param orgs
* @param avatars
*/
public HomeDropdownListAdapter(final Context context,
final List<User> orgs, final AvatarLoader avatars) {
super(context, layout.org_item);
this.avatars = avatars;
inflater = LayoutInflater.from(context);
setOrgs(orgs);
}
/**
* Get number of orgs
*
* @return org count
*/
public int getOrgCount() {
return getCount() - NON_ORG_ITEMS;
}
/**
* Is the given position an org. selection position?
*
* @param position
* @return true if org., false otherwise
*/
public boolean isOrgPosition(final int position) {
return position < getOrgCount();
}
/**
* Get action at given position
*
* @param position
* @return action id
*/
public int getAction(final int position) {
return position - getOrgCount();
}
/**
* Set orgs to display
*
* @param orgs
* @return this adapter
*/
public HomeDropdownListAdapter setOrgs(final List<User> orgs) {
int orgCount = orgs != null ? orgs.size() : 0;
if (selected >= orgCount)
selected = 0;
List<Object> all = new ArrayList<Object>(orgCount + NON_ORG_ITEMS);
if (orgCount > 0)
all.addAll(orgs);
// Add dummy objects for gists, issue dashboard, and bookmarks
all.add(new Object());
all.add(new Object());
all.add(new Object());
setItems(all);
notifyDataSetChanged();
return this;
}
/**
* @param selected
* @return this adapter
*/
public HomeDropdownListAdapter setSelected(int selected) {
this.selected = selected;
return this;
}
/**
* @return selected
*/
public int getSelected() {
return selected;
}
@Override
public long getItemId(int position) {
if (isOrgPosition(position))
return ((User) getItem(position)).getId();
else
return super.getItemId(position);
}
@Override
protected int[] getChildViewIds() {
return new int[] { id.tv_org_name, id.iv_avatar };
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = initialize(inflater.inflate(layout.org_dropdown_item,
null));
update(position, convertView, getItem(position));
return convertView;
}
private void setActionIcon(ImageView image, int drawable) {
image.setImageResource(drawable);
image.setTag(id.iv_avatar, null);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (!isOrgPosition(position))
position = selected;
return super.getView(position, convertView, parent);
}
@Override
protected void update(int position, Object item) {
switch (getAction(position)) {
case ACTION_GISTS:
setText(0, string.gists);
setActionIcon(imageView(1), drawable.dropdown_gist);
break;
case ACTION_DASHBOARD:
setText(0, string.issue_dashboard);
setActionIcon(imageView(1), drawable.dropdown_dashboard);
break;
case ACTION_BOOKMARKS:
setText(0, string.bookmarks);
setActionIcon(imageView(1), drawable.dropdown_bookmark);
break;
default:
User user = (User) item;
setText(0, user.getLogin());
avatars.bind(imageView(1), user);
}
}
}