package com.xiaomi.xms.sales.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.xiaomi.xms.sales.R;
import com.xiaomi.xms.sales.activity.BaseActivity;
import com.xiaomi.xms.sales.activity.CampaignActivity;
import com.xiaomi.xms.sales.activity.FCodeActivity;
import com.xiaomi.xms.sales.activity.MainActivity;
import com.xiaomi.xms.sales.activity.OrderListActivity;
import com.xiaomi.xms.sales.activity.ProductActivity;
import com.xiaomi.xms.sales.activity.ProductDetailsActivity;
import com.xiaomi.xms.sales.activity.ShoppingActivity;
import com.xiaomi.xms.sales.model.Tags;
import com.xiaomi.xms.sales.util.Constants;
import com.xiaomi.xms.sales.util.LogUtil;
import com.xiaomi.xms.sales.util.Utils;
import com.xiaomi.xms.sales.widget.BaseWebView;
import com.xiaomi.xms.sales.xmsf.account.LoginManager;
import com.xiaomi.xms.sales.xmsf.account.LoginManager.AccountListener;
import org.json.JSONException;
import org.json.JSONObject;
public abstract class BaseWebFragment extends BaseFragment implements AccountListener {
private final static String TAG = "BaseWebFragment";
private final static int FILECHOOSER_RESULTCODE = 1;
protected BaseWebView mWebView;
protected ProgressBar mProgressBar;
private WebViewLoadingListener mLoadingListener;
private Handler mHandler;
private ValueCallback<Uri> mUploadMessage;
public interface WebViewLoadingListener {
public void onLoadFinished();
}
public BaseWebFragment() {
LoginManager.getInstance().addLoginListener(this);
mHandler = new Handler();
}
@Override
public void onDestroy() {
super.onDestroy();
LoginManager.getInstance().removeLoginListener(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
mWebView = (BaseWebView) view.findViewById(R.id.browser);
initWebViewSettings();
mProgressBar = (ProgressBar) view.findViewById(R.id.browser_progress_bar);
return view;
}
protected void initWebViewSettings() {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setDatabaseEnabled(true);
String dir = getActivity().getApplicationContext()
.getDir("database", Context.MODE_PRIVATE).getPath();
mWebView.getSettings().setDatabasePath(dir);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.setWebViewClient(new ShopWebViewClient());
mWebView.setWebChromeClient(new ShopWebChromeClient());
mWebView.addJavascriptInterface(new WebEvent(), "WE");
mWebView.requestFocus();
}
protected abstract int getLayoutId();
public void setWebViewLoadingListener(WebViewLoadingListener l) {
mLoadingListener = l;
}
private class ShopWebViewClient extends WebViewClient {
private boolean mReceivedError;
@Override
public void onReceivedError(WebView view, int errorCode, String description,
String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mReceivedError = true;
LogUtil.w(TAG, "onReceivedError.");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 注意:如果页面加载失败,mLoadingListener不会触发,涉及所有webview,以后有变化再进行修改。
if (mLoadingListener != null && !mReceivedError) {
mLoadingListener.onLoadFinished();
}
LogUtil.w(TAG, "onPageFinished:" + url);
}
}
private class ShopWebChromeClient extends WebChromeClient {
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
startActivityForResult(Intent.createChooser(i, getString(R.string.web_choose_file)),
FILECHOOSER_RESULTCODE);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (mProgressBar == null) {
return;
}
mProgressBar.setProgress(progress);
if (progress == 100) {
mProgressBar.setVisibility(View.GONE);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage) {
return;
}
Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
: intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
public boolean handleBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return false;
}
@Override
public void onLogin(String userId, String authToken, String security) {
LogUtil.d(TAG, "event login");
mWebView.reload();
}
@Override
public void onInvalidAuthonToken() {
return;
}
@Override
public void onLogout() {
LogUtil.d(TAG, "event logout");
mWebView.reload();
}
public void loadUrl(String url) {
LogUtil.d(TAG, "loadUrl: " + url);
mWebView.loadUrl(url);
}
public void clearHistory() {
mWebView.clearHistory();
}
private class WebEvent {
private void closeWebView() {
LogUtil.d(TAG, "close Web");
Activity activity = getActivity();
if (null != activity) {
activity.finish();
}
}
public void logHTML(String html) {
LogUtil.d(TAG, "html:" + html);
}
public boolean trigger(String eventName, String data) {
LogUtil.d(TAG, "get event '" + eventName + "', data:" + data);
return handleEvent(eventName, data);
}
private boolean handleEvent(String event, String data) {
if (Constants.WebView.EVENT_LOGIN.equals(event)) {
LogUtil.d(TAG, "enter login");
return doLogin();
} else if (Constants.WebView.EVENT_SHOPPING.equals(event)) {
doViewShopping();
} else if (Constants.WebView.EVENT_PRODUCT.equals(event)) {
doViewProduct(data);
} else if (Constants.WebView.EVENT_NEW_WEB.equals(event)) {
doNewWeb(data);
} else if (Constants.WebView.EVENT_GO_HOME.equals(event)) {
doViewHome();
} else if (Constants.WebView.EVENT_FCODE.equals(event)) {
doFcode(data);
} else if (Constants.WebView.EVENT_ORDERLIST.equals(event)) {
doGoOrderList();
} else if (Constants.WebView.EVENT_CHECK_INSTALL.equals(event)) {
return true;
} else if (Constants.WebView.EVENT_CHECK_UPDATE.equals(event)) {
doCheckUpdate();
} else if (Constants.WebView.EVENT_IS_WIFI.equals(event)) {
return isWIFI();
} else if (Constants.WebView.EVENT_BOTTOM_STYLE.equals(event)) {
doChangeBottomStyle(data);
} else if (Constants.WebView.EVENT_PRODUCTLIST.equals(event)) {
return goProductList(data);
} else if (Constants.WebView.EVENT_MIPHONE_DETAIL.equals(event)) {
return goMiPhoneDetail(data);
} else if (Constants.WebView.EVENT_SHOW_TITLE_BAR.equals(event)) {
showTitleBar(data);
} else if (Constants.WebView.EVENT_HIDE_TITLE_BAR.equals(event)) {
hideTitleBar();
} else {
return false;
}
return true;
}
private void hideTitleBar() {
Activity activity = getActivity();
if (activity instanceof CampaignActivity) {
((CampaignActivity) activity).hideTitleBar();
}
}
private void showTitleBar(String title) {
Activity activity = getActivity();
if (activity instanceof CampaignActivity) {
((CampaignActivity) activity).showTitleBar(title);
}
}
private boolean goMiPhoneDetail(String jsonStr) {
String miPhoneId = null;
String miPhoneName = null;
try {
JSONObject json = new JSONObject(jsonStr);
miPhoneId = json.optString("id");
miPhoneName = json.optString("name");
} catch (JSONException e) {
e.printStackTrace();
return false;
}
Intent intent = new Intent(getActivity(), ProductDetailsActivity.class);
if (!TextUtils.isEmpty(miPhoneName)) {
intent.putExtra(Constants.Intent.EXTRA_MIPHONE_NAME, miPhoneName);
}
if (!TextUtils.isEmpty(miPhoneId)) {
intent.putExtra(Constants.Intent.EXTRA_PRODUCT_ID, miPhoneId);
intent.putExtra(Constants.Intent.EXTRA_IS_MIPHONE, true);
startActivity(intent);
return true;
}
return false;
}
private boolean goProductList(String jsonStr) {
String cateId = null;
String name = null;
try {
JSONObject json = new JSONObject(jsonStr);
cateId = json.optString("id");
name = json.optString("name");
} catch (JSONException e) {
e.printStackTrace();
return false;
}
Intent intent = new Intent(getActivity(), ProductActivity.class);
if (!TextUtils.isEmpty(cateId)) {
intent.putExtra(Constants.Intent.EXTRA_CATEGORY_ID, cateId);
}
if (!TextUtils.isEmpty(name)) {
intent.putExtra(Constants.Intent.EXTRA_CATEGORY_NAME, name);
}
getActivity().startActivity(intent);
return true;
}
private boolean isWIFI() {
return Utils.Network.isWifiConnected(getActivity());
}
private void doCheckUpdate() {
((BaseActivity) getActivity()).checkUpdate(true);
}
private void doChangeBottomStyle(String style) {
BaseActivity base = ((BaseActivity) getActivity());
if (base != null) {
if (base instanceof CampaignActivity) {
((CampaignActivity) base).setBottomBarStyle(style);
}
}
}
private void doGoOrderList() {
Intent intent = new Intent(getActivity(), OrderListActivity.class);
intent.setAction(Constants.Intent.ACTION_ORDER_LIST);
intent.putExtra(Constants.Intent.EXTRA_ORDER_LIST_TYPE, Tags.Order.ORDER_STATUS_OPEN);
startActivity(intent);
}
private void doFcode(String fcode) {
Intent intent = new Intent(getActivity(), FCodeActivity.class);
intent.putExtra(Constants.Intent.EXTRA_CHECKCODE_FCODE, fcode);
startActivity(intent);
}
private void doNewWeb(String url) {
Uri contentUrl = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, contentUrl);
startActivity(intent);
}
private void doViewShopping() {
Intent intent = new Intent(getActivity(), ShoppingActivity.class);
startActivity(intent);
}
private void doViewHome() {
closeWebView();
MainActivity.launchMain(getActivity(), MainActivity.FRAGMENT_TAG_HOME);
}
private boolean doLogin() {
LogUtil.d(TAG, "start activity");
if (LoginManager.getInstance().hasLogin()) {
return false;
}
((BaseActivity) getActivity()).gotoAccount();
return true;
}
private void doViewProduct(String productId) {
LogUtil.d(TAG, "view product detail");
Intent intent = new Intent(getActivity(), ProductDetailsActivity.class);
intent.putExtra(Constants.Intent.EXTRA_PRODUCT_ID, productId);
startActivity(intent);
}
}
@Override
public void onRefresh() {
if (isVisible()) {
LogUtil.d(TAG, getTag() + " fragment was refreshed");
mWebView.reload();
}
}
@Override
protected void onNetworkConnected(int type) {
mWebView.reload();
}
}