package com.mehmetakiftutuncu.eshotroid.activity;
import java.util.ArrayList;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mehmetakiftutuncu.eshotroid.R;
import com.mehmetakiftutuncu.eshotroid.database.BusDatabase;
import com.mehmetakiftutuncu.eshotroid.model.Bus;
import com.mehmetakiftutuncu.eshotroid.model.BusTimeTypes;
import com.mehmetakiftutuncu.eshotroid.task.GetBusTimesPageTask;
import com.mehmetakiftutuncu.eshotroid.task.GetListOfBussesPageTask;
import com.mehmetakiftutuncu.eshotroid.utility.Constants;
import com.mehmetakiftutuncu.eshotroid.utility.Messages;
/** Setup wizard activity of the application which lets user to initialize the
* application
*
* @author mehmetakiftutuncu */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class SetupWizard extends ActionBarActivity implements OnClickListener
{
private RelativeLayout downloadBussesProgressBarLayout;
private RelativeLayout optionsLayout;
private RadioGroup options;
private RelativeLayout downloadTimesProgressBarLayout;
private TextView downloadTimesStatus;
private ProgressBar downloadTimesProgressBar;
private Button start;
private ArrayList<Bus> busses;
/** Tag for debugging */
private static final String LOG_TAG = "Eshotroid_SetupWizard";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup_wizard);
initialize();
}
private void initialize()
{
downloadBussesProgressBarLayout = (RelativeLayout) findViewById(R.id.relativeLayout_activitySetupWizard_downloadBusses);
optionsLayout = (RelativeLayout) findViewById(R.id.relativeLayout_activitySetupWizard_options);
start = (Button) findViewById(R.id.button_activitySetupWizard_start);
options = (RadioGroup) findViewById(R.id.radioGroup_activitySetupWizard_options);
downloadTimesProgressBarLayout = (RelativeLayout) findViewById(R.id.relativeLayout_activitySetupWizard_downloadTimes);
downloadTimesStatus = (TextView) findViewById(R.id.textView_activitySetupWizard_downloadTimesStatus);
downloadTimesProgressBar = (ProgressBar) findViewById(R.id.progressBar_activitySetupWizard_downloadTimesProgressBar);
start.setOnClickListener(this);
BusDatabase db = BusDatabase.getDatabase(this);
busses = db.get();
db.closeDatabase();
if(busses != null && busses.size() > 0)
{
toggleProgressBar(false);
}
else
{
downloadBusList();
}
}
@Override
public void onBackPressed()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.setupWizard_cancelDialog_title);
builder.setMessage(R.string.setupWizard_cancelDialog_message);
builder.setPositiveButton(getString(R.string.dialog_yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
openHelp();
}
});
builder.setNegativeButton(getString(R.string.dialog_no), null);
builder.show();
}
private void downloadBusList()
{
toggleProgressBar(true);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new GetListOfBussesPageTask(this).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
else
new GetListOfBussesPageTask(this).execute();
}
public void setBusses(ArrayList<Bus> busses)
{
this.busses = busses;
}
public void toggleProgressBar(boolean isVisible)
{
downloadBussesProgressBarLayout.setVisibility(isVisible ? View.VISIBLE : View.GONE);
optionsLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE);
start.setVisibility(!isVisible ? View.VISIBLE : View.GONE);
}
private void toggleDownloadTimesProgressBar(boolean isVisible)
{
downloadTimesProgressBarLayout.setVisibility(isVisible ? View.VISIBLE : View.GONE);
optionsLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE);
start.setVisibility(!isVisible ? View.VISIBLE : View.GONE);
}
private void showDownloadSelectedDailog()
{
if(busses == null)
{
Messages.getInstance().showNegative(this, getString(R.string.error_setupWizard_noBusses));
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
String[] busNames = new String[busses.size()];
for(int i = 0; i < busNames.length; i++)
{
busNames[i] = busses.get(i).toString();
}
builder.setMultiChoiceItems(busNames, new boolean[busses.size()], new OnMultiChoiceClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked)
{
busses.get(which).setFavorited(isChecked);
}
});
builder.setTitle(R.string.setupWizard_downloadSelectedDialog_title);
builder.setPositiveButton(getString(R.string.dialog_ok), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
downloadSelected();
}
});
builder.show();
}
private void downloadTimes(final ArrayList<Bus> bussesToDownload)
{
Handler handler = new Handler(Looper.getMainLooper());
Runnable incrementProgress = new Runnable()
{
@Override
public void run()
{
downloadTimesProgressBar.incrementProgressBy(1);
}
};
handler.post(new Runnable()
{
@Override
public void run()
{
downloadTimesProgressBar.setMax(bussesToDownload.size() * 3);
toggleDownloadTimesProgressBar(true);
}
});
for(final Bus i : bussesToDownload)
{
try
{
BusDatabase db = BusDatabase.getDatabase(this);
db.addOrUpdate(i);
db.closeDatabase();
handler.post(new Runnable()
{
@Override
public void run()
{
downloadTimesStatus.setText(getString(R.string.setupWizard_downloadTimes_status, i.getNumber() + " " + getString(BusTimeTypes.WEEK_DAY.getNameResourceId())));
}
});
GetBusTimesPageTask taskH = new GetBusTimesPageTask(this, i, BusTimeTypes.WEEK_DAY);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
taskH.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR).get();
else
taskH.execute().get();
handler.post(incrementProgress);
handler.post(new Runnable()
{
@Override
public void run()
{
downloadTimesStatus.setText(getString(R.string.setupWizard_downloadTimes_status, i.getNumber() + " " + getString(BusTimeTypes.SATURDAY.getNameResourceId())));
}
});
GetBusTimesPageTask taskC = new GetBusTimesPageTask(this, i, BusTimeTypes.SATURDAY);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
taskC.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR).get();
else
taskC.execute().get();
handler.post(incrementProgress);
handler.post(new Runnable()
{
@Override
public void run()
{
downloadTimesStatus.setText(getString(R.string.setupWizard_downloadTimes_status, i.getNumber() + " " + getString(BusTimeTypes.SUNDAY.getNameResourceId())));
}
});
GetBusTimesPageTask taskP = new GetBusTimesPageTask(this, i, BusTimeTypes.SUNDAY);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
taskP.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR).get();
else
taskP.execute().get();
handler.post(incrementProgress);
}
catch(Exception e)
{
Log.e(LOG_TAG, "Error occurred while downloading bus times!", e);
}
}
openHelp();
}
private void downloadSelected()
{
final ArrayList<Bus> bussesToDownload = new ArrayList<Bus>();
for(Bus i : busses)
{
if(i.isFavorited())
bussesToDownload.add(i);
}
if(bussesToDownload.size() <= 0)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.setupWizard_noBusSelectedDialog_title);
builder.setMessage(R.string.setupWizard_noBusSelectedDialog_message);
builder.setPositiveButton(getString(R.string.dialog_yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
openHelp();
}
});
builder.setNegativeButton(getString(R.string.dialog_no), null);
builder.show();
}
else
{
new Thread(new Runnable()
{
@Override
public void run()
{
downloadTimes(bussesToDownload);
}
}).start();
}
}
private void openHelp()
{
Intent helpIntent = new Intent(SetupWizard.this, Help.class);
helpIntent.putExtra(Constants.HELP_FROM_SETUP_WIZARD_EXTRA, true);
finish();
startActivity(helpIntent);
}
@Override
public void onClick(View v)
{
if(v.getId() == R.id.button_activitySetupWizard_start)
{
int checkedRadioButtonId = options.getCheckedRadioButtonId();
switch(checkedRadioButtonId)
{
case R.id.radioButton_activitySetupWizard_downloadSelected:
showDownloadSelectedDailog();
break;
case R.id.radioButton_activitySetupWizard_downloadNothing:
openHelp();
break;
}
}
}
}