/* * Artcodes recognises a different marker scheme that allows the * creation of aesthetically pleasing, even beautiful, codes. * Copyright (C) 2013-2016 The University of Nottingham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.horizon.artcodes.fragment; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import uk.ac.horizon.artcodes.GoogleAnalytics; import uk.ac.horizon.artcodes.R; import uk.ac.horizon.artcodes.activity.NavigationActivity; import uk.ac.horizon.artcodes.adapter.ExperienceGroupAdapter; import uk.ac.horizon.artcodes.databinding.ListBinding; public class ExperienceRecommendFragment extends ArtcodeFragmentBase { private static final int LOCATION_PERMISSION_REQUEST = 87; private ExperienceGroupAdapter adapter; @NonNull @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ListBinding binding = ListBinding.inflate(inflater, container, false); adapter = new ExperienceGroupAdapter(getActivity(), getServer()); binding.setAdapter(adapter); return binding.getRoot(); } @Override public void onStart() { super.onStart(); if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST); } } @Override public void onResume() { super.onResume(); GoogleAnalytics.trackScreen("View Recommended"); getActivity().setTitle(R.string.nav_home); loadExperiences(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case LOCATION_PERMISSION_REQUEST: { loadExperiences(); } } } private void loadExperiences() { loadLocal(); adapter.loadStarted(); getServer().loadRecommended(adapter.getCallback(), getLocation()); } private void navigateTo(Fragment fragment) { if(getActivity() instanceof NavigationActivity) { NavigationActivity activity = (NavigationActivity) getActivity(); activity.navigate(fragment, true); } } private void loadLocal() { adapter.loadStarted(); getServer().loadRecent(adapter.getCallback("recent", new View.OnClickListener() { @Override public void onClick(final View v) { navigateTo(new ExperienceRecentFragment()); } })); adapter.loadStarted(); getServer().loadStarred(adapter.getCallback("starred", new View.OnClickListener() { @Override public void onClick(final View v) { navigateTo(new ExperienceStarFragment()); } })); } @Nullable private Location getLocation() { if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { final LocationManager locationManager = (LocationManager) getContext().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); float accuracy = Float.MAX_VALUE; Location location = null; for (String provider : locationManager.getProviders(new Criteria(), true)) { Location newLocation = locationManager.getLastKnownLocation(provider); if (newLocation != null) { if (newLocation.getAccuracy() < accuracy) { accuracy = newLocation.getAccuracy(); location = newLocation; } } } return location; } else { Log.i("location", "No location permission"); } return null; } }