package com.xiaomi.xms.sales.ui;
import android.content.Intent;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager.LayoutParams;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView;
import com.xiaomi.xms.sales.R;
import com.xiaomi.xms.sales.ShopApp;
import com.xiaomi.xms.sales.activity.BaseActivity;
import com.xiaomi.xms.sales.activity.CampaignActivity;
import com.xiaomi.xms.sales.activity.ProductDetailsActivity;
import com.xiaomi.xms.sales.adapter.PhoneTypeAdapter;
import com.xiaomi.xms.sales.adapter.ProductAdapter;
import com.xiaomi.xms.sales.loader.ImageLoader;
import com.xiaomi.xms.sales.loader.ProductLoader;
import com.xiaomi.xms.sales.model.Image;
import com.xiaomi.xms.sales.model.PhoneModelInfo;
import com.xiaomi.xms.sales.model.ProductInfo;
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.widget.BaseGridView;
import com.xiaomi.xms.sales.widget.BaseListView;
import com.xiaomi.xms.sales.widget.EmptyLoadingView;
import com.xiaomi.xms.sales.widget.PageScrollListener;
import java.util.ArrayList;
public class ProductFragment extends BaseFragment implements
LoaderCallbacks<ProductLoader.Result> {
private final static int PRODUCT_LOADER = 1;
private EmptyLoadingView mLoadingView;
private BaseGridView mGridView;
private BaseListView mPhoneFilterListView;
private ProductAdapter mProductAdapter;
private PhoneTypeAdapter mPhoneTypeAdapter;
public String mCategoryId;
private PopupWindow mPhoneFilterWindow;
private TextView mTitle;
private TextView mTitleFilterAll;
private ImageView mDropDownIcon;
private ImageView mChooseIcon;
private LinearLayout mCustomView;
private ArrayList<PhoneModelInfo> mPhoneModelInfo;
private String mFilterChoice;
private View mSortView, mSortDefault, mSortTime, mSortPrice, mSortComment, mSortPriceAscIcon,
mSortPriceDescIcon;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.product_fragment, container, false);
mGridView = (BaseGridView) view.findViewById(R.id.grid_view);
mProductAdapter = new ProductAdapter(getActivity(), true);// TODO:
// 根据load的结果决定是否有筛选
mGridView.setAdapter(mProductAdapter);
mGridView.setOnItemClickListener(mGridItemClickListner);
mLoadingView = (EmptyLoadingView) view.findViewById(R.id.loading);
mGridView.setOnScrollListener(mOnScrollListener);
mPhoneTypeAdapter = new PhoneTypeAdapter(getActivity());
mLoadingView.setEmptyText(R.string.filter_is_null);
newPhoneFilterView();
mSortView = view.findViewById(R.id.sort_view);
mSortView.setVisibility(View.VISIBLE);// TODO: 根据load的结果决定是否有筛选
mSortDefault = mSortView.findViewById(R.id.sort_default);
mSortDefault.setSelected(true);
mSortTime = mSortView.findViewById(R.id.sort_time);
mSortPrice = mSortView.findViewById(R.id.sort_price);
mSortComment = mSortView.findViewById(R.id.sort_comment);
mSortDefault.setOnClickListener(mOnClickListener);
mSortTime.setOnClickListener(mOnClickListener);
mSortPrice.setOnClickListener(mOnClickListener);
mSortComment.setOnClickListener(mOnClickListener);
mSortPriceAscIcon = view.findViewById(R.id.sort_price_icon_asc);
mSortPriceDescIcon = view.findViewById(R.id.sort_price_icon_desc);
Bundle bundle = getArguments();
if (bundle != null) {
mCategoryId = bundle.getString(Constants.Intent.EXTRA_CATEGORY_ID);
}
return view;
}
private OnClickListener mOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v == mSortDefault) {
if (v.isSelected()) {
return;
}
mSortPriceAscIcon.setVisibility(View.VISIBLE);
mSortPriceDescIcon.setVisibility(View.GONE);
mSortDefault.setSelected(true);
mSortTime.setSelected(false);
mSortPrice.setSelected(false);
mSortComment.setSelected(false);
((ProductLoader) mLoader).setSortType(ProductLoader.SORT_DEFAULT);
((ProductLoader) mLoader).setPage(1);
mLoader.forceLoad();
} else if (v == mSortTime) {
if (v.isSelected()) {
return;
}
mSortPriceAscIcon.setVisibility(View.VISIBLE);
mSortPriceDescIcon.setVisibility(View.GONE);
mSortDefault.setSelected(false);
mSortTime.setSelected(true);
mSortPrice.setSelected(false);
mSortComment.setSelected(false);
((ProductLoader) mLoader).setSortType(ProductLoader.SORT_TIME);
((ProductLoader) mLoader).setPage(1);
mLoader.forceLoad();
} else if (v == mSortPrice) {
String type = ProductLoader.SORT_PRICE_ASC;
if (mSortPrice.isSelected()) {
if (mSortPriceAscIcon.getVisibility() == View.VISIBLE) {
mSortPriceAscIcon.setVisibility(View.GONE);
mSortPriceDescIcon.setVisibility(View.VISIBLE);
type = ProductLoader.SORT_PRICE_DESC;
} else {
mSortPriceAscIcon.setVisibility(View.VISIBLE);
mSortPriceDescIcon.setVisibility(View.GONE);
}
}
mSortDefault.setSelected(false);
mSortTime.setSelected(false);
mSortPrice.setSelected(true);
mSortComment.setSelected(false);
((ProductLoader) mLoader).setSortType(type);
((ProductLoader) mLoader).setPage(1);
mLoader.forceLoad();
} else if (v == mSortComment) {
if (v.isSelected()) {
return;
}
mSortPriceAscIcon.setVisibility(View.VISIBLE);
mSortPriceDescIcon.setVisibility(View.GONE);
mSortDefault.setSelected(false);
mSortTime.setSelected(false);
mSortPrice.setSelected(false);
mSortComment.setSelected(true);
((ProductLoader) mLoader).setSortType(ProductLoader.SORT_COMMENT);
((ProductLoader) mLoader).setPage(1);
mLoader.forceLoad();
}
}
};
private OnScrollListener mOnScrollListener = new MyPageScrollListener(new Runnable() {
@Override
public void run() {
if (!mLoader.isLoading()) {
if (((ProductLoader) mLoader).hasNextPage()) {
mLoader.forceLoad();
}
}
}
});
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(PRODUCT_LOADER, null, this);
}
@SuppressWarnings("unchecked")
@Override
public Loader<ProductLoader.Result> onCreateLoader(int id, Bundle bundle) {
if (id == PRODUCT_LOADER) {
mLoader = new ProductLoader(getActivity(), mCategoryId);
mLoader.setProgressNotifiable(mLoadingView);
return (Loader<ProductLoader.Result>) mLoader;
}
return null;
}
@Override
public void onLoadFinished(Loader<ProductLoader.Result> loader, ProductLoader.Result data) {
mProductAdapter.updateData(data.mProductInfos);
if (!TextUtils.isEmpty(data.mCateName)) {
setCustomTitle(data.mCateName);
}
if (!data.mPhoneModelInfos.isEmpty()) {
if (TextUtils.isEmpty(mFilterChoice)) {
mFilterChoice = Tags.Phone.ALL_PHONE;
}
mPhoneModelInfo = data.mPhoneModelInfos;
mPhoneTypeAdapter.updateData(data.mPhoneModelInfos);
((ProductLoader) mLoader).setNeedPhoneModelTask(false);
mDropDownIcon.setVisibility(View.VISIBLE);
mCustomView.setOnClickListener(mOnFilterClickListener);
}
if (data.mProductInfos != null && !data.mProductInfos.isEmpty()
&& ((ProductLoader) mLoader).getPage() == 1
&& mGridView.getFirstVisiblePosition() != 0) {
mGridView.setAdapter(mProductAdapter);// 重新setAdapter仅仅是为了使GridView滑到顶部,因为调用setSelection()不起作用
}
}
@Override
public void onLoaderReset(Loader<ProductLoader.Result> loader) {
}
private OnItemClickListener mGridItemClickListner = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mProductAdapter.isHeaderItem(position)) {
return;
}
ProductInfo mProductInfo = (ProductInfo) mProductAdapter.getItem(position);
Intent intent = new Intent();
// 浏览器打开
if (Tags.Product.DISPLAY_BROWSER.equals(mProductInfo.getDisplayType())) {
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(mProductInfo.getUrl()));
} else if (Tags.Product.DISPLAY_WEB.equals(mProductInfo.getDisplayType())) {
// 应用中的Web界面打开
intent.setClass(getActivity(), CampaignActivity.class);
intent.putExtra(Constants.Intent.EXTRA_COMPAIGN_URL, mProductInfo.getUrl());
CampaignActivity.startActivityStandard((BaseActivity) getActivity(),
mProductInfo.getUrl());
return;
} else if (!TextUtils.isEmpty(mProductInfo.getProductId())) {
// 本地应用打开
intent.setClass(getActivity(), ProductDetailsActivity.class);
if (mProductInfo.isIsBatched()) {
// 如果是套餐
intent.putExtra(Constants.Intent.EXTRA_CONTAIN_ID, mProductInfo.getContainId());
}
intent.putExtra(Constants.Intent.EXTRA_PRODUCT_ID, mProductInfo.getProductId());
intent.putExtra(Constants.Intent.EXTRA_P_ID, mProductInfo.getPid());
if (!TextUtils.isEmpty(mProductInfo.getUrl())) {
intent.putExtra(Constants.Intent.EXTRA_IS_MIPHONE, true);
intent.putExtra(Constants.Intent.EXTRA_MIPHONE_NAME,
mProductInfo.getProductName());
}
}
getActivity().startActivity(intent);
}
};
private void newPhoneFilterView() {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
mCustomView = (LinearLayout) layoutInflater.inflate(R.layout.filter_product, null);
mTitle = (TextView) mCustomView.findViewById(R.id.bar_title);
mTitleFilterAll = (TextView) mCustomView.findViewById(R.id.filter_all);
mDropDownIcon = (ImageView) mCustomView.findViewById(R.id.choice_phone_type);
mChooseIcon = (ImageView) mCustomView.findViewById(R.id.filter_phone_type_img);
((BaseActivity) getActivity()).setLeftView(mCustomView);
}
private OnClickListener mOnFilterClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.screening_container:
showPhoneFilterList(v);
break;
default:
break;
}
}
};
private void showPhoneFilterList(View parent) {
if (mPhoneFilterWindow == null) {
LinearLayout view = (LinearLayout) LayoutInflater.from(getActivity())
.inflate(R.layout.phone_filter_list, null);
View v = LayoutInflater.from(getActivity()).inflate(R.layout.phone_type_item, null);
TextView typeText = (TextView) v.findViewById(R.id.phone_type_text);
ImageView typeImg = (ImageView) v.findViewById(R.id.phone_type_img);
typeText.setText(R.string.allphone);
typeImg.setImageDrawable(getResources().getDrawable(R.drawable.all_phone_icon));
mPhoneFilterListView = (BaseListView) view.findViewById(android.R.id.list);
mPhoneFilterListView.addHeaderView(v);
mPhoneFilterListView.setAdapter(mPhoneTypeAdapter);
mPhoneFilterListView.setOnItemClickListener(mListItemClickListner);
mPhoneFilterWindow = new PopupWindow(view, LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
// 修复点击蒙版区域时筛选list无法收起的BUG
LinearLayout popupLayout = (LinearLayout) view.findViewById(R.id.popup_layout);
popupLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mPhoneFilterWindow != null && mPhoneFilterWindow.isShowing()) {
mPhoneFilterWindow.dismiss();
}
}
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mPhoneFilterWindow != null && mPhoneFilterWindow.isShowing()) {
mPhoneFilterWindow.dismiss();
}
((ProductLoader) mLoader).setPhoneModel("");
((ProductLoader) mLoader).setPage(1);
mLoader.setNeedDatabase(true);
mLoader.forceLoad();
mDropDownIcon.setVisibility(View.VISIBLE);
mChooseIcon.setVisibility(View.GONE);
}
});
}
mPhoneFilterWindow.setBackgroundDrawable(new BitmapDrawable());
mPhoneFilterWindow.setTouchable(true);
mPhoneFilterWindow.setFocusable(true);
mPhoneFilterWindow.setOutsideTouchable(true);
mPhoneFilterWindow.setAnimationStyle(0);
mPhoneFilterWindow.showAsDropDown(parent);
mPhoneFilterWindow.update();
mPhoneFilterWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
rotateImage(mDropDownIcon, true);
}
});
rotateImage(mDropDownIcon, false);
}
private void rotateImage(ImageView view, boolean isRestore) {
Matrix matrix = new Matrix();
if (!isRestore) {
if (Device.DISPLAY_DENSITY == 480) {
matrix.setRotate(180, 17, 12);
} else if (Device.DISPLAY_DENSITY == 320 || Device.DISPLAY_DENSITY == 240) {
matrix.setRotate(180, 11, 8);
}
}
view.setImageMatrix(matrix);
view.invalidate();
}
private OnItemClickListener mListItemClickListner = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// String phoneModelSymbol = mPhoneModelInfo.get(position -
// 1).getPhoneSymbol();
String phoneModelCode = String
.valueOf(mPhoneModelInfo.get(position - 1).getPhoneCode());
Image image = mPhoneModelInfo.get(position - 1).getImage();
((ProductLoader) mLoader).setPhoneModel(phoneModelCode);
((ProductLoader) mLoader).setPage(1);
mLoader.setNeedDatabase(true);
mLoader.forceLoad();
mPhoneFilterWindow.dismiss();
mGridView.setSelection(0);
mFilterChoice = phoneModelCode;
mDropDownIcon.setVisibility(View.GONE);
mChooseIcon.setVisibility(View.VISIBLE);
ImageLoader.getInstance().loadImage(mChooseIcon, image, null);
setCustomTitle((String) mTitle.getText());
}
};
public void setCustomTitle(String categoryName) {
if (Tags.Phone.ALL_PHONE.equals(mFilterChoice)) {
mTitleFilterAll.setVisibility(View.VISIBLE);
} else {
mTitleFilterAll.setVisibility(View.GONE);
}
mTitle.setText(categoryName);
}
private class MyPageScrollListener extends PageScrollListener {
private int mLastYPostition = Integer.MAX_VALUE;
private int mMaxMargin;
private final int GRID_PADDING = (int) ShopApp.getContext().getResources()
.getDimension(R.dimen.grid_item_padding);
public MyPageScrollListener(Runnable callback) {
super(callback);
mMaxMargin = (int) -ShopApp.getContext().getResources()
.getDimension(R.dimen.product_grid_header_height);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
if (mSortView == null || mSortView.getVisibility() != View.VISIBLE) {
return;
}
View v = view.getChildAt(0);
if (v != null) {
int yPosition = -v.getTop();
if (firstVisibleItem >= ProductAdapter.HEADER_ITEM_NUM) {
yPosition += -mMaxMargin
+ (firstVisibleItem / ProductAdapter.HEADER_ITEM_NUM - 1)
* (v.getHeight() + GRID_PADDING);
}
if (mLastYPostition != Integer.MAX_VALUE) {
int dis = mLastYPostition - yPosition;
FrameLayout.LayoutParams lp = ((FrameLayout.LayoutParams) mSortView
.getLayoutParams());
if (lp.topMargin + dis < mMaxMargin) {
lp.topMargin = mMaxMargin;
} else if (lp.topMargin + dis > 0) {
lp.topMargin = 0;
} else {
lp.topMargin = lp.topMargin + dis;
}
mSortView.setLayoutParams(lp);
}
mLastYPostition = yPosition;
}
}
}
}