package com.ztspeech.weibo.sdk.android;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.ztspeech.simutalk2.R;
import com.ztspeech.weibo.sdk.android.util.Utility;
/**
* 用来显示用户认证界面的dialog,封装了一个webview,通过redirect地址中的参数来获取accesstoken
*
* @author xiaowei6@staff.sina.com.cn
*
*/
public class WeiboDialog extends Dialog {
private static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
private static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
private static final String DIALOG_LOADING = "正在载入...";
private final static String TAG = "Weibo-WebView";
private String mUrl;
private WeiboAuthListener mListener;
private ProgressDialog mProgress;
private WebView mWebView;
private LinearLayout mContent;
public WeiboDialog(Context context, String url, WeiboAuthListener listener) {
super(context);
mUrl = url;
mListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mProgress = new ProgressDialog(getContext(), R.style.mydialog);
mProgress.requestWindowFeature(Window.FEATURE_NO_TITLE);
mProgress.setMessage(DIALOG_LOADING);
mProgress.setCanceledOnTouchOutside(false);
mContent = new LinearLayout(getContext());
mContent.setOrientation(LinearLayout.VERTICAL);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setUpWebView();
Display display = getWindow().getWindowManager().getDefaultDisplay();
float scale = getContext().getResources().getDisplayMetrics().density;
float[] dimensions = display.getWidth() < display.getHeight() ? DIMENSIONS_PORTRAIT : DIMENSIONS_LANDSCAPE;
addContentView(mContent, new FrameLayout.LayoutParams((int) (dimensions[0] * scale + 0.5f),
(int) (dimensions[1] * scale + 0.5f)));
}
private void setUpWebView() {
mWebView = new WebView(getContext());
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setWebViewClient(new WeiboDialog.WeiboWebViewClient());
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(mUrl);
mWebView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.requestFocus();
return false;
}
});
mWebView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.requestFocus();
return false;
}
});
FrameLayout.LayoutParams fill = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
mWebView.setLayoutParams(fill);
mContent.addView(mWebView);
}
protected void onBack() {
try {
mProgress.dismiss();
if (null != mWebView) {
mWebView.stopLoading();
mWebView.destroy();
}
} catch (Exception e) {
}
dismiss();
}
private void handleRedirectUrl(WebView view, String url) {
Bundle values = Utility.parseUrl(url);
String error = values.getString("error");
String error_code = values.getString("error_code");
if (error == null && error_code == null) {
mListener.onComplete(values);
} else if (error.equals("access_denied")) {
// 用户或授权服务器拒绝授予数据访问权限
mListener.onCancel();
} else {
if (error_code == null) {
mListener.onWeiboException(new WeiboException(error, 0));
} else {
mListener.onWeiboException(new WeiboException(error, Integer.parseInt(error_code)));
}
}
}
private class WeiboWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("sms:")) { // 针对webview里的短信注册流程,需要在此单独处理sms协议
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("address", url.replace("sms:", ""));
sendIntent.setType("vnd.android-dir/mms-sms");
WeiboDialog.this.getContext().startActivity(sendIntent);
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mListener.onError(new WeiboDialogError(description, errorCode, failingUrl));
WeiboDialog.this.dismiss();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(TAG, "onPageStarted URL: " + url);
if (url.startsWith(Weibo.redirecturl)) {
handleRedirectUrl(view, url);
view.stopLoading();
WeiboDialog.this.dismiss();
return;
}
super.onPageStarted(view, url, favicon);
mProgress.show();
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d(TAG, "onPageFinished URL: " + url);
super.onPageFinished(view, url);
if (mProgress.isShowing()) {
mProgress.dismiss();
}
mWebView.setVisibility(View.VISIBLE);
}
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
}
}