package com.kickstarter.ui.activities; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.jakewharton.rxbinding.support.v4.widget.RxDrawerLayout; import com.kickstarter.KSApplication; import com.kickstarter.R; import com.kickstarter.libs.ActivityRequestCodes; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.InternalToolsType; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.apiresponses.InternalBuildEnvelope; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.adapters.DiscoveryDrawerAdapter; import com.kickstarter.ui.adapters.DiscoveryPagerAdapter; import com.kickstarter.ui.data.LoginReason; import com.kickstarter.ui.fragments.DiscoveryFragment; import com.kickstarter.ui.toolbars.DiscoveryToolbar; import com.kickstarter.ui.views.SortTabLayout; import com.kickstarter.viewmodels.DiscoveryViewModel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import butterknife.Bind; import butterknife.BindString; import butterknife.ButterKnife; import rx.android.schedulers.AndroidSchedulers; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; import static com.kickstarter.libs.utils.TransitionUtils.slideInFromRight; import static com.kickstarter.libs.utils.TransitionUtils.transition; @RequiresActivityViewModel(DiscoveryViewModel.class) public final class DiscoveryActivity extends BaseActivity<DiscoveryViewModel> { private DiscoveryDrawerAdapter drawerAdapter; private LinearLayoutManager drawerLayoutManager; private DiscoveryPagerAdapter pagerAdapter; protected @Inject ApiClientType client; protected @Inject InternalToolsType internalTools; protected @Bind(R.id.discovery_layout) DrawerLayout discoveryLayout; protected @Bind(R.id.discovery_toolbar) DiscoveryToolbar discoveryToolbar; protected @Bind(R.id.discovery_drawer_recycler_view) RecyclerView drawerRecyclerView; protected @Bind(R.id.discovery_tab_layout) SortTabLayout sortTabLayout; protected @Bind(R.id.discovery_view_pager) ViewPager sortViewPager; protected @Bind(R.id.discovery_sort_app_bar_layout) AppBarLayout sortAppBarLayout; protected @BindString(R.string.A_newer_build_is_available) String aNewerBuildIsAvailableString; protected @BindString(R.string.Upgrade_app) String upgradeAppString; protected @BindString(R.string.Home) String homeString; protected @BindString(R.string.Popular) String popularString; protected @BindString(R.string.discovery_sort_types_newest) String newestString; protected @BindString(R.string.Ending_soon) String endingSoonString; protected @BindString(R.string.discovery_sort_types_most_funded) String mostFundedString; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.discovery_layout); ButterKnife.bind(this); ((KSApplication) getApplication()).component().inject(this); drawerLayoutManager = new LinearLayoutManager(this); drawerRecyclerView.setLayoutManager(drawerLayoutManager); drawerAdapter = new DiscoveryDrawerAdapter(viewModel.inputs); drawerRecyclerView.setAdapter(drawerAdapter); final List<String> viewPagerTitles = Arrays.asList( homeString, popularString, newestString, endingSoonString, mostFundedString ); pagerAdapter = new DiscoveryPagerAdapter( getSupportFragmentManager(), createFragments(viewPagerTitles.size()), viewPagerTitles, viewModel.inputs ); sortViewPager.setAdapter(pagerAdapter); sortTabLayout.setupWithViewPager(sortViewPager); viewModel.outputs.expandSortTabLayout() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(sortAppBarLayout::setExpanded); viewModel.outputs.updateToolbarWithParams() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(discoveryToolbar::loadParams); viewModel.outputs.updateParamsForPage() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pagerAdapter::takeParams); viewModel.outputs.clearPages() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(pagerAdapter::clearPages); viewModel.outputs.rootCategoriesAndPosition() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(cp -> pagerAdapter.takeCategoriesForPosition(cp.first, cp.second)); viewModel.outputs.showBuildCheckAlert() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::showBuildAlert); viewModel.outputs.showInternalTools() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> internalTools.maybeStartInternalToolsActivity(this)); viewModel.outputs.showLoginTout() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.startLoginToutActivity()); viewModel.outputs.showProfile() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.startProfileActivity()); viewModel.outputs.showSettings() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.startSettingsActivity()); viewModel.outputs.navigationDrawerData() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(drawerAdapter::takeData); viewModel.outputs.drawerIsOpen() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(RxDrawerLayout.open(discoveryLayout, GravityCompat.START)); RxDrawerLayout.drawerOpen(discoveryLayout, GravityCompat.START) .skip(1) .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(viewModel.inputs::openDrawer); } private static @NonNull List<DiscoveryFragment> createFragments(final int pages) { final List<DiscoveryFragment> fragments = new ArrayList<>(pages); for (int position = 0; position <= pages; position++) { fragments.add(DiscoveryFragment.newInstance(position)); } return fragments; } public @NonNull DrawerLayout discoveryLayout() { return discoveryLayout; } private void startLoginToutActivity() { final Intent intent = new Intent(this, LoginToutActivity.class) .putExtra(IntentKey.LOGIN_REASON, LoginReason.DEFAULT); startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW); transition(this, slideInFromRight()); } private void startProfileActivity() { final Intent intent = new Intent(this, ProfileActivity.class); startActivity(intent); overridePendingTransition(R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } private void startSettingsActivity() { final Intent intent = new Intent(this, SettingsActivity.class) .putExtra(IntentKey.LOGIN_REASON, LoginReason.DEFAULT); startActivity(intent); } private void showBuildAlert(final @NonNull InternalBuildEnvelope envelope) { new AlertDialog.Builder(this) .setTitle(upgradeAppString) .setMessage(aNewerBuildIsAvailableString) .setPositiveButton(android.R.string.yes, (dialog, which) -> { final Intent intent = new Intent(this, DownloadBetaActivity.class) .putExtra(IntentKey.INTERNAL_BUILD_ENVELOPE, envelope); startActivity(intent); }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> { }) .setIcon(android.R.drawable.ic_dialog_alert) .show(); } }