package com.gh4a.activities.home;
import android.content.Context;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import com.gh4a.R;
import com.gh4a.fragment.PrivateEventListFragment;
import com.gh4a.loader.LoaderCallbacks;
import com.gh4a.loader.LoaderResult;
import com.gh4a.loader.OrganizationListLoader;
import com.gh4a.utils.AvatarHandler;
import org.eclipse.egit.github.core.User;
import java.util.List;
public class NewsFeedFactory extends FragmentFactory implements Spinner.OnItemSelectedListener {
private String mUserLogin;
private User mSelf;
private User mSelectedOrganization;
private List<User> mUserScopes;
private static final int[] TAB_TITLES = new int[] {
R.string.user_news_feed
};
@SuppressWarnings("FieldCanBeLocal")
private LoaderCallbacks<List<User>> mOrganizationCallback =
new LoaderCallbacks<List<User>>(mActivity) {
@Override
protected Loader<LoaderResult<List<User>>> onCreateLoader() {
return new OrganizationListLoader(mActivity, mUserLogin);
}
@Override
protected void onResultReady(List<User> result) {
mUserScopes = result != null && result.size() > 0 ? result : null;
mActivity.supportInvalidateOptionsMenu();
}
};
public NewsFeedFactory(HomeActivity activity, String userLogin) {
super(activity);
mUserLogin = userLogin;
mActivity.getSupportLoaderManager().initLoader(100, null, mOrganizationCallback);
}
@Override
public @StringRes int getTitleResId() {
return R.string.user_news_feed;
}
@Override
protected int[] getTabTitleResIds() {
return TAB_TITLES;
}
@Override
protected Fragment makeFragment(int position) {
return PrivateEventListFragment.newInstance(mUserLogin,
mSelectedOrganization != null ? mSelectedOrganization.getLogin() : null);
}
@Override
protected void setUserInfo(User user) {
mSelf = user;
mActivity.supportInvalidateOptionsMenu();
}
@Override
protected boolean onCreateOptionsMenu(Menu menu) {
if (mUserScopes == null || mSelf == null) {
return super.onCreateOptionsMenu(menu);
}
mActivity.getMenuInflater().inflate(R.menu.user_selector, menu);
Spinner spinner = (Spinner) MenuItemCompat.getActionView(menu.findItem(R.id.selector));
UserAdapter adapter = new UserAdapter(mActivity, mSelf, mUserScopes);
spinner.setAdapter(adapter);
spinner.setGravity(Gravity.RIGHT);
spinner.setOnItemSelectedListener(this);
return true;
}
@Override
protected void onRefresh() {
Loader loader = mActivity.getSupportLoaderManager().getLoader(100);
if (loader != null) {
loader.onContentChanged();
}
mSelf = null;
mUserScopes = null;
mActivity.supportInvalidateOptionsMenu();
}
@Override
protected void onDestroy() {
super.onDestroy();
mActivity.getSupportLoaderManager().destroyLoader(100);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mSelectedOrganization = position != 0 ? mUserScopes.get(position - 1) : null;
mActivity.invalidateFragments();
}
@Override
public void onNothingSelected(AdapterView<?> view) {
mSelectedOrganization = null;
mActivity.invalidateFragments();
}
private static class UserAdapter extends BaseAdapter {
private final User mSelf;
private final List<User> mUsers;
private final LayoutInflater mInflater;
public UserAdapter(Context context, User self, List<User> users) {
super();
mInflater = LayoutInflater.from(context);
mSelf = self;
mUsers = users;
}
@Override
public int getCount() {
return mUsers.size() + 1;
}
@Override
public User getItem(int position) {
return position == 0 ? mSelf : mUsers.get(position - 1);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.user_type_small, parent, false);
}
User user = getItem(position);
ImageView avatar = (ImageView) convertView;
AvatarHandler.assignAvatar(avatar, user);
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.user_type_popup, parent, false);
}
User user = getItem(position);
ImageView avatar = (ImageView) convertView.findViewById(R.id.iv_gravatar);
AvatarHandler.assignAvatar(avatar, user);
TextView nameView = (TextView) convertView.findViewById(R.id.tv_title);
nameView.setText(user.getLogin());
return convertView;
}
}
}