Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.wind.app.screens.tabs.outside;
- import android.Manifest;
- import android.annotation.SuppressLint;
- import android.content.Context;
- import android.content.Intent;
- import android.graphics.Color;
- import android.graphics.drawable.ColorDrawable;
- import android.graphics.drawable.Drawable;
- import android.location.Location;
- import android.location.LocationManager;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.text.Spannable;
- import android.text.SpannableString;
- import android.util.Log;
- import android.view.View;
- import android.view.inputmethod.EditorInfo;
- import android.widget.TextView;
- import com.google.android.gms.maps.CameraUpdate;
- import com.google.android.gms.maps.CameraUpdateFactory;
- import com.google.android.gms.maps.GoogleMap;
- import com.google.android.gms.maps.OnMapReadyCallback;
- import com.google.android.gms.maps.SupportMapFragment;
- import com.google.android.gms.maps.model.BitmapDescriptorFactory;
- import com.google.android.gms.maps.model.CameraPosition;
- import com.google.android.gms.maps.model.LatLng;
- import com.google.android.gms.maps.model.Marker;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.google.android.gms.maps.model.VisibleRegion;
- import com.google.maps.android.ui.IconGenerator;
- import com.opencsv.CSVWriter;
- import com.sothree.slidinguppanel.SlidingUpPanelLayout;
- import com.wind.app.R;
- import com.wind.app.base.fragment.BaseViewModelFragment;
- import com.wind.app.base.interfaces.OnPermissionRequestListener;
- import com.wind.app.base.viewmodel.GenericViewModelFactory;
- import com.wind.app.databinding.FragmentAirBubblesBinding;
- import com.wind.app.model.OutsideAQI;
- import com.wind.app.screens.devices.fragment.AirQualityActivity;
- import com.wind.app.utils.Conversion;
- import com.wind.app.utils.CustomTypefaceSpan;
- import com.wind.app.utils.GeocoderUtils;
- import com.wind.app.utils.TextUtils;
- import com.wind.app.utils.ViewUtils;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.core.content.res.ResourcesCompat;
- import androidx.lifecycle.ViewModelProviders;
- import de.hdodenhof.circleimageview.CircleImageView;
- public class AirBubblesFragment
- extends BaseViewModelFragment<AirBubblesViewModel.AirBubblesViewAction,
- AirBubblesViewModel,
- FragmentAirBubblesBinding>
- implements AirBubblesViewModel.AirBubblesViewAction,
- OnMapReadyCallback,
- GoogleMap.OnMarkerClickListener {
- private static final int REQUEST_DELAY = 200;
- private static final Drawable TRANSPARENT_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
- private Handler handler = new Handler(Looper.getMainLooper());
- private GoogleMap map;
- private boolean searchVisible = false;
- public static AirBubblesFragment build() {
- return new AirBubblesFragment();
- }
- @Override
- protected AirBubblesViewModel createViewModel() {
- return ViewModelProviders.of(this, new GenericViewModelFactory<AirBubblesViewModel>() {
- @Override
- protected AirBubblesViewModel createInstance() {
- return new AirBubblesViewModel(getArguments());
- }
- }).get(AirBubblesViewModel.class);
- }
- @Override
- protected AirBubblesViewModel.AirBubblesViewAction createViewActionHandler() {
- return this;
- }
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
- .findFragmentById(R.id.map);
- mapFragment.getMapAsync(this);
- setupListeners();
- setupObservers();
- //initPlaces();
- }
- // private void initPlaces() {
- // Places.initialize(getContext(), getString(R.string.google_maps_key));
- //
- // AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
- // getChildFragmentManager().findFragmentById(R.id.autocomplete_fragment);
- //
- // autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
- //
- // autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
- // @Override
- // public void onPlaceSelected(@NonNull Place place) {
- // // TODO: 09.08.2019 close fragment and check camera logic
- // Log.d("PLACES_API", "onPlaceSelected: " + place.getLatLng());
- // LatLng location = place.getLatLng();
- // float zoom = map.getCameraPosition().zoom;
- // CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
- // location, zoom);
- // map.animateCamera(cameraUpdate);
- // }
- //
- // @Override
- // public void onError(@NonNull Status status) {
- // Log.d("PLACES_API", "onError: " + status);
- // }
- // });
- // }
- private void setupListeners() {
- getBinding().slidingLayout.setFadeOnClickListener(v -> {
- getBinding().slidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
- });
- // TODO: 12.08.2019 remove after connecting to google places API
- getBinding().locationEt.setOnEditorActionListener((v, actionId, event) -> {
- if (actionId == EditorInfo.IME_ACTION_DONE) {
- LatLng location = GeocoderUtils.getLocationByAddress(getContext(), v.getText().toString());
- if (location != null) {
- float zoom = map.getCameraPosition().zoom;
- CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
- location, zoom);
- map.animateCamera(cameraUpdate);
- // map.moveCamera(CameraUpdateFactory.newLatLng(location));
- // map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
- } else {
- showMessage("Given address was not found");
- }
- return true;
- }
- return false;
- });
- getBinding().searchBtn.setOnClickListener(v -> {
- if (searchVisible) {
- getBinding().locationEt.setVisibility(View.GONE);
- getBinding().airBubblesTv.setVisibility(View.VISIBLE);
- } else {
- getBinding().locationEt.setVisibility(View.VISIBLE);
- getBinding().airBubblesTv.setVisibility(View.GONE);
- }
- searchVisible = !searchVisible;
- });
- getBinding().locationBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.d(TAG, "onClick: ");
- }
- });
- getBinding().shareBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.d(TAG, "onClick: ");
- }
- });
- }
- private void setupObservers() {
- getViewModel().getMarkerData().observe(this, this::onMarkerDataChanged);
- }
- private void onMarkerDataChanged(ArrayList<OutsideAQI> outsideAQIS) {
- map.clear();
- View markerView = getLayoutInflater().inflate(R.layout.view_map_marker, null);
- TextView markerText = markerView.findViewById(R.id.marker_text);
- CircleImageView markerBackground = markerView.findViewById(R.id.marker_bg);
- IconGenerator iconGenerator = new IconGenerator(getContext());
- iconGenerator.setContentView(markerView);
- iconGenerator.setBackground(TRANSPARENT_DRAWABLE);
- boolean isCurrentPointOnScreen = false;
- for (OutsideAQI data : outsideAQIS) {
- boolean shouldUseAQI = false;
- int aqiValue = 0;
- if (data.getAqi() != 0) {
- aqiValue = data.getAqi();
- shouldUseAQI = true;
- } else if (data.getPm25() != 0) {
- aqiValue = Conversion.pm2_5_to_aqi((int) data.getPm25());
- }
- //setup and add marker
- markerText.setText(String.valueOf(aqiValue));
- markerBackground.setImageResource(ViewUtils.getColorBySensorReading(aqiValue, shouldUseAQI));
- Marker marker = map.addMarker(new MarkerOptions().
- icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon())).
- position(new LatLng(data.getLatitude(), data.getLongitude()))
- );
- marker.setTag(data);
- if (isTheSamePoint(getViewModel().getCurrentPointAQI(), data)) {
- onMarkerClick(marker);
- isCurrentPointOnScreen = true;
- }
- }
- //check if point is not on the screen anymore
- if (!isCurrentPointOnScreen) {
- getViewModel().setCurrentPointAQI(null);
- }
- }
- private boolean isTheSamePoint(OutsideAQI p1, OutsideAQI p2) {
- if (p1 == null || p2 == null) {
- return false;
- }
- return p1.getLatitude() == p2.getLatitude()
- && p1.getLongitude() == p2.getLongitude();
- }
- @Override
- protected int getLayoutResId() {
- return R.layout.fragment_air_bubbles;
- }
- @Override
- public void onMapReady(GoogleMap googleMap) {
- this.map = googleMap;
- googleMap.setOnMarkerClickListener(this);
- googleMap.setOnCameraIdleListener(() -> {
- handler.postDelayed(() -> {
- VisibleRegion region = map.getProjection().getVisibleRegion();
- getViewModel().onCameraIdle(region);
- }, REQUEST_DELAY);
- });
- googleMap.setOnCameraMoveStartedListener(i -> {
- handler.removeCallbacksAndMessages(null);
- });
- AQIInfoWindowAdapter adapter = new AQIInfoWindowAdapter(getContext());
- this.map.setInfoWindowAdapter(adapter);
- }
- @Override
- public boolean onMarkerClick(Marker marker) {
- OutsideAQI data = (OutsideAQI) marker.getTag();
- setupSlidingPanelData(data);
- getViewModel().setCurrentPointAQI(data);
- int height = getResources().getDimensionPixelSize(R.dimen.sliding_panel_activated_height);
- getBinding().slidingLayout.setPanelHeight(height);
- marker.showInfoWindow();
- return true; // handled by code, no default behaviour
- }
- private void setupSlidingPanelData(OutsideAQI data) {
- hideAllSlidingPanelData();
- String countryName = TextUtils.getLocationNameByLatLng(getContext(), data.getLatitude(), data.getLongitude());
- getBinding().countryTv.setText(countryName);
- if (data.getAqi() != 0) {
- String text = String.valueOf(data.getAqi());
- getBinding().aqiLayout.setVisibility(View.VISIBLE);
- getBinding().aqiTv.setText(text);
- }
- if (data.getPm10() != 0) {
- Spannable text = getUmgText(data.getPm10());
- //String text = String.format(getString(R.string.outside_screen_ugm_format), data.getPm10());
- getBinding().pm10Layout.setVisibility(View.VISIBLE);
- getBinding().pm10Tv.setText(text);
- }
- if (data.getPm25() != 0) {
- Spannable text = getUmgText(data.getPm25());
- getBinding().pm25Layout.setVisibility(View.VISIBLE);
- getBinding().pm25Tv.setText(text);
- }
- if (data.getCo() != 0) {
- String text = String.format(getString(R.string.outside_screen_co_format), data.getCo());
- getBinding().coLayout.setVisibility(View.VISIBLE);
- getBinding().coTv.setText(text);
- }
- if (data.getNo2() != 0) {
- String text = String.format(getString(R.string.outside_screen_ppb_format), data.getNo2());
- getBinding().no2Layout.setVisibility(View.VISIBLE);
- getBinding().no2Tv.setText(text);
- }
- if (data.getO3() != 0) {
- String text = String.format(getString(R.string.outside_screen_ppm_format), data.getO3());
- getBinding().o3Layout.setVisibility(View.VISIBLE);
- getBinding().o3Tv.setText(text);
- }
- if (data.getSo2() != 0) {
- String text = String.format(getString(R.string.outside_screen_so2_format), data.getSo2());
- getBinding().so2Layout.setVisibility(View.VISIBLE);
- getBinding().so2Tv.setText(text);
- }
- }
- private Spannable getUmgText(float value) {
- String numberAndSpace = String.format(getString(R.string.outside_screen_number_space_format), value);
- String mu = "\u03BC";
- String end = "g/m\u00B3";
- Spannable spannable = new SpannableString(numberAndSpace + mu + end);
- spannable.setSpan(new CustomTypefaceSpan("", ResourcesCompat.getFont(getContext(), R.font.avenir_bold)),
- numberAndSpace.length(),
- numberAndSpace.length() + 1,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return spannable;
- }
- private void hideAllSlidingPanelData() {
- getBinding().aqiLayout.setVisibility(View.GONE);
- getBinding().pm10Layout.setVisibility(View.GONE);
- getBinding().pm25Layout.setVisibility(View.GONE);
- getBinding().coLayout.setVisibility(View.GONE);
- getBinding().no2Layout.setVisibility(View.GONE);
- getBinding().o3Layout.setVisibility(View.GONE);
- getBinding().so2Layout.setVisibility(View.GONE);
- }
- @Override
- public void showInfoScreen() {
- AirQualityActivity.launch(getActivity());
- }
- @Override
- public void shareInfo() {
- OutsideAQI data = new OutsideAQI();
- String fileName = "aqi_data";
- File file = new File(getContext().getFilesDir(), fileName);
- try {
- CSVWriter writer = new CSVWriter(new FileWriter(file));
- List<String[]> csvFields = new ArrayList<>();
- csvFields.add(new String[]{"aqi", String.valueOf(data.getAqi())});
- csvFields.add(new String[]{"pm25", String.valueOf(data.getPm25())});
- csvFields.add(new String[]{"pm10", String.valueOf(data.getPm10())});
- csvFields.add(new String[]{"so2", String.valueOf(data.getSo2())});
- csvFields.add(new String[]{"co", String.valueOf(data.getCo())});
- csvFields.add(new String[]{"o3", String.valueOf(data.getO3())});
- csvFields.add(new String[]{"no2", String.valueOf(data.getNo2())});
- writer.writeAll(csvFields);
- writer.close();
- Intent sendIntent = new Intent();
- sendIntent.setAction(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
- sendIntent.setDataAndType(Uri.fromFile(file), "text/csv");
- sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- startActivity(sendIntent);
- } catch (IOException e) {
- }
- }
- private void shareCSV() {
- }
- @Override
- public void showCurrentLocation() {
- checkPermission(new OnPermissionRequestListener() {
- @Override
- public void onPermissionGranted() {
- moveMapCameraToCurrentLocation();
- }
- @Override
- public void onPermissionDenied() {
- Log.d(TAG, "onPermissionDenied: ");
- }
- }, Manifest.permission.ACCESS_FINE_LOCATION);
- }
- @SuppressLint("MissingPermission")
- private void moveMapCameraToCurrentLocation() {
- LocationManager lm = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
- Location lastKnownLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
- double lastLat = lastKnownLocation.getLatitude();
- double lastLng = lastKnownLocation.getLongitude();
- float zoom = map.getCameraPosition().zoom;
- CameraPosition cameraPosition = new CameraPosition.Builder()
- .target(new LatLng(lastLat, lastLng))
- .zoom(zoom)
- .build();
- map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement