itachi1706/SingBuses

View on GitHub
app/src/main/java/com/itachi1706/busarrivalsg/AsyncTasks/GetNTUPublicBusData.java

Summary

Maintainability
A
3 hrs
Test Coverage
package com.itachi1706.busarrivalsg.AsyncTasks;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import com.google.gson.Gson;
import com.itachi1706.busarrivalsg.Database.BusStopsDB;
import com.itachi1706.busarrivalsg.NTUBusActivity;
import com.itachi1706.busarrivalsg.R;
import com.itachi1706.busarrivalsg.gsonObjects.sgLTA.BusStopJSON;
import com.itachi1706.busarrivalsg.util.StaticVariables;
import com.itachi1706.helperlib.concurrent.CoroutineAsyncTask;
import com.itachi1706.helperlib.helpers.LogHelper;
import com.itachi1706.helperlib.helpers.URLHelper;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.SocketTimeoutException;
import java.util.ArrayList;

/**
 * Created by Kenneth on 07/9/2018
 * for SingBuses in package com.itachi1706.busarrivalsg.AsyncTasks
 */
public class GetNTUPublicBusData extends CoroutineAsyncTask<Void, Void, Integer> {

    private final WeakReference<Activity> activityRef;
    private Exception except;
    private final boolean update;
    private static final String TAG = "NTUPublicBusData";
    private static final String TASK_NAME = GetNTUPublicBusData.class.getSimpleName();

    // Bus Stop Codes to get (we will get it based off the last stop on campus)
    // 199: 27199, 179(A): 27261;

    public GetNTUPublicBusData(Activity activity, boolean update) {
        super(TASK_NAME);
        this.activityRef = new WeakReference<>(activity);
        this.update = update;
    }

    @Override
    public Integer doInBackground(@NonNull Void... params) {
        Activity mActivity = activityRef.get();
        String url = "https://api.itachi1706.com/api/busarrival.php?CSV=27199:199;27261:179;27261:179A&api=2";

        LogHelper.d(TAG, url);
        String tmp;
        try {
            long start = System.currentTimeMillis();
            URLHelper urlHelper = new URLHelper(url);
            tmp = urlHelper.executeString();
            LogHelper.i(TAG, "Data retrieved in " + (System.currentTimeMillis() - start) + "ms");
        } catch (IOException e) {
            except = e;
            return 1;
        }

        LogHelper.d(TAG, (tmp == null) ? "null" : tmp);
        if (tmp == null || !StaticVariables.INSTANCE.checkIfYouGotJsonString(tmp)) {
            except = new Exception(mActivity.getResources().getString(R.string.toast_message_invalid_json));
            return 2;
        }

        Intent sendForMapParsingIntent = new Intent(NTUBusActivity.RECEIVE_NTU_PUBLIC_BUS_DATA_EVENT);
        sendForMapParsingIntent.putExtra("data", tmp);
        sendForMapParsingIntent.putExtra("update", true);
        mActivity.runOnUiThread(() -> LocalBroadcastManager.getInstance(mActivity).sendBroadcast(sendForMapParsingIntent));

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mActivity);
        if (!update && sp.getBoolean("showntusbsstops", true)) {
            // We will send data related to stops as well
            BusStopsDB db = new BusStopsDB(mActivity);
            ArrayList<BusStopJSON> jsons = new ArrayList<>();
            jsons.addAll(db.getBusStopsBySvcNo("179", "SBST"));
            jsons.addAll(db.getBusStopsBySvcNo("179A", "SBST"));
            jsons.addAll(db.getBusStopsBySvcNo("199", "SBST"));
            BusStopJSON[] stops = jsons.toArray(new BusStopJSON[0]);

            Gson gson = new Gson();
            String js = gson.toJson(stops, BusStopJSON[].class);
            Intent sendForParseIntent = new Intent(NTUBusActivity.RECEIVE_NTU_PUBLIC_BUS_DATA_EVENT);
            sendForParseIntent.putExtra("data", js);
            sendForParseIntent.putExtra("update", false);
            mActivity.runOnUiThread(() -> LocalBroadcastManager.getInstance(mActivity).sendBroadcast(sendForParseIntent));
        }
        return 0;
    }

    public void onPostExecute(Integer errorCode) {
        Context context = activityRef.get();
        if (except != null && errorCode != 0) {
            LogHelper.e(TAG, "Exception occurred (" + except.getMessage() + ")");
            if (except instanceof SocketTimeoutException) {
                Toast.makeText(context, "NTU API did not respond in a timely manner", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, except.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }
}