org.zywx.wbpalmstar.engine.EBrowserWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.zywx.wbpalmstar.engine.EBrowserWidget.java

Source

/*
 *  Copyright (C) 2014 The AppCan Open Source Project.
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
    
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
    
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package org.zywx.wbpalmstar.engine;

import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.ViewParent;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;

import com.slidingmenu.lib.SlidingMenu;

import org.json.JSONObject;
import org.zywx.wbpalmstar.base.BConstant;
import org.zywx.wbpalmstar.base.view.SwipeView;
import org.zywx.wbpalmstar.engine.external.Compat;
import org.zywx.wbpalmstar.engine.universalex.EUExWidget.SpaceClickListener;
import org.zywx.wbpalmstar.widgetone.dataservice.WWidgetData;

public class EBrowserWidget extends AbsoluteLayout {

    public static final int F_WINDOW_POOL_TYPE_ROOT = 0;
    public static final int F_WINDOW_POOL_TYPE_NEW = 1;

    public static final int F_WIDGET_POOL_TYPE_ROOT = 0;
    public static final int F_WIDGET_POOL_TYPE_NEW = 1;

    public static final int F_WIDGET_FLAG_NONE = 0x0;
    public static final int F_WIDGET_FLAG_NEW = 0x1;
    public static final int F_WIDGET_FLAG_INIT = 0x2;

    private int mFlag;
    private int mWidgetType;
    private boolean mWidgetStatusBG;

    private EBrowser mBrw;
    private WidgetHandler mWidgetLoop;
    private WWidgetData mWidgetData;
    private EWgtResultInfo mResultInfo;
    private EBrowserWindow mBroWindow;
    private Context mContext;
    private EWindowStack mEWindowStack;
    private EWindGarbHeap mGarbViewHeap;
    private String mPushNotifyWindName;
    private String mPushNotifyFunctionName;
    private SharedPreferences mPres;

    public EBrowserWidget(Context context, WWidgetData inWidget, EWgtResultInfo inResult) {
        super(context);
        mWidgetData = inWidget;
        mResultInfo = inResult;
        mContext = context;
        mEWindowStack = new EWindowStack();
        setAnimationCacheEnabled(false);
        setAlwaysDrawnWithCacheEnabled(false);
        EUtil.viewBaseSetting(this);
        mPres = mContext.getSharedPreferences("saveData", Context.MODE_MULTI_PROCESS);
        mPushNotifyWindName = mPres.getString(BConstant.F_PUSH_WIN_NAME, "");
        mPushNotifyFunctionName = mPres.getString(BConstant.F_PUSH_NOTI_FUN_NAME, "");
    }

    public boolean checkFlag(int flag) {

        return (mFlag & flag) != 0;
    }

    public void setFlag(int flag) {
        mFlag |= flag;
    }

    public void clearFlag() {

        mFlag &= F_WIDGET_FLAG_NONE;
    }

    public void init(EBrowser eBrw) {
        mBrw = eBrw;
        mWidgetLoop = new WidgetHandler(Looper.getMainLooper());
        EBrowserWindow rootWindow = new EBrowserWindow(mContext, this);
        AbsoluteLayout.LayoutParams parm = new AbsoluteLayout.LayoutParams(Compat.FILL, Compat.FILL, 0, 0);
        rootWindow.setLayoutParams(parm);
        rootWindow.setVisibility(VISIBLE);
        addView(rootWindow);
        rootWindow.setWindPoType(F_WINDOW_POOL_TYPE_ROOT);
        rootWindow.init(eBrw, null);
        rootWindow.setAbleToSwipe(false);
        windowStorage(rootWindow);
        mBroWindow = rootWindow;
    }

    public boolean checkWidgetType(int flag) {

        return mWidgetType == flag;
    }

    public void onCloseWindow(EBrowserWindow window) {
        //      Message msg = mWidgetLoop.obtainMessage();
        //      msg.what = F_WIDGET_HANDLER_WINDOW_CLOSE;
        //      msg.obj = window;
        //      mWidgetLoop.sendMessage(msg);

        closeWindow(window);
    }

    public void createSlidingWindow(EBrwViewEntry entry) {

        if (!entry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN)) {
            EBrowser.setFlag(EBrowser.F_BRW_FLAG_OPENING);
        }
        Message msg = mWidgetLoop.obtainMessage();
        msg.obj = entry;
        msg.what = F_WIDGET_HANDLER_WINDOW_CREATE_SLIDING;
        mWidgetLoop.sendMessage(msg);

    }

    public void createWindow(EBrowserWindow preWindow, EBrowserView target, EBrwViewEntry entry) {

        if (!entry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN)) {
            EBrowser.setFlag(EBrowser.F_BRW_FLAG_OPENING);
        }
        //      Message msg = mWidgetLoop.obtainMessage();
        //      msg.obj = entry;
        //      msg.what = F_WIDGET_HANDLER_WINDOW_CREATE;
        //      mWidgetLoop.sendMessage(msg);

        boolean isRootWidget = checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT);
        if (isRootWidget) {
            mBrw.windowOpenAnalytics(preWindow, entry);
        }

        createWindowInner(preWindow, target, entry);
    }

    public void createWindowInner(EBrowserWindow preWindow, EBrowserView target, EBrwViewEntry entry) {

        boolean hidden = entry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN);
        if (!hidden) {
            mEWindowStack.clearFractureLink();
        }
        if (checkWindow(entry)) {
            return;
        }
        EBrowserWindow newWindow = getInvalid();
        if (null != newWindow) {
            newWindow.setEBrowserWidget(EBrowserWidget.this);
        } else {
            newWindow = new EBrowserWindow(mContext, EBrowserWidget.this);
        }
        if (entry.checkFlag(EBrwViewEntry.F_FLAG_NAV_TYPE)) {
            EBrowserWindow.sNavFlag = true;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            newWindow.setX(0f);
        }
        boolean prevHidden = entry.checkFlag(EBrwViewEntry.F_FLAG_NOT_HIDDEN);
        //      if (entry.mBgColor==null){
        //         prevHidden=true;
        //      }
        final EBrowserWindow finalNewWindow = newWindow;
        newWindow.setOnViewClosedListener(new SwipeView.OnViewClosedListener() {
            @Override
            public void onViewClosed() {
                finalNewWindow.onCloseWindow(0, 0);
            }
        });
        newWindow.setPrevWindowWillHidden(prevHidden);
        newWindow.setDateType(entry.mDataType);
        newWindow.setWindPoType(F_WINDOW_POOL_TYPE_NEW);
        newWindow.setAnimId(entry.mAnimId);
        newWindow.setAnimDuration(entry.mAnimDuration);
        newWindow.setHidden(hidden);
        if (entry.checkFlag(EBrwViewEntry.F_FLAG_OAUTH)) {
            newWindow.setOAuth(true);
            newWindow.registUrlChangeNotify(entry.mPreWindName);
        }

        if (entry.checkFlag(EBrwViewEntry.F_FLAG_PREOP)) {
            newWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_OPPOP);
        }
        if (entry.checkFlag(EBrwViewEntry.F_FLAG_OPAQUE)) {
            newWindow.setBackgroundColor(0xFFFFFFFF);
        }
        LayoutParams parm = new LayoutParams(Compat.FILL, Compat.FILL, 0, 0);
        newWindow.setLayoutParams(parm);
        newWindow.init(mBrw, entry);
        newWindow.setWindowHWEnable(entry.mHardware);
        if (entry.checkFlag(EBrwViewEntry.F_FLAG_GESTURE)) {
            newWindow.setSupportZoom();
        }
        if (entry.checkFlag(EBrwViewEntry.F_FLAG_SHOULD_OP_SYS)) {
            newWindow.setShouldOpenUrlInSystem(true);
        }
        newWindow.setVisibility(INVISIBLE);
        newWindow.setQuery(EBrwViewEntry.VIEW_TYPE_MAIN, entry.mQuery);
        ViewParent parent = newWindow.getParent();
        if (null == parent) {
            addView(newWindow);
        }
        addWindow(newWindow, hidden);
        //        Delay ent = new Delay(newWindow, entry);
        //        sendMessageDelayed(
        //                obtainMessage(F_WIDGET_HANDLER_LOAD_DELAY, ent), 90);

        //        //
        //        int animId = newWindow.getAnimId();
        //        long duration = newWindow.getAnimDuration();
        //        Animation[] animPair = EBrowserAnimation.getAnimPair(animId, duration);
        //
        //        newWindow.startAnimation(animPair[0]);
        //        newWindow.setVisibility(VISIBLE);
        //        mBroWindow.startAnimation(animPair[1]);

        EBrwViewEntry enty = entry;
        EBrowserWindow wind = newWindow;
        if (EBrwViewEntry.isUrl(entry.mDataType)) {
            //               if (enty.checkFlag(EBrwViewEntry.F_FLAG_OBFUSCATION)) {
            if (getWidget().m_obfuscation == 1) {
                wind.needToEncrypt(enty.mData);
            } else {
                wind.start(enty.mData);
            }
        } else {
            wind.loadDataWithBaseURL(null, enty.mData, "text/html", "utf-8", null);
        }

    }

    public void setWindowFrame(EBrowserWindow window, int x, int y, int duration) {
        EViewEntry en = new EViewEntry();
        en.x = x;
        en.y = y;
        en.duration = duration;
        en.obj = window;
        Message msg = mWidgetLoop.obtainMessage(F_WIDGET_HANDLER_SET_WINDOW);
        msg.obj = en;
        msg.sendToTarget();
    }

    public EBrowserWindow getEBrowserWindow(String inWindowName) {

        return mEWindowStack.get(inWindowName);
    }

    public void notifyWindowStart(EBrowserWindow window, EBrowserView view, String url) {
        ;
    }

    public void notifyWindowFinish(EBrowserWindow window, EBrowserView view, String url) {
        if (!window.isHidden()) {
            boolean issame = window.checkFlag(EBrowserWindow.F_WINDOW_FLAG_SAME);
            boolean isnew = window.checkFlag(EBrowserWindow.F_WINDOW_FLAG_NEW);
            boolean isSliding = window.checkFlag(EBrowserWindow.F_WINDOW_FLAG_SLIDING_WIN);

            if (isSliding) {
                EBrowser.clearFlag();
                window.clearHistory();
            } else if (issame || isnew) {
                showOnly(window, SHOW_TYPE_NEXT);
                window.clearHistory();
            } else if (checkFlag(F_WIDGET_FLAG_NEW)) {
                mBrw.showWidget();
            } else if (checkFlag(F_WIDGET_FLAG_INIT)) {
                mBrw.hiddenShelter();
                if (mBrw.isFromPush()) {
                    mBrw.setFromPush(false);
                    mBrw.pushNotify(EBrowserActivity.APP_TYPE_START_FORGROUND);
                }
            }
            clearFlag();
        } else {
            window.clearHistory();
            clearFlag();
        }
    }

    public void onConfigurationChanged(Configuration newConfig) {
        mBroWindow.notifyScreenOrientationChange(newConfig);
    }

    private void closeWindow(EBrowserWindow window) {
        int anim = window.getAnimId();
        if (window.isAnimFill()) {
            anim = EBrowserAnimation.contrary(anim);
            window.setAnimId(anim);
        }
        if (window == mBroWindow) {
            showOnly(window, SHOW_TYPE_CLOSE);
        } else {
            putInvalid(window);
        }
        mEWindowStack.remove(window);
        //      putInvalid(window);
        EBrowser.clearFlag();
    }

    public void goMySpace(View view) {
        addView(view);
        TranslateAnimation anim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,
                Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f,
                Animation.RELATIVE_TO_PARENT, 0.0f);
        anim.setDuration(250);
        DecelerateInterpolator di = new DecelerateInterpolator();
        anim.setInterpolator(di);
        view.startAnimation(anim);
        mBroWindow.setVisibility(GONE);
    }

    public boolean exitMySpace(View view) {
        if (view.getParent() == this) {
            mBroWindow.setVisibility(VISIBLE);
            TranslateAnimation anim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 1.0f);
            anim.setDuration(300);
            DecelerateInterpolator di = new DecelerateInterpolator();
            anim.setInterpolator(di);
            view.startAnimation(anim);
            removeView(view);
            return true;
        }
        return false;
    }

    public boolean goBack() {
        if (mBroWindow.canGoBack()) {
            mBroWindow.goBack();
            return true;
        } else {
            if (mBroWindow.checkWindPoType(F_WINDOW_POOL_TYPE_NEW)) {
                mBroWindow.setAnimFill(true);
                closeWindow(mBroWindow);
                return true;
            } else {
                EBrowserWindow preWind = mEWindowStack.prev(mBroWindow);
                if (null != preWind) {
                    int aid = preWind.getAnimId();
                    aid = EBrowserAnimation.contrary(aid);
                    preWind.setAnimId(aid);
                    showOnly(preWind, SHOW_TYPE_PRE);
                    return true;
                }
            }
        }
        return false;
    }

    public void goForward() {
        if (mBroWindow.canGoForward()) {
            mBroWindow.goForward();
        }
    }

    public void windowGoBack(EBrowserWindow inWhich, int inAnimID, long duration) {
        if (inWhich != mBroWindow)
            return;
        EBrowserWindow preWind = mEWindowStack.prev(mBroWindow);
        if (null == preWind)
            return;
        int animId = inWhich.getAnimId();
        if (EBrowserAnimation.isFillAnim(inAnimID)) {
            inAnimID = EBrowserAnimation.contrary(animId);
            preWind.setAnimFill(true);
        }
        preWind.setAnimId(inAnimID);
        preWind.setAnimDuration(duration);
        Message msg = mWidgetLoop.obtainMessage();
        msg.what = F_WIDGET_HANDLER_WINDOW_HISTROY;
        msg.obj = preWind;
        msg.arg1 = 0;
        mWidgetLoop.sendMessage(msg);

        mBrw.windowBackAnalytics(preWind, mBroWindow);
    }

    public void windowGoForward(EBrowserWindow inWhich, int inAnimitionID, long duration) {
        if (inWhich != mBroWindow)
            return;
        EBrowserWindow nextWind = mEWindowStack.next(mBroWindow);
        if (null == nextWind)
            return;
        nextWind.setAnimId(inAnimitionID);
        nextWind.setAnimDuration(duration);
        Message msg = mWidgetLoop.obtainMessage();
        msg.what = F_WIDGET_HANDLER_WINDOW_HISTROY;
        msg.obj = nextWind;
        msg.arg1 = 1;
        mWidgetLoop.sendMessage(msg);

        mBrw.windowBackAnalytics(mBroWindow, nextWind);
    }

    public void insertWindowAboveWindow(String wName1, String wName2) {
        EBrowserWindow bv = mEWindowStack.get(wName1);
        EBrowserWindow bv1 = mEWindowStack.get(wName2);
        if (bv != null && bv1 != null) {
            EViewEntry ent = new EViewEntry();
            ent.obj = bv;
            ent.obj1 = bv1;
            Message msg = mWidgetLoop.obtainMessage();
            msg.what = F_WIDGET_HANDLER_INSERT_WINDOW_ABOVE_POPOVER;
            msg.obj = ent;
            mWidgetLoop.sendMessage(msg);
        }
    }

    public void insertWindowBelowWindow(String wName1, String wName2) {
        EBrowserWindow bv = mEWindowStack.get(wName1);
        EBrowserWindow bv1 = mEWindowStack.get(wName2);
        if (bv != null && bv1 != null) {
            EViewEntry ent = new EViewEntry();
            ent.obj = bv;
            ent.obj1 = bv1;
            Message msg = mWidgetLoop.obtainMessage();
            msg.what = F_WIDGET_HANDLER_INSERT_WINDOW_BELOW_POPOVER;
            msg.obj = ent;
            mWidgetLoop.sendMessage(msg);
        }
    }

    public void stopLoad() {

        mBroWindow.stopLoad();
    }

    public void refresh() {

        mBroWindow.refresh();
    }

    public boolean canGoBack() {

        return mBroWindow.canGoBack();
    }

    public boolean canGoForward() {

        return mBroWindow.canGoForward();
    }

    public void onAppPause() {
        mBroWindow.onAppPause();
        EBrowserWindow root = mEWindowStack.get("root");
        if (mBroWindow != root) {
            root.onAppPause();
        }
    }

    public void onAppStop() {
        mBroWindow.onAppStop();
        EBrowserWindow root = mEWindowStack.get("root");
        if (mBroWindow != root) {
            root.onAppStop();
        }
    }

    public void onAppResume() {
        mBroWindow.onAppResume();
        EBrowserWindow root = mEWindowStack.get("root");
        if (mBroWindow != root) {
            root.onAppResume();
        }
    }

    public void onWidgetResult(String callback, String inResultInfo) {
        mBroWindow.onWidgetResult(callback, inResultInfo);
    }

    public void onAppKeyPress(int keyCode) {
        mBroWindow.onAppKeyPress(keyCode);
    }

    public boolean isLockBackKey() {
        return mBroWindow.isLockBackKey();
    }

    public boolean isLockMenuKey() {
        return mBroWindow.isLockMenuKey();
    }

    public EBrowserView getEBrowserView() {
        return mBroWindow.getMainView();
    }

    public void start() {
        String indexUrl = mWidgetData.m_indexUrl;
        if (null != indexUrl && indexUrl.startsWith("http")) {
            mBroWindow.setBackgroundColor(0xFFFFFFFF);
        }
        mBroWindow.start(indexUrl);

        boolean isRootWidget = checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT);
        if (isRootWidget) {
            mBrw.startAnalytics(indexUrl);
        }
    }

    public WWidgetData getWidget() {

        return mWidgetData;
    }

    public WWidgetData getRootWidget() {

        return mBrw.getRootWidget();
    }

    public EWidgetStack getWidgetStack() {
        return mBrw.getWidgetStack();
    }

    public EWgtResultInfo getResult() {

        return mResultInfo;
    }

    public void evaluateScript(EBrowserView inWhich, String inWindowName, int inType, String inScript) {
        EBrowserWindow window = mEWindowStack.get(inWindowName);
        if (null != window) {
            window.evaluateScript(inWhich, null, inType, inScript);
        }
    }

    public void evaluatePopoverScript(EBrowserView inWhich, String inWndName, String inPopName, String inScript) {
        EBrowserWindow window = mEWindowStack.get(inWndName);
        if (null != window) {
            window.evaluatePopoverScript(inWhich, null, inPopName, inScript);
        }
    }

    public void evaluateMultiPopoverScript(EBrowserView inWhich, String inWndName, String inMultiPopName,
            String inPopName, String inScript) {
        EBrowserWindow window = mEWindowStack.get(inWndName);
        if (null != window) {
            window.evaluateMultiPopoverScript(inWhich, null, inMultiPopName, inPopName, inScript);
        }
    }

    public void setPushNotify(String windName, String function, String appId) {
        mPushNotifyWindName = windName;
        mPushNotifyFunctionName = function;
        SharedPreferences.Editor editor = mPres.edit();
        editor.putString(BConstant.F_PUSH_APPID, appId);
        editor.putString(BConstant.F_PUSH_WIN_NAME, windName);
        editor.putString(BConstant.F_PUSH_NOTI_FUN_NAME, function);
        editor.commit();
    }

    public void pushNotify(String info) {
        EBrowserWindow beNotify = mEWindowStack.get(mPushNotifyWindName);
        if (null != beNotify) {
            beNotify.pushNotify(mPushNotifyFunctionName, info);
        }
    }

    public void uexOnAuthorize(String id) {
        EBrowserWindow beNotify = mEWindowStack.get("root");
        beNotify.uexOnAuthorize(id);
    }

    public void dumpPageInfo(int type) {
        mBroWindow.dumpPageInfo(type);
    }

    public void notifyVisibilityChanged(int visibility) {

        mBroWindow.notifyVisibilityChanged(visibility);
    }

    public void setWidgetType(int inType) {
        mWidgetType = inType;
    }

    public int getWidgetType() {

        return mWidgetType;
    }

    public void setWidgetStatusBG(boolean statusBG) {
        mWidgetStatusBG = statusBG;
    }

    public boolean getWidgetStatusBG() {

        return mWidgetStatusBG;
    }

    public EWindowStack getWindowStack() {

        return mEWindowStack;
    }

    public static final int SHOW_TYPE_CLOSE = 0;
    public static final int SHOW_TYPE_NEXT = 1;
    public static final int SHOW_TYPE_PRE = -1;

    private void showOnly(EBrowserWindow inWhich, int type) {

        int animId = inWhich.getAnimId();
        long duration = inWhich.getAnimDuration();
        Animation[] animPair = EBrowserAnimation.getAnimPair(animId, duration);
        switch (type) {
        case SHOW_TYPE_NEXT:// next
            if (inWhich == mBroWindow)
                break;
            if (inWhich.checkFlag(EBrowserWindow.F_WINDOW_FLAG_NEW)
                    && !inWhich.checkFlag(EBrowserWindow.F_WINDOW_FLAG_SAME)) {
                if (null != animPair[0]) {
                    // animPair[0].setStartOffset(300);
                }
                if (null != animPair[1]) {
                    // animPair[1].setStartOffset(300);
                }
            }
            inWhich.startAnimation(animPair[0]);
            inWhich.setVisibility(VISIBLE);
            mBroWindow.startAnimation(animPair[1]);
            invalidate();

            if (EBrowserWindow.sNavFlag) {
                setPreWindVisible(mBroWindow, GONE);
            } else {
                if (!inWhich.isPrevWindowWillHidden()) {
                    mBroWindow.setVisibility(GONE);
                }
            }

            inWhich.notifyVisibilityChanged(0);
            inWhich.clearFlag();
            mBroWindow.notifyVisibilityChanged(1);
            mBroWindow = null;
            mBroWindow = inWhich;
            break;
        case SHOW_TYPE_PRE:// back
            if (inWhich == mBroWindow)
                break;
            inWhich.startAnimation(animPair[0]);
            inWhich.setVisibility(VISIBLE);
            inWhich.notifyVisibilityChanged(0);
            mBroWindow.startAnimation(animPair[1]);
            invalidate();
            mBroWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_WILL_REMOWE);
            mBroWindow.setVisibility(GONE);
            if (EBrowserWindow.sNavFlag) {
                setPreWindVisible(inWhich, VISIBLE);
            }
            mBroWindow.notifyVisibilityChanged(1);
            mBroWindow = null;
            mBroWindow = inWhich;
            break;
        case SHOW_TYPE_CLOSE:// close
            EBrowserWindow preWind = mEWindowStack.prev(inWhich);
            if (null == preWind) {
                preWind = mEWindowStack.next(inWhich);
                if (null == preWind)
                    break;
            }
            preWind.startAnimation(animPair[0]);
            preWind.setVisibility(VISIBLE);
            preWind.notifyVisibilityChanged(0);
            //         mBroWindow.startAnimation(animPair[1]);
            mBroWindow.closeWindowByAnimation(animPair[1]);

            if (EBrowserWindow.sNavFlag) {
                setPreWindVisible(preWind, VISIBLE);
            }
            //         invalidate();
            //         inWhich.setVisibility(GONE);

            boolean isRootWidget = checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT);
            if (isRootWidget) {
                mBrw.windowCloseAnalytics(preWind, mBroWindow);
            }

            mBroWindow = null;
            mBroWindow = preWind;
            break;
        }
        EBrowser.clearFlag();
    }

    private void setPreWindVisible(EBrowserWindow currentWind, int visible) {
        //??
        EBrowserWindow prePreWind = mEWindowStack.prev(currentWind);
        if (prePreWind != null) {
            prePreWind.setVisibility(visible);
        }
    }

    private boolean checkWindow(EBrwViewEntry inEntry) {
        EBrowserWindow window = mEWindowStack.contains(inEntry.mWindName);
        if (null != window) {
            window.setDateType(inEntry.mDataType);
            window.setAnimId(inEntry.mAnimId);
            window.setAnimDuration(inEntry.mAnimDuration);
            boolean hidden = inEntry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN);
            window.setHidden(hidden);
            boolean prevHidden = inEntry.checkFlag(EBrwViewEntry.F_FLAG_NOT_HIDDEN);
            window.setPrevWindowWillHidden(prevHidden);
            addWindow(window, hidden);
            boolean urlEmpty = inEntry.checkData();
            boolean isReload = inEntry.checkFlag(EBrwViewEntry.F_FLAG_RElOAD);
            if (!urlEmpty && !hidden && !isReload) {
                showOnly(window, SHOW_TYPE_NEXT);
                return true;
            }
            window.setFlag(EBrowserWindow.F_WINDOW_FLAG_SAME);
            if (inEntry.checkDataType(EBrwViewEntry.WINDOW_DATA_TYPE_URL)) {
                if (getWidget().m_obfuscation == 1) {
                    window.needToEncrypt(inEntry.mData);
                } else {
                    String url = window.getAbsoluteUrl();
                    boolean b1 = null != url && !url.equals(inEntry.mData);
                    boolean b2 = inEntry.checkFlag(EBrwViewEntry.F_FLAG_RElOAD);
                    if (b2 || b1) {
                        if (null != inEntry.mData && 0 != inEntry.mData.length()) {
                            window.start1(inEntry.mData);
                        } else {
                            window.start1(url);
                        }
                    } else {
                        if (!hidden) {
                            showOnly(window, SHOW_TYPE_NEXT);
                        }
                    }
                }
            } else {
                window.newLoadData(inEntry.mData);
            }
            return true;
        }
        return false;
    }

    private void addWindow(EBrowserWindow inWindow, boolean isHidden) {
        if (isHidden) {
            mEWindowStack.addOnlyMap(inWindow);
        } else {
            windowStorage(inWindow);
        }
        inWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_NEW);
    }

    private void windowStorage(EBrowserWindow inWindow) {

        mEWindowStack.add(inWindow);
    }

    public void putInvalid(EBrowserWindow view) {
        if (null == mGarbViewHeap) {
            mGarbViewHeap = new EWindGarbHeap();
        }
        mGarbViewHeap.put(view);
    }

    private EBrowserWindow getInvalid() {
        if (null != mGarbViewHeap) {
            return mGarbViewHeap.get();
        }
        return null;
    }

    public void destroy() {
        mWidgetLoop.clean();
        if (null != mGarbViewHeap) {
            mGarbViewHeap.destroy();
        }
        mEWindowStack.destroy();
        mResultInfo = null;
        EBrowser.clearFlag();
    }

    //   public static final int F_WIDGET_HANDLER_WINDOW_CREATE = 0;
    //   public static final int F_WIDGET_HANDLER_WINDOW_CLOSE = 1;
    public static final int F_WIDGET_HANDLER_WINDOW_HISTROY = 2;
    public static final int F_WIDGET_HANDLER_SHOW_DELAY = 3;
    public static final int F_WIDGET_HANDLER_LOAD_DELAY = 4;
    public static final int F_WIDGET_HANDLER_SET_WINDOW = 5;

    public static final int F_WIDGET_HANDLER_INSERT_WINDOW_ABOVE_POPOVER = 6;
    public static final int F_WIDGET_HANDLER_INSERT_WINDOW_BELOW_POPOVER = 7;
    public static final int F_WIDGET_HANDLER_WINDOW_CREATE_SLIDING = 8;

    public class WidgetHandler extends Handler {

        public WidgetHandler(Looper loop) {
            super(loop);
        }

        public void clean() {
            //         removeMessages(F_WIDGET_HANDLER_WINDOW_CREATE);
            //         removeMessages(F_WIDGET_HANDLER_WINDOW_CLOSE);
            removeMessages(F_WIDGET_HANDLER_WINDOW_HISTROY);
            removeMessages(F_WIDGET_HANDLER_SHOW_DELAY);
            removeMessages(F_WIDGET_HANDLER_LOAD_DELAY);
            removeMessages(F_WIDGET_HANDLER_SET_WINDOW);
            removeMessages(F_WIDGET_HANDLER_INSERT_WINDOW_ABOVE_POPOVER);
            removeMessages(F_WIDGET_HANDLER_INSERT_WINDOW_BELOW_POPOVER);
            removeMessages(F_WIDGET_HANDLER_WINDOW_CREATE_SLIDING);
        }

        public void handleMessage(Message msg) {
            switch (msg.what) {
            //         case F_WIDGET_HANDLER_WINDOW_CREATE:// create
            //            {
            //            EBrwViewEntry entry = (EBrwViewEntry) msg.obj;
            //            boolean hidden = entry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN);
            //            if (!hidden) {
            //               mEWindowStack.clearFractureLink();
            //            }
            //            if (checkWindow(entry)) {
            //               break;
            //            }
            //            EBrowserWindow newWindow = getInvalid();
            //            if (null != newWindow) {
            //               newWindow.setEBrowserWidget(EBrowserWidget.this);
            //            } else {
            //               newWindow = new EBrowserWindow(mContext,
            //                     EBrowserWidget.this);
            //            }
            //            boolean prevHidden = entry
            //                  .checkFlag(EBrwViewEntry.F_FLAG_NOT_HIDDEN);
            //            newWindow.setPrevWindowWillHidden(prevHidden);
            //            newWindow.setDateType(entry.mDataType);
            //            newWindow.setWindPoType(F_WINDOW_POOL_TYPE_NEW);
            //            newWindow.setAnimId(entry.mAnimId);
            //            newWindow.setAnimDuration(entry.mAnimDuration);
            //            newWindow.setHidden(hidden);
            //            if (entry.checkFlag(EBrwViewEntry.F_FLAG_OAUTH)) {
            //               newWindow.setOAuth(true);
            //               newWindow.registUrlChangeNotify(entry.mPreWindName);
            //            }
            //
            //            if (entry.checkFlag(EBrwViewEntry.F_FLAG_PREOP)) {
            //               newWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_OPPOP);
            //            }
            //            if (entry.checkFlag(EBrwViewEntry.F_FLAG_OPAQUE)) {
            //               newWindow.setBackgroundColor(0xFFFFFFFF);
            //            }
            //            AbsoluteLayout.LayoutParams parm = new AbsoluteLayout.LayoutParams(
            //                  Compat.FILL, Compat.FILL, 0, 0);
            //            newWindow.setLayoutParams(parm);
            //            newWindow.init(mBrw, entry);
            //            if (entry.checkFlag(EBrwViewEntry.F_FLAG_GESTURE)) {
            //               newWindow.setSupportZoom();
            //            }
            //            if (entry.checkFlag(EBrwViewEntry.F_FLAG_SHOULD_OP_SYS)) {
            //               newWindow.setShouldOpenUrlInSystem(true);
            //            }
            //            newWindow.setVisibility(INVISIBLE);
            //            newWindow.setQuery(EBrwViewEntry.VIEW_TYPE_MAIN, entry.mQuery);
            //            ViewParent parent = newWindow.getParent();
            //            if (null == parent) {
            //               addView(newWindow);
            //            }
            //            Bitmap map = mBrw.getImage(entry.mBgPath);
            //            if (null != map) {
            //               newWindow.setBackgroundDrawable(new BitmapDrawable(map));
            //            }
            //            addWindow(newWindow, hidden);
            //            Delay ent = new Delay(newWindow, entry);
            //            sendMessageDelayed(
            //                  obtainMessage(F_WIDGET_HANDLER_LOAD_DELAY, ent), 90);
            //            }
            //            break;
            case F_WIDGET_HANDLER_WINDOW_HISTROY:// window histroy
                if (0 == msg.arg1) {// back
                    showOnly((EBrowserWindow) msg.obj, SHOW_TYPE_PRE);
                } else { // forward
                    showOnly((EBrowserWindow) msg.obj, SHOW_TYPE_NEXT);
                }
                return;
            case F_WIDGET_HANDLER_SHOW_DELAY:
                showOnly((EBrowserWindow) msg.obj, msg.arg1);
                break;
            case F_WIDGET_HANDLER_LOAD_DELAY:
                Delay dely = (Delay) msg.obj;
                EBrwViewEntry enty = dely.mViewEnty;
                EBrowserWindow wind = dely.mWind;
                if (EBrwViewEntry.isUrl(enty.mDataType)) {
                    //               if (enty.checkFlag(EBrwViewEntry.F_FLAG_OBFUSCATION)) {
                    if (getWidget().m_obfuscation == 1) {
                        wind.needToEncrypt(enty.mData);
                    } else {
                        wind.start(enty.mData);
                    }
                } else {
                    wind.newLoadData(enty.mData);
                }
                break;
            case F_WIDGET_HANDLER_SET_WINDOW:
                final EViewEntry en = (EViewEntry) msg.obj;
                final EBrowserWindow window = (EBrowserWindow) en.obj;
                AbsoluteLayout.LayoutParams oldLp = (LayoutParams) window.getLayoutParams();
                ObjectAnimator animatorX = ObjectAnimator.ofFloat(window, "translationX", oldLp.x, en.x);
                ObjectAnimator animatorY = ObjectAnimator.ofFloat(window, "translationY", oldLp.y, en.y);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playTogether(animatorX, animatorY);
                animatorSet.setDuration(en.duration);
                animatorSet.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        window.onSetWindowFrameFinish();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });
                animatorSet.start();
                break;
            //         case F_WIDGET_HANDLER_WINDOW_CLOSE:// close window
            //            closeWindow((EBrowserWindow) msg.obj);
            //            break;
            case F_WIDGET_HANDLER_INSERT_WINDOW_ABOVE_POPOVER:
                EViewEntry c = (EViewEntry) msg.obj;
                View bn1 = (View) c.obj;
                View bn2 = (View) c.obj1;
                removeView(bn1);
                int i2 = indexOfChild(bn2);
                addView(bn1, i2 + 1);
                break;
            case F_WIDGET_HANDLER_INSERT_WINDOW_BELOW_POPOVER:
                EViewEntry d = (EViewEntry) msg.obj;
                View bo1 = (View) d.obj;
                View bo2 = (View) d.obj1;
                removeView(bo1);
                int j2 = indexOfChild(bo2);
                addView(bo1, j2);
                break;
            case F_WIDGET_HANDLER_WINDOW_CREATE_SLIDING: {
                EBrowserActivity activity = (EBrowserActivity) mContext;

                SlidingMenu slidingMenu = activity.globalSlidingMenu;

                if (slidingMenu == null) {
                    return;
                }

                EBrwViewEntry entry = (EBrwViewEntry) msg.obj;
                boolean hidden = entry.checkFlag(EBrwViewEntry.F_FLAG_HIDDEN);
                if (!hidden) {
                    mEWindowStack.clearFractureLink();
                }
                if (checkWindow(entry)) {
                    break;
                }
                EBrowserWindow newWindow = getInvalid();
                if (null != newWindow) {
                    newWindow.setEBrowserWidget(EBrowserWidget.this);
                } else {
                    newWindow = new EBrowserWindow(mContext, EBrowserWidget.this);
                }
                boolean prevHidden = entry.checkFlag(EBrwViewEntry.F_FLAG_NOT_HIDDEN);
                newWindow.setPrevWindowWillHidden(prevHidden);
                newWindow.setSwipeEnabled(false);
                newWindow.setDateType(entry.mDataType);
                newWindow.setWindPoType(F_WINDOW_POOL_TYPE_NEW);
                newWindow.setAnimId(entry.mAnimId);
                newWindow.setAnimDuration(entry.mAnimDuration);
                newWindow.setHidden(hidden);
                if (entry.checkFlag(EBrwViewEntry.F_FLAG_OAUTH)) {
                    newWindow.setOAuth(true);
                    newWindow.registUrlChangeNotify(entry.mPreWindName);
                }

                if (entry.checkFlag(EBrwViewEntry.F_FLAG_PREOP)) {
                    newWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_OPPOP);
                }
                if (entry.checkFlag(EBrwViewEntry.F_FLAG_OPAQUE)) {
                    newWindow.setBackgroundColor(0xFFFFFFFF);
                }
                FrameLayout.LayoutParams parm = new FrameLayout.LayoutParams(Compat.FILL, Compat.FILL);
                newWindow.setLayoutParams(parm);
                newWindow.init(mBrw, entry);
                if (entry.checkFlag(EBrwViewEntry.F_FLAG_GESTURE)) {
                    newWindow.setSupportZoom();
                }
                if (entry.checkFlag(EBrwViewEntry.F_FLAG_SHOULD_OP_SYS)) {
                    newWindow.setShouldOpenUrlInSystem(true);
                }
                newWindow.setVisibility(VISIBLE);
                newWindow.setQuery(EBrwViewEntry.VIEW_TYPE_MAIN, entry.mQuery);
                ViewParent parent = newWindow.getParent();
                if (null == parent) {

                    FrameLayout menuView = null;

                    if (entry.mWindName.equals(EBrowserWindow.rootLeftSlidingWinName)) {

                        slidingMenu.setMenu(newWindow);

                    } else if (entry.mWindName.equals(EBrowserWindow.rootRightSlidingWinName)) {

                        slidingMenu.setSecondaryMenu(newWindow);

                    }

                }

                //                windowStorage(newWindow);
                mEWindowStack.addSlidingWindMap(newWindow);
                newWindow.setFlag(EBrowserWindow.F_WINDOW_FLAG_SLIDING_WIN);

                //                Delay ent = new Delay(newWindow, entry);
                //                sendMessageDelayed(
                //                        obtainMessage(F_WIDGET_HANDLER_LOAD_DELAY, ent), 90);

                if (EBrwViewEntry.isUrl(entry.mDataType)) {
                    //               if (enty.checkFlag(EBrwViewEntry.F_FLAG_OBFUSCATION)) {
                    if (getWidget().m_obfuscation == 1) {
                        newWindow.needToEncrypt(entry.mData);
                    } else {
                        newWindow.start(entry.mData);
                    }
                } else {
                    newWindow.newLoadData(entry.mData);
                }
            }
                break;
            }
        }
    }

    class Delay {
        public EBrowserWindow mWind;
        public EBrwViewEntry mViewEnty;

        public Delay(EBrowserWindow wind, EBrwViewEntry enty) {
            mWind = wind;
            mViewEnty = enty;
        }
    }

    public void onLoadAppData(JSONObject json) {
        // TODO Auto-generated method stub
        ELinkedList<EBrowserWindow> eBrwWins = getWindowStack().getAll();
        eBrwWins.get(eBrwWins.size() - 1).onLoadAppData(json);
    }

    public void setSpaceEnable(SpaceClickListener listener) {
        mBrw.setSpaceEnable(listener);
    }

    public void onSlidingWindowStateChanged(int position) {
        EBrowserWindow root = mEWindowStack.get("root");
        if (null != root) {
            root.onSlidingWindowStateChanged(position);
        }
    }

    public void reloadWidget() {
        //Sliding window
        EBrowserWindow leftSlidingWin = mEWindowStack.getSlidingWind(EBrowserWindow.rootLeftSlidingWinName);
        if (leftSlidingWin != null) {
            leftSlidingWin.reloadWindow();
        }
        EBrowserWindow rightSlidingWin = mEWindowStack.getSlidingWind(EBrowserWindow.rootRightSlidingWinName);
        if (rightSlidingWin != null) {
            rightSlidingWin.reloadWindow();
        }
        // normal window
        ELinkedList<EBrowserWindow> eBrwWins = mEWindowStack.getAll();
        for (int i = 0; i < eBrwWins.size(); i++) {
            EBrowserWindow eBrwWin = eBrwWins.get(i);
            eBrwWin.reloadWindow();
        }
    }
}