From 63465c088ed1bf530b6861fef6f5e816004f101a Mon Sep 17 00:00:00 2001 From: HeCodes2Much Date: Wed, 12 Jun 2024 14:33:16 +0100 Subject: [PATCH] Feat: Added sunset and sunrise to weather widget. Signed-off-by: HeCodes2Much --- .../numberpicker/NumberPickerAdapter.kt | 2 +- .../helper/weather/WeatherResponse.kt | 4 +- .../launcher/ui/activities/MainActivity.kt | 10 +-- .../launcher/ui/widgets/WidgetFragment.kt | 54 ++++++++++++--- .../ui/widgets/settings/SettingsFragment.kt | 2 +- app/src/main/res/layout/fragment_widgets.xml | 65 ++++++++++++++++++- app/src/main/res/values/nontranslatable.xml | 3 + 7 files changed, 121 insertions(+), 19 deletions(-) rename app/src/main/java/com/github/droidworksstudio/launcher/{ui => adapter}/numberpicker/NumberPickerAdapter.kt (95%) diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/numberpicker/NumberPickerAdapter.kt b/app/src/main/java/com/github/droidworksstudio/launcher/adapter/numberpicker/NumberPickerAdapter.kt similarity index 95% rename from app/src/main/java/com/github/droidworksstudio/launcher/ui/numberpicker/NumberPickerAdapter.kt rename to app/src/main/java/com/github/droidworksstudio/launcher/adapter/numberpicker/NumberPickerAdapter.kt index 1e54577..4a43e0f 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/numberpicker/NumberPickerAdapter.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/adapter/numberpicker/NumberPickerAdapter.kt @@ -1,4 +1,4 @@ -package com.github.droidworksstudio.launcher.ui.numberpicker +package com.github.droidworksstudio.launcher.adapter.numberpicker import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/weather/WeatherResponse.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/weather/WeatherResponse.kt index 9279091..ab22507 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/weather/WeatherResponse.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/weather/WeatherResponse.kt @@ -25,8 +25,8 @@ data class Main( data class Sys( val country: String, - val sunrise: Int, - val sunset: Int + val sunrise: Long, + val sunset: Long ) data class Weather( diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt index 119a70b..c1a0bf7 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt @@ -35,7 +35,7 @@ import androidx.navigation.NavController import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.navigateUp +import androidx.navigation.ui.popBackStack import com.github.droidworksstudio.common.hasInternetPermission import com.github.droidworksstudio.common.isTablet import com.github.droidworksstudio.common.showLongToast @@ -275,10 +275,10 @@ class MainActivity : AppCompatActivity(), LocationListener { } } - override fun onSupportNavigateUp(): Boolean { + override fun onSupportpopBackStack(): Boolean { val navController = findNavController(R.id.nav_host_fragment_content_main) - return navController.navigateUp(appBarConfiguration) - || super.onSupportNavigateUp() + return navController.popBackStack(appBarConfiguration) + || super.onSupportpopBackStack() } @RequiresApi(Build.VERSION_CODES.R) @@ -310,7 +310,7 @@ class MainActivity : AppCompatActivity(), LocationListener { private fun backToHomeScreen() { navController = findNavController(R.id.nav_host_fragment_content_main) if (navController.currentDestination?.id != R.id.HomeFragment) - navController.popBackStack(R.id.HomeFragment, false) + navController.navigate(R.id.HomeFragment) } private fun checkForUpdates() { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/WidgetFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/WidgetFragment.kt index c3e57e9..3cc794f 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/WidgetFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/WidgetFragment.kt @@ -144,6 +144,11 @@ class WidgetFragment : Fragment(), // Prepare UI elements concurrently withContext(Dispatchers.Main) { binding.apply { + val weatherWidgetDrawable = weatherRoot.background + if (weatherWidgetDrawable is GradientDrawable) { + weatherWidgetDrawable.setColor(widgetBackgroundColor) + } + weatherCity.setTextColor(widgetTextColor) weatherTemperature.setTextColor(widgetTextColor) weatherDescription.setTextColor(widgetTextColor) @@ -151,6 +156,9 @@ class WidgetFragment : Fragment(), weatherHumidity.setTextColor(widgetTextColor) weatherRefresh.setTextColor(widgetTextColor) weatherLastRun.setTextColor(widgetTextColor) + + sunsetText.setTextColor(widgetTextColor) + sunriseText.setTextColor(widgetTextColor) weatherRefresh.typeface = ResourcesCompat.getFont(requireActivity(), R.font.weather) } } @@ -173,10 +181,21 @@ class WidgetFragment : Fragment(), weatherIcon.setImageBitmap(weatherIconBitmap) // Ensure this matches your ImageView ID weatherIcon.setColorFilter(widgetTextColor) - val weatherWidgetDrawable = weatherRoot.background - if (weatherWidgetDrawable is GradientDrawable) { - weatherWidgetDrawable.setColor(widgetBackgroundColor) - } + val sunriseIconBitmap = createSunIcon(context, getString(R.string.sunrise_icon)) + sunriseIcon.setImageBitmap(sunriseIconBitmap) + sunriseIcon.setColorFilter(widgetTextColor) + + val sunsetIconBitmap = createSunIcon(context, getString(R.string.sunset_icon)) + sunsetIcon.setImageBitmap(sunsetIconBitmap) + sunsetIcon.setColorFilter(widgetTextColor) + + val sunriseTime = convertTimestampToReadableDate(weatherResponse.sys.sunrise) + sunriseText.text = getString(R.string.widget_sunrise_time, sunriseTime) + + val sunsetTime = convertTimestampToReadableDate(weatherResponse.sys.sunset) + sunsetText.text = getString(R.string.widget_sunset_time, sunsetTime) + + weatherRoot.visibility = View.VISIBLE } } @@ -197,12 +216,28 @@ class WidgetFragment : Fragment(), paint.typeface = weatherFont paint.style = Paint.Style.FILL paint.color = ContextCompat.getColor(context, R.color.white) - paint.textSize = 180f + paint.textSize = 200f paint.textAlign = Paint.Align.CENTER canvas.drawText(text, 128f, 200f, paint) return bitmap } + private fun createSunIcon(context: Context, text: String): Bitmap { + val bitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + val paint = Paint() + val weatherFont = ResourcesCompat.getFont(requireActivity(), R.font.weather) + paint.isAntiAlias = true + paint.isSubpixelText = true + paint.typeface = weatherFont + paint.style = Paint.Style.FILL + paint.color = ContextCompat.getColor(context, R.color.white) + paint.textSize = 96f + paint.textAlign = Paint.Align.CENTER + canvas.drawText(text, 64f, 96f, paint) + return bitmap + } + private fun setWeatherIcon(context: Context, id: Int): String { val icon: String val idDivided = id / 100 @@ -239,6 +274,11 @@ class WidgetFragment : Fragment(), lifecycleScope.launch { if (!preferenceHelper.showBatteryWidget) return@launch try { + val weatherBatteryDrawable = binding.batteryRoot.background + if (weatherBatteryDrawable is GradientDrawable) { + weatherBatteryDrawable.setColor(preferenceHelper.widgetBackgroundColor) + } + binding.batteryLevel.setTextColor(preferenceHelper.widgetTextColor) binding.batteryCount.setTextColor(preferenceHelper.widgetTextColor) binding.chargingStatus.setTextColor(preferenceHelper.widgetTextColor) @@ -247,10 +287,6 @@ class WidgetFragment : Fragment(), binding.batteryVoltage.setTextColor(preferenceHelper.widgetTextColor) binding.batteryTemperature.setTextColor(preferenceHelper.widgetTextColor) - val weatherBatteryDrawable = binding.batteryRoot.background - if (weatherBatteryDrawable is GradientDrawable) { - weatherBatteryDrawable.setColor(preferenceHelper.widgetBackgroundColor) - } binding.batteryRoot.visibility = View.VISIBLE } catch (e: Exception) { Log.e("Battery", "Failed to fetch battery data: ${e.message}") diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/settings/SettingsFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/settings/SettingsFragment.kt index fa6f074..edb5330 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/settings/SettingsFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/widgets/settings/SettingsFragment.kt @@ -21,7 +21,7 @@ import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.listener.ScrollEventListener import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.ColorBottomSheetDialogFragment -import com.github.droidworksstudio.launcher.ui.numberpicker.NumberPickerAdapter +import com.github.droidworksstudio.launcher.adapter.numberpicker.NumberPickerAdapter import com.github.droidworksstudio.launcher.utils.Constants import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/res/layout/fragment_widgets.xml b/app/src/main/res/layout/fragment_widgets.xml index 2982402..55b0234 100644 --- a/app/src/main/res/layout/fragment_widgets.xml +++ b/app/src/main/res/layout/fragment_widgets.xml @@ -91,8 +91,8 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + %1$.0f %2$s %1$s + %1$s + %1$s + m/s mil/h