res) {
- SystemClock.sleep(5000);
- res.set(result.SERVER_ERROR);
- return new Palina();
- }
- }
- private ArrivalsFetcher[] ArrivalFetchers = {new MockFetcher(), new MockFetcher(), new MockFetcher(), new MockFetcher(), new MockFetcher()};*/
- private ArrivalsFetcher[] arrivalsFetchers = new ArrivalsFetcher[]{new FiveTAPIFetcher(), new GTTJSONFetcher(), new FiveTScraperFetcher()};
- private StopsFinderByName[] stopsFinderByNames = new StopsFinderByName[]{new GTTStopsFetcher(), new FiveTStopsFetcher()};
- /*
- * Position
- */
- //Fine location criteria
- private final Criteria cr = new Criteria();
- private boolean pendingNearbyStopsRequest = false;
- private LocationManager locmgr;
- private FragmentHelper fh;
-
- ///////////////////////////////// EVENT HANDLERS ///////////////////////////////////////////////
-
- /*
- * @see swipeRefreshLayout
- */
- private final Handler theHandler = new Handler();
- private final Runnable refreshStop = new Runnable() {
- public void run() {
- if (framan.findFragmentById(R.id.resultFrame) instanceof ArrivalsFragment) {
- ArrivalsFragment fragment = (ArrivalsFragment) framan.findFragmentById(R.id.resultFrame);
- if (fragment == null){
- new AsyncDataDownload(fh, arrivalsFetchers, getApplicationContext()).execute();
- } else{
- String stopName = fragment.getStopID();
-
- new AsyncDataDownload(fh, fragment.getCurrentFetchersAsArray(), getApplicationContext()).execute(stopName);
- }
- } else //we create a new fragment, which is WRONG
- new AsyncDataDownload(fh, arrivalsFetchers, getApplicationContext()).execute();
- }
- };
-
-
- //// MAIN METHOD ///
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- framan = getSupportFragmentManager();
- final SharedPreferences theShPr = getMainSharedPreferences();
- /*
- * UI
- */
- setContentView(R.layout.activity_main);
- Toolbar defToolbar = findViewById(R.id.that_toolbar);
- setSupportActionBar(defToolbar);
- busStopSearchByIDEditText = findViewById(R.id.busStopSearchByIDEditText);
- busStopSearchByNameEditText = findViewById(R.id.busStopSearchByNameEditText);
- progressBar = findViewById(R.id.progressBar);
- howDoesItWorkTextView = findViewById(R.id.howDoesItWorkTextView);
- hideHintButton = findViewById(R.id.hideHintButton);
- swipeRefreshLayout = findViewById(R.id.listRefreshLayout);
- floatingActionButton = findViewById(R.id.floatingActionButton);
-
- framan.addOnBackStackChangedListener(() -> Log.d("MainActivity, BusTO", "BACK STACK CHANGED"));
-
- busStopSearchByIDEditText.setSelectAllOnFocus(true);
- busStopSearchByIDEditText
- .setOnEditorActionListener((v, actionId, event) -> {
- // IME_ACTION_SEARCH alphabetical option
- if (actionId == EditorInfo.IME_ACTION_SEARCH) {
- onSearchClick(v);
- return true;
- }
- return false;
- });
- busStopSearchByNameEditText
- .setOnEditorActionListener((v, actionId, event) -> {
- // IME_ACTION_SEARCH alphabetical option
- if (actionId == EditorInfo.IME_ACTION_SEARCH) {
- onSearchClick(v);
- return true;
- }
- return false;
- });
-
- // Called when the layout is pulled down
- swipeRefreshLayout
- .setOnRefreshListener(() -> theHandler.post(refreshStop));
-
- /**
- * @author Marco Gagino!!!
- */
- //swipeRefreshLayout.setColorSchemeColors(R.color.blue_500, R.color.orange_500); // setColorScheme is deprecated, setColorSchemeColors isn't
- swipeRefreshLayout.setColorSchemeResources(R.color.blue_500, R.color.orange_500);
- fh = new FragmentHelper(this, framan, getApplicationContext(),R.id.resultFrame);
- setSearchModeBusStopID();
-
- //---------------------------- START INTENT CHECK QUEUE ------------------------------------
-
- // Intercept calls from URL intent
- boolean tryedFromIntent = false;
-
- String busStopID = null;
- String busStopDisplayName = null;
- Uri data = getIntent().getData();
- if (data != null) {
- busStopID = getBusStopIDFromUri(data);
- tryedFromIntent = true;
- }
-
- // Intercept calls from other activities
- if (!tryedFromIntent) {
- Bundle b = getIntent().getExtras();
- if (b != null) {
- busStopID = b.getString("bus-stop-ID");
- busStopDisplayName = b.getString("bus-stop-display-name");
-
- /**
- * I'm not very sure if you are coming from an Intent.
- * Some launchers work in strange ways.
- */
- tryedFromIntent = busStopID != null;
- }
- }
-
- //---------------------------- END INTENT CHECK QUEUE --------------------------------------
-
- if (busStopID == null) {
- // Show keyboard if can't start from intent
- // JUST DON'T
- // showKeyboard();
-
- // You haven't obtained anything... from an intent?
- if (tryedFromIntent) {
-
- // This shows a luser warning
- Toast.makeText(getApplicationContext(),
- R.string.insert_bus_stop_number_error, Toast.LENGTH_SHORT).show();
- }
- } else {
- // If you are here an intent has worked successfully
- setBusStopSearchByIDEditText(busStopID);
- /*
- //THIS PART SHOULDN'T BE NECESSARY SINCE THE LAST SUCCESSFULLY SEARCHED BUS
- // STOP IS ADDED AUTOMATICALLY
- Stop nextStop = new Stop(busStopID);
- // forcing it as user name even though it could be standard name, it doesn't really matter
- nextStop.setStopUserName(busStopDisplayName);
- //set stop as last succe
- fh.setLastSuccessfullySearchedBusStop(nextStop);
- */
- requestArrivalsForStopID(busStopID);
- }
- //Try (hopefully) database update
-
-
- PeriodicWorkRequest wr = new PeriodicWorkRequest.Builder(DBUpdateWorker.class, 1, TimeUnit.DAYS)
- .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES)
- .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED)
- .build())
- .build();
- final WorkManager workManager = WorkManager.getInstance(this);
-
- final int version = theShPr.getInt(DatabaseUpdate.DB_VERSION_KEY, -10);
- if (version >= 0)
- workManager.enqueueUniquePeriodicWork(DBUpdateWorker.DEBUG_TAG,
- ExistingPeriodicWorkPolicy.KEEP, wr);
- else workManager.enqueueUniquePeriodicWork(DBUpdateWorker.DEBUG_TAG,
- ExistingPeriodicWorkPolicy.REPLACE, wr);
- /*
- Set database update
- */
- workManager.getWorkInfosForUniqueWorkLiveData(DBUpdateWorker.DEBUG_TAG)
- .observe(this, workInfoList -> {
- // If there are no matching work info, do nothing
- if (workInfoList == null || workInfoList.isEmpty()) {
- return;
- }
- Log.d(DEBUG_TAG, "WorkerInfo: "+workInfoList);
-
- boolean showProgress = false;
- for (WorkInfo workInfo : workInfoList) {
- if (workInfo.getState() == WorkInfo.State.RUNNING) {
- showProgress = true;
- }
- }
-
- if (showProgress) {
- createDefaultSnackbar();
- } else {
- if(snackbar!=null) {
- snackbar.dismiss();
- snackbar = null;
- }
- }
-
- });
-
-
-
- //locationHandler = new GPSLocationAdapter(getApplicationContext());
- //--------- NEARBY STOPS--------//
- //SETUP LOCATION
- locmgr = (LocationManager) getSystemService(LOCATION_SERVICE);
- cr.setAccuracy(Criteria.ACCURACY_FINE);
- cr.setAltitudeRequired(false);
- cr.setBearingRequired(false);
- cr.setCostAllowed(true);
- cr.setPowerRequirement(Criteria.NO_REQUIREMENT);
- //We want the nearby bus stops!
- theHandler.post(new NearbyStopsRequester(this));
- //If there are no providers available, then, wait for them
-
-
- Log.d("MainActivity", "Created");
-
- }
-
- /*
- * Reload bus stop timetable when it's fulled resumed from background.
-
- * @Override protected void onPostResume() {
- * super.onPostResume();
- * Log.d("ActivityMain", "onPostResume fired. Last successfully bus stop ID: " + fh.getLastSuccessfullySearchedBusStop());
- * if (searchMode == SEARCH_BY_ID && fh.getLastSuccessfullySearchedBusStop() != null) {
- * setBusStopSearchByIDEditText(fh.getLastSuccessfullySearchedBusStop().ID);
- * new AsyncDataDownload(AsyncDataDownload.RequestType.ARRIVALS,fh).execute();
- * } else {
- * //we have new activity or we don't have a new searched stop.
- * //Let's search stops nearby
- * LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
- * Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.resultFrame);
- *
- *
- * }
- * //show the FAB since it remains hidden
- * floatingActionButton.show();
- *
- * }
- **/
-
-
- @Override
- protected void onPause() {
- super.onPause();
- fh.stopLastRequestIfNeeded();
- fh.setBlockAllActivities(true);
- locmgr.removeUpdates(locListener);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- fh.setBlockAllActivities(false);
- //TODO: check if current LiveData-bound observer works
- if (pendingNearbyStopsRequest)
- theHandler.post(new NearbyStopsRequester(this));
- ActionBar bar = getSupportActionBar();
- if(bar!=null) bar.show();
- else Log.w(DEBUG_TAG, "ACTION BAR IS NULL");
-
- //check if we can display the experiments or not
- SharedPreferences shPr = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- boolean exper_On = shPr.getBoolean(getString(R.string.pref_key_experimental), false);
- //Log.w(DEBUG_TAG, "Preference experimental is "+exper_On);
- //MenuItem experimentsItem =
- if (experimentsMenuItem != null)
- experimentsMenuItem.setVisible(exper_On);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
-
- actionHelpMenuItem = menu.findItem(R.id.action_help);
- experimentsMenuItem = menu.findItem(R.id.action_experiments);
- SharedPreferences shPr = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- boolean exper_On = shPr.getBoolean(getString(R.string.pref_key_experimental), false);
- experimentsMenuItem.setVisible(exper_On);
- return true;
- }
-
- /**
- * Callback fired when a MenuItem is selected
- *
- * @param item
- * @return
- */
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- Resources res = getResources();
- switch (item.getItemId()) {
- case android.R.id.home:
- // Respond to the action bar's Up/Home button
- NavUtils.navigateUpFromSameTask(this);
- return true;
- case R.id.action_help:
- showHints();
- return true;
- case R.id.action_favorites:
- startActivity(new Intent(ActivityMain.this, ActivityFavorites.class));
- return true;
- case R.id.action_map:
- //ensure storage permission is granted
- final String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
- int result = askForPermissionIfNeeded(permission, STORAGE_PERMISSION_REQ);
- switch (result) {
- case PERMISSION_OK:
- startActivity(new Intent(ActivityMain.this, ActivityMap.class));
- break;
- case PERMISSION_ASKING:
- permissionDoneRunnables.put(permission,
- () -> startActivity(new Intent(ActivityMain.this, ActivityMap.class)));
- break;
- case PERMISSION_NEG_CANNOT_ASK:
- String storage_perm = res.getString(R.string.storage_permission);
- String text = res.getString(R.string.too_many_permission_asks, storage_perm);
- Toast.makeText(getApplicationContext(),text, Toast.LENGTH_LONG).show();
- }
- return true;
-
- case R.id.action_about:
- startActivity(new Intent(ActivityMain.this, ActivityAbout.class));
- return true;
- case R.id.action_hack:
- openIceweasel(res.getString(R.string.hack_url));
- return true;
- case R.id.action_source:
- openIceweasel("https://gitpull.it/source/libre-busto/");
- return true;
- case R.id.action_licence:
- openIceweasel("https://www.gnu.org/licenses/gpl-3.0.html");
- return true;
- case R.id.action_donate:
- openIceweasel("https://www.liberapay.com/Libre_BusTO/");
- return true;
- case R.id.action_settings:
- Log.d("MAINBusTO", "Pressed button preferences");
- startActivity(new Intent(ActivityMain.this, ActivitySettings.class));
- return true;
- case R.id.action_experiments:
- startActivity(new Intent(this, ActivityPrincipal.class));
- }
- return super.onOptionsItemSelected(item);
- }
-
- /**
- * OK this is pure shit
- *
- * @param v View clicked
- */
- public void onSearchClick(View v) {
- 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(fh, stopsFinderByNames, getApplicationContext()).execute(query);
- }
- }
-
- /**
- * PERMISSION STUFF
- **/
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- switch (requestCode) {
- case PERMISSION_REQUEST_POSITION:
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- setOption(LOCATION_PERMISSION_GIVEN, true);
- //if we sent a request for a new NearbyStopsFragment
- if (pendingNearbyStopsRequest) {
- pendingNearbyStopsRequest = false;
- theHandler.post(new NearbyStopsRequester(this));
- }
-
- } else {
- //permission denied
- setOption(LOCATION_PERMISSION_GIVEN, false);
- }
- //add other cases for permissions
- break;
- case STORAGE_PERMISSION_REQ:
- final String storageKey = Manifest.permission.WRITE_EXTERNAL_STORAGE;
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- Log.d(DEBUG_TAG, "Permissions check: " + Arrays.toString(permissions));
-
- if (permissionDoneRunnables.containsKey(storageKey)) {
- Runnable toRun = permissionDoneRunnables.get(storageKey);
- if (toRun != null)
- toRun.run();
- permissionDoneRunnables.remove(storageKey);
- }
- } else {
- //permission denied
- showToastMessage(R.string.permission_storage_maps_msg, false);
- /*final int canGetPermission = askForPermissionIfNeeded(Manifest.permission.ACCESS_FINE_LOCATION, STORAGE_PERMISSION_REQ);
- switch (canGetPermission) {
- case PERMISSION_ASKING:
-
- break;
- case PERMISSION_NEG_CANNOT_ASK:
- permissionDoneRunnables.remove(storageKey);
- showToastMessage(R.string.closing_act_crash_msg, false);
- }*/
- }
- }
-
- }
-
-
- @Override
- public void requestArrivalsForStopID(String ID) {
- 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(fh,fragment.getCurrentFetchersAsArray(), this).execute(ID);
- } else{
- new AsyncDataDownload(fh, arrivalsFetchers, this).execute(ID);
- }
- }
- else {
- new AsyncDataDownload(fh, arrivalsFetchers, this).execute(ID);
- Log.d("MainActiv", "Started search for arrivals of stop " + ID);
- }
- }
-
-
- /**
- * QR scan button clicked
- *
- * @param v View QRButton clicked
- */
- public void onQRButtonClick(View v) {
- IntentIntegrator integrator = new IntentIntegrator(this);
- integrator.initiateScan();
- }
-
- /**
- * Receive the Barcode Scanner Intent
- */
- public void onActivityResult(int requestCode, int resultCode, Intent intent) {
- super.onActivityResult(requestCode, resultCode, intent);
- IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
-
- Uri uri;
- try {
- uri = Uri.parse(scanResult != null ? scanResult.getContents() : null); // this apparently prevents NullPointerException. Somehow.
- } catch (NullPointerException e) {
- Toast.makeText(getApplicationContext(),
- R.string.no_qrcode, Toast.LENGTH_SHORT).show();
- return;
- }
-
- String busStopID = getBusStopIDFromUri(uri);
- busStopSearchByIDEditText.setText(busStopID);
- requestArrivalsForStopID(busStopID);
- }
-
- public void onHideHint(View v) {
- hideHints();
- setOption(OPTION_SHOW_LEGEND, false);
- }
-
- 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();
- }
- }
- }
-
- private void createDefaultSnackbar() {
- if (snackbar == null) {
- snackbar = Snackbar.make(findViewById(R.id.searchButton), R.string.database_update_message, Snackbar.LENGTH_INDEFINITE);
- }
- snackbar.show();
- }
- ///////////////////////////////// POSITION STUFF//////////////////////////////////////////////
-
- private void resolveStopRequest(String provider) {
- Log.d(DEBUG_TAG, "Provider " + provider + " got enabled");
- if (locmgr != null && pendingNearbyStopsRequest && locmgr.getProvider(provider).meetsCriteria(cr)) {
- pendingNearbyStopsRequest = false;
- theHandler.post(new NearbyStopsRequester(this));
- }
- }
-
- final LocationListener locListener = new LocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- Log.d(DEBUG_TAG, "Location changed");
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- Log.d(DEBUG_TAG, "Location provider status: " + status);
- if (status == LocationProvider.AVAILABLE) {
- resolveStopRequest(provider);
- }
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- resolveStopRequest(provider);
- }
-
- @Override
- public void onProviderDisabled(String provider) {
-
- }
- };
-
- /**
- * Run location requests separately and asynchronously
- */
- class NearbyStopsRequester implements Runnable {
-
- Activity runningAct;
-
- public NearbyStopsRequester(Activity runningAct) {
- this.runningAct = runningAct;
- }
-
- @Override
- public void run() {
- //final boolean canRunPosition = Build.VERSION.SDK_INT < Build.VERSION_CODES.M || getOption(LOCATION_PERMISSION_GIVEN, false);
- final boolean noPermission = ContextCompat.checkSelfPermission(getApplicationContext(),
- Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED;
-
- //if we don't have the permission, we have to ask for it, if we haven't
- // asked too many times before
- if (noPermission) {
-
- pendingNearbyStopsRequest = true;
- Permissions.assertLocationPermissions(getApplicationContext(),runningAct);
- Log.w(DEBUG_TAG, "Cannot get position: Asking permission, noPositionFromSys: " + noPermission);
- return;
-
- } else setOption(LOCATION_PERMISSION_GIVEN, true);
-
- LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
- if (locManager == null) {
- Log.e(DEBUG_TAG, "location manager is nihil, cannot create NearbyStopsFragment");
- return;
- }
- if (anyLocationProviderMatchesCriteria(locManager, cr, true)
- && fh.getLastSuccessfullySearchedBusStop() == null
- && !framan.isDestroyed()) {
- //Go ahead with the request
- Log.d("mainActivity", "Recreating stop fragment");
- swipeRefreshLayout.setVisibility(View.VISIBLE);
- NearbyStopsFragment fragment = NearbyStopsFragment.newInstance(NearbyStopsFragment.TYPE_STOPS);
- Fragment oldFrag = framan.findFragmentById(R.id.resultFrame);
- FragmentTransaction ft = framan.beginTransaction();
- if (oldFrag != null)
- ft.remove(oldFrag);
- ft.add(R.id.resultFrame, fragment, "nearbyStop_correct");
- ft.commit();
- framan.executePendingTransactions();
- pendingNearbyStopsRequest = false;
- } else if (!anyLocationProviderMatchesCriteria(locManager, cr, true)) {
- //Wait for the providers
- Log.d(DEBUG_TAG, "Queuing position request");
- pendingNearbyStopsRequest = true;
-
- locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 0.1f, locListener);
- }
-
- }
- }
-
- private boolean anyLocationProviderMatchesCriteria(LocationManager mng, Criteria cr, boolean enabled) {
- List providers = mng.getProviders(cr, enabled);
- Log.d(DEBUG_TAG, "Getting enabled location providers: ");
- for (String s : providers) {
- Log.d(DEBUG_TAG, "Provider " + s);
- }
- return providers.size() > 0;
- }
-
-
- ///////////////////////////////// OTHER STUFF //////////////////////////////////////////////////
-
-
- @Override
- public void showFloatingActionButton(boolean yes) {
- if (yes) floatingActionButton.show();
- else floatingActionButton.hide();
- }
-
- @Override
- public void enableRefreshLayout(boolean yes) {
- swipeRefreshLayout.setEnabled(yes);
- }
-
- ////////////////////////////////////// GUI HELPERS /////////////////////////////////////////////
- public void showKeyboard() {
- InputMethodManager imm = (InputMethodManager) 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);
- }
- }
-
- @Override
- public void showMapCenteredOnStop(Stop stop) {
- //nothing to do
- //TODO: delete this activity altogether
- Log.w(DEBUG_TAG,"Asked to show the stop on the map");
- }
-
- 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);
- }
-
-
- /**
- * 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) {
- hideKeyboard();
- //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
-
- }
-
- private void openIceweasel(String url){
- utils.openIceweasel(url, this);
- }
-
-}
\ No newline at end of file
diff --git a/src/it/reyboz/bustorino/ActivityMap.java b/src/it/reyboz/bustorino/ActivityMap.java
deleted file mode 100644
--- a/src/it/reyboz/bustorino/ActivityMap.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- BusTO Activities
- Copyright (C) 2020 Andrea Ugo e Fabio Mazza
-
- This program 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.
-
- This program 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 this program. If not, see .
-
- */
-
-package it.reyboz.bustorino;
-
-import android.Manifest;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.location.Location;
-import android.location.LocationManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageButton;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.core.app.ActivityCompat;
-import androidx.preference.PreferenceManager;
-
-import it.reyboz.bustorino.middleware.GeneralActivity;
-import it.reyboz.bustorino.data.NextGenDB;
-
-import org.osmdroid.api.IMapController;
-import org.osmdroid.config.Configuration;
-import org.osmdroid.events.DelayedMapListener;
-import org.osmdroid.events.MapListener;
-import org.osmdroid.events.ScrollEvent;
-import org.osmdroid.events.ZoomEvent;
-import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
-import org.osmdroid.util.BoundingBox;
-import org.osmdroid.util.GeoPoint;
-import org.osmdroid.views.MapView;
-import org.osmdroid.views.overlay.FolderOverlay;
-import org.osmdroid.views.overlay.Marker;
-import org.osmdroid.views.overlay.Overlay;
-import org.osmdroid.views.overlay.infowindow.InfoWindow;
-import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
-import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
-
-import java.util.*;
-
-import it.reyboz.bustorino.backend.Stop;
-import it.reyboz.bustorino.map.CustomInfoWindow;
-
-public class ActivityMap extends GeneralActivity {
-
- private static final String TAG = "Busto-MapActivity";
- private static final String MAP_CURRENT_ZOOM_KEY = "map-current-zoom";
- private static final String MAP_CENTER_LAT_KEY = "map-center-lat";
- private static final String MAP_CENTER_LON_KEY = "map-center-lon";
-
- public static final String BUNDLE_LATIT = "lat";
- public static final String BUNDLE_LONGIT = "lon";
- public static final String BUNDLE_NAME = "name";
- public static final String BUNDLE_ID = "ID";
-
- private static final double DEFAULT_CENTER_LAT = 45.0708;
- private static final double DEFAULT_CENTER_LON = 7.6858;
- private static final double POSITION_FOUND_ZOOM = 18.3;
-
- private HashSet shownStops = null;
-
-
- private MapView map = null;
- public Context ctx;
- private MyLocationNewOverlay mLocationOverlay = null;
- private FolderOverlay stopsFolderOverlay = null;
- protected ImageButton btCenterMap;
- protected ImageButton btFollowMe;
-
- private final CustomInfoWindow.TouchResponder touchResponder = new CustomInfoWindow.TouchResponder() {
- @Override
- public void onActionUp(@NonNull String stopID, @Nullable String stopName) {
- Intent intent = new Intent(ctx, ActivityMain.class);
- Bundle b = new Bundle();
- b.putString("bus-stop-ID", stopID);
- b.putString("bus-stop-display-name", stopName);
- intent.putExtras(b);
- intent.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
-
- // start ActivityMain with the previous intent
- ctx.startActivity(intent);
- }
- };
-
- //@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- //handle permissions first, before map is created. not depicted here
-
- //load/initialize the osmdroid configuration
-
-
- ctx = getApplicationContext();
- Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));
- //setting this before the layout is inflated is a good idea
- //it 'should' ensure that the map has a writable location for the map cache, even without permissions
- //if no tiles are displayed, you can try overriding the cache path using Configuration.getInstance().setCachePath
- //see also StorageUtils
- //note, the load method also sets the HTTP User Agent to your application's package name, abusing osm's tile servers will get you banned based on this string
-
- //inflate and create the map
- setContentView(R.layout.activity_map);
-
- map = (MapView) findViewById(R.id.map);
- map.setTileSource(TileSourceFactory.MAPNIK);
- //map.setTilesScaledToDpi(true);
- map.setFlingEnabled(true);
-
- // add ability to zoom with 2 fingers
- map.setMultiTouchControls(true);
-
- btCenterMap = (ImageButton) findViewById(R.id.ic_center_map);
- btFollowMe = (ImageButton) findViewById(R.id.ic_follow_me);
-
- //setup FolderOverlay
- stopsFolderOverlay = new FolderOverlay();
-
- // take the parameters if it's called from other Activities
- Bundle b = getIntent().getExtras();
-
- startMap(b, savedInstanceState);
-
- // on drag and zoom reload the markers
- map.addMapListener(new DelayedMapListener(new MapListener() {
-
- @Override
- public boolean onScroll(ScrollEvent paramScrollEvent) {
- loadMarkers();
- return true;
- }
-
- @Override
- public boolean onZoom(ZoomEvent event) {
- loadMarkers();
- return true;
- }
-
- }));
-
-
- btCenterMap.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i(TAG, "centerMap clicked ");
- final GeoPoint myPosition = mLocationOverlay.getMyLocation();
- map.getController().animateTo(myPosition);
- }
- });
-
-
- btFollowMe.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i(TAG, "btFollowMe clicked ");
- if (!mLocationOverlay.isFollowLocationEnabled()) {
- mLocationOverlay.enableFollowLocation();
- btFollowMe.setImageResource(R.drawable.ic_follow_me_on);
- } else {
- mLocationOverlay.disableFollowLocation();
- btFollowMe.setImageResource(R.drawable.ic_follow_me);
- }
- }
- });
-
- }
-
-
- public void startMap(Bundle incoming, Bundle savedInstanceState) {
- //parse incoming bundle
- GeoPoint marker = null;
- String name = null;
- String ID = null;
- if (incoming != null) {
- double lat = incoming.getDouble(BUNDLE_LATIT);
- double lon = incoming.getDouble(BUNDLE_LONGIT);
- marker = new GeoPoint(lat, lon);
- name = incoming.getString(BUNDLE_NAME);
- ID = incoming.getString(BUNDLE_ID);
- }
-
- shownStops = new HashSet<>();
- // move the map on the marker position or on a default view point: Turin, Piazza Castello
- // and set the start zoom
- IMapController mapController = map.getController();
- GeoPoint startPoint = null;
-
- boolean havePositionPermission = true;
-
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- askForPermissionIfNeeded(Manifest.permission.ACCESS_FINE_LOCATION, PERMISSION_REQUEST_POSITION);
- havePositionPermission = false;
- }
-
- if (marker != null) {
- startPoint = marker;
- mapController.setZoom(POSITION_FOUND_ZOOM);
- } else if (savedInstanceState != null || !havePositionPermission) {
- mapController.setZoom(savedInstanceState.getDouble(MAP_CURRENT_ZOOM_KEY));
- mapController.setCenter(new GeoPoint(savedInstanceState.getDouble(MAP_CENTER_LAT_KEY),
- savedInstanceState.getDouble(MAP_CENTER_LON_KEY)));
- } else {
- boolean found = false;
- LocationManager locationManager =
- (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
- if (locationManager != null) {
-
- Location userLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
- if (userLocation != null) {
- mapController.setZoom(POSITION_FOUND_ZOOM);
- startPoint = new GeoPoint(userLocation);
- found = true;
- }
- }
- if(!found){
- startPoint = new GeoPoint(DEFAULT_CENTER_LAT, DEFAULT_CENTER_LON);
- mapController.setZoom(16.0);
- }
- }
-
- // set the minimum zoom level
- map.setMinZoomLevel(15.0);
- //add contingency check (shouldn't happen..., but)
- if (startPoint != null) {
- mapController.setCenter(startPoint);
- }
-
- // Location Overlay
- // from OpenBikeSharing (THANK GOD)
- GpsMyLocationProvider imlp = new GpsMyLocationProvider(this.getBaseContext());
- imlp.setLocationUpdateMinDistance(5);
- imlp.setLocationUpdateMinTime(2000);
- this.mLocationOverlay = new MyLocationNewOverlay(imlp,map);
- mLocationOverlay.enableMyLocation();
- mLocationOverlay.enableFollowLocation();
- btFollowMe.setImageResource(R.drawable.ic_follow_me_on);
- mLocationOverlay.setOptionsMenuEnabled(true);
- /*
- mLocationOverlay.runOnFirstFix(() -> {
- mapController.setCenter(mLocationOverlay.getMyLocation());
- mapController.animateTo(mLocationOverlay.getMyLocation());
- });
- */
-
- map.getOverlays().add(this.mLocationOverlay);
-
- //add stops overlay
- map.getOverlays().add(this.stopsFolderOverlay);
-
-
- loadMarkers();
- if (marker != null) {
- // make a marker with the info window open for the searched marker
- makeMarker(startPoint, name , ID, true);
- }
-
- }
-
- public Marker makeMarker(GeoPoint geoPoint, String stopName, String ID, boolean isStartMarker) {
-
- // add a marker
- Marker marker = new Marker(map);
-
- // set custom info window as info window
- CustomInfoWindow popup = new CustomInfoWindow(map, ID, stopName, touchResponder);
- marker.setInfoWindow(popup);
-
- // make the marker clickable
- marker.setOnMarkerClickListener((thisMarker, mapView) -> {
- if (thisMarker.isInfoWindowOpen()) {
- // on second click
-
- // create an intent with these extras
- Intent intent = new Intent(ActivityMap.this, ActivityMain.class);
- Bundle b = new Bundle();
- b.putString("bus-stop-ID", ID);
- b.putString("bus-stop-display-name", stopName);
- intent.putExtras(b);
- intent.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
-
- // start ActivityMain with the previous intent
- startActivity(intent);
- } else {
- // on first click
-
- // hide all opened info window
- InfoWindow.closeAllInfoWindowsOn(map);
- // show this particular info window
- thisMarker.showInfoWindow();
- // move the map to its position
- map.getController().animateTo(thisMarker.getPosition());
- }
-
- return true;
- });
-
- // set its position
- marker.setPosition(geoPoint);
- marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
- // add to it an icon
- marker.setIcon(getResources().getDrawable(R.drawable.bus_marker));
- // add to it a title
- marker.setTitle(stopName);
- // set the description as the ID
- marker.setSnippet(ID);
-
- // show popup info window of the searched marker
- if (isStartMarker) {
- marker.showInfoWindow();
- }
-
- return marker;
- }
-
- public void loadMarkers() {
-
- // get rid of the previous markers
- //map.getOverlays().clear();
- //stopsFolderOverlay = new FolderOverlay();
- List stopsOverlays = stopsFolderOverlay.getItems();
- /*if (stopsOverlays != null){
- stopsOverlays.clear();
- }*/
-
- // get the top, bottom, left and right screen's coordinate
- BoundingBox bb = map.getBoundingBox();
- double latFrom = bb.getLatSouth();
- double latTo = bb.getLatNorth();
- double lngFrom = bb.getLonWest();
- double lngTo = bb.getLonEast();
-
- // get the stops located in those coordinates
- /*
- StopsDB stopsDB = new StopsDB(ctx);
- stopsDB.openIfNeeded();
- Stop[] stops = stopsDB.queryAllInsideMapView(latFrom, latTo, lngFrom, lngTo);
- stopsDB.closeIfNeeded();
- */
-
- NextGenDB dbHelper = new NextGenDB(ctx);
- Stop[] stops = dbHelper.queryAllInsideMapView(latFrom, latTo, lngFrom, lngTo);
-
- // add new markers of those stops
- for (Stop stop : stops) {
- if (shownStops.contains(stop.ID)){
- continue;
- }
- try{
- stop.getLatitude();
- stop.getLongitude();
- } catch (NullPointerException e) {
- Log.e(TAG,"Stop "+stop.ID+ " gives null coordinates");
- e.printStackTrace();
- continue;
- }
-
- shownStops.add(stop.ID);
- GeoPoint marker = new GeoPoint(stop.getLatitude(), stop.getLongitude());
- Marker stopMarker = makeMarker(marker, stop.getStopDefaultName(), stop.ID, false);
- stopsFolderOverlay.add(stopMarker);
-
- }
-
- }
-
- @Override
- protected void onPostResume() {
- super.onPostResume();
- ctx = this;
- }
-
- protected boolean detachMapFromPosition(){
- if (mLocationOverlay.isFollowLocationEnabled()) {
- mLocationOverlay.disableFollowLocation();
- btFollowMe.setImageResource(R.drawable.ic_follow_me);
- return true;
- } return false;
- }
-
- public void onResume(){
- super.onResume();
- //this will refresh the osmdroid configuration on resuming.
- //if you make changes to the configuration, use
- //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- //Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this));
- map.onResume(); //needed for compass, my location overlays, v6.0.0 and up
- mLocationOverlay.enableMyLocation();
- }
-
- public void onPause(){
- super.onPause();
- //this will refresh the osmdroid configuration on resuming.
- //if you make changes to the configuration, use
- //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- //Configuration.getInstance().save(this, prefs);
- map.onPause(); //needed for compass, my location overlays, v6.0.0 and up
- mLocationOverlay.disableMyLocation();
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putDouble(MAP_CURRENT_ZOOM_KEY, map.getZoomLevelDouble());
- outState.putDouble(MAP_CENTER_LAT_KEY, map.getMapCenter().getLatitude());
- outState.putDouble(MAP_CENTER_LON_KEY, map.getMapCenter().getLongitude());
- }
-
- /**
- * PERMISSION STUFF
- **/
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- switch (requestCode) {
- case PERMISSION_REQUEST_POSITION:
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- setOption(LOCATION_PERMISSION_GIVEN, true);
- //if we sent a request for a new NearbyStopsFragment
-
-
- } else {
- //permission denied
- setOption(LOCATION_PERMISSION_GIVEN, false);
- }
- break;
- //add other cases for permissions
- }
-
- }
-}
\ No newline at end of file
diff --git a/src/it/reyboz/bustorino/data/DatabaseUpdateService.java b/src/it/reyboz/bustorino/data/DatabaseUpdateService.java
deleted file mode 100644
--- a/src/it/reyboz/bustorino/data/DatabaseUpdateService.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- BusTO (middleware)
- Copyright (C) 2018 Fabio Mazza
-
- This program 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.
-
- This program 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 this program. If not, see .
- */
-package it.reyboz.bustorino.data;
-
-import android.app.IntentService;
-import android.content.*;
-import androidx.annotation.Nullable;
-import android.util.Log;
-
-import it.reyboz.bustorino.R;
-import it.reyboz.bustorino.backend.Fetcher;
-import it.reyboz.bustorino.backend.FiveTAPIFetcher;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * An {@link IntentService} subclass for handling asynchronous task requests in
- * a service on a separate handler thread.
- */
-public class DatabaseUpdateService extends IntentService {
- // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
- private static final String ACTION_UPDATE = "it.reyboz.bustorino.middleware.action.UPDATE_DB";
- private static final String DB_VERSION = "NextGenDB.GTTVersion";
- private static final String DEBUG_TAG = "DatabaseService_BusTO";
- // TODO: Rename parameters
- private static final String TRIAL = "it.reyboz.bustorino.middleware.extra.TRIAL";
- private static final String COMPULSORY = "compulsory_update";
- private static final int MAX_TRIALS = 5;
- private static final int VERSION_UNAIVALABLE = -2;
- public DatabaseUpdateService() {
- super("DatabaseUpdateService");
- }
- private boolean isRunning;
- private int updateTrial;
- /**
- * Starts this service to perform action Foo with the given parameters. If
- * the service is already performing a task this action will be queued.
- *
- * @see IntentService
- */
- public static void startDBUpdate(Context con, int trial, @Nullable Boolean mustUpdate){
- Intent intent = new Intent(con, DatabaseUpdateService.class);
- intent.setAction(ACTION_UPDATE);
- intent.putExtra(TRIAL,trial);
- if(mustUpdate!=null){
- intent.putExtra(COMPULSORY,mustUpdate);
- }
- con.startService(intent);
- }
- public static void startDBUpdate(Context con) {
- startDBUpdate(con, 0, false);
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- if (intent != null) {
- final String action = intent.getAction();
- if (ACTION_UPDATE.equals(action)) {
- Log.d(DEBUG_TAG,"Started action update");
- SharedPreferences shPr = getSharedPreferences(getString(R.string.mainSharedPreferences),MODE_PRIVATE);
- int versionDB = shPr.getInt(DB_VERSION,-1);
- final int trial = intent.getIntExtra(TRIAL,-1);
- final SharedPreferences.Editor editor = shPr.edit();
- updateTrial = trial;
- UpdateRequestParams params = new UpdateRequestParams(intent);
- int newVersion = getNewVersion(params);
- if(newVersion==VERSION_UNAIVALABLE){
- //NOTHING LEFT TO DO
- return;
- }
- Log.d(DEBUG_TAG,"newDBVersion: "+newVersion+" oldVersion: "+versionDB);
- if(params.mustUpdate || versionDB==-1 || newVersion>versionDB){
-
- Log.d(DEBUG_TAG,"Downloading the bus stops info");
- final AtomicReference gres = new AtomicReference<>();
- if(!performDBUpdate(gres))
- restartDBUpdateifPossible(params,gres);
- else {
- editor.putInt(DB_VERSION,newVersion);
- // BY COMMENTING THIS, THE APP WILL CONTINUOUSLY UPDATE THE DATABASE
- editor.apply();
- }
- } else {
- Log.d(DEBUG_TAG,"No update needed");
- }
-
-
- Log.d(DEBUG_TAG,"Finished update");
- setDBUpdatingFlag(shPr,false);
- }
- }
- }
- private boolean setDBUpdatingFlag(SharedPreferences shPr,boolean value){
- final SharedPreferences.Editor editor = shPr.edit();
- editor.putBoolean(getString(R.string.databaseUpdatingPref),value);
- return editor.commit();
- }
-
- private boolean setDBUpdatingFlag(boolean value){
- final SharedPreferences shPr = getSharedPreferences(getString(R.string.mainSharedPreferences),MODE_PRIVATE);
- return setDBUpdatingFlag(shPr,value);
- }
- private boolean performDBUpdate(AtomicReference gres){
-
- if(!setDBUpdatingFlag(true))
- return false;
-
- /*
- final FiveTAPIFetcher f = new FiveTAPIFetcher();
- final ArrayList stops = f.getAllStopsFromGTT(gres);
- //final ArrayList cpOp = new ArrayList<>();
-
- if(gres.get()!= Fetcher.result.OK){
- Log.w(DEBUG_TAG,"Something went wrong downloading");
- return false;
-
- }
-
- if(!setDBUpdatingFlag(true))
- return false; //If the commit to the SharedPreferences didn't succeed, simply stop updating the database
- final NextGenDB dbHelp = new NextGenDB(getApplicationContext());
- final SQLiteDatabase db = dbHelp.getWritableDatabase();
- //Empty the needed tables
- db.beginTransaction();
- //db.execSQL("DELETE FROM "+StopsTable.TABLE_NAME);
- //db.delete(LinesTable.TABLE_NAME,null,null);
-
- //put new data
- long startTime = System.currentTimeMillis();
-
- Log.d(DEBUG_TAG,"Inserting "+stops.size()+" stops");
- for (final Stop s : stops) {
- final ContentValues cv = new ContentValues();
-
- cv.put(StopsTable.COL_ID, s.ID);
- cv.put(StopsTable.COL_NAME, s.getStopDefaultName());
- if (s.location != null)
- cv.put(StopsTable.COL_LOCATION, s.location);
- cv.put(StopsTable.COL_LAT, s.getLatitude());
- cv.put(StopsTable.COL_LONG, s.getLongitude());
- if (s.getAbsurdGTTPlaceName() != null) cv.put(StopsTable.COL_PLACE, s.getAbsurdGTTPlaceName());
- cv.put(StopsTable.COL_LINES_STOPPING, s.routesThatStopHereToString());
- if (s.type != null) cv.put(StopsTable.COL_TYPE, s.type.getCode());
-
- //Log.d(DEBUG_TAG,cv.toString());
- //cpOp.add(ContentProviderOperation.newInsert(uritobeused).withValues(cv).build());
- //valuesArr[i] = cv;
- db.replace(StopsTable.TABLE_NAME,null,cv);
-
- }
- db.setTransactionSuccessful();
- db.endTransaction();
- long endTime = System.currentTimeMillis();
- Log.d(DEBUG_TAG,"Inserting stops took: "+((double) (endTime-startTime)/1000)+" s");
-
- final ArrayList routes = f.getAllLinesFromGTT(gres);
-
- if(routes==null){
- Log.w(DEBUG_TAG,"Something went wrong downloading the lines");
- dbHelp.close();
- return false;
-
- }
-
- db.beginTransaction();
- startTime = System.currentTimeMillis();
- for (Route r: routes){
- final ContentValues cv = new ContentValues();
- cv.put(LinesTable.COLUMN_NAME,r.getName());
- switch (r.type){
- case BUS:
- cv.put(LinesTable.COLUMN_TYPE,"URBANO");
- break;
- case RAILWAY:
- cv.put(LinesTable.COLUMN_TYPE,"FERROVIA");
- break;
- case LONG_DISTANCE_BUS:
- cv.put(LinesTable.COLUMN_TYPE,"EXTRA");
- break;
- }
- cv.put(LinesTable.COLUMN_DESCRIPTION,r.description);
-
- //db.insert(LinesTable.TABLE_NAME,null,cv);
- int rows = db.update(LinesTable.TABLE_NAME,cv,LinesTable.COLUMN_NAME+" = ?",new String[]{r.getName()});
- if(rows<1){ //we haven't changed anything
- db.insert(LinesTable.TABLE_NAME,null,cv);
- }
- }
- db.setTransactionSuccessful();
- db.endTransaction();
- endTime = System.currentTimeMillis();
- Log.d(DEBUG_TAG,"Inserting lines took: "+((double) (endTime-startTime)/1000)+" s");
- dbHelp.close();
- return true;
-
- */
- return DatabaseUpdate.performDBUpdate(getApplication(),gres) == DatabaseUpdate.Result.DONE;
- }
- private int getNewVersion(UpdateRequestParams params){
- AtomicReference gres = new AtomicReference<>();
- String networkRequest = FiveTAPIFetcher.performAPIRequest(FiveTAPIFetcher.QueryType.STOPS_VERSION,null,gres);
- if(networkRequest == null){
- restartDBUpdateifPossible(params,gres);
- return VERSION_UNAIVALABLE;
- }
-
- boolean needed;
- try {
- JSONObject resp = new JSONObject(networkRequest);
- return resp.getInt("id");
- } catch (JSONException e) {
- e.printStackTrace();
- Log.e(DEBUG_TAG,"Error: wrong JSON response\nResponse:\t"+networkRequest);
- return -4;
- }
- }
- private void restartDBUpdateifPossible(UpdateRequestParams pars, AtomicReference res){
- if (pars.trial