public class PHService {

	private static final SessionService sessionService = new SessionService ();
	private static final AccessTokenProvider accessTokenProvider = new AccessTokenProvider ();

	public PHService () {
	}

	public Observable<Posts> getPosts (String topic, String date) {
		PHApi api = ServiceGenerator.createService (PHApi.class, Constants.API_URL);
		if (date == null) {
			if (topic == null) {

				return api.getPosts ().retryWhen (new RetryWithSessionRefresh
						(sessionService, accessTokenProvider)).doOnError
						(Crashlytics::logException);
			} else {
				return api.getPostsByTopic (topic.toLowerCase ()).retryWhen (new
						RetryWithSessionRefresh
						(sessionService, accessTokenProvider)).doOnError
						(Crashlytics::logException);
			}
		} else {
			return api.getPostsByDate (topic.toLowerCase (), date).retryWhen (new
					RetryWithSessionRefresh
					(sessionService, accessTokenProvider)).doOnError (Crashlytics::logException);
		}
	}

	public Observable<Topics> getTopics () {
		PHApi api = ServiceGenerator.createService (PHApi.class, Constants.API_URL);
		return api.getTopics ().retryWhen (new RetryWithSessionRefresh (sessionService,
				accessTokenProvider)).doOnError (Crashlytics::logException);
	}

	public Observable<Comments> getComments (int productId) {
		PHApi api = ServiceGenerator.createService (PHApi.class, Constants.API_URL);
		return api.getComments (productId).retryWhen (new RetryWithSessionRefresh
				(sessionService, accessTokenProvider)).doOnError (Crashlytics::logException);
	}

	public Observable<Collections> getCollections () {
		PHApi api = ServiceGenerator.createService (PHApi.class, Constants.API_URL);
		return api.getCollections ().retryWhen (new RetryWithSessionRefresh
				(sessionService, accessTokenProvider)).doOnError (Crashlytics::logException);
	}

