package com.aptoide.amethyst; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.AppBarLayout; import android.support.v4.app.DialogFragment; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import com.aptoide.amethyst.analytics.Analytics; import com.aptoide.amethyst.database.AptoideDatabase; import com.aptoide.amethyst.events.BusProvider; import com.aptoide.amethyst.events.OttoEvents; import com.aptoide.amethyst.models.EnumStoreTheme; import com.aptoide.amethyst.preferences.SecurePreferences; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Logger; import com.aptoide.amethyst.webservices.v2.AddApkCommentVoteRequest; import com.aptoide.amethyst.webservices.v2.AlmostGenericResponseV2RequestListener; import com.aptoide.dataprovider.AptoideSpiceHttpService; import com.aptoide.dataprovider.webservices.json.GenericResponseV2; import com.aptoide.dataprovider.webservices.models.Constants; import com.aptoide.dataprovider.webservices.models.StoreHomeTab; import com.aptoide.models.stores.Login; import com.aptoide.models.stores.Store; import com.astuetz.PagerSlidingTabStrip; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.exception.NoNetworkException; import com.octo.android.robospice.persistence.DurationInMillis; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import com.squareup.otto.Subscribe; import java.net.HttpURLConnection; import com.aptoide.amethyst.adapter.StorePagerAdapter; import com.aptoide.amethyst.callbacks.AddCommentVoteCallback; import com.aptoide.amethyst.ui.SearchManager; import com.aptoide.amethyst.ui.dialogs.PasswordDialog; import retrofit.RetrofitError; /** * This class should always be called with a Bundle with valid args. * <p/> * It has some duplicate functionality with the HomeStoreFragment due to the * Software Requirement that the tabs must be created according to a webservice. */ public class StoresActivity extends AptoideBaseActivity implements AddCommentVoteCallback { public static Intent newIntent(@NonNull final Context context, final long storeId, @NonNull final String storeName, @NonNull final String storeAvatar, final int storeTheme) { final Intent intent = new Intent(context, StoresActivity.class); intent.putExtra(Constants.STOREID_KEY, storeId); intent.putExtra(Constants.STORENAME_KEY, storeName); intent.putExtra(Constants.STOREAVATAR_KEY, storeAvatar); intent.putExtra(Constants.THEME_KEY, storeTheme); intent.putExtra(Constants.DOWNLOAD_FROM_KEY, "store"); boolean subscribed = new AptoideDatabase(Aptoide.getDb()).existsStore(storeId); intent.putExtra(Constants.STORE_SUBSCRIBED_KEY, subscribed); return intent; } PagerSlidingTabStrip mPagerSlidingTabStrip; ViewPager mViewPager; Toolbar mToolbar; AppBarLayout mAppBar; ProgressBar progressBar; ScrollView layoutNoNetwork; ScrollView layoutError; TextView retryError; TextView retryNoNetwork; private Bundle args; private String storeName; private long storeId; private boolean subscribed; private EnumStoreTheme storeTheme; private SpiceManager spiceManager = new SpiceManager(AptoideSpiceHttpService.class); protected int BUCKET_SIZE; RequestListener<StoreHomeTab> listener = new RequestListener<StoreHomeTab>() { @Override public void onRequestFailure(SpiceException spiceException) { final Throwable cause = spiceException.getCause(); if (cause instanceof RetrofitError) { final RetrofitError retrofitError = (RetrofitError) cause; if (retrofitError.getResponse() != null && retrofitError.getResponse().getStatus() == HttpURLConnection.HTTP_UNAUTHORIZED) { handleUnauthorized(); } } handleErrorCondition(spiceException); } @Override public void onRequestSuccess(StoreHomeTab homeTab) { try { storeId = homeTab.store.nodes.meta.data.id.longValue(); storeName = homeTab.store.nodes.meta.data.name; storeTheme = EnumStoreTheme.get(homeTab.store.nodes.meta.data.appearance.theme); args.putLong(Constants.STOREID_KEY, storeId); mViewPager.setAdapter(new StorePagerAdapter(getSupportFragmentManager(), args, homeTab.store.nodes.tabs.tabList)); mPagerSlidingTabStrip.setViewPager(mViewPager); setupStoreTheme(storeTheme); handleSuccessCondition(); } catch (Exception e) { handleErrorCondition(e); } } }; @Override public void startActivity(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { intent.putExtra(SearchActivity.SEARCH_SOURCE, storeName); intent.putExtra(SearchActivity.SEARCH_THEME, storeTheme); } super.startActivity(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); SearchManager.setupSearch(menu, this); return super.onCreateOptionsMenu(menu); } @Override public void onCreate(Bundle savedInstanceState) { //Aptoide.getThemePicker().setAptoideTheme(this); super.onCreate(savedInstanceState); setContentView(getContentView()); bindViews(); if (savedInstanceState != null) { args = savedInstanceState; } else { args = getIntent().getExtras(); if (args == null) { // no Bundle, no gain Toast.makeText(this, R.string.error_occured, Toast.LENGTH_LONG).show(); finish(); } } BUCKET_SIZE = AptoideUtils.UI.getBucketSize(); storeId = args.getLong(Constants.STOREID_KEY, 0); storeName = args.getString(Constants.STORENAME_KEY); storeTheme = EnumStoreTheme.values()[args.getInt(Constants.THEME_KEY, 0)]; subscribed = args.getBoolean(Constants.STORE_SUBSCRIBED_KEY, false); mToolbar.setLogo(R.drawable.ic_store); setSupportActionBar(mToolbar); getSupportActionBar().setTitle(storeName); getSupportActionBar().setDisplayHomeAsUpEnabled(true); executeSpiceRequest(true); Analytics.Stores.enter(storeName); } protected int getContentView() { return R.layout.stores_main; } protected void bindViews() { mPagerSlidingTabStrip = (PagerSlidingTabStrip )findViewById(R.id.tabs); mViewPager = (ViewPager )findViewById(R.id.pager); mToolbar = (Toolbar )findViewById(R.id.toolbar); mAppBar = (AppBarLayout )findViewById(R.id.appbar); progressBar = (ProgressBar )findViewById(R.id.progress_bar); layoutNoNetwork = (ScrollView )findViewById(R.id.no_network_connection); layoutError = (ScrollView )findViewById(R.id.error); retryError = (TextView )findViewById(R.id.retry_error); retryNoNetwork = (TextView )findViewById(R.id.retry_no_network); } @Override protected void onNewIntent(final Intent intent) { super.onNewIntent(intent); finish(); startActivity(intent); } private void setupStoreTheme(EnumStoreTheme storeTheme) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(getResources().getColor(storeTheme.getColor700tint())); } mAppBar.setBackgroundColor(getResources().getColor(storeTheme.getStoreHeader())); progressBar.getIndeterminateDrawable().setColorFilter(getResources().getColor(storeTheme.getStoreHeader()), PorterDuff.Mode.SRC_IN); retryNoNetwork.getBackground().setColorFilter(getResources().getColor(storeTheme.getStoreHeader()), PorterDuff.Mode.SRC_IN); retryError.getBackground().setColorFilter(getResources().getColor(storeTheme.getStoreHeader()), PorterDuff.Mode.SRC_IN); } private void executeSpiceRequest(boolean useCache) { long cacheExpiryDuration = useCache ? DurationInMillis.ONE_HOUR * 6 : DurationInMillis.ALWAYS_EXPIRED; if (storeId <= 0) { spiceManager.execute( AptoideUtils.RepoUtils.buildStoreRequest(storeName, Constants.STORE_CONTEXT), Constants.STORE_CONTEXT + "-" + storeName + "-" + BUCKET_SIZE + "-" + AptoideUtils.getSharedPreferences().getBoolean(Constants.MATURE_CHECK_BOX, false), cacheExpiryDuration, listener); } else { spiceManager.execute( AptoideUtils.RepoUtils.buildStoreRequest(storeId, Constants.STORE_CONTEXT), Constants.STORE_CONTEXT + "-" + storeId + "-" + BUCKET_SIZE + "-" + AptoideUtils.getSharedPreferences().getBoolean(Constants.MATURE_CHECK_BOX, false), cacheExpiryDuration, listener); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.home || item.getItemId() == android.R.id.home) { finish(); } return super.onOptionsItemSelected(item); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(Constants.STOREID_KEY, storeId); outState.putString(Constants.STORENAME_KEY, storeName); outState.putInt(Constants.THEME_KEY, storeTheme.ordinal()); outState.putBoolean(Constants.STORE_SUBSCRIBED_KEY, subscribed); } @Override public void onStart() { super.onStart(); BusProvider.getInstance().register(this); if (!spiceManager.isStarted()) { spiceManager.start(this); } } @Override public void onStop() { super.onStop(); BusProvider.getInstance().unregister(this); if (spiceManager.isStarted()) { spiceManager.shouldStop(); } } @Override public void onDestroy() { super.onDestroy(); // Temporary workaround from memory issues AptoideUtils.UI.unbindDrawables(findViewById(R.id.store_layout)); } @Override public void voteComment(int commentId, AddApkCommentVoteRequest.CommentVote vote) { RequestListener<GenericResponseV2> commentRequestListener = new AlmostGenericResponseV2RequestListener() { @Override public void CaseOK() { Toast.makeText(StoresActivity.this, getString(R.string.vote_submitted), Toast.LENGTH_LONG).show(); } }; AptoideUtils.VoteUtils.voteComment( spiceManager, commentId, storeName, SecurePreferences.getInstance().getString("token", "empty"), commentRequestListener, vote); } @Subscribe public void onStoreCompleted(OttoEvents.RepoCompleteEvent event) { if (event.getRepoId() == storeId) { executeSpiceRequest(false); } } @Subscribe public void onStoreCompleted(OttoEvents.RepoSubscribeEvent event) { if (event.getStoreName().equals(storeName)) { args.putBoolean(Constants.STORE_SUBSCRIBED_KEY, subscribed = true); executeSpiceRequest(false); } } @Subscribe public void onStoreAuthorization(OttoEvents.StoreAuthorizationEvent event) { if (event.getId() == storeId) { final Login login = event.getLogin(); new AptoideDatabase(Aptoide.getDb()).updateStoreLogin(storeId, login); retry(); } } @Subscribe public void refreshStoresEvent(OttoEvents.RepoDeletedEvent event) { Logger.d("AptoideStoreActivity", "OnEvent " + event.getClass().getSimpleName()); args.putBoolean(Constants.STORE_SUBSCRIBED_KEY, subscribed = false); if (event.stores != null && !event.stores.isEmpty()) { for (Store store : event.stores) { AptoideUtils.RepoUtils.removeStoreOnCloud(store, StoresActivity.this, spiceManager); if (store.getName()!=null && storeName != null && store.getName().equals(storeName)) { executeSpiceRequest(false); } } } } @Subscribe public void subscribeRepo(OttoEvents.RepoSubscribeEvent event) { AptoideUtils.RepoUtils.startParse(event.getStoreName(), StoresActivity.this, spiceManager); } private void handleUnauthorized() { final DialogFragment dialogFragment = PasswordDialog.newInstance(storeId); dialogFragment.show(getSupportFragmentManager(), PasswordDialog.FRAGMENT_TAG); } private void handleErrorCondition(Exception e) { Logger.printException(e); progressBar.setVisibility(View.GONE); mViewPager.setVisibility(View.GONE); mAppBar.setVisibility(View.GONE); if (e instanceof NoNetworkException) { layoutError.setVisibility(View.GONE); layoutNoNetwork.setVisibility(View.VISIBLE); retryNoNetwork.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { retry(); } }); } else { layoutNoNetwork.setVisibility(View.GONE); layoutError.setVisibility(View.VISIBLE); retryError.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { retry(); } }); } } private void retry() { layoutError.setVisibility(View.GONE); layoutNoNetwork.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); executeSpiceRequest(false); } protected void handleSuccessCondition() { progressBar.setVisibility(View.GONE); layoutError.setVisibility(View.GONE); layoutNoNetwork.setVisibility(View.GONE); mViewPager.setVisibility(View.VISIBLE); mAppBar.setVisibility(View.VISIBLE); } @Override protected String getScreenName() { return "More Top Stores"; } }