package io.github.droidkaigi.confsched.activity;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.crashlytics.android.Crashlytics;
import java.util.List;
import javax.inject.Inject;
import io.github.droidkaigi.confsched.R;
import io.github.droidkaigi.confsched.api.DroidKaigiClient;
import io.github.droidkaigi.confsched.dao.ContributorDao;
import io.github.droidkaigi.confsched.databinding.ActivityContributorsBinding;
import io.github.droidkaigi.confsched.databinding.ItemContributorBinding;
import io.github.droidkaigi.confsched.model.Contributor;
import io.github.droidkaigi.confsched.util.AnalyticsTracker;
import io.github.droidkaigi.confsched.util.AppUtil;
import io.github.droidkaigi.confsched.widget.ArrayRecyclerAdapter;
import io.github.droidkaigi.confsched.widget.BindingHolder;
import io.github.droidkaigi.confsched.widget.itemdecoration.DividerItemDecoration;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
public class ContributorsActivity extends BaseActivity {
public static final String TAG = ContributorsActivity.class.getSimpleName();
@Inject
AnalyticsTracker analyticsTracker;
@Inject
DroidKaigiClient client;
@Inject
ContributorDao dao;
@Inject
CompositeSubscription compositeSubscription;
private ActivityContributorsBinding binding;
public static Intent createIntent(@NonNull Context context) {
return new Intent(context, ContributorsActivity.class);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_contributors);
getComponent().inject(this);
initToolbar();
binding.recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), R.drawable.border_small));
binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
compositeSubscription.add(fetchContributors());
}
private Subscription fetchContributors() {
return client.getContributors()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(() -> binding.progressBar.setVisibility(View.VISIBLE))
.doOnCompleted(() -> binding.progressBar.setVisibility(View.GONE))
.doOnError((throwable) -> binding.progressBar.setVisibility(View.GONE))
.subscribe(
this::renderContributors,
this::renderSavedContributors
);
}
private void renderContributors(List<Contributor> contributors) {
bindContributors(contributors);
dao.upserterAll(contributors);
}
// renderSavedContributors is called when error
private void renderSavedContributors(Throwable throwable) {
Log.e(TAG, "Failed to fetchContributors.", throwable);
Crashlytics.logException(throwable);
List<Contributor> contributors = dao.findAll();
if (contributors.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.contributors_load_error, Snackbar.LENGTH_LONG).show();
} else {
bindContributors(contributors);
}
}
private void bindContributors(List<Contributor> contributors) {
int count = contributors.size();
String title = binding.toolbar.getTitle().toString()
+ " "
+ getResources().getQuantityString(R.plurals.number_with_brackets, count, count);
binding.toolbar.setTitle(title);
ContributorsAdapter adapter = new ContributorsAdapter(this);
adapter.addAll(contributors);
binding.recyclerView.setAdapter(adapter);
}
private void initToolbar() {
setSupportActionBar(binding.toolbar);
ActionBar bar = getSupportActionBar();
if (bar != null) {
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowHomeEnabled(true);
bar.setDisplayShowTitleEnabled(false);
bar.setHomeButtonEnabled(true);
}
binding.toolbar.setTitle(getString(R.string.about_contributors));
}
@Override
protected void onStart() {
super.onStart();
analyticsTracker.sendScreenView("contributors");
}
@Override
protected void onDestroy() {
compositeSubscription.unsubscribe();
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
private class ContributorsAdapter extends ArrayRecyclerAdapter<Contributor, BindingHolder<ItemContributorBinding>> {
public ContributorsAdapter(Context context) {
super(context);
}
@Override
public BindingHolder<ItemContributorBinding> onCreateViewHolder(ViewGroup parent, int viewType) {
return new BindingHolder<>(getContext(), parent, R.layout.item_contributor);
}
@Override
public void onBindViewHolder(BindingHolder<ItemContributorBinding> holder, int position) {
Contributor contributor = getItem(position);
ItemContributorBinding itemBinding = holder.binding;
itemBinding.setContributor(contributor);
itemBinding.getRoot().setOnClickListener(v ->
AppUtil.showWebPage(ContributorsActivity.this, contributor.htmlUrl));
}
}
}