From 3427cea5385b09103b2f25e2bc52ebb3f89b304a Mon Sep 17 00:00:00 2001 From: Maksymilian Jopek Date: Wed, 28 Sep 2022 22:56:02 +0200 Subject: v0.9.0 - all / {no_error_msg, no_loading_msg} --- .../java/com/jopek/kanakaeiwa/FirstFragment.java | 132 +++++++++++++++++---- .../java/com/jopek/kanakaeiwa/MainActivity.java | 6 +- .../main/java/com/jopek/kanakaeiwa/Requests.java | 2 + .../java/com/jopek/kanakaeiwa/SecondFragment.java | 75 ++++++++++++ .../res/drawable/ic_baseline_arrow_back_24.xml | 5 + .../res/drawable/ic_baseline_location_city_24.xml | 5 + .../main/res/drawable/ic_baseline_search_24.xml | 5 + app/src/main/res/layout/fragment_first.xml | 37 +++++- app/src/main/res/layout/fragment_second.xml | 118 +++++++++++++----- app/src/main/res/menu/menu_main.xml | 10 +- 10 files changed, 330 insertions(+), 65 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_arrow_back_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_location_city_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_search_24.xml (limited to 'app') diff --git a/app/src/main/java/com/jopek/kanakaeiwa/FirstFragment.java b/app/src/main/java/com/jopek/kanakaeiwa/FirstFragment.java index bef3a9a..b0e7699 100644 --- a/app/src/main/java/com/jopek/kanakaeiwa/FirstFragment.java +++ b/app/src/main/java/com/jopek/kanakaeiwa/FirstFragment.java @@ -4,6 +4,8 @@ import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; +import android.location.Address; +import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -20,26 +22,32 @@ import androidx.navigation.fragment.NavHostFragment; import com.jopek.kanakaeiwa.databinding.FragmentFirstBinding; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; +import java.util.List; +import java.util.Locale; + public class FirstFragment extends Fragment { + private final String[] providers = new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}; + private final long MIN_TIME_LOC = 60_000; + private final float MIN_M_LOC = 1000; + String chosenProvider = ""; private FragmentFirstBinding binding; private boolean locationSet = false; private double lon; private double lat; + private String cityName = null; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { - binding = FragmentFirstBinding.inflate(inflater, container, false); return binding.getRoot(); - } public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { @@ -55,16 +63,13 @@ public class FirstFragment extends Fragment { binding.buttonFirst.setOnClickListener(view1 -> { NavHostFragment.findNavController(FirstFragment.this) .navigate(R.id.action_FirstFragment_to_SecondFragment); - getLocation(); }); } public void getWeather() { - Requests requests = new Requests(); String url = "https://api.openweathermap.org/data/2.5/weather?appid=d7eea7960e9b5024b8441fb6f9344ce4&units=metric&lat=" + lat + "&lon=" + lon; - Log.d(MainActivity.TAG, "getWeather: " + url); + Requests requests = new Requests(); requests.get(url, res -> { - Log.d(MainActivity.TAG, "getWeather: " + res); try { JSONObject data = new JSONObject(res); JSONObject weather = data.getJSONArray("weather").getJSONObject(0); @@ -72,49 +77,130 @@ public class FirstFragment extends Fragment { JSONObject wind = data.getJSONObject("wind"); JSONObject sys = data.getJSONObject("sys"); requests.setRemoteSrc(binding.weatherImg, "https://openweathermap.org/img/w/" + weather.getString("icon") + ".png"); - binding.cityName.setText(data.getString("name") + ", " + sys.getString("country")); - binding.temp.setText(main.getString("temp")); + if (cityName != null) + binding.cityName.setText(cityName + ", " + sys.getString("country")); + else + binding.cityName.setText(data.getString("name") + ", " + sys.getString("country")); + binding.temp.setText(main.getString("temp") + "°C"); binding.weatherText.setText(weather.getString("description")); - binding.humidity.setText(main.getString("humidity") + " %"); - binding.maxTemp.setText(main.getString("temp_max") + " °C"); - binding.minTemp.setText(main.getString("temp_min") + " °C"); + binding.humidity.setText(main.getString("humidity") + "%"); + binding.maxTemp.setText(main.getString("temp_max") + "°C"); + binding.minTemp.setText(main.getString("temp_min") + "°C"); binding.pressure.setText(main.getString("pressure") + " hPa"); binding.windSpeed.setText(wind.getString("speed") + " m/s"); } catch (Exception e) { + showLocationError(); e.printStackTrace(); } }); } + public void onLocationChanged(@NonNull Location location) { + Log.d(MainActivity.TAG, "FirstFragment.LocationChanged"); + lon = location.getLongitude(); + lat = location.getLatitude(); + + if (cityName == null) { + Geocoder gcd = new Geocoder(requireActivity(), Locale.getDefault()); + List
addresses; + try { + addresses = gcd.getFromLocation(lat, lon, 1); + if (addresses.size() > 0) { + cityName = addresses.get(0).getLocality(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + getWeather(); + } + @SuppressLint("MissingPermission") public void getLocation() { + LocationManager locationManager = (LocationManager) requireActivity().getSystemService(Context.LOCATION_SERVICE); + long youngestTime = 0; + Location youngest = null; + + for (String provider : providers) { + Location loc = locationManager.getLastKnownLocation(provider); + if (loc == null) continue; + long curTime = loc.getTime(); + if (curTime > youngestTime) + youngest = loc; + } + + if (youngest == null) { + getBestLocation(); + } else { + onLocationChanged(youngest); + getBestLocation(); + } + } + + @SuppressLint("MissingPermission") + public void getBestLocation() { LocationManager locationManager = (LocationManager) requireActivity().getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(@NonNull Location location) { - System.out.println("DEBUG 1"); - lon = location.getLongitude(); - lat = location.getLatitude(); - locationSet = true; - getWeather(); + Log.d(MainActivity.TAG, "onLocationChanged: " + chosenProvider + ", " + location.getAccuracy()); + FirstFragment.this.onLocationChanged(location); } @Override public void onProviderEnabled(@NonNull String provider) { - System.out.println("DEBUG 2"); + Log.d(MainActivity.TAG, "onProviderEnabled: "); } @Override public void onProviderDisabled(@NonNull String provider) { - System.out.println("DEBUG 3"); + Log.d(MainActivity.TAG, "onProviderDisabled: "); + if (!locationSet) + showLocationError(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { - System.out.println("DEBUG 4"); + Log.d(MainActivity.TAG, "onStatusChanged: "); } }; - locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 50, locationListener); + + boolean providerSet = false; + for (String provider : providers) { + if (locationManager.isProviderEnabled(provider)) { + locationManager.requestLocationUpdates(provider, MIN_TIME_LOC, MIN_M_LOC, locationListener); + chosenProvider = provider; + providerSet = true; + break; + } + } + Log.d(MainActivity.TAG, "getBestLocation: " + chosenProvider); + if (!providerSet) { + Log.d(MainActivity.TAG, "getBestLocation: getting locationByIp"); + chosenProvider = "IP"; + Requests requests = new Requests(); +// requests.get("https://ipapi.co/json", res -> { + requests.get("https://ipwho.is/", res -> { + Log.d(MainActivity.TAG, "IP Location found: "); + try { + Log.d(MainActivity.TAG, "getBestLocation: " + res); + JSONObject data = new JSONObject(res); + lon = data.getDouble("longitude"); + lat = data.getDouble("latitude"); + cityName = data.getString("city"); + locationSet = true; + getWeather(); + } catch (JSONException e) { + e.printStackTrace(); + showLocationError(); + } + }); + } + } + + public void showLocationError() { + } @Override @@ -126,8 +212,8 @@ public class FirstFragment extends Fragment { grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(MainActivity.TAG, "onRequestPermissionsResult: success"); getLocation(); - } - Log.d(MainActivity.TAG, "onRequestPermissionsResult: fail"); + } else + Log.d(MainActivity.TAG, "onRequestPermissionsResult: fail"); return; } // Other 'case' lines to check for other diff --git a/app/src/main/java/com/jopek/kanakaeiwa/MainActivity.java b/app/src/main/java/com/jopek/kanakaeiwa/MainActivity.java index 4b0193b..92c84df 100644 --- a/app/src/main/java/com/jopek/kanakaeiwa/MainActivity.java +++ b/app/src/main/java/com/jopek/kanakaeiwa/MainActivity.java @@ -49,9 +49,9 @@ public class MainActivity extends AppCompatActivity { int id = item.getItemId(); //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } +// if (id == R.id.action_settings) { +// return true; +// } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/com/jopek/kanakaeiwa/Requests.java b/app/src/main/java/com/jopek/kanakaeiwa/Requests.java index 506182b..5a7a6c5 100644 --- a/app/src/main/java/com/jopek/kanakaeiwa/Requests.java +++ b/app/src/main/java/com/jopek/kanakaeiwa/Requests.java @@ -59,6 +59,7 @@ public class Requests extends AsyncTask { connection.setConnectTimeout(5000); connection.setReadTimeout(5000); connection.connect(); + Log.d(MainActivity.TAG, "doInBackground: " + connection.getResponseCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); String content = "", line; while ((line = rd.readLine()) != null) { @@ -66,6 +67,7 @@ public class Requests extends AsyncTask { } return content; } catch (IOException exception) { + exception.printStackTrace(); return "ERROR"; } } diff --git a/app/src/main/java/com/jopek/kanakaeiwa/SecondFragment.java b/app/src/main/java/com/jopek/kanakaeiwa/SecondFragment.java index 7164eec..398e828 100644 --- a/app/src/main/java/com/jopek/kanakaeiwa/SecondFragment.java +++ b/app/src/main/java/com/jopek/kanakaeiwa/SecondFragment.java @@ -1,19 +1,35 @@ package com.jopek.kanakaeiwa; +import android.Manifest; +import android.content.pm.PackageManager; +import android.location.LocationManager; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.navigation.fragment.NavHostFragment; import com.jopek.kanakaeiwa.databinding.FragmentSecondBinding; +import org.json.JSONObject; + public class SecondFragment extends Fragment { + private final String[] providers = new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}; + private final long MIN_TIME_LOC = 60_000; + private final float MIN_M_LOC = 1000; + String chosenProvider = ""; private FragmentSecondBinding binding; + private boolean locationSet = false; + private double lon; + private double lat; + private String cityName = null; + @Override public View onCreateView( @@ -28,6 +44,65 @@ public class SecondFragment extends Fragment { public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + if (requireActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); + } + + binding.buttonFirst.setOnClickListener(view1 -> NavHostFragment.findNavController(SecondFragment.this) + .navigate(R.id.action_SecondFragment_to_FirstFragment)); + binding.cityBtn.setOnClickListener(view1 -> { + getWeather(String.valueOf(binding.editText.getText())); + }); + } + + public void getWeather(String cityName) { + String url = "https://api.openweathermap.org/data/2.5/weather?appid=d7eea7960e9b5024b8441fb6f9344ce4&units=metric&q=" + cityName; + Requests requests = new Requests(); + requests.get(url, res -> { + try { + JSONObject data = new JSONObject(res); + JSONObject weather = data.getJSONArray("weather").getJSONObject(0); + JSONObject main = data.getJSONObject("main"); + JSONObject wind = data.getJSONObject("wind"); + JSONObject sys = data.getJSONObject("sys"); + requests.setRemoteSrc(binding.weatherImg, "https://openweathermap.org/img/w/" + weather.getString("icon") + ".png"); + if (cityName != null) + binding.cityName.setText(cityName + ", " + sys.getString("country")); + else + binding.cityName.setText(data.getString("name") + ", " + sys.getString("country")); + binding.temp.setText(main.getString("temp") + "°C"); + binding.weatherText.setText(weather.getString("description")); + binding.humidity.setText(main.getString("humidity") + "%"); + binding.maxTemp.setText(main.getString("temp_max") + "°C"); + binding.minTemp.setText(main.getString("temp_min") + "°C"); + binding.pressure.setText(main.getString("pressure") + " hPa"); + binding.windSpeed.setText(wind.getString("speed") + " m/s"); + } catch (Exception e) { + showLocationError(); + e.printStackTrace(); + } + }); + } + + public void showLocationError() { + + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + switch (requestCode) { + case 1: + if (grantResults.length > 0 && + grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.d(MainActivity.TAG, "onRequestPermissionsResult: success"); + } else + Log.d(MainActivity.TAG, "onRequestPermissionsResult: fail"); + return; + } + // Other 'case' lines to check for other + // permissions this app might request. } @Override diff --git a/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml new file mode 100644 index 0000000..8452791 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_location_city_24.xml b/app/src/main/res/drawable/ic_baseline_location_city_24.xml new file mode 100644 index 0000000..7324708 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_location_city_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_search_24.xml b/app/src/main/res/drawable/ic_baseline_search_24.xml new file mode 100644 index 0000000..a5687c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_search_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_first.xml b/app/src/main/res/layout/fragment_first.xml index d876bf5..a1a66d5 100644 --- a/app/src/main/res/layout/fragment_first.xml +++ b/app/src/main/res/layout/fragment_first.xml @@ -9,6 +9,7 @@ + android:textSize="27sp" /> @@ -64,6 +70,8 @@ android:layout_height="wrap_content" android:padding="5dp" android:text="Details:" + android:textColor="@color/white" + android:textFontWeight="600" android:textSize="25sp" /> diff --git a/app/src/main/res/layout/fragment_second.xml b/app/src/main/res/layout/fragment_second.xml index 0acfa7f..b3a38aa 100644 --- a/app/src/main/res/layout/fragment_second.xml +++ b/app/src/main/res/layout/fragment_second.xml @@ -9,43 +9,71 @@ - - - - + + + + + + + android:layout_weight="6" + app:iconTint="@color/teal_200" + app:iconSize="35sp" + app:icon="@drawable/ic_baseline_search_24" + android:background="#00000000" + android:id="@+id/city_btn" + android:layout_height="match_parent" /> + - + android:textColor="@color/white" + android:textFontWeight="600" + android:textSize="27sp" /> + android:layout_weight="4"> @@ -80,65 +111,92 @@ android:layout_height="wrap_content" android:padding="5dp" android:text="Details:" + android:layout_weight="0" + android:textColor="@color/white" + android:textFontWeight="600" android:textSize="25sp" /> + + + @@ -151,5 +209,5 @@ android:text="@string/next" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:srcCompat="@drawable/ic_baseline_arrow_forward_24" /> + app:srcCompat="@drawable/ic_baseline_arrow_back_24" /> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 4cb5ffb..752543a 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -2,9 +2,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.jopek.kanakaeiwa.MainActivity"> - + + + + + \ No newline at end of file -- cgit v1.3.1