From d32f6805191ed5f810810c7af1111010cf610e7d Mon Sep 17 00:00:00 2001 From: Tommaso Berlose Date: Sat, 9 Jan 2021 00:24:05 +0100 Subject: [PATCH] Update UI --- .../anotherwidget/AWApplication.kt | 2 + .../ui/activities/MainActivity.kt | 9 +++ .../ui/fragments/tabs/GlanceTabFragment.kt | 26 ++++--- .../ui/fragments/tabs/PreferencesFragment.kt | 64 ++++++++--------- .../ui/fragments/tabs/WeatherFragment.kt | 7 +- .../res/anim/item_animation_fall_down.xml | 26 +++++++ .../res/anim/layout_animation_fall_down.xml | 7 ++ app/src/main/res/layout/fragment_app_main.xml | 1 - .../main/res/layout/fragment_preferences.xml | 29 ++++++++ .../main/res/layout/fragment_tab_glance.xml | 69 ++----------------- .../layout/glance_providers_list_ornament.xml | 57 +++++++++++++++ 11 files changed, 187 insertions(+), 110 deletions(-) create mode 100644 app/src/main/res/anim/item_animation_fall_down.xml create mode 100644 app/src/main/res/anim/layout_animation_fall_down.xml create mode 100644 app/src/main/res/layout/glance_providers_list_ornament.xml diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt index 131cb83..c841226 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt @@ -1,11 +1,13 @@ package com.tommasoberlose.anotherwidget +import android.Manifest import android.app.Application import android.util.Log import androidx.appcompat.app.AppCompatDelegate import com.chibatching.kotpref.Kotpref import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission import io.realm.Realm import io.realm.RealmConfiguration import net.danlew.android.joda.JodaTimeAndroid diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt index e489c17..e8c689f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt @@ -22,6 +22,7 @@ import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.global.RequestCode import com.tommasoberlose.anotherwidget.ui.activities.tabs.WeatherProviderActivity import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel +import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission class MainActivity : AppCompatActivity() { @@ -131,4 +132,12 @@ class MainActivity : AppCompatActivity() { }) .check() } + + override fun onResume() { + super.onResume() + + if (Preferences.showEvents && !checkGrantedPermission(Manifest.permission.READ_CALENDAR)) { + Preferences.showEvents = false + } + } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt index 380daf1..0ee4733 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt @@ -59,7 +59,9 @@ class GlanceTabFragment : Fragment() { private var dialog: GlanceSettingsDialog? = null private lateinit var adapter: SlimAdapter private lateinit var viewModel: MainViewModel - private lateinit var list: ArrayList + private val list: ArrayList by lazy { + GlanceProviderHelper.getGlanceProviders(requireContext()) + } private lateinit var binding: FragmentTabGlanceBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -81,8 +83,6 @@ class GlanceTabFragment : Fragment() { binding.lifecycleOwner = this binding.viewModel = viewModel - list = GlanceProviderHelper.getGlanceProviders(requireContext()) - return binding.root } @@ -96,6 +96,10 @@ class GlanceTabFragment : Fragment() { adapter = SlimAdapter.create() adapter + .register(R.layout.glance_providers_list_ornament) { item, injector -> + injector.visibility(R.id.footer, if(item == "footer") View.VISIBLE else View.GONE) + injector.visibility(R.id.header, if(item == "header") View.VISIBLE else View.GONE) + } .register(R.layout.glance_provider_item) { item, injector -> val provider = Constants.GlanceProviderId.from(item.id)!! injector @@ -212,8 +216,8 @@ class GlanceTabFragment : Fragment() { } Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> { val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount(context) - if (GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS) && (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || activity?.checkGrantedPermission( - Manifest.permission.ACTIVITY_RECOGNITION) == true) + if (GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS) && (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || requireActivity().checkGrantedPermission( + Manifest.permission.ACTIVITY_RECOGNITION)) ) { injector.text(R.id.label, if (Preferences.showDailySteps) getString(R.string.settings_visible) else getString( @@ -296,7 +300,7 @@ class GlanceTabFragment : Fragment() { GlanceProviderHelper.saveGlanceProviderOrder( list ) - adapter.updateData(list.mapNotNull { GlanceProviderHelper.getGlanceProviderById(requireContext(), it) }) + adapter.updateData(listOf("header") + list.mapNotNull { GlanceProviderHelper.getGlanceProviderById(requireContext(), it) } + listOf("footer")) } override fun onChildDraw( @@ -339,7 +343,6 @@ class GlanceTabFragment : Fragment() { }) mIth.attachToRecyclerView(binding.providersList) - adapter.updateData(list.mapNotNull { GlanceProviderHelper.getGlanceProviderById(requireContext(), it) }) binding.providersList.isNestedScrollingEnabled = false setupListener() @@ -347,6 +350,9 @@ class GlanceTabFragment : Fragment() { binding.scrollView.viewTreeObserver.addOnScrollChangedListener { viewModel.fragmentScrollY.value = binding.scrollView.scrollY } + + + adapter.updateData(listOf("header") + list.mapNotNull { GlanceProviderHelper.getGlanceProviderById(requireContext(), it) } + listOf("footer")) } private fun subscribeUi( @@ -365,7 +371,7 @@ class GlanceTabFragment : Fragment() { override fun onStart() { super.onStart() - activity?.registerReceiver(nextAlarmChangeBroadcastReceiver, + requireActivity().registerReceiver(nextAlarmChangeBroadcastReceiver, IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) if (dialog != null) { dialog?.show() @@ -373,7 +379,7 @@ class GlanceTabFragment : Fragment() { } override fun onStop() { - activity?.unregisterReceiver(nextAlarmChangeBroadcastReceiver) + requireActivity().unregisterReceiver(nextAlarmChangeBroadcastReceiver) super.onStop() } @@ -430,7 +436,7 @@ class GlanceTabFragment : Fragment() { override fun onResume() { super.onResume() - adapter.notifyItemRangeChanged(0, adapter.data.size) + adapter.notifyItemRangeChanged(0, adapter.data?.size ?: 0) if (dialog != null) { dialog?.show() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/PreferencesFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/PreferencesFragment.kt index e0da04f..b67cf93 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/PreferencesFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/PreferencesFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.Observer @@ -81,17 +82,17 @@ class PreferencesFragment : Fragment() { viewModel.showEvents.observe(viewLifecycleOwner) { maintainScrollPosition { + binding.showEventsSwitch.setCheckedImmediatelyNoEvent(it) if (it) { CalendarHelper.setEventUpdatesAndroidN(requireContext()) } else { CalendarHelper.removeEventUpdatesAndroidN(requireContext()) } } - checkReadEventsPermission() } viewModel.showWeather.observe(viewLifecycleOwner) { - checkLocationPermission() + checkWeatherProviderConfig() } viewModel.showClock.observe(viewLifecycleOwner) { @@ -113,9 +114,13 @@ class PreferencesFragment : Fragment() { } binding.showEventsSwitch.setOnCheckedChangeListener { _, enabled: Boolean -> - Preferences.showEvents = enabled - if (Preferences.showEvents) { - requirePermission() + if (enabled) { + if (!requireActivity().checkGrantedPermission(Manifest.permission.READ_CALENDAR)) { + binding.showEventsSwitch.setCheckedImmediatelyNoEvent(false) + } + requireCalendarPermission() + } else { + Preferences.showEvents = enabled } } @@ -125,6 +130,11 @@ class PreferencesFragment : Fragment() { binding.showWeatherSwitch.setOnCheckedChangeListener { _, enabled: Boolean -> Preferences.showWeather = enabled + if (enabled) { + WeatherReceiver.setUpdates(requireContext()) + } else { + WeatherReceiver.removeUpdates(requireContext()) + } } binding.actionShowClock.setOnClickListener { @@ -144,29 +154,17 @@ class PreferencesFragment : Fragment() { } } - private fun checkReadEventsPermission(showEvents: Boolean = Preferences.showEvents) { - if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) { - } else { - } - } - - private fun updateCalendar() { - if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) { - CalendarHelper.updateEventList(requireContext()) - } - } - - private fun requirePermission() { + private fun requireCalendarPermission() { Dexter.withContext(requireContext()) .withPermissions( Manifest.permission.READ_CALENDAR ).withListener(object: MultiplePermissionsListener { override fun onPermissionsChecked(report: MultiplePermissionsReport?) { report?.let { - if (report.areAllPermissionsGranted()){ - checkReadEventsPermission() - } else { - Preferences.showEvents = false + val granted = report.areAllPermissionsGranted() + Preferences.showEvents = granted + if (granted) { + CalendarHelper.updateEventList(requireContext()) } } } @@ -182,16 +180,20 @@ class PreferencesFragment : Fragment() { .check() } - private fun checkLocationPermission() { - if (requireActivity().checkGrantedPermission(Manifest.permission.ACCESS_FINE_LOCATION)) { - WeatherReceiver.setUpdates(requireContext()) - } else if (Preferences.showWeather && Preferences.customLocationAdd == "") { - MaterialBottomSheetDialog(requireContext(), message = getString(R.string.background_location_warning)) - .setPositiveButton(getString(android.R.string.ok)) { - requirePermission() - } - .show() + private fun checkWeatherProviderConfig() { + if (Preferences.showWeather && Preferences.weatherProviderError != "" && Preferences.weatherProviderError != "-" && !binding.weatherProviderError.isVisible) { + binding.weatherProviderError.expand() + } else { + binding.weatherProviderError.collapse() } + binding.weatherProviderError.text = Preferences.weatherProviderError + + if (Preferences.showWeather && Preferences.weatherProviderLocationError != "" && !binding.weatherProviderError.isVisible) { + binding.weatherProviderLocationError.expand() + } else { + binding.weatherProviderLocationError.collapse() + } + binding.weatherProviderLocationError.text = Preferences.weatherProviderLocationError } private fun maintainScrollPosition(callback: () -> Unit) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/WeatherFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/WeatherFragment.kt index b6e2b8a..0f73137 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/WeatherFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/WeatherFragment.kt @@ -141,11 +141,7 @@ class WeatherFragment : Fragment() { } else if (Preferences.showWeather && Preferences.customLocationAdd == "") { binding.locationPermissionAlert.isVisible = true binding.locationPermissionAlert.setOnClickListener { - MaterialBottomSheetDialog(requireContext(), message = getString(R.string.background_location_warning)) - .setPositiveButton(getString(android.R.string.ok)) { - requirePermission() - } - .show() + requirePermission() } } else { binding.locationPermissionAlert.isVisible = false @@ -169,7 +165,6 @@ class WeatherFragment : Fragment() { } private fun setupListener() { - binding.actionWeatherProvider.setOnClickListener { startActivityForResult( Intent(requireContext(), WeatherProviderActivity::class.java), diff --git a/app/src/main/res/anim/item_animation_fall_down.xml b/app/src/main/res/anim/item_animation_fall_down.xml new file mode 100644 index 0000000..3b3afcd --- /dev/null +++ b/app/src/main/res/anim/item_animation_fall_down.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/layout_animation_fall_down.xml b/app/src/main/res/anim/layout_animation_fall_down.xml new file mode 100644 index 0000000..3085503 --- /dev/null +++ b/app/src/main/res/anim/layout_animation_fall_down.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_app_main.xml b/app/src/main/res/layout/fragment_app_main.xml index 6486d21..405ec52 100644 --- a/app/src/main/res/layout/fragment_app_main.xml +++ b/app/src/main/res/layout/fragment_app_main.xml @@ -76,7 +76,6 @@ android:id="@+id/preview" android:animateLayoutChanges="true" app:cardBackgroundColor="@color/colorPrimary" - android:layout_marginBottom="4dp" app:cardCornerRadius="0dp" app:cardElevation="0dp"> + + - - - - - - - - - - - + android:layoutAnimation="@anim/layout_animation_fall_down" + android:id="@+id/providers_list" /> \ No newline at end of file diff --git a/app/src/main/res/layout/glance_providers_list_ornament.xml b/app/src/main/res/layout/glance_providers_list_ornament.xml new file mode 100644 index 0000000..8ddbbd1 --- /dev/null +++ b/app/src/main/res/layout/glance_providers_list_ornament.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + \ No newline at end of file