/*******************************************************************************
* This file is part of the RozkladPKP project.
*
* RozkladPKP is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RozkladPKP is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RozkladPKP. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package org.tyszecki.rozkladpkp;
import java.util.ArrayList;
import org.tyszecki.rozkladpkp.LocationHelper.LocationState;
import org.tyszecki.rozkladpkp.widgets.AttributesButton;
import org.tyszecki.rozkladpkp.widgets.CarriersButton;
import org.tyszecki.rozkladpkp.widgets.DateButton;
import org.tyszecki.rozkladpkp.widgets.DialogControl;
import org.tyszecki.rozkladpkp.widgets.ProductsButton;
import org.tyszecki.rozkladpkp.widgets.StationEdit;
import org.tyszecki.rozkladpkp.widgets.StationSpinner;
import org.tyszecki.rozkladpkp.widgets.StationSpinner.onDataLoaded;
import org.tyszecki.rozkladpkp.widgets.TimeButton;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.SupportActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
public class ConnectionsFormFragment extends Fragment {
private TimeButton timeButton;
private DateButton dateButton;
private ProductsButton productsButton;
private AttributesButton attributesButton;
private CarriersButton carriersButton;
private StationEdit depEdit,arrEdit,viaEdit;
private StationSpinner depSelect, arrSelect,viaSelect;
private boolean clarify;
private Resources res;
private int loading;
private ProgressDialog progressDialog;
private onFormSubmitListener submitListener = null;
public interface onFormSubmitListener{
public void onSubmit(Bundle values);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(clarify ? R.layout.connection_form_clarify : R.layout.connection_form, null);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle e = getArguments();
if(e != null)
clarify = e.containsKey("clarify");
else
clarify = false;
}
@Override
public void onAttach(SupportActivity activity) {
super.onAttach(activity);
try{submitListener = (onFormSubmitListener)activity;}catch (Exception e) {}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
res = getResources();
initializeGui();
}
private void initializeGui() {
setHasOptionsMenu(true);
loading = 2;
findControls();
initializeControls();
setupListeners();
((Button) getView().findViewById(R.id.ok_button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Bundle arg = new Bundle();
if(!clarify)
{
if(!validInput()) return;
String sidd = depEdit.getCurrentSID();
String sida = arrEdit.getCurrentSID();
String sidv = viaEdit.isShown() ? viaEdit.getCurrentSID() : null;
arg.putString("depName", depEdit.getText().toString());
arg.putString("arrName", arrEdit.getText().toString());
//Trzeba doprecyzować nazwę co najmargej jednej stacji
if(sidd.equals("") || sida.equals("") || (sidv != null && sidv.equals("")))
{
//arg = new Intent(arg0.getContext(),ConnectionsFormActivity.class);
arg.putBoolean("clarify", true);
if(!sidd.equals("")) arg.putString("SID", sidd);
if(!sida.equals("")) arg.putString("ZID", sida);
if(sidv != null)
{
if(!sidv.equals("")) arg.putString("VID1", sidv);
arg.putString("viaName", viaEdit.getText().toString());
}
}
//Wpisano dwie takie same stacje
else if(sida.equals(sidd) || sida.equals(sidv) || sidd.equals(sidv))
{
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastSameStationsError), Toast.LENGTH_SHORT).show();
return;
}
//argc arge trzeba doprecyzowywać
else
{
//arg = new Intent(arg0.getContext(),ConnectionListActivity.class);
arg.putString("ZID", sida);
arg.putString("SID", sidd);
if(sidv != null) arg.putString("VID1", sidv);
}
}
else
{
depSelect.saveInDatabase();
arrSelect.saveInDatabase();
if(viaSelect != null) viaSelect.saveInDatabase();
//Wybrano dwie takie same stacje z listy
if(arrSelect.getCurrentSID().equals(depSelect.getCurrentSID()))
{
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastSameStationsError), Toast.LENGTH_SHORT).show();
return;
}
//arg = new Intent(arg0.getContext(),ConnectionListActivity.class);
arg.putString("ZID", arrSelect.getCurrentSID());
arg.putString("SID", depSelect.getCurrentSID());
if(viaSelect != null) arg.putString("VID1", viaSelect.getCurrentSID());
arg.putString("depName", depSelect.getText());
arg.putString("arrName", arrSelect.getText());
}
arg.putString("PLNTimestamp", timeButton.getTime());
arg.putBoolean("Arrival", timeButton.isArrival());
arg.putString("Date", dateButton.getDate());
arg.putString("Products", productsButton.getProductString());
arg.putSerializable("Attributes", attributesButton.getParameters());
if(carriersButton.isShown()) arg.putSerializable("Carriers", carriersButton.getParameters());
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(getActivity());
p.edit().putString("Products", productsButton.getProductString()).putInt("Attributes", attributesButton.settingsCode()).commit();
if(submitListener == null)
{
Intent intent = new Intent(getActivity(), arg.containsKey("clarify") ? ConnectionsFormActivity.class : ConnectionListActivity.class);
intent.putExtras(arg);
startActivity(intent);
}
else
submitListener.onSubmit(arg);
}
});
if(!clarify)
{
((ImageButton) getView().findViewById(R.id.location_button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LocationState state = LocationHelper.getLocationState();
if(state == LocationState.Unavailable)
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastLocationError), Toast.LENGTH_SHORT).show();
else if(state == LocationState.Ready)
depEdit.setText(LocationHelper.getLocation());
}
});
}
}
private void findControls() {
View main = getView();
timeButton = (TimeButton) main.findViewById(R.id.time_button);
dateButton = (DateButton) main.findViewById(R.id.date_button);
productsButton = (ProductsButton) main.findViewById(R.id.products_button);
attributesButton = (AttributesButton) main.findViewById(R.id.attributes_button);
carriersButton = (CarriersButton) main.findViewById(R.id.carriers_button);
if(!clarify)
{
depEdit = (StationEdit) main.findViewById(R.id.departure_edit);
arrEdit = (StationEdit) main.findViewById(R.id.arrival_edit);
viaEdit = (StationEdit) main.findViewById(R.id.via_edit);
}
else
{
depSelect = (StationSpinner) getView().findViewById(R.id.departure_select);
arrSelect = (StationSpinner) getView().findViewById(R.id.arrival_select);
if(getArguments() != null && getArguments().containsKey("viaText"))
viaSelect = (StationSpinner) getView().findViewById(R.id.via_select);
}
}
@SuppressWarnings("unchecked")
private void initializeControls()
{
EnhancedBundle a = new EnhancedBundle(getArguments());
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(getActivity());
//Przyciski - ukryj datę i czas, jeśli okno zostąło wywołane do konfiguracji widżetu
if(a.containsKey("hideTime"))
{
timeButton.setVisibility(View.GONE);
dateButton.setVisibility(View.GONE);
attributesButton.setVisibility(View.GONE);
}
timeButton.setTime(a.getString("PLNTimestamp", null));
dateButton.setDate(a.getString("Date", null));
productsButton.setProductString(p.getString("Products", "11110001111111"));
if(a.containsKey("Attributes"))
attributesButton.setParameters((ArrayList<SerializableNameValuePair>) a.getSerializable("Attributes"));
else
attributesButton.readSettings(p.getInt("Attributes", 0));
if(a.containsKey("Carriers"))
{
carriersButton.setVisibility(View.VISIBLE);
carriersButton.setParameters((ArrayList<SerializableNameValuePair>) a.getSerializable("Carriers"));
}
//Pola
if(!clarify)
{
depEdit.setHint(res.getText(R.string.hintDepartureStation));
arrEdit.setHint(res.getText(R.string.hintArrivalStation));
viaEdit.setHint(res.getText(R.string.hintViaStation));
String arr = a.getString("arrName", null);
String dep = a.getString("depName", null);
if(arr != null) arrEdit.setText(arr);
if(dep != null) depEdit.setText(dep);
if(arr == null && dep != null) arrEdit.requestFocus();
else if(arr != null && dep != null) timeButton.forceFocus();
}
else
{
if(a.containsKey("viaText"))
viaSelect.setVisibility(View.VISIBLE);
}
}
private void setupListeners()
{
ButtonListener onClick = new ButtonListener();
timeButton.setOnClickListener(onClick);
dateButton.setOnClickListener(onClick);
productsButton.setOnClickListener(onClick);
attributesButton.setOnClickListener(onClick);
carriersButton.setOnClickListener(onClick);
if(clarify)
{
Bundle a = getArguments();
onDataLoaded dataLoaded = new SpinnerOnDataLoaded();
depSelect.setOnDataLoaded(dataLoaded);
arrSelect.setOnDataLoaded(dataLoaded);
progressDialog = ProgressDialog.show(getActivity(), res.getText(R.string.progressTitle), res.getText(R.string.progressSearchingStation), true);
if(a.containsKey("viaText"))
{
viaSelect.setOnDataLoaded(dataLoaded);
loading = 3;
viaSelect.setUserInput(a.getString("viaName"),a.getString("VID1"));
}
depSelect.setUserInput(a.getString("depName"),a.getString("SID"));
arrSelect.setUserInput(a.getString("arrName"),a.getString("ZID"));
}
}
boolean validInput()
{
//Nie wprowadzono którejś ze stacji
if(!depEdit.inputValid())
{
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastDepartureEmpty), Toast.LENGTH_SHORT).show();
return false;
}
else if(!arrEdit.inputValid())
{
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastArrivalEmpty), Toast.LENGTH_SHORT).show();
return false;
}
else if(viaEdit.isShown() && !viaEdit.inputValid())
{
Toast.makeText(RozkladPKPApplication.getAppContext(), res.getText(R.string.toastViaEmpty), Toast.LENGTH_SHORT).show();
return false;
}
//Do dalszych operacji potrzebny internet
if(!CommonUtils.onlineCheck())
return false;
return true;
}
@Override
public void onCreateOptionsMenu(android.support.v4.view.Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.connections_form, menu);
if(clarify)
{
menu.getItem(1).setVisible(false);
menu.getItem(2).setVisible(false);
}
}
@Override
public void onPrepareOptionsMenu(android.support.v4.view.Menu menu) {
MenuItem via = menu.findItem(R.id.item_via);
MenuItem car = menu.findItem(R.id.item_carriers);
if(viaEdit == null) via.setVisible(false);
else via.setTitle(viaEdit.isShown() ? R.string.menuRemoveVia : R.string.menuAddVia);
if(carriersButton == null) car.setVisible(false);
else car.setTitle(carriersButton.isShown() ? R.string.menuLessOptions : R.string.menuMoreOptions);
}
@Override
public boolean onOptionsItemSelected(android.support.v4.view.MenuItem item) {
Intent ni;
switch(item.getItemId()){
case R.id.item_settings:
ni = new Intent(getActivity(),PreferencesActivity.class); //TODO: Fragmentacja ;)
startActivity(ni);
return true;
case R.id.item_via:
viaEdit.setVisibility(viaEdit.isShown() ? View.GONE : View.VISIBLE);
return true;
case R.id.item_carriers:
carriersButton.setVisibility(carriersButton.isShown() ? View.GONE : View.VISIBLE);
return true;
case R.id.item_return:
String t = arrEdit.getText().toString();
arrEdit.setText(depEdit.getText());
depEdit.setText(t);
return true;
case R.id.item_about:
ni = new Intent(getActivity().getBaseContext(),AboutActivity.class);
startActivity(ni);
return true;
}
return false;
}
private class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
DialogFragment newFragment = ((DialogControl)v).getDialog();
newFragment.show(ft, "dialog");
}
}
private class SpinnerOnDataLoaded implements StationSpinner.onDataLoaded
{
@Override
public void dataLoaded() {
loading--;
if(loading == 0)
{
progressDialog.dismiss();
if(arrSelect.getStationCount() == 0 || depSelect.getStationCount() == 0)
{
getActivity().runOnUiThread(new Runnable() {
public void run() {
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(getActivity()).create();
alertDialog.setOnKeyListener(CommonUtils.getOnlyDPadListener());
alertDialog.setTitle("Błąd wyszukiwania!");
alertDialog.setMessage("Nie można odnaleźć wskazanej stacji.");
alertDialog.setCancelable(false);
alertDialog.setButton("Powrót", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
getActivity().finish();
}
});
alertDialog.show();
}
});
}
}
}
}
}