package com.arellomobile.mvp.sample.github.ui.activities; import java.util.List; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.arellomobile.mvp.MvpAppCompatActivity; import com.arellomobile.mvp.presenter.InjectPresenter; import com.arellomobile.mvp.sample.github.R; import com.arellomobile.mvp.sample.github.mvp.models.Repository; import com.arellomobile.mvp.sample.github.mvp.presenters.HomePresenter; import com.arellomobile.mvp.sample.github.mvp.presenters.RepositoriesPresenter; import com.arellomobile.mvp.sample.github.mvp.presenters.SignOutPresenter; import com.arellomobile.mvp.sample.github.mvp.views.HomeView; import com.arellomobile.mvp.sample.github.mvp.views.RepositoriesView; import com.arellomobile.mvp.sample.github.mvp.views.SignOutView; import com.arellomobile.mvp.sample.github.ui.adapters.RepositoriesAdapter; import com.arellomobile.mvp.sample.github.ui.fragments.DetailsFragment; import com.arellomobile.mvp.sample.github.ui.views.FrameSwipeRefreshLayout; import butterknife.BindView; import butterknife.ButterKnife; public class HomeActivity extends MvpAppCompatActivity implements SignOutView, RepositoriesView, HomeView, RepositoriesAdapter.OnScrollToBottomListener { @InjectPresenter SignOutPresenter mSignOutPresenter; @InjectPresenter RepositoriesPresenter mRepositoriesPresenter; @InjectPresenter HomePresenter mHomePresenter; @BindView(R.id.activity_home_toolbar) Toolbar mToolbar; @BindView(R.id.activity_home_swipe_refresh_layout) FrameSwipeRefreshLayout mSwipeRefreshLayout; @BindView(R.id.activity_home_progress_bar_repositories) ProgressBar mRepositoriesProgressBar; @BindView(R.id.activity_home_list_view_repositories) ListView mRepositoriesListView; @BindView(R.id.activity_home_text_view_no_repositories) TextView mNoRepositoriesTextView; @BindView(R.id.activity_home_frame_layout_details) FrameLayout mDetailsFragmeLayout; private AlertDialog mErrorDialog; private RepositoriesAdapter mRepositoriesAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); ButterKnife.bind(this); setSupportActionBar(mToolbar); mSwipeRefreshLayout.setListViewChild(mRepositoriesListView); mSwipeRefreshLayout.setOnRefreshListener(() -> mRepositoriesPresenter.loadRepositories(true)); mRepositoriesAdapter = new RepositoriesAdapter(getMvpDelegate(), this); mRepositoriesListView.setAdapter(mRepositoriesAdapter); mRepositoriesListView.setOnItemClickListener((parent, view, position, id) -> { if (mRepositoriesAdapter.getItemViewType(position) != RepositoriesAdapter.REPOSITORY_VIEW_TYPE) { return; } mHomePresenter.onRepositorySelection(position, mRepositoriesAdapter.getItem(position)); }); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_home, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_home_sign_out) { mSignOutPresenter.signOut(); return true; } return super.onOptionsItemSelected(item); } @Override public void signOut() { final Intent intent = new Intent(this, SplashActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } @Override public void onStartLoading() { mSwipeRefreshLayout.setEnabled(false); } @Override public void onFinishLoading() { mSwipeRefreshLayout.setEnabled(true); } @Override public void showRefreshing() { mSwipeRefreshLayout.post(() -> mSwipeRefreshLayout.setRefreshing(true)); } @Override public void hideRefreshing() { mSwipeRefreshLayout.post(() -> mSwipeRefreshLayout.setRefreshing(false)); } @Override public void showListProgress() { mRepositoriesListView.setVisibility(View.GONE); mNoRepositoriesTextView.setVisibility(View.GONE); mRepositoriesProgressBar.setVisibility(View.VISIBLE); } @Override public void hideListProgress() { mRepositoriesListView.setVisibility(View.VISIBLE); mRepositoriesProgressBar.setVisibility(View.GONE); } @Override public void showError(String message) { mErrorDialog = new AlertDialog.Builder(this) .setTitle(R.string.app_name) .setMessage(message) .setOnCancelListener(dialog -> mRepositoriesPresenter.onErrorCancel()) .show(); } @Override public void hideError() { if (mErrorDialog != null && mErrorDialog.isShowing()) { mErrorDialog.hide(); } } @Override public void setRepositories(List<Repository> repositories, boolean maybeMore) { mRepositoriesListView.setEmptyView(mNoRepositoriesTextView); mRepositoriesAdapter.setRepositories(repositories, maybeMore); } @Override public void addRepositories(List<Repository> repositories, boolean maybeMore) { mRepositoriesListView.setEmptyView(mNoRepositoriesTextView); mRepositoriesAdapter.addRepositories(repositories, maybeMore); } @Override public void showDetailsContainer() { if (mDetailsFragmeLayout.getVisibility() == View.GONE) { mDetailsFragmeLayout.setVisibility(View.VISIBLE); } } @Override public void setSelection(int position) { mRepositoriesAdapter.setSelection(position); } @Override public void showDetails(int position, Repository repository) { getSupportFragmentManager() .beginTransaction() .replace(R.id.activity_home_frame_layout_details, DetailsFragment.getInstance(repository)) .commit(); } @Override public void onScrollToBottom() { mRepositoriesPresenter.loadNextRepositories(mRepositoriesAdapter.getRepositoriesCount()); } @Override protected void onDestroy() { if (mErrorDialog != null && mErrorDialog.isShowing()) { mErrorDialog.setOnCancelListener(null); mErrorDialog.dismiss(); } super.onDestroy(); } }