diff --git a/app/build.gradle b/app/build.gradle index d257451..e77ec5c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + dataBinding { + enabled = true + } } dependencies { @@ -33,4 +36,5 @@ dependencies { compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.1.5' + compile 'com.manaschaudhari:android-mvvm:0.1.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 72ef30a..3ade24b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,10 +1,11 @@ + package="com.chrisarriola.githubrxjava"> - + - + - + diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/BindingAdapters.java b/app/src/main/java/com/chrisarriola/githubrxjava/BindingAdapters.java new file mode 100644 index 0000000..4c00687 --- /dev/null +++ b/app/src/main/java/com/chrisarriola/githubrxjava/BindingAdapters.java @@ -0,0 +1,24 @@ +package com.chrisarriola.githubrxjava; + +import android.databinding.BindingConversion; +import android.view.View; + +import rx.subjects.PublishSubject; + +@SuppressWarnings("unused") +public class BindingAdapters { + + @BindingConversion + public static View.OnClickListener subjectToListener(final PublishSubject subject) { + if (subject != null) { + return new View.OnClickListener() { + @Override + public void onClick(View view) { + subject.onNext(null); + } + }; + } else { + return null; + } + } +} diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/GitHubRepoAdapter.java b/app/src/main/java/com/chrisarriola/githubrxjava/GitHubRepoAdapter.java deleted file mode 100644 index c1efde0..0000000 --- a/app/src/main/java/com/chrisarriola/githubrxjava/GitHubRepoAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.chrisarriola.githubrxjava; - -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by chris on 6/1/16. - */ -public class GitHubRepoAdapter extends BaseAdapter { - - private List gitHubRepos = new ArrayList<>(); - - @Override public int getCount() { - return gitHubRepos.size(); - } - - @Override public GitHubRepo getItem(int position) { - if (position < 0 || position >= gitHubRepos.size()) { - return null; - } else { - return gitHubRepos.get(position); - } - } - - @Override public long getItemId(int position) { - return position; - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - final View view = (convertView != null ? convertView : createView(parent)); - final GitHubRepoViewHolder viewHolder = (GitHubRepoViewHolder) view.getTag(); - viewHolder.setGitHubRepo(getItem(position)); - return view; - } - - public void setGitHubRepos(@Nullable List repos) { - if (repos == null) { - return; - } - gitHubRepos.clear(); - gitHubRepos.addAll(repos); - notifyDataSetChanged(); - } - - private View createView(ViewGroup parent) { - final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - final View view = inflater.inflate(R.layout.item_github_repo, parent, false); - final GitHubRepoViewHolder viewHolder = new GitHubRepoViewHolder(view); - view.setTag(viewHolder); - return view; - } - - public void add(GitHubRepo gitHubRepo) { - gitHubRepos.add(gitHubRepo); - notifyDataSetChanged(); - } - - private static class GitHubRepoViewHolder { - - private TextView textRepoName; - private TextView textRepoDescription; - private TextView textLanguage; - private TextView textStars; - - public GitHubRepoViewHolder(View view) { - textRepoName = (TextView) view.findViewById(R.id.text_repo_name); - textRepoDescription = (TextView) view.findViewById(R.id.text_repo_description); - textLanguage = (TextView) view.findViewById(R.id.text_language); - textStars = (TextView) view.findViewById(R.id.text_stars); - } - - public void setGitHubRepo(GitHubRepo gitHubRepo) { - textRepoName.setText(gitHubRepo.name); - textRepoDescription.setText(gitHubRepo.description); - textLanguage.setText("Language: " + gitHubRepo.language); - textStars.setText("Stars: " + gitHubRepo.stargazersCount); - } - } -} diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/GithubApplication.java b/app/src/main/java/com/chrisarriola/githubrxjava/GithubApplication.java new file mode 100644 index 0000000..e1f4554 --- /dev/null +++ b/app/src/main/java/com/chrisarriola/githubrxjava/GithubApplication.java @@ -0,0 +1,21 @@ +package com.chrisarriola.githubrxjava; + +import android.app.Application; +import android.databinding.ViewDataBinding; + +import com.manaschaudhari.android_mvvm.ViewModel; +import com.manaschaudhari.android_mvvm.adapters.ViewModelBinder; +import com.manaschaudhari.android_mvvm.utils.BindingUtils; + +public class GithubApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + BindingUtils.setDefaultBinder(new ViewModelBinder() { + @Override + public void bind(ViewDataBinding viewDataBinding, ViewModel viewModel) { + viewDataBinding.setVariable(com.chrisarriola.githubrxjava.BR.vm, viewModel); + } + }); + } +} diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/GithubRepoVM.java b/app/src/main/java/com/chrisarriola/githubrxjava/GithubRepoVM.java new file mode 100644 index 0000000..f5dd96a --- /dev/null +++ b/app/src/main/java/com/chrisarriola/githubrxjava/GithubRepoVM.java @@ -0,0 +1,18 @@ +package com.chrisarriola.githubrxjava; + +import com.manaschaudhari.android_mvvm.ViewModel; + +public class GithubRepoVM implements ViewModel { + public final String name; + public final String description; + public final String language; + public final String stars; + + public GithubRepoVM(GitHubRepo repo) { + name = repo.name; + description = repo.description; + language = "Language: " + repo.language; + stars = "Stars: " + repo.stargazersCount; + } + +} diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/MainActivity.java b/app/src/main/java/com/chrisarriola/githubrxjava/MainActivity.java index 617f871..58025bd 100644 --- a/app/src/main/java/com/chrisarriola/githubrxjava/MainActivity.java +++ b/app/src/main/java/com/chrisarriola/githubrxjava/MainActivity.java @@ -1,70 +1,20 @@ package com.chrisarriola.githubrxjava; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.text.TextUtils; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ListView; -import java.util.List; -import rx.Observer; -import rx.Subscription; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; +import android.support.annotation.NonNull; -public class MainActivity extends AppCompatActivity { +import com.manaschaudhari.android_mvvm.MvvmActivity; +import com.manaschaudhari.android_mvvm.ViewModel; - private static final String TAG = MainActivity.class.getSimpleName(); - private GitHubRepoAdapter adapter = new GitHubRepoAdapter(); - private Subscription subscription; +public class MainActivity extends MvvmActivity { - @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - final ListView listView = (ListView) findViewById(R.id.list_view_repos); - listView.setAdapter(adapter); - - final EditText editTextUsername = (EditText) findViewById(R.id.edit_text_username); - final Button buttonSearch = (Button) findViewById(R.id.button_search); - buttonSearch.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - final String username = editTextUsername.getText().toString(); - if (!TextUtils.isEmpty(username)) { - getStarredRepos(username); - } - } - }); - } - - @Override protected void onDestroy() { - if (subscription != null && !subscription.isUnsubscribed()) { - subscription.unsubscribe(); - } - super.onDestroy(); + @NonNull + @Override + public ViewModel createViewModel() { + return new MainViewModel(); } - private void getStarredRepos(String username) { - subscription = GitHubClient.getInstance() - .getStarredRepos(username) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override public void onCompleted() { - Log.d(TAG, "In onCompleted()"); - } - - @Override public void onError(Throwable e) { - e.printStackTrace(); - Log.d(TAG, "In onError()"); - } - - @Override public void onNext(List gitHubRepos) { - Log.d(TAG, "In onNext()"); - adapter.setGitHubRepos(gitHubRepos); - } - }); + @Override + public int getLayoutId() { + return R.layout.activity_main; } } diff --git a/app/src/main/java/com/chrisarriola/githubrxjava/MainViewModel.java b/app/src/main/java/com/chrisarriola/githubrxjava/MainViewModel.java new file mode 100644 index 0000000..558e8cc --- /dev/null +++ b/app/src/main/java/com/chrisarriola/githubrxjava/MainViewModel.java @@ -0,0 +1,47 @@ +package com.chrisarriola.githubrxjava; + +import android.databinding.ObservableField; + +import com.manaschaudhari.android_mvvm.ViewModel; + +import java.util.ArrayList; +import java.util.List; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; +import rx.subjects.PublishSubject; + +import static com.manaschaudhari.android_mvvm.FieldUtils.toObservable; + +public class MainViewModel implements ViewModel { + public final Observable> repositories; + public final ObservableField username = new ObservableField<>(); + public final PublishSubject onSearchClick = PublishSubject.create(); + + public MainViewModel() { + repositories = + toObservable(this.username) + .sample(onSearchClick) + .switchMap(new Func1>>() { + @Override + public Observable> call(String username) { + return GitHubClient.getInstance() + .getStarredRepos(username) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map(new Func1, List>() { + @Override + public List call(List gitHubRepos) { + List vms = new ArrayList<>(); + for (GitHubRepo repo : gitHubRepos) { + vms.add(new GithubRepoVM(repo)); + } + return vms; + } + }); + } + }); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d49371b..9210c53 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,34 +1,49 @@ - - - + + + + + + + android:layout_height="match_parent" + android:orientation="vertical"> - + bind:items="@{vm.repositories}" + bind:layout_vertical="@{true}" + bind:view_provider="@{@layout/item_github_repo}" /> -