From d14dfee980772c7177ec5ad4d6b1d981f25f45b4 Mon Sep 17 00:00:00 2001 From: Tommaso Berlose Date: Sun, 4 Oct 2020 18:02:08 +0200 Subject: [PATCH] Update the provider activity --- .../anotherwidget/global/Preferences.kt | 2 + .../anotherwidget/helpers/WeatherHelper.kt | 50 ++++++ .../ui/activities/WeatherProviderActivity.kt | 70 +++++++- .../ui/fragments/MainFragment.kt | 12 +- .../ui/fragments/WeatherTabFragment.kt | 37 ++-- .../ui/viewmodels/MainViewModel.kt | 2 + .../res/layout/activity_weather_provider.xml | 159 +++++++++--------- .../res/layout/fragment_weather_settings.xml | 74 ++++---- app/src/main/res/values/strings.xml | 11 ++ 9 files changed, 263 insertions(+), 154 deletions(-) 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 2b927a9..5945d34 100755 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt @@ -40,6 +40,8 @@ object Preferences : KotprefModel() { var weatherAppPackage by stringPref(key = "PREF_WEATHER_APP_PACKAGE", default = "") var weatherProviderApi by stringPref(key = "PREF_WEATHER_PROVIDER_API_KEY", default = "") var weatherProvider by intPref(default = Constants.WeatherProvider.OPEN_WEATHER.value) + var weatherProviderError by stringPref(default = "") + var weatherProviderLocationError by stringPref(default = "") 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) 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 5deb694..21028d9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WeatherHelper.kt @@ -62,6 +62,56 @@ object WeatherHelper { }) } + fun getProviderLinkName(context: Context): String { + return context.getString(when(Constants.WeatherProvider.fromInt(Preferences.weatherProvider)) { + Constants.WeatherProvider.OPEN_WEATHER -> R.string.action_open_provider_open_weather + Constants.WeatherProvider.WEATHER_BIT -> R.string.action_open_provider_weatherbit + Constants.WeatherProvider.FORECA -> R.string.action_open_provider_foreca + Constants.WeatherProvider.HERE -> R.string.action_open_provider_here + Constants.WeatherProvider.ACCUWEATHER -> R.string.action_open_provider_accuweather + Constants.WeatherProvider.WEATHER_GOV -> R.string.action_open_provider_weather_gov + Constants.WeatherProvider.YR -> R.string.action_open_provider_yr + Constants.WeatherProvider.SMHI -> R.string.action_open_provider_smhi + Constants.WeatherProvider.WEATHER_CA -> R.string.action_open_provider_weather_ca + Constants.WeatherProvider.BOM -> R.string.action_open_provider_bom + Constants.WeatherProvider.METEOFRANCE -> R.string.action_open_provider_meteofrance + else -> R.string.nothing + }) + } + + fun getProviderLink(): String { + return when(Constants.WeatherProvider.fromInt(Preferences.weatherProvider)) { + Constants.WeatherProvider.OPEN_WEATHER -> "https://home.openweathermap.org/users/sign_up" + Constants.WeatherProvider.WEATHER_BIT -> "" + Constants.WeatherProvider.FORECA -> "" + Constants.WeatherProvider.HERE -> "" + Constants.WeatherProvider.ACCUWEATHER -> "" + Constants.WeatherProvider.WEATHER_GOV -> "" + Constants.WeatherProvider.YR -> "" + Constants.WeatherProvider.SMHI -> "" + Constants.WeatherProvider.WEATHER_CA -> "" + Constants.WeatherProvider.BOM -> "" + Constants.WeatherProvider.METEOFRANCE -> "" + else -> "" + } + } + + fun isKeyRequired(): Boolean = when (Constants.WeatherProvider.fromInt(Preferences.weatherProvider)) { + Constants.WeatherProvider.OPEN_WEATHER, + Constants.WeatherProvider.WEATHER_BIT, + Constants.WeatherProvider.FORECA, + Constants.WeatherProvider.HERE, + Constants.WeatherProvider.ACCUWEATHER, + Constants.WeatherProvider.YR, + Constants.WeatherProvider.SMHI, + Constants.WeatherProvider.WEATHER_CA, + Constants.WeatherProvider.BOM, + Constants.WeatherProvider.METEOFRANCE -> true + + Constants.WeatherProvider.WEATHER_GOV -> false + else -> true + } + fun getWeatherIconResource(icon: String, style: Int = Preferences.weatherIconPack): Int { return when (icon) { "01d" -> { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/WeatherProviderActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/WeatherProviderActivity.kt index ba2450e..3538573 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/WeatherProviderActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/WeatherProviderActivity.kt @@ -1,37 +1,91 @@ package com.tommasoberlose.anotherwidget.ui.activities +import android.animation.ValueAnimator import android.app.Activity import android.app.AlertDialog import android.os.Build import android.os.Bundle import android.text.Html import android.view.View +import android.widget.RelativeLayout import androidx.appcompat.app.AppCompatActivity +import androidx.core.animation.addListener +import androidx.core.view.isVisible +import androidx.core.widget.addTextChangedListener +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.components.BottomSheetMenu +import com.tommasoberlose.anotherwidget.global.Constants import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.helpers.WeatherHelper +import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel +import com.tommasoberlose.anotherwidget.utils.collapse +import com.tommasoberlose.anotherwidget.utils.expand import com.tommasoberlose.anotherwidget.utils.openURI import kotlinx.android.synthetic.main.activity_weather_provider.* +import kotlinx.android.synthetic.main.the_widget_sans.* class WeatherProviderActivity : AppCompatActivity() { + private lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_weather_provider) + viewModel = ViewModelProvider(this).get(MainViewModel::class.java) + api_key.editText?.setText(Preferences.weatherProviderApi) + } + + override fun onResume() { + super.onResume() + + setListener() + subscribeUi(viewModel) + } + + private fun subscribeUi(viewModel: MainViewModel) { + viewModel.weatherProvider.observe(this, Observer { + weather_provider.editText?.setText(WeatherHelper.getProviderName(this, Constants.WeatherProvider.fromInt(Preferences.weatherProvider)!!).split("\n").first()) + + info_container.isVisible = WeatherHelper.isKeyRequired() + api_key_container.isVisible = WeatherHelper.isKeyRequired() + + action_open_provider.text = WeatherHelper.getProviderLinkName(this) + }) + } + + private fun setListener() { action_back.setOnClickListener { onBackPressed() } - action_save.setOnClickListener { - Preferences.weatherProviderApi = api_key.editText?.text.toString() - setResult(Activity.RESULT_OK) - finish() - } - action_open_provider.setOnClickListener { - openURI("https://home.openweathermap.org/users/sign_up") + openURI(WeatherHelper.getProviderLink()) } - api_key.editText?.setText(Preferences.weatherProviderApi) + weather_provider_inner.setOnClickListener { + if (Preferences.showWeather) { + val dialog = BottomSheetMenu(this, header = getString(R.string.settings_weather_provider_api)).setSelectedValue(Preferences.weatherProvider) + (0 until 11).forEach { + val item = Constants.WeatherProvider.fromInt(it) + dialog.addItem(WeatherHelper.getProviderName(this, item!!), it) + } + + dialog.addOnSelectItemListener { value -> + Preferences.weatherProvider = value + }.show() + } + } + + api_key.editText?.addTextChangedListener { + Preferences.weatherProviderApi = it?.toString() ?: "" + } + } + + override fun onBackPressed() { + setResult(Activity.RESULT_OK) + finish() } } 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 b7168f0..75748dd 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 @@ -36,6 +36,7 @@ import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.helpers.BitmapHelper import com.tommasoberlose.anotherwidget.helpers.ColorHelper import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark +import com.tommasoberlose.anotherwidget.helpers.WeatherHelper import com.tommasoberlose.anotherwidget.ui.activities.MainActivity import com.tommasoberlose.anotherwidget.ui.adapters.ViewPagerAdapter import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel @@ -349,8 +350,15 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList tabs?.getTabAt(2)?.orCreateBadge?.apply { backgroundColor = ContextCompat.getColor(requireContext(), R.color.errorColorText) badgeGravity = BadgeDrawable.TOP_END - }?.isVisible = Preferences.showWeather && (Preferences.weatherProviderApi == "" || (Preferences.customLocationAdd == "" && activity?.checkGrantedPermission(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) Manifest.permission.ACCESS_BACKGROUND_LOCATION else Manifest.permission.ACCESS_FINE_LOCATION) != true)) - + }?.isVisible = if (Preferences.showWeather) { + (WeatherHelper.isKeyRequired() && Preferences.weatherProviderApi == "") + || (Preferences.customLocationAdd == "" && activity?.checkGrantedPermission( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) Manifest.permission.ACCESS_BACKGROUND_LOCATION else Manifest.permission.ACCESS_FINE_LOCATION + ) != true) + || (Preferences.weatherProviderError != "") + } else { + false + } // Music error indicator tabs?.getTabAt(4)?.orCreateBadge?.apply { 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 cab21d0..15ac3f4 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 @@ -105,14 +105,16 @@ class WeatherTabFragment : Fragment() { viewModel.weatherProvider.observe(viewLifecycleOwner, Observer { maintainScrollPosition { label_weather_provider.text = WeatherHelper.getProviderName(requireContext(), Constants.WeatherProvider.fromInt(it)!!) + checkWeatherProviderConfig() } }) - viewModel.weatherProviderApi.observe(viewLifecycleOwner, Observer { - maintainScrollPosition { - checkWeatherProviderConfig() - } - checkLocationPermission() + viewModel.weatherProviderError.observe(viewLifecycleOwner, Observer { + checkWeatherProviderConfig() + }) + + viewModel.weatherProviderLocationError.observe(viewLifecycleOwner, Observer { + checkWeatherProviderConfig() }) viewModel.customLocationAdd.observe(viewLifecycleOwner, Observer { @@ -184,11 +186,11 @@ class WeatherTabFragment : Fragment() { } private fun checkWeatherProviderConfig() { - label_weather_provider_api_key?.text = - if (Preferences.weatherProviderApi == "") getString(R.string.settings_weather_provider_api_key_subtitle_not_set) else getString( - R.string.settings_weather_provider_api_key_subtitle_all_set - ) - label_weather_provider_api_key?.setTextColor(ContextCompat.getColor(requireContext(), if (Preferences.weatherProviderApi == "" && Preferences.showWeather) R.color.errorColorText else R.color.colorSecondaryText)) + weather_provider_error.isVisible = Preferences.weatherProviderError != "" + weather_provider_error?.text = Preferences.weatherProviderError + + weather_provider_location_error.isVisible = Preferences.weatherProviderLocationError != "" + weather_provider_location_error?.text = Preferences.weatherProviderLocationError } private fun setupListener() { @@ -205,21 +207,6 @@ class WeatherTabFragment : Fragment() { } action_weather_provider.setOnClickListener { - if (Preferences.showWeather) { - val dialog = BottomSheetMenu(requireContext(), header = getString(R.string.settings_weather_provider_api)).setSelectedValue(Preferences.weatherProvider) - (0 until 11).forEach { - val item = Constants.WeatherProvider.fromInt(it) - dialog.addItem(WeatherHelper.getProviderName(requireContext(), item!!), it) - } - - dialog.addOnSelectItemListener { value -> - Preferences.weatherProvider = value - checkWeatherProviderConfig() - }.show() - } - } - - action_weather_provider_api_key.setOnClickListener { if (Preferences.showWeather) { startActivityForResult( Intent(requireContext(), WeatherProviderActivity::class.java), 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 455fd29..cca8790 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 @@ -68,6 +68,8 @@ class MainViewModel : ViewModel() { val showWeatherWarning = Preferences.asLiveData(Preferences::showWeatherWarning) val weatherIconPack = Preferences.asLiveData(Preferences::weatherIconPack) val weatherProvider = Preferences.asLiveData(Preferences::weatherProvider) + val weatherProviderError = Preferences.asLiveData(Preferences::weatherProviderError) + val weatherProviderLocationError = Preferences.asLiveData(Preferences::weatherProviderLocationError) // Glance val showGlance = Preferences.asLiveData(Preferences::showGlance) diff --git a/app/src/main/res/layout/activity_weather_provider.xml b/app/src/main/res/layout/activity_weather_provider.xml index 9ac5023..bb6f886 100644 --- a/app/src/main/res/layout/activity_weather_provider.xml +++ b/app/src/main/res/layout/activity_weather_provider.xml @@ -33,7 +33,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true" - android:text="@string/settings_weather_provider_api_key_title" + android:text="@string/settings_weather_provider_api" android:gravity="center" style="@style/AnotherWidget.Main.Title"/> + + + + + @@ -79,7 +119,7 @@ app:boxBackgroundColor="@color/colorPrimary" app:boxStrokeWidth="0dp" app:hintTextColor="@color/colorAccent" - android:hint="@string/api_key_hint" + android:hint="@string/settings_weather_provider_api_key_title" android:fontFamily="@font/google_sans" android:textAlignment="viewStart" android:textDirection="locale" @@ -89,87 +129,56 @@ android:layout_height="wrap_content" android:textAlignment="viewStart" android:textDirection="locale" + android:id="@+id/api_key_inner" android:fontFamily="@font/google_sans" android:gravity="center_vertical|start" /> - - - - - - - - - + android:orientation="vertical" + android:id="@+id/info_container"> + + + + + diff --git a/app/src/main/res/layout/fragment_weather_settings.xml b/app/src/main/res/layout/fragment_weather_settings.xml index de8d939..8545bb5 100644 --- a/app/src/main/res/layout/fragment_weather_settings.xml +++ b/app/src/main/res/layout/fragment_weather_settings.xml @@ -162,52 +162,22 @@ style="@style/AnotherWidget.Settings.Subtitle"/> - - - - - - - - + android:duplicateParentState="true" + android:textSize="14sp" + android:paddingStart="64dp" + android:paddingEnd="16dp" + android:paddingBottom="8dp" + android:visibility="gone" + android:id="@+id/weather_provider_error" + android:textColor="@color/errorColorText" + android:letterSpacing="0" + android:fontFamily="@font/google_sans" + android:textStyle="bold" + android:textAppearance="@style/TextAppearance.MaterialComponents.Button" + app:textAllCaps="false" /> + Weather.gc.ca (Canada) BOM (Australia)\nPowered by Australia\'s national weather Meteofrance.com (France) + Open openweathermap.com + Open weatherbit.io + Open foreca.com + Open here.com + Open Accuweather.com + Open Weather.gov + Open yr.no + Open smhi.se + Open weather.gc.ca + Open bom.gov.au + Open meteofrance.com Clock