Changeset View
Changeset View
Standalone View
Standalone View
src/it/reyboz/bustorino/fragments/MainScreenFragment.java
- This file was added.
package it.reyboz.bustorino.fragments; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import androidx.fragment.app.Fragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; | |||||
import android.util.Log; | |||||
import android.view.LayoutInflater; | |||||
import android.view.MenuItem; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.view.inputmethod.InputMethodManager; | |||||
import android.widget.Button; | |||||
import android.widget.EditText; | |||||
import android.widget.ImageButton; | |||||
import android.widget.ProgressBar; | |||||
import android.widget.TextView; | |||||
import com.google.android.material.floatingactionbutton.FloatingActionButton; | |||||
import com.google.zxing.integration.android.IntentIntegrator; | |||||
import it.reyboz.bustorino.R; | |||||
import it.reyboz.bustorino.backend.ArrivalsFetcher; | |||||
import it.reyboz.bustorino.backend.FiveTAPIFetcher; | |||||
import it.reyboz.bustorino.backend.FiveTScraperFetcher; | |||||
import it.reyboz.bustorino.backend.FiveTStopsFetcher; | |||||
import it.reyboz.bustorino.backend.GTTJSONFetcher; | |||||
import it.reyboz.bustorino.backend.GTTStopsFetcher; | |||||
import it.reyboz.bustorino.backend.Stop; | |||||
import it.reyboz.bustorino.backend.StopsFinderByName; | |||||
import it.reyboz.bustorino.data.UserDB; | |||||
import it.reyboz.bustorino.middleware.AsyncDataDownload; | |||||
/** | |||||
* A simple {@link Fragment} subclass. | |||||
* Use the {@link MainScreenFragment#newInstance} factory method to | |||||
* create an instance of this fragment. | |||||
*/ | |||||
public class MainScreenFragment extends BaseFragment implements FragmentListenerMain{ | |||||
private final String OPTION_SHOW_LEGEND = "show_legend"; | |||||
private static final String DEBUG_TAG = "BusTO - MainFragment"; | |||||
private CommonFragmentListener mListener; | |||||
/// UI ELEMENTS // | |||||
private ImageButton addToFavorites; | |||||
private FragmentHelper fragmentHelper; | |||||
private SwipeRefreshLayout swipeRefreshLayout; | |||||
private EditText busStopSearchByIDEditText; | |||||
private EditText busStopSearchByNameEditText; | |||||
private ProgressBar progressBar; | |||||
private TextView howDoesItWorkTextView; | |||||
private Button hideHintButton; | |||||
private MenuItem actionHelpMenuItem; | |||||
private FloatingActionButton floatingActionButton; | |||||
//private Snackbar snackbar; | |||||
/* | |||||
* Search mode | |||||
*/ | |||||
private static final int SEARCH_BY_NAME = 0; | |||||
private static final int SEARCH_BY_ID = 1; | |||||
private static final int SEARCH_BY_ROUTE = 2; // TODO: implement this -- https://gitpull.it/T12 | |||||
private int searchMode; | |||||
//private ImageButton addToFavorites; | |||||
private final ArrivalsFetcher[] arrivalsFetchers = new ArrivalsFetcher[]{new FiveTAPIFetcher(), new GTTJSONFetcher(), new FiveTScraperFetcher()}; | |||||
public MainScreenFragment() { | |||||
// Required empty public constructor | |||||
} | |||||
public static MainScreenFragment newInstance() { | |||||
MainScreenFragment fragment = new MainScreenFragment(); | |||||
Bundle args = new Bundle(); | |||||
//args.putString(ARG_PARAM1, param1); | |||||
//args.putString(ARG_PARAM2, param2); | |||||
fragment.setArguments(args); | |||||
return fragment; | |||||
} | |||||
@Override | |||||
public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
if (getArguments() != null) { | |||||
//do nothing | |||||
} | |||||
} | |||||
@Override | |||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |||||
Bundle savedInstanceState) { | |||||
// Inflate the layout for this fragment | |||||
View root = inflater.inflate(R.layout.fragment_main_screen, container, false); | |||||
addToFavorites = (ImageButton) root.findViewById(R.id.addToFavorites); | |||||
busStopSearchByIDEditText = root.findViewById(R.id.busStopSearchByIDEditText); | |||||
busStopSearchByNameEditText = root.findViewById(R.id.busStopSearchByNameEditText); | |||||
progressBar = root.findViewById(R.id.progressBar); | |||||
howDoesItWorkTextView = root.findViewById(R.id.howDoesItWorkTextView); | |||||
hideHintButton = root.findViewById(R.id.hideHintButton); | |||||
swipeRefreshLayout = root.findViewById(R.id.listRefreshLayout); | |||||
floatingActionButton = root.findViewById(R.id.floatingActionButton); | |||||
return root; | |||||
} | |||||
/* | |||||
GUI METHODS | |||||
*/ | |||||
/** | |||||
* QR scan button clicked | |||||
* | |||||
* @param v View QRButton clicked | |||||
*/ | |||||
public void onQRButtonClick(View v) { | |||||
IntentIntegrator integrator = new IntentIntegrator(getActivity()); | |||||
integrator.initiateScan(); | |||||
} | |||||
public void onHideHint(View v) { | |||||
hideHints(); | |||||
setOption(OPTION_SHOW_LEGEND, false); | |||||
} | |||||
/** | |||||
* OK this is pure shit | |||||
* | |||||
* @param v View clicked | |||||
*/ | |||||
public void onSearchClick(View v) { | |||||
final StopsFinderByName[] stopsFinderByNames = new StopsFinderByName[]{new GTTStopsFetcher(), new FiveTStopsFetcher()}; | |||||
if (searchMode == SEARCH_BY_ID) { | |||||
String busStopID = busStopSearchByIDEditText.getText().toString(); | |||||
requestArrivalsForStopID(busStopID); | |||||
} else { // searchMode == SEARCH_BY_NAME | |||||
String query = busStopSearchByNameEditText.getText().toString(); | |||||
//new asyncWgetBusStopSuggestions(query, stopsDB, StopsFindersByNameRecursionHelper); | |||||
new AsyncDataDownload(fragmentHelper, stopsFinderByNames).execute(query); | |||||
} | |||||
} | |||||
public void onToggleKeyboardLayout(View v) { | |||||
if (searchMode == SEARCH_BY_NAME) { | |||||
setSearchModeBusStopID(); | |||||
if (busStopSearchByIDEditText.requestFocus()) { | |||||
showKeyboard(); | |||||
} | |||||
} else { // searchMode == SEARCH_BY_ID | |||||
setSearchModeBusStopName(); | |||||
if (busStopSearchByNameEditText.requestFocus()) { | |||||
showKeyboard(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void enableRefreshLayout(boolean yes) { | |||||
swipeRefreshLayout.setEnabled(yes); | |||||
} | |||||
////////////////////////////////////// GUI HELPERS ///////////////////////////////////////////// | |||||
public void showKeyboard() { | |||||
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); | |||||
View view = searchMode == SEARCH_BY_ID ? busStopSearchByIDEditText : busStopSearchByNameEditText; | |||||
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); | |||||
} | |||||
private void setSearchModeBusStopID() { | |||||
searchMode = SEARCH_BY_ID; | |||||
busStopSearchByNameEditText.setVisibility(View.GONE); | |||||
busStopSearchByNameEditText.setText(""); | |||||
busStopSearchByIDEditText.setVisibility(View.VISIBLE); | |||||
floatingActionButton.setImageResource(R.drawable.alphabetical); | |||||
} | |||||
private void setSearchModeBusStopName() { | |||||
searchMode = SEARCH_BY_NAME; | |||||
busStopSearchByIDEditText.setVisibility(View.GONE); | |||||
busStopSearchByIDEditText.setText(""); | |||||
busStopSearchByNameEditText.setVisibility(View.VISIBLE); | |||||
floatingActionButton.setImageResource(R.drawable.numeric); | |||||
} | |||||
/** | |||||
* Having that cursor at the left of the edit text makes me cancer. | |||||
* | |||||
* @param busStopID bus stop ID | |||||
*/ | |||||
private void setBusStopSearchByIDEditText(String busStopID) { | |||||
busStopSearchByIDEditText.setText(busStopID); | |||||
busStopSearchByIDEditText.setSelection(busStopID.length()); | |||||
} | |||||
private void showHints() { | |||||
howDoesItWorkTextView.setVisibility(View.VISIBLE); | |||||
hideHintButton.setVisibility(View.VISIBLE); | |||||
actionHelpMenuItem.setVisible(false); | |||||
} | |||||
private void hideHints() { | |||||
howDoesItWorkTextView.setVisibility(View.GONE); | |||||
hideHintButton.setVisibility(View.GONE); | |||||
actionHelpMenuItem.setVisible(true); | |||||
} | |||||
//TODO: toggle spinner from mainActivity | |||||
@Override | |||||
public void toggleSpinner(boolean enable) { | |||||
if (enable) { | |||||
//already set by the RefreshListener when needed | |||||
//swipeRefreshLayout.setRefreshing(true); | |||||
progressBar.setVisibility(View.VISIBLE); | |||||
} else { | |||||
swipeRefreshLayout.setRefreshing(false); | |||||
progressBar.setVisibility(View.GONE); | |||||
} | |||||
} | |||||
private void prepareGUIForBusLines() { | |||||
swipeRefreshLayout.setEnabled(true); | |||||
swipeRefreshLayout.setVisibility(View.VISIBLE); | |||||
actionHelpMenuItem.setVisible(true); | |||||
} | |||||
private void prepareGUIForBusStops() { | |||||
swipeRefreshLayout.setEnabled(false); | |||||
swipeRefreshLayout.setVisibility(View.VISIBLE); | |||||
actionHelpMenuItem.setVisible(false); | |||||
} | |||||
@Override | |||||
public void showFloatingActionButton(boolean yes) { | |||||
mListener.showFloatingActionButton(yes); | |||||
} | |||||
/** | |||||
* This provides a temporary fix to make the transition | |||||
* to a single asynctask go smoother | |||||
* | |||||
* @param fragmentType the type of fragment created | |||||
*/ | |||||
@Override | |||||
public void readyGUIfor(FragmentKind fragmentType) { | |||||
throw new UnsupportedOperationException(); | |||||
/* | |||||
hideKeyboard(); | |||||
//TODO: fix this | |||||
//if we are getting results, already, stop waiting for nearbyStops | |||||
if (pendingNearbyStopsRequest && (fragmentType == FragmentKind.ARRIVALS || fragmentType == FragmentKind.STOPS)) { | |||||
locmgr.removeUpdates(locListener); | |||||
pendingNearbyStopsRequest = false; | |||||
} | |||||
if (fragmentType == null) Log.e("ActivityMain", "Problem with fragmentType"); | |||||
else | |||||
switch (fragmentType) { | |||||
case ARRIVALS: | |||||
prepareGUIForBusLines(); | |||||
if (getOption(OPTION_SHOW_LEGEND, true)) { | |||||
showHints(); | |||||
} | |||||
break; | |||||
case STOPS: | |||||
prepareGUIForBusStops(); | |||||
break; | |||||
default: | |||||
Log.e("BusTO Activity", "Called readyGUI with unsupported type of Fragment"); | |||||
return; | |||||
} | |||||
// Shows hints | |||||
*/ | |||||
} | |||||
@Override | |||||
public void requestArrivalsForStopID(String ID) { | |||||
final FragmentManager framan = getChildFragmentManager(); | |||||
if (ID == null || ID.length() <= 0) { | |||||
// we're still in UI thread, no need to mess with Progress | |||||
showToastMessage(R.string.insert_bus_stop_number_error, true); | |||||
toggleSpinner(false); | |||||
} else if (framan.findFragmentById(R.id.resultFrame) instanceof ArrivalsFragment) { | |||||
ArrivalsFragment fragment = (ArrivalsFragment) framan.findFragmentById(R.id.resultFrame); | |||||
if (fragment != null && fragment.getStopID() != null && fragment.getStopID().equals(ID)){ | |||||
// Run with previous fetchers | |||||
//fragment.getCurrentFetchers().toArray() | |||||
new AsyncDataDownload(fragmentHelper,fragment.getCurrentFetchersAsArray()).execute(ID); | |||||
} else{ | |||||
new AsyncDataDownload(fragmentHelper, arrivalsFetchers).execute(ID); | |||||
} | |||||
} | |||||
else { | |||||
new AsyncDataDownload(fragmentHelper,arrivalsFetchers).execute(ID); | |||||
Log.d("MainActiv", "Started search for arrivals of stop " + ID); | |||||
} | |||||
} | |||||
} | |||||
No newline at end of file |
Public contents are in Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA) or GNU Free Documentation License (at your option) unless otherwise noted. · Contact / Register