diff --git a/app/build.gradle b/app/build.gradle index f5ca2861500824836f4a2e73ab4b23ff3eba185b..1289e07159af39707c0df69df0c25d826ac6c6be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,4 +37,5 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation 'com.google.android.material:material:1.1.0' implementation 'com.google.android.gms:play-services-location:17.0.0' + implementation 'com.karumi:dexter:6.0.2' } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListener.java b/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListener.java new file mode 100644 index 0000000000000000000000000000000000000000..47d464742d91cc03ec85292fa874a33ef0b23861 --- /dev/null +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListener.java @@ -0,0 +1,34 @@ +package de.itstall.freifunkfranken.controller; + +import android.location.Location; +import android.location.LocationListener; +import android.os.Bundle; + +public class CustomLocationListener implements LocationListener { + private LocationListenerInterface listenerInterface; + + public CustomLocationListener(LocationListenerInterface locationListenerInterface) { + this.listenerInterface = locationListenerInterface; + } + + @Override + public void onLocationChanged(Location location) { + this.listenerInterface.onLocationChanged(location); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + this.listenerInterface.onStatusChanged(provider); + + } + + @Override + public void onProviderEnabled(String provider) { + this.listenerInterface.onProviderEnabled(provider); + } + + @Override + public void onProviderDisabled(String provider) { + this.listenerInterface.onProviderDisabled(provider); + } +} diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListenerInterface.java b/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListenerInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..2e5e0529d95a42864588ada9b95a7ebdf381e79c --- /dev/null +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListenerInterface.java @@ -0,0 +1,25 @@ +package de.itstall.freifunkfranken.controller; + +import android.location.Location; + +public class CustomLocationListenerInterface implements LocationListenerInterface { + @Override + public void onLocationChanged(Location location) { + + } + + @Override + public void onStatusChanged(String provider) { + + } + + @Override + public void onProviderEnabled(String provider) { + + } + + @Override + public void onProviderDisabled(String provider) { + + } +} diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/FileDownloader.java b/app/src/main/java/de/itstall/freifunkfranken/controller/FileDownloader.java index 10984fc6a45366b6a2a551c62f551f615f819b10..1b1938ff54eb36fecedba5bff79429c133266981 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/FileDownloader.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/FileDownloader.java @@ -101,6 +101,6 @@ public class FileDownloader extends AsyncTask<String, Void, String> { super.onPostExecute(string); if (progressDialog != null) progressDialog.dismiss(); mainActivity.downloadDone = true; - mainActivity.loadFragment(mainActivity.fragment); + mainActivity.loadFragment(mainActivity.getFragment(mainActivity.selectedTab)); } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/LocationListenerInterface.java b/app/src/main/java/de/itstall/freifunkfranken/controller/LocationListenerInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..dca5c73d1a4ee43981c26dfa47c48368cc944114 --- /dev/null +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/LocationListenerInterface.java @@ -0,0 +1,13 @@ +package de.itstall.freifunkfranken.controller; + +import android.location.Location; + +public interface LocationListenerInterface { + void onLocationChanged(Location location); + + void onStatusChanged(String provider); + + void onProviderEnabled(String provider); + + void onProviderDisabled(String provider); +} diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/NewsAdapter.java b/app/src/main/java/de/itstall/freifunkfranken/controller/NewsAdapter.java index 11ceb0f9b1958fd866ba5b8bb213d3a136fb486b..8dac88c0566092cc439e32407c1b8c429302b990 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/NewsAdapter.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/NewsAdapter.java @@ -36,7 +36,12 @@ public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { public void onBindViewHolder(NewsAdapter.ViewHolder viewHolder, int position) { viewHolder.tvNewsDate.setText(newsList.get(position).getDate()); viewHolder.tvNewsTitle.setText(newsList.get(position).getTitle()); - viewHolder.tvNewsDescription.setText(Html.fromHtml(newsList.get(position).getDescription())); + viewHolder.tvNewsDescription.setText(Html.fromHtml( + newsList.get(position).getDescription() + + "<br><br><a href=\"" + newsList.get(position).getLink() + "\">" + + viewHolder.itemView.getContext().getString(R.string.newsArticleRead) + + "</a>" + )); viewHolder.tvNewsDescription.setMovementMethod(LinkMovementMethod.getInstance()); } @@ -52,9 +57,9 @@ public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { ViewHolder(View viewNewsItem) { super(viewNewsItem); - tvNewsDate = viewNewsItem.findViewById(R.id.tvNewsDate); - tvNewsTitle = viewNewsItem.findViewById(R.id.tvNewsTitle); - tvNewsDescription = viewNewsItem.findViewById(R.id.tvNewsDescription); + tvNewsDate = viewNewsItem.findViewById(R.id.newsTvDate); + tvNewsTitle = viewNewsItem.findViewById(R.id.newsTvTitle); + tvNewsDescription = viewNewsItem.findViewById(R.id.newsTvDescription); } } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/NextApAdapter.java b/app/src/main/java/de/itstall/freifunkfranken/controller/NextApAdapter.java index f31b47430276c1686fd0562f20b14c816f628656..0cb280da69635a6996d8f12147ea06ec08755f2f 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/NextApAdapter.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/NextApAdapter.java @@ -30,15 +30,16 @@ public class NextApAdapter extends RecyclerView.Adapter<NextApAdapter.ViewHolder return new ViewHolder(viewApsItem); } + @SuppressLint("DefaultLocale") @Override public void onBindViewHolder(NextApAdapter.ViewHolder viewHolder, int position) { viewHolder.tvAp.setText(accessPointList.get(position).getName()); - if (accessPointList.get(position).isOnline()) { - viewHolder.tvStatus.setText(R.string.statusOnline); - } else { - viewHolder.tvStatus.setText(R.string.statusOffline); - } - //viewHolder.tvDistance.setText(String.format("%dm", accessPointList.get(position).getDistance(NextApFragment.myLocationListener.latitude, NextApFragment.myLocationListener.longitude))); + viewHolder.tvStatus.setText( + accessPointList.get(position).isOnline() ? R.string.statusOnline : R.string.statusOffline + ); + viewHolder.tvDistance.setText( + String.format("%d m", accessPointList.get(position).getDistance()) + ); } @Override @@ -53,9 +54,9 @@ public class NextApAdapter extends RecyclerView.Adapter<NextApAdapter.ViewHolder ViewHolder(View itemView) { super(itemView); - tvAp = itemView.findViewById(R.id.tvNewsTitle); - tvStatus = itemView.findViewById(R.id.tvStatus); - tvDistance = itemView.findViewById(R.id.tvNewsDate); + tvAp = itemView.findViewById(R.id.nextApSsid); + tvStatus = itemView.findViewById(R.id.nextApTvStatus); + tvDistance = itemView.findViewById(R.id.nextApDistance); } } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/RequestAps.java b/app/src/main/java/de/itstall/freifunkfranken/controller/RequestAps.java index c06f6832cc72c40059f7d033c7aad34109a393fe..f2eeeb4e201cef560a587883f2beb1173cd8b120 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/RequestAps.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/RequestAps.java @@ -17,14 +17,18 @@ import java.util.List; import java.util.Objects; import de.itstall.freifunkfranken.model.AccessPoint; +import de.itstall.freifunkfranken.view.NextApFragment; public class RequestAps { private List<AccessPoint> accessPointList = new ArrayList<>(); + private static final String TAG = RequestAps.class.getSimpleName(); + private Context context; public RequestAps(Context context) { String filename = "data.json"; StringBuilder stringBuilder = new StringBuilder(); File dataFile = new File(context.getFilesDir(), filename); + this.context = context; try { BufferedReader bufferedReader = new BufferedReader(new FileReader(dataFile)); @@ -59,31 +63,40 @@ public class RequestAps { } public List<AccessPoint> getSortedList(boolean showOffline, int routerCount) { - List<AccessPoint> newList = new ArrayList<>(); + List<AccessPoint> routerList = new ArrayList<>(); int counter = 0; - for (AccessPoint ap : accessPointList) { + for (int i = 0; i < accessPointList.size(); i++) { if(showOffline) { - //float distance = NextApFragment.myLocationListener.myLocation.distanceTo(ap.getLocation()) / 1000; - //ap.setDistance((int) distance / 1000); - newList.add(ap); + if (NextApFragment.location != null) + accessPointList.get(i).setDistance(NextApFragment.location); + routerList.add(accessPointList.get(i)); counter++; } else { - if(ap.isOnline()) { - newList.add(ap); + if (accessPointList.get(i).isOnline()) { + if (NextApFragment.location != null) + accessPointList.get(i).setDistance(NextApFragment.location); + routerList.add(accessPointList.get(i)); counter++; } } - if(routerCount > 0 && counter == routerCount) break; } - Collections.sort(newList, new Comparator<AccessPoint>() { + Collections.sort(routerList, new Comparator<AccessPoint>() { @Override public int compare(AccessPoint o1, AccessPoint o2) { return Integer.compare(o1.getDistance(), o2.getDistance()); } }); - return newList; + if (routerCount > 0) { + List<AccessPoint> resultList = new ArrayList<>(); + for (int i = 0; i < routerCount; i++) { + resultList.add(routerList.get(i)); + } + return resultList; + } else { + return routerList; + } } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/RequestNews.java b/app/src/main/java/de/itstall/freifunkfranken/controller/RequestNews.java index 4ac43abd7fb80212adebf705f3467a26e7d4830d..cb7428bbb000a21f955a79827a1f08ce0cf13cd4 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/RequestNews.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/RequestNews.java @@ -47,7 +47,8 @@ public class RequestNews { news = new News( item.getString("title"), item.getString("pubDate"), - item.getString("description") + item.getString("description"), + item.getString("link") ); newsList.add(news); } diff --git a/app/src/main/java/de/itstall/freifunkfranken/controller/SsidsAdapter.java b/app/src/main/java/de/itstall/freifunkfranken/controller/SsidsAdapter.java index f921e027483339be623b3e29ce0b5ee5976db2e5..9e57bd4e11cff813eb3369a9a8ac79206a699ddc 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/controller/SsidsAdapter.java +++ b/app/src/main/java/de/itstall/freifunkfranken/controller/SsidsAdapter.java @@ -46,7 +46,7 @@ public class SsidsAdapter extends RecyclerView.Adapter<SsidsAdapter.ViewHolder> ViewHolder(View itemView) { super(itemView); - tvSsid = itemView.findViewById(R.id.tvNewsTitle); + tvSsid = itemView.findViewById(R.id.nextApSsid); } } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/model/AccessPoint.java b/app/src/main/java/de/itstall/freifunkfranken/model/AccessPoint.java index 1ff9d67cac3d6aec6731c1a161680874a4e932fb..8417ecdc836fd2c275f648e6fd2877f864e167a7 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/model/AccessPoint.java +++ b/app/src/main/java/de/itstall/freifunkfranken/model/AccessPoint.java @@ -51,7 +51,7 @@ public class AccessPoint { return apLocation; } - public void setDistance(int distance) { - this.distance = distance; + public void setDistance(Location location) { + this.distance = (int) this.getLocation().distanceTo(location); } } \ No newline at end of file diff --git a/app/src/main/java/de/itstall/freifunkfranken/model/News.java b/app/src/main/java/de/itstall/freifunkfranken/model/News.java index 18ac0b30f8b1b74cf8178eee6732489b6647f1fe..5b89dc79ab03d1ac23a0b9789e27fb5e19cd50a9 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/model/News.java +++ b/app/src/main/java/de/itstall/freifunkfranken/model/News.java @@ -4,11 +4,13 @@ public class News { private String title; private String date; private String description; + private String link; - public News(String title, String date, String description) { + public News(String title, String date, String description, String link) { this.title = title; this.date = date; this.description = description; + this.link = link; } public String getDescription() { @@ -22,4 +24,8 @@ public class News { public String getDate() { return date; } + + public String getLink() { + return link; + } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/view/MainActivity.java b/app/src/main/java/de/itstall/freifunkfranken/view/MainActivity.java index 2f374f9765df2e928d832be9241736a497c6d7a9..89c805c154cc0c42b1954a859eca4d2133f69f45 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/view/MainActivity.java +++ b/app/src/main/java/de/itstall/freifunkfranken/view/MainActivity.java @@ -24,6 +24,7 @@ public class MainActivity extends AppCompatActivity { public Fragment fragment = null; public boolean downloadDone = false; TabLayout tabLayout; + public int selectedTab; private SharedPreferences sharedPreferences; @Override @@ -31,7 +32,7 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - sharedPreferences = this.getApplicationContext().getSharedPreferences("FreifunkFrankenApp", 0); + sharedPreferences = this.getApplicationContext().getSharedPreferences(getResources().getString(R.string.app_name), 0); tabLayout = findViewById(R.id.tabLayout); @@ -51,22 +52,10 @@ public class MainActivity extends AppCompatActivity { tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { - switch (tab.getPosition()) { - case 0: - fragment = new NewsFragment(); - break; - case 1: - fragment = new NextApFragment(); - break; - case 2: - fragment = new MapsFragment(); - break; - case 3: - fragment = new SsidsFragment(); - } - if (downloadDone) loadFragment(fragment); + selectedTab = tab.getPosition(); + if (downloadDone) loadFragment(getFragment(selectedTab)); @SuppressLint("CommitPrefEdits") Editor editor = sharedPreferences.edit(); - editor.putInt("selectedTab", tab.getPosition()); + editor.putInt("selectedTab", selectedTab); editor.apply(); } @@ -78,7 +67,6 @@ public class MainActivity extends AppCompatActivity { public void onTabReselected(TabLayout.Tab tab) { } }); - downloadFiles(); } @@ -102,6 +90,24 @@ public class MainActivity extends AppCompatActivity { } } + public Fragment getFragment(int selectedTab) { + switch (selectedTab) { + case 0: + fragment = new NewsFragment(); + break; + case 1: + fragment = new NextApFragment(); + break; + case 2: + fragment = new MapsFragment(); + break; + case 3: + fragment = new SsidsFragment(); + } + + return fragment; + } + public void downloadFiles() { FileDownloader fileDownloader = new FileDownloader(this, "https://fff-app.itstall.de/data.json", "data.json"); fileDownloader.execute(); @@ -110,7 +116,6 @@ public class MainActivity extends AppCompatActivity { public void loadFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - assert fragment != null; fragmentTransaction.replace(R.id.frameLayout, fragment); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); fragmentTransaction.commit(); @@ -119,13 +124,12 @@ public class MainActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - TabLayout.Tab selectedTab = tabLayout.getTabAt(sharedPreferences.getInt("selectedTab", 0)); - assert selectedTab != null; - selectedTab.select(); - } + int savedTab = sharedPreferences.getInt("selectedTab", 0); - @Override - protected void onPause() { - super.onPause(); + // reload Tab + if (savedTab == 0) tabLayout.getTabAt(1).select(); + else tabLayout.getTabAt(0).select(); + + tabLayout.getTabAt(savedTab).select(); } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/view/MapsFragment.java b/app/src/main/java/de/itstall/freifunkfranken/view/MapsFragment.java index 46508a17c96bd9e8f32760541ccc4dc2744972dc..cbe0edd4d78a903890d819dcaaf641a5940c9913 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/view/MapsFragment.java +++ b/app/src/main/java/de/itstall/freifunkfranken/view/MapsFragment.java @@ -1,16 +1,21 @@ package de.itstall.freifunkfranken.view; import android.Manifest; +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationManager; import android.os.Bundle; +import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.google.android.gms.maps.CameraUpdateFactory; @@ -20,11 +25,19 @@ import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; +import com.karumi.dexter.Dexter; +import com.karumi.dexter.PermissionToken; +import com.karumi.dexter.listener.PermissionDeniedResponse; +import com.karumi.dexter.listener.PermissionGrantedResponse; +import com.karumi.dexter.listener.PermissionRequest; +import com.karumi.dexter.listener.single.PermissionListener; import java.util.List; import java.util.Objects; import de.itstall.freifunkfranken.R; +import de.itstall.freifunkfranken.controller.CustomLocationListener; +import de.itstall.freifunkfranken.controller.CustomLocationListenerInterface; import de.itstall.freifunkfranken.controller.RequestAps; import de.itstall.freifunkfranken.model.AccessPoint; @@ -33,44 +46,68 @@ public class MapsFragment extends Fragment implements OnMapReadyCallback { private GoogleMap mMap; private View rootView; private SharedPreferences sharedPreferences; - //private MyLocationProvider mLocationProvider; - public static final int REQUEST_ID_ACCESS_FINE_LOCATION = 100; - public static final int REQUEST_ID_ACCESS_COARSE_LOCATION = 101; + private ProgressDialog progressDialog = null; + private LocationManager locationManager; + private CustomLocationListener customLocationListener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } + private CustomLocationListenerInterface locationListener = new CustomLocationListenerInterface() { + @Override + public void onLocationChanged(Location location) { + if (mMap != null) { + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom( + new LatLng(location.getLatitude(), location.getLongitude()), mMap.getCameraPosition().zoom) + ); + sharedPreferences.edit().putInt("mapZoom", (int) mMap.getCameraPosition().zoom).apply(); + } + } + + @Override + public void onProviderDisabled(String provider) { + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + startActivity(intent); + } + }; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.maps_fragment, container, false); + progressDialog = new ProgressDialog(rootView.getContext()); + progressDialog.setMessage(getResources().getString(R.string.mapLoading)); + progressDialog.show(); + SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment); if (mapFragment != null) mapFragment.getMapAsync(this); - sharedPreferences = rootView.getContext().getSharedPreferences("FreifunkFrankenApp", 0); + sharedPreferences = rootView.getContext().getSharedPreferences(getResources().getString(R.string.app_name), 0); - checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_ID_ACCESS_COARSE_LOCATION); - checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, REQUEST_ID_ACCESS_COARSE_LOCATION); + customLocationListener = new CustomLocationListener(locationListener); + locationManager = (LocationManager) rootView.getContext().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); + Dexter.withActivity((Activity) rootView.getContext()).withPermission(Manifest.permission.ACCESS_FINE_LOCATION).withListener(new PermissionListener() { + @Override + public void onPermissionGranted(PermissionGrantedResponse response) { + if (ActivityCompat.checkSelfPermission(rootView.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 25, customLocationListener); + } + } - return rootView; - } + @Override + public void onPermissionDenied(PermissionDeniedResponse response) { - @Override - public void onMapReady(GoogleMap googleMap) { - mMap = googleMap; + } - LatLng latLng = new LatLng(50.0544, 10.3128); - mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10)); - mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { @Override - public void onCameraIdle() { - LatLng latLng = mMap.getCameraPosition().target; - //Toast.makeText(rootView.getContext(), latLng.latitude + "+" + latLng.longitude, Toast.LENGTH_SHORT).show(); + public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { + token.continuePermissionRequest(); } - }); - showApsOnMap(); + }).check(); + + return rootView; } private void showApsOnMap() { @@ -85,66 +122,44 @@ public class MapsFragment extends Fragment implements OnMapReadyCallback { } } - public void checkPermission(String permission, int requestCode) { - // Checking if permission is not granted - if (ContextCompat.checkSelfPermission( - rootView.getContext(), - permission) == PackageManager.PERMISSION_DENIED) { - ActivityCompat.requestPermissions( - Objects.requireNonNull(getActivity()), - new String[]{permission}, - requestCode); - } else { - Toast.makeText( - rootView.getContext(), - "Permission already granted", - Toast.LENGTH_SHORT) - .show(); - } + @Override + public void onMapReady(GoogleMap googleMap) { + mMap = googleMap; + + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom( + new LatLng(50.0489, 10.2301), + sharedPreferences.getInt("mapZoom", 10))); + showApsOnMap(); + + if (progressDialog != null) progressDialog.dismiss(); } @Override - public void onRequestPermissionsResult(int requestCode, - String[] permissions, - int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - switch (requestCode) { - case REQUEST_ID_ACCESS_FINE_LOCATION: - // Checking whether user granted the permission or not. - if (grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // Showing the toast message - Toast.makeText( - getActivity(), - "Fine Location Permission Granted", - Toast.LENGTH_SHORT) - .show(); - } else { - Toast.makeText(getActivity(), - "Fine Location Permission Denied", - Toast.LENGTH_SHORT) - .show(); - } - break; - - case REQUEST_ID_ACCESS_COARSE_LOCATION: - // Checking whether user granted the permission or not. - if (grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // Showing the toast message - Toast.makeText( - getActivity(), - "Coarse Location Permission Granted", - Toast.LENGTH_SHORT) - .show(); - } else { - Toast.makeText(getActivity(), - "Coarse Location Permission Denied", - Toast.LENGTH_SHORT) - .show(); + public void onPause() { + locationManager.removeUpdates(customLocationListener); + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + Dexter.withActivity((Activity) rootView.getContext()).withPermission(Manifest.permission.ACCESS_FINE_LOCATION).withListener(new PermissionListener() { + @Override + public void onPermissionGranted(PermissionGrantedResponse response) { + if (ActivityCompat.checkSelfPermission(rootView.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 25, customLocationListener); } - break; - } + } + + @Override + public void onPermissionDenied(PermissionDeniedResponse response) { + + } + + @Override + public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { + token.continuePermissionRequest(); + } + }).check(); } } diff --git a/app/src/main/java/de/itstall/freifunkfranken/view/NextApFragment.java b/app/src/main/java/de/itstall/freifunkfranken/view/NextApFragment.java index f1ec34dcab27d25130f06ec96e133704a02ec18d..dea4f5a16797f4ca78a87076acb6e71c4a36cc78 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/view/NextApFragment.java +++ b/app/src/main/java/de/itstall/freifunkfranken/view/NextApFragment.java @@ -1,17 +1,31 @@ package de.itstall.freifunkfranken.view; +import android.Manifest; +import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.karumi.dexter.Dexter; +import com.karumi.dexter.PermissionToken; +import com.karumi.dexter.listener.PermissionDeniedResponse; +import com.karumi.dexter.listener.PermissionGrantedResponse; +import com.karumi.dexter.listener.PermissionRequest; +import com.karumi.dexter.listener.single.PermissionListener; + import java.util.List; import java.util.Objects; @@ -25,6 +39,8 @@ public class NextApFragment extends Fragment { private View rootView; private TextView tvTemp; private SharedPreferences sharedPreferences; + public static Location location; + private LocationManager locationManager; @Override public void onCreate(Bundle savedInstanceState) { @@ -35,12 +51,32 @@ public class NextApFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.nextap_fragment, container, false); - sharedPreferences = rootView.getContext().getSharedPreferences("FreifunkFrankenApp", 0); + sharedPreferences = rootView.getContext().getSharedPreferences(getResources().getString(R.string.app_name), 0); rvAps = rootView.findViewById(R.id.rvAps); rvAps.setLayoutManager(new LinearLayoutManager(getActivity())); tvTemp = rootView.findViewById(R.id.tvTemp); + locationManager = (LocationManager) rootView.getContext().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); + Dexter.withActivity((Activity) rootView.getContext()).withPermission(Manifest.permission.ACCESS_FINE_LOCATION).withListener(new PermissionListener() { + @Override + public void onPermissionGranted(PermissionGrantedResponse response) { + if (ActivityCompat.checkSelfPermission(rootView.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + } + } + + @Override + public void onPermissionDenied(PermissionDeniedResponse response) { + + } + + @Override + public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { + token.continuePermissionRequest(); + } + }).check(); + List<AccessPoint> accessPointList = new RequestAps(Objects.requireNonNull(this.getContext())).getSortedList(sharedPreferences.getBoolean("OfflineRouter", false), sharedPreferences.getInt("RouterCount", 10)); showApList(accessPointList); diff --git a/app/src/main/java/de/itstall/freifunkfranken/view/SettingsActivity.java b/app/src/main/java/de/itstall/freifunkfranken/view/SettingsActivity.java index f95227a16dc79ac9a29db8dad6418bde13f1967f..fff0f640a91dcdb3862ffd3697bf3200efb296f1 100644 --- a/app/src/main/java/de/itstall/freifunkfranken/view/SettingsActivity.java +++ b/app/src/main/java/de/itstall/freifunkfranken/view/SettingsActivity.java @@ -23,7 +23,7 @@ public class SettingsActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); - sharedPreferences = getApplicationContext().getSharedPreferences("FreifunkFrankenApp", 0); + sharedPreferences = getApplicationContext().getSharedPreferences(getResources().getString(R.string.app_name), 0); settingsSwOfflineRouter = findViewById(R.id.settingsSwOfflineRouter); settingsSwMapOfflineRouter = findViewById(R.id.settingsSwMapOfflineRouter); settingsTxtRouterCount = findViewById(R.id.settingsTxtRouterCount); diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d11462a4b96669193de13a711a3a36220a0..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="85.84757" - android:endY="92.4963" - android:startX="42.9492" - android:startY="49.59793" - android:type="linear"> - <item - android:color="#44000000" - android:offset="0.0" /> - <item - android:color="#00000000" - android:offset="1.0" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> -</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cbf141911847041df5d7b87f0dd5ef9d4..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path - android:fillColor="#3DDC84" - android:pathData="M0,0h108v108h-108z" /> - <path - android:fillColor="#00000000" - android:pathData="M9,0L9,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,0L19,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,0L29,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,0L39,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,0L49,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,0L59,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,0L69,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,0L79,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M89,0L89,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M99,0L99,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,9L108,9" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,19L108,19" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,29L108,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,39L108,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,49L108,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,59L108,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,69L108,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,79L108,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,89L108,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,99L108,99" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,29L89,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,39L89,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,49L89,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,59L89,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,69L89,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,79L89,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,19L29,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,19L39,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,19L49,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,19L59,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,19L69,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,19L79,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> -</vector> diff --git a/app/src/main/res/drawable/news_border.xml b/app/src/main/res/drawable/news_border.xml index 4f574aa7d0e389bca4e3f94f8c4487c68f87ace9..209ba5cdf4fdc40b763f2854224e8e4d518d0677 100644 --- a/app/src/main/res/drawable/news_border.xml +++ b/app/src/main/res/drawable/news_border.xml @@ -5,5 +5,7 @@ android:width="1dp" android:color="@color/freifunk_blau" /> + <solid android:color="@color/cardview_light_background" /> + <corners android:radius="3dp" /> </shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 851d375ab37e77e880b28c575324cc733b33c671..2c0e7bfae1e728fb334018abf34863050ee6c2a5 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -62,6 +62,7 @@ android:inputType="number" android:textSize="12sp" app:layout_constraintStart_toEndOf="@+id/textView8" + android:importantForAutofill="no" app:layout_constraintTop_toTopOf="parent" /> <TextView diff --git a/app/src/main/res/layout/news_item.xml b/app/src/main/res/layout/news_item.xml index f8d62ae9e14c79fd7e3d85ddba0d953ad52b472a..2209785aa98fbd1afd7071a4ad78544c3ba37be2 100644 --- a/app/src/main/res/layout/news_item.xml +++ b/app/src/main/res/layout/news_item.xml @@ -26,7 +26,7 @@ android:orientation="horizontal"> <TextView - android:id="@+id/tvNewsTitle" + android:id="@+id/newsTvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="4" @@ -34,7 +34,7 @@ android:textColor="@android:color/primary_text_light" /> <TextView - android:id="@+id/tvNewsDate" + android:id="@+id/newsTvDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" @@ -43,12 +43,13 @@ </LinearLayout> <TextView - android:id="@+id/tvNewsDescription" + android:id="@+id/newsTvDescription" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_marginTop="3dp" android:layout_marginRight="3dp" + android:layout_marginBottom="3dp" android:text="@string/newsTvDescription" /> </LinearLayout> diff --git a/app/src/main/res/layout/nextap_item.xml b/app/src/main/res/layout/nextap_item.xml index 377d71fa855de7d2fee3a87d50bd057069beef17..cb81b1e046b8fc03cef178ec92a602fd686662ab 100644 --- a/app/src/main/res/layout/nextap_item.xml +++ b/app/src/main/res/layout/nextap_item.xml @@ -5,7 +5,7 @@ android:layout_height="wrap_content" android:orientation="vertical"> - <androidx.constraintlayout.widget.ConstraintLayout + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" @@ -13,26 +13,22 @@ android:layout_weight="1"> <TextView - android:id="@+id/tvNewsTitle" + android:id="@+id/nextApSsid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="5dp" - android:text="@string/tabSsids" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/tvNewsDate" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_weight="4" + android:text="@string/tabSsids" /> <TextView - android:id="@+id/tvNewsDate" + android:id="@+id/nextApDistance" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> + android:layout_weight="1" + android:textAlignment="viewEnd" /> + </LinearLayout> - <androidx.constraintlayout.widget.ConstraintLayout + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" @@ -41,23 +37,21 @@ android:layout_weight="1"> <TextView - android:id="@+id/textView" + android:id="@+id/nextApTvStatusLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/tvStatusName" + android:text="@string/nextApTvStatusLabel" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/tvStatus" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView - android:id="@+id/tvStatus" + android:id="@+id/nextApTvStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@+id/textView" app:layout_constraintTop_toTopOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> + </LinearLayout> </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/ssids_item.xml b/app/src/main/res/layout/ssids_item.xml index 713d38d37ef3d290d72c199c1bd4ad5bd24c9e12..4f70811a95b442f63ced074876d55fd0d9f4b607 100644 --- a/app/src/main/res/layout/ssids_item.xml +++ b/app/src/main/res/layout/ssids_item.xml @@ -4,7 +4,7 @@ android:layout_height="wrap_content"> <TextView - android:id="@+id/tvNewsTitle" + android:id="@+id/nextApSsid" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="5dp" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f63bb466a728e66f36a0223bea787363b122d687..a4ee4f38cd2943cead3ad50ab44987cf70761ba4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="colorPrimary">#6200EE</color> <color name="colorPrimaryDark">#3700B3</color> <color name="colorAccent">#03DAC5</color> <color name="freifunk_magenta">#FFdc0067</color> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 59a0b0c4f553276e4bbeb064bd1bd81220ae9115..7abc06d3bafbd0234b67eade8816bcf6263fe439 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,3 +1 @@ -<resources> - <dimen name="fab_margin">16dp</dimen> -</resources> +<resources></resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0ad826a9d21b4d5a5deb5b19c2af951073f35fbc..cc7ead0f17f54f2b0ceb037b3c6f059e718264bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,14 +5,13 @@ <string name="tabKarte">Karte</string> <string name="tabNews">News</string> <string name="btnSsidAdd">Hinzufügen</string> - <string name="tvStatusName">Status:</string> + <string name="nextApTvStatusLabel">Status:</string> <string name="statusOnline">Online</string> <string name="statusOffline">Offline</string> <string name="menuItemSettings">Einstellungen</string> <string name="menuItemAbout">Info</string> <!-- TODO: Remove or change this placeholder text --> - <string name="title_activity_settings">SettingsActivity</string> <!-- Strings used for fragments for navigation --> <string name="btnClose">Schließen</string> @@ -33,8 +32,10 @@ </ul> </string> <string name="aboutTvTitle">Über die Freifunk Franken App</string> - <string name="popupWritePermissionFragmentTitle">Zugriff benötigt</string> <string name="newsTvDescription">Meine lange Beschreibung</string> <string name="newsTvTitle">Mein Titel</string> <string name="newsTvDate">01.01.2020</string> + <string name="newsArticleRead">Beitrag lesen</string> + <string name="mapLoading">Lade Karte…</string> + <string name="locationNoGps">GPS nicht aktiviert</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c9659af3cbaa1d756043f915ca68261e42e33bee..dfc7f832e7a6e66164777d728b377c565b3c5385 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -9,13 +9,4 @@ <item name="colorAccent">@color/colorAccent</item> </style> - <style name="AppTheme.NoActionBar"> - <item name="windowActionBar">false</item> - <item name="windowNoTitle">true</item> - </style> - - <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> - - <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> - </resources> diff --git a/build.gradle b/build.gradle index 1e5e8e68abd71ea1f41957c4a9ba398e1558ccb8..fd361ea7a37a1b636b82ffd95b4a971eee51770b 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.5.2' // NOTE: Do not place your application dependencies here; they belong