仿新浪微博2014之登陆界面四(总体功能)

在前面完成了数据库操作、异步图片加载和缓存、新浪微博认证后,就可以进行登录界面的功能开发了,登录界面功能代码如下:

package com.xhq.xweibo.ui;


import java.util.ArrayList;
import java.util.List;

import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.net.AsyncWeiboRunner;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.User;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.LogUtil;
import com.sina.weibo.sdk.utils.UIUtils;

import com.xhq.common.AsyncImageLoader;
import com.xhq.common.ImageUtil;
import com.xhq.common.NetUtil;
import com.xhq.xweibo.logic.Constants;
import com.xhq.xweibo.logic.CurUserKeeper;
import com.xhq.xweibo.logic.UserInfo;
import com.xhq.xweibo.logic.XDBHelper;
import com.xhq.xweibo.R;

import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;

public class LoginActivity extends Activity
{
	private static final String TAG = "LoginActivity";

	private static final String WEIBO_DEMO_APP_SECRET = "4e47e691a516afad0fc490e05ff70ee5";
	private static final String OAUTH2_ACCESS_TOKEN_URL = "https://open.weibo.cn/oauth2/access_token";

	// UI references.
	private static ImageView mHeaderView;
	private static Spinner mAccountView;
	private static Button mLoginBotton;
	private static Button mAuthBotton;
	private static Button mExitBotton;
	private static Button mLogoutBotton;
	private static ProgressDialog pd;

	private static XDBHelper mDBHelper;
	private static List<UserInfo> mUserList;
	private static UserInfo mCurUser;
	private ArrayAdapter<String> mAdapter;
	private List<String> mUserNameList;
	private static long m_nExitTime;
	
	private AsyncImageLoader  mImageLoader;
	private AsyncImageLoader.onLoadCompleteListener mLoadCompleteListener;

