onInfoWindowClick ничего не делает - PullRequest
0 голосов
/ 03 мая 2020

Когда я щелкаю свой onInfoWindowClick, ничего не происходит? Я не могу найти свою проблему.

Вот некоторые из моих функций. Оповещение работает очень хорошо, если я просто публикую его в onResume (), поэтому я должен указать onInfoWindowClick.

public class map extends Fragment implements
        OnMapReadyCallback,
        GoogleMap.OnInfoWindowClickListener {

    private static final String TAG = "map";
    private boolean mLocationPermissionGranted = false; //Used to ask permission to locations on the device
    private MapView mMapView;
    private FirebaseFirestore mDb;
    private FusedLocationProviderClient mfusedLocationClient;
    private UserLocation mUserLocation;
    private ArrayList<UserLocation> mUserLocations = new ArrayList<>();
    private GoogleMap mGoogleMap;
    private LatLngBounds mMapBoundary;
    private UserLocation mUserPosition;
    private ClusterManager mClusterManager;
    private MyClusterManagerRendere mClusterManagerRendere;
    private ArrayList<ClusterMarker> mClusterMarkers = new ArrayList<>();
    private Handler mHandler = new Handler();
    private Runnable mRunnable;
    private static final int LOCATION_UPDATE_INTERVAL = 3000; // 3 sek

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.test, container, false);
        mMapView = (MapView) view.findViewById(R.id.user_list_map);
        mfusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity());
        mDb = FirebaseFirestore.getInstance();
        initGoogleMaps(savedInstanceState);
        if(getArguments() != null){
            mUserLocations = getArguments().getParcelableArrayList(getString(R.string.user_location));
            setUserPosition();
        }
        return view;
    }

    private void getUserDetails(){
        //Merging location, timestamp and user information together
        if(mUserLocation == null){
            mUserLocation = new UserLocation();
            FirebaseUser usercheck = FirebaseAuth.getInstance().getCurrentUser();
            if (usercheck != null) {
                String user = usercheck.getUid();
                String email = usercheck.getEmail();
                String username = usercheck.getDisplayName();
                int avatar = R.drawable.pbstd;
                if(user != null) {
                    mUserLocation.setUser(user);
                    mUserLocation.setEmail(email);
                    mUserLocation.setUsername(username);
                    mUserLocation.setAvatar(avatar);
                    getLastKnownLocation();
                }
            }
        }else{
            getLastKnownLocation();
        }
    }

    private void getLastKnownLocation(){
        Log.d(TAG, "getLastKnownLocation: called.");
        if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            return;
        }
        mfusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if(task.isSuccessful()){
                    Location location = task.getResult();
                    GeoPoint geoPoint = new GeoPoint(location.getLatitude(), location.getLongitude());
                    Log.d(TAG, "onComplete: Latitude: " + location.getLatitude());
                    Log.d(TAG, "onComplete: Longitude: " + location.getLongitude());

                    mUserLocation.setGeo_Point(geoPoint);
                    mUserLocation.setTimestamp(null);
                    saveUserLocation();
                }
            }
        });
    }

    private void saveUserLocation(){
        if(mUserLocation != null) {
            DocumentReference locationRef = mDb.
                    collection(getString(R.string.user_location))
                    .document(FirebaseAuth.getInstance().getUid());

            locationRef.set(mUserLocation).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        Log.d(TAG, "SaveUserLocation: \ninserted user location into database."+
                                "Latitude: " + mUserLocation.getGeo_Point().getLatitude()+
                                "Longitude: " + mUserLocation.getGeo_Point().getLongitude());
                    }
                }
            });
        }
    }

    private void addMapMarkers(){
        if(mGoogleMap != null){
            if(mClusterManager == null){
                mClusterManager = new ClusterManager<ClusterMarker>(getActivity().getApplicationContext(), mGoogleMap);
            }
            if (mClusterManagerRendere == null){
                mClusterManagerRendere = new MyClusterManagerRendere(
                        getActivity(),
                        mGoogleMap,
                        mClusterManager
                );
                mClusterManager.setRenderer(mClusterManagerRendere);
            }

            for (UserLocation userLocation: mUserLocations){

                try{
                    String snippet = "";
                    if (userLocation.getUser().equals(FirebaseAuth.getInstance().getUid())){
                        snippet = "This is you";
                    }else{
                        snippet = "Determine route to " + userLocation.getUsername() + "?";
                    }
                    int avatar = R.drawable.pbstd;
                    try{
                        avatar = userLocation.getAvatar();
                    }catch (NumberFormatException e){
                        Toast.makeText(getActivity(), "Error Cluster 1", Toast.LENGTH_SHORT).show();
                    }
                    ClusterMarker newClusterMarker =new ClusterMarker(
                            new LatLng(userLocation.getGeo_Point().getLatitude(), userLocation.getGeo_Point().getLongitude()),
                            userLocation.getUsername(),
                            snippet,
                            avatar,
                            userLocation.getUser());
                    mClusterManager.addItem(newClusterMarker);
                    mClusterMarkers.add(newClusterMarker);
                }catch (NullPointerException e){
                    Toast.makeText(getActivity(), "Error Cluster 2", Toast.LENGTH_SHORT).show();
                }
            }
            mClusterManager.cluster();

            setCameraView();
        }
    }

    private  void setCameraView(){

        //Map view window: 0.2 * 0.2 = 0.04
        double bottomBoundary = mUserPosition.getGeo_Point().getLatitude() - .1;
        double leftBoundary = mUserPosition.getGeo_Point().getLongitude() - .1;
        double topBoundary = mUserPosition.getGeo_Point().getLatitude() + .1;
        double rightBoundary = mUserPosition.getGeo_Point().getLongitude() + .1;

        mMapBoundary = new LatLngBounds(
                new LatLng(bottomBoundary, leftBoundary),
                new LatLng(topBoundary, rightBoundary)
        );

        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mMapBoundary, 0));
    }

    private void setUserPosition(){
        for (UserLocation userLocation : mUserLocations){
            if (userLocation.getUser().equals(FirebaseAuth.getInstance().getUid())){
                mUserPosition = userLocation;
                Log.d(TAG, "setUserPosition: "+userLocation);
            }
        }
    }

    private void initGoogleMaps(Bundle savedInstanceState){
        // MapView requires that the Bundle you pass contain _ONLY_ MapView SDK
        // objects or sub-Bundles.
        Bundle mapViewBundle = null;
        if (savedInstanceState != null) {
            mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY);
        }

        mMapView.onCreate(mapViewBundle);
        mMapView.getMapAsync(this);
    }

    private boolean checkMapServices(){
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        if(isServiceApproved() && user != null){
            if(isMapsEnabled()){
                return true;
            }
        }
        return false;
    }

    //Prompt a dialog
    private void buildAlertMessageNoLocation(){
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("This application requires Location, do you want to enable it?");
        builder.setCancelable(false);
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivityForResult(enableLocationIntent, PERMISSIONS_REQUEST_ENABLE_LOCATION);
            }
        });
    }
    //Determines whether or not the current application has enabled Location.
    public boolean isMapsEnabled(){
        final LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);

        if( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER)){
            buildAlertMessageNoLocation();
            return false;
        }
        return true;
    }

    //Request location permission, so that we can get the location of the device.
    private void getLocationPermission(){
        if(ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
            //getChatRooms();
            getUserDetails();
        } else{
            //this wil prompt the user a dialog pop-up asking them if its okay to use location permission
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCES_FINE_LOCATION);
        }
    }

    private void startUserLocationsRunnable(){
        Log.d(TAG, "startUserLocationsRunnable: starting runnable for retrieving updated locations.");
        mHandler.postDelayed(mRunnable = new Runnable() {
            @Override
            public void run() {
                retrieveUserLocations();
                //Call every 3 sec, in the background
                mHandler.postDelayed(mRunnable, LOCATION_UPDATE_INTERVAL);
            }
        }, LOCATION_UPDATE_INTERVAL);
    }

    private void stopLocationUpdates(){
        mHandler.removeCallbacks(mRunnable);
    }

    private void retrieveUserLocations(){
        Log.d(TAG, "retrieveUserLocations: retrieving location of all users in the chatroom.");
        //Loop through every ClusterMarker (custom marker in Maps)
        try{
            for(final ClusterMarker clusterMarker: mClusterMarkers){

                DocumentReference userLocationRef = FirebaseFirestore.getInstance()
                        .collection(getString(R.string.user_location))
                        .document(clusterMarker.getUser());

                userLocationRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if(task.isSuccessful()){
                            final UserLocation updatedUserLocation = task.getResult().toObject(UserLocation.class);
                            // update the location
                            for (int i = 0; i < mClusterMarkers.size(); i++) {
                                try {
                                    if (mClusterMarkers.get(i).getUser().equals(updatedUserLocation.getUser())) {

                                        LatLng updatedLatLng = new LatLng(
                                                updatedUserLocation.getGeo_Point().getLatitude(),
                                                updatedUserLocation.getGeo_Point().getLongitude()
                                        );
                                        mClusterMarkers.get(i).setPosition(updatedLatLng);
                                        mClusterManagerRendere.setUpdateMarker(mClusterMarkers.get(i));
                                    }
                                } catch (NullPointerException e) {
                                    Log.e(TAG, "retrieveUserLocations: NullPointerException: " + e.getMessage());
                                }
                            }
                        }
                    }
                });
            }
        }catch (IllegalStateException e){
            Log.e(TAG, "retrieveUserLocations: Fragment was destroyed during Firestore query. Ending query." + e.getMessage() );
        }
    }

    //This function determines whether or not the device is able to use google services
    public boolean isServiceApproved(){
        Log.d(TAG, "isServiceApproved: checking google services version ");

        int available = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getActivity());

        if(available == ConnectionResult.SUCCESS){
            //User can access the map
            Log.d(TAG, "isServiceApproved: Google Play Services is okay");
            return true;
        }
        else if(GoogleApiAvailability.getInstance().isUserResolvableError(available)){
            Log.d(TAG, "isServiceApproved: an error occured");
            Dialog dialog = GoogleApiAvailability.getInstance().getErrorDialog(getActivity(), available, ERROR_DIALOG_REQUEST);
            dialog.show();
        } else {
            Toast.makeText(getActivity(), "Map requests cannot be accessed", Toast.LENGTH_SHORT).show();
        }
        return false;
    }

    //This function will run after the user either denied or accepted the permission for Fine location
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case PERMISSIONS_REQUEST_ACCES_FINE_LOCATION: {
                // if result is cancelled, the result arrays are empty
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    mLocationPermissionGranted = true;
                }
            }
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: called");
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ENABLE_LOCATION: {
                if (mLocationPermissionGranted) {
                    //getChatRooms();
                    getUserDetails();
                } else {
                    getLocationPermission();
                }
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(checkMapServices()){
            if(mLocationPermissionGranted){
                //getChatRooms();
                getUserDetails();
            } else{
                getLocationPermission();
            }
        }
        mMapView.onResume();
        startUserLocationsRunnable();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        Bundle mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY);
        if (mapViewBundle == null) {
            mapViewBundle = new Bundle();
            outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle);
        }

        mMapView.onSaveInstanceState(mapViewBundle);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            return;
        }
        //Enable/disable blue dot
        map.setMyLocationEnabled(true);
        mGoogleMap = map;
        addMapMarkers();
        map.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(marker.getSnippet())
                .setCancelable(true)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                    }
                });
        final AlertDialog alert = builder.create();
        alert.show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...