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