	public Observable<Collection> getCollectionPosts (int collectionId) {
		Gson gson = new GsonBuilder ().registerTypeAdapter (Collection.class, new
				CollectionDeserializer ()).create ();
		PHApi api = ServiceGenerator.createService (PHApi.class, Constants.API_URL, gson);
		return api.getCollectionPosts (collectionId).retryWhen (new RetryWithSessionRefresh
				(sessionService, accessTokenProvider)).doOnError (Crashlytics::logException);
	}
} public class AppSettings {

	public static boolean getOpenInBrowserPref (Context context) {
		SharedPreferences sharedPrefs = PreferenceManager
				.getDefaultSharedPreferences (context);
		return sharedPrefs.getBoolean (SettingsActivity.KEY_OPEN_SYSTEM_BROWSER, false);
	}

	public static boolean getCrashDataPref (Context context) {
		SharedPreferences sharedPrefs = PreferenceManager
				.getDefaultSharedPreferences (context);
		return sharedPrefs.getBoolean (SettingsActivity.KEY_CRASH_DATA, true);
	}
} public class Collection implements Parcelable {
	private int id;
	private String name;
	private String title;
	@SerializedName ("background_image_url")
	private String backgroundImageUrl;
	@SerializedName ("collection_url")
	private String collectionUrl;
	private List<Product> posts;

	@Override
	public int describeContents () {
		return 0;
	}

	@Override
	public void writeToParcel (Parcel out, int flags) {
		out.writeInt (id);
		out.writeString (name);
		out.writeString (title);
		out.writeString (backgroundImageUrl);
		out.writeString (collectionUrl);
		out.writeList (posts);
	}

	public static final Creator<Collection> CREATOR = new Parcelable
			.Creator<Collection> () {
		public Collection createFromParcel (Parcel in) {
			return new Collection (in);
		}

		public Collection[] newArray (int size) {
			return new Collection[size];
		}
	};

	private Collection (Parcel in) {
		this.id = in.readInt ();
		this.name = in.readString ();
		this.title = in.readString ();
		this.backgroundImageUrl = in.readString ();
		this.collectionUrl = in.readString ();
		posts = new ArrayList<> ();
		in.readList (posts, getClass ().getClassLoader ());
	}

	public int getId () {
		return id;
	}

	public void setId (int id) {
		this.id = id;
	}

	public String getName () {
		return name;
	}

	public void setName (String name) {
		this.name = name;
	}

	public String getTitle () {
		return title;
	}

	public void setTitle (String title) {
		this.title = title;
	}

	public String getBackgroundImageUrl () {
		return backgroundImageUrl;
	}

	public void setBackgroundImageUrl (String backgroundImageUrl) {
		this.backgroundImageUrl = backgroundImageUrl;
	}

	public String getCollectionUrl () {
		return collectionUrl;
	}

	public void setCollectionUrl (String collectionUrl) {
		this.collectionUrl = collectionUrl;
	}

	public List<Product> getPosts () {
		return posts;
	}

	public void setPosts (List<Product> posts) {
		this.posts = posts;
	}

	public static Creator<Collection> getCREATOR () {
		return CREATOR;
	}
} public class Posts implements Parcelable {

	public static final String TAG = Collections.class.getSimpleName ();

	public static final String PARCELABLE_KEY = TAG + ":" + "ParcelableKey";

	private List<Product> posts;

	public Posts () {
		posts = new ArrayList<> ();
	}

	public Posts (Parcel in) {
		posts = new ArrayList<> ();
		in.readList (posts, getClass ().getClassLoader ());
	}

	public List<Product> getPosts () {
		return posts;
	}

	public void setPosts (List<Product> posts) {
		this.posts = posts;
	}

	public boolean isEmpty () {
		return posts.isEmpty ();
	}

	public void clear () {
		posts.clear ();
	}

	@Override
	public int describeContents () {
		return 0;
	}

	public static Posts getParcelable (Bundle savedInstanceState) {
		if (savedInstanceState != null) {
			return savedInstanceState.getParcelable (PARCELABLE_KEY);
		} else {
			throw new IllegalArgumentException (TAG + ": \'getParcelable\' Method has null argument: savedInstanceState.");
		}
	}

	public static void putParcelable (Bundle savedInstanceState, Posts posts) {
		if (savedInstanceState != null && posts != null) {
			savedInstanceState.putParcelable (PARCELABLE_KEY, posts);
		}
	}

	@Override
	public void writeToParcel (Parcel parcel, int i) {
		parcel.writeList (posts);
	}

	public static Parcelable.Creator<Posts> getCREATOR () {
		return CREATOR;
	}

	public static final Parcelable.Creator<Posts> CREATOR = new Parcelable
			.Creator<Posts> () {
		public Posts createFromParcel (Parcel in) {
			return new Posts (in);
		}

		public Posts[] newArray (int size) {
			return new Posts[size];
		}
	};
} public class Product implements Parcelable {
	private int id;
	private String name;
	private String tagline;
	@SerializedName ("comments_count")
	private int commentsCount;
	@SerializedName ("votes_count")
	private int votesCount;
	@SerializedName ("discussion_url")
	private String discussionUrl;
	@SerializedName ("redirect_url")
	private String productUrl;
	@SerializedName ("screenshot_url")
	private ScreenshotUrl screenshotUrl;

	public class ScreenshotUrl {
		@SerializedName ("300px")
		private String smallImgUrl;
		@SerializedName ("850px")
		private String largeImgUrl;

		public ScreenshotUrl (String smallImgUrl, String largeImgUrl) {
			this.smallImgUrl = smallImgUrl;
			this.largeImgUrl = largeImgUrl;
		}

		public String getSmallImgUrl () {
			return smallImgUrl;
		}

		public void setSmallImgUrl (String smallImgUrl) {
			this.smallImgUrl = smallImgUrl;
		}

		public String getLargeImgUrl () {
			return largeImgUrl;
		}

		public void setLargeImgUrl (String largeImgUrl) {
			this.largeImgUrl = largeImgUrl;
		}
	}

	@Override
	public int describeContents () {
		return 0;
	}

	@Override
	public void writeToParcel (Parcel out, int flags) {
		out.writeInt (id);
		out.writeString (name);
		out.writeString (tagline);
		out.writeString (discussionUrl);
		out.writeString (productUrl);
		out.writeInt (votesCount);
		out.writeInt (commentsCount);
		out.writeString (screenshotUrl.getSmallImgUrl ());
		out.writeString (screenshotUrl.getLargeImgUrl ());
	}

	public static final Creator<Product> CREATOR = new Parcelable.Creator<Product> () {
		public Product createFromParcel (Parcel in) {
			return new Product (in);
		}

		public Product[] newArray (int size) {
			return new Product[size];
		}
	};

	private Product (Parcel in) {
		this.id = in.readInt ();
		this.name = in.readString ();
		this.tagline = in.readString ();
		this.discussionUrl = in.readString ();
		this.productUrl = in.readString ();
		this.votesCount = in.readInt ();
		this.commentsCount = in.readInt ();
		this.screenshotUrl = new ScreenshotUrl (in.readString (), in.readString ());
	}

	public int getId () {
		return id;
	}

	public void setId (int id) {
		this.id = id;
	}

	public String getName () {
		return name;
	}

	public void setName (String name) {
		this.name = name;
	}

	public String getTagline () {
		return tagline;
	}

	public void setTagline (String tagline) {
		this.tagline = tagline;
	}

	public int getCommentsCount () {
		return commentsCount;
	}

	public void setCommentsCount (int commentsCount) {
		this.commentsCount = commentsCount;
	}

	public int getVotesCount () {
		return votesCount;
	}

	public void setVotesCount (int votesCount) {
		this.votesCount = votesCount;
	}

	public String getDiscussionUrl () {
		return discussionUrl;
	}

	public void setDiscussionUrl (String discussionUrl) {
		this.discussionUrl = discussionUrl;
	}

	public String getProductUrl () {
		return productUrl;
	}

	public void setProductUrl (String productUrl) {
		this.productUrl = productUrl;
	}

	public ScreenshotUrl getScreenshotUrl () {
		return screenshotUrl;
	}

	public void setScreenshotUrl (ScreenshotUrl screenshotUrl) {
		this.screenshotUrl = screenshotUrl;
	}
} public class Topics implements Parcelable {

	public static final String TAG = Topics.class.getSimpleName ();

	public static final String PARCELABLE_KEY = TAG + ":" + "ParcelableKey";

	private List<Topic> topics;

	public Topics () {
		topics = new ArrayList<> ();
	}

	private Topics (Parcel in) {
		topics = new ArrayList<> ();
		in.readList (topics, getClass ().getClassLoader ());
	}

	public List<Topic> getTopics () {
		return topics;
	}

	public void setTopics (List<Topic> topics) {
		this.topics = topics;
	}

	public boolean isEmpty () {
		return topics.isEmpty ();
	}

	public int size () {
		return topics.size ();
	}

	public void clear () {
		topics.clear ();
	}

	@Override
	public int describeContents () {
		return 0;
	}

	public static Topics getParcelable (Bundle savedInstanceState) {
		if (savedInstanceState != null) {
			return savedInstanceState.getParcelable (PARCELABLE_KEY);
		} else {
			throw new IllegalArgumentException (
					TAG + ": \'getParcelable\' Method has null argument: savedInstanceState.");
		}
	}

	public static void putParcelable (Bundle savedInstanceState, Topics topics) {
		if (savedInstanceState != null && topics != null) {
			savedInstanceState.putParcelable (PARCELABLE_KEY, topics);
		}
	}

	@Override
	public void writeToParcel (Parcel parcel, int i) {
		parcel.writeList (topics);
	}

	public static Parcelable.Creator<Topics> getCREATOR () {
		return CREATOR;
	}

	public static final Parcelable.Creator<Topics> CREATOR = new Parcelable
			.Creator<Topics> () {
		public Topics createFromParcel (Parcel in) {
			return new Topics (in);
		}

		public Topics[] newArray (int size) {
			return new Topics[size];
		}
	};
} public class DateUtils {

	public static String getTodaysDate () {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd");
		simpleDateFormat.setTimeZone (TimeZone.getTimeZone ("America/Los_Angeles"));
		return simpleDateFormat.format (new Date ()) + "";
	}

	public static String getLastUsedDate (Context context, String date) {
		return context.getSharedPreferences ("PREFERENCE",
				Context.MODE_PRIVATE).getString ("saved_date", date);
	}

	public static String getMonth (int month) {
		return new DateFormatSymbols ().getMonths ()[month];
	}

	public static String getDateFormattedString (Calendar calendar) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd");
		return simpleDateFormat.format (calendar.getTime ());
	}
} public class NetworkUtils {

	public static boolean hasInternetAccess (Context c) {
		ConnectivityManager cm =
				(ConnectivityManager) c.getSystemService (Context.CONNECTIVITY_SERVICE);

		NetworkInfo activeNetwork = cm.getActiveNetworkInfo ();
		return activeNetwork != null &&
				activeNetwork.isConnectedOrConnecting ();
	}
} public class CommentsActivity extends AppCompatActivity implements CommentsView {

	public static final String ARG_DRAWING_START_LOCATION = "arg_drawing_start_location";
	private static final int ANIM_LAYOUT_INTRO_DURATION = 250;

	@BindView (R2.id.toolbar)
	Toolbar mToolBar;
	@BindView (android.R.id.list)
	RecyclerView mRecyclerView;
	@BindView (R2.id.comments_layout)
	FrameLayout mCommentsLayout;
	@BindView (R2.id.comments_list_progress_wheel)
	ProgressWheel mListProgressWheel;
	@BindView (R2.id.comments_empty_view)
	LinearLayout mEmptyView;

	private int mDrawingStartLocation;
	private CommentPresenterImpl mPresenter;
	private ActionBar mActionBar;

	@Override
	protected void onCreate (Bundle savedInstanceState) {
		super.onCreate (savedInstanceState);
		setContentView (R.layout.activity_comments);
		ButterKnife.bind (this);
		expandAnimation (savedInstanceState);
		Product product = getIntent ().getParcelableExtra ("product");
		mPresenter = new CommentPresenterImpl (this, product);
		mPresenter.onActivityCreated (savedInstanceState);

	}

	@Override
	public void onSaveInstanceState (Bundle outState) {
		super.onSaveInstanceState (outState);
		mPresenter.onSaveInstanceState (outState);
	}

	@Override
	public void onDestroy () {
		mPresenter.onDestroy ();
		super.onDestroy ();
	}

	private LinearLayoutManager getLayoutManager () {
		LinearLayoutManager layoutManager = new LinearLayoutManager (this);
		layoutManager.setOrientation (LinearLayoutManager.VERTICAL);
		return layoutManager;
	}

	private void expandAnimation (Bundle savedInstanceState) {
		mDrawingStartLocation = getIntent ().getIntExtra (ARG_DRAWING_START_LOCATION, 0);
		if (savedInstanceState == null) {
			mCommentsLayout.getViewTreeObserver ().addOnPreDrawListener (new ViewTreeObserver
					.OnPreDrawListener () {
				@Override
				public boolean onPreDraw () {
					mCommentsLayout.getViewTreeObserver ().removeOnPreDrawListener (this);
					startIntroAnimation ();
					return true;
				}
			});
		}
	}

	private void startIntroAnimation () {
		mCommentsLayout.setScaleY (0.1f);
		mCommentsLayout.setPivotY (mDrawingStartLocation);
		mCommentsLayout.animate ()
				.scaleY (1)
				.setDuration (ANIM_LAYOUT_INTRO_DURATION)
				.setInterpolator (new AccelerateInterpolator ())
				.start ();
	}

	@Override
	public void onBackPressed () {
		mPresenter.onBackPressed ();
	}

	@Override
	public boolean onOptionsItemSelected (MenuItem item) {
		return mPresenter.onOptionsItemSelected (item);
	}

	@Override
	public void initializeRecyclerView () {
		mRecyclerView.setHasFixedSize (true);
		mRecyclerView.setItemAnimator (new DefaultItemAnimator ());
		mRecyclerView.setLayoutManager (getLayoutManager ());
	}

	@Override
	public void initializeToolBar () {
		setSupportActionBar (mToolBar);
		mActionBar = getSupportActionBar ();
		if (mActionBar != null) {
			mActionBar.setElevation (5);
			mActionBar.setDisplayHomeAsUpEnabled (true);
		}
	}

	@Override
	public void setAdapterForRecyclerView (CommentListAdapter adapter) {
		mRecyclerView.setAdapter (adapter);
	}

	@Override
	public void goBack () {
		mCommentsLayout.animate ()
				.translationY (ViewUtils.getScreenHeight (this))
				.setDuration (200)
				.setListener (new AnimatorListenerAdapter () {
					@Override
					public void onAnimationEnd (Animator animation) {
						CommentsActivity.super.onBackPressed ();
						overridePendingTransition (0, 0);
					}
				})
				.start ();
	}

	@Override
	public void setToolbarTitle (String title) {
		mActionBar.setTitle (title);
	}

	@Override
	public void showRefreshIndicator () {
		mListProgressWheel.setVisibility (View.VISIBLE);
		mListProgressWheel.spin ();
		mListProgressWheel.setBarColor (getResources ().getColor (R.color.primary_accent));
	}

	@Override
	public void hideRefreshIndicator () {
		mListProgressWheel.setVisibility (View.GONE);
		mListProgressWheel.stopSpinning ();
	}

	@Override
	public void showEmptyView () {
		mEmptyView.setVisibility (View.VISIBLE);
	}

	@Override
	public void hideEmptyView () {
		mEmptyView.setVisibility (View.GONE);
	}

	@Override
	public void showError () {
		SnackbarManager.show (
				Snackbar.with (getApplicationContext ())
						.text (getString (R.string.error_connection))
						.actionLabel (getString (R.string.retry))
						.actionColor (getResources ().getColor (R.color.primary_color))
						.duration (Snackbar.SnackbarDuration.LENGTH_INDEFINITE)
						.actionListener (snackbar -> mPresenter.onRefresh ()), this);
	}

	@Override
	public Context getContext () {
		return this;
	}
} public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ProductViewHolder>
		implements View.OnClickListener {

	private final static int ANIM_LIST_ENTER_DURATION = 700;
	private static final int ANIMATED_ITEMS_COUNT = 3;

	private List<Product> mProducts;
	private Context mContext;
	private OnProductClickListener mOnProductClickListener;
	private int lastAnimatedPosition = -1;

	public ProductListAdapter (Context context, List<Product> products) {
		this.mContext = context;
		this.mProducts = products;
	}

	@Override
	public int getItemCount () {
		return mProducts.size ();
	}

	@Override
	public void onBindViewHolder (final ProductViewHolder holder, int position) {
		runEnterAnimation (holder.itemView, position);
		holder.screenshotRipple.setTag (position);
		holder.viewComments.setTag (position);
		holder.context.setTag (position);
		Picasso.with (mContext).load (R.drawable.ic_votes).into (holder.votesIcon);
		Picasso.with (mContext).load (R.drawable.ic_comment).into (holder.commentsIcon);
		loadCardText (holder);
		loadImage (holder);
	}

	private void loadCardText (ProductViewHolder holder) {
		Product product = mProducts.get (holder.getLayoutPosition ());
		holder.title.setText (product.getName ());
		holder.description.setText (product.getTagline ());
		holder.votes.setText (String.valueOf (product.getVotesCount ()));
		holder.comments.setText (String.valueOf (product.getCommentsCount ()));
	}

	private void loadImage (final ProductViewHolder holder) {
		String imgUrl = mProducts.get (holder.getLayoutPosition ())
				.getScreenshotUrl ().getSmallImgUrl ();
		holder.progressWheel.setVisibility (View.VISIBLE);
		holder.progressWheel.spin ();
		Picasso.with (mContext).load (imgUrl)
				.fit ()
				.centerCrop ()
				.into (holder.screenshot, new Callback () {
					@Override
					public void onSuccess () {
						holder.progressWheel.setVisibility (View.GONE);
						holder.progressWheel.stopSpinning ();
					}

					@Override
					public void onError () {
						// TODO: Error view
					}
				});
	}

	@Override
	public ProductViewHolder onCreateViewHolder (ViewGroup viewGroup, final int i) {
		View itemView = LayoutInflater.
				from (viewGroup.getContext ()).
				inflate (R.layout.item_product_card, viewGroup, false);

		ProductViewHolder holder = new ProductViewHolder (itemView);
		holder.screenshotRipple.setOnClickListener (this);
		holder.viewComments.setOnClickListener (this);
		holder.context.setOnClickListener (this);
		return holder;
	}

	@Override
	public void onClick (View v) {
		if (v.getId () == R.id.card_product_image_ripple) {
			mOnProductClickListener.onImageClick (v, (Integer) v.getTag ());
		} else if (v.getId () == R.id.card_product_view_comments) {
			mOnProductClickListener.onCommentsClick (v, mProducts.get ((Integer) v.getTag ()));
		} else if (v.getId () == R.id.card_product_context) {
			mOnProductClickListener.onContextClick (v, (Integer) v.getTag ());
		}
	}

	private void runEnterAnimation (View view, int position) {
		if (position >= ANIMATED_ITEMS_COUNT - 1) {
			return;
		}
		if (position > lastAnimatedPosition) {
			lastAnimatedPosition = position;
			view.setTranslationY (ViewUtils.getScreenHeight (mContext));
			view.animate ()
					.translationY (0)
					.setInterpolator (new DecelerateInterpolator (3.f))
					.setDuration (ANIM_LIST_ENTER_DURATION)
					.start ();
		}
	}

	public void setOnProductClickListener (OnProductClickListener onProductClickListener) {
		this.mOnProductClickListener = onProductClickListener;
	}

	static class ProductViewHolder extends RecyclerView.ViewHolder {

		@BindView (R2.id.card_product_title)
		TextView title;
		@BindView (R2.id.card_product_description)
		TextView description;
		@BindView (R2.id.card_product_image)
		ImageView screenshot;
		@BindView (R2.id.card_product_image_ripple)
		View screenshotRipple;
		@BindView (R2.id.card_product_upvotes)
		TextView votes;
		@BindView (R2.id.card_product_comments_total)
		TextView comments;
		@BindView (R2.id.card_product_progress_wheel)
		ProgressWheel progressWheel;
		@BindView (R2.id.card_product_view_comments)
		TextView viewComments;
		@BindView (R2.id.card_product_context)
		ImageView context;
		@BindView (R2.id.card_product_comments_icon)
		ImageView commentsIcon;
		@BindView (R2.id.card_product_votes_icon)
		ImageView votesIcon;

		ProductViewHolder (View view) {
			super (view);
			ButterKnife.bind (this, view);
		}
	}

	public interface OnProductClickListener {
		void onImageClick (View v, int position);

		void onCommentsClick (View v, Product product);

		void onContextClick (View v, int position);
	}
} public interface ProductTabsView {

	void initializeTabLayout (String[] categoryNames);
} public interface ProductView {

	void initializeRecyclerView ();

	void setAdapterForRecyclerView (ProductListAdapter adapter);

	void showRefreshingIndicator ();

	void hideRefreshingIndicator ();

	void showEmptyView ();

	void hideEmptyView ();

	void showNoNetworkError ();

	void showContextMenu (View v, int position);

	void hideContextMenu ();

	void hideActivityTransition ();

	void setToolbarTitle (String title);

	int getActivity ();

	Context getContext ();

	ProductListAdapter.OnProductClickListener getProductClickListener ();
}
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v4.content.ContextCompat;
import android.view.View;
import com.crashlytics.android.Crashlytics;
import com.jaspervanriet.huntingthatproduct.Data.Http.PHService;
import com.jaspervanriet.huntingthatproduct.Data.Settings.AppSettings;
import com.jaspervanriet.huntingthatproduct.Entities.Collection;
import com.jaspervanriet.huntingthatproduct.Entities.Posts;
import com.jaspervanriet.huntingthatproduct.Entities.Product;
import com.jaspervanriet.huntingthatproduct.Entities.Topics;
import com.jaspervanriet.huntingthatproduct.R;
import com.jaspervanriet.huntingthatproduct.Utils.DateUtils;
import com.jaspervanriet.huntingthatproduct.Utils.NetworkUtils;
import com.jaspervanriet.huntingthatproduct.Views.Activities.CommentsActivity;
import com.jaspervanriet.huntingthatproduct.Views.Adapters.ProductListAdapter;
import com.jaspervanriet.huntingthatproduct.Views.ProductTabsView;
import com.jaspervanriet.huntingthatproduct.Views.ProductView;
import java.util.Calendar;
import rx.Observable;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/*
 * Copyright (C) 2015 Jasper van Riet
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.jaspervanriet.huntingthatproduct.Presenters;





public class ProductPresenterImpl implements ProductPresenter {

	public static final int ACTIVITY_MAIN = 1;
	public static final int ACTIVITY_COLLECTION = 2;

	private Subscription mSubscription;
	private ProductView mProductView;
	private ProductTabsView mProductTabsView;