package com.mozu.mozuandroidinstoreassistant.app;
import android.app.LoaderManager;
import android.content.Intent;
import android.content.Loader;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.mozu.api.contracts.productruntime.Product;
import com.mozu.api.contracts.productruntime.ProductImage;
import com.mozu.mozuandroidinstoreassistant.app.models.ImageURLConverter;
import com.mozu.mozuandroidinstoreassistant.app.product.adapter.ProductDetailSectionPagerAdapter;
import com.mozu.mozuandroidinstoreassistant.app.product.loaders.ProductDetailLoader;
import com.mozu.mozuandroidinstoreassistant.app.settings.SettingsFragment;
import com.mozu.mozuandroidinstoreassistant.app.views.LoadingView;
import com.mozu.mozuandroidinstoreassistant.app.views.ProductDetailImageTransformation;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.viewpagerindicator.TabPageIndicator;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class ProductDetailActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<Product>, View.OnClickListener, SwipeRefreshLayout.OnRefreshListener {
public static final String PRODUCT_CODE_EXTRA_KEY = "PRODUCT_CODE";
public static final String CURRENT_TENANT_ID = "curTenantIdWhenActLoaded";
public static final String CURRENT_SITE_ID = "curSiteIdWhenActLoaded";
public static final String CURRENT_SITE_DOMAIN = "curSiteDomainWhenActLoaded";
public static final int LOADER_PRODUCT_DETAIL = 4;
public static final int FIRST_SUB_IMAGE = 1;
public static final int NUM_OF_COLUMNS_DIVISOR = 2;
private String mProductCode;
private ImageView mMainImageView;
private TextView mProductCodeTextView;
private TextView mProductName;
private Product mProduct;
private int mTenantId;
private int mSiteId;
private String mSiteDomain;
private ImageURLConverter mImageUrlConverter;
private LinearLayout mProductImagesLayout;
private List<ProductImage> mImages;
private HorizontalScrollView mHorizontalScrollView;
private ScrollView mVerticalScrollView;
private ViewPager mProductSectionViewPager;
private TabPageIndicator mTabIndicator;
private List<String> mTitles;
@InjectView(R.id.product_detail_container)
SwipeRefreshLayout mProductSwipeRefresh;
@InjectView(R.id.image_loading)
LoadingView mImageLoading;
private ProductDetailSectionPagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!getResources().getBoolean(R.bool.allow_portrait)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_product_detail);
ButterKnife.inject(this);
if (getIntent() != null) {
mProductCode = getIntent().getStringExtra(PRODUCT_CODE_EXTRA_KEY);
mTenantId = getIntent().getIntExtra(CURRENT_TENANT_ID, -1);
mSiteId = getIntent().getIntExtra(CURRENT_SITE_ID, -1);
mSiteDomain = getIntent().getStringExtra(CURRENT_SITE_DOMAIN);
} else if (savedInstanceState != null) {
mProductCode = savedInstanceState.getString(PRODUCT_CODE_EXTRA_KEY);
mTenantId = savedInstanceState.getInt(CURRENT_TENANT_ID, -1);
mSiteId = savedInstanceState.getInt(CURRENT_SITE_ID, -1);
mSiteDomain = savedInstanceState.getString(CURRENT_SITE_DOMAIN);
}
if (getActionBar() != null) {
getActionBar().setDisplayShowHomeEnabled(false);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setTitle("");
}
mMainImageView = (ImageView) findViewById(R.id.mainImageView);
mProductCodeTextView = (TextView) findViewById(R.id.productCode);
//mProductDescription = (TextView) findViewById(R.id.productDescription);
mProductName = (TextView) findViewById(R.id.productName);
mImageUrlConverter = new ImageURLConverter(mTenantId, mSiteId, mSiteDomain);
mProductImagesLayout = (LinearLayout) findViewById(R.id.product_images_layout);
mHorizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontal_image_preview);
mVerticalScrollView = (ScrollView) findViewById(R.id.vertical_image_preview);
mTitles = new ArrayList<String>();
mTitles.add(getString(R.string.overview_tab_name));
mTitles.add(getString(R.string.properties_tab_name));
mTitles.add(getString(R.string.shipping_tab_name));
mTitles.add(getString(R.string.inventory_tab_name));
mProductSectionViewPager = (ViewPager) findViewById(R.id.product_detail_sections_viewpager);
mTabIndicator = (TabPageIndicator) findViewById(R.id.product_detail_sections);
mMainImageView.setOnClickListener(this);
if (getLoaderManager().getLoader(LOADER_PRODUCT_DETAIL) == null) {
getLoaderManager().initLoader(LOADER_PRODUCT_DETAIL, null, this).forceLoad();
} else {
getLoaderManager().initLoader(LOADER_PRODUCT_DETAIL, null, this);
}
mProductSwipeRefresh.setOnRefreshListener(this);
mProductSwipeRefresh.setEnabled(false);
mProductSwipeRefresh.setColorScheme(R.color.first_color_swipe_refresh,
R.color.second_color_swipe_refresh,
R.color.third_color_swipe_refresh,
R.color.fourth_color_swipe_refresh);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString(PRODUCT_CODE_EXTRA_KEY, mProductCode);
outState.putInt(CURRENT_TENANT_ID, mTenantId);
outState.putInt(CURRENT_SITE_ID, mSiteId);
outState.putString(CURRENT_SITE_DOMAIN, mSiteDomain);
super.onSaveInstanceState(outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.product_detail, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
} else if (item.getItemId() == R.id.refresh_product_detail) {
onRefresh();
return true;
} else if (item.getItemId() == R.id.settings) {
SettingsFragment settingsFragment = SettingsFragment.getInstance();
settingsFragment.show(getFragmentManager(), "settings_frag");
}
return super.onOptionsItemSelected(item);
}
@Override
public Loader<Product> onCreateLoader(int id, Bundle args) {
if (id == LOADER_PRODUCT_DETAIL) {
mProductSwipeRefresh.setRefreshing(true);
return new ProductDetailLoader(this, mTenantId, mSiteId, mProductCode);
}
return null;
}
@Override
public void onLoadFinished(Loader<Product> loader, Product data) {
mProductSwipeRefresh.setRefreshing(false);
mProduct = data;
if (mProduct == null) {
return;
}
mImages = null;
if (mProduct.getContent() != null) {
mImages = mProduct.getContent().getProductImages();
}
boolean isLandscape = mHorizontalScrollView == null;
if (mImages != null && mProduct.getContent().getProductImages().size() > 0) {
mProductImagesLayout.removeAllViews();
mProductImagesLayout.addView(mMainImageView);
int productImageMax = getResources().getDimensionPixelSize(R.dimen.main_product_image_size);
Picasso.with(this)
.load(mImageUrlConverter.getFullImageUrl(mProduct.getContent().getProductImages().get(0).getImageUrl()))
.transform(new ProductDetailImageTransformation(isLandscape, productImageMax))
.into(mMainImageView, new Callback() {
@Override
public void onSuccess() {
mImageLoading.success();
}
@Override
public void onError() {
}
});
}
if (mImages != null && mProduct.getContent().getProductImages().size() > 1) {
if (mHorizontalScrollView != null) {
addSecondaryImagesToPortraitLayout(mProduct.getContent().getProductImages());
} else {
addSecondaryImagesToLandscapeLayout(mProduct.getContent().getProductImages());
}
}
mProductCodeTextView.setText(data.getProductCode());
if (mProduct.getContent() != null) {
mProductName.setText(mProduct.getContent().getProductName());
}
if (mAdapter == null) {
mAdapter = new ProductDetailSectionPagerAdapter(getFragmentManager(), mProduct, mTitles, mTenantId, mSiteId);
mProductSectionViewPager.setAdapter(mAdapter);
mTabIndicator.setViewPager(mProductSectionViewPager);
} else {
mAdapter.setData(mProduct);
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(Loader<Product> loader) {
}
private void addSecondaryImagesToPortraitLayout(List<ProductImage> productImageList) {
//go through each image
for (int i = FIRST_SUB_IMAGE; i <= Math.ceil(productImageList.size() / NUM_OF_COLUMNS_DIVISOR); i++) {
int imagewidth = (int) getResources().getDimensionPixelSize(R.dimen.smaller_product_image_size);
int imageHeight = (int) getResources().getDimensionPixelSize(R.dimen.smaller_product_image_size);
int firstImagePosition = i + (i - 1);
int secondImagePosition = 2 * i;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(params);
layout.setOrientation(LinearLayout.VERTICAL);
int margin = (int) getResources().getDimension(R.dimen.sub_product_image_margin);
LinearLayout firstImageLayout = new LinearLayout(this);
final ImageView imageViewTop = new ImageView(this);
LinearLayout.LayoutParams imageLayoutParams = new LinearLayout.LayoutParams(imagewidth, imageHeight);
imageLayoutParams.setMargins(0, margin, margin, 0);
TextView textViewPositionOne = new TextView(this);
textViewPositionOne.setText(String.valueOf(firstImagePosition));
textViewPositionOne.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
imageViewTop.setLayoutParams(imageLayoutParams);
firstImageLayout.setOnClickListener(this);
firstImageLayout.addView(textViewPositionOne);
firstImageLayout.addView(imageViewTop);
layout.addView(firstImageLayout);
Picasso.with(this)
.load(mImageUrlConverter.getFullImageUrl(mProduct.getContent().getProductImages().get(firstImagePosition).getImageUrl()))
.resize(imagewidth, imageHeight)
.centerInside()
.into(imageViewTop, new Callback() {
@Override
public void onSuccess() {
Bitmap bitmap = ((BitmapDrawable) imageViewTop.getDrawable()).getBitmap();
imageViewTop.setBackgroundColor(bitmap.getPixel(0, 0));
mImageLoading.success();
}
@Override
public void onError() {
}
});
if (productImageList.size() > secondImagePosition) {
LinearLayout secondImageLayout = new LinearLayout(this);
final ImageView imageViewBottom = new ImageView(this);
imageViewBottom.setLayoutParams(imageLayoutParams);
TextView textViewPositionTwo = new TextView(this);
textViewPositionTwo.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
textViewPositionTwo.setText(String.valueOf(secondImagePosition));
secondImageLayout.setOnClickListener(this);
secondImageLayout.addView(textViewPositionTwo);
secondImageLayout.addView(imageViewBottom);
layout.addView(secondImageLayout);
Picasso.with(this)
.load(mImageUrlConverter.getFullImageUrl(mProduct.getContent().getProductImages().get(secondImagePosition).getImageUrl()))
.resize(imagewidth, imageHeight)
.centerInside()
.into(imageViewBottom, new Callback() {
@Override
public void onSuccess() {
Bitmap bitmap = ((BitmapDrawable) imageViewBottom.getDrawable()).getBitmap();
imageViewBottom.setBackgroundColor(bitmap.getPixel(0, 0));
mImageLoading.success();
}
@Override
public void onError() {
}
});
}
mProductImagesLayout.addView(layout);
}
}
private void addSecondaryImagesToLandscapeLayout(List<ProductImage> productImageList) {
//go through each image
for (int i = FIRST_SUB_IMAGE; i <= Math.ceil(productImageList.size() / NUM_OF_COLUMNS_DIVISOR); i++) {
int imagewidth = (int) getResources().getDimensionPixelSize(R.dimen.smaller_product_image_size);
int imageHeight = (int) getResources().getDimensionPixelSize(R.dimen.smaller_product_image_size);
int firstImagePosition = i + (i - 1);
int secondImagePosition = 2 * i;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(params);
layout.setOrientation(LinearLayout.HORIZONTAL);
//add two image views if you can
int margin = (int) getResources().getDimension(R.dimen.sub_product_image_margin);
//add two text views with the position of the image in question
LinearLayout firstImageLayout = new LinearLayout(this);
TextView textViewPositionOne = new TextView(this);
textViewPositionOne.setText(String.valueOf(firstImagePosition));
textViewPositionOne.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
final ImageView imageViewTop = new ImageView(this);
LinearLayout.LayoutParams imageLayoutParams = new LinearLayout.LayoutParams(imagewidth, imageHeight);
imageLayoutParams.setMargins(margin, 0, 0, margin);
imageViewTop.setLayoutParams(imageLayoutParams);
firstImageLayout.setOnClickListener(this);
firstImageLayout.addView(textViewPositionOne);
firstImageLayout.addView(imageViewTop);
layout.addView(firstImageLayout);
Picasso.with(this)
.load(mImageUrlConverter.getFullImageUrl(mProduct.getContent().getProductImages().get(firstImagePosition).getImageUrl()))
.resize(imagewidth, imageHeight)
.centerInside()
.into(imageViewTop, new Callback() {
@Override
public void onSuccess() {
Bitmap bitmap = ((BitmapDrawable) imageViewTop.getDrawable()).getBitmap();
imageViewTop.setBackgroundColor(bitmap.getPixel(0, 0));
}
@Override
public void onError() {
}
});
if (productImageList.size() > secondImagePosition) {
LinearLayout secondImageLayout = new LinearLayout(this);
final ImageView imageViewBottom = new ImageView(this);
imageViewBottom.setLayoutParams(imageLayoutParams);
TextView textViewPositionTwo = new TextView(this);
textViewPositionTwo.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
textViewPositionTwo.setText(String.valueOf(secondImagePosition));
secondImageLayout.setOnClickListener(this);
secondImageLayout.addView(textViewPositionTwo);
secondImageLayout.addView(imageViewBottom);
layout.addView(secondImageLayout);
Picasso.with(this)
.load(mImageUrlConverter.getFullImageUrl(mProduct.getContent().getProductImages().get(secondImagePosition).getImageUrl()))
.resize(imagewidth, imageHeight)
.centerInside()
.into(imageViewBottom, new Callback() {
@Override
public void onSuccess() {
Bitmap bitmap = ((BitmapDrawable) imageViewBottom.getDrawable()).getBitmap();
imageViewBottom.setBackgroundColor(bitmap.getPixel(0, 0));
}
@Override
public void onError() {
}
});
}
mProductImagesLayout.addView(layout);
}
}
@Override
public void onClick(View v) {
if (v.getId() == mMainImageView.getId()) {
startImageViewPagerActivity(0, v);
} else if (v instanceof LinearLayout) {
LinearLayout layout = (LinearLayout) v;
for (int i = 0; i < layout.getChildCount(); i++) {
if (layout.getChildAt(i) instanceof TextView) {
TextView positionText = (TextView) layout.getChildAt(i);
startImageViewPagerActivity(Integer.parseInt(positionText.getText().toString()), positionText);
}
}
}
}
private void startImageViewPagerActivity(int index, View view) {
Intent intent = new Intent(this, ImagePagerActivity.class);
ArrayList<String> imageUrls = getImageUrlsArrayList();
intent.putStringArrayListExtra(ImagePagerActivity.IMAGE_URLS_FOR_PRODUCTS, imageUrls);
intent.putExtra(ImagePagerActivity.IMAGE_PAGER_INDEX, index);
int[] screenLocation = new int[2];
view.getLocationOnScreen(screenLocation);
intent.putExtra(ImagePagerActivity.ANIM_START_LEFT, screenLocation[0]);
intent.putExtra(ImagePagerActivity.ANIM_START_TOP, screenLocation[1]);
intent.putExtra(ImagePagerActivity.ANIM_START_WIDTH, view.getMeasuredWidth());
intent.putExtra(ImagePagerActivity.ANIM_START_HEIGHT, view.getMeasuredHeight());
startActivity(intent);
overridePendingTransition(0, 0);
}
private ArrayList<String> getImageUrlsArrayList() {
ArrayList<String> list = new ArrayList<String>();
for (ProductImage image : mImages) {
list.add(mImageUrlConverter.getFullImageUrl(image.getImageUrl()));
}
return list;
}
@Override
public void onRefresh() {
mProductSwipeRefresh.setRefreshing(true);
Loader productLoader = getLoaderManager().getLoader(LOADER_PRODUCT_DETAIL);
productLoader.reset();
productLoader.startLoading();
productLoader.forceLoad();
}
}