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(); } } }