Skip to content

Commit 0cd4b68

Browse files
author
Kaushik Gopal
committed
feat: add example for network connectivity detection
1 parent c864c8f commit 0cd4b68

File tree

6 files changed

+181
-0
lines changed

6 files changed

+181
-0
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
</intent-filter>
2222
</activity>
2323
</application>
24+
2425
<uses-permission android:name="android.permission.INTERNET"/>
26+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2527

2628
</manifest>

app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ void demoVolleyRequest() {
109109
clickedOn(new VolleyDemoFragment());
110110
}
111111

112+
@OnClick(R.id.btn_demo_networkDetector)
113+
void demoNetworkDetector() {
114+
clickedOn(new NetworkDetectorFragment());
115+
}
116+
112117
private void clickedOn(@NonNull Fragment fragment) {
113118
final String tag = fragment.getClass().toString();
114119
getActivity().getSupportFragmentManager()
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.morihacky.android.rxjava.fragments;
2+
3+
import android.content.BroadcastReceiver;
4+
import android.content.Context;
5+
import android.content.Intent;
6+
import android.content.IntentFilter;
7+
import android.net.ConnectivityManager;
8+
import android.net.NetworkInfo;
9+
import android.os.Bundle;
10+
import android.os.Handler;
11+
import android.os.Looper;
12+
import android.support.annotation.Nullable;
13+
import android.view.LayoutInflater;
14+
import android.view.View;
15+
import android.view.ViewGroup;
16+
import android.widget.ArrayAdapter;
17+
import android.widget.ListView;
18+
import butterknife.Bind;
19+
import butterknife.ButterKnife;
20+
import com.morihacky.android.rxjava.R;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import rx.android.schedulers.AndroidSchedulers;
24+
import rx.subjects.PublishSubject;
25+
26+
public class NetworkDetectorFragment
27+
extends BaseFragment {
28+
29+
@Bind(R.id.list_threading_log) ListView logsList;
30+
31+
private LogAdapter adapter;
32+
private BroadcastReceiver broadcastReceiver;
33+
private List<String> logs;
34+
private PublishSubject<Boolean> publishSubject;
35+
36+
@Override
37+
public void onDestroy() {
38+
super.onDestroy();
39+
ButterKnife.unbind(this);
40+
}
41+
42+
@Override
43+
public View onCreateView(LayoutInflater inflater,
44+
@Nullable ViewGroup container,
45+
@Nullable Bundle savedInstanceState) {
46+
View layout = inflater.inflate(R.layout.fragment_network_detector, container, false);
47+
ButterKnife.bind(this, layout);
48+
return layout;
49+
}
50+
51+
@Override
52+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
53+
super.onActivityCreated(savedInstanceState);
54+
setupLogger();
55+
}
56+
57+
@Override
58+
public void onStart() {
59+
super.onStart();
60+
61+
publishSubject = PublishSubject.create();
62+
63+
publishSubject
64+
.startWith(getConnectivityStatus(getActivity()))
65+
.distinctUntilChanged()
66+
.observeOn(AndroidSchedulers.mainThread())
67+
.subscribe(online -> {
68+
if (online) {
69+
log("You are online");
70+
}
71+
else {
72+
log("You are offline");
73+
}
74+
});
75+
76+
listenToNetworkConnectivity();
77+
}
78+
79+
@Override
80+
public void onStop() {
81+
super.onStop();
82+
getActivity().unregisterReceiver(broadcastReceiver);
83+
}
84+
85+
private void listenToNetworkConnectivity() {
86+
87+
broadcastReceiver = new BroadcastReceiver() {
88+
@Override
89+
public void onReceive(Context context, Intent intent) {
90+
publishSubject.onNext(getConnectivityStatus(context));
91+
}
92+
};
93+
94+
final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
95+
getActivity().registerReceiver(broadcastReceiver, intentFilter);
96+
}
97+
98+
private boolean getConnectivityStatus(Context context) {
99+
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
100+
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
101+
return networkInfo != null && networkInfo.isConnected();
102+
}
103+
104+
// -----------------------------------------------------------------------------------
105+
// Method that help wiring up the example (irrelevant to RxJava)
106+
107+
private void log(String logMsg) {
108+
109+
if (isCurrentlyOnMainThread()) {
110+
logs.add(0, logMsg + " (main thread) ");
111+
adapter.clear();
112+
adapter.addAll(logs);
113+
}
114+
else {
115+
logs.add(0, logMsg + " (NOT main thread) ");
116+
117+
// You can only do below stuff on main thread.
118+
new Handler(Looper.getMainLooper()).post(() -> {
119+
adapter.clear();
120+
adapter.addAll(logs);
121+
});
122+
}
123+
}
124+
125+
private void setupLogger() {
126+
logs = new ArrayList<>();
127+
adapter = new LogAdapter(getActivity(), new ArrayList<>());
128+
logsList.setAdapter(adapter);
129+
}
130+
131+
private boolean isCurrentlyOnMainThread() {
132+
return Looper.myLooper() == Looper.getMainLooper();
133+
}
134+
135+
private class LogAdapter
136+
extends ArrayAdapter<String> {
137+
138+
public LogAdapter(Context context, List<String> logs) {
139+
super(context, R.layout.item_log, R.id.item_log, logs);
140+
}
141+
}
142+
}

