package com.tencent.weibo.ui;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.example.ipcplayer.R;
import com.example.ipcplayer.setting.SettingManager;
import com.example.ipcplayer.setting.SettingManagerFactory;
import com.example.ipcplayer.utils.LogUtil;
import com.tencent.weibo.oauthv2.OAuthV2;
import com.tencent.weibo.oauthv2.OAuthV2Client;
import com.weibo.net.WeiboAuthListener;
import com.weibo.net.WeiboException;
/**
* 腾讯微博授权界面
*
* @version 1.0
* @data 2012-8-23
*/
public class AuthTencentActivity extends Activity implements OnClickListener
{
public final static int RESULT_CODE = 2;
private static final String TAG = "OAuthV2AuthorizeWebView";
private OAuthV2 oAuth;
private SettingManager mSettingManager;
private String mUrl;
private WeiboAuthListener mListener;
private LoadingView mLoadingView;
private ImageButton mCloseBtn;
private ImageButton mRefreshBtn;
private WebView mWebView;
private TextView mTitleTxt;
private long mForegroundStartTime = 0;
private AuthTencentController mAuthTencentController;
private boolean mIsFirstLoading = true;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.auth_tencent);
getWindow().setBackgroundDrawableResource(R.color.list_bg_color);
mSettingManager = (SettingManager) (SettingManager) SettingManagerFactory.getComponent(getApplicationContext());
mSettingManager.setTencentAccessToken(null);
mSettingManager.setTencentOpenId(null);
mSettingManager.setTencentOpenKey(null);
Intent intent = this.getIntent();
oAuth = (OAuthV2) intent.getExtras().getSerializable("oauth");
mUrl = OAuthV2Client.generateImplicitGrantUrl(oAuth);
mIsFirstLoading = true;
setupViews();
mAuthTencentController = new AuthTencentController(getApplicationContext(), mHandler);
}
@Override
public void onResume() {
super.onResume();
mForegroundStartTime = System.currentTimeMillis();
}
@Override
public void onPause() {
super.onPause();
if (mAuthTencentController != null) {
mAuthTencentController.setAppForegroundTime(System.currentTimeMillis() - mForegroundStartTime);
}
}
private void setupViews()
{
mTitleTxt = (TextView)findViewById(R.id.title);
// mTitleTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mLoadingView = (LoadingView)findViewById(R.id.loading);
mLoadingView.setOnClickListener(this);
mCloseBtn = (ImageButton)findViewById(R.id.close);
mCloseBtn.setOnClickListener(this);
mRefreshBtn = (ImageButton)findViewById(R.id.refresh);
mRefreshBtn.setOnClickListener(this);
mWebView = (WebView)findViewById(R.id.webview);
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WeiboWebViewClient());
mWebView.loadUrl(mUrl);
mWebView.requestFocus();
mWebView.setVisibility(View.VISIBLE);
mLoadingView.startLoading();
}
private class WeiboWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogUtil.d(TAG, "Redirect URL: " + url);
// 待后台增加对默认重定向地址的支持后修改下面的逻辑
if (url.indexOf("access_token=") != -1) {
int start=url.indexOf("access_token=");
String responseData=url.substring(start);
LogUtil.d("responseData = " + responseData);
OAuthV2Client.parseAccessTokenAndOpenId(responseData, oAuth);
mSettingManager.setTencentAccessToken(responseData);
Intent intent = new Intent();
intent.putExtra("oauth", oAuth);
setResult(RESULT_CODE, intent);
view.destroyDrawingCache();
view.destroy();
finish();
return true;
}else if(url.indexOf("checkType=error") != -1){
if(mListener != null){
mListener.onCancel();
}
finish();
}else{
mWebView.loadUrl(mUrl);
}
return true;
}
/**
* 回调方法,当页面开始加载时执行
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
LogUtil.i(TAG, "WebView onPageStarted...");
LogUtil.i(TAG, "URL = " + url);
if (url.indexOf("access_token=") != -1) {
int start=url.indexOf("access_token=");
String responseData=url.substring(start);
LogUtil.d("responseData = " + responseData);
OAuthV2Client.parseAccessTokenAndOpenId(responseData, oAuth);
mSettingManager.setTencentAccessToken(responseData);
mSettingManager.setTencentOpenId(oAuth.getOpenid());
mSettingManager.setTencentOpenKey(oAuth.getOpenkey());
Intent intent = new Intent();
intent.putExtra("oauth", oAuth);
setResult(RESULT_CODE, intent);
view.destroyDrawingCache();
view.destroy();
mLoadingView.stopLoading();
finish();
return;
}else{
if(!mIsFirstLoading){
mLoadingView.setLoadingTextVisible(View.GONE);
mLoadingView.setDefaultImageViewVisible(View.GONE);
mLoadingView.startLoading();
}
if(mIsFirstLoading){
mIsFirstLoading = false;
}
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description,
String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mLoadingView.onError("加载失败...");
if(mListener != null){
mListener.onWeiboException(new WeiboException(errorCode));
}
}
@Override
public void onPageFinished(WebView view, String url)
{
// TODO Auto-generated method stub
super.onPageFinished(view, url);
mLoadingView.stopLoading();
mWebView.setVisibility(View.VISIBLE);
}
/*
* TODO Android2.2及以上版本才能使用该方法
* 目前https://open.t.qq.com中存在http资源会引起sslerror,待网站修正后可去掉该方法
*/
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if ((null != view.getUrl()) && (view.getUrl().startsWith("https://open.t.qq.com"))) {
handler.proceed();// 接受证书
} else {
handler.cancel(); // 默认的处理方式,WebView变成空白页
}
mLoadingView.onError("加载失败...");
// handleMessage(Message msg); 其他处理
}
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.close:
if(mListener != null)
{
mListener.onCancel();
}
finish();
break;
case R.id.refresh:
case R.id.empty_view:
mWebView.loadUrl(mUrl);
break;
}
}
}