package org.qii.weiciyuan.ui.friendgroup; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.GroupBean; import org.qii.weiciyuan.bean.GroupListBean; import org.qii.weiciyuan.dao.group.CreateGroupDao; import org.qii.weiciyuan.dao.group.DestroyGroupDao; import org.qii.weiciyuan.dao.group.UpdateGroupNameDao; import org.qii.weiciyuan.dao.maintimeline.FriendGroupDao; import org.qii.weiciyuan.support.database.GroupDBTask; import org.qii.weiciyuan.support.error.WeiboException; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.ThemeUtility; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity; import org.qii.weiciyuan.ui.preference.SettingActivity; import android.app.ListFragment; import android.content.Intent; import android.os.Bundle; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * User: qii * Date: 13-2-14 */ public class ManageGroupActivity extends AbstractAppActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setDisplayShowHomeEnabled(false); getActionBar().setDisplayShowTitleEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setTitle(getString(R.string.friend_group)); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .replace(android.R.id.content, new ManageGroupFragment()) .commit(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; switch (item.getItemId()) { case android.R.id.home: intent = new Intent(this, SettingActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); return true; } return false; } public static class ManageGroupFragment extends ListFragment { private GroupAdapter adapter; private GroupListBean group; private List<String> name; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); setRetainInstance(true); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); name = new ArrayList<String>(); adapter = new GroupAdapter(); getListView().setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setMultiChoiceModeListener(new GroupMultiChoiceModeListener()); setListAdapter(adapter); group = GlobalContext.getInstance().getGroup(); if (group != null) { final List<GroupBean> list = group.getLists(); for (int i = 0; i < list.size(); i++) { name.add(list.get(i).getName()); } adapter.notifyDataSetChanged(); } } private void refreshListData() { if (group != null) { name.clear(); final List<GroupBean> list = group.getLists(); for (int i = 0; i < list.size(); i++) { name.add(list.get(i).getName()); } adapter.notifyDataSetChanged(); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.actionbar_menu_managegroupfragment, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_add: AddGroupDialog dialog = new AddGroupDialog(); dialog.setTargetFragment(ManageGroupFragment.this, 0); dialog.show(getFragmentManager(), ""); break; } return true; } public void addGroup(String groupName) { new CreateGroupTask(GlobalContext.getInstance().getSpecialToken(), groupName) .executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } public void modifyGroupName(String idstr, String groupName) { new ModifyGroupNameTask(GlobalContext.getInstance().getSpecialToken(), idstr, groupName) .executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } public void removeGroup(List<String> groupNames) { new RemoveGroupTask(GlobalContext.getInstance().getSpecialToken(), groupNames) .executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } class GroupAdapter extends BaseAdapter { int checkedBG; int defaultBG; public GroupAdapter() { defaultBG = getResources().getColor(R.color.transparent); checkedBG = ThemeUtility .getColor(getActivity(), R.attr.listview_checked_color); } @Override public int getCount() { return name.size(); } @Override public String getItem(int position) { return name.get(position); } @Override public long getItemId(int position) { return position; } @Override public boolean hasStableIds() { return true; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = getActivity().getLayoutInflater() .inflate(R.layout.managegroupactivity_list_item_layout, parent, false); TextView tv = (TextView) view; tv.setBackgroundColor(defaultBG); if (getListView().getCheckedItemPositions().get(position)) { tv.setBackgroundColor(checkedBG); } tv.setText(name.get(position)); return view; } } class GroupMultiChoiceModeListener implements AbsListView.MultiChoiceModeListener { MenuItem modify; @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.getMenuInflater().inflate(R.menu.contextual_menu_managegroupfragment, menu); modify = menu.findItem(R.id.menu_modify_group_name); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { SparseBooleanArray positions = null; ArrayList<String> checkedIdstrs = null; switch (item.getItemId()) { case R.id.menu_modify_group_name: positions = getListView().getCheckedItemPositions(); checkedIdstrs = new ArrayList<String>(); String oriName = null; for (int i = 0; i < positions.size(); i++) { if (positions.get(positions.keyAt(i))) { oriName = group.getLists().get(positions.keyAt(i)).getName(); checkedIdstrs .add(group.getLists().get(positions.keyAt(i)).getIdstr()); } } ModifyGroupDialog modifyGroupDialog = new ModifyGroupDialog(oriName, checkedIdstrs.get(0)); modifyGroupDialog.setTargetFragment(ManageGroupFragment.this, 0); modifyGroupDialog.show(getFragmentManager(), ""); mode.finish(); return true; case R.id.menu_remove: positions = getListView().getCheckedItemPositions(); checkedIdstrs = new ArrayList<String>(); for (int i = 0; i < positions.size(); i++) { if (positions.get(positions.keyAt(i))) { checkedIdstrs .add(group.getLists().get(positions.keyAt(i)).getIdstr()); } } RemoveGroupDialog removeGroupDialog = new RemoveGroupDialog(checkedIdstrs); removeGroupDialog.setTargetFragment(ManageGroupFragment.this, 0); removeGroupDialog.show(getFragmentManager(), ""); mode.finish(); return true; } return false; } @Override public void onDestroyActionMode(ActionMode mode) { } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { if (getListView().getCheckedItemCount() > 1) { modify.setVisible(false); } else { modify.setVisible(true); } mode.setTitle(String.format(getString(R.string.have_selected), String.valueOf(getListView().getCheckedItemCount()))); adapter.notifyDataSetChanged(); } } class CreateGroupTask extends MyAsyncTask<Void, Void, GroupBean> { String token; String name; WeiboException e; public CreateGroupTask(String token, String name) { this.token = token; this.name = name; } @Override protected GroupBean doInBackground(Void... params) { try { return new CreateGroupDao(token, name).create(); } catch (WeiboException e) { e.printStackTrace(); cancel(true); } return null; } @Override protected void onPostExecute(GroupBean groupBean) { super.onPostExecute(groupBean); if (getActivity() == null) { return; } if (Utility.isAllNotNull(groupBean)) { new RefreshGroupTask(token).executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } } class RefreshGroupTask extends MyAsyncTask<Void, GroupListBean, GroupListBean> { private WeiboException e; private String token; public RefreshGroupTask(String token) { this.token = token; } @Override protected GroupListBean doInBackground(Void... params) { try { return new FriendGroupDao(token).getGroup(); } catch (WeiboException e) { cancel(true); } return null; } @Override protected void onPostExecute(GroupListBean groupListBean) { super.onPostExecute(groupListBean); if (getActivity() == null) { return; } GroupDBTask .update(groupListBean, GlobalContext.getInstance().getCurrentAccountId()); GlobalContext.getInstance().setGroup(groupListBean); group = groupListBean; refreshListData(); } } class RemoveGroupTask extends MyAsyncTask<Void, Void, Boolean> { String token; List<String> groupNames; WeiboException e; public RemoveGroupTask(String token, List<String> groupNames) { this.token = token; this.groupNames = groupNames; } @Override protected Boolean doInBackground(Void... params) { try { boolean result = true; for (String groupName : groupNames) { if (!new DestroyGroupDao(token, groupName).destroy()) { result = false; } } return result; } catch (WeiboException e) { e.printStackTrace(); cancel(true); } return null; } @Override protected void onPostExecute(Boolean groupBean) { super.onPostExecute(groupBean); if (getActivity() == null) { return; } if (Utility.isAllNotNull(groupBean)) { new RefreshGroupTask(token).executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } } class ModifyGroupNameTask extends MyAsyncTask<Void, Void, GroupBean> { String token; String groupIdstr; String name; WeiboException e; public ModifyGroupNameTask(String token, String groupIdstr, String name) { this.token = token; this.groupIdstr = groupIdstr; this.name = name; } @Override protected GroupBean doInBackground(Void... params) { try { return new UpdateGroupNameDao(token, groupIdstr, name).update(); } catch (WeiboException e) { e.printStackTrace(); cancel(true); } return null; } @Override protected void onPostExecute(GroupBean groupBean) { super.onPostExecute(groupBean); if (getActivity() == null) { return; } if (Utility.isAllNotNull(groupBean)) { new RefreshGroupTask(token).executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } } } }