@princessdharmy and I decided to build a native version of CryptoNews originally started by
@johnesan in xamarin(which was discontinued due to being a cross platform framework, it comes with so many limitations that makes the application unable to fully harness the power of native functionalities).
A ConnectionClassLiveData class that extends LiveData<ConnectionModel> was created . This class contains the BroadcastReceiver which monitors the network state.
The class shown below
public class ConnectionClassLiveData extends LiveData<ConnectionModel> {
private Context context;
@Inject
public ConnectionClassLiveData(Context context) {
this.context = context;
}
@Override
protected void onActive() {
super.onActive();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(networkReceiver, filter);
}
@Override
protected void onInactive() {
super.onInactive();
context.unregisterReceiver(networkReceiver);
}
private BroadcastReceiver networkReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getExtras() != null){
NetworkInfo actvenetwork = (NetworkInfo)
intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
boolean isConnected = actvenetwork != null &&
actvenetwork.isConnectedOrConnecting();
if (isConnected){
switch (actvenetwork.getType()){
case ConnectivityManager.TYPE_WIFI:
postValue(new ConnectionModel(WifiData, true));
break;
case ConnectivityManager.TYPE_MOBILE:
postValue(new ConnectionModel(MobileData, true));
break;
}
}else {
postValue(new ConnectionModel(0, false));
}
}
}
};
}
The BroadcastReceiver is registered in the active onActive and InActive() methods.
In our fragment, i was able to provide the ConnectionClassLiveData class with Dagger and implemented the way the snackbar behaves when the network Changed.
//Connection Listener to give us rea time internet connection status
connectionClassLiveData.observe(this, connectionModel -> {
if (connectionModel.isConnected()) {
isConnected = true;
if (newsList.size() == 0) {
newsViewModel.refresh();
}
} else {
isConnected = false;
Snackbar.make(mContainer, R.string.error, Snackbar.LENGTH_LONG).show();
}
The Swipe-to-refresh layout was implemnted in the onCreateView and was dismissed when the data was gotten.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_latest_news, container, false);
ButterKnife.bind(this, view);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setRefreshing(true);
swipeRefreshLayout.setColorSchemeColors(R.color.colorAccent, R.color.colorAccent, R.color.colorAccent);
setupViews();
return view;
}