package com.qmusic.webdoengine;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import com.qmusic.common.BConstants;
import com.qmusic.common.IAsyncDataCallback;
import com.qmusic.uitls.BLog;
public class BWebHost {
static final String TAG = "BWebHost";
private FragmentActivity activity;
private Object jsInterface;
private BWebView webView;
private SparseArray<IAsyncDataCallback<Intent>> activityResultCallbacks;
private int activityRequestCode = 1000;// increase by one every time
private boolean animateWebView = true;
private boolean onDrawReady, animated;
public BWebHost(FragmentActivity activity) {
this.activity = activity;
activityResultCallbacks = new SparseArray<IAsyncDataCallback<Intent>>();
}
public FragmentActivity getHost() {
return activity;
}
public BWebView getWebView() {
return webView;
}
public void setWebView(BWebView webView) {
this.webView = webView;
}
public Object getJSInterface() {
return jsInterface;
}
public void setJSInterface(Object jsInterface) {
this.jsInterface = jsInterface;
}
public void setAnimateWebView(boolean animateWebView) {
this.animateWebView = animateWebView;
}
public void onCreate() {
if (animateWebView) {
final View decorView = activity.getWindow().getDecorView();
decorView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
onDrawReady = true;
if (webView != null) {
webView.postDelayed(new Runnable() {
@Override
public void run() {
showAnimate();
}
}, 50);
}
decorView.getViewTreeObserver().removeOnPreDrawListener(this);
return false;
}
});
}
}
public void onStart() {
if (webView != null) {
webView.sendJavascript("Qm.onStart();");
}
}
public void onResume() {
if (webView != null) {
webView.sendJavascript("Qm.onResume();");
webView.postDelayed(new Runnable() {
@Override
public void run() {
if (webView != null) {
webView.dispatchWindowVisibilityChanged(View.VISIBLE);
webView.invalidate();
}
}
}, 1000);
}
}
public void onPause() {
if (webView != null) {
webView.sendJavascript("Qm.onPause();");
}
}
public void onStop() {
if (webView != null) {
webView.sendJavascript("Qm.onStop();");
}
}
public void onDestory() {
// =========
if (webView != null) {
webView.sendJavascript("Qm.onDestory();");
// webView.clearView();
// webView.reload();
}
// =========
activity = null;
webView = null;
}
public void startActivityForResult(final Intent intent, final IAsyncDataCallback<Intent> callback) {
if (activity != null) {
activityResultCallbacks.put(activityRequestCode, callback);
activity.startActivityForResult(intent, activityRequestCode);
activityRequestCode++;
}
}
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
final IAsyncDataCallback<Intent> callback = activityResultCallbacks.get(requestCode);
if (callback != null) {
activityResultCallbacks.remove(requestCode);
callback.callback(resultCode, data);
}
}
public void showAnimate() {
webView.setVisibility(View.VISIBLE);
if (webView == null || animated || !webView.getState() || !onDrawReady) {
return;
}
animated = true;
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(500);
ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
scaleAnimation.setDuration(500);
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(scaleAnimation);
webView.startAnimation(animationSet);
}
/**
* call directly
*
* @param what
* @param arg1
* @param obj
* @return
*/
public final Object exec(int what, int arg1, Object obj) {
BLog.e(TAG, "should override exec");
return null;
}
/**
* use message queue
*
* @param what
* @param arg1
* @param obj
*/
public final void postMessage(final int what, final int arg1, final Object obj) {
webView.post(new Runnable() {
@Override
public void run() {
onMessage(what, arg1, obj);
}
});
}
/**
* only be called by sub-class
*
* @param what
* @param arg1
* @param obj
* @return
*/
protected Object onMessage(int what, int arg1, Object obj) {
switch (what) {
case BConstants.MSG_PAGE_START_LOADING: {
if (animateWebView) {
webView.setVisibility(View.INVISIBLE);
}
break;
}
case BConstants.MSG_PAGE_FINISH_LOADING: {
if (animateWebView) {
showAnimate();
}
break;
}
}
return null;
}
}