Certain piece of code do not get executed even after all the conditions are true. Please see details

61 Views Asked by At

I'm developing an app and using following code to fetch current coordinates of the user (from this library):

   ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
          locationProvider.getLastKnownLocation().subscribe(new Action1<Location>() {
                  @Override
                  public void call(Location location) {
                  currentLatDouble = location.getLatitude();
                  currentLngDouble = location.getLongitude();
                  Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show();
                }
          });

The problem is that this code sometimes don't even gets executed even after all the conditions are true. See the code below:

    if (currentLatDouble != null || currentLngDouble != null) {
            retrieveHWrapper();
            progressBarLoadingRequests.setVisibility(View.VISIBLE);
            btnRetryGps.setVisibility(View.INVISIBLE);
            gps_off.setVisibility(View.INVISIBLE);
            Toast.makeText(getBaseContext(), "Loading hrequests...", Toast.LENGTH_LONG).show();
         } else {
            gps_off.setVisibility(View.VISIBLE);
            progressBarLoadingRequests.setVisibility(View.INVISIBLE);
            btnRetryGps.setVisibility(View.VISIBLE);
            btnRetryGps.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                btnRetryGpsEvents();
                int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_SETTINGS);
                                    if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
                                        if (ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
                                            // TODO: Consider calling
                                            //    ActivityCompat#requestPermissions
                                            // here to request the missing permissions, and then overriding
                                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                            //                                          int[] grantResults)
                                            // to handle the case where the user grants the permission. See the documentation
                                            // for ActivityCompat#requestPermissions for more details.
                                            if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_SETTINGS)) {
                                                showMessageOKCancel("You need to allow access to few permissions so that the app can work as expected.",
                                                        new DialogInterface.OnClickListener() {
                                                            @Override
                                                            public void onClick(DialogInterface dialog, int which) {
                                                                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS},
                                                                        REQUEST_RUNTIME_PERMISSION);
                                                            }
                                                        });
                                                return;
                                            }
                                            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS},
                                                    REQUEST_RUNTIME_PERMISSION);
                                            return;
                                        }
                                    }

                                    ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
                                    locationProvider.getLastKnownLocation()
                                            .subscribe(new Action1<Location>() {
                                                @Override
                                                public void call(Location location) {
                                                    currentLatDouble = location.getLatitude();
                                                    currentLngDouble = location.getLongitude();
                                                    Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show();
                                                }
                                            });
                                    Toast.makeText(getBaseContext(), "called from btnRetryGpsEvents() - GPS available", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

After running the above code, the toast due to this code is shown: Toast.makeText(getBaseContext(), "called from btnRetryGpsEvents() - GPS available", Toast.LENGTH_SHORT).show(); which means that this is getting executed, but the toast just above it viz.: Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show(); is not shown which means it doesn't gets executed!

How this can happen? What's going wrong here????

Please let me know.

P.S.: This problem is occuring only in Android M and above.

1

There are 1 best solutions below

2
On

Please check code inside ReactiveLocationProvider. I think it implements LocationListener. Guessing that getLastLocation called inside. It will give location only if last location available. Or please provide code so we can check.