/* * Copyright 2016 Hannes Dorfmann. * * 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 com.hannesdorfmann.mosby3.sample.mvi.view.detail; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.transition.TransitionManager; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import com.bumptech.glide.Glide; import com.hannesdorfmann.mosby3.mvi.MviActivity; import com.hannesdorfmann.mosby3.sample.mvi.R; import com.hannesdorfmann.mosby3.sample.mvi.SampleApplication; import com.hannesdorfmann.mosby3.sample.mvi.businesslogic.interactor.details.ProductDetailsViewState; import com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.Product; import com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection; import com.jakewharton.rxbinding2.view.RxView; import io.reactivex.Observable; import java.util.Locale; import timber.log.Timber; public class ProductDetailsActivity extends MviActivity<ProductDetailsView, ProductDetailsPresenter> implements ProductDetailsView { public static final String KEY_PRODUCT_ID = "productId"; private Product product; private boolean isProductInshoppingCart = false; private Observable<Boolean> fabClickObservable; @BindView(R.id.errorView) View errorView; @BindView(R.id.loadingView) View loadingView; @BindView(R.id.detailsView) View detailsView; @BindView(R.id.price) TextView price; @BindView(R.id.description) TextView description; @BindView(R.id.fab) FloatingActionButton fab; @BindView(R.id.backdrop) ImageView backdrop; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.root) ViewGroup rootView; @BindView(R.id.collapsingToolbar) CollapsingToolbarLayout collapsingToolbarLayout; public static void start(Activity activity, Product product) { Intent i = new Intent(activity, ProductDetailsActivity.class); i.putExtra(KEY_PRODUCT_ID, product.getId()); activity.startActivity(i); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_product_detail); ButterKnife.bind(this); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); fabClickObservable = RxView.clicks(fab).share().map(ignored -> true); } @NonNull @Override public ProductDetailsPresenter createPresenter() { Timber.d("Create presenter"); return SampleApplication.getDependencyInjection(this).newProductDetailsPresenter(); } @Override public Observable<Integer> loadDetailsIntent() { return Observable.just(getIntent().getIntExtra(KEY_PRODUCT_ID, 0)); } @Override public Observable<Product> addToShoppingCartIntent() { return fabClickObservable.filter(item -> product != null) .filter(item -> !isProductInshoppingCart) .map(item -> product); } @Override public Observable<Product> removeFromShoppingCartIntent() { return fabClickObservable.filter(item -> product != null) .filter(item -> isProductInshoppingCart) .map(item -> product); } @Override public void render(ProductDetailsViewState state) { Timber.d("render " + state); if (state instanceof ProductDetailsViewState.LoadingState) { renderLoading(); } else if (state instanceof ProductDetailsViewState.DataState) { renderData((ProductDetailsViewState.DataState) state); } else if (state instanceof ProductDetailsViewState.ErrorState) { renderError(); } else { throw new IllegalStateException("Unknown state " + state); } } private void renderError() { TransitionManager.beginDelayedTransition(rootView); errorView.setVisibility(View.VISIBLE); loadingView.setVisibility(View.GONE); detailsView.setVisibility(View.GONE); } private void renderData(ProductDetailsViewState.DataState state) { TransitionManager.beginDelayedTransition(rootView); errorView.setVisibility(View.GONE); loadingView.setVisibility(View.GONE); detailsView.setVisibility(View.VISIBLE); isProductInshoppingCart = state.getDetail().isInShoppingCart(); product = state.getDetail().getProduct(); price.setText("Price: $" + String.format(Locale.US, "%.2f", product.getPrice())); description.setText(product.getDescription()); toolbar.setTitle(product.getName()); collapsingToolbarLayout.setTitle(product.getName()); if (isProductInshoppingCart) { fab.setImageResource(R.drawable.ic_in_shopping_cart); } else { fab.setImageResource(R.drawable.ic_add_shopping_cart); } Glide.with(this) .load(DependencyInjection.BASE_IMAGE_URL + product.getImage()) .centerCrop() .into(backdrop); } private void renderLoading() { TransitionManager.beginDelayedTransition(rootView); errorView.setVisibility(View.GONE); loadingView.setVisibility(View.VISIBLE); detailsView.setVisibility(View.GONE); } }