package com.jasonchen.microlang.activitys;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.LoaderManager;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.jasonchen.microlang.R;
import com.jasonchen.microlang.beans.AccountBean;
import com.jasonchen.microlang.database.AccountDBTask;
import com.jasonchen.microlang.settings.SettingUtility;
import com.jasonchen.microlang.utils.GlobalContext;
import com.jasonchen.microlang.utils.MythouCrashHandler;
import com.jasonchen.microlang.utils.Utility;
import com.jasonchen.microlang.utils.ViewUtility;
import com.jasonchen.microlang.view.FloatingActionButton;
import com.jasonchen.microlang.workers.TimeLineBitmapDownloader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* jasonchen
* 2015/04/10
*/
public class AccountActivity extends ActionBarActivity implements
LoaderManager.LoaderCallbacks<List<AccountBean>>, OnClickListener {
private static final String ACTION_OPEN_FROM_APP_INNER = "com.jasonchen.microlang:accountactivity";
private static final String ACTION_OPEN_FROM_APP_INNER_REFRESH_TOKEN = "com.jasonchen.microlang:accountactivity_refresh_token";
private static final String REFRESH_ACTION_EXTRA = "refresh_account";
private final int LOADER_ID = 0;
private final int ADD_ACCOUNT_REQUEST_CODE = 0;
private FloatingActionButton fab;
private ListView mListView = null;
private AccountAdapter listAdapter = null;
private List<AccountBean> accountList = new ArrayList<AccountBean>();
private int theme = 0;
public static Intent newIntent() {
Intent intent = new Intent(GlobalContext.getInstance(), AccountActivity.class);
intent.setAction(ACTION_OPEN_FROM_APP_INNER);
return intent;
}
public static Intent newIntent(AccountBean accountBean) {
Intent intent = new Intent(GlobalContext.getInstance(), AccountActivity.class);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
theme = SettingUtility.getTheme();
} else {
theme = savedInstanceState.getInt("theme");
}
configTheme();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account);
GlobalContext.getInstance().setCurrentRunningActivity(this);
Thread.setDefaultUncaughtExceptionHandler(new MythouCrashHandler());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
// Translucent status bar
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
RelativeLayout root = (RelativeLayout) findViewById(R.id.layout);
root.setPadding(0, Utility.getStatusBarHeight(), 0, 0);
View view = new View(this);
LayoutParams lParams = new LayoutParams(
LayoutParams.MATCH_PARENT, Utility.getStatusBarHeight());
if (SettingUtility.getIsNightTheme()) {
view.setBackgroundColor(getResources().getColor(R.color.listview_pic_background_dark));
} else {
view.setBackgroundColor(getResources().getColor(SettingUtility.getThemeColor()));
}
view.setLayoutParams(lParams);
ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView();
viewGroup.addView(view);
}
initView();
if(getIntent().getAction() != null && ACTION_OPEN_FROM_APP_INNER.equals(getIntent().getAction())){
}else{
if (!TextUtils.isEmpty(SettingUtility.getDefaultAccountId())) {
// if has default account,jump to the maintimeline activity.
jumpToMainActivity();
}
}
}
private void configTheme() {
if (theme == SettingUtility.getTheme()) {
setTheme(theme);
} else {
reload();
return;
}
}
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
@SuppressLint("ResourceAsColor")
private void initView() {
// Initialize FAB
fab = new FloatingActionButton.Builder(this)
.withGravity(Gravity.BOTTOM | Gravity.RIGHT)
.withPaddings(16, 16, 16, 16)
.withDrawable(getResources().getDrawable(R.drawable.ic_plus))
.withButtonColor(SettingUtility.getIsNightTheme() ? getResources().getColor(R.color.listview_pic_background_dark) : getResources().getColor(SettingUtility.getThemeColor()))
.withButtonSize(100)
.create();
fab.setOnClickListener(this);
fab.showFloatingActionButton();
listAdapter = new AccountAdapter();
mListView = (ListView) findViewById(R.id.account_list);
mListView.setOnItemClickListener(new AccountListItemClickListener());
mListView.setAdapter(listAdapter);
mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
protected void onResume() {
super.onResume();
GlobalContext.getInstance().setCurrentRunningActivity(this);
}
@Override
public void onClick(View view) {
jumpToOAuthActivity();
}
private static class AccountDBLoader extends
AsyncTaskLoader<List<AccountBean>> {
public AccountDBLoader(Context context, Bundle args) {
super(context);
}
@Override
protected void onStartLoading() {
super.onStartLoading();
forceLoad();
}
public List<AccountBean> loadInBackground() {
return AccountDBTask.getAccountList();
}
}
@Override
public Loader<List<AccountBean>> onCreateLoader(int id, Bundle args) {
return new AccountDBLoader(AccountActivity.this, args);
}
@Override
public void onLoadFinished(Loader<List<AccountBean>> loader,
List<AccountBean> data) {
accountList = data;
listAdapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(Loader<List<AccountBean>> loader) {
accountList = new ArrayList<AccountBean>();
listAdapter.notifyDataSetChanged();
}
private class AccountListItemClickListener implements
AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i,
long l) {
if (!Utility.isTokenValid(accountList.get(i))) {
jumpToOAuthActivity();
return;
} else if (!accountList.get(i).isBlack_magic() || !Utility.isHacyTokenValid(accountList.get(i))) {
jumToBlackActivity();
} else {
jumpToMainActivity(accountList.get(i));
}
}
}
private void jumToBlackActivity() {
Intent intent = new Intent(AccountActivity.this, BlackMagicActivity.class);
startActivityForResult(intent, ADD_ACCOUNT_REQUEST_CODE);
overridePendingTransition(R.anim.push_left_in, R.anim.stay);
}
private class AccountAdapter extends BaseAdapter {
public AccountAdapter() {
}
@Override
public int getCount() {
return accountList.size();
}
@Override
public Object getItem(int i) {
return accountList.get(i);
}
@Override
public long getItemId(int i) {
return Long.valueOf(accountList.get(i).getUid());
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
final ViewHolder holder;
if (view == null || view.getTag() == null) {
LayoutInflater layoutInflater = getLayoutInflater();
View mView = layoutInflater.inflate(
R.layout.activity_account_listview_item,
viewGroup, false);
holder = new ViewHolder();
holder.name = ViewUtility.findViewById(mView, R.id.username);
holder.avatar = ViewUtility.findViewById(mView, R.id.avatar);
holder.tokenInvalid = ViewUtility.findViewById(mView, R.id.token_expired);
holder.more = ViewUtility.findViewById(mView, R.id.more);
view = mView;
} else {
holder = (ViewHolder) view.getTag();
}
if (accountList.get(i).getInfo() != null) {
holder.name.setText(accountList.get(i).getInfo()
.getScreen_name());
} else {
holder.name.setText(accountList.get(i).getUsernick());
}
if (!TextUtils.isEmpty(accountList.get(i).getAvatar_url())) {
TimeLineBitmapDownloader.getInstance().downloadAvatar(holder.avatar,
accountList.get(i).getInfo(), false);
}
holder.tokenInvalid.setVisibility(!Utility.isTokenValid(accountList
.get(i)) ? View.VISIBLE : View.GONE);
holder.more.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
final PopupMenu popupMenu = new PopupMenu(AccountActivity.this, holder.more);
popupMenu.inflate(R.menu.menu_account_activity_item);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
int id = menuItem.getItemId();
switch (id) {
case R.id.update:
jumpToOAuthActivity();
break;
case R.id.delete:
remove(i);
break;
}
return true;
}
});
popupMenu.show();
}
});
return view;
}
}
class ViewHolder {
TextView name;
ImageView avatar;
TextView tokenInvalid;
ImageView more;
}
public void jumpToMainActivity(AccountBean accountBean) {
SettingUtility.setDefaultAccountId(accountBean.getUid());
GlobalContext.getInstance().setAccountBean(accountBean);
Intent intent = MainActivity.newIntent(accountBean);
startActivity(intent);
overridePendingTransition(R.anim.push_left_in, R.anim.stay);
finish();
}
public void jumpToOAuthActivity() {
Intent intent = new Intent(AccountActivity.this, OAuthActivity.class);
startActivityForResult(intent, ADD_ACCOUNT_REQUEST_CODE);
overridePendingTransition(R.anim.push_left_in, R.anim.stay);
}
// 接收从OauthActivity传回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
refresh();
}
private void refresh() {
getLoaderManager().getLoader(LOADER_ID).forceLoad();
}
private void remove(int position) {
Set<String> set = new HashSet<String>();
long id = listAdapter.getItemId(position);
set.add(String.valueOf(id));
accountList = AccountDBTask.removeAndGetNewAccountList(set);
SettingUtility.setDefaultAccountId("");
listAdapter.notifyDataSetChanged();
}
protected void jumpToMainActivity() {
Intent intent = MainActivity.newIntent(GlobalContext.getInstance().getAccountBean());
startActivity(intent);
finish();
overridePendingTransition(R.anim.push_left_in, R.anim.stay);
}
}