package com.xiaomi.xms.sales.ui;
import android.content.Intent;
import android.os.Handler;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.xiaomi.xms.sales.R;
import com.xiaomi.xms.sales.model.Tags;
import com.xiaomi.xms.sales.util.Constants;
import com.xiaomi.xms.sales.util.Device;
import com.xiaomi.xms.sales.util.LogUtil;
import com.xiaomi.xms.sales.util.Utils;
import com.xiaomi.xms.sales.widget.gallery.GestureDetector;
public class ActivityFragment extends BaseWebFragment {
private static final String TAG = "ActivityFragment";
private static final String BOTTOM_STYLE_BUTTON = "button";
private static final String BOTTOM_STYLE_BAR = "bar";
private LinearLayout mBottom;
private ImageView mBottomScrollBar;
private LinearLayout mBottomScrollButton;
private View mActivityContainer;
private GestureDetector mGestrueDetector;
// 活动相关变量
private boolean mHasActivity;
private String mPeviousActivityUrl;
private Handler mHandler = new Handler();
private String mCurrentBottomStyle;
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
private float mPreDistanceY;
private int mTotalScrollDistance;
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
LogUtil.d("MyGestureListener", "The distance y is:" + distanceY);
if (mPreDistanceY * distanceY > 0) {
int distanceYInPixel = (int) (distanceY * 3.2);
int totalScrollDistance = mTotalScrollDistance + distanceYInPixel;
if (totalScrollDistance < Device.DISPLAY_HEIGHT && totalScrollDistance > 0) {
mTotalScrollDistance = totalScrollDistance;
mActivityContainer.scrollBy(0, distanceYInPixel);
}
}
mPreDistanceY = distanceY;
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
LogUtil.d("MyGestureListener", "The velocityY is:" + velocityY);
if (velocityY < -5000) {
showActivity(false);
}
return true;
}
@Override
public boolean onUp(MotionEvent e) {
// 如果滑动举例超过屏幕高度的1/4,那么收起活动页
if (mTotalScrollDistance > (Device.DISPLAY_HEIGHT / 4)) {
showActivity(false);
final int dis = -mTotalScrollDistance;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mActivityContainer.scrollBy(0, dis);
}
}, 1100);
} else {
// 否则回到起始的位置
mActivityContainer.scrollBy(0, -mTotalScrollDistance);
}
mTotalScrollDistance = 0;
mPreDistanceY = 0;
return true;
}
}
public String getUrl() {
return mWebView.getUrl();
}
private WebViewLoadingListener mActivityWebViewLoadingListener = new WebViewLoadingListener() {
@Override
public void onLoadFinished() {
if (mHasActivity) {
showActivity(true);
mHasActivity = false;
}
}
};
public void setBottomBarStyle(final String style) {
mHandler.post(new Runnable() {
@Override
public void run() {
mCurrentBottomStyle = style;
if (BOTTOM_STYLE_BAR.equals(style)) {
mBottomScrollBar.setVisibility(View.VISIBLE);
mBottomScrollButton.setVisibility(View.GONE);
} else if (BOTTOM_STYLE_BUTTON.equals(style)) {
mBottomScrollBar.setVisibility(View.GONE);
mBottomScrollButton.setVisibility(View.VISIBLE);
}
}
});
}
public void initialize(View activityContainer) {
mActivityContainer = activityContainer;
mBottom = (LinearLayout) activityContainer.findViewById(R.id.activity_bottom);
mGestrueDetector = new GestureDetector(getActivity(), new MyGestureListener(), null, true);
mBottomScrollBar = (ImageView) activityContainer
.findViewById(R.id.activity_bottom_scroll_bar);
mBottomScrollButton = (LinearLayout) activityContainer
.findViewById(R.id.activity_bottom_scroll_button);
setBottomBarStyle(BOTTOM_STYLE_BUTTON);
mBottom.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestrueDetector.onTouchEvent(event);
}
});
mBottom.setOnClickListener(new OnClickListener() {
private static final int JUMPED_HEIGHT = 60;
@Override
public void onClick(View v) {
if (BOTTOM_STYLE_BAR.equals(mCurrentBottomStyle)) {
mActivityContainer.scrollBy(0, JUMPED_HEIGHT);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mActivityContainer.scrollBy(0, -JUMPED_HEIGHT);
}
}, 100);
} else if (BOTTOM_STYLE_BUTTON.equals(mCurrentBottomStyle)) {
showActivity(false);
}
}
});
setWebViewLoadingListener(mActivityWebViewLoadingListener);
}
@Override
protected int getLayoutId() {
return R.layout.activity_fragment;
}
@Override
public void onLogout() {
LogUtil.d(TAG, "User logout");
}
@Override
public void onLogin(String userId, String authToken, String security) {
LogUtil.d(TAG, "User login");
}
public void showActivity(boolean show) {
if (getActivity() == null) {
return;
}
if (show) {
if (!isActivityVisible()) {
// mActivityContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),R.anim.appear_from_top));
mActivityContainer.setVisibility(View.VISIBLE);
}
} else {
if (isActivityVisible()) {
// mActivityContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),R.anim.disappear_from_bottom));
mActivityContainer.setVisibility(View.GONE);
}
clearHistory();
}
}
/**
* 活动页是否可见
*/
public boolean isActivityVisible() {
return mActivityContainer.getVisibility() == View.VISIBLE;
}
public void onCheckActivityFinished(Intent callbackIntent) {
String url = callbackIntent.getStringExtra(Constants.Intent.EXTRA_ACTIVITY_URL);
String version = callbackIntent.getStringExtra(Constants.Intent.EXTRA_ACTIVITY_VERSION);
String type = callbackIntent.getStringExtra(Constants.Intent.EXTRA_ACTIVITY_TYPE);
boolean hasActivity = !TextUtils.isEmpty(url) && !TextUtils.isEmpty(version);
if (hasActivity) {
String prevVersion = Utils.Preference.getStringPref(getActivity(), Constants.Prefence.PREF_ACTIVITY_VERSION,
null);
Utils.Preference.setStringPref(getActivity(), Constants.Prefence.PREF_ACTIVITY_VERSION, version);
// 如果是同一个活动并且类型是预约,那么只弹出一次
if (TextUtils.equals(prevVersion, version)
&& TextUtils.equals(type, Tags.Activity.TYPE_RESERVE)) {
return;
}
mHasActivity = true;
// 如果之前的活动和现在活动页不一致,那么重新加载活动页
if (!TextUtils.equals(url, mPeviousActivityUrl)) {
loadUrl(url);
Utils.Preference.setStringPref(getActivity(), Constants.Prefence.PREF_ACTIVITY_URL, url);
} else {
// 如果与预先加载的活动页与最新活动一致,那么直接显示
LogUtil.d(TAG, "The same activity url: " + url);
showActivity(true);
}
} else {
Utils.Preference.removePref(getActivity(), Constants.Prefence.PREF_ACTIVITY_URL);
mHasActivity = false;
}
}
public void onCheckActivity() {
// 如果当前活动页不可见并且记录着上次缓存的活动地址,那么不管这个活动是否还在进行,都
// 先尝试加载。
mPeviousActivityUrl = Utils.Preference.getStringPref(getActivity(),
Constants.Prefence.PREF_ACTIVITY_URL, "");
if (!TextUtils.isEmpty(mPeviousActivityUrl)) {
loadUrl(mPeviousActivityUrl);
}
}
}