|
|
|
@ -27,8 +27,9 @@ import androidx.appcompat.app.AppCompatActivity
|
|
|
|
import androidx.appcompat.view.ActionMode
|
|
|
|
import androidx.appcompat.view.ActionMode
|
|
|
|
import androidx.appcompat.widget.SearchView
|
|
|
|
import androidx.appcompat.widget.SearchView
|
|
|
|
import androidx.appcompat.widget.Toolbar
|
|
|
|
import androidx.appcompat.widget.Toolbar
|
|
|
|
import androidx.compose.animation.ExperimentalAnimationApi
|
|
|
|
import androidx.compose.animation.AnimatedVisibility
|
|
|
|
import androidx.compose.runtime.getValue
|
|
|
|
import androidx.compose.animation.expandVertically
|
|
|
|
|
|
|
|
import androidx.compose.animation.shrinkVertically
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.core.app.ShareCompat
|
|
|
|
import androidx.core.app.ShareCompat
|
|
|
|
@ -49,7 +50,6 @@ import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
|
|
|
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
|
|
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
|
|
|
import com.google.accompanist.permissions.PermissionStatus
|
|
|
|
|
|
|
|
import com.google.accompanist.permissions.rememberPermissionState
|
|
|
|
import com.google.accompanist.permissions.rememberPermissionState
|
|
|
|
import com.google.accompanist.permissions.shouldShowRationale
|
|
|
|
import com.google.accompanist.permissions.shouldShowRationale
|
|
|
|
import com.google.android.material.appbar.AppBarLayout
|
|
|
|
import com.google.android.material.appbar.AppBarLayout
|
|
|
|
@ -91,7 +91,6 @@ import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPicker
|
|
|
|
import org.tasks.compose.NotificationsDisabledBanner
|
|
|
|
import org.tasks.compose.NotificationsDisabledBanner
|
|
|
|
import org.tasks.compose.QuietHoursBanner
|
|
|
|
import org.tasks.compose.QuietHoursBanner
|
|
|
|
import org.tasks.compose.SubscriptionNagBanner
|
|
|
|
import org.tasks.compose.SubscriptionNagBanner
|
|
|
|
import org.tasks.compose.rememberReminderPermissionState
|
|
|
|
|
|
|
|
import org.tasks.data.TaskContainer
|
|
|
|
import org.tasks.data.TaskContainer
|
|
|
|
import org.tasks.data.dao.CaldavDao
|
|
|
|
import org.tasks.data.dao.CaldavDao
|
|
|
|
import org.tasks.data.dao.TagDataDao
|
|
|
|
import org.tasks.data.dao.TagDataDao
|
|
|
|
@ -142,6 +141,7 @@ import org.tasks.themes.TasksTheme
|
|
|
|
import org.tasks.themes.Theme
|
|
|
|
import org.tasks.themes.Theme
|
|
|
|
import org.tasks.themes.ThemeColor
|
|
|
|
import org.tasks.themes.ThemeColor
|
|
|
|
import org.tasks.time.DateTimeUtils2.currentTimeMillis
|
|
|
|
import org.tasks.time.DateTimeUtils2.currentTimeMillis
|
|
|
|
|
|
|
|
import org.tasks.ui.Banner
|
|
|
|
import org.tasks.ui.TaskEditEvent
|
|
|
|
import org.tasks.ui.TaskEditEvent
|
|
|
|
import org.tasks.ui.TaskEditEventBus
|
|
|
|
import org.tasks.ui.TaskEditEventBus
|
|
|
|
import org.tasks.ui.TaskListEvent
|
|
|
|
import org.tasks.ui.TaskListEvent
|
|
|
|
@ -269,7 +269,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
|
|
|
|
.launchIn(viewLifecycleOwner.lifecycleScope)
|
|
|
|
.launchIn(viewLifecycleOwner.lifecycleScope)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@OptIn(ExperimentalAnimationApi::class, ExperimentalPermissionsApi::class)
|
|
|
|
@OptIn(ExperimentalPermissionsApi::class)
|
|
|
|
override fun onCreateView(
|
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
|
|
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
|
|
|
requireActivity().onBackPressedDispatcher.addCallback(owner = viewLifecycleOwner) {
|
|
|
|
requireActivity().onBackPressedDispatcher.addCallback(owner = viewLifecycleOwner) {
|
|
|
|
@ -362,26 +362,28 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
|
|
|
|
val context = LocalContext.current
|
|
|
|
val context = LocalContext.current
|
|
|
|
val state = listViewModel.state.collectAsStateWithLifecycle().value
|
|
|
|
val state = listViewModel.state.collectAsStateWithLifecycle().value
|
|
|
|
TasksTheme(theme = theme.themeBase.index) {
|
|
|
|
TasksTheme(theme = theme.themeBase.index) {
|
|
|
|
val hasRemindersPermission by rememberReminderPermissionState()
|
|
|
|
|
|
|
|
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
|
|
|
|
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
|
|
|
|
rememberPermissionState(
|
|
|
|
rememberPermissionState(
|
|
|
|
Manifest.permission.POST_NOTIFICATIONS,
|
|
|
|
Manifest.permission.POST_NOTIFICATIONS,
|
|
|
|
onPermissionResult = { success ->
|
|
|
|
onPermissionResult = { success ->
|
|
|
|
if (success) {
|
|
|
|
if (success) {
|
|
|
|
NotificationSchedulerIntentService.enqueueWork(context)
|
|
|
|
NotificationSchedulerIntentService.enqueueWork(context)
|
|
|
|
listViewModel.dismissNotificationBanner(fix = true)
|
|
|
|
listViewModel.dismissBanner(tookAction = true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
null
|
|
|
|
null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val showNotificationBanner = state.warnNotificationsDisabled && notificationPermissions?.status is PermissionStatus.Denied
|
|
|
|
|
|
|
|
val showAlarmsBanner = !showNotificationBanner && state.warnNotificationsDisabled && !hasRemindersPermission
|
|
|
|
AnimatedVisibility(
|
|
|
|
val showSubscriptionNag = !showNotificationBanner && !showAlarmsBanner && state.begForSubscription
|
|
|
|
visible = state.banner != null,
|
|
|
|
val showQuietHoursWarning = !showNotificationBanner && !showAlarmsBanner && !showSubscriptionNag && state.warnQuietHoursEnabled
|
|
|
|
enter = expandVertically(),
|
|
|
|
|
|
|
|
exit = shrinkVertically(),
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
when (state.banner) {
|
|
|
|
|
|
|
|
is Banner.NotificationsDisabled ->
|
|
|
|
NotificationsDisabledBanner(
|
|
|
|
NotificationsDisabledBanner(
|
|
|
|
visible = showNotificationBanner,
|
|
|
|
|
|
|
|
settings = {
|
|
|
|
settings = {
|
|
|
|
if (notificationPermissions?.status?.shouldShowRationale == true) {
|
|
|
|
if (notificationPermissions?.status?.shouldShowRationale == true) {
|
|
|
|
context.openAppNotificationSettings()
|
|
|
|
context.openAppNotificationSettings()
|
|
|
|
@ -389,38 +391,55 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
|
|
|
|
notificationPermissions?.launchPermissionRequest()
|
|
|
|
notificationPermissions?.launchPermissionRequest()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
dismiss = { listViewModel.dismissNotificationBanner() },
|
|
|
|
dismiss = { listViewModel.dismissBanner() },
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Banner.AlarmsDisabled ->
|
|
|
|
AlarmsDisabledBanner(
|
|
|
|
AlarmsDisabledBanner(
|
|
|
|
visible = showAlarmsBanner,
|
|
|
|
|
|
|
|
settings = { context.openReminderSettings() },
|
|
|
|
settings = { context.openReminderSettings() },
|
|
|
|
dismiss = { listViewModel.dismissNotificationBanner() },
|
|
|
|
dismiss = { listViewModel.dismissBanner() },
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Banner.BegForMoney ->
|
|
|
|
SubscriptionNagBanner(
|
|
|
|
SubscriptionNagBanner(
|
|
|
|
visible = showSubscriptionNag,
|
|
|
|
|
|
|
|
subscribe = {
|
|
|
|
subscribe = {
|
|
|
|
listViewModel.dismissPurchaseBanner(clickedPurchase = true)
|
|
|
|
listViewModel.dismissBanner(tookAction = true)
|
|
|
|
if (TasksApplication.IS_GOOGLE_PLAY) {
|
|
|
|
if (TasksApplication.IS_GOOGLE_PLAY) {
|
|
|
|
context.startActivity(Intent(context, PurchaseActivity::class.java))
|
|
|
|
context.startActivity(
|
|
|
|
|
|
|
|
Intent(
|
|
|
|
|
|
|
|
context,
|
|
|
|
|
|
|
|
PurchaseActivity::class.java
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
preferences.lastSubscribeRequest = currentTimeMillis()
|
|
|
|
preferences.lastSubscribeRequest = currentTimeMillis()
|
|
|
|
context.openUri(R.string.url_donate)
|
|
|
|
context.openUri(R.string.url_donate)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
dismiss = {
|
|
|
|
dismiss = {
|
|
|
|
listViewModel.dismissPurchaseBanner(clickedPurchase = false)
|
|
|
|
listViewModel.dismissBanner()
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Banner.QuietHoursEnabled ->
|
|
|
|
QuietHoursBanner(
|
|
|
|
QuietHoursBanner(
|
|
|
|
visible = showQuietHoursWarning,
|
|
|
|
|
|
|
|
showSettings = {
|
|
|
|
showSettings = {
|
|
|
|
listViewModel.dismissQuietHoursBanner()
|
|
|
|
listViewModel.dismissBanner()
|
|
|
|
context.startActivity(Intent(context, MainPreferences::class.java))
|
|
|
|
context.startActivity(
|
|
|
|
|
|
|
|
Intent(
|
|
|
|
|
|
|
|
context,
|
|
|
|
|
|
|
|
MainPreferences::class.java
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
dismiss = {
|
|
|
|
dismiss = {
|
|
|
|
listViewModel.dismissQuietHoursBanner()
|
|
|
|
listViewModel.dismissBanner()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
null -> {}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return binding.root
|
|
|
|
return binding.root
|
|
|
|
|