/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.material.demo.shrine.products;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.volley.toolbox.NetworkImageView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.material.demo.shrine.filters.FiltersActivity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/** Activity that displays a list of products. */
public class ProductListActivity extends AppCompatActivity {
private static final String TAG = ProductListActivity.class.getSimpleName();
private ImageRequester imageRequester;
private List<ProductEntry> productEntryList;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Theme_Shrine);
super.onCreate(savedInstanceState);
setContentView(R.layout.shrine_product_activity);
imageRequester = ImageRequester.getInstance(this);
initProductEntryList();
initCollapsingToolbar();
initItemGrid();
}
private void initProductEntryList() {
InputStream inputStream = getResources().openRawResource(R.raw.products);
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
int pointer;
while ((pointer = reader.read(buffer)) != -1) {
writer.write(buffer, 0, pointer);
}
} catch (IOException exception) {
Log.e(TAG, "Error writing/reading from the JSON file.", exception);
} finally {
try {
inputStream.close();
} catch (IOException exception) {
Log.e(TAG, "Error closing the input stream.", exception);
}
}
String jsonProductsString = writer.toString();
Gson gson = new Gson();
Type productListType = new TypeToken<ArrayList<ProductEntry>>() {}.getType();
this.productEntryList = gson.fromJson(jsonProductsString, productListType);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.shrine_toolbar_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
if (menuItem.getItemId() == R.id.ShrineToolbarFilterIcon) {
startActivity(new Intent(this, FiltersActivity.class));
return true;
}
return false;
}
private void initCollapsingToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.AppBar);
int collapsingToolbarImageIndex = 6;
int collapsingImageToolbarSize = 1200;
NetworkImageView collapsingToolbarImage =
(NetworkImageView) findViewById(R.id.CollapsingToolbarImage);
StringBuilder collapsingToolbarImageUrl =
new StringBuilder(productEntryList.get(collapsingToolbarImageIndex).url);
collapsingToolbarImageUrl.append("=s");
collapsingToolbarImageUrl.append(collapsingImageToolbarSize);
setSupportActionBar(toolbar);
CollapsingToolbarLayout collapsingToolbarLayout =
(CollapsingToolbarLayout) findViewById(R.id.CollapsingToolbarLayout);
collapsingToolbarLayout.setTitle(toolbar.getTitle());
collapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.TextAppearance_Shrine_Logo);
collapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.TextAppearance_Shrine_Logo);
imageRequester.setImageFromUrl(collapsingToolbarImage, collapsingToolbarImageUrl.toString());
Point windowSize = new Point();
getWindowManager().getDefaultDisplay().getSize(windowSize);
int windowWidth = windowSize.x;
collapsingToolbarImage.setX(collapsingToolbarImage.getX() - windowWidth / 4);
collapsingToolbarLayout.setScrimVisibleHeightTrigger(
(int) getResources().getDimension(R.dimen.shrine_tall_toolbar_height) / 2);
}
private void initItemGrid() {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.ProductGrid);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
recyclerView.setAdapter(new ProductAdapter(this, productEntryList, imageRequester));
}
private static class ProductAdapter extends Adapter<ProductViewHolder> {
private final Activity activity;
private final List<ProductEntry> productEntries;
public ImageRequester imageRequester;
public ProductAdapter(
Activity activity, List<ProductEntry> productEntries, ImageRequester imageRequester) {
this.activity = activity;
this.productEntries = productEntries;
this.imageRequester = imageRequester;
}
@Override
public ProductViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new ProductViewHolder(activity, viewGroup);
}
@Override
public void onBindViewHolder(ProductViewHolder productViewHolder, int i) {
productViewHolder.bind(activity, productEntries.get(i), imageRequester);
}
@Override
public int getItemCount() {
return productEntries.size();
}
}
private static class ProductViewHolder extends ViewHolder {
private final TextView productPriceView;
private final NetworkImageView productImageView;
private final TextView productShopNameView;
private final CardView productEntryView;
public ProductViewHolder(Context context, ViewGroup parent) {
super(LayoutInflater.from(context).inflate(R.layout.shrine_product_entry, parent, false));
ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
itemView.setLayoutParams(layoutParams);
productPriceView = (TextView) itemView.findViewById(R.id.ProductPrice);
productImageView = (NetworkImageView) itemView.findViewById(R.id.ProductImage);
productShopNameView = (TextView) itemView.findViewById(R.id.ProductShopName);
productEntryView = (CardView) itemView.findViewById(R.id.ProductEntry);
productEntryView.setOnClickListener(clickListener);
}
private final OnClickListener clickListener =
new OnClickListener() {
@Override
public void onClick(View v) {
ItemActivity.createItemActivityIntent(v.getContext(), (ProductEntry) v.getTag());
}
};
public void bind(Context context, ProductEntry productEntry, ImageRequester imageRequester) {
productPriceView.setText(productEntry.price);
imageRequester.setImageFromUrl(productImageView, productEntry.url);
productShopNameView.setText(productEntry.title);
productEntryView.setTag(productEntry);
}
}
}