Andy Eshiet avatar

Reimplementing CrytpoNews in Native Android (UPDATE #3 : NETWORK LISTENER)

mathemandy

Published: 28 Mar 2018 › Updated: 28 Mar 2018Reimplementing CrytpoNews in Native Android (UPDATE #3 :  NETWORK LISTENER)

Reimplementing CrytpoNews in Native Android (UPDATE #3 : NETWORK LISTENER)

princessdharmy@princessdharmy and I decided to build a native version of CryptoNews originally started by johnesan@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).

History

Update and New Features

  • User Can Now see Snackbar when Internet Connection is absent.
    Before this update, a single check was made while the activity is loaded to check for Internet action. I added a Livedata Listener to Update once the user loses Internet Connection. This use of a Snackbar provides the user with a smooth user experience without hindering the user's experience on the app.
  • When a User starts without Internet Access - Turning on the data fetches the data automatically without leaving the activity.
  • When a User Scrolls an already fetched List - He is also reminded about the Internet Connection
  • Progressbar was completely removed from the First Activity and replaced with existing swipe_to_refresh layout. (Progressbar was redundant)
  • Enabled landscape Layout (:))

How it was implemented

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;
    }

RECORDING OF ADDED FEATURE

Roadmap

  • Searching all news
  • Persisting user news
  • Providing different layouts (Work in Progress)
  • Providing different themes for user
  • Push Notifications
  • News Posts sharing
  • Incorporating more news and giving the user the flexibility of deciding what he wants to read per time.

Resources

  • Github Commits - Link of commit can be found here
  • Apk for download - Download here



Posted on Utopian.io - Rewarding Open Source Contributors

Leave Reimplementing CrytpoNews in Native Android (UPDATE #3 : NETWORK LISTENER) to:

Written by

Android App Developer | Product Designer | Technical Writer

Read more #utopian-io posts


Best Posts From Andy Eshiet

We have not curated any of mathemandy's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From Andy Eshiet