app/src/main/res/layout/fragment_main.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,12 @@
120120
android:layout_width="match_parent"
121121
android:text="@string/btn_demo_pagination"
122122
/>
123+
124+
<Button
125+
android:id="@+id/btn_demo_networkDetector"
126+
android:layout_height="wrap_content"
127+
android:layout_width="match_parent"
128+
android:text="@string/btn_demo_networkDetector"
129+
/>
123130
</LinearLayout>
124131
</ScrollView>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<LinearLayout
4+
xmlns:android="http://schemas.android.com/apk/res/android"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
android:orientation="vertical"
8+
>
9+
10+
<TextView
11+
android:layout_width="match_parent"
12+
android:layout_height="wrap_content"
13+
android:gravity="center"
14+
android:padding="10dp"
15+
android:text="@string/msg_demo_network_detector"
16+
/>
17+
18+
<ListView
19+
android:id="@+id/list_threading_log"
20+
android:layout_width="match_parent"
21+
android:layout_height="match_parent"
22+
/>
23+
</LinearLayout>

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<string name="btn_demo_volley">Volley request demo</string>
2323
<string name="btn_demo_pagination">Paging example</string>
2424
<string name="btn_demo_pagination_more">MOAR</string>
25+
<string name="btn_demo_networkDetector">Network Detector (Subject)</string>
2526

2627
<string name="msg_demo_pagination">This is a demo of how you can do a list pagination with Rx. We page 10 items at a time and there are 55 items altogether</string>
2728
<string name="msg_demo_volley">This is a Volley request demo</string>
@@ -38,6 +39,7 @@
3839
<string name="msg_demo_form_comb_latest">Monitor the state of multiple observables with the combineLatest operator. Only after all the 3 inputs contain valid entries will the submit button light up</string>
3940
<string name="msg_demo_timing">BTN 1: run single task once (after 2s complete)\nBTN 2: run task every 1s (start delay of 1s) toggle \nBTN 3: run task every 1s (start immediately) toggle \nBTN 4: run task 5 times every 3s (then complete) \nBTN 5: run task A, pause for sometime, then proceed with Task B</string>
4041
<string name="msg_demo_rotation_persist">This is an example of starting an Observable and using the result across rotations. There are many ways to do this, we use a retained fragment in this example</string>
42+
<string name="msg_demo_network_detector">This is a demo of how to use Subjects to detect Network connectivity\nToggle your Wifi/Network on or off and notice the logs</string>
4143

4244
<string name="msg_pseudoCache_demoInfo_concat">Concat merges the results sequentially. But notice that the latter subscription starts only AFTER the first one completes. Some unnecessary waiting there.</string>
4345
<string name="msg_pseudoCache_demoInfo_concatEager">Concat eager is cooler. Both subscriptions start at the same time (parallely) but the order of emission is respected.</string>

0 commit comments

Comments
 (0)