/*
* 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);
}
}
}
}