package com.thankcreate.care.account; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.dongxuexidu.douban4j.constants.DefaultConfigs; import com.dongxuexidu.douban4j.model.app.AccessToken; import com.dongxuexidu.douban4j.model.app.DoubanException; import com.dongxuexidu.douban4j.model.user.DoubanUserObj; import com.dongxuexidu.douban4j.provider.DoubanDialog; import com.dongxuexidu.douban4j.service.DoubanUserService; import com.dongxuexidu.douban4j.utils.DoubanAuthListener; import com.dongxuexidu.douban4j.utils.HttpManager; import com.markupartist.android.widget.ActionBar; import com.markupartist.android.widget.ActionBar.IntentAction; import com.renren.api.connect.android.AsyncRenren; import com.renren.api.connect.android.Renren; import com.renren.api.connect.android.Util; import com.renren.api.connect.android.common.AbstractRequestListener; import com.renren.api.connect.android.exception.RenrenAuthError; import com.renren.api.connect.android.exception.RenrenError; import com.renren.api.connect.android.users.UserInfo; import com.renren.api.connect.android.users.UsersGetInfoRequestParam; import com.renren.api.connect.android.users.UsersGetInfoResponseBean; import com.renren.api.connect.android.view.RenrenAuthListener; import com.thankcreate.care.App; import com.thankcreate.care.AppConstants; import com.thankcreate.care.BaseActivity; import com.thankcreate.care.MainActivity; import com.thankcreate.care.R; import com.thankcreate.care.R.drawable; import com.thankcreate.care.R.id; import com.thankcreate.care.R.layout; import com.thankcreate.care.R.menu; import com.thankcreate.care.rss.RssSetActivity; import com.thankcreate.care.tool.misc.MiscTool; import com.thankcreate.care.tool.misc.PreferenceHelper; import com.thankcreate.care.tool.misc.StringTool; import com.thankcreate.care.tool.ui.ListViewTool; import com.thankcreate.care.tool.ui.ToastHelper; import com.thankcreate.care.viewmodel.EntryType; import com.thankcreate.care.viewmodel.SimpleTableModel; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.Weibo; import com.weibo.sdk.android.WeiboAuthListener; import com.weibo.sdk.android.WeiboDialogError; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.api.StatusesAPI; import com.weibo.sdk.android.api.UsersAPI; import com.weibo.sdk.android.api.WeiboAPI.FEATURE; import com.weibo.sdk.android.net.RequestListener; import com.weibo.sdk.android.sso.SsoHandler; import android.os.Bundle; import android.os.StrictMode; import android.R.bool; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.ScrollView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class AccountActivity extends BaseActivity { private ScrollView scrollRoot; private ActionBar actionBar; private ListView sinaWeiboListView; private ListView renrenListView; private ListView doubanListView; private ListView rssListView; private AccountGroupAdapter sinaWeiboAdapter = null; private AccountGroupAdapter renrenAdapter = null; private AccountGroupAdapter doubanAdapter = null; private AccountGroupAdapter rssAdapter = null; private SsoHandler msinaWeiboSsoHandler; private ProgressDialog mSpinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_account_account); initControlBind(); initActionBar(); } @Override protected void onResume() { super.onResume(); initSinaWeibo(); initRenren(); initDouban(); initRss(); } private void initControlBind() { scrollRoot = (ScrollView) findViewById(R.id.status_detail_scroll_root); sinaWeiboListView = (ListView) findViewById(R.id.account_list_sinaweibo); renrenListView = (ListView) findViewById(R.id.account_list_renren); doubanListView = (ListView) findViewById(R.id.account_list_douban); rssListView = (ListView) findViewById(R.id.account_list_rss); mSpinner = new ProgressDialog(this); mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE); mSpinner.setMessage("Loading..."); } private void initActionBar() { actionBar = (ActionBar) findViewById(R.id.actionbar); actionBar.setTitle("帐号"); actionBar.SetTitleLogo(R.drawable.tab_account); } private void initSinaWeibo() { SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); String myName = pref.getString("SinaWeibo_NickName", "未登陆"); String herName = pref.getString("SinaWeibo_FollowerNickName", "未指定"); SimpleTableModel model1 = new SimpleTableModel(); model1.prefix = "登陆帐号:"; model1.value = myName; SimpleTableModel model2 = new SimpleTableModel(); model2.prefix = "关注帐号:"; model2.value = herName; SimpleTableModel model3 = new SimpleTableModel(); sinaWeiboAdapter = new AccountGroupAdapter(getApplicationContext()); sinaWeiboAdapter.addItem(model1); sinaWeiboAdapter.addItem(model2); sinaWeiboAdapter.addItem(model3); sinaWeiboListView.setAdapter(sinaWeiboAdapter); ListViewTool.setListViewHeightBasedOnChildren(sinaWeiboListView, 0 , true); sinaWeiboListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { // 登陆 if(position == 0) { MiscTool.clearCookie(AccountActivity.this); try { Class sso = Class.forName("com.weibo.sdk.android.sso.SsoHandler"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Activity activity = AccountActivity.this; msinaWeiboSsoHandler = new SsoHandler(AccountActivity.this, App .getSinaWeibo()); msinaWeiboSsoHandler.authorize(mWeiboAuthListener); } // 指定关注人 else if (position == 1) { if(MiscTool.isSinaWeiboLogin()) { Intent intent = new Intent(); intent.setClass(AccountActivity.this, AccountSelectFreindActivity.class); intent.putExtra("type", EntryType.SinaWeibo); startActivity(intent); } else { Builder alertDialog = new AlertDialog.Builder(AccountActivity.this); alertDialog.setTitle(">_<"); alertDialog.setMessage("还没有登陆怎么指定关注的人说~"); alertDialog.setPositiveButton("朕知道了" , null); alertDialog.show(); } } // 退出 else if (position == 2) { new AlertDialog.Builder(AccountActivity.this) .setIcon(R.drawable.tab_account) .setTitle("确认退出登陆?") .setPositiveButton("确认", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { PreferenceHelper.removeSinaWeiboPreference(); initSinaWeibo(); App.mainViewModel.isChanged = true; } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create().show(); } } }); } private void initRenren() { SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); String myName = pref.getString("Renren_NickName", "未登陆"); String herName = pref.getString("Renren_FollowerNickName", "未指定"); SimpleTableModel model1 = new SimpleTableModel(); model1.prefix = "登陆帐号:"; model1.value = myName; SimpleTableModel model2 = new SimpleTableModel(); model2.prefix = "关注帐号:"; model2.value = herName; SimpleTableModel model3 = new SimpleTableModel(); renrenAdapter = new AccountGroupAdapter(getApplicationContext()); renrenAdapter.addItem(model1); renrenAdapter.addItem(model2); renrenAdapter.addItem(model3); renrenListView.setAdapter(renrenAdapter); ListViewTool.setListViewHeightBasedOnChildren(renrenListView, 0 , true); renrenListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { // 登陆 if(position == 0) { // 人人如果已经登陆了一个帐号,再想换个号登陆,如果不logout,则总是原帐号 // 这应该是个api的bug MiscTool.clearCookie(AccountActivity.this); PreferenceHelper.removeRenrenPreference(); App.getRenren().logout(AccountActivity.this); initRenren(); App.mainViewModel.isChanged = true; Activity activity = AccountActivity.this; App.getRenren().authorize(AccountActivity.this, AppConstants.RENREN_PERMISSION, mRenrenAuthListener); } // 指定关注人 else if (position == 1) { if(MiscTool.isRenrenLogin()) { Intent intent = new Intent(); intent.setClass(AccountActivity.this, AccountSelectFreindActivity.class); intent.putExtra("type", EntryType.Renren); startActivity(intent); } else { Builder alertDialog = new AlertDialog.Builder(AccountActivity.this); alertDialog.setTitle(">_<"); alertDialog.setMessage("还没有登陆怎么指定关注的人说~"); alertDialog.setPositiveButton("朕知道了" , null); alertDialog.show(); } } // 退出 else if (position == 2) { new AlertDialog.Builder(AccountActivity.this) .setIcon(R.drawable.tab_account) .setTitle("确认退出登陆?") .setPositiveButton("确认", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { PreferenceHelper.removeRenrenPreference(); App.getRenren().logout(AccountActivity.this); initRenren(); App.mainViewModel.isChanged = true; } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create().show(); } } }); } private void initDouban() { SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); String myName = pref.getString("Douban_NickName", "未登陆"); String herName = pref.getString("Douban_FollowerNickName", "未指定"); SimpleTableModel model1 = new SimpleTableModel(); model1.prefix = "登陆帐号:"; model1.value = myName; SimpleTableModel model2 = new SimpleTableModel(); model2.prefix = "关注帐号:"; model2.value = herName; SimpleTableModel model3 = new SimpleTableModel(); doubanAdapter = new AccountGroupAdapter(getApplicationContext()); doubanAdapter.addItem(model1); doubanAdapter.addItem(model2); doubanAdapter.addItem(model3); doubanListView.setAdapter(doubanAdapter); ListViewTool.setListViewHeightBasedOnChildren(doubanListView, 0 , true); doubanListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { // 登陆 if(position == 0) { DoubanDialog dlg = new DoubanDialog(AccountActivity.this, mDoubanAuthListener); dlg.show(); } // 指定关注人 else if (position == 1) { if(MiscTool.isDoubanLogin()) { Intent intent = new Intent(); intent.setClass(AccountActivity.this, AccountSelectFreindActivity.class); intent.putExtra("type", EntryType.Douban); startActivity(intent); } else { Builder alertDialog = new AlertDialog.Builder(AccountActivity.this); alertDialog.setTitle(">_<"); alertDialog.setMessage("还没有登陆怎么指定关注的人说~"); alertDialog.setPositiveButton("朕知道了" , null); alertDialog.show(); } } // 退出 else if (position == 2) { new AlertDialog.Builder(AccountActivity.this) .setIcon(R.drawable.tab_account) .setTitle("确认退出登陆?") .setPositiveButton("确认", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { PreferenceHelper.removeDoubanPreference(); initDouban(); App.mainViewModel.isChanged = true; } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create().show(); } } }); } private void initRss() { SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); String siteTitle = pref.getString("RSS_FollowerSiteTitle", "未订阅"); SimpleTableModel model1 = new SimpleTableModel(); model1.prefix = "当前订阅:"; model1.value = siteTitle; SimpleTableModel model2 = new SimpleTableModel(); model2.value = "取消订阅"; rssAdapter = new AccountGroupAdapter(getApplicationContext()); rssAdapter.addItem(model1); rssAdapter.addItem(model2); rssListView.setAdapter(rssAdapter); ListViewTool.setListViewHeightBasedOnChildren(rssListView, 0 , true); rssListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { // 登陆 if(position == 0) { Intent intent = new Intent(); intent.setClass(AccountActivity.this, RssSetActivity.class); startActivity(intent); } // 退出 else if (position == 1) { PreferenceHelper.removeRssPreference(); initRss(); App.mainViewModel.isChanged = true; } } }); } private void showProgress(final boolean isShow) { if(actionBar == null || mSpinner == null) return; actionBar.post(new Runnable() { @Override public void run() { if(isShow) mSpinner.show(); else mSpinner.dismiss(); } }); } private WeiboAuthListener mWeiboAuthListener = new WeiboAuthListener (){ @Override public void onComplete(Bundle values) { try { String id = values.getString("uid"); String token = values.getString("access_token"); String expires_in = values.getString("expires_in"); long exp = System.currentTimeMillis() + Long.parseLong(expires_in) * 1000; SharedPreferences pref = AccountActivity.this.getSharedPreferences( AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("SinaWeibo_ID", id); editor.putString("SinaWeibo_Token", token); editor.putLong("SinaWeibo_ExpirationDate", exp); editor.commit(); Oauth2AccessToken oauth2AccessToken = new Oauth2AccessToken(); oauth2AccessToken.setToken(token); oauth2AccessToken.setExpiresTime(exp); UsersAPI usersAPI=new UsersAPI(oauth2AccessToken); long lID = Long.parseLong(id); usersAPI.show(lID, mSinaWeiboShowRequestListener); showProgress(true); } catch (Exception e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeSinaWeiboPreference(); } } @Override public void onError(WeiboDialogError e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); } @Override public void onCancel() { } @Override public void onWeiboException(WeiboException e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); } }; private RequestListener mSinaWeiboShowRequestListener = new RequestListener() { @Override public void onComplete(String arg0) { try { JSONObject jsonObject = new JSONObject(arg0); String name = jsonObject.getString("screen_name"); String avatar = jsonObject.getString("profile_image_url"); SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("SinaWeibo_NickName", name); editor.putString("SinaWeibo_Avatar", avatar); editor.commit(); sinaWeiboListView.post(new Runnable() { @Override public void run() { initSinaWeibo(); } }); showProgress(false); } catch (JSONException e) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeSinaWeiboPreference(); } } @Override public void onError(WeiboException arg0) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeSinaWeiboPreference(); } @Override public void onIOException(IOException arg0) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeSinaWeiboPreference(); } }; private RenrenAuthListener mRenrenAuthListener = new RenrenAuthListener() { @Override public void onRenrenAuthError(RenrenAuthError renrenAuthError) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); } @Override public void onComplete(Bundle values) { // 人人登陆后不返回ID try { String token = values.getString("access_token"); String expires_in = values.getString("expires_in"); long exp = System.currentTimeMillis() + Long.parseLong(expires_in) * 1000; SharedPreferences pref = AccountActivity.this.getSharedPreferences( AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("Renren_Token", token); editor.putLong("Renren_ExpirationDate", exp); editor.commit(); AsyncRenren asyncRenren = new AsyncRenren(App.getRenren()); UsersGetInfoRequestParam param = new UsersGetInfoRequestParam(null, "uid,name,sex,birthday,headurl"); asyncRenren.getUsersInfo(param, mRenrenShowRequestListener); showProgress(true); } catch (Exception e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeRenrenPreference(); } } @Override public void onCancelLogin() { } @Override public void onCancelAuth(Bundle values) { } }; private AbstractRequestListener<UsersGetInfoResponseBean> mRenrenShowRequestListener = new AbstractRequestListener<UsersGetInfoResponseBean>() { public void onComplete(UsersGetInfoResponseBean bean) { try { ArrayList<UserInfo> listUsers = bean.getUsersInfo(); UserInfo user = listUsers.get(0); SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("Renren_ID", String.valueOf(user.getUid())); editor.putString("Renren_NickName", user.getName()); editor.putString("Renren_Avatar", user.getHeadurl()); editor.commit(); renrenListView.post(new Runnable() { @Override public void run() { initRenren(); } }); showProgress(false); } catch (Exception e) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeRenrenPreference(); App.getRenren().logout(getApplicationContext()); } } public void onRenrenError(RenrenError renrenError) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeRenrenPreference(); App.getRenren().logout(getApplicationContext()); } public void onFault(Throwable fault) { showProgress(false); ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeRenrenPreference(); App.getRenren().logout(getApplicationContext()); } }; private DoubanAuthListener mDoubanAuthListener = new DoubanAuthListener() { @Override public void onError(String e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeDoubanPreference(); } @Override public void onComplete(AccessToken values) { try { String id = values.getDoubanUserId(); final String token = values.getAccessToken(); Integer expires_in = values.getExpiresIn(); String refresh_token = values.getRefreshToken(); long exp = System.currentTimeMillis() + expires_in * 1000; SharedPreferences pref = AccountActivity.this.getSharedPreferences( AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("Douban_ID", id); editor.putString("Douban_Token", token); editor.putString("Douban_RefreshToken", refresh_token); editor.putLong("Douban_ExpirationDate", exp); editor.commit(); showProgress(true); new Thread(new Runnable() { @Override public void run() { try { HttpManager httpManager = new HttpManager(token); String result = httpManager.getResponseString(DefaultConfigs.API_URL_PREFIX + "/v2/user/~me", null, true); JSONObject object = new JSONObject(result); String name = object.optString("name"); String avatar = object.optString("avatar"); SharedPreferences pref = AccountActivity.this .getSharedPreferences(AppConstants.PREFERENCES_NAME, Context.MODE_APPEND); Editor editor = pref.edit(); editor.putString("Douban_NickName", name); editor.putString("Douban_Avatar", avatar); editor.commit(); doubanListView.post(new Runnable() { @Override public void run() { initDouban(); } }); showProgress(false); } catch (Exception e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeDoubanPreference(); showProgress(false); e.printStackTrace(); } } }).start(); } catch (Exception e) { ToastHelper.show( "授权过程中发生未知错误,请确保网络通畅"); PreferenceHelper.removeDoubanPreference(); } } @Override public void onCancel() { } }; protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); /** * 下面两个注释掉的代码,仅当sdk支持sso时有效, */ if (msinaWeiboSsoHandler != null) { msinaWeiboSsoHandler.authorizeCallBack(requestCode, resultCode, data); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_account, menu); return false; } class AccountGroupAdapter extends BaseAdapter { private List<SimpleTableModel> listModel = new ArrayList();; private LayoutInflater mInflater; public AccountGroupAdapter(Context context) { super(); mInflater = LayoutInflater.from(context); } public void addItem(SimpleTableModel model) { listModel.add(model); notifyDataSetChanged(); } @Override public int getCount() { return listModel.size(); } @Override public Object getItem(int position) { try { return listModel.get(position); } catch (Exception e) { return null; } } @Override public long getItemId(int position) { return position; } @Override /** * 因为表格中有两种格式的,所以这里不做convert了,每次都建一个新view,不然极易崩溃 */ public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; // if(convertView == null) // { holder = new ViewHolder(); if(position < listModel.size() - 1) { convertView = mInflater.inflate(R.layout.listview_item_account, null); holder.textViewPrefix = (TextView) convertView.findViewById(R.id.account_list_item_prefix); holder.textViewValue = (TextView) convertView.findViewById(R.id.account_list_item_value); convertView.setTag(holder); } else { convertView = mInflater.inflate(R.layout.listview_item_account_logout, null); SimpleTableModel md = listModel.get(position); if(!StringTool.isNullOrEmpty(md.value)) { TextView txt = (TextView) convertView.findViewById(R.id.setting_list_item_logout_text); txt.setText(md.value); } } // } // else // { // if(position < 2) // { // holder = (ViewHolder)convertView.getTag(); // } // } if(position < listModel.size() - 1) { TextView test = holder.textViewPrefix; SimpleTableModel md = listModel.get(position); String test2 = md.prefix; holder.textViewPrefix.setText(listModel.get(position).prefix); holder.textViewValue.setText(listModel.get(position).value); } return convertView; } public class ViewHolder { public TextView textViewPrefix; public TextView textViewValue; public int tag; } } }