package net.oschina.gitapp.ui.fragments;
import java.util.ArrayList;
import java.util.List;
import net.oschina.gitapp.AppContext;
import net.oschina.gitapp.AppException;
import net.oschina.gitapp.R;
import net.oschina.gitapp.adapter.NotificationListAdapter;
import net.oschina.gitapp.bean.CommonList;
import net.oschina.gitapp.bean.Notification;
import net.oschina.gitapp.bean.ProjectNotification;
import net.oschina.gitapp.bean.ProjectNotificationArray;
import net.oschina.gitapp.common.UIHelper;
import net.oschina.gitapp.ui.basefragment.BaseFragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.support.v4.view.MenuItemCompat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* 通知列表页面
* 1.加载未读的通知
* 2.加载已读的通知
* (加载什么类型的通知通过mAction来区分)
* @created 2014-07-08
* @author 火蚁(http://my.oschina.net/LittleDY)
*/
public class NotificationFragment extends BaseFragment implements OnClickListener, OnChildClickListener {
private final int MENU_REFRESH_ID = 1;
public static final String NOTIFICATION_ACTION_KEY = "notification_action";
public static final int ACTION_UNREAD = 0;//未读
public static final int ACTION_READED = 1;//已读
private int mAction = ACTION_UNREAD;
private ProgressBar mProgressBar;
private View mEmpty;
private ExpandableListView mListView;
private List<List<Notification>> mData;
private List<ProjectNotification> mGroups;
private AppContext mAppContext;
private NotificationListAdapter adapter;
private ImageView mEmptyImage;
private TextView mEmptyMsg;
public static NotificationFragment newInstance() {
return new NotificationFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.notification_fragment, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAppContext = getGitApplication();
initView(view);
steupList();
initData();
}
private void initView(View view) {
mProgressBar = (ProgressBar) view.findViewById(R.id.notification_fragment_loading);
mEmpty = view.findViewById(R.id.notification_fragment_empty);
mListView = (ExpandableListView) view.findViewById(R.id.notification_fragment_list);
mEmptyImage = (ImageView) view.findViewById(R.id.notification_empty_img);
mEmptyMsg = (TextView) view.findViewById(R.id.notification_empty_msg);
}
private void initData() {
Bundle args = getArguments();
if (args != null) {
mAction = args.getInt(NOTIFICATION_ACTION_KEY, 0);
}
if (mAction == ACTION_UNREAD) {
mEmptyMsg.setText("没有未读的通知");
loadData("", "", "");
} else {
mEmptyMsg.setText("没有已读的通知");
loadData("", "1", "");
}
}
private void steupList() {
mData = new ArrayList<List<Notification>>();
mGroups = new ArrayList<ProjectNotification>();
adapter = new NotificationListAdapter(mAppContext, mData, mGroups);
mListView.setAdapter(adapter);
mListView.setOnChildClickListener(this);
TextView v = new TextView(mAppContext);
v.setText("空的数据");
mListView.setEmptyView(v);
mListView.setGroupIndicator(null);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem createOption = menu.add(0, MENU_REFRESH_ID, MENU_REFRESH_ID, "刷新");
createOption.setIcon(R.drawable.abc_ic_menu_refresh);
MenuItemCompat.setShowAsAction(createOption, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int menuId = item.getItemId();
switch (menuId) {
case MENU_REFRESH_ID:
String all = mAction == ACTION_UNREAD ? "" : "1";
loadData("", all ,"");
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private void beforeLoading() {
mEmpty.setVisibility(View.GONE);
mProgressBar.setVisibility(View.VISIBLE);
mListView.setVisibility(View.GONE);
}
private void afterLoading(boolean isEmpty) {
mProgressBar.setVisibility(View.GONE);
if (isEmpty) {
mEmpty.setVisibility(View.VISIBLE);
} else {
mListView.setVisibility(View.VISIBLE);
}
}
private void loadData(final String filter, final String all, final String project_id) {
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg = new Message();
try {
CommonList<ProjectNotificationArray> commonList = mAppContext.getNotification(filter, all, project_id);
msg.what = 1;
msg.obj = commonList;
} catch (AppException e) {
msg.what = -1;
msg.obj = e;
e.printStackTrace();
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
beforeLoading();
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(Message msg) {
mData.clear();
if (msg.what == 1) {
CommonList<ProjectNotificationArray> commonList = (CommonList<ProjectNotificationArray>) msg.obj;
boolean isEmpty = true;
if (commonList.getList().size() != 0) {
isEmpty = false;
for (ProjectNotificationArray pna : commonList.getList()) {
mGroups.add(pna.getProject());
List<Notification> ns = new ArrayList<Notification>();
ns.addAll(pna.getProject().getNotifications());
mData.add(ns);
}
}
adapter.notifyDataSetChanged();
afterLoading(isEmpty);
}
}
}.execute();
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
default:
break;
}
}
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
final Notification notification = adapter.getChild(groupPosition, childPosition);
if (notification != null) {
// 设置未读通知为已读
if (!notification.isRead()) {
new Thread(){
public void run() {
try {
mAppContext.setNotificationIsRead(notification.getId());
} catch (AppException e) {
e.printStackTrace();
}
}
}.start();
}
if (notification.getTarget_type().equalsIgnoreCase("Issue")) {
UIHelper.showIssueDetail(mAppContext, null, null, notification.getProject_id(), notification.getTarget_id());
} else {
UIHelper.showProjectDetail(mAppContext, null, notification.getProject_id());
}
}
return false;
}
}