/**
* Copyright 2010-present Facebook.
*
* 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 cn.bidaround.ytcore.social;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import cn.bidaround.ytcore.login.AuthActivity;
import cn.bidaround.ytcore.login.AuthListener;
import cn.bidaround.ytcore.util.Util;
public class WebDialog extends Dialog {
private static final int NO_PADDING_SCREEN_WIDTH = 480;
private static final int MAX_PADDING_SCREEN_WIDTH = 800;
private static final int NO_PADDING_SCREEN_HEIGHT = 800;
private static final int MAX_PADDING_SCREEN_HEIGHT = 1280;
private static final double MIN_SCALE_FACTOR = 0.5;
public static final int DEFAULT_THEME = android.R.style.Theme_Translucent_NoTitleBar;
private String expectedRedirectUrl;
private WebView webView;
private ProgressDialog spinner;
private FrameLayout contentFrameLayout;
private Bundle bundle;
private boolean finish = false;
private AuthListener listener;
private Context context;
private String url;
private OnAfterRequest afterRequest;
public WebDialog(Context context, String url, String redirectUrl, AuthListener listener, OnAfterRequest afterRequest) {
this(context, url, redirectUrl, DEFAULT_THEME, listener, afterRequest);
}
public WebDialog(Context context, String url, String redirectUrl, int theme, AuthListener listener, OnAfterRequest afterRequest) {
super(context, theme);
this.expectedRedirectUrl = redirectUrl;
this.listener = listener;
this.context = context;
this.url = url;
this.afterRequest = afterRequest;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
spinner = new ProgressDialog(getContext());
spinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
spinner.setMessage(getContext().getString(getContext().getResources().getIdentifier("yt_loading", "string", getContext().getPackageName())));
spinner.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
WebDialog.this.onCancel();
}
});
requestWindowFeature(Window.FEATURE_NO_TITLE);
contentFrameLayout = new FrameLayout(getContext());
calculateSize();
getWindow().setGravity(Gravity.CENTER);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
// spinner.show();
spinner.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
setUpWebView(0);
}
@Override
public void onBackPressed() {
super.onBackPressed();
onCancel();
}
private void onCancel(){
dismiss();
if(listener != null)
listener.onAuthCancel();
if(context instanceof AuthActivity)
((Activity)context).finish();
}
protected WebView getWebView() {
return webView;
}
private void calculateSize() {
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
int width = metrics.widthPixels < metrics.heightPixels ? metrics.widthPixels : metrics.heightPixels;
int height = metrics.widthPixels < metrics.heightPixels ? metrics.heightPixels : metrics.widthPixels;
int dialogWidth = Math.min(
getScaledSize(width, metrics.density, NO_PADDING_SCREEN_WIDTH, MAX_PADDING_SCREEN_WIDTH),
metrics.widthPixels);
int dialogHeight = Math.min(
getScaledSize(height, metrics.density, NO_PADDING_SCREEN_HEIGHT, MAX_PADDING_SCREEN_HEIGHT),
metrics.heightPixels);
getWindow().setLayout(dialogWidth, dialogHeight);
}
private int getScaledSize(int screenSize, float density, int noPaddingSize, int maxPaddingSize) {
int scaledSize = (int) ((float) screenSize / density);
double scaleFactor;
if (scaledSize <= noPaddingSize) {
scaleFactor = 1.0;
} else if (scaledSize >= maxPaddingSize) {
scaleFactor = MIN_SCALE_FACTOR;
} else {
scaleFactor = MIN_SCALE_FACTOR +
((double) (maxPaddingSize - scaledSize))
/ ((double) (maxPaddingSize - noPaddingSize))
* (1.0 - MIN_SCALE_FACTOR);
}
return (int) (screenSize * scaleFactor);
}
@SuppressWarnings("deprecation")
@SuppressLint("SetJavaScriptEnabled")
protected void setUpWebView(int margin) {
LinearLayout webViewContainer = new LinearLayout(getContext());
webView = new WebView(getContext()) {
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
try {
super.onWindowFocusChanged(hasWindowFocus);
} catch (NullPointerException e) {
}
}
};
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.setWebViewClient(new DialogWebViewClient());
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if(newProgress == 100)
if(!finish)
spinner.dismiss();
}
});
webView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
webView.setVisibility(View.INVISIBLE);
webView.getSettings().setSavePassword(false);
webView.getSettings().setSaveFormData(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
webViewContainer.setPadding(margin, margin, margin, margin);
webViewContainer.addView(webView);
contentFrameLayout.addView(webViewContainer);
setContentView(contentFrameLayout);
}
private class DialogWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
dismiss();
if(listener != null)
listener.onAuthFail();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (url.startsWith(WebDialog.this.expectedRedirectUrl)) {
Uri u = Uri.parse(url);
bundle = Util.parseUrlQueryString(u.getQuery());
bundle.putAll(Util.parseUrlQueryString(u.getFragment()));
finish = true;
if(afterRequest != null)
afterRequest.onAfterRequest(bundle);
// 以这个开头的又会进行重定向
if(!url.startsWith("https://open.t.qq.com/cgi-bin/oauth2/authorize"))
finish();
}
else
if(!spinner.isShowing())
spinner.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
contentFrameLayout.setBackgroundColor(Color.TRANSPARENT);
webView.setVisibility(View.VISIBLE);
}
}
private void finish(){
webView.stopLoading();
dismiss();
}
public interface OnAfterRequest{
public void onAfterRequest(Bundle bundle);
}
@Override
public void dismiss() {
if (webView != null) {
webView.stopLoading();
}
if (spinner.isShowing()) {
spinner.dismiss();
}
super.dismiss();
}
@Override
public void show() {
super.show();
spinner.show();
}
}