package com.mozu.mozuandroidinstoreassistant.app.product.loaders; import android.content.Context; import com.crashlytics.android.Crashlytics; import com.mozu.api.MozuApiContext; import com.mozu.api.contracts.productruntime.Product; import com.mozu.api.contracts.productruntime.ProductSearchResult; import com.mozu.api.resources.commerce.catalog.storefront.ProductSearchResultResource; import com.mozu.mozuandroidinstoreassistant.app.loaders.InternetConnectedAsyncTaskLoader; import java.util.ArrayList; import java.util.List; public class ProductSearchLoader extends InternetConnectedAsyncTaskLoader<List<Product>> { public static final String SORT_BY = "productname asc"; public static final String CATEGORY_FILTER = "categoryId eq "; private static final int ITEMS_PER_PAGE = 200; private List<Product> mProductList; private Integer mTenantId; private Integer mSiteId; private Integer mCategoryId; private int mCurrentPage; private int mTotalPages; private boolean mIsLoading; private String mQueryString; public ProductSearchLoader(Context context, Integer tenantId, Integer siteId, Integer categoryId, String queryString) { super(context); mTenantId = tenantId; mSiteId = siteId; mCategoryId = categoryId; mQueryString = queryString; init(); } private void init() { cancelLoad(); mCurrentPage = 0; mTotalPages = 0; mIsLoading = false; mProductList = new ArrayList<Product>(); } @Override protected void onForceLoad() { super.onForceLoad(); } @Override public List<Product> loadInBackground() { mIsLoading = true; super.loadInBackground(); if (mProductList == null) { init(); } mProductList.addAll(loadProductFromWeb()); mIsLoading = false; return mProductList; } @Override public void deliverResult(List<Product> data) { if (isReset()) return; if (isStarted()) super.deliverResult(data); } @Override protected void onStartLoading() { if (mProductList == null) { mProductList = new ArrayList<Product>(); } if (takeContentChanged()) forceLoad(); } @Override protected void onStopLoading() { mIsLoading = false; cancelLoad(); } @Override public void onCanceled(List<Product> data) { mIsLoading = false; super.onCanceled(data); } @Override protected void onReset() { onStopLoading(); mProductList = null; super.onReset(); } private List<Product> loadProductFromWeb() { List<Product> allProducts = new ArrayList<Product>(); ProductSearchResultResource searchResultResource = new ProductSearchResultResource(new MozuApiContext(mTenantId, mSiteId)); try { ProductSearchResult result = searchResultResource.search(mQueryString, mCategoryId == -1 || mCategoryId == 0 || mCategoryId == null ? null : CATEGORY_FILTER + String.valueOf(mCategoryId), null, null, null, null, null, null, null, null, null, null, null, SORT_BY, ITEMS_PER_PAGE, mCurrentPage * ITEMS_PER_PAGE, null,null,null,null,null,null); mTotalPages = result.getTotalCount() / ITEMS_PER_PAGE; mCurrentPage += 1; allProducts = result.getItems(); } catch (Exception e) { Crashlytics.logException(e); } return allProducts; } public boolean hasMoreResults() { return mCurrentPage < mTotalPages; } public boolean isLoading() { return mIsLoading; } public void setSearchQuery(String query) { mQueryString = query; } }