diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 82a69c2..50ae186 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 0054711..4628089 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -46,6 +46,88 @@ + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 0ac4059..16db43b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,6 +77,7 @@ dependencies { implementation 'androidx.browser:browser:1.3.0' implementation 'net.idik:slimadapter:2.1.2' implementation 'com.google.android:flexbox:2.0.1' + implementation 'com.kyleduo.switchbutton:library:2.0.3' // Lifecycle implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 61c0ca5..0ecc793 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + + + + \ No newline at end of file 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 2c833d5..111914e 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 @@ -68,6 +68,12 @@ class MainActivity : AppCompatActivity() { R.id.content_fragment ) } + private val settingsNavController: NavController? by lazy { + Navigation.findNavController( + this, + R.id.settings_fragment + ) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -83,11 +89,13 @@ class MainActivity : AppCompatActivity() { override fun onBackPressed() { if (mainNavController?.currentDestination?.id == R.id.appMainFragment) { - if (mAppWidgetId > 0) { - addNewWidget() - } else { - setResult(Activity.RESULT_OK) - finish() + if (settingsNavController?.navigateUp() == false) { + if (mAppWidgetId > 0) { + addNewWidget() + } else { + setResult(Activity.RESULT_OK) + finish() + } } } else { super.onBackPressed() 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 781cea2..0973f1c 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 @@ -15,6 +15,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.chibatching.kotpref.bulk +import com.google.android.material.transition.MaterialSharedAxis import com.karumi.dexter.Dexter import com.karumi.dexter.MultiplePermissionsReport import com.karumi.dexter.PermissionToken @@ -52,6 +53,8 @@ class CalendarTabFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( @@ -88,21 +91,6 @@ class CalendarTabFragment : Fragment() { binding.isCalendarEnabled = Preferences.showEvents binding.isDiffEnabled = Preferences.showDiffTime || !Preferences.showEvents - viewModel.showEvents.observe(viewLifecycleOwner, Observer { - maintainScrollPosition { - binding.isCalendarEnabled = it - - if (it) { - CalendarHelper.setEventUpdatesAndroidN(requireContext()) - } else { - CalendarHelper.removeEventUpdatesAndroidN(requireContext()) - } - binding.isDiffEnabled = Preferences.showDiffTime || !it - } - checkReadEventsPermission() - updateCalendar() - }) - viewModel.calendarAllDay.observe(viewLifecycleOwner, Observer { maintainScrollPosition { all_day_label?.text = @@ -175,20 +163,6 @@ class CalendarTabFragment : Fragment() { private fun setupListener() { - action_show_events.setOnClickListener { - Preferences.showEvents = !Preferences.showEvents - if (Preferences.showEvents) { - requirePermission() - } - } - - show_events_switch.setOnCheckedChangeListener { _, enabled: Boolean -> - Preferences.showEvents = enabled - if (Preferences.showEvents) { - requirePermission() - } - } - action_filter_calendar.setOnClickListener { val calendarSelectorList: List = CalendarHelper.getCalendarList(requireContext()).map { CalendarSelector( @@ -380,51 +354,12 @@ class CalendarTabFragment : Fragment() { } } - private fun checkReadEventsPermission(showEvents: Boolean = Preferences.showEvents) { - if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) { - show_events_label?.text = if (showEvents) getString(R.string.show_events_visible) else getString(R.string.show_events_not_visible) - read_calendar_permission_alert?.isVisible = false - } else { - show_events_label?.text = if (showEvents) getString(R.string.description_permission_calendar) else getString(R.string.show_events_not_visible) - read_calendar_permission_alert?.isVisible = showEvents - read_calendar_permission_alert?.setOnClickListener { - requirePermission() - } - } - } - private fun updateCalendar() { if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) { CalendarHelper.updateEventList(requireContext()) } } - private fun requirePermission() { - 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 - } - } - } - override fun onPermissionRationaleShouldBeShown( - permissions: MutableList?, - token: PermissionToken? - ) { - // Remember to invoke this method when the custom rationale is closed - // or just by default if you don't want to use any custom rationale. - token?.continuePermissionRequest() - } - }) - .check() - } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { when (requestCode) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockTabFragment.kt index cf814d6..9671c1c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockTabFragment.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.chibatching.kotpref.bulk +import com.google.android.material.transition.MaterialSharedAxis import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.components.BottomSheetColorPicker import com.tommasoberlose.anotherwidget.components.BottomSheetMenu @@ -58,6 +59,8 @@ class ClockTabFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( @@ -103,14 +106,6 @@ class ClockTabFragment : Fragment() { small_clock_warning?.isVisible = !it }) - viewModel.showClock.observe(viewLifecycleOwner, Observer { - maintainScrollPosition { - show_clock_label?.text = - if (it) getString(R.string.show_clock_visible) else getString(R.string.show_clock_not_visible) - binding.isClockVisible = it - } - }) - viewModel.clockTextSize.observe(viewLifecycleOwner, Observer { maintainScrollPosition { clock_text_size_label?.text = String.format("%.0fsp", it) @@ -201,14 +196,6 @@ class ClockTabFragment : Fragment() { Preferences.showBigClockWarning = false } - action_show_clock.setOnClickListener { - Preferences.showClock = !Preferences.showClock - } - - show_clock_switch.setOnCheckedChangeListener { _, enabled: Boolean -> - Preferences.showClock = enabled - } - action_clock_text_size.setOnClickListener { if (Preferences.showClock) { val dialog = BottomSheetMenu( 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 c9928c4..80a2048 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 @@ -21,6 +21,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.chibatching.kotpref.blockingBulk import com.chibatching.kotpref.bulk +import com.google.android.material.transition.MaterialSharedAxis import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.components.BottomSheetColorPicker import com.tommasoberlose.anotherwidget.components.BottomSheetMenu @@ -62,7 +63,8 @@ class GeneralTabFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( 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 34fd828..4ed2cdc 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 @@ -29,6 +29,7 @@ import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.common.api.ApiException import com.google.android.material.card.MaterialCardView +import com.google.android.material.transition.MaterialSharedAxis import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.components.CustomNotesDialog import com.tommasoberlose.anotherwidget.components.GlanceSettingsDialog @@ -65,6 +66,8 @@ class GlanceTabFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( @@ -354,30 +357,9 @@ class GlanceTabFragment : Fragment() { viewModel: MainViewModel, ) { binding.isGlanceVisible = Preferences.showGlance - - viewModel.showGlance.observe(viewLifecycleOwner, Observer { - maintainScrollPosition { - binding.isGlanceVisible = it - show_glance_label.text = - if (it) getString(R.string.description_show_glance_visible) else getString( - R.string.description_show_glance_not_visible) - } - }) } private fun setupListener() { - action_show_glance.setOnClickListener { - Preferences.showGlance = !Preferences.showGlance - } - - show_glance_switch.setOnCheckedChangeListener { _, enabled: Boolean -> - Preferences.showGlance = enabled - } - - action_show_glance.setOnLongClickListener { - Preferences.enabledGlanceProviderOrder = "" - true - } } private val nextAlarmChangeBroadcastReceiver = object : BroadcastReceiver() { 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 dbd115a..ca02d3f 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 @@ -22,6 +22,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavController import androidx.navigation.Navigation import com.google.android.material.badge.BadgeDrawable import com.google.android.material.tabs.TabLayoutMediator @@ -72,20 +73,6 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - // Viewpager - pager.adapter = ViewPagerAdapter(requireActivity()) - pager.offscreenPageLimit = 4 - TabLayoutMediator(tabs, pager) { tab, position -> - tab.text = when (position) { - 0 -> getString(R.string.settings_general_title) - 1 -> getString(R.string.settings_calendar_title) - 2 -> getString(R.string.settings_weather_title) - 3 -> getString(R.string.settings_clock_title) - 4 -> getString(R.string.settings_at_a_glance_title) - else -> "" - } - }.attach() - // Init clock if (Preferences.showClock) { time.setTextColor(ColorHelper.getClockFontColor(activity?.isDarkTheme() == true)) @@ -126,6 +113,7 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList preview?.clearAnimation() time_container?.clearAnimation() + bottom_padding.isVisible = Preferences.showPreview if (Preferences.showPreview) { preview?.setCardBackgroundColor( @@ -293,9 +281,6 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList }.start() } } - - showErrorBadge() - } private fun subscribeUi(viewModel: MainViewModel) { @@ -337,43 +322,10 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList } } - private fun showErrorBadge() { - // Calendar error indicator - tabs?.getTabAt(1)?.orCreateBadge?.apply { - backgroundColor = ContextCompat.getColor(requireContext(), R.color.errorColorText) - badgeGravity = BadgeDrawable.TOP_END - }?.isVisible = Preferences.showEvents && activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) != true - - // Weather error indicator - tabs?.getTabAt(2)?.orCreateBadge?.apply { - backgroundColor = ContextCompat.getColor(requireContext(), R.color.errorColorText) - badgeGravity = BadgeDrawable.TOP_END - }?.isVisible = if (Preferences.showWeather) { - (WeatherHelper.isKeyRequired() && WeatherHelper.getApiKey() == "") - || (Preferences.customLocationAdd == "" && activity?.checkGrantedPermission( - Manifest.permission.ACCESS_FINE_LOCATION - ) != true) - || (Preferences.weatherProviderError != "" && Preferences.weatherProviderError != "-") - || (Preferences.weatherProviderLocationError != "") - } else { - false - } - - // Glance error indicator - tabs?.getTabAt(4)?.orCreateBadge?.apply { - backgroundColor = ContextCompat.getColor(requireContext(), R.color.errorColorText) - badgeGravity = BadgeDrawable.TOP_END - }?.isVisible = ((Preferences.showMusic || Preferences.showNotifications) && !ActiveNotificationsHelper.checkNotificationAccess(requireContext())) || - (Preferences.showDailySteps && !(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || requireActivity().checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION))) || - (AlarmHelper.isAlarmProbablyWrong(requireContext())) || - (Preferences.showEventsAsGlanceProvider && (!Preferences.showEvents || !requireContext().checkGrantedPermission(Manifest.permission.READ_CALENDAR))) - } - override fun onResume() { super.onResume() Preferences.preferences.registerOnSharedPreferenceChangeListener(this) EventBus.getDefault().register(this) - showErrorBadge() updateUI() } @@ -409,11 +361,4 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList } } } - - @Subscribe(threadMode = ThreadMode.MAIN) - fun onMessageEvent(event: ChangeTabEvent?) { - event?.let { - pager.setCurrentItem(event.page, true) - } - } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/TabSelectorFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/TabSelectorFragment.kt new file mode 100644 index 0000000..73c265c --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/TabSelectorFragment.kt @@ -0,0 +1,249 @@ +package com.tommasoberlose.anotherwidget.ui.fragments + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.provider.CalendarContract +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 +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.navigation.Navigation +import androidx.navigation.findNavController +import com.chibatching.kotpref.bulk +import com.google.android.material.transition.MaterialSharedAxis +import com.karumi.dexter.Dexter +import com.karumi.dexter.MultiplePermissionsReport +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.multi.MultiplePermissionsListener +import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.components.BottomSheetMenu +import com.tommasoberlose.anotherwidget.components.MaterialBottomSheetDialog +import com.tommasoberlose.anotherwidget.databinding.FragmentTabSelectorBinding +import com.tommasoberlose.anotherwidget.global.Constants +import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.global.RequestCode +import com.tommasoberlose.anotherwidget.helpers.CalendarHelper +import com.tommasoberlose.anotherwidget.helpers.IntentHelper +import com.tommasoberlose.anotherwidget.helpers.SettingsStringHelper +import com.tommasoberlose.anotherwidget.models.CalendarSelector +import com.tommasoberlose.anotherwidget.receivers.WeatherReceiver +import com.tommasoberlose.anotherwidget.ui.activities.ChooseApplicationActivity +import com.tommasoberlose.anotherwidget.ui.activities.MainActivity +import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel +import com.tommasoberlose.anotherwidget.utils.* +import kotlinx.android.synthetic.main.fragment_tab_selector.* +import kotlinx.android.synthetic.main.fragment_tab_selector.scrollView +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +class TabSelectorFragment : Fragment() { + + companion object { + fun newInstance() = TabSelectorFragment() + } + + private lateinit var viewModel: MainViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_tab_selector, container, false) + + subscribeUi(binding, viewModel) + + binding.lifecycleOwner = this + binding.viewModel = viewModel + + return binding.root + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + setupListener() + } + + private fun subscribeUi( + binding: FragmentTabSelectorBinding, + viewModel: MainViewModel + ) { + binding.isCalendarEnabled = Preferences.showEvents + binding.isWeatherVisible = Preferences.showWeather + binding.isClockVisible = Preferences.showClock + binding.isGlanceVisible = Preferences.showGlance + + viewModel.showEvents.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + binding.isCalendarEnabled = it + + if (it) { + CalendarHelper.setEventUpdatesAndroidN(requireContext()) + } else { + CalendarHelper.removeEventUpdatesAndroidN(requireContext()) + } + } + checkReadEventsPermission() + updateCalendar() + }) + + viewModel.showWeather.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + binding.isWeatherVisible = it + } + checkLocationPermission() + }) + + viewModel.showClock.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + binding.isClockVisible = it + } + }) + + viewModel.showGlance.observe(viewLifecycleOwner, Observer { + maintainScrollPosition { + binding.isGlanceVisible = it + } + }) + + } + + private fun setupListener() { + + action_general_settings.setOnClickListener { + Navigation.findNavController(it).navigate(R.id.action_tabSelectorFragment_to_generalTabFragment) + } + + action_show_events.setOnClickListener { + Navigation.findNavController(it).navigate(R.id.action_tabSelectorFragment_to_calendarTabFragment) + } + + show_events_switch.setOnCheckedChangeListener { _, enabled: Boolean -> + Preferences.showEvents = enabled + if (Preferences.showEvents) { + requirePermission() + } + } + + action_show_weather.setOnClickListener { + Navigation.findNavController(it).navigate(R.id.action_tabSelectorFragment_to_weatherTabFragment) + } + + show_weather_switch.setOnCheckedChangeListener { _, enabled: Boolean -> + Preferences.showWeather = enabled + } + + action_show_clock.setOnClickListener { + Navigation.findNavController(it).navigate(R.id.action_tabSelectorFragment_to_clockTabFragment) + } + + show_clock_switch.setOnCheckedChangeListener { _, enabled: Boolean -> + Preferences.showClock = enabled + } + action_show_glance.setOnClickListener { + Navigation.findNavController(it).navigate(R.id.action_tabSelectorFragment_to_glanceTabFragment) + } + + show_glance_switch.setOnCheckedChangeListener { _, enabled: Boolean -> + Preferences.showGlance = enabled + } + } + + 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() { + 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 + } + } + } + override fun onPermissionRationaleShouldBeShown( + permissions: MutableList?, + token: PermissionToken? + ) { + // Remember to invoke this method when the custom rationale is closed + // or just by default if you don't want to use any custom rationale. + token?.continuePermissionRequest() + } + }) + .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() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + RequestCode.CALENDAR_APP_REQUEST_CODE.code -> { + Preferences.bulk { + calendarAppName = data?.getStringExtra(Constants.RESULT_APP_NAME) ?: getString( + R.string.default_calendar_app) + calendarAppPackage = data?.getStringExtra(Constants.RESULT_APP_PACKAGE) ?: "" + } + } + RequestCode.EVENT_APP_REQUEST_CODE.code -> { + Preferences.bulk { + eventAppName = data?.getStringExtra(Constants.RESULT_APP_NAME) ?: getString( + R.string.default_event_app) + eventAppPackage = data?.getStringExtra(Constants.RESULT_APP_PACKAGE) ?: "" + } + } + } + } + super.onActivityResult(requestCode, resultCode, data) + } + + private fun maintainScrollPosition(callback: () -> Unit) { + scrollView.isScrollable = false + callback.invoke() + lifecycleScope.launch { + delay(200) + scrollView.isScrollable = true + } + } +} 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 c71c580..d06cd77 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 @@ -18,6 +18,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.chibatching.kotpref.bulk +import com.google.android.material.transition.MaterialSharedAxis import com.karumi.dexter.Dexter import com.karumi.dexter.MultiplePermissionsReport import com.karumi.dexter.PermissionToken @@ -59,6 +60,8 @@ class WeatherTabFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( @@ -79,7 +82,6 @@ class WeatherTabFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - setupListener() } @@ -89,17 +91,6 @@ class WeatherTabFragment : Fragment() { ) { binding.isWeatherVisible = Preferences.showWeather - viewModel.showWeather.observe(viewLifecycleOwner, Observer { - maintainScrollPosition { - show_weather_label?.text = - if (it) getString(R.string.show_weather_visible) else getString(R.string.show_weather_not_visible) - checkWeatherProviderConfig() - binding.isWeatherVisible = it - } - checkLocationPermission() - checkWeatherProviderConfig() - }) - viewModel.weatherProvider.observe(viewLifecycleOwner, Observer { maintainScrollPosition { label_weather_provider.text = WeatherHelper.getProviderName(requireContext(), Constants.WeatherProvider.fromInt(it)!!) @@ -197,13 +188,6 @@ class WeatherTabFragment : Fragment() { } private fun setupListener() { - action_show_weather.setOnClickListener { - Preferences.showWeather = !Preferences.showWeather - } - - show_weather_switch.setOnCheckedChangeListener { _, enabled: Boolean -> - Preferences.showWeather = enabled - } action_weather_provider.setOnClickListener { if (Preferences.showWeather) { diff --git a/app/src/main/res/layout/activity_app_notifications_filter.xml b/app/src/main/res/layout/activity_app_notifications_filter.xml index 13c55ae..2f34b48 100644 --- a/app/src/main/res/layout/activity_app_notifications_filter.xml +++ b/app/src/main/res/layout/activity_app_notifications_filter.xml @@ -63,7 +63,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:cardElevation="2dp" - app:cardCornerRadius="0dp" + style="@style/CustomCardViewStyle" app:cardBackgroundColor="@color/colorPrimary"> - - + android:layout_height="16dp" + android:orientation="vertical" + android:id="@+id/bottom_padding" /> - - - + android:layout_height="match_parent"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar_settings.xml b/app/src/main/res/layout/fragment_calendar_settings.xml index 9695246..48142f9 100644 --- a/app/src/main/res/layout/fragment_calendar_settings.xml +++ b/app/src/main/res/layout/fragment_calendar_settings.xml @@ -25,72 +25,11 @@ android:paddingTop="8dp" android:paddingBottom="8dp" android:orientation="vertical"> - - - - - - - - - - - - - - - - - + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> + app:tint="@color/colorAccent"/> - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_weather_settings.xml b/app/src/main/res/layout/fragment_weather_settings.xml index ffee2eb..161fdf8 100644 --- a/app/src/main/res/layout/fragment_weather_settings.xml +++ b/app/src/main/res/layout/fragment_weather_settings.xml @@ -21,58 +21,11 @@ android:paddingTop="8dp" android:paddingBottom="8dp" android:orientation="vertical"> - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 53eb58e..b7b1e47 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -25,4 +25,5 @@ #33000000 #202020 + #252525 \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c011ab6..0e48593 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -34,5 +34,6 @@ #efefef #43A047 #efefef + #DADADA diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d082913..ad04336 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -72,7 +72,7 @@ + + \ No newline at end of file