package pl.pola_app.ui.activity; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Pair; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import pl.pola_app.PolaApplication; import pl.pola_app.helpers.EventLogger; import pl.pola_app.helpers.SessionId; import pl.pola_app.model.SearchResult; import pl.pola_app.network.Api; import pl.pola_app.ui.adapter.OnProductListChanged; import pl.pola_app.ui.adapter.ProductList; import pl.pola_app.ui.adapter.ProductsAdapter; import pl.pola_app.ui.event.ProductDetailsFragmentDismissedEvent; import pl.pola_app.ui.event.ReportButtonClickedEvent; import pl.pola_app.ui.fragment.BarcodeListener; import retrofit.Call; import retrofit.Callback; import retrofit.Response; import retrofit.Retrofit; class MainPresenter implements Callback<SearchResult>, BarcodeListener { private static final int millisecondsBetweenExisting = 2000;//otherwise it will scan and vibrate few times a second private final MainViewBinder viewBinder; private final ProductList productList; private final Handler handlerScanner = new Handler(); private final EventLogger logger; @Nullable private Call<SearchResult> reportResultCall; private final Runnable runnableResumeScan = new Runnable() { @Override public void run() { logger.logCustom("Scanned", new Pair<>("existing", "true")); viewBinder.resumeScanning(); } }; private Api api; private SessionId sessionId; private Bus eventBus; public static MainPresenter create(@NonNull final MainViewBinder viewBinder, @NonNull final ProductList productList, @NonNull final ProductsAdapter productsAdapter, @NonNull SessionId sessionId, @NonNull final Bus eventBus) { productList.setOnProductListChanged(new OnProductListChanged() { @Override public void onChanged() { productsAdapter.notifyDataSetChanged(); } }); viewBinder.setAdapter(productsAdapter); final Api api = PolaApplication.retrofit.create(Api.class); final EventLogger logger = new EventLogger(); final MainPresenter mainPresenter = new MainPresenter(viewBinder, productList, api, logger, sessionId, eventBus); productsAdapter.setOnProductClickListener(new ProductsAdapter.ProductClickListener() { @Override public void itemClicked(SearchResult searchResult) { mainPresenter.onItemClicked(searchResult); } }); return mainPresenter; } MainPresenter(@NonNull MainViewBinder viewBinder, @NonNull ProductList productList, @NonNull Api api, @NonNull EventLogger logger, @NonNull SessionId sessionId, @NonNull Bus eventBus) { this.viewBinder = viewBinder; this.productList = productList; this.api = api; this.logger = logger; this.sessionId = sessionId; this.eventBus = eventBus; } void register() { eventBus.register(this); } void unregister() { eventBus.unregister(this); if (reportResultCall != null) { reportResultCall.cancel(); } } @Override public void onBarcode(String barcode) { logger.logSearch(barcode, sessionId.get()); if (productList.itemExists(barcode)) { handlerScanner.removeCallbacks(runnableResumeScan); handlerScanner.postDelayed(runnableResumeScan, millisecondsBetweenExisting); } else { logger.logCustom("Scanned", new Pair<>("existing", "false")); productList.createProductPlaceholder(); reportResultCall = api.getByCode(barcode, sessionId.get()); reportResultCall.enqueue(this); } } @Override public void onResponse(Response<SearchResult> response, Retrofit retrofit) { logger.logContentView(response.body().name + "", "Card Preview", String.valueOf(response.body().product_id), String.valueOf(response.code()), sessionId.get()); productList.addProduct(response.body()); viewBinder.resumeScanning(); } @Override public void onFailure(Throwable t) { logger.logCustom("Barcode request failed", new Pair<>("message", t.getLocalizedMessage())); if ("Unable to resolve host \"www.pola-app.pl\": No address associated with hostname".equals(t.getLocalizedMessage())) {//TODO this is awefull viewBinder.showNoConnectionMessage(); } else { viewBinder.showErrorMessage(t.getLocalizedMessage()); } handlerScanner.removeCallbacks(runnableResumeScan); productList.removeProductPlaceholder(); viewBinder.resumeScanning(); } void onItemClicked(@NonNull final SearchResult searchResult) { logger.logContentView(searchResult.name + "", "Open Card", String.valueOf(searchResult.product_id), searchResult.code, sessionId.get()); viewBinder.turnOffTorch(); viewBinder.openProductDetails(searchResult); } void onSaveState(@NonNull final Bundle bundle) { productList.writeToBundle(bundle); } @Subscribe @SuppressWarnings("WeakerAccess") public void productDetailsFragmentDismissed(@SuppressWarnings("UnusedParameters") ProductDetailsFragmentDismissedEvent event) { viewBinder.dismissProductDetailsView(); } @Subscribe @SuppressWarnings("WeakerAccess") public void reportButtonClicked(ReportButtonClickedEvent event) { String productId = null; if (event.searchResult.product_id != null) { productId = Integer.toString(event.searchResult.product_id); } viewBinder.launchReportActivity(productId); } }