/*
* Copyright 2010 Renren, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.renren.api.connect.android.view;
import org.apache.http.util.EncodingUtils;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.renren.api.connect.android.R;
import com.renren.api.connect.android.Renren;
/**
* 把人人请求结果用Dialog形式显示给用户(如登录界面)。开发者不会直接使用该类。
*
* @author yong.li@opi-corp.com
*
*/
public class RenrenDialog extends Dialog {
private static final String LOG_TAG = "RenrenDialog";
private static final int RENREN_BLUE = 0xFF005EAC;
private static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
private static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
/**
* 验证过程被取消的错误码
*/
private static final String CODE_AUTH_CANCEL = "login_denied";
protected String mUrl;
protected RenrenDialogListener mListener;
private ProgressDialog progress;
protected WebView webView;
private LinearLayout content;
private TextView title;
private boolean showTitle = false;
private String mPostData;
private boolean isPost = false;
public RenrenDialog(Context context, String url,
RenrenDialogListener listener) {
this(context, url, listener, false);
}
/**
* 用post方法发起请求。
* @param context
* @param url
* @param postDatas post的参数
* @param listener
*/
public RenrenDialog(Context context, String url, String postDatas,
RenrenDialogListener listener) {
this(context, url, listener);
mPostData = postDatas;
isPost = true;
}
public RenrenDialog(Context context, String url,
RenrenDialogListener listener, boolean showTitle) {
super(context);
mUrl = url;
mListener = listener;
this.showTitle = showTitle;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
progress = new ProgressDialog(getContext());
progress.requestWindowFeature(Window.FEATURE_NO_TITLE);
progress.setMessage("Loading...");
content = new LinearLayout(getContext());
content.setOrientation(LinearLayout.VERTICAL);
requestWindowFeature(Window.FEATURE_NO_TITLE);
if (this.showTitle) {
setUpTitle();
}
setUpWebView();
Display display = getWindow().getWindowManager().getDefaultDisplay();
float scale = getContext().getResources().getDisplayMetrics().density;
float[] dimensions = display.getWidth() < display.getHeight() ? DIMENSIONS_PORTRAIT
: DIMENSIONS_LANDSCAPE;
addContentView(content, new FrameLayout.LayoutParams(
(int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1]
* scale + 0.5f)));
}
private void setUpTitle() {
Drawable icon = getContext().getResources().getDrawable(
R.drawable.renren_sdk_android_title_logo);
title = new TextView(getContext());
title.setText("与人人连接");
title.setTextColor(Color.WHITE);
title.setGravity(Gravity.CENTER_VERTICAL);
title.setTypeface(Typeface.DEFAULT_BOLD);
title.setBackgroundColor(RENREN_BLUE);
title.setBackgroundResource(R.drawable.renren_sdk_android_title_bg);
title.setCompoundDrawablePadding(6);
title.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
content.addView(title);
}
private void setUpWebView() {
webView = new WebView(getContext());
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new RenrenDialog.RenrenWebViewClient());
if (isPost) {
webView.postUrl(mUrl, EncodingUtils.getBytes(mPostData, "BASE64"));
} else {
webView.loadUrl(mUrl);
}
FrameLayout.LayoutParams fill = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
webView.setLayoutParams(fill);
content.addView(webView);
}
/**
* Reponse on the Back key click to close the authrization dialog and send
* back the Cancel message Added by Shaofeng Wang
* (shaofeng.wang@renren-inc.com)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView != null) {
webView.stopLoading();
}
if (progress != null) {
progress.dismiss();
}
RenrenDialog.this.dismiss();
mListener.onPageBegin(Renren.DEFAULT_REDIRECT_URI + "?error="
+ CODE_AUTH_CANCEL);
this.cancel();
}
return super.onKeyDown(keyCode, event);
}
private class RenrenWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(LOG_TAG, "Redirect URL: " + url);
int b = mListener.onPageBegin(url);
switch (b) {
case RenrenDialogListener.ACTION_PROCCESSED:
RenrenDialog.this.dismiss();
return true;
case RenrenDialogListener.ACTION_DIALOG_PROCCESS:
return false;
}
getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(LOG_TAG, "Webview loading URL: " + url);
boolean b = mListener.onPageStart(url);
if (b) {
view.stopLoading();
RenrenDialog.this.dismiss();
return;
}
super.onPageStarted(view, url, favicon);
progress.show();
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mListener.onReceivedError(errorCode, description, failingUrl);
progress.hide();
RenrenDialog.this.dismiss();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mListener.onPageFinished(url);
if (showTitle) {
String t = view.getTitle();
if (t != null && t.length() > 0) {
title.setText(t);
}
}
progress.hide();
}
}
@Override
protected void onStop() {
super.onStop();
if (progress != null) {
progress.dismiss();
}
}
}