Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/util/TaskServiceRunner.kt

158 lines
6.8 KiB
Kotlin

package org.mariotaku.twidere.util
import android.content.Context
import android.content.SharedPreferences
import android.support.annotation.StringDef
import android.util.Log
import com.squareup.otto.Bus
import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.mapToArray
import org.mariotaku.ktextension.toNulls
import org.mariotaku.twidere.TwidereConstants.LOGTAG
import org.mariotaku.twidere.constant.IntentConstants.INTENT_PACKAGE_PREFIX
import org.mariotaku.twidere.constant.dataSyncProviderInfoKey
import org.mariotaku.twidere.constant.stopAutoRefreshWhenBatteryLowKey
import org.mariotaku.twidere.model.AccountPreferences
import org.mariotaku.twidere.model.RefreshTaskParam
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.task.filter.RefreshFiltersSubscriptionsTask
import org.mariotaku.twidere.task.twitter.GetActivitiesAboutMeTask
import org.mariotaku.twidere.task.twitter.GetHomeTimelineTask
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
/**
* Created by mariotaku on 2017/1/6.
*/
class TaskServiceRunner(
val context: Context,
val preferences: SharedPreferences,
val activityTracker: ActivityTracker,
val bus: Bus
) {
fun runTask(@Action action: String, callback: (Boolean) -> Unit): Boolean {
Log.d(LOGTAG, "TaskServiceRunner run task $action")
when (action) {
ACTION_REFRESH_HOME_TIMELINE, ACTION_REFRESH_NOTIFICATIONS,
ACTION_REFRESH_DIRECT_MESSAGES, ACTION_REFRESH_FILTERS_SUBSCRIPTIONS -> {
val task = createRefreshTask(action) ?: return false
task.callback = callback
TaskStarter.execute(task)
return true
}
ACTION_SYNC_DRAFTS, ACTION_SYNC_FILTERS, ACTION_SYNC_USER_NICKNAMES, ACTION_SYNC_USER_COLORS -> {
val runner = preferences[dataSyncProviderInfoKey]?.newSyncTaskRunner(context) ?: return false
return runner.runTask(action, callback)
}
}
return false
}
fun createRefreshTask(@Action action: String): AbstractTask<*, *, (Boolean) -> Unit>? {
if (!Utils.isBatteryOkay(context) && preferences[stopAutoRefreshWhenBatteryLowKey]) {
// Low battery, don't refresh
return null
}
when (action) {
ACTION_REFRESH_HOME_TIMELINE -> {
val task = GetHomeTimelineTask(context)
task.params = AutoRefreshTaskParam(context, preferences, activityTracker.isEmpty,
AccountPreferences::isAutoRefreshHomeTimelineEnabled) { accountKeys ->
DataStoreUtils.getNewestStatusIds(context, Statuses.CONTENT_URI,
accountKeys.toNulls())
}
return task
}
ACTION_REFRESH_NOTIFICATIONS -> {
val task = GetActivitiesAboutMeTask(context)
task.params = AutoRefreshTaskParam(context, preferences, activityTracker.isEmpty,
AccountPreferences::isAutoRefreshMentionsEnabled) { accountKeys ->
DataStoreUtils.getRefreshNewestActivityMaxPositions(context,
Activities.AboutMe.CONTENT_URI, accountKeys.toNulls())
}
return task
}
ACTION_REFRESH_DIRECT_MESSAGES -> {
val task = GetMessagesTask(context)
task.params = object : GetMessagesTask.RefreshNewTaskParam(context) {
override val isBackground: Boolean = activityTracker.isEmpty
override val accountKeys: Array<UserKey> by lazy {
AccountPreferences.getAccountPreferences(context, preferences,
DataStoreUtils.getAccountKeys(context)).filter {
it.isAutoRefreshEnabled && it.isAutoRefreshDirectMessagesEnabled
}.mapToArray(AccountPreferences::accountKey)
}
}
return task
}
ACTION_REFRESH_FILTERS_SUBSCRIPTIONS -> {
return RefreshFiltersSubscriptionsTask(context)
}
}
return null
}
@StringDef(ACTION_REFRESH_HOME_TIMELINE, ACTION_REFRESH_NOTIFICATIONS, ACTION_REFRESH_DIRECT_MESSAGES,
ACTION_REFRESH_FILTERS_SUBSCRIPTIONS, ACTION_SYNC_DRAFTS, ACTION_SYNC_FILTERS,
ACTION_SYNC_USER_NICKNAMES, ACTION_SYNC_USER_COLORS)
@Retention(AnnotationRetention.SOURCE)
annotation class Action
class AutoRefreshTaskParam(
val context: Context,
val preferences: SharedPreferences,
override val isBackground: Boolean,
val refreshable: (AccountPreferences) -> Boolean,
val getSinceIds: (Array<UserKey>) -> Array<String?>?
) : RefreshTaskParam {
override val accountKeys: Array<UserKey> by lazy {
return@lazy AccountPreferences.getAccountPreferences(context, preferences,
DataStoreUtils.getAccountKeys(context)).filter {
it.isAutoRefreshEnabled && refreshable(it)
}.mapToArray(AccountPreferences::accountKey)
}
override val pagination: Array<Pagination?>?
get() = getSinceIds(accountKeys)?.mapToArray { sinceId ->
SinceMaxPagination().also { it.sinceId = sinceId }
}
}
companion object {
@Action
const val ACTION_REFRESH_HOME_TIMELINE = INTENT_PACKAGE_PREFIX + "REFRESH_HOME_TIMELINE"
@Action
const val ACTION_REFRESH_NOTIFICATIONS = INTENT_PACKAGE_PREFIX + "REFRESH_NOTIFICATIONS"
@Action
const val ACTION_REFRESH_DIRECT_MESSAGES = INTENT_PACKAGE_PREFIX + "REFRESH_DIRECT_MESSAGES"
@Action
const val ACTION_REFRESH_FILTERS_SUBSCRIPTIONS = INTENT_PACKAGE_PREFIX + "REFRESH_FILTERS_SUBSCRIPTIONS"
@Action
const val ACTION_SYNC_DRAFTS = INTENT_PACKAGE_PREFIX + "SYNC_DRAFTS"
@Action
const val ACTION_SYNC_FILTERS = INTENT_PACKAGE_PREFIX + "SYNC_FILTERS"
@Action
const val ACTION_SYNC_USER_NICKNAMES = INTENT_PACKAGE_PREFIX + "SYNC_USER_NICKNAMES"
@Action
const val ACTION_SYNC_USER_COLORS = INTENT_PACKAGE_PREFIX + "SYNC_USER_COLORS"
val ACTIONS_SYNC = arrayOf(ACTION_SYNC_DRAFTS, ACTION_SYNC_FILTERS, ACTION_SYNC_USER_COLORS,
ACTION_SYNC_USER_NICKNAMES)
}
data class SyncFinishedEvent(val syncType: String, val success: Boolean)
}