From 7c6d1dbb9de50dac8d95cf98287b2c2bd22a435c Mon Sep 17 00:00:00 2001
From: "de@itstall.de" <de@itstall.de>
Date: Wed, 1 Apr 2020 22:36:45 +0200
Subject: [PATCH] Beta Release

---
 app/build.gradle                              |   1 +
 .../controller/CustomLocationListener.java    |  34 ++++
 .../CustomLocationListenerInterface.java      |  25 +++
 .../controller/FileDownloader.java            |   2 +-
 .../controller/LocationListenerInterface.java |  13 ++
 .../controller/NewsAdapter.java               |  13 +-
 .../controller/NextApAdapter.java             |  19 +-
 .../controller/RequestAps.java                |  33 +++-
 .../controller/RequestNews.java               |   3 +-
 .../controller/SsidsAdapter.java              |   2 +-
 .../freifunkfranken/model/AccessPoint.java    |   4 +-
 .../itstall/freifunkfranken/model/News.java   |   8 +-
 .../freifunkfranken/view/MainActivity.java    |  54 +++---
 .../freifunkfranken/view/MapsFragment.java    | 171 ++++++++++--------
 .../freifunkfranken/view/NextApFragment.java  |  38 +++-
 .../view/SettingsActivity.java                |   2 +-
 .../drawable-v24/ic_launcher_foreground.xml   |  30 ---
 .../res/drawable/ic_launcher_background.xml   | 170 -----------------
 app/src/main/res/drawable/news_border.xml     |   2 +
 app/src/main/res/layout/activity_settings.xml |   1 +
 app/src/main/res/layout/news_item.xml         |   7 +-
 app/src/main/res/layout/nextap_item.xml       |  32 ++--
 app/src/main/res/layout/ssids_item.xml        |   2 +-
 app/src/main/res/values/colors.xml            |   1 -
 app/src/main/res/values/dimens.xml            |   4 +-
 app/src/main/res/values/strings.xml           |   7 +-
 app/src/main/res/values/styles.xml            |   9 -
 build.gradle                                  |   2 +-
 28 files changed, 315 insertions(+), 374 deletions(-)
 create mode 100644 app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListener.java
 create mode 100644 app/src/main/java/de/itstall/freifunkfranken/controller/CustomLocationListenerInterface.java
 create mode 100644 app/src/main/java/de/itstall/freifunkfranken/controller/LocationListenerInterface.java
 delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml
 delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml

diff --git a/app/build.gradle b/app/build.gradle
index f5ca286..1289e07 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 0000000..47d4647
--- /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 0000000..2e5e052
--- /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 10984fc..1b1938f 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 0000000..dca5c73
--- /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 11ceb0f..8dac88c 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 f31b474..0cb280d 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 c06f683..f2eeeb4 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 4ac43ab..cb7428b 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 f921e02..9e57bd4 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 1ff9d67..8417ecd 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 18ac0b3..5b89dc7 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 2f374f9..89c805c 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 46508a1..cbe0edd 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 f1ec34d..dea4f5a 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 f95227a..fff0f64 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 2b068d1..0000000
--- 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 07d5da9..0000000
--- 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 4f574aa..209ba5c 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 851d375..2c0e7bf 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 f8d62ae..2209785 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 377d71f..cb81b1e 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 713d38d..4f70811 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 f63bb46..a4ee4f3 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 59a0b0c..7abc06d 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 0ad826a..cc7ead0 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 @@
         &lt;/ul&gt;
     </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 c9659af..dfc7f83 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 1e5e8e6..fd361ea 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
-- 
GitLab