	private WeiboAuth mWeiboAuth;
	private String mCode;
	private Oauth2AccessToken mAccessToken;
	private UsersAPI mUsersAPI;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		//this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_login);
		// Set up the login form.
		mHeaderView = (ImageView) findViewById(R.id.login_header);
		mAccountView = (Spinner) findViewById(R.id.login_account);
		mLoginBotton = (Button) findViewById(R.id.login_button);
		mAuthBotton = (Button) findViewById(R.id.login_auth);
		mExitBotton = (Button) findViewById(R.id.login_exit);
		mLogoutBotton = (Button) findViewById(R.id.login_logout);
		mImageLoader = new AsyncImageLoader(this.getApplicationContext());
		mDBHelper = new XDBHelper(LoginActivity.this);
		mUserNameList = new ArrayList<String>();
		mAdapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_spinner_item, mUserNameList);

		initUser();

		mLoginBotton.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View view)
			{
				CharSequence error;
				if (mUserList.isEmpty())
				{
					error = getString(R.string.login_error_noneaccount);
					Toast.makeText(LoginActivity.this, error, Toast.LENGTH_LONG)
							.show();
				} else
				{
					if (mCurUser != null)
					{	
						pd = new ProgressDialog(LoginActivity.this);
						pd.setMessage("登录服务器....");
						pd.show();
						CurUserKeeper.saveCurUser(getApplicationContext(), mCurUser);
						Intent it = new Intent();
						it.setClass(LoginActivity.this, TabHostActivity.class);
						startActivity(it);
						pd.dismiss();
						finish();
					}else
					{
						Toast.makeText(getApplicationContext(), "无用户账号", Toast.LENGTH_SHORT).show();
					}
					
				}

			}
		});
		mAuthBotton.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				mWeiboAuth = new WeiboAuth(LoginActivity.this,
						Constants.APP_KEY, Constants.REDIRECT_URL,
						Constants.SCOPE);
				mWeiboAuth.authorize(new AuthListener(),
						WeiboAuth.OBTAIN_AUTH_CODE);
			}
		});
		mExitBotton.setOnClickListener(new View.OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				// TODO 自动生成的方法存根
				finish();
				System.exit(0);

			}
		});
		mLogoutBotton.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				
			}
		});

	}

	@Override
	protected void onResume()
	{
		// TODO Auto-generated method stub
		super.onResume();
		init();
	}

	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		if (keyCode == KeyEvent.KEYCODE_BACK
				&& event.getAction() == KeyEvent.ACTION_DOWN)
		{
			if ((System.currentTimeMillis() - m_nExitTime) > 2000) //
			{
				Toast.makeText(getApplicationContext(), "再按一次退出程序",
						Toast.LENGTH_SHORT).show();
				m_nExitTime = System.currentTimeMillis();
			} else
			{
				finish();
				System.exit(0);
			}

			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	public void initUser()
	{
		Log.d(TAG, "initUser");
		mDBHelper.createUserTable();
		mUserList = mDBHelper.getUserList(false);
		if (!mUserList.isEmpty())
		{
			// 获取用户名列表,并关联到spinner控件
			for (UserInfo ui : mUserList)
			{
				mUserNameList.add(ui.getUserName());
			}
			mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
			mAccountView.setAdapter(mAdapter);
			mAccountView
					.setOnItemSelectedListener(new SpinnerSelectedListener());
			// 获取最近登录的用户
			SharedPreferences sp = getSharedPreferences("lastUser",
					Activity.MODE_PRIVATE);
			String name = sp.getString("lastUser", "");
			if (name != "")
			{
				mAccountView.setSelection(mUserNameList.indexOf(name), true);
			} else
			{
				mAccountView.setSelection(0, true);
			}
		} else
		{
			Log.d(TAG, "Have 0 user");
		}
	}

	public void init()
	{
		Log.d(TAG, "init");
		Intent it = new Intent("com.xhq.xweibo.logic.XService");
		startService(it);
	}

	public void fetchTokenAsync(String authCode, String appSecret)
	{
		WeiboParameters requestParams = new WeiboParameters();
		requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID, Constants.APP_KEY);
		requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
		requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,
				"authorization_code");
		requestParams.put(WBConstants.AUTH_PARAMS_CODE, authCode);
		requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,
				Constants.REDIRECT_URL);
		// 异步请求,获取 Token
		AsyncWeiboRunner.requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams,
				"POST", new RequestListener()
				{
					@Override
					public void onComplete(String response)
					{
						LogUtil.d(TAG, "Response: " + response);
						Oauth2AccessToken token = Oauth2AccessToken
								.parseAccessToken(response);
						if (token != null && token.isSessionValid())
						{
							LogUtil.d(TAG, "Success! " + token.toString());

							mCurUser = new UserInfo();
							mAccessToken = token;
							mCurUser.setUserId(mAccessToken.getUid());
							mCurUser.setToken(mAccessToken.getToken());
							mCurUser.setUserExpiresin(mAccessToken.getExpiresTime());
							mUsersAPI = new UsersAPI(mAccessToken);
							long uid = Long.parseLong(mAccessToken.getUid());
							mUsersAPI.show(uid, mListener);

						} else
						{
							LogUtil.d(TAG, "Failed to receive access token");
						}
					}

					@Override
					public void onWeiboException(WeiboException e)
					{
						LogUtil.e(TAG, "onWeiboException: " + e.getMessage());
						Toast.makeText(LoginActivity.this, "获取Token失败",
								Toast.LENGTH_SHORT).show();
					}
				});
	}

	/**
	 * 微博 OpenAPI 回调接口。
	 */
	private RequestListener mListener = new RequestListener()
	{
		@Override
		public void onComplete(String response)
		{
			if (!TextUtils.isEmpty(response))
			{
				LogUtil.i(TAG, response);
				User user = User.parse(response);
				if (user != null)
				{
					LogUtil.d(TAG, "Success to get screen_name: "
							+ user.screen_name);
					mCurUser.setUserName(user.screen_name);
					mCurUser.setUserIcon(user.profile_image_url);					
					mDBHelper.SaveUserInfo(mCurUser);
					
					initUser();
					mImageLoader.loadImage(mHeaderView,user.profile_image_url, mLoadCompleteListener);

				} else
				{
					Toast.makeText(LoginActivity.this, response,
							Toast.LENGTH_LONG).show();
				}
			}
		}

		@Override
		public void onWeiboException(WeiboException e)
		{
			LogUtil.e(TAG, e.getMessage());
		}
	};

	class SpinnerSelectedListener implements OnItemSelectedListener
	{
		public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
				long arg3)
		{
			Log.d("LoginActivity", "spinner item selected");
			mCurUser = mDBHelper.getUserByName(mUserNameList.get(arg2),
					mUserList);
			if (null != mCurUser)
			{
				mImageLoader.loadImage(mHeaderView,mCurUser.getUserIcon(), new AsyncImageLoader.onLoadCompleteListener()
				{
					@Override
					public void onLoadSuccess(View view, Bitmap bmp, String url)
					{
						// TODO 自动生成的方法存根
						((ImageView)view).setImageDrawable(ImageUtil.BMP2Drawable(bmp));
					}

					@Override
					public void onLaodFail(View view, String url)
					{
						// TODO 自动生成的方法存根
						((ImageView)view).setImageResource(R.drawable.login_user_ic);
					}
				});
			}
		}

		public void onNothingSelected(AdapterView<?> arg0)
		{

		}
	}

	class AuthListener implements WeiboAuthListener
	{
		@Override
		public void onComplete(Bundle values)
		{
			if (null == values)
			{
				Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT)
						.show();
				return;
			}
			String code = values.getString("code");
			if (TextUtils.isEmpty(code))
			{
				Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT)
						.show();
				return;
			}
			LogUtil.d(TAG, "Success to get code");
			mCode = code;
			fetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET);
		}

		@Override
		public void onCancel()
		{
			Toast.makeText(LoginActivity.this, "授权取消", Toast.LENGTH_LONG)
					.show();
		}

		@Override
		public void onWeiboException(WeiboException e)
		{
			UIUtils.showToast(LoginActivity.this,
					"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG);
		}
	}

}

主要逻辑如下:

(1)初始化:登录界面载入时,先到数据库中取出用户列表,把用户名加入到Spinner中,然后通过 SharedPreferences 获取最近登录过的用户,

                        SharedPreferences sp = getSharedPreferences("lastUser",Activity.MODE_PRIVATE);
                        String name = sp.getString("lastUser", "");

                        然后让Spinner选中相应的用户,然后在SpinnerSelectedListener  中保存获取当前用户信息,异步加载用户头像。
(2)添加授权: 点击添加授权按钮后,就进入授权界面了,获取到code后,再获取token,然后保存用户的相应信息到数据库,然后把当前用户选择为刚刚授权成功的账号。

(3)退出  :点击退出按钮直接退出程序或者在2秒内点击返回键。

(4)注销账号:功能还没实现。

(5)登录 :点击登录按钮后就会进入到微博的主界面了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值