package com.mgw.member.factory;
import java.util.Stack;
import android.content.Context;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.mgw.member.bean.WebViewInfo;
import com.mgw.member.ui.activity.MainActivity;
import com.mgw.member.ui.fragment.BaseWebViewClient;
import com.mgw.member.ui.fragment.HomeFragment;
import com.mgw.member.uitls.LogUtils;
/**
* Web view factory class for creating {@link BrowserWebView}'s.
*/
public class MgwWebViewFactory implements WebViewFactory {
String TAG = MgwWebViewFactory.class.getSimpleName().toString();
public static final int TAB_HOME = 1;
public static final int TAB_NEWS = 2;
public static final int TAB_FIND = 3;
public static final int TAB_MYINFO = 4;
/** 记录home页的view栈 */
public volatile static Stack<View> mhome_webviews = null;
/** 记录home页的view栈 */
public volatile static Stack<WebViewInfo> mhome_webviewsinfos = null;
/** 记录info页的view栈 */
public volatile static Stack<View> mmyinfo_webviews = null;
/** 记录mall页的view栈 */
public volatile static Stack<View> mmall_webviews = null;
/** 记录mall页的view栈 */
public volatile static Stack<WebViewInfo> mmall_webviewinfos = null;
/** 记录news页的view栈 */
public volatile static Stack<View> mnews_webviews = null;
/** 记录find页的view栈 */
public volatile static Stack<View> mfind_wiews = null;
/**
* 添加view到堆栈
*/
public synchronized void addToHome(View view) {
LogUtils.i(TAG, "addToHome,viewcode=" + view.hashCode());
if (mhome_webviews == null) {
mhome_webviews = new Stack<View>();
mhome_webviews.add(view);
} else {
if (!mhome_webviews.contains(view)) {
mhome_webviews.add(view);
}
}
}
/**
* 添加view到堆栈
*/
public synchronized void addToHome2(WebViewInfo view) {
LogUtils.i(TAG, "addToHome2,viewcode=" + view.hashCode());
if (mhome_webviewsinfos == null) {
mhome_webviewsinfos = new Stack<WebViewInfo>();
mhome_webviewsinfos.add(view);
} else {
if (!mhome_webviewsinfos.contains(view)) {
mhome_webviewsinfos.add(view);
LogUtils.i(TAG, "addToHome2,contains viewcode=" + view.hashCode() + "mhome_webviewsinfos.size=" + mhome_webviewsinfos.size());
}
}
}
/**
* 添加view到堆栈
*/
public synchronized void addToMyInfo(View view) {
if (mmyinfo_webviews == null) {
mmyinfo_webviews = new Stack<View>();
mmyinfo_webviews.add(view);
} else {
if (!mmyinfo_webviews.contains(view)) {
mmyinfo_webviews.add(view);
}
}
LogUtils.i(TAG, "addToMyInfo,viewcode=" + view.hashCode());
}
/**
* 添加view到堆栈
*/
public synchronized void addToMall(View view) {
LogUtils.i(TAG, "addToMall,viewcode=" + view.hashCode());
if (mmall_webviews == null) {
mmall_webviews = new Stack<View>();
mmall_webviews.add(view);
} else {
if (!mmall_webviews.contains(view)) {
mmall_webviews.add(view);
LogUtils.i(TAG, "addToMall,contains viewcode=" + view.hashCode() + "mmall_webviews.size=" + mmall_webviews.size());
}
}
}
/**
* 添加view到堆栈
*/
public synchronized void addToMall2(WebViewInfo view) {
// LogUtils.i(TAG, "addToMall2,viewcode=" + view.hashCode());
if (mmall_webviewinfos == null) {
mmall_webviewinfos = new Stack<WebViewInfo>();
mmall_webviewinfos.add(view);
} else {
if (!mmall_webviewinfos.contains(view)) {
mmall_webviewinfos.add(view);
// LogUtils.i(TAG, "addToMall2,contains viewcode=" +
// view.hashCode() + "mmall_webviews.size=" +
// mmall_webviews.size());
}
}
}
/**
* 添加view到堆栈
*/
public synchronized void addToNews(View view) {
if (mnews_webviews == null) {
mnews_webviews = new Stack<View>();
mnews_webviews.add(view);
} else {
if (!mnews_webviews.contains(view)) {
mnews_webviews.add(view);
}
}
LogUtils.i(TAG, "addToNews,viewcode=" + view.hashCode());
}
/**
* 添加view到堆栈
*/
public synchronized void addToFind(View view) {
if (mfind_wiews == null) {
mfind_wiews = new Stack<View>();
mfind_wiews.add(view);
LogUtils.i(TAG, "addToFind,contains viewcode=" + view.hashCode() + "mfind_wiews.size=" + mfind_wiews.size());
} else {
if (!mfind_wiews.contains(view)) {
mfind_wiews.add(view);
LogUtils.i(TAG, "addToFind,contains viewcode=" + view.hashCode() + "mfind_wiews.size=" + mfind_wiews.size());
}
}
LogUtils.i(TAG, "addToFind,viewcode=" + view.hashCode());
}
// ===========================获取当前view
// -----getCurrentWebView===========================================================
/**
* 获取当前view(堆栈中最后一个压入的) home
*/
public View getCurrentWebView_home() {
View View = mhome_webviews.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的) myInfo
*/
public View getCurrentWebView_info() {
View View = mmyinfo_webviews.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的) mall
*/
public View getCurrentWebView_mall() {
View View = mmall_webviews.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的) mall2
*/
public WebViewInfo getCurrentWebView_mall2() {
WebViewInfo View = mmall_webviewinfos.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的)home2
*/
public WebViewInfo getCurrentWebView_home2() {
WebViewInfo View = mhome_webviewsinfos.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的) news
*/
public View getCurrentWebView_news() {
View View = mnews_webviews.lastElement();
return View;
}
/**
* 获取当前view(堆栈中最后一个压入的) find
*/
public View getCurrentWebView_find() {
View View = mfind_wiews.lastElement();
return View;
}
// =========================
// 获取最底层的view-----getBottomWebView=====================================================
/**
* 获取最底层的view(堆栈中最开始压入的) home
*/
public View getBottomWebView_home() {
View View = mhome_webviews.firstElement();
return View;
}
/**
* 获取最底层的view(堆栈中最开始压入的) mall
*/
public WebViewInfo getBottomWebView_home2() {
WebViewInfo View = mhome_webviewsinfos.firstElement();
return View;
}
/**
* 获取最底层的view(堆栈中最开始压入的) info
*/
public View getBottomWebView_info() {
View View = mmyinfo_webviews.firstElement();
return View;
}
/**
* 获取最底层的view(堆栈中最开始压入的) find
*/
public View getBottomWebView_find() {
View View = mfind_wiews.firstElement();
return View;
}
/**
* 获取最底层的view(堆栈中最开始压入的) mall
*/
public View getBottomWebView_mall() {
View View = mmall_webviews.firstElement();
return View;
}
/**
* 获取最底层的view(堆栈中最开始压入的) mall
*/
public WebViewInfo getBottomWebView_mall2() {
WebViewInfo View = mmall_webviewinfos.firstElement();
return View;
}
// ================================删除当前view(堆栈中最后一个压入的)
// ----finishWebView_home================================================================
/**
* 删除当前view(堆栈中最后一个压入的) home
*/
public synchronized void finishWebView_home() {
View View = mhome_webviews.lastElement();
finishWebView(View, mhome_webviews);
}
/**
* 删除当前view(堆栈中最后一个压入的) info
*/
public synchronized void finishWebView_info() {
View View = mmyinfo_webviews.lastElement();
finishWebView(View, mmyinfo_webviews);
}
/**
* 删除当前view(堆栈中最后一个压入的) mall
*/
public synchronized void finishWebView_mall() {
View View = mmall_webviews.lastElement();
finishWebView(View, mmall_webviews);
}
/**
* 删除当前view(堆栈中最后一个压入的) mall
*/
public synchronized void finishWebView_mall2() {
WebViewInfo View = mmall_webviewinfos.lastElement();
finishWebView(View, mmall_webviewinfos);
}
/**
* 删除当前view(堆栈中最后一个压入的) mall
*/
public synchronized void finishWebView_home2() {
WebViewInfo View = mhome_webviewsinfos.lastElement();
finishWebView(View, mhome_webviewsinfos);
}
/**
* 删除当前view(堆栈中最后一个压入的) info
*/
public synchronized void finishWebView_news() {
View View = mnews_webviews.lastElement();
finishWebView(View, mnews_webviews);
}
/**
* 删除当前view(堆栈中最后一个压入的) info
*/
public synchronized void finishWebView_find() {
View View = mfind_wiews.lastElement();
finishWebView(View, mfind_wiews);
}
// ================================删将自身删除,重新刷新view树
// ----finishWebView_home================================================================
/**
* 将自身删除,重新刷新view树
*/
public void finishWebView(View view, Stack<View> mhome_webviews2) {
if (view != null) {
mhome_webviews2.remove(view);
}
}
public void finishWebView(WebViewInfo view, Stack<WebViewInfo> mhome_webviews2) {
if (view != null) {
mhome_webviews2.remove(view);
}
}
public synchronized void finishWebView_home(View view) {
if (view != null) {
finishWebView(view, mhome_webviews);
}
}
public synchronized void finishWebView_home2(WebViewInfo view) {
if (view != null) {
finishWebView(view, mhome_webviewsinfos);
}
}
public synchronized void finishWebView_info(View view) {
if (view != null) {
finishWebView(view, mmyinfo_webviews);
}
}
public synchronized void finishWebView_mall(View view) {
if (view != null) {
finishWebView(view, mmall_webviews);
LogUtils.i(TAG, "finishWebView_mall,viewcode=" + view.hashCode() + ",mmall_webviews.size=" + mmall_webviews.size());
}
}
public synchronized void finishWebView_mall2(WebViewInfo view) {
if (view != null) {
finishWebView(view, mmall_webviewinfos);
// LogUtils.i(TAG, "finishWebView_mall2,viewcode=" + view.hashCode()
// + ",mmall_webviews.size=" + mmall_webviews.size());
}
}
public synchronized void finishWebView_find(View view) {
if (view != null) {
finishWebView(view, mfind_wiews);
LogUtils.i(TAG, "finishWebView_find,viewcode=" + view.hashCode() + ",mfind_wiews.size=" + mfind_wiews.size());
}
}
// ==============================获得指定webview 的上一个webview=================
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView_home(View webview) {
return getPreviousWebView(webview, mhome_webviews);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public WebViewInfo getPreviousWebView_home2(WebViewInfo webview) {
return getPreviousWebView(webview, mhome_webviewsinfos);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView_info(View webview) {
return getPreviousWebView(webview, mmyinfo_webviews);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView_mall(View webview) {
return getPreviousWebView(webview, mmall_webviews);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public WebViewInfo getPreviousWebView_mall2(WebViewInfo webview) {
return getPreviousWebView(webview, mmall_webviewinfos);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView_news(View webview) {
return getPreviousWebView(webview, mnews_webviews);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView_find(View webview) {
return getPreviousWebView(webview, mfind_wiews);
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public View getPreviousWebView(View webview, Stack<View> ss) {
View view = null;
int indexOf = ss.indexOf(webview);
if (indexOf > 0) {
view = ss.get(indexOf - 1);
}
return view;
}
/**
* 获得指定webview 的上一个webview
*
* @param WebView
* @return Created by huyan
*/
public WebViewInfo getPreviousWebView(WebViewInfo webview, Stack<WebViewInfo> ss) {
WebViewInfo view = null;
int indexOf = ss.indexOf(webview);
if (indexOf > 0) {
view = ss.get(indexOf - 1);
}
return view;
}
// ============================================================
public synchronized void clearWebVector() {
if (mhome_webviews != null) {
mhome_webviews.clear();
mhome_webviews = null;
}
if (mhome_webviewsinfos != null) {
mhome_webviewsinfos.clear();
mhome_webviewsinfos = null;
}
if (mnews_webviews != null) {
mnews_webviews.clear();
mnews_webviews = null;
}
if (mfind_wiews != null) {
mfind_wiews.clear();
mfind_wiews = null;
}
if (mmall_webviews != null) {
mmall_webviews.clear();
mmall_webviews = null;
}
if (mmall_webviewinfos != null) {
mmall_webviewinfos.clear();
mmall_webviewinfos = null;
}
if (mmyinfo_webviews != null) {
mmyinfo_webviews.clear();
mmyinfo_webviews = null;
}
}
// ============================================================
public Stack<View> getHomeWebSize() {
return mhome_webviews;
}
public Stack<View> getMallWebSize() {
return mmall_webviews;
}
public Stack<WebViewInfo> getHomeWebinfoSize() {
return mhome_webviewsinfos;
}
public Stack<WebViewInfo> getMallWebinfoSize() {
return mmall_webviewinfos;
}
// =========================================================
private final Context mContext;
public static MgwWebViewFactory mInstance;
public MgwWebViewFactory(Context context) {
mContext = context;
}
public static MgwWebViewFactory getInstance(Context mContext) {
if (mInstance == null) {
mInstance = new MgwWebViewFactory(mContext);
}
return mInstance;
}
protected WebView instantiateWebView(Context mContext) {
return new WebView(mContext);
}
@Override
public WebView createSubWebView(boolean privateBrowsing) {
return createWebView(privateBrowsing);
}
@Override
public WebView createSubWebView(boolean privateBrowsing, Context mContext) {
WebView w = instantiateWebView(mContext);
initWebViewSettings(w);
return w;
}
public WebViewInfo createSubWebViewInfo(WebView view) {
WebViewInfo info = new WebViewInfo(view);
return info;
}
@Override
public WebView createWebView(boolean privateBrowsing) {
WebView w = instantiateWebView(mContext);
initWebViewSettings(w);
return w;
}
@Override
public WebView createWebView(boolean privateBrowsing, String url) {
WebView w = instantiateWebView(mContext);
w.loadUrl(url);
return null;
}
/**
* 初始化settings
*
* @param w
* Created by huyan
*/
protected void initWebViewSettings(WebView w) {
// w.setScrollbarFadingEnabled(true);
// w.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
// w.setMapTrackballToArrowKeys(false); // use trackball directly
// // Enable the built-in zoom
// w.getSettings().setBuiltInZoomControls(true);
// final PackageManager pm = mContext.getPackageManager();
// boolean supportsMultiTouch =
// pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)
// ||
// pm.hasSystemFeature(PackageManager.FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT);
// w.getSettings().setDisplayZoomControls(!supportsMultiTouch);
//
// // Add this WebView to the settings observer list and update the
// // settings
// final BrowserSettings s = BrowserSettings.getInstance();
// s.startManagingSettings(w.getSettings());
}
/**
* webview的父view下添加一个webview 并且将url显示
*
* @param view
* 点击url的webview
* @param url
* 路径
* @param MyWebViewClient_Mall
* 自定义的webviewClient Created by huyan
*/
public void showUrl2OhterWebView(WebView view, String url, BaseWebViewClient MyWebViewClient, String TAG) {
LogUtils.i(TAG + "showTwoPage-url=" + url + ",webview.hashcode=" + view.hashCode());
WebView webview2 = createWebView(true);
webViewSetting(webview2);
webview2.setWebViewClient(MyWebViewClient);
ViewGroup group = (ViewGroup) view.getParent();
if (group != null && group instanceof ViewGroup) {
group.addView(webview2);
}
// ViewUtils.requestLayoutParent(view, true);
switch (TAG) {
case "HomeFragment":
addToHome(webview2);
break;
case "NewsFragment":
break;
case "FindFragment":
addToFind(webview2);
break;
case "MallFragment":
addToMall(webview2);
break;
case "MyInfoFragment":
addToMyInfo(webview2);
break;
default:
break;
}
webview2.loadUrl(url);
}
/**
* goback;
*
* @param TAG
* Created by huyan
*/
public void goBackfromOhterWebview(String TAG, View fatherView) {
// int mmall_webviews = this.mmall_webviews.size();
// LogUtils.i(TAG + "hideErrorPage1" + mmall_webviews + "");
// 保留最底部的webview
switch (TAG) {
case "HomeFragment":
if (this.mhome_webviewsinfos.size() > 1) {
WebViewInfo webView2 = getCurrentWebView_home2();
WebViewInfo webView1 = getPreviousWebView_home2(webView2);
((FrameLayout) fatherView).addView(webView1.getmWebView());
((FrameLayout) fatherView).removeView(webView2.getmWebView());
finishWebView_home2(webView2);
}
LogUtils.i(TAG, "fgoBackfromOhterWebview mmall_webviewinfos.size=" + mhome_webviewsinfos.size());
break;
case "NewsFragment":
break;
case "FindFragment":
break;
case "MallFragment":
if (this.mmall_webviewinfos.size() > 1) {
WebViewInfo webView2 = getCurrentWebView_mall2();
WebViewInfo webView1 = getPreviousWebView_mall2(webView2);
((FrameLayout) fatherView).addView(webView1.getmWebView());
((FrameLayout) fatherView).removeView(webView2.getmWebView());
finishWebView_mall2(webView2);
}
LogUtils.i(TAG, "fgoBackfromOhterWebview mmall_webviewinfos.size=" + mmall_webviewinfos.size());
break;
case "MyInfoFragment":
break;
default:
break;
}
// if (this.mmall_webviews.size() > 1) {
// View webView2 = getCurrentWebView_mall();
// View webView1 = getPreviousWebView_mall(webView2);
// ViewUtils.removeSelfFromParent(webView2);
// finishWebView_mall(webView2);
// }
}
public void webViewSetting(final WebView webview) {
WebSettings settings = webview.getSettings();
// 适应屏幕
settings.setUseWideViewPort(true);
settings.setSupportZoom(true);
settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
FrameLayout.LayoutParams mWebViewLP = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
webview.setLayoutParams(mWebViewLP);
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webview.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) { //
// 表示按返回键
// if (mIsErrorPage) {
// //hideErrorPage(webview);
// }
webview.goBack(); // 后退
return true; // 已处理
}
}
return false;
}
});
}
/**
* 通过url查找webviewinfo
*
* @param url
* @return
*/
public synchronized WebViewInfo getWebViewFromUrl_mall2(String url) {
return getWebViewInfoFrom(url, mmall_webviewinfos);
}
/**
* 通过url查找webviewinfo
*
* @param WebView
* @return
*/
public synchronized WebViewInfo getWebViewInfoFromWebView_mall2(WebView webView) {
return getWebViewInfoFrom(webView, mmall_webviewinfos);
}
/**
* 通过url查找webviewinfo
*
* @param url
* @return
*/
public synchronized WebViewInfo getWebViewFromUrl_home2(String url) {
return getWebViewInfoFrom(url, mhome_webviewsinfos);
}
/**
* 通过url查找webviewinfo
*
* @param WebView
* @return
*/
public synchronized WebViewInfo getWebViewInfoFromWebView_home2(WebView webView) {
return getWebViewInfoFrom(webView, mhome_webviewsinfos);
}
public WebViewInfo getWebViewInfoFrom(WebView webView, Stack<WebViewInfo> mmall_webviewinfos2) {
for (WebViewInfo info : mmall_webviewinfos2) {
if (webView.equals(info.getmWebView())) {
return info;
}
}
return null;
}
public WebViewInfo getWebViewInfoFrom(String url, Stack<WebViewInfo> mmall_webviewinfos2) {
for (WebViewInfo info : mmall_webviewinfos2) {
if (url.equals(info.getUrl())) {
return info;
}
}
return null;
}
public void add2Top(WebViewInfo fromUrl_mall2, Class clazz) {
Stack<WebViewInfo> stack = null;
switch (clazz.getSimpleName()) {
case "HomeFragment":
stack = mhome_webviewsinfos;
break;
case "NewsFragment":
break;
case "FindFragment":
break;
case "MallFragment":
stack = mmall_webviewinfos;
break;
default:
break;
}
add2StackTop(fromUrl_mall2, stack);
}
/**
* 添加到栈顶
*
* @param fromUrl_mall2
* 元素
* @param mmall_webviewinfos2
* 栈
*/
private void add2StackTop(WebViewInfo fromUrl_mall2, Stack<WebViewInfo> mmall_webviewinfos2) {
if (mmall_webviewinfos2.contains(fromUrl_mall2)) {
mmall_webviewinfos2.remove(fromUrl_mall2);
}
mmall_webviewinfos2.push(fromUrl_mall2);
}
}