package com.ensarsarajcic.reactivegithubsample.views; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.ensarsarajcic.reactivegithubsample.R; import com.ensarsarajcic.reactivegithubsample.models.GitHubRepo; import com.ensarsarajcic.reactivegithubsample.models.GitHubUser; import com.ensarsarajcic.reactivegithubsample.network.RestClient; import com.jakewharton.rxbinding.view.RxView; import com.jakewharton.rxbinding.widget.RxCompoundButton; import com.jakewharton.rxbinding.widget.RxTextView; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Random; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.functions.Func2; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; /** * Created by ensar on 03/10/16. */ public class GitHubUsersAdapter extends RecyclerView.Adapter { public static final String TAG = GitHubUsersAdapter.class.getSimpleName(); private List users; private CompositeSubscription compositeSubscription; public GitHubUsersAdapter(List users) { this.users = users; compositeSubscription = new CompositeSubscription(); } public void setItems(List users) { this.users = users; } @Override public GitHubUserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); return new GitHubUserViewHolder(itemView); } @Override public void onBindViewHolder(final GitHubUserViewHolder holder, int position) { GitHubUser gitHubUser = users.get(position); holder.tvUserName.setText(gitHubUser.getLogin()); holder.tvUserUrl.setText(gitHubUser.getHtml_url()); Observable fetchImageObservable = Observable.just(gitHubUser).startWith(new GitHubUser()) .map(new Func1() { @Override public Bitmap call(GitHubUser gitHubUser) { if(gitHubUser.getAvatar_url() == null) { return BitmapFactory.decodeResource(holder.itemView.getContext().getResources(), R.mipmap.ic_launcher); } try { URL url = new URL(gitHubUser.getAvatar_url()); return BitmapFactory.decodeStream(url.openConnection().getInputStream()); } catch (Exception e) { e.printStackTrace(); return null; } } }) .filter(new Func1() { @Override public Boolean call(Bitmap bitmap) { return bitmap != null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); Observable> fetchUserReposObservable = Observable.just(gitHubUser) .map(new Func1>() { @Override public List call(GitHubUser gitHubUser) { try { return RestClient.getGitHubApi().getUserRepos(gitHubUser.getLogin()).execute().body(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "call: ", e); return null; } } }) .filter(new Func1, Boolean>() { @Override public Boolean call(List gitHubRepos) { return gitHubRepos != null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); // Observable randomReposObservable = RxView.clicks(holder.tvRepos).subscribeOn(AndroidSchedulers.mainThread()); // // compositeSubscription.add(randomReposObservable.subscribe(new Subscriber() { // @Override // public void onCompleted() { // Log.d(TAG, "onCompleted: "); // } // // @Override // public void onError(Throwable e) { // Log.d(TAG, "onError: "); // } // // @Override // public void onNext(Void aVoid) { // Log.d(TAG, "onNext: "); // } // })); // // Observable> gitHubReposObservable = Observable.combineLatest(randomReposObservable, fetchUserReposObservable, new Func2, List>() { // @Override // public List call(Void aVoid, List gitHubRepos) { // return gitHubRepos; // } // }).subscribeOn(AndroidSchedulers.mainThread()); Observable> repoNamesObservable = fetchUserReposObservable.map(new Func1, List>() { @Override public List call(List gitHubRepos) { List names = new ArrayList(); for (int i = 0; i < 3; i++) { if(gitHubRepos.isEmpty()) break; int position = new Random().nextInt(gitHubRepos.size()); names.add(gitHubRepos.get(position).getName()); gitHubRepos.remove(position); } return names; } }); compositeSubscription.add(fetchImageObservable.subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Bitmap bitmap) { holder.ivUser.setImageBitmap(bitmap); } })); final ArrayAdapter stringArrayAdapter = new ArrayAdapter(holder.itemView.getContext(), R.layout.repo); holder.lvRepos.setAdapter(stringArrayAdapter); compositeSubscription.add(repoNamesObservable.subscribe(new Subscriber>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List strings) { stringArrayAdapter.clear(); stringArrayAdapter.addAll(strings); stringArrayAdapter.notifyDataSetChanged(); } })); } @Override public int getItemCount() { return users.size(); } public class GitHubUserViewHolder extends RecyclerView.ViewHolder { private ImageView ivUser; private TextView tvUserName; private TextView tvUserUrl; private ListView lvRepos; public GitHubUserViewHolder(View itemView) { super(itemView); ivUser = (ImageView) itemView.findViewById(R.id.ivUser); tvUserName = (TextView) itemView.findViewById(R.id.tvUserName); tvUserUrl = (TextView) itemView.findViewById(R.id.tvUserUrl); lvRepos = (ListView) itemView.findViewById(R.id.lvRepos); } } public void clearSubscriptions() { if(!compositeSubscription.isUnsubscribed()) { compositeSubscription.unsubscribe(); } } }