package com.mehmetakiftutuncu.eshotroid.task; import java.util.ArrayList; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.widget.ListView; import com.mehmetakiftutuncu.eshotroid.R; import com.mehmetakiftutuncu.eshotroid.activity.Main; import com.mehmetakiftutuncu.eshotroid.activity.SetupWizard; import com.mehmetakiftutuncu.eshotroid.adapter.BusListAdapter; import com.mehmetakiftutuncu.eshotroid.database.BusDatabase; import com.mehmetakiftutuncu.eshotroid.fragment.AllBussesFragment; import com.mehmetakiftutuncu.eshotroid.model.Bus; import com.mehmetakiftutuncu.eshotroid.model.BusTimeTypes; import com.mehmetakiftutuncu.eshotroid.utility.Connection; import com.mehmetakiftutuncu.eshotroid.utility.Constants; import com.mehmetakiftutuncu.eshotroid.utility.Messages; import com.mehmetakiftutuncu.eshotroid.utility.Parser; import com.mehmetakiftutuncu.eshotroid.utility.Processor; /** An asynchronous task for getting the list of busses page * * @author mehmetakiftutuncu */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class GetListOfBussesPageTask extends AsyncTask<Void, Void, Void> { /** {@link Context} of the activity that uses runs this task */ private Context myContext; /** {@link AllBussesFragment} whose list will be updated */ private AllBussesFragment myAllBussesFragment; /** {@link ListView} in which the list of all busses will be shown */ private ListView myListView; /** Adapter of {@link GetListOfBussesPageTask#myListView} before new data is * downloaded and set */ private BusListAdapter oldAdapter; /** The contents of the page that will be downloaded and later parsed */ private String result; /** The resulting list of {@link Bus} objects after processing downloaded data */ private ArrayList<Bus> busses; /** Constructor for background downloading * * @param context {@link GetListOfBussesPageTask#myContext} */ public GetListOfBussesPageTask(Context context) { myContext = context; } /** Constructor for downloading and updating UI afterwards * * @param context {@link GetListOfBussesPageTask#myContext} * @param allBussesFragment {@link GetListOfBussesPageTask#allBussesFragment} */ public GetListOfBussesPageTask(Context context, AllBussesFragment allBussesFragment) { myContext = context; myAllBussesFragment = allBussesFragment; myListView = allBussesFragment.getListView(); // Get adapter to oldAdapter oldAdapter = (BusListAdapter) myListView.getAdapter(); // Remove the current adapter so the list will be shown as empty myAllBussesFragment.setBusListAdapter(null); } @Override protected Void doInBackground(Void... params) { // Post a message to the UI thread to notify user that refreshing started new Handler(myContext.getMainLooper()).post(new Runnable() { @Override public void run() { if(myAllBussesFragment != null) { // Show the progress in all busses page ((Main) myContext).toggleMode(true, Constants.PAGE_ID_ALL_BUSSES); } else { // Show the progress in setup wizard ((SetupWizard) myContext).toggleProgressBar(true); } Messages.getInstance().showNeutral((Activity) myContext, myContext.getString(R.string.info_allBusses_refreshing)); } }); // Go and get the page result = Connection.getPage(myContext, Constants.LIST_OF_BUSSES_URL); // If page is downloaded successfully if(result != null) { busses = null; // Parse and extract bus information from the page ArrayList<String> parsedBusses = Parser.parseBusses(result); if(parsedBusses != null) { // Create Bus objects from the parsed information busses = Processor.processListOfBusses(parsedBusses); } // If Bus objects were created successfully if(busses != null) { // Write all new Bus objects to the database BusDatabase db = BusDatabase.getDatabase(myContext); for(Bus i : busses) { /* Update favorited status of the new bus item so user won't * lose previously favorited busses during refreshing */ Bus bus = db.get(i.getNumber()); if(bus != null) { i.setFavorited(bus.isFavorited()); // Bus was favorited, download all times again if(bus.isFavorited()) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { new GetBusTimesPageTask(myContext, bus, BusTimeTypes.WEEK_DAY).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); new GetBusTimesPageTask(myContext, bus, BusTimeTypes.SATURDAY).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); new GetBusTimesPageTask(myContext, bus, BusTimeTypes.SUNDAY).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } else { new GetBusTimesPageTask(myContext, bus, BusTimeTypes.WEEK_DAY).execute(); new GetBusTimesPageTask(myContext, bus, BusTimeTypes.SATURDAY).execute(); new GetBusTimesPageTask(myContext, bus, BusTimeTypes.SUNDAY).execute(); } } } db.addOrUpdate(i); } db.closeDatabase(); } } return null; } @Override protected void onPostExecute(Void res) { super.onPostExecute(res); // If page is downloaded successfully if(result != null) { // If busses are created successfully if(busses != null) { Messages.getInstance().showPositive((Activity) myContext, myContext.getString(R.string.info_allBusses_successful)); if(myAllBussesFragment != null) { // Set new bus list myAllBussesFragment.setBusListAdapter(new BusListAdapter(myContext, busses)); } } else { Messages.getInstance().showNegative((Activity) myContext, myContext.getString(R.string.error_parse)); if(myAllBussesFragment != null) { // Page is downloaded but busses couldn't be parsed myAllBussesFragment.setBusListAdapter(oldAdapter); } } } else { Messages.getInstance().showNegative((Activity) myContext, myContext.getString(R.string.error_noConnection)); } if(myAllBussesFragment != null) { // Hide the progress in all busses page ((Main) myContext).toggleMode(false, Constants.PAGE_ID_ALL_BUSSES); } else { ((SetupWizard) myContext).setBusses(busses); // Hide the progress in setup wizard ((SetupWizard) myContext).toggleProgressBar(false); } } }