From 71af6d7d49b51fb11467e9b3894aec32b7db1229 Mon Sep 17 00:00:00 2001 From: ottoptj Date: Sun, 4 Aug 2024 22:41:58 +0300 Subject: [PATCH] Added weather conditions, fixed the thread for finding locations and added options to disable weather and battery indicators. --- .../eu/ottop/yamlauncher/BatteryReceiver.kt | 2 +- .../eu/ottop/yamlauncher/LocationFragment.kt | 12 +- .../java/eu/ottop/yamlauncher/MainActivity.kt | 63 ++- .../eu/ottop/yamlauncher/WeatherSystem.kt | 36 +- app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/layout/activity_settings.xml | 444 +----------------- app/src/main/res/values/arrays.xml | 2 + app/src/main/res/xml/root_preferences.xml | 21 + 8 files changed, 121 insertions(+), 460 deletions(-) diff --git a/app/src/main/java/eu/ottop/yamlauncher/BatteryReceiver.kt b/app/src/main/java/eu/ottop/yamlauncher/BatteryReceiver.kt index 0658202..dc46d81 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/BatteryReceiver.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/BatteryReceiver.kt @@ -14,7 +14,7 @@ class BatteryReceiver(private val activity: MainActivity) : BroadcastReceiver() val level = it.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) val scale = it.getIntExtra(BatteryManager.EXTRA_SCALE, -1) val batteryPct = level * 100 / scale.toFloat() - activity.modifyDate("${batteryPct.toInt()}%", 2) + activity.modifyDate("${batteryPct.toInt()}%", 3) } } diff --git a/app/src/main/java/eu/ottop/yamlauncher/LocationFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/LocationFragment.kt index 160b129..71886b5 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/LocationFragment.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/LocationFragment.kt @@ -35,9 +35,15 @@ class LocationFragment : Fragment(), LocationListAdapter.OnItemClickListener { val searchView = view.findViewById(R.id.locationSearch) - adapter = LocationListAdapter(requireContext(), weatherSystem.getSearchedLocations( - searchView.text.toString() - ), this) + var locationList = mutableListOf>() + + CoroutineScope(Dispatchers.IO).launch { + locationList = weatherSystem.getSearchedLocations( + searchView.text.toString() + ) + } + + adapter = LocationListAdapter(requireContext(), locationList, this) val recyclerView = view.findViewById(R.id.locationrecycler) val appMenuEdgeFactory = AppMenuEdgeFactory(requireActivity()) diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index 16afbbd..3f673f9 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -71,7 +71,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private var weatherJob: Job? = null val cameraIntent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE) val phoneIntent = Intent(Intent.ACTION_DIAL) - private lateinit var batteryReceiver: BatteryReceiver + private var batteryReceiver: BatteryReceiver? = null private var appActionMenu = AppActionMenu() private val sharedPreferenceManager = SharedPreferenceManager() @@ -98,6 +98,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private val uiUtils = UIUtils() + private var isBatteryReceiverRegistered = false + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -150,7 +152,11 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setAllColors(binding.homeView, Color.parseColor(preferences.getString("textColor", "#FFF3F3F3"))) - batteryReceiver = BatteryReceiver.register(this, this@MainActivity) + registerBatteryReceiver() + + if (!preferences.getBoolean("battery_enabled", false)) { + unregisterBatteryReceiver() + } binding.homeView.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) @@ -176,9 +182,15 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh weatherJob?.cancel() weatherJob = CoroutineScope(Dispatchers.IO).launch { while (true) { + if (preferences.getBoolean("gps_location", false)) { + withContext(Dispatchers.Main) { + weatherSystem.setGpsLocation(this@MainActivity) + } + } + val currentWeather = weatherSystem.getTemp(this@MainActivity) withContext(Dispatchers.Main) { - modifyDate(currentWeather, 3) + modifyDate(currentWeather, 2) } delay(300000) } @@ -228,6 +240,40 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setAllColors(binding.homeView, Color.parseColor(preferences?.getString(key, "#FFF3F3F3"))) setSearchColors() } + + "weather_enabled" -> { + if (preferences?.getBoolean(key, false) == true) { + startWeatherMonitor() + } + else { + weatherJob?.cancel() + modifyDate("", 2) + } + } + + "battery_enabled" -> { + if (preferences?.getBoolean(key, false) == true) { + registerBatteryReceiver() + } + else { + unregisterBatteryReceiver() + modifyDate("", 3) + } + } + } + } + + private fun registerBatteryReceiver() { + if (!isBatteryReceiverRegistered) { + batteryReceiver = BatteryReceiver.register(this, this@MainActivity) + isBatteryReceiverRegistered = true + } + } + + private fun unregisterBatteryReceiver() { + if (isBatteryReceiverRegistered) { + unregisterReceiver(batteryReceiver) + isBatteryReceiverRegistered = false } } @@ -238,7 +284,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh // Your code here searchView.setTextColor(Color.parseColor(preferences.getString("textColor", "#FFF3F3F3"))) searchView.setHintTextColor(uiUtils.setAlpha(Color.parseColor(preferences.getString("textColor", "#FFF3F3F3")), "A9")) - searchView.compoundDrawables[0].colorFilter = + searchView.compoundDrawables[0].mutate().colorFilter = BlendModeColorFilter(Color.parseColor(preferences.getString("textColor", "#FFF3F3F3")), BlendMode.SRC_ATOP) // Remove the listener @@ -261,19 +307,22 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh override fun onStop() { super.onStop() job?.cancel() + weatherJob?.cancel() } override fun onDestroy() { super.onDestroy() job?.cancel() - unregisterReceiver(batteryReceiver) + unregisterBatteryReceiver() preferences.unregisterOnSharedPreferenceChangeListener(this) } override fun onStart() { super.onStart() startTask() - startWeatherMonitor() + if (preferences.getBoolean("weather_enabled", false)) { + startWeatherMonitor() + } // Keyboard is sometimes open when going back to the app, so close it. closeKeyboard() @@ -734,7 +783,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh shortcuts.children.forEach { if (it is TextView) { - when (preferences?.getString("shortcutSize", "medium")) { + when (preferences.getString("shortcutSize", "medium")) { "small" -> { it.setPadding( it.paddingLeft, diff --git a/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt b/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt index e30513b..e560a95 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/WeatherSystem.kt @@ -30,6 +30,10 @@ class WeatherSystem { println("Location obtained") locationManager.removeUpdates(this) } + + override fun onFlushComplete(requestCode: Int) { + super.onFlushComplete(requestCode) + } } if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { @@ -42,19 +46,16 @@ class WeatherSystem { } - locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, locationListener) + locationManager.requestLocationUpdates(LocationManager.FUSED_PROVIDER, 0, 0f, locationListener) - val currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) + val currentLocation = locationManager.getLastKnownLocation(LocationManager.FUSED_PROVIDER) if (currentLocation != null) { sharedPreferenceManager.setWeatherLocation(activity, "latitude=${currentLocation.latitude}&longitude=${currentLocation.longitude}", sharedPreferenceManager.getWeatherRegion(activity)) } - else { - Toast.makeText(activity, "Unable to get location", Toast.LENGTH_SHORT).show() - } } @@ -100,7 +101,7 @@ class WeatherSystem { val location = sharedPreferenceManager.getWeatherLocation(context) if (location != null) { if (location.isNotEmpty()) { - val url = URL("https://api.open-meteo.com/v1/forecast?$location&temperature_unit=${tempUnits}¤t=temperature_2m") + val url = URL("https://api.open-meteo.com/v1/forecast?$location&temperature_unit=${tempUnits}¤t=temperature_2m,weather_code") with(url.openConnection() as HttpURLConnection) { requestMethod = "GET" @@ -111,7 +112,28 @@ class WeatherSystem { val currentData = jsonObject.getJSONObject("current") - currentWeather = currentData.getInt("temperature_2m").toString() + var weatherType = "" + + when (currentData.getInt("weather_code")) { + 0, 1 -> { + weatherType = "☀\uFE0E" + } + 2, 3, 45, 48 -> { + weatherType = "☁\uFE0E" + } + 51, 53, 55, 56, 57, 61, 63, 65, 67, 80, 81, 82 -> { + weatherType = "☂\uFE0E" + } + 71, 73, 75, 77, 85, 86 -> { + weatherType = "❄\uFE0E" + } + 95, 96, 99 -> { + weatherType = "⛈\uFE0E" + } + + } + + currentWeather = "$weatherType ${currentData.getInt("temperature_2m").toString()}" } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e6220fe..ba0acd9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -112,6 +112,7 @@ android:fontFamily="@null" android:format12Hour="dd MMM yyyy" android:format24Hour="dd MMM yyyy" + android:lineSpacingExtra="8sp" android:paddingHorizontal="2dp" android:textAlignment="textStart" android:textAppearance="@android:style/TextAppearance.DeviceDefault" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index c708667..f13af69 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index f2962b9..e965499 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -47,12 +47,14 @@ Transparent Black + Grey White #00000000 #FF000000 + #FF1B1B1B #FFD6D6D6 diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index e55d518..53b1dd8 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -138,15 +138,23 @@ android:layout_height="wrap_content" app:allowDividerAbove="false" app:title="Weather"> + @@ -154,6 +162,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:defaultValue="celsius" + app:dependency="weather_enabled" app:entries="@array/temp_units" app:entryValues="@array/unit_values" app:key="tempUnits" @@ -172,5 +181,17 @@ app:selectable="true" app:title="Manage Hidden Apps" /> + + + \ No newline at end of file