package org.aisen.weibo.sina.ui.fragment.account; import java.util.ArrayList; import java.util.List; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.base.MyApplication; import org.aisen.weibo.sina.support.bean.AccountBean; import org.aisen.weibo.sina.support.cache.TimelineMemoryCacheUtility; import org.aisen.weibo.sina.support.db.AccountDB; import org.aisen.weibo.sina.support.publish.PublishNotifier; import org.aisen.weibo.sina.support.publish.UnreadCountNotifier; import org.aisen.weibo.sina.support.utils.AisenUtil; import org.aisen.weibo.sina.support.utils.AppContext; import org.aisen.weibo.sina.support.utils.ImageConfigUtils; import org.aisen.weibo.sina.sys.service.PublishService; import org.aisen.weibo.sina.sys.service.UnreadService; import org.aisen.weibo.sina.ui.activity.common.FragmentContainerActivity; import org.aisen.weibo.sina.ui.activity.main.MainActivity; import org.android.loader.BitmapLoader; import org.sina.android.bean.UnreadCount; import org.sina.android.bean.WeiBoUser; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.m.common.utils.Logger; import com.m.support.Inject.ViewInject; import com.m.support.adapter.ABaseAdapter.AbstractItemView; import com.m.support.task.TaskException; import com.m.support.task.WorkTask; import com.m.ui.fragment.AListFragment; import com.m.ui.utils.ViewUtils; /** * 账号界面,管理授权账号 * * @author wangdan * */ public class AccountFragment extends AListFragment<AccountBean, ArrayList<AccountBean>> implements OnItemClickListener, MultiChoiceModeListener { public static void launch(Activity from) { FragmentContainerActivity.launch(from, AccountFragment.class, null); } // 登录账号 public static void login(AccountBean accountBean, boolean toMain) { if (AppContext.isLogedin()) { // 1、清理定时发布 MyApplication.removeAllPublishAlarm(); // 2、清理正在发布的数据 PublishService.stopPublish(); // 3、重新开始读取未读消息 UnreadService.stopService(); // 4、清理未读消息 UnreadCountNotifier.mCount = new UnreadCount(); // 5、清理通知栏 PublishNotifier.cancelAll(); // 6、清理内存数据 TimelineMemoryCacheUtility.clear(); } // 登录该账号 AppContext.login(accountBean.getUser(), accountBean.getGroups(), accountBean.getToken()); AccountDB.setLogedinAccount(accountBean); // 进入首页 if (toMain) MainActivity.login(); } public static final String TAG = "Account"; @ViewInject(id = R.id.btnAdd, click = "addAccountListener") View btnAdd; private boolean isSelectedModeActivated = false; private SparseBooleanArray checkedArray; @Override protected int inflateContentView() { return R.layout.ui_account; } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); ActionBar actionBar = getActivity().getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(R.string.title_acount); setHasOptionsMenu(true); getListView().setOnItemClickListener(this); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setMultiChoiceModeListener(this); checkedArray = new SparseBooleanArray(); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { AccountBean account = getAdapterItems().get(position); if (AccountBean.isExpired(account)) { new AlertDialog.Builder(getActivity()).setTitle(R.string.remind) .setMessage(R.string.account_expired) .setNegativeButton(R.string.no, null) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LoginFragment.launch(AccountFragment.this, 1000); } }) .show(); return; } if (isSelectedModeActivated) { getListView().setItemChecked(position, !getListView().isItemChecked(position)); } else { login(account, true); getActivity().finish(); } } @Override protected AbstractItemView<AccountBean> newItemView() { return new AccountItemView(); } @Override protected void requestData(RefreshMode mode) { new AccountTask(RefreshMode.reset).execute(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.account, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // 新增授权 if (item.getItemId() == R.id.add) { LoginFragment.launch(this, 1000); } return super.onOptionsItemSelected(item); } void addAccountListener(View v) { LoginFragment.launch(this, 1000); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1000 && resultCode == Activity.RESULT_OK) { new AlertDialog.Builder(getActivity()).setTitle(R.string.remind) .setMessage(R.string.account_newaccount_remind) .setPositiveButton(R.string.i_know, null) .show(); requestData(RefreshMode.reset); } } class AccountItemView extends AbstractItemView<AccountBean> { @ViewInject(id = R.id.txtName) TextView txtName; @ViewInject(id = R.id.txtDesc) TextView txtDesc; @ViewInject(id = R.id.imgPhoto) ImageView imgPhoto; @ViewInject(id = R.id.viewCover) View viewCover; @ViewInject(id = R.id.container) View container; @ViewInject(id = R.id.txtTokenInfo) TextView txtTokenInfo; @Override public int inflateViewId() { return R.layout.item_account; } @Override public void bindingData(View convertView, AccountBean data) { WeiBoUser user = data.getUser(); BitmapLoader.getInstance().display(AccountFragment.this, data.getUser().getAvatar_large(), imgPhoto, ImageConfigUtils.getPhotoConfig()); txtName.setText(user.getScreen_name()); txtDesc.setText(user.getDescription() + ""); txtTokenInfo.setText(R.string.account_relogin_remind); if (AccountBean.isExpired(data)) { txtTokenInfo.setVisibility(View.VISIBLE); } else { txtTokenInfo.setVisibility(View.GONE); } if (AppContext.isLogedin()) viewCover.setVisibility(data.getUser().getIdstr().equals(AppContext.getUser().getIdstr()) ? View.GONE : View.VISIBLE); } @Override public void updateConvertView(AccountBean data, View convertView, int selectedPosition) { super.updateConvertView(data, convertView, selectedPosition); container.setSelected(checkedArray.get(getPosition())); AisenUtil.setAlpha(convertView); } } class AccountTask extends PagingTask<Void, Void, ArrayList<AccountBean>> { public AccountTask(RefreshMode mode) { super("AccountTask", mode); } @Override protected List<AccountBean> parseResult(ArrayList<AccountBean> result) { return result; } @Override protected ArrayList<AccountBean> workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... params) throws TaskException { return (ArrayList<AccountBean>) AccountDB.query(); } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.account_choice, menu); mode.setTitle(R.string.title_acount); setSubtitle(mode); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { isSelectedModeActivated = true; getAdapter().notifyDataSetChanged(); return true; } @Override public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { if (item.getItemId() == R.id.remove) { if (getListView().getCheckedItemCount() == 0) { showMessage(getString(R.string.none_opts_selected)); return true; } new AlertDialog.Builder(getActivity()) .setTitle(R.string.remind) .setIconAttribute(android.R.attr.alertDialogIcon) .setMessage(R.string.account_destory_account_remind) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { final int size = getListView().getCheckedItemCount(); new WorkTask<Void, Void, Boolean>() { @Override protected void onPrepare() { super.onPrepare(); ViewUtils.createNormalProgressDialog(getActivity(), getString(R.string.account_delete_account_loading)).show(); }; @Override public Boolean workInBackground(Void... params) throws TaskException { SparseBooleanArray selectedItems = checkedArray; for (int i = 0; i < getAdapterItems().size(); i++) { if (selectedItems.get(i)) { AccountBean account = getAdapterItems().get(i); Logger.w(TAG, "删除账号 uid = " + account.getUserId()); AccountDB.remove(account.getUserId()); // 如果是登录账号,退出登录 if (AppContext.isLogedin() && account.getUserId().equals(AppContext.getUser().getIdstr())) AppContext.logout(); } } return true; } @Override protected void onSuccess(Boolean result) { super.onSuccess(result); mode.finish(); ViewUtils.dismissNormalProgressDialog(); ViewUtils.showMessage(String.format(getString(R.string.account_account_deleted), size)); requestData(RefreshMode.reset); }; }.execute(); } }) .show(); } return true; } @Override public void onDestroyActionMode(ActionMode mode) { isSelectedModeActivated = false; checkedArray.clear(); getListView().clearChoices(); getAdapter().notifyDataSetChanged(); } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = getListView().getCheckedItemCount(); if (checkedCount > 0) setSubtitle(mode); checkedArray.put(position, checked); getAdapter().notifyDataSetChanged(); } private void setSubtitle(ActionMode mode) { final int checkedCount = getListView().getCheckedItemCount(); switch (checkedCount) { case 0: mode.setSubtitle(R.string.account_account_select_remind); break; default: mode.setSubtitle(String.format(getString(R.string.opts_select_remind), checkedCount)); break; } } @Override public boolean onBackClick() { if (!AppContext.isLogedin()) { new AlertDialog.Builder(getActivity()).setTitle(R.string.remind) .setMessage(R.string.account_account_exit_remind) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getActivity().finish(); } }) .show(); return true; } return super.onBackClick(); } }