diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index c91aa8d..096a5ef 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index e7cbdf6..608f2c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { applicationId "com.tommasoberlose.anotherwidget" minSdkVersion 23 targetSdkVersion 29 - versionCode 87 + versionCode 89 versionName "2.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/release/app-release.aab b/app/release/app-release.aab index e10a053..522293f 100644 Binary files a/app/release/app-release.aab and b/app/release/app-release.aab differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d44558b..c2a8776 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -131,6 +131,7 @@ + @@ -143,10 +144,6 @@ - - \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceProviderSortMenu.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceProviderSortMenu.kt index 4ebae1c..27a431c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceProviderSortMenu.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceProviderSortMenu.kt @@ -70,7 +70,7 @@ class GlanceProviderSortMenu( // move item in `fromPos` to `toPos` in adapter. adapter.notifyItemMoved(fromPos, toPos) - val list = GlanceProviderHelper.getGlanceProviders() + val list = GlanceProviderHelper.getGlanceProviders(context) Collections.swap(list, fromPos, toPos) GlanceProviderHelper.saveGlanceProviderOrder(list) return true @@ -87,8 +87,7 @@ class GlanceProviderSortMenu( mIth.attachToRecyclerView(view.menu) adapter.updateData( - GlanceProviderHelper.getGlanceProviders() - .filter { it != Constants.GlanceProviderId.BATTERY_LEVEL_LOW } + GlanceProviderHelper.getGlanceProviders(context) .mapNotNull { GlanceProviderHelper.getGlanceProviderById(context, it) } ) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Constants.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Constants.kt index 2648a71..61013cc 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Constants.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Constants.kt @@ -22,4 +22,15 @@ object Constants { CUSTOM_INFO("CUSTOM_INFO"), GOOGLE_FIT_STEPS("GOOGLE_FIT_STEPS") } + + enum class WidgetUpdateFrequency(val value: Int) { + LOW(0), + DEFAULT(1), + HIGH(2) + } + + enum class WeatherIconPack(val value: Int) { + DEFAULT(0), + MINIMAL(1) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt index 79214fe..50dbad2 100755 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt @@ -40,9 +40,15 @@ object Preferences : KotprefModel() { var eventAppName by stringPref(key = "PREF_EVENT_APP_NAME", default = "") var eventAppPackage by stringPref(key = "PREF_EVENT_APP_PACKAGE", default = "") var openEventDetails by booleanPref(default = true) + + var widgetUpdateFrequency by intPref(default = Constants.WidgetUpdateFrequency.DEFAULT.value) + var textGlobalColor by stringPref(key = "PREF_TEXT_COLOR", default = "#FFFFFF") var textGlobalAlpha by stringPref(default = "FF") + var textSecondaryColor by stringPref(default = "#FFFFFF") + var textSecondaryAlpha by stringPref(default = "FF") + var backgroundCardColor by stringPref(default = "#000000") var backgroundCardAlpha by stringPref(default = "00") @@ -50,6 +56,8 @@ object Preferences : KotprefModel() { var clockTextAlpha by stringPref(default = "FF") var showAMPMIndicator by booleanPref(default = true) + var weatherIconPack by intPref(default = Constants.WeatherIconPack.DEFAULT.value) + // Global var textMainSize by floatPref(key = "PREF_TEXT_MAIN_SIZE", default = 26f) var textSecondSize by floatPref(key = "PREF_TEXT_SECOND_SIZE", default = 18f) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/ColorHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/ColorHelper.kt index 0a8ef67..e8b9a54 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/ColorHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/ColorHelper.kt @@ -30,6 +30,31 @@ object ColorHelper { Color.parseColor("#000000") } } + + fun getSecondaryFontColor(): Int { + return try { + Color.parseColor("#%s%s".format(Preferences.textSecondaryAlpha, Preferences.textSecondaryColor.replace("#", ""))) + } catch (e: Exception) { + Color.parseColor("#FFFFFFFF") + } + } + + fun getSecondaryFontColorAlpha(): Int { + return try { + Preferences.textSecondaryAlpha.toIntValue().toDouble() * 255 / 100 + } catch (e: Exception) { + "FF".toIntValue().toDouble() * 255 / 100 + }.roundToInt() + } + + fun getSecondaryFontColorRgb(): Int { + return try { + Color.parseColor(Preferences.textSecondaryColor) + } catch (e: Exception) { + Color.parseColor("#000000") + } + } + fun getClockFontColor(): Int { return try { Color.parseColor("#%s%s".format(Preferences.clockTextAlpha, Preferences.clockTextColor.replace("#", ""))) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/DateHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/DateHelper.kt index a435f70..9fda22d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/DateHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/DateHelper.kt @@ -23,7 +23,7 @@ object DateHelper { "%s, %s".format( SimpleDateFormat("EEEE", Locale.getDefault()).format(date.time), DateUtils.formatDateTime(context, date.timeInMillis, flags) - ).getCapWordString() + ) } } @@ -33,6 +33,6 @@ object DateHelper { return "%s, %s".format( SimpleDateFormat("EEEE", Locale.getDefault()).format(date.time), DateUtils.formatDateTime(context, date.timeInMillis, flags) - ).getCapWordString() + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/GlanceProviderHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/GlanceProviderHelper.kt index 7e00af6..84bbe2a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/GlanceProviderHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/GlanceProviderHelper.kt @@ -6,12 +6,18 @@ import com.tommasoberlose.anotherwidget.db.EventRepository import com.tommasoberlose.anotherwidget.global.Constants import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.models.GlanceProvider +import com.tommasoberlose.anotherwidget.utils.checkIfFitInstalled import java.util.ArrayList object GlanceProviderHelper { - fun getGlanceProviders(): ArrayList { + fun getGlanceProviders(context: Context): ArrayList { val enabledProviders = Preferences.enabledGlanceProviderOrder.split(",").filter { it != "" } + val providers = Constants.GlanceProviderId.values() + .filter { it != Constants.GlanceProviderId.BATTERY_LEVEL_LOW } + .filter { + context.checkIfFitInstalled() || it != Constants.GlanceProviderId.GOOGLE_FIT_STEPS + }.toTypedArray() providers.sortWith(Comparator { p1, p2 -> when { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt index 0822ea1..3fa68e7 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt @@ -178,4 +178,15 @@ object IntentHelper { } } } + + fun getFitIntent(context: Context): Intent { + val pm: PackageManager = context.packageManager + return try { + pm.getLaunchIntentForPackage("com.google.android.apps.fitness")!!.apply { + addCategory(Intent.CATEGORY_LAUNCHER) + } + } catch (e: Exception) { + Intent() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt index 2d64cbf..130060d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt @@ -3,6 +3,8 @@ package com.tommasoberlose.anotherwidget.helpers import android.content.Context import android.text.format.DateUtils import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.global.Constants +import com.tommasoberlose.anotherwidget.global.Preferences import org.joda.time.DateTime import java.util.concurrent.TimeUnit @@ -68,9 +70,21 @@ object SettingsStringHelper { difference += 60 * 1000 - (difference % (60 * 1000)) when { - difference <= 0 || TimeUnit.MILLISECONDS.toHours(difference) < 1 -> { + difference <= 0 -> { return "" } + TimeUnit.MILLISECONDS.toHours(difference) < 1 && Preferences.widgetUpdateFrequency == Constants.WidgetUpdateFrequency.HIGH.value && TimeUnit.MILLISECONDS.toMinutes(difference) > 5 -> { + return DateUtils.getRelativeTimeSpanString(start, start - 1000 * 60 * (TimeUnit.MILLISECONDS.toMinutes(difference) - 1 - (TimeUnit.MILLISECONDS.toMinutes(difference) - 1) % 5), DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE).toString() + } + TimeUnit.MILLISECONDS.toHours(difference) < 1 && Preferences.widgetUpdateFrequency == Constants.WidgetUpdateFrequency.DEFAULT.value && TimeUnit.MILLISECONDS.toMinutes(difference) > 5 -> { + return DateUtils.getRelativeTimeSpanString(start, start - 1000 * 60 * (TimeUnit.MILLISECONDS.toMinutes(difference) - 1 - (TimeUnit.MILLISECONDS.toMinutes(difference) - 1) % 15), DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE).toString() + } + TimeUnit.MILLISECONDS.toHours(difference) < 1 && Preferences.widgetUpdateFrequency == Constants.WidgetUpdateFrequency.LOW.value -> { + return context.getString(R.string.soon) + } + TimeUnit.MILLISECONDS.toHours(difference) < 1 -> { + return context.getString(R.string.now) + } TimeUnit.MILLISECONDS.toHours(difference) < 12 -> { return DateUtils.getRelativeTimeSpanString(start, now, DateUtils.HOUR_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE).toString() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt index 7e82590..dcbbe3d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt @@ -6,6 +6,7 @@ import android.os.Build import com.google.android.gms.location.LocationServices import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.db.EventRepository +import com.tommasoberlose.anotherwidget.global.Constants import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.network.WeatherNetworkApi import com.tommasoberlose.anotherwidget.ui.fragments.MainFragment @@ -49,79 +50,79 @@ object WeatherHelper { fun getWeatherIconResource(icon: String): Int { when (icon) { "01d" -> { - return R.drawable.clear_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.clear_day else R.drawable.clear_day_2 } "02d" -> { - return R.drawable.partly_cloudy + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.partly_cloudy else R.drawable.partly_cloudy_2 } "03d" -> { - return R.drawable.mostly_cloudy + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.mostly_cloudy else R.drawable.mostly_cloudy_2 } "04d" -> { - return R.drawable.cloudy_weather + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.cloudy_weather else R.drawable.cloudy_weather_2 } "09d" -> { - return R.drawable.storm_weather_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.storm_weather_day else R.drawable.storm_weather_day_2 } "10d" -> { - return R.drawable.rainy_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rainy_day else R.drawable.rainy_day_2 } "11d" -> { - return R.drawable.thunder_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.thunder_day else R.drawable.thunder_day_2 } "13d" -> { - return R.drawable.snow_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.snow_day else R.drawable.snow_day_2 } "50d" -> { - return R.drawable.haze_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_day else R.drawable.haze_day_2 } "80d" -> { - return R.drawable.windy_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.windy_day else R.drawable.windy_day_2 } "81d" -> { - return R.drawable.rain_snow_day + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rain_snow_day else R.drawable.rain_snow_day_2 } "82d" -> { - return R.drawable.haze_weather + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_weather else R.drawable.haze_weather_2 } "01n" -> { - return R.drawable.clear_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.clear_night else R.drawable.clear_night_2 } "02n" -> { - return R.drawable.partly_cloudy_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.partly_cloudy_night else R.drawable.partly_cloudy_night_2 } "03n" -> { - return R.drawable.mostly_cloudy_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.mostly_cloudy_night else R.drawable.mostly_cloudy_night_2 } "04n" -> { - return R.drawable.cloudy_weather + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.cloudy_weather else R.drawable.cloudy_weather_2 } "09n" -> { - return R.drawable.storm_weather_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.storm_weather_night else R.drawable.storm_weather_night_2 } "10n" -> { - return R.drawable.rainy_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rainy_night else R.drawable.rainy_night_2 } "11n" -> { - return R.drawable.thunder_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.thunder_night else R.drawable.thunder_night_2 } "13n" -> { - return R.drawable.snow_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.snow_night else R.drawable.snow_night_2 } "50n" -> { - return R.drawable.haze_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_night else R.drawable.haze_night_2 } "80n" -> { - return R.drawable.windy_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.windy_night else R.drawable.windy_night_2 } "81n" -> { - return R.drawable.rain_snow_night + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rain_snow_night else R.drawable.rain_snow_night_2 } "82n" -> { - return R.drawable.haze_weather + return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_weather else R.drawable.haze_weather_2 } else -> { return R.drawable.unknown diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt index 7d40d8b..14d5fa2 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt @@ -30,6 +30,7 @@ class ActivityDetectionReceiver : BroadcastReceiver() { val result = ActivityTransitionResult.extractResult(intent)!! val lastEvent = result.transitionEvents.last() + Log.d("ciao", "activity detected: $lastEvent") if (lastEvent.activityType == DetectedActivity.WALKING || lastEvent.activityType == DetectedActivity.RUNNING && lastEvent.transitionType == ActivityTransition.ACTIVITY_TRANSITION_EXIT) { requestDailySteps(context) } @@ -37,6 +38,8 @@ class ActivityDetectionReceiver : BroadcastReceiver() { if (intent.action == Intent.ACTION_BOOT_COMPLETED || intent.action == Intent.ACTION_MY_PACKAGE_REPLACED && Preferences.showDailySteps && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION)) { resetDailySteps() registerFence(context) + } else { + resetDailySteps() } } } @@ -155,15 +158,15 @@ class ActivityDetectionReceiver : BroadcastReceiver() { } } - fun setTimeout(context: Context) { + private fun setTimeout(context: Context) { with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { - cancel(PendingIntent.getBroadcast(context, 0, Intent(context, ActivityDetectionReceiver::class.java), 0)) + cancel(PendingIntent.getBroadcast(context, 5, Intent(context, ActivityDetectionReceiver::class.java), 0)) setExactAndAllowWhileIdle( AlarmManager.RTC, - Calendar.getInstance().timeInMillis + 15 * 60 * 1000, + Calendar.getInstance().timeInMillis + 5 * 60 * 1000, PendingIntent.getBroadcast( context, - 0, + 5, Intent(context, ActivityDetectionReceiver::class.java), 0 ) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/BatteryLevelReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/BatteryLevelReceiver.kt index 20c39df..b2944c9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/BatteryLevelReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/BatteryLevelReceiver.kt @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.os.BatteryManager +import android.util.Log import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget @@ -14,6 +15,8 @@ class BatteryLevelReceiver : BroadcastReceiver() { Intent.ACTION_BATTERY_OKAY -> Preferences.isBatteryLevelLow = false } MainWidget.updateWidget(context) + + Log.d("ciao", "intent: ${intent}") } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt index 6ee60df..e6577b4 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt @@ -10,6 +10,8 @@ import androidx.core.app.AlarmManagerCompat import androidx.core.content.ContextCompat.getSystemService import com.tommasoberlose.anotherwidget.db.EventRepository import com.tommasoberlose.anotherwidget.global.Actions +import com.tommasoberlose.anotherwidget.global.Constants +import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.helpers.CalendarHelper import com.tommasoberlose.anotherwidget.models.Event import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget @@ -68,24 +70,54 @@ class UpdatesReceiver : BroadcastReceiver() { val diff = Period(now.timeInMillis, event.startDate) if (event.startDate > now.timeInMillis) { // Update the widget every hour till the event - setExactAndAllowWhileIdle( - AlarmManager.RTC, - if (event.startDate - diff.hours * 1000 * 60 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - diff.hours * 1000 * 60 * 60 else now.timeInMillis + 120000, - PendingIntent.getBroadcast( - context, - event.eventID.toInt(), - Intent(context, UpdatesReceiver::class.java).apply { - action = Actions.ACTION_TIME_UPDATE - putExtra(EVENT_ID, event.eventID) - }, - 0 + if (diff.hours == 0) { + var minutes = 0 + when (Preferences.widgetUpdateFrequency) { + Constants.WidgetUpdateFrequency.DEFAULT.value -> { + minutes = when { + diff.minutes > 50 -> 50 + diff.minutes > 30 -> 30 + diff.minutes > 15 -> 15 + else -> 0 + } + } + Constants.WidgetUpdateFrequency.HIGH.value -> { + minutes = diff.minutes - (diff.minutes % 5) + } + } + setExact( + AlarmManager.RTC, + if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000, + PendingIntent.getBroadcast( + context, + event.eventID.toInt(), + Intent(context, UpdatesReceiver::class.java).apply { + action = Actions.ACTION_TIME_UPDATE + putExtra(EVENT_ID, event.eventID) + }, + 0 + ) ) - ) + } else { + setExact( + AlarmManager.RTC, + event.startDate - diff.hours * 1000 * 60 * 60, + PendingIntent.getBroadcast( + context, + event.eventID.toInt(), + Intent(context, UpdatesReceiver::class.java).apply { + action = Actions.ACTION_TIME_UPDATE + putExtra(EVENT_ID, event.eventID) + }, + 0 + ) + ) + } } else { // Update the widget one second after the event is finished val fireTime = if (event.endDate > now.timeInMillis + 120 * 1000) event.endDate else now.timeInMillis + 120000 - setExactAndAllowWhileIdle( + setExact( AlarmManager.RTC, fireTime, PendingIntent.getBroadcast( diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarTabFragment.kt index ebcb299..8fb7c8e 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarTabFragment.kt @@ -123,6 +123,17 @@ class CalendarTabFragment : Fragment() { } }) + viewModel.widgetUpdateFrequency.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + widget_update_frequency_label?.text = when (it) { + Constants.WidgetUpdateFrequency.HIGH.value -> getString(R.string.settings_widget_update_frequency_high) + Constants.WidgetUpdateFrequency.DEFAULT.value -> getString(R.string.settings_widget_update_frequency_default) + Constants.WidgetUpdateFrequency.LOW.value -> getString(R.string.settings_widget_update_frequency_low) + else -> "" + } + } + }) + viewModel.showUntil.observe(viewLifecycleOwner, Observer { maintainScrollPosition { show_until_label?.text = getString(SettingsStringHelper.getShowUntilString(it)) @@ -262,6 +273,18 @@ class CalendarTabFragment : Fragment() { } } + action_widget_update_frequency.setOnClickListener { + if (Preferences.showEvents) { + BottomSheetMenu(requireContext(), header = getString(R.string.settings_widget_update_frequency_title), message = getString(R.string.settings_widget_update_frequency_subtitle)).setSelectedValue(Preferences.widgetUpdateFrequency) + .addItem(getString(R.string.settings_widget_update_frequency_high), Constants.WidgetUpdateFrequency.HIGH.value) + .addItem(getString(R.string.settings_widget_update_frequency_default), Constants.WidgetUpdateFrequency.DEFAULT.value) + .addItem(getString(R.string.settings_widget_update_frequency_low), Constants.WidgetUpdateFrequency.LOW.value) + .addOnSelectItemListener { value -> + Preferences.widgetUpdateFrequency = value + }.show() + } + } + action_second_row_info.setOnClickListener { if (Preferences.showEvents) { val dialog = BottomSheetMenu(requireContext(), header = getString(R.string.settings_second_row_info_title)).setSelectedValue(Preferences.secondRowInformation) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralTabFragment.kt index 6f0441c..319382d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralTabFragment.kt @@ -116,6 +116,28 @@ class GeneralTabFragment : Fragment() { } }) + viewModel.textSecondaryColor.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + if (Preferences.textSecondaryAlpha == "00") { + secondary_font_color_label?.text = getString(R.string.transparent) + } else { + secondary_font_color_label?.text = + "#%s".format(Integer.toHexString(ColorHelper.getSecondaryFontColor())).toUpperCase() + } + } + }) + + viewModel.textSecondaryAlpha.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + if (Preferences.textSecondaryAlpha == "00") { + secondary_font_color_label?.text = getString(R.string.transparent) + } else { + secondary_font_color_label?.text = + "#%s".format(Integer.toHexString(ColorHelper.getSecondaryFontColor())).toUpperCase() + } + } + }) + viewModel.backgroundCardColor.observe(viewLifecycleOwner, Observer { maintainScrollPosition { if (Preferences.backgroundCardAlpha == "00") { @@ -211,6 +233,23 @@ class GeneralTabFragment : Fragment() { ).show() } + action_secondary_font_color.setOnClickListener { + BottomSheetColorPicker(requireContext(), + colors = colors, + header = getString(R.string.settings_secondary_font_color_title), + getSelected = ColorHelper::getSecondaryFontColorRgb, + onColorSelected = { color: Int -> + val colorString = Integer.toHexString(color) + Preferences.textSecondaryColor = "#" + if (colorString.length > 6) colorString.substring(2) else colorString + }, + showAlphaSelector = true, + alpha = Preferences.textSecondaryAlpha.toIntValue(), + onAlphaChangeListener = { alpha -> + Preferences.textSecondaryAlpha = alpha.toHexValue() + } + ).show() + } + action_date_format.setOnClickListener { if (Preferences.showEvents) { val now = Calendar.getInstance() diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt index 22dec8e..e17612f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt @@ -43,7 +43,10 @@ import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver.Comp import com.tommasoberlose.anotherwidget.ui.activities.MainActivity import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission +import com.tommasoberlose.anotherwidget.utils.checkIfFitInstalled +import kotlinx.android.synthetic.main.fragment_calendar_settings.* import kotlinx.android.synthetic.main.fragment_glance_settings.* +import kotlinx.android.synthetic.main.fragment_glance_settings.scrollView import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -79,6 +82,8 @@ class GlanceTabFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) + action_show_steps.isVisible = requireContext().checkIfFitInstalled() + setupListener() updateNextAlarmWarningUi() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt index 7b8746a..d075ce1 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt @@ -124,127 +124,110 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList private fun updateUI() { uiJob?.cancel() - if (preview != null) { - preview.clearAnimation() - time_container.clearAnimation() - if (Preferences.showPreview) { - preview.setCardBackgroundColor( - ContextCompat.getColor( - requireContext(), - if (ColorHelper.getFontColor() - .isColorDark() - ) android.R.color.white else R.color.colorAccent - ) + preview?.clearAnimation() + time_container?.clearAnimation() + + if (Preferences.showPreview) { + preview?.setCardBackgroundColor( + ContextCompat.getColor( + requireContext(), + if (ColorHelper.getFontColor() + .isColorDark() + ) android.R.color.white else R.color.colorAccent ) - widget_shape_background?.setImageDrawable( - BitmapHelper.getTintedDrawable( - requireContext(), - R.drawable.card_background, - ColorHelper.getBackgroundColor() - ) + ) + widget_shape_background?.setImageDrawable( + BitmapHelper.getTintedDrawable( + requireContext(), + R.drawable.card_background, + ColorHelper.getBackgroundColor() ) - uiJob = viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { - val generatedView = MainWidget.generateWidgetView(requireContext()) + ) + uiJob = viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { + val generatedView = MainWidget.generateWidgetView(requireContext()) - withContext(Dispatchers.Main) { - generatedView.measure(0, 0) - preview.measure(0, 0) - } + withContext(Dispatchers.Main) { + generatedView.measure(0, 0) + preview?.measure(0, 0) + } - val bitmap = BitmapHelper.getBitmapFromView( + val bitmap = if (preview != null) { + BitmapHelper.getBitmapFromView( generatedView, if (preview.width > 0) preview.width else generatedView.measuredWidth, generatedView.measuredHeight ) - withContext(Dispatchers.Main) { - // Clock - time.setTextColor(ColorHelper.getClockFontColor()) - time_am_pm.setTextColor(ColorHelper.getClockFontColor()) - time.setTextSize( - TypedValue.COMPLEX_UNIT_SP, - Preferences.clockTextSize.toPixel(requireContext()) - ) - time_am_pm.setTextSize( - TypedValue.COMPLEX_UNIT_SP, - Preferences.clockTextSize.toPixel(requireContext()) / 5 * 2 - ) - time_am_pm.isVisible = Preferences.showAMPMIndicator + } else { + null + } + withContext(Dispatchers.Main) { + // Clock + time?.setTextColor(ColorHelper.getClockFontColor()) + time_am_pm?.setTextColor(ColorHelper.getClockFontColor()) + time?.setTextSize( + TypedValue.COMPLEX_UNIT_SP, + Preferences.clockTextSize.toPixel(requireContext()) + ) + time_am_pm?.setTextSize( + TypedValue.COMPLEX_UNIT_SP, + Preferences.clockTextSize.toPixel(requireContext()) / 5 * 2 + ) + time_am_pm?.isVisible = Preferences.showAMPMIndicator - // Clock bottom margin - clock_bottom_margin_none.isVisible = - Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.value - clock_bottom_margin_small.isVisible = - Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.SMALL.value - clock_bottom_margin_medium.isVisible = - Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.MEDIUM.value - clock_bottom_margin_large.isVisible = - Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value + // Clock bottom margin + clock_bottom_margin_none?.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.value + clock_bottom_margin_small?.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.SMALL.value + clock_bottom_margin_medium?.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.MEDIUM.value + clock_bottom_margin_large?.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value - if ((Preferences.showClock && !time_container.isVisible) || (!Preferences.showClock && time_container.isVisible)) { - if (Preferences.showClock) { - time_container.layoutParams = time_container.layoutParams.apply { - height = RelativeLayout.LayoutParams.WRAP_CONTENT - } - time_container.measure(0, 0) - } - val initialHeight = time_container.measuredHeight - ValueAnimator.ofFloat( - if (Preferences.showClock) 0f else 1f, - if (Preferences.showClock) 1f else 0f - ).apply { - duration = 500L - addUpdateListener { - val animatedValue = animatedValue as Float - time_container.layoutParams = - time_container.layoutParams.apply { - height = (initialHeight * animatedValue).toInt() - } - time.alpha = animatedValue - } - addListener( - onStart = { - if (Preferences.showClock) { - time_container.isVisible = true - } - }, - onEnd = { - if (!Preferences.showClock) { - time_container.isVisible = false - } - } - ) - }.start() - - ValueAnimator.ofInt( - preview.height, - PREVIEW_BASE_HEIGHT.toPixel(requireContext()) + if (Preferences.showClock) 100.toPixel( - requireContext() - ) else 0 - ).apply { - duration = 500L - addUpdateListener { - val animatedValue = animatedValue as Int - val layoutParams = preview.layoutParams - layoutParams.height = animatedValue - preview.layoutParams = layoutParams - } - }.start() - } else { - time_container.layoutParams = time_container.layoutParams.apply { + if ((Preferences.showClock && time_container?.isVisible == false) || (!Preferences.showClock && time_container?.isVisible == true)) { + if (Preferences.showClock) { + time_container?.layoutParams = time_container.layoutParams.apply { height = RelativeLayout.LayoutParams.WRAP_CONTENT } - time_container.measure(0, 0) + time_container?.measure(0, 0) } + val initialHeight = time_container?.measuredHeight ?: 0 + ValueAnimator.ofFloat( + if (Preferences.showClock) 0f else 1f, + if (Preferences.showClock) 1f else 0f + ).apply { + duration = 500L + addUpdateListener { + val animatedValue = animatedValue as Float + time_container?.layoutParams = + time_container.layoutParams.apply { + height = (initialHeight * animatedValue).toInt() + } + time?.alpha = animatedValue + } + addListener( + onStart = { + if (Preferences.showClock) { + time_container?.isVisible = true + } + }, + onEnd = { + if (!Preferences.showClock) { + time_container?.isVisible = false + } + } + ) + }.start() - if (preview.height == 0) { + if (preview != null) { ValueAnimator.ofInt( preview.height, PREVIEW_BASE_HEIGHT.toPixel(requireContext()) + if (Preferences.showClock) 100.toPixel( requireContext() ) else 0 ).apply { - duration = 300L + duration = 500L addUpdateListener { val animatedValue = animatedValue as Int val layoutParams = preview.layoutParams @@ -253,14 +236,37 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList } }.start() } - - widget_loader.animate().scaleX(0f).scaleY(0f).alpha(0f).setDuration(200L) - .start() - bitmap_container.setImageBitmap(bitmap) - widget.animate().alpha(1f).start() + } else { + time_container?.layoutParams = time_container.layoutParams.apply { + height = RelativeLayout.LayoutParams.WRAP_CONTENT + } + time_container?.measure(0, 0) } + + if (preview != null && preview.height == 0) { + ValueAnimator.ofInt( + preview.height, + PREVIEW_BASE_HEIGHT.toPixel(requireContext()) + if (Preferences.showClock) 100.toPixel( + requireContext() + ) else 0 + ).apply { + duration = 300L + addUpdateListener { + val animatedValue = animatedValue as Int + val layoutParams = preview.layoutParams + layoutParams.height = animatedValue + preview?.layoutParams = layoutParams + } + }.start() + } + + widget_loader?.animate()?.scaleX(0f)?.scaleY(0f)?.alpha(0f)?.setDuration(200L)?.start() + bitmap_container?.setImageBitmap(bitmap) + widget?.animate()?.alpha(1f)?.start() } - } else { + } + } else { + if (preview != null) { ValueAnimator.ofInt( preview.height, 0 diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt index e897be7..8e10b01 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.content.Intent import android.os.Build import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -126,6 +127,16 @@ class WeatherTabFragment : Fragment() { checkLocationPermission() }) + viewModel.weatherIconPack.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + label_weather_icon_pack?.text = when (it) { + Constants.WeatherIconPack.MINIMAL.value -> getString(R.string.settings_weather_icon_pack_minimal) + else -> getString(R.string.settings_weather_icon_pack_default) + } + } + checkLocationPermission() + }) + viewModel.weatherAppName.observe(viewLifecycleOwner, Observer { maintainScrollPosition { weather_app_label?.text = @@ -217,6 +228,17 @@ class WeatherTabFragment : Fragment() { } } + action_weather_icon_pack.setOnClickListener { + if (Preferences.showWeather) { + BottomSheetMenu(requireContext(), header = getString(R.string.settings_weather_icon_pack_title)).setSelectedValue(Preferences.weatherIconPack) + .addItem(getString(R.string.settings_weather_icon_pack_default), Constants.WeatherIconPack.DEFAULT.value) + .addItem(getString(R.string.settings_weather_icon_pack_minimal), Constants.WeatherIconPack.MINIMAL.value) + .addOnSelectItemListener { value -> + Preferences.weatherIconPack = value + }.show() + } + } + action_weather_app.setOnClickListener { if (Preferences.showWeather) { startActivityForResult( diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt index 3b1415d..5dd84a0 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt @@ -9,6 +9,8 @@ class MainViewModel : ViewModel() { // General Settings val textGlobalColor = Preferences.asLiveData(Preferences::textGlobalColor) val textGlobalAlpha = Preferences.asLiveData(Preferences::textGlobalAlpha) + val textSecondaryColor = Preferences.asLiveData(Preferences::textSecondaryColor) + val textSecondaryAlpha = Preferences.asLiveData(Preferences::textSecondaryAlpha) val backgroundCardColor = Preferences.asLiveData(Preferences::backgroundCardColor) val backgroundCardAlpha = Preferences.asLiveData(Preferences::backgroundCardAlpha) val textMainSize = Preferences.asLiveData(Preferences::textMainSize) @@ -27,6 +29,7 @@ class MainViewModel : ViewModel() { val showNextEvent = Preferences.asLiveData(Preferences::showNextEvent) val openEventDetails = Preferences.asLiveData(Preferences::openEventDetails) val calendarAppName = Preferences.asLiveData(Preferences::calendarAppName) + val widgetUpdateFrequency = Preferences.asLiveData(Preferences::widgetUpdateFrequency) // Clock Settings val showClock = Preferences.asLiveData(Preferences::showClock) @@ -52,6 +55,7 @@ class MainViewModel : ViewModel() { val customLocationAdd = Preferences.asLiveData(Preferences::customLocationAdd) val showWeatherWarning = Preferences.asLiveData(Preferences::showWeatherWarning) + val weatherIconPack = Preferences.asLiveData(Preferences::weatherIconPack) // Glance val showGlance = Preferences.asLiveData(Preferences::showGlance) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt index 5def9bf..21ba6ef 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt @@ -261,7 +261,7 @@ class MainWidget : AppWidgetProvider() { views.setViewVisibility(R.id.empty_layout_rect, View.GONE) views.setViewVisibility(R.id.calendar_layout_rect, View.VISIBLE) } else if (GlanceProviderHelper.showGlanceProviders(context)) { - loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders()) { + loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders(context)) { when (provider) { Constants.GlanceProviderId.PLAYING_SONG -> { if (MediaPlayerHelper.isSomeonePlaying(context)) { @@ -306,6 +306,13 @@ class MainWidget : AppWidgetProvider() { } Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> { if (Preferences.showDailySteps && Preferences.googleFitSteps > 0) { + val fitIntent = PendingIntent.getActivity( + context, + widgetID, + IntentHelper.getFitIntent(context), + 0 + ) + views.setOnClickPendingIntent(R.id.second_row_rect, fitIntent) break@loop } } @@ -446,7 +453,10 @@ class MainWidget : AppWidgetProvider() { val eventRepository = EventRepository(context) val v = View.inflate(context, R.layout.the_widget, null) - val now = Calendar.getInstance() + val now = Calendar.getInstance().apply { + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } v.empty_layout.visibility = View.VISIBLE v.calendar_layout.visibility = View.GONE @@ -466,7 +476,7 @@ class MainWidget : AppWidgetProvider() { v.next_event.text = nextEvent.title - if (Preferences.showDiffTime && now.timeInMillis < (nextEvent.startDate - 1000 * 60 * 60)) { + if (Preferences.showDiffTime && now.timeInMillis < nextEvent.startDate) { v.next_event_difference_time.text = if (!nextEvent.allDay) { SettingsStringHelper.getDifferenceText( context, @@ -512,7 +522,7 @@ class MainWidget : AppWidgetProvider() { } else { val flags: Int = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NO_YEAR or DateUtils.FORMAT_ABBREV_MONTH - v.next_event_date.text = DateUtils.formatDateTime(context, now.timeInMillis, flags).getCapWordString() + v.next_event_date.text = DateUtils.formatDateTime(context, now.timeInMillis, flags) } } @@ -520,7 +530,7 @@ class MainWidget : AppWidgetProvider() { v.calendar_layout.visibility = View.VISIBLE } else if (GlanceProviderHelper.showGlanceProviders(context)) { v.second_row_icon.isVisible = true - loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders()) { + loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders(context)) { when (provider) { Constants.GlanceProviderId.PLAYING_SONG -> { if (MediaPlayerHelper.isSomeonePlaying(context)) { @@ -562,6 +572,7 @@ class MainWidget : AppWidgetProvider() { if (Preferences.customNotes.isNotEmpty()) { v.second_row_icon.isVisible = false v.next_event_date.text = Preferences.customNotes + v.next_event_date.maxLines = 2 break@loop } } @@ -587,14 +598,30 @@ class MainWidget : AppWidgetProvider() { // Color - listOf(v.empty_date, v.divider1, v.temp, v.next_event, v.next_event_difference_time, v.next_event_date, v.divider2, v.calendar_temp, v.divider3, v.special_temp).forEach { + listOf(v.empty_date, v.divider1, v.temp, v.next_event, v.next_event_difference_time, v.divider3, v.special_temp).forEach { it.setTextColor(ColorHelper.getFontColor()) } - listOf(v.second_row_icon, v.action_next, v.action_previous).forEach { + if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) { + listOf(v.action_next, v.action_previous) + } else { + listOf(v.action_next, v.action_previous, v.empty_weather_icon, v.special_weather_icon) + }.forEach { it.setColorFilter(ColorHelper.getFontColor()) } + listOf(v.next_event_date, v.divider2, v.calendar_temp).forEach { + it.setTextColor(ColorHelper.getSecondaryFontColor()) + } + + if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) { + listOf(v.second_row_icon) + } else { + listOf(v.second_row_icon, v.weather_icon) + }.forEach { + it.setColorFilter(ColorHelper.getSecondaryFontColor()) + } + // Text Size listOf>( v.empty_date to Preferences.textMainSize, @@ -615,11 +642,11 @@ class MainWidget : AppWidgetProvider() { v.second_row_icon.scaleX = Preferences.textSecondSize / 18f v.second_row_icon.scaleY = Preferences.textSecondSize / 18f - v.weather_icon.scaleX = Preferences.textSecondSize / 16f - v.weather_icon.scaleY = Preferences.textSecondSize / 16f + v.weather_icon.scaleX = Preferences.textSecondSize / 14f + v.weather_icon.scaleY = Preferences.textSecondSize / 14f - v.empty_weather_icon.scaleX = Preferences.textMainSize / 20f - v.empty_weather_icon.scaleY = Preferences.textMainSize / 20f + v.empty_weather_icon.scaleX = Preferences.textMainSize / 18f + v.empty_weather_icon.scaleY = Preferences.textMainSize / 18f v.action_next.scaleX = Preferences.textMainSize / 28f v.action_next.scaleY = Preferences.textMainSize / 28f diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/utils/Extensions.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/utils/Extensions.kt index 983b727..12ca1d9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/utils/Extensions.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/utils/Extensions.kt @@ -212,4 +212,13 @@ fun String.getCapWordString(): String { } catch (e: Exception) { this } +} + +fun Context.checkIfFitInstalled(): Boolean { + return try { + packageManager.getPackageInfo("com.google.android.apps.fitness", PackageManager.GET_ACTIVITIES) + true + } catch (e: Exception) { + false + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/clear_day_2.png b/app/src/main/res/drawable/clear_day_2.png new file mode 100644 index 0000000..0bc89de Binary files /dev/null and b/app/src/main/res/drawable/clear_day_2.png differ diff --git a/app/src/main/res/drawable/clear_night_2.png b/app/src/main/res/drawable/clear_night_2.png new file mode 100644 index 0000000..0166c2a Binary files /dev/null and b/app/src/main/res/drawable/clear_night_2.png differ diff --git a/app/src/main/res/drawable/cloudy_weather_2.png b/app/src/main/res/drawable/cloudy_weather_2.png new file mode 100644 index 0000000..8fb9862 Binary files /dev/null and b/app/src/main/res/drawable/cloudy_weather_2.png differ diff --git a/app/src/main/res/drawable/haze_day_2.png b/app/src/main/res/drawable/haze_day_2.png new file mode 100644 index 0000000..1817f5f Binary files /dev/null and b/app/src/main/res/drawable/haze_day_2.png differ diff --git a/app/src/main/res/drawable/haze_night_2.png b/app/src/main/res/drawable/haze_night_2.png new file mode 100644 index 0000000..c3b033b Binary files /dev/null and b/app/src/main/res/drawable/haze_night_2.png differ diff --git a/app/src/main/res/drawable/haze_weather_2.png b/app/src/main/res/drawable/haze_weather_2.png new file mode 100644 index 0000000..9379e83 Binary files /dev/null and b/app/src/main/res/drawable/haze_weather_2.png differ diff --git a/app/src/main/res/drawable/mostly_cloudy_2.png b/app/src/main/res/drawable/mostly_cloudy_2.png new file mode 100644 index 0000000..7d25354 Binary files /dev/null and b/app/src/main/res/drawable/mostly_cloudy_2.png differ diff --git a/app/src/main/res/drawable/mostly_cloudy_night_2.png b/app/src/main/res/drawable/mostly_cloudy_night_2.png new file mode 100644 index 0000000..e3079d2 Binary files /dev/null and b/app/src/main/res/drawable/mostly_cloudy_night_2.png differ diff --git a/app/src/main/res/drawable/partly_cloudy_2.png b/app/src/main/res/drawable/partly_cloudy_2.png new file mode 100644 index 0000000..a1c5f11 Binary files /dev/null and b/app/src/main/res/drawable/partly_cloudy_2.png differ diff --git a/app/src/main/res/drawable/partly_cloudy_night_2.png b/app/src/main/res/drawable/partly_cloudy_night_2.png new file mode 100644 index 0000000..10c1027 Binary files /dev/null and b/app/src/main/res/drawable/partly_cloudy_night_2.png differ diff --git a/app/src/main/res/drawable/rain_snow_2.png b/app/src/main/res/drawable/rain_snow_2.png new file mode 100644 index 0000000..173bc9a Binary files /dev/null and b/app/src/main/res/drawable/rain_snow_2.png differ diff --git a/app/src/main/res/drawable/rain_snow_day_2.png b/app/src/main/res/drawable/rain_snow_day_2.png new file mode 100644 index 0000000..a6f1aa6 Binary files /dev/null and b/app/src/main/res/drawable/rain_snow_day_2.png differ diff --git a/app/src/main/res/drawable/rain_snow_night_2.png b/app/src/main/res/drawable/rain_snow_night_2.png new file mode 100644 index 0000000..af1a9d3 Binary files /dev/null and b/app/src/main/res/drawable/rain_snow_night_2.png differ diff --git a/app/src/main/res/drawable/rainy_day_2.png b/app/src/main/res/drawable/rainy_day_2.png new file mode 100644 index 0000000..b7d4ffa Binary files /dev/null and b/app/src/main/res/drawable/rainy_day_2.png differ diff --git a/app/src/main/res/drawable/rainy_night_2.png b/app/src/main/res/drawable/rainy_night_2.png new file mode 100644 index 0000000..88fe02b Binary files /dev/null and b/app/src/main/res/drawable/rainy_night_2.png differ diff --git a/app/src/main/res/drawable/rainy_weather_2.png b/app/src/main/res/drawable/rainy_weather_2.png new file mode 100644 index 0000000..173bc9a Binary files /dev/null and b/app/src/main/res/drawable/rainy_weather_2.png differ diff --git a/app/src/main/res/drawable/showcase_2.png b/app/src/main/res/drawable/showcase_2.png new file mode 100644 index 0000000..d0f3638 Binary files /dev/null and b/app/src/main/res/drawable/showcase_2.png differ diff --git a/app/src/main/res/drawable/snow_day_2.png b/app/src/main/res/drawable/snow_day_2.png new file mode 100644 index 0000000..ebdf970 Binary files /dev/null and b/app/src/main/res/drawable/snow_day_2.png differ diff --git a/app/src/main/res/drawable/snow_night_2.png b/app/src/main/res/drawable/snow_night_2.png new file mode 100644 index 0000000..50ff440 Binary files /dev/null and b/app/src/main/res/drawable/snow_night_2.png differ diff --git a/app/src/main/res/drawable/snow_weather_2.png b/app/src/main/res/drawable/snow_weather_2.png new file mode 100644 index 0000000..29ac249 Binary files /dev/null and b/app/src/main/res/drawable/snow_weather_2.png differ diff --git a/app/src/main/res/drawable/storm_weather_2.png b/app/src/main/res/drawable/storm_weather_2.png new file mode 100644 index 0000000..6b7050b Binary files /dev/null and b/app/src/main/res/drawable/storm_weather_2.png differ diff --git a/app/src/main/res/drawable/storm_weather_day_2.png b/app/src/main/res/drawable/storm_weather_day_2.png new file mode 100644 index 0000000..d0f3638 Binary files /dev/null and b/app/src/main/res/drawable/storm_weather_day_2.png differ diff --git a/app/src/main/res/drawable/storm_weather_night_2.png b/app/src/main/res/drawable/storm_weather_night_2.png new file mode 100644 index 0000000..d0dacc1 Binary files /dev/null and b/app/src/main/res/drawable/storm_weather_night_2.png differ diff --git a/app/src/main/res/drawable/thunder_day_2.png b/app/src/main/res/drawable/thunder_day_2.png new file mode 100644 index 0000000..e267850 Binary files /dev/null and b/app/src/main/res/drawable/thunder_day_2.png differ diff --git a/app/src/main/res/drawable/thunder_night_2.png b/app/src/main/res/drawable/thunder_night_2.png new file mode 100644 index 0000000..306ebe5 Binary files /dev/null and b/app/src/main/res/drawable/thunder_night_2.png differ diff --git a/app/src/main/res/drawable/thunder_weather_2.png b/app/src/main/res/drawable/thunder_weather_2.png new file mode 100644 index 0000000..2bf3ea6 Binary files /dev/null and b/app/src/main/res/drawable/thunder_weather_2.png differ diff --git a/app/src/main/res/drawable/windy_day_2.png b/app/src/main/res/drawable/windy_day_2.png new file mode 100644 index 0000000..6e05f30 Binary files /dev/null and b/app/src/main/res/drawable/windy_day_2.png differ diff --git a/app/src/main/res/drawable/windy_night_2.png b/app/src/main/res/drawable/windy_night_2.png new file mode 100644 index 0000000..71ca04d Binary files /dev/null and b/app/src/main/res/drawable/windy_night_2.png differ diff --git a/app/src/main/res/drawable/windy_weather_2.png b/app/src/main/res/drawable/windy_weather_2.png new file mode 100644 index 0000000..78e682f Binary files /dev/null and b/app/src/main/res/drawable/windy_weather_2.png differ diff --git a/app/src/main/res/font/product_sans.xml b/app/src/main/res/font/product_sans.xml new file mode 100644 index 0000000..8c58422 --- /dev/null +++ b/app/src/main/res/font/product_sans.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/product_sans_black.ttf b/app/src/main/res/font/product_sans_black.ttf new file mode 100644 index 0000000..060739f Binary files /dev/null and b/app/src/main/res/font/product_sans_black.ttf differ diff --git a/app/src/main/res/font/product_sans_bold.ttf b/app/src/main/res/font/product_sans_bold.ttf new file mode 100755 index 0000000..d847195 Binary files /dev/null and b/app/src/main/res/font/product_sans_bold.ttf differ diff --git a/app/src/main/res/font/product_sans_bold_italic.ttf b/app/src/main/res/font/product_sans_bold_italic.ttf new file mode 100755 index 0000000..129d12d Binary files /dev/null and b/app/src/main/res/font/product_sans_bold_italic.ttf differ diff --git a/app/src/main/res/font/product_sans_italic.ttf b/app/src/main/res/font/product_sans_italic.ttf new file mode 100755 index 0000000..5fc56d4 Binary files /dev/null and b/app/src/main/res/font/product_sans_italic.ttf differ diff --git a/app/src/main/res/font/product_sans_light.ttf b/app/src/main/res/font/product_sans_light.ttf new file mode 100644 index 0000000..1221e07 Binary files /dev/null and b/app/src/main/res/font/product_sans_light.ttf differ diff --git a/app/src/main/res/font/product_sans_medium.ttf b/app/src/main/res/font/product_sans_medium.ttf new file mode 100644 index 0000000..85860e6 Binary files /dev/null and b/app/src/main/res/font/product_sans_medium.ttf differ diff --git a/app/src/main/res/font/product_sans_regular.ttf b/app/src/main/res/font/product_sans_regular.ttf new file mode 100755 index 0000000..c0442ee Binary files /dev/null and b/app/src/main/res/font/product_sans_regular.ttf differ diff --git a/app/src/main/res/font/product_sans_thin.ttf b/app/src/main/res/font/product_sans_thin.ttf new file mode 100644 index 0000000..9d08714 Binary files /dev/null and b/app/src/main/res/font/product_sans_thin.ttf differ diff --git a/app/src/main/res/layout/activity_choose_application.xml b/app/src/main/res/layout/activity_choose_application.xml index 04f72a1..261862e 100644 --- a/app/src/main/res/layout/activity_choose_application.xml +++ b/app/src/main/res/layout/activity_choose_application.xml @@ -84,6 +84,7 @@ android:textColorHint="@color/colorSecondaryText" android:textAlignment="viewStart" android:id="@+id/search" + android:fontFamily="@font/product_sans" android:gravity="center_vertical|start" android:hint="@string/search" android:text="@={viewModel.searchInput}" diff --git a/app/src/main/res/layout/activity_custom_date.xml b/app/src/main/res/layout/activity_custom_date.xml index 1d8cc56..790c1a5 100644 --- a/app/src/main/res/layout/activity_custom_date.xml +++ b/app/src/main/res/layout/activity_custom_date.xml @@ -87,6 +87,7 @@ android:maxLines="1" android:singleLine="true" android:hint="@string/settings_date_format_title" + android:fontFamily="@font/product_sans" android:text="@={viewModel.dateInput}" android:autofillHints="" tools:ignore="TextFields" /> @@ -116,7 +117,7 @@ android:layout_width="match_parent" android:layout_height="48dp" android:id="@+id/date_format_value" - android:textAppearance="@style/TextAppearance.AppCompat.Button" + android:textAppearance="@style/AnotherWidget.Settings.Title" android:letterSpacing="0" android:textColor="@color/colorPrimaryText" android:textSize="20sp" diff --git a/app/src/main/res/layout/activity_custom_location.xml b/app/src/main/res/layout/activity_custom_location.xml index 6127dc5..ecd93a8 100644 --- a/app/src/main/res/layout/activity_custom_location.xml +++ b/app/src/main/res/layout/activity_custom_location.xml @@ -70,6 +70,7 @@ android:paddingRight="16dp" android:inputType="textCapWords" android:id="@+id/location" + android:fontFamily="@font/product_sans" android:gravity="center_vertical|start" android:hint="@string/search" android:textAlignment="viewStart" diff --git a/app/src/main/res/layout/activity_support_dev.xml b/app/src/main/res/layout/activity_support_dev.xml index 1505075..721447e 100644 --- a/app/src/main/res/layout/activity_support_dev.xml +++ b/app/src/main/res/layout/activity_support_dev.xml @@ -55,7 +55,7 @@ android:layout_height="wrap_content" android:paddingBottom="20dp" android:textColor="@color/colorSecondaryText" - android:textAppearance="@style/TextAppearance.AppCompat.Small" + android:textAppearance="@style/AnotherWidget.Settings.Subtitle" android:textSize="16sp" android:gravity="center" android:text="@string/support_dev_subtitle" /> diff --git a/app/src/main/res/layout/activity_weather_provider.xml b/app/src/main/res/layout/activity_weather_provider.xml index ddae682..a9494b7 100644 --- a/app/src/main/res/layout/activity_weather_provider.xml +++ b/app/src/main/res/layout/activity_weather_provider.xml @@ -80,6 +80,7 @@ app:boxStrokeColor="@color/colorAccent" app:hintTextColor="@color/colorAccent" android:hint="@string/api_key_hint" + android:fontFamily="@font/product_sans" android:textAlignment="viewStart" android:textDirection="locale" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"> @@ -88,6 +89,7 @@ android:layout_height="wrap_content" android:textAlignment="viewStart" android:textDirection="locale" + android:fontFamily="@font/product_sans" android:gravity="center_vertical|start" /> diff --git a/app/src/main/res/layout/bottom_sheet_dialog.xml b/app/src/main/res/layout/bottom_sheet_dialog.xml index a6fe0ab..d04ae80 100644 --- a/app/src/main/res/layout/bottom_sheet_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_dialog.xml @@ -16,7 +16,7 @@ android:paddingBottom="16dp" android:orientation="vertical"> diff --git a/app/src/main/res/layout/bottom_sheet_menu_divider.xml b/app/src/main/res/layout/bottom_sheet_menu_divider.xml index 2a9edbf..63cf5af 100644 --- a/app/src/main/res/layout/bottom_sheet_menu_divider.xml +++ b/app/src/main/res/layout/bottom_sheet_menu_divider.xml @@ -21,6 +21,7 @@ android:duplicateParentState="true" android:id="@+id/label" android:textSize="15sp" + android:textStyle="bold" android:textColor="@color/colorAccent" android:textAppearance="@style/TextAppearance.AppCompat.Button" app:textAllCaps="false" /> diff --git a/app/src/main/res/layout/bottom_sheet_menu_hor.xml b/app/src/main/res/layout/bottom_sheet_menu_hor.xml index 893ccd9..7751b2e 100644 --- a/app/src/main/res/layout/bottom_sheet_menu_hor.xml +++ b/app/src/main/res/layout/bottom_sheet_menu_hor.xml @@ -19,7 +19,7 @@ android:visibility="gone" android:orientation="vertical"> diff --git a/app/src/main/res/layout/fragment_calendar_settings.xml b/app/src/main/res/layout/fragment_calendar_settings.xml index 9223da8..43abe08 100644 --- a/app/src/main/res/layout/fragment_calendar_settings.xml +++ b/app/src/main/res/layout/fragment_calendar_settings.xml @@ -274,6 +274,43 @@ style="@style/AnotherWidget.Settings.Subtitle"/> + + + + + + + + + + + + + + - - - - - - - diff --git a/app/src/main/res/layout/fragment_general_settings.xml b/app/src/main/res/layout/fragment_general_settings.xml index 51451ed..ff70941 100644 --- a/app/src/main/res/layout/fragment_general_settings.xml +++ b/app/src/main/res/layout/fragment_general_settings.xml @@ -55,6 +55,43 @@ style="@style/AnotherWidget.Settings.Subtitle"/> + + + + + + + + android:text="@string/settings_secondary_font_color_title"/> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 5a2ef1e..a37adbd 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -45,7 +45,7 @@ android:text="@string/settings_title" android:textColor="@color/colorPrimaryText" android:gravity="center" - android:textAppearance="@style/TextAppearance.AppCompat.Title" + android:textAppearance="@style/AnotherWidget.Main.Title" tools:ignore="RelativeOverlap" /> diff --git a/app/src/main/res/layout/fragment_weather_settings.xml b/app/src/main/res/layout/fragment_weather_settings.xml index 00de550..694f74e 100644 --- a/app/src/main/res/layout/fragment_weather_settings.xml +++ b/app/src/main/res/layout/fragment_weather_settings.xml @@ -48,7 +48,7 @@ android:text="@string/weather_warning" android:textColor="@color/colorPrimaryText" android:letterSpacing="0" - android:textAppearance="@style/TextAppearance.AppCompat.Button" + android:textAppearance="@style/AnotherWidget.Settings.Title" app:textAllCaps="false" /> + + + + + + + - + android:textAppearance="@style/AnotherWidget.Settings.Title"/> diff --git a/app/src/main/res/layout/the_widget.xml b/app/src/main/res/layout/the_widget.xml index ecca95f..6095b48 100644 --- a/app/src/main/res/layout/the_widget.xml +++ b/app/src/main/res/layout/the_widget.xml @@ -43,7 +43,7 @@ android:layout_height="20dp" android:id="@+id/empty_weather_icon" android:layout_marginStart="4dp" - android:layout_marginEnd="4dp"/> + android:layout_marginEnd="8dp"/> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fac099f..dbeaedb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -230,4 +230,15 @@ We need a few permissions to get your daily steps from Google Fit. Show AM/PM Indicator %d steps today + Second row text color + soon + now + Time left update frequency + High frequency causes more battery consume + Low + Default + High + Icon pack + Default + Minimal \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e89aba7..09229d4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -210,4 +210,15 @@ We need a few permissions to get your daily steps from Google Fit. Show AM/PM Indicator %d steps today + Second row text color + soon + now + Time left update frequency + High frequency causes more battery consume + Low + Default + High + Icon pack + Default + Minimal \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index eb75d13..3985f48 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -98,7 +98,8 @@ Orario evento Location evento Mostra orario prossimo allarme - Colore Testo + Colore testo prima riga + Colore testo seconda riga Dimensione Testo Prima Riga Dimensione Testo Seconda Riga Orologio @@ -209,4 +210,14 @@ Abbiamo bisogno di alcuni permessi per leggere i tuoi passi di oggi da Google Fit. Mostra AM/PM %d passi + a breve + ora + Frequenza aggiornamento tempo rimanente + Maggiore è la frequenza maggiore sarà il consumo di batteria + Bassa + Default + Alta + Icon pack + Default + Minimal \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ddbcae1..ff8d561 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,7 +104,8 @@ Event address Event time Show next alarm time - Text color + First row text color + Second row text color Background color First row text size Second row text size @@ -222,4 +223,14 @@ Low battery level Show AM/PM Indicator %d steps so far + soon + now + Time left update frequency + High frequency causes more battery consume + Low + Default + High + Icon pack + Default + Minimal diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 243ad95..5a6e555 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -19,15 +19,18 @@