From 9877c7fe2abf207b142c30aa15a35a3fca6daffa Mon Sep 17 00:00:00 2001 From: "Ravikumar.N" Date: Tue, 29 Nov 2016 23:32:31 +0530 Subject: [PATCH 01/27] Replaced RxJava1 RxRelay with RxJava2 version --- app/build.gradle | 2 +- .../com/morihacky/android/rxjava/rxbus/RxBus.java | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9d4306aa..99e29a4a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ dependencies { compile "com.github.akarnokd:rxjava2-interop:0.6.1" compile 'io.reactivex:rxjava-math:1.0.0' - compile 'com.jakewharton.rxrelay:rxrelay:1.2.0' + compile 'com.jakewharton.rxrelay2:rxrelay:2.0.0' compile 'com.jakewharton.rxbinding:rxbinding:0.2.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' diff --git a/app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBus.java b/app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBus.java index a953e20f..12f97b9d 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBus.java +++ b/app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBus.java @@ -1,8 +1,9 @@ package com.morihacky.android.rxjava.rxbus; -import com.jakewharton.rxrelay.PublishRelay; -import com.jakewharton.rxrelay.Relay; -import hu.akarnokd.rxjava.interop.RxJavaInterop; +import com.jakewharton.rxrelay2.PublishRelay; +import com.jakewharton.rxrelay2.Relay; + +import io.reactivex.BackpressureStrategy; import io.reactivex.Flowable; /** @@ -10,15 +11,14 @@ */ public class RxBus { - private final Relay _bus = PublishRelay.create().toSerialized(); + private final Relay _bus = PublishRelay.create().toSerialized(); public void send(Object o) { - _bus.call(o); + _bus.accept(o); } public Flowable asFlowable() { - // this won't be necessary after https://github.com/JakeWharton/RxRelay/pull/20 is complete - return RxJavaInterop.toV2Flowable(_bus.asObservable()); + return _bus.toFlowable(BackpressureStrategy.LATEST); } public boolean hasObservers() { From 9610af6b972a4394d87aeb6208db8d72aac87d3a Mon Sep 17 00:00:00 2001 From: TMTron Date: Tue, 24 Jan 2017 09:31:55 +0100 Subject: [PATCH 02/27] Now the EditText _inputSearchText is not accessed anymore from a non-UI thread by the filter() operator: instead we use the text-change event. This fixes #94 --- .../android/rxjava/fragments/DebounceSearchEmitterFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/morihacky/android/rxjava/fragments/DebounceSearchEmitterFragment.java b/app/src/main/java/com/morihacky/android/rxjava/fragments/DebounceSearchEmitterFragment.java index 9d2a3ba6..224bbc94 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/fragments/DebounceSearchEmitterFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/fragments/DebounceSearchEmitterFragment.java @@ -73,7 +73,7 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { _disposable = RxJavaInterop.toV2Observable(RxTextView.textChangeEvents(_inputSearchText)) .debounce(400, TimeUnit.MILLISECONDS)// default Scheduler is Computation - .filter(changes -> isNotNullOrEmpty(_inputSearchText.getText().toString())) + .filter(changes -> isNotNullOrEmpty(changes.text().toString())) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(_getSearchObserver()); } From c864c8f195fe0260f7058416924ac7250f8c9d85 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Tue, 31 Jan 2017 13:29:06 -0800 Subject: [PATCH 03/27] chore: ignore buck gen files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 26aca80c..01696e00 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,10 @@ build/ .gradle/ subProjects/facebook/build +# Buck files +buck-out/ +.buckd/ + # Intellij project files .idea/libraries .idea/.name From 0cd4b682a30d50a7ca082974c189620e81e36e80 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Tue, 25 Oct 2016 20:36:54 -0700 Subject: [PATCH 04/27] feat: add example for network connectivity detection --- app/src/main/AndroidManifest.xml | 2 + .../rxjava/fragments/MainFragment.java | 5 + .../fragments/NetworkDetectorFragment.java | 142 ++++++++++++++++++ app/src/main/res/layout/fragment_main.xml | 7 + .../res/layout/fragment_network_detector.xml | 23 +++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 181 insertions(+) create mode 100644 app/src/main/java/com/morihacky/android/rxjava/fragments/NetworkDetectorFragment.java create mode 100644 app/src/main/res/layout/fragment_network_detector.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7466dc56..3b469d7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,8 @@ + + diff --git a/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java b/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java index 07b974a2..725407f6 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java @@ -109,6 +109,11 @@ void demoVolleyRequest() { clickedOn(new VolleyDemoFragment()); } + @OnClick(R.id.btn_demo_networkDetector) + void demoNetworkDetector() { + clickedOn(new NetworkDetectorFragment()); + } + private void clickedOn(@NonNull Fragment fragment) { final String tag = fragment.getClass().toString(); getActivity().getSupportFragmentManager() diff --git a/app/src/main/java/com/morihacky/android/rxjava/fragments/NetworkDetectorFragment.java b/app/src/main/java/com/morihacky/android/rxjava/fragments/NetworkDetectorFragment.java new file mode 100644 index 00000000..4d4a7d78 --- /dev/null +++ b/app/src/main/java/com/morihacky/android/rxjava/fragments/NetworkDetectorFragment.java @@ -0,0 +1,142 @@ +package com.morihacky.android.rxjava.fragments; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import butterknife.Bind; +import butterknife.ButterKnife; +import com.morihacky.android.rxjava.R; +import java.util.ArrayList; +import java.util.List; +import rx.android.schedulers.AndroidSchedulers; +import rx.subjects.PublishSubject; + +public class NetworkDetectorFragment + extends BaseFragment { + + @Bind(R.id.list_threading_log) ListView logsList; + + private LogAdapter adapter; + private BroadcastReceiver broadcastReceiver; + private List logs; + private PublishSubject publishSubject; + + @Override + public void onDestroy() { + super.onDestroy(); + ButterKnife.unbind(this); + } + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View layout = inflater.inflate(R.layout.fragment_network_detector, container, false); + ButterKnife.bind(this, layout); + return layout; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setupLogger(); + } + + @Override + public void onStart() { + super.onStart(); + + publishSubject = PublishSubject.create(); + + publishSubject + .startWith(getConnectivityStatus(getActivity())) + .distinctUntilChanged() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(online -> { + if (online) { + log("You are online"); + } + else { + log("You are offline"); + } + }); + + listenToNetworkConnectivity(); + } + + @Override + public void onStop() { + super.onStop(); + getActivity().unregisterReceiver(broadcastReceiver); + } + + private void listenToNetworkConnectivity() { + + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + publishSubject.onNext(getConnectivityStatus(context)); + } + }; + + final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); + getActivity().registerReceiver(broadcastReceiver, intentFilter); + } + + private boolean getConnectivityStatus(Context context) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + return networkInfo != null && networkInfo.isConnected(); + } + + // ----------------------------------------------------------------------------------- + // Method that help wiring up the example (irrelevant to RxJava) + + private void log(String logMsg) { + + if (isCurrentlyOnMainThread()) { + logs.add(0, logMsg + " (main thread) "); + adapter.clear(); + adapter.addAll(logs); + } + else { + logs.add(0, logMsg + " (NOT main thread) "); + + // You can only do below stuff on main thread. + new Handler(Looper.getMainLooper()).post(() -> { + adapter.clear(); + adapter.addAll(logs); + }); + } + } + + private void setupLogger() { + logs = new ArrayList<>(); + adapter = new LogAdapter(getActivity(), new ArrayList<>()); + logsList.setAdapter(adapter); + } + + private boolean isCurrentlyOnMainThread() { + return Looper.myLooper() == Looper.getMainLooper(); + } + + private class LogAdapter + extends ArrayAdapter { + + public LogAdapter(Context context, List logs) { + super(context, R.layout.item_log, R.id.item_log, logs); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 322c2923..9de55c7c 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -120,5 +120,12 @@ android:layout_width="match_parent" android:text="@string/btn_demo_pagination" /> + +