/* * 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.annotation.SuppressLint; 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.text.TextUtils; import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; import org.json.JSONObject; import org.zywx.wbpalmstar.base.BConstant; import org.zywx.wbpalmstar.base.BDebug; import org.zywx.wbpalmstar.engine.external.Compat; import org.zywx.wbpalmstar.engine.universalex.EUExWidget.SpaceClickListener; import org.zywx.wbpalmstar.widgetone.dataservice.WWidgetData; public class EBrowserWidgetPool { private EBrowser mBrw; private EBrowserActivity mContext; private PoolHandler mWidPoolLoop; private FrameLayout mNativeWindow; private EBrowserAround mBrowserAround; private EWgtResultInfo mSpaceWidgetResu; private EWidgetStack mWgtStack; private WWidgetData mRootWidget; private EBrowserWidget mRootBrowserWidget; public EBrowserWidgetPool(EBrowser inBrw, FrameLayout window, EBrowserAround inShelter) { mBrw = inBrw; mNativeWindow = window; mBrowserAround = inShelter; mSpaceWidgetResu = new EWgtResultInfo(null, null); mWgtStack = new EWidgetStack(); mContext = (EBrowserActivity) window.getContext(); mWidPoolLoop = new PoolHandler(Looper.getMainLooper()); } public void init(WWidgetData inWidget) { mRootWidget = inWidget; EBrowserWidget rootWidget = new EBrowserWidget(mContext, inWidget, mSpaceWidgetResu); FrameLayout.LayoutParams parm = new FrameLayout.LayoutParams( Compat.FILL, Compat.FILL); rootWidget.setLayoutParams(parm); rootWidget.setVisibility(View.VISIBLE); mNativeWindow.addView(rootWidget); mRootBrowserWidget = rootWidget; rootWidget.init(mBrw); rootWidget.setWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT); rootWidget.setFlag(EBrowserWidget.F_WIDGET_FLAG_INIT); addWidget(rootWidget); } public void notifyHiddenShelter() { if (mBrowserAround.checkTimeFlag()) { Message msg = mWidPoolLoop.obtainMessage(); msg.what = F_WIDGET_POOL_LOOP_HIDDEN_STARTUP; mWidPoolLoop.sendMessage(msg); } else { mBrowserAround.setTimeFlag(true); } } protected void clean() { mWidPoolLoop.removeMessages(F_WIDGET_POOL_LOOP_START_WIDGET); mWidPoolLoop.removeMessages(F_WIDGET_POOL_LOOP_FINISH_WIDGET); mWidPoolLoop.removeMessages(F_WIDGET_POOL_LOOP_HIDDEN_STARTUP); mWidPoolLoop.removeMessages(F_WIDGET_POOL_LOOP_SPACE_ENABLE); mWidPoolLoop = null; int size = mWgtStack.length(); for (int i = 0; i < size; ++i) { mWgtStack.get(i).destroy(); } } public void showHover(boolean isInSubWidget) { mBrowserAround.showHover(isInSubWidget); } public void hiddenHover(boolean isInSubWidget) { mBrowserAround.hiddenHover(isInSubWidget); } public void addWidget(EBrowserWidget inBrwWidget) { mWgtStack.add(inBrwWidget); } public WWidgetData getRootWidget() { return mRootWidget; } public EWidgetStack getWidgetStack() { return mWgtStack; } public EBrowserWidget getWidget(String inWidgetNmae) { return mWgtStack.get(inWidgetNmae); } public EBrowserWidget getWidget(int index) { return mWgtStack.get(index); } public void pushNotify(String appType) { SharedPreferences pres = mContext.getSharedPreferences("saveData", Context.MODE_MULTI_PROCESS); String appId = pres.getString(BConstant.F_PUSH_APPID, ""); if (TextUtils.isEmpty(appId)) { mWgtStack.peek().pushNotify(appType); } else { EBrowserWidget widget = mWgtStack.get(appId); if (null != widget) { widget.pushNotify(appType); } else { mWgtStack.peek().pushNotify(appType); } } } public void uexOnAuthorize(String id) { mWgtStack.first().uexOnAuthorize(id); } public void startWidget(WWidgetData inData, EWgtResultInfo inResult) { if (checkWidget(inData, inResult)) { return; } WgtEnty obj = new WgtEnty(inData, inResult); Message msg = mWidPoolLoop.obtainMessage(); msg.what = F_WIDGET_POOL_LOOP_START_WIDGET; msg.obj = obj; mWidPoolLoop.sendMessage(msg); // wgt report AppCan.getInstance().widgetReport(inData, mContext); } public void start() { mWgtStack.peek().start(); } public void goMySpace() { BDebug.e("---------goMySpace has been moved-----------"); } public void exitMySpace() { } public boolean isSpaceShown() { return false; } private boolean checkWidget(WWidgetData inData, EWgtResultInfo inResult) { String key = inData.m_appId; EBrowserWidget wdgObj = mWgtStack.get(key); if (null != wdgObj) { if (wdgObj.getWidgetStatusBG()) { WgtEnty obj = new WgtEnty(inData, inResult); Message msg = mWidPoolLoop.obtainMessage(); msg.what = F_WIDGET_POOL_LOOP_RESTART_WIDGET; msg.obj = obj; mWidPoolLoop.sendMessage(msg); // //wgt report // WidgetOneApplication app = // (WidgetOneApplication)mContext.getApplicationContext(); // app.widgetReport(inData, mContext); } return true; } return false; } public void setMySpaceInfo(String inForResult, String inAnimiId, String inInfo) { int animId = EBrowserAnimation.ANIM_ID_5; try { animId = Integer.parseInt(inAnimiId); } catch (Exception e) { ; } mSpaceWidgetResu.setCallBack(inForResult); mSpaceWidgetResu.setAnimiId(animId); mSpaceWidgetResu.setOpenerInfo(inInfo); } public void showWidget() { final EBrowserWidget showWidget = mWgtStack.peek(); final EBrowserWidget hiddenWidget = mWgtStack.prev(); int animiId = 0; long duration = 0; EWgtResultInfo inResult = showWidget.getResult(); if (null != inResult) { animiId = inResult.getAnimiId(); duration = inResult.getDuration(); } Animation[] animPair = EBrowserAnimation.getAnimPair(animiId, duration); Animation showAnim = animPair[0]; Animation hiddenAnim = animPair[1]; hiddenAnim.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation animation) { } public void onAnimationRepeat(Animation animation) { } public void onAnimationEnd(Animation animation) { hiddenWidget.setVisibility(View.GONE); showWidget.notifyVisibilityChanged(0); hiddenWidget.notifyVisibilityChanged(1); showHover(true); WWidgetData wgtData = showWidget.getWidget(); int wgtOrientation = wgtData.m_orientation; mContext.changeConfiguration(wgtOrientation); } }); showWidget.setVisibility(View.VISIBLE); hiddenWidget.startAnimation(hiddenAnim); showWidget.startAnimation(showAnim); } public void goBack() { if (!mWgtStack.peek().goBack()) { closeWidget("", null, false, ""); } } private void closeWidget(String inResultInfo, String appId, boolean isWdgBG, String inAnimiId) { EBrowserWidget target = null; if (null != appId) { target = getWidget(appId); } else { target = mWgtStack.peek(); } if (null == target) { BDebug.e("EBrowserWidgetPool", "appId is not exsit!!!"); return; } if (target.checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_NEW)) { target.setWidgetStatusBG(isWdgBG); WgtEnty entry = new WgtEnty(null, null); entry.mObj = target; entry.mObj1 = inResultInfo; entry.inAnimiId = inAnimiId; Message msg = mWidPoolLoop.obtainMessage(); msg.what = F_WIDGET_POOL_LOOP_FINISH_WIDGET; msg.arg1 = 0; msg.obj = entry; mWidPoolLoop.sendMessage(msg); } else { ((EBrowserActivity) mContext).exitApp(true); } } public void finishWidget(String inResultInfo, String appId, boolean isWdgBG, String inAnimiId) { closeWidget(inResultInfo, appId, isWdgBG, inAnimiId); } private void closeCurrentWidget(WgtEnty entry) { EBrowser.clearFlag(); final EBrowserWidget outWidget; final EBrowserWidget inWidget; final String inResultInfo = (String) entry.mObj1; final String inAnimiId = (String) entry.inAnimiId; EBrowserWidget closeWgt = (EBrowserWidget) entry.mObj; if (null != closeWgt) { outWidget = closeWgt; int outIndex = mWgtStack.indexOf(outWidget); inWidget = mWgtStack.get(outIndex - 1); } else { outWidget = mWgtStack.peek(); inWidget = mWgtStack.prev(); } if (null == inWidget || null == outWidget) { return; } final EWgtResultInfo reInfo = outWidget.getResult(); int animiId = 0; long duration = 0; if (null != reInfo) { if (TextUtils.isEmpty(inAnimiId)) { animiId = reInfo.getContraryAnimiId(); duration = reInfo.getDuration(); } else { try { animiId = Integer.parseInt(inAnimiId); duration = reInfo.getDuration(); } catch (NumberFormatException e) { } } } Animation[] animPair = EBrowserAnimation.getAnimPair(animiId, duration); Animation inAnim = animPair[0]; Animation outAnim = animPair[1]; outAnim.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation animation) { } public void onAnimationRepeat(Animation animation) { } public void onAnimationEnd(Animation animation) { outWidget.removeAllViews(); outWidget.destroy(); mWgtStack.remove(outWidget); mNativeWindow.removeView(outWidget); inWidget.notifyVisibilityChanged(0); if (inWidget .checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT)) { showHover(false); } String callback = null; if (null != reInfo) { callback = reInfo.getCallBack(); } inWidget.onWidgetResult(callback, inResultInfo); WWidgetData wgtData = inWidget.getWidget(); int wgtOrientation = wgtData.m_orientation; mContext.changeConfiguration(wgtOrientation); } }); inWidget.setVisibility(View.VISIBLE); outWidget.startAnimation(outAnim); inWidget.startAnimation(inAnim); try { int versionA = Build.VERSION.SDK_INT; if (versionA == 19) { InputMethodManager imm = (InputMethodManager) mContext .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(((EBrowserActivity) mContext) .getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } catch (Exception e) { e.printStackTrace(); } } public void goForward() { mWgtStack.peek().goForward(); } public void stopLoad() { mWgtStack.peek().stopLoad(); } public void refresh() { mWgtStack.peek().refresh(); } @SuppressLint("NewApi") public void onConfigurationChanged(Configuration newConfig) { mWgtStack.peek().onConfigurationChanged(newConfig); } public void onAppPause() { if (!mWgtStack.curIsFirstWidget()) { mWgtStack.first().onAppPause(); } mWgtStack.peek().onAppPause(); } public void onAppStop() { if (!mWgtStack.curIsFirstWidget()) { mWgtStack.first().onAppStop(); } mWgtStack.peek().onAppStop(); } public void onAppResume() { if (!mWgtStack.curIsFirstWidget()) { mWgtStack.first().onAppResume(); } mWgtStack.peek().onAppResume(); } public void onAppKeyPress(int keyCode) { mWgtStack.peek().onAppKeyPress(keyCode); } public boolean isLockBackKey() { return mWgtStack.peek().isLockBackKey(); } public boolean isLockMenuKey() { return mWgtStack.peek().isLockMenuKey(); } public EBrowserView getEBrowserView() { return mWgtStack.peek().getEBrowserView(); } static final int F_WIDGET_POOL_LOOP_START_WIDGET = 0; static final int F_WIDGET_POOL_LOOP_FINISH_WIDGET = 1; static final int F_WIDGET_POOL_LOOP_HIDDEN_STARTUP = 2; static final int F_WIDGET_POOL_LOOP_RESTART_WIDGET = 3; static final int F_WIDGET_POOL_LOOP_SPACE_ENABLE = 4; class PoolHandler extends Handler { public PoolHandler(Looper loop) { super(loop); } @Override public void handleMessage(Message msg) { switch (msg.what) { case F_WIDGET_POOL_LOOP_START_WIDGET: { WgtEnty ms = (WgtEnty) msg.obj; EBrowserWidget newWidget = new EBrowserWidget(mContext, ms.m_data, ms.m_resultInfo); newWidget.init(mBrw); FrameLayout.LayoutParams parm = new FrameLayout.LayoutParams( Compat.FILL, Compat.FILL); newWidget.setLayoutParams(parm); newWidget.setVisibility(View.INVISIBLE); newWidget.setWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_NEW); newWidget.setFlag(EBrowserWidget.F_WIDGET_FLAG_NEW); mNativeWindow.addView(newWidget); addWidget(newWidget); newWidget.start(); } break; case F_WIDGET_POOL_LOOP_FINISH_WIDGET: { if (msg.arg1 == 0) { WgtEnty entry = (WgtEnty) msg.obj; EBrowserWidget currentWdgt = (EBrowserWidget) entry.mObj; if (currentWdgt.getWidgetStatusBG()) { mWgtStack.remove(mRootBrowserWidget); mWgtStack.add(mRootBrowserWidget); mNativeWindow.removeView(mRootBrowserWidget); mRootBrowserWidget.setVisibility(View.VISIBLE); mNativeWindow.addView(mRootBrowserWidget); // rootWidget.invalidate(); // ??????widget??????? for (int i = 0; i < mWgtStack.length(); i++) { EBrowserWidget tmpWdg = getWidget(i); boolean isRootWidget = tmpWdg .checkWidgetType(EBrowserWidget.F_WIDGET_POOL_TYPE_ROOT); if (!isRootWidget) { tmpWdg.setWidgetStatusBG(true); } } } else { closeCurrentWidget(entry); } } } break; case F_WIDGET_POOL_LOOP_HIDDEN_STARTUP: { mBrowserAround.hiddenSplashScreen(mRootWidget.m_spaceStatus); } break; case F_WIDGET_POOL_LOOP_RESTART_WIDGET: { WgtEnty ms = (WgtEnty) msg.obj; String key = ms.m_data.m_appId; EBrowserWidget widgetObj = mWgtStack.get(key); if (widgetObj.getWidgetStatusBG()) { widgetObj.setWidgetStatusBG(false); mWgtStack.remove(widgetObj); mWgtStack.add(widgetObj); mNativeWindow.removeView(widgetObj); widgetObj.setVisibility(View.VISIBLE); mNativeWindow.addView(widgetObj); // widgetObj.invalidate(); } } break; case F_WIDGET_POOL_LOOP_SPACE_ENABLE: { mBrowserAround.setSpaceEnable((SpaceClickListener) msg.obj); } break; } } } public static class WgtEnty { public WWidgetData m_data; public EWgtResultInfo m_resultInfo; public Object mObj; public Object mObj1; public Object inAnimiId; public WgtEnty(WWidgetData data, EWgtResultInfo resultInfo) { m_data = data; m_resultInfo = resultInfo; } } public void onLoadAppData(JSONObject json) { // TODO Auto-generated method stub mWgtStack.peek().onLoadAppData(json); } public void setSpaceEnable(SpaceClickListener listener) { Message msg = mWidPoolLoop.obtainMessage(); msg.what = F_WIDGET_POOL_LOOP_SPACE_ENABLE; msg.obj = listener; mWidPoolLoop.sendMessage(msg); } public void onSlidingWindowStateChanged(int position) { if (null != mWgtStack) { EBrowserWidget eBrWidget = mWgtStack.peek(); if (null != eBrWidget) { eBrWidget.onSlidingWindowStateChanged(position); } } } }