OAuthUserList.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package com.ouling.weibo.OAuth;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectOutputStream;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import org.apache.commons.codec.binary.Base64;
  8. import android.app.Activity;
  9. import android.content.Context;
  10. import android.content.Intent;
  11. import android.content.SharedPreferences;
  12. import android.content.SharedPreferences.Editor;
  13. import android.graphics.Color;
  14. import android.net.Uri;
  15. import android.os.Bundle;
  16. import android.os.Handler;
  17. import android.os.Message;
  18. import android.view.Gravity;
  19. import android.view.View;
  20. import android.view.View.OnClickListener;
  21. import android.view.ViewGroup;
  22. import android.view.ViewGroup.LayoutParams;
  23. import android.widget.AbsListView;
  24. import android.widget.AdapterView;
  25. import android.widget.AdapterView.OnItemClickListener;
  26. import android.widget.BaseAdapter;
  27. import android.widget.Button;
  28. import android.widget.CheckBox;
  29. import android.widget.CompoundButton;
  30. import android.widget.CompoundButton.OnCheckedChangeListener;
  31. import android.widget.ImageView;
  32. import android.widget.LinearLayout;
  33. import android.widget.ListView;
  34. import android.widget.TextView;
  35. import android.widget.Toast;
  36. import com.ouling.weibo.MainActivity;
  37. import com.ouling.weibo.R;
  38. import com.ouling.weibo.basic.User;
  39. import com.ouling.weibo.basic.Weibo;
  40. import com.ouling.weibo.basic.WeiboException;
  41. import com.ouling.weibo.db.DBAdapter;
  42. import com.ouling.weibo.http.AccessToken;
  43. import com.ouling.weibo.http.RequestToken;
  44. //import com.ouling.weibo.widget.WebViewActivity;
  45. import com.ouling.weibo.util.WebViewActivity;
  46. /**
  47. * 显示已经过验证的用户列表,用于选择登录的用户 添加删除验证用户
  48. */
  49. public class OAuthUserList extends Activity {
  50. private static final int DIS_MODE = 1;// 选择登录用户界面
  51. private static final int DELETE_MODE = 2;// 删除用户界面
  52. private boolean[] isCheck;
  53. private ArrayList<AccessToken> users = new ArrayList<AccessToken>();
  54. private UserAdapter userAdapter;
  55. private Button btn_addUser;
  56. private Button btn_deleteUser;
  57. private boolean mode;//登录模式为true,删除模式为false
  58. private Handler handler = new Handler() {
  59. @Override
  60. public void handleMessage(Message msg) {
  61. super.handleMessage(msg);
  62. switch (msg.what) {
  63. case DIS_MODE:
  64. btn_deleteUser.setText("删除用户");
  65. btn_addUser.setText("添加用户");
  66. mode = true;
  67. break;
  68. case DELETE_MODE:
  69. btn_deleteUser.setText("取消");
  70. btn_addUser.setText("确定");
  71. mode = false;
  72. isCheck = new boolean[users.size()];
  73. Arrays.fill(isCheck, false);
  74. break;
  75. }
  76. users = DBAdapter.getInstance(OAuthUserList.this)
  77. .getAllUsersAccessToken();
  78. userAdapter.notifyDataSetChanged();
  79. }
  80. };
  81. /** Called when the activity is first created. */
  82. @Override
  83. public void onCreate(Bundle savedInstanceState) {
  84. super.onCreate(savedInstanceState);
  85. setContentView(R.layout.userlist);
  86. System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
  87. System.setProperty("weibo4j.oauth.consumerSecret",
  88. Weibo.CONSUMER_SECRET);
  89. mode = true;
  90. btn_addUser = (Button) findViewById(R.id.btn_addUser);
  91. btn_addUser.setOnClickListener(new OnClickListener() {
  92. @Override
  93. public void onClick(View v) {
  94. if (mode) {
  95. OAuthConstant.initData();
  96. // 新浪微博认证页面
  97. Weibo weibo = OAuthConstant.getInstance().getWeibo();
  98. try {
  99. RequestToken requestToken = weibo
  100. .getOAuthRequestToken("ouling://UserList");
  101. Uri uri = Uri.parse(requestToken.getAuthenticationURL()
  102. + "&from=xweibo");
  103. OAuthConstant.getInstance().setRequestToken(
  104. requestToken);
  105. Intent intent = new Intent(OAuthUserList.this,
  106. WebViewActivity.class);
  107. intent.putExtra("url", uri.toString());
  108. OAuthUserList.this.startActivity(intent);
  109. } catch (WeiboException e) {
  110. e.printStackTrace();
  111. }
  112. } else {
  113. // 删除用户模式时,为确定删除
  114. for (int i = 0; i < users.size(); i++) {
  115. if (isCheck[i])
  116. DBAdapter.getInstance(OAuthUserList.this)
  117. .deleteUserToken(users.get(i));
  118. }
  119. handler.sendEmptyMessage(DIS_MODE);
  120. }
  121. }
  122. });
  123. btn_deleteUser = (Button) findViewById(R.id.btn_deleteUser);
  124. btn_deleteUser.setOnClickListener(new OnClickListener() {
  125. @Override
  126. public void onClick(View v) {
  127. if (mode) {
  128. handler.sendEmptyMessage(DELETE_MODE);
  129. } else {
  130. handler.sendEmptyMessage(DIS_MODE);
  131. }
  132. }
  133. });
  134. // 列出所有已经验证的用户
  135. ListView listView = (ListView) findViewById(R.id.user_list);
  136. userAdapter = new UserAdapter(this);
  137. listView.setAdapter(userAdapter);
  138. listView.setDividerHeight(5);
  139. listView.setOnItemClickListener(new OnItemClickListener() {
  140. @Override
  141. public void onItemClick(AdapterView<?> parent, View view,
  142. int position, long id) {
  143. if (mode) {
  144. // 选择认证用户登录,认证后不再需要输入密码
  145. OAuthConstant.getInstance().setAccessToken(
  146. users.get(position));
  147. try {
  148. ByteArrayOutputStream byaos = new ByteArrayOutputStream();
  149. SharedPreferences sp = OAuthUserList.this
  150. .getSharedPreferences("ouling",
  151. Context.MODE_PRIVATE);
  152. Editor editor = sp.edit();
  153. ObjectOutputStream oos = new ObjectOutputStream(byaos);
  154. oos.writeObject(users.get(position));
  155. String s = new String(Base64.encodeBase64(byaos
  156. .toByteArray()));
  157. editor.putString("accessToken", s);
  158. editor.commit();
  159. } catch (IOException e) {
  160. e.printStackTrace();
  161. Toast.makeText(OAuthUserList.this, "保存token失败",
  162. Toast.LENGTH_LONG).show();
  163. }
  164. //跳转到微博用户界面
  165. startActivity(new Intent(OAuthUserList.this,
  166. MainActivity.class));
  167. } else {
  168. //删除模式时,为勾选或为勾选
  169. isCheck[position] = !isCheck[position];
  170. ((ViewHolder) view.getTag()).checkBox
  171. .setChecked(isCheck[position]);
  172. }
  173. }
  174. });
  175. }
  176. @Override
  177. public void onResume() {
  178. super.onResume();
  179. handler.sendEmptyMessage(DIS_MODE);
  180. }
  181. @Override
  182. /*当该activity继续运行时,调用该方法。
  183. * 当完成用户认证后,返回时调用
  184. */
  185. public void onNewIntent(Intent intent) {
  186. super.onNewIntent(intent);
  187. // System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
  188. // System.setProperty("weibo4j.oauth.consumerSecret",
  189. // Weibo.CONSUMER_SECRET);
  190. Uri uri = intent.getData();
  191. try {
  192. //保存用户认证后的返回信息
  193. RequestToken requestToken = OAuthConstant.getInstance()
  194. .getRequestToken();
  195. AccessToken accessToken = requestToken.getAccessToken(uri
  196. .getQueryParameter("oauth_verifier"));
  197. OAuthConstant.getInstance().setAccessToken(accessToken);
  198. Weibo weibo = OAuthConstant.getInstance().getWeibo();
  199. weibo.setToken(OAuthConstant.getInstance().getToken(),
  200. OAuthConstant.getInstance().getTokenSecret());
  201. User user = weibo.showUser(accessToken.getUserId() + "");
  202. accessToken.setScreenName(user.getScreenName());
  203. DBAdapter.getInstance(this).saveUserToken(accessToken);
  204. users = DBAdapter.getInstance(this).getAllUsersAccessToken();
  205. userAdapter.notifyDataSetChanged();
  206. } catch (Exception e) {
  207. e.printStackTrace();
  208. Toast.makeText(this, "添加失败", Toast.LENGTH_LONG).show();
  209. }
  210. this.onResume();
  211. }
  212. // 带选择框的listview的适配器
  213. class UserAdapter extends BaseAdapter {
  214. Context context;
  215. public UserAdapter(Context context) {
  216. this.context = context;
  217. }
  218. @Override
  219. public int getCount() {
  220. return users.size();
  221. }
  222. @Override
  223. public AccessToken getItem(int position) {
  224. return users.get(position);
  225. }
  226. @Override
  227. public long getItemId(int position) {
  228. return position;
  229. }
  230. @Override
  231. public View getView(final int position, View convertView,
  232. ViewGroup parent) {
  233. View view;
  234. ViewHolder holder;
  235. if (convertView != null) {
  236. holder = (ViewHolder) convertView.getTag();
  237. view = convertView;
  238. } else {
  239. LinearLayout linearLayout = new LinearLayout(context);
  240. linearLayout.setBackgroundResource(R.drawable.item_bg_triangle);
  241. linearLayout.setLayoutParams(new AbsListView.LayoutParams(
  242. LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  243. linearLayout.setOrientation(LinearLayout.HORIZONTAL);
  244. linearLayout.setGravity(Gravity.CENTER_VERTICAL);
  245. CheckBox checkBox = new CheckBox(context);
  246. checkBox.setLayoutParams(new LayoutParams(
  247. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  248. checkBox.setGravity(Gravity.RIGHT);
  249. linearLayout.addView(checkBox);
  250. ImageView imageView = new ImageView(context);
  251. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
  252. 40, 40);
  253. lp.weight = 1;
  254. imageView.setImageResource(R.drawable.triangle);
  255. linearLayout.addView(imageView, lp);
  256. TextView tv = new TextView(context);
  257. tv.setText(users.get(position).getScreenName());
  258. tv.setTextSize(20);
  259. tv.setTextColor(Color.BLACK);
  260. tv.setLayoutParams(new LayoutParams(
  261. LinearLayout.LayoutParams.FILL_PARENT,
  262. LayoutParams.WRAP_CONTENT));
  263. tv.setGravity(Gravity.CENTER_VERTICAL);
  264. linearLayout.addView(tv);
  265. view = linearLayout;
  266. holder = new ViewHolder();
  267. holder.tv = tv;
  268. holder.checkBox = checkBox;
  269. view.setTag(holder);
  270. }
  271. holder.checkBox.setFocusable(false);
  272. holder.checkBox.setChecked(false);
  273. holder.checkBox
  274. .setOnCheckedChangeListener(new OnCheckedChangeListener() {
  275. @Override
  276. public void onCheckedChanged(CompoundButton buttonView,
  277. boolean isChecked) {
  278. isCheck[position] = isChecked;
  279. }
  280. });
  281. if (mode) {
  282. holder.checkBox.setVisibility(View.GONE);
  283. } else {
  284. holder.checkBox.setVisibility(View.VISIBLE);
  285. }
  286. holder.tv.setText(users.get(position).getScreenName());
  287. return view;
  288. }
  289. }
  290. static class ViewHolder {
  291. TextView tv;
  292. CheckBox checkBox;
  293. }
  294. }