Auto-format using Ktlint

This commit is contained in:
wb9688 2020-05-01 20:13:21 +02:00
parent ff7344438b
commit b0415a5289
38 changed files with 220 additions and 224 deletions

View File

@ -116,4 +116,4 @@ class AppDatabaseTest {
testHelper.closeWhenFinished(database) testHelper.closeWhenFinished(database)
return database return database
} }
} }

View File

@ -7,11 +7,11 @@ import androidx.room.Query
import androidx.room.Transaction import androidx.room.Transaction
import androidx.room.Update import androidx.room.Update
import io.reactivex.Flowable import io.reactivex.Flowable
import java.util.Date
import org.schabi.newpipe.database.feed.model.FeedEntity import org.schabi.newpipe.database.feed.model.FeedEntity
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity
import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.database.subscription.SubscriptionEntity
import java.util.Date
@Dao @Dao
abstract class FeedDAO { abstract class FeedDAO {

View File

@ -27,11 +27,11 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity
] ]
) )
data class FeedEntity( data class FeedEntity(
@ColumnInfo(name = STREAM_ID) @ColumnInfo(name = STREAM_ID)
var streamId: Long, var streamId: Long,
@ColumnInfo(name = SUBSCRIPTION_ID) @ColumnInfo(name = SUBSCRIPTION_ID)
var subscriptionId: Long var subscriptionId: Long
) { ) {
companion object { companion object {
@ -40,4 +40,4 @@ data class FeedEntity(
const val STREAM_ID = "stream_id" const val STREAM_ID = "stream_id"
const val SUBSCRIPTION_ID = "subscription_id" const val SUBSCRIPTION_ID = "subscription_id"
} }
} }

View File

@ -13,18 +13,18 @@ import org.schabi.newpipe.local.subscription.FeedGroupIcon
indices = [Index(SORT_ORDER)] indices = [Index(SORT_ORDER)]
) )
data class FeedGroupEntity( data class FeedGroupEntity(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = ID) @ColumnInfo(name = ID)
val uid: Long, val uid: Long,
@ColumnInfo(name = NAME) @ColumnInfo(name = NAME)
var name: String, var name: String,
@ColumnInfo(name = ICON) @ColumnInfo(name = ICON)
var icon: FeedGroupIcon, var icon: FeedGroupIcon,
@ColumnInfo(name = SORT_ORDER) @ColumnInfo(name = SORT_ORDER)
var sortOrder: Long = -1 var sortOrder: Long = -1
) { ) {
companion object { companion object {
const val FEED_GROUP_TABLE = "feed_group" const val FEED_GROUP_TABLE = "feed_group"
@ -36,4 +36,4 @@ data class FeedGroupEntity(
const val GROUP_ALL_ID = -1L const val GROUP_ALL_ID = -1L
} }
} }

View File

@ -29,11 +29,11 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity
] ]
) )
data class FeedGroupSubscriptionEntity( data class FeedGroupSubscriptionEntity(
@ColumnInfo(name = GROUP_ID) @ColumnInfo(name = GROUP_ID)
var feedGroupId: Long, var feedGroupId: Long,
@ColumnInfo(name = SUBSCRIPTION_ID) @ColumnInfo(name = SUBSCRIPTION_ID)
var subscriptionId: Long var subscriptionId: Long
) { ) {
companion object { companion object {
@ -42,4 +42,4 @@ data class FeedGroupSubscriptionEntity(
const val GROUP_ID = "group_id" const val GROUP_ID = "group_id"
const val SUBSCRIPTION_ID = "subscription_id" const val SUBSCRIPTION_ID = "subscription_id"
} }
} }

View File

@ -4,10 +4,10 @@ import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.ForeignKey import androidx.room.ForeignKey
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import java.util.Date
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID
import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.database.subscription.SubscriptionEntity
import java.util.Date
@Entity( @Entity(
tableName = FEED_LAST_UPDATED_TABLE, tableName = FEED_LAST_UPDATED_TABLE,
@ -20,12 +20,12 @@ import java.util.Date
] ]
) )
data class FeedLastUpdatedEntity( data class FeedLastUpdatedEntity(
@PrimaryKey @PrimaryKey
@ColumnInfo(name = SUBSCRIPTION_ID) @ColumnInfo(name = SUBSCRIPTION_ID)
var subscriptionId: Long, var subscriptionId: Long,
@ColumnInfo(name = LAST_UPDATED) @ColumnInfo(name = LAST_UPDATED)
var lastUpdated: Date? = null var lastUpdated: Date? = null
) { ) {
companion object { companion object {

View File

@ -2,21 +2,21 @@ package org.schabi.newpipe.database.history.model
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Embedded import androidx.room.Embedded
import org.schabi.newpipe.database.stream.model.StreamEntity
import java.util.Date import java.util.Date
import org.schabi.newpipe.database.stream.model.StreamEntity
data class StreamHistoryEntry( data class StreamHistoryEntry(
@Embedded @Embedded
val streamEntity: StreamEntity, val streamEntity: StreamEntity,
@ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID) @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)
val streamId: Long, val streamId: Long,
@ColumnInfo(name = StreamHistoryEntity.STREAM_ACCESS_DATE) @ColumnInfo(name = StreamHistoryEntity.STREAM_ACCESS_DATE)
val accessDate: Date, val accessDate: Date,
@ColumnInfo(name = StreamHistoryEntity.STREAM_REPEAT_COUNT) @ColumnInfo(name = StreamHistoryEntity.STREAM_REPEAT_COUNT)
val repeatCount: Long val repeatCount: Long
) { ) {
fun toStreamHistoryEntity(): StreamHistoryEntity { fun toStreamHistoryEntity(): StreamHistoryEntity {

View File

@ -8,14 +8,14 @@ import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
class PlaylistStreamEntry( class PlaylistStreamEntry(
@Embedded @Embedded
val streamEntity: StreamEntity, val streamEntity: StreamEntity,
@ColumnInfo(name = PlaylistStreamEntity.JOIN_STREAM_ID) @ColumnInfo(name = PlaylistStreamEntity.JOIN_STREAM_ID)
val streamId: Long, val streamId: Long,
@ColumnInfo(name = PlaylistStreamEntity.JOIN_INDEX) @ColumnInfo(name = PlaylistStreamEntity.JOIN_INDEX)
val joinIndex: Int val joinIndex: Int
) : LocalItem { ) : LocalItem {
@Throws(IllegalArgumentException::class) @Throws(IllegalArgumentException::class)

View File

@ -2,24 +2,24 @@ package org.schabi.newpipe.database.stream
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Embedded import androidx.room.Embedded
import java.util.Date
import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.LocalItem
import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.history.model.StreamHistoryEntity
import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import java.util.Date
class StreamStatisticsEntry( class StreamStatisticsEntry(
@Embedded @Embedded
val streamEntity: StreamEntity, val streamEntity: StreamEntity,
@ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID) @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)
val streamId: Long, val streamId: Long,
@ColumnInfo(name = STREAM_LATEST_DATE) @ColumnInfo(name = STREAM_LATEST_DATE)
val latestAccessDate: Date, val latestAccessDate: Date,
@ColumnInfo(name = STREAM_WATCH_COUNT) @ColumnInfo(name = STREAM_WATCH_COUNT)
val watchCount: Long val watchCount: Long
) : LocalItem { ) : LocalItem {
fun toStreamInfoItem(): StreamInfoItem { fun toStreamInfoItem(): StreamInfoItem {

View File

@ -7,13 +7,13 @@ import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import androidx.room.Transaction import androidx.room.Transaction
import io.reactivex.Flowable import io.reactivex.Flowable
import java.util.Date
import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.BasicDAO
import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID
import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.extractor.stream.StreamType
import org.schabi.newpipe.extractor.stream.StreamType.AUDIO_LIVE_STREAM import org.schabi.newpipe.extractor.stream.StreamType.AUDIO_LIVE_STREAM
import org.schabi.newpipe.extractor.stream.StreamType.LIVE_STREAM import org.schabi.newpipe.extractor.stream.StreamType.LIVE_STREAM
import java.util.Date
@Dao @Dao
abstract class StreamDAO : BasicDAO<StreamEntity> { abstract class StreamDAO : BasicDAO<StreamEntity> {
@ -98,7 +98,6 @@ abstract class StreamDAO : BasicDAO<StreamEntity> {
if (existentMinimalStream.duration > 0 && newerStream.duration < 0) { if (existentMinimalStream.duration > 0 && newerStream.duration < 0) {
newerStream.duration = existentMinimalStream.duration newerStream.duration = existentMinimalStream.duration
} }
} }
} }
@ -120,21 +119,22 @@ abstract class StreamDAO : BasicDAO<StreamEntity> {
* Minimal entry class used when comparing/updating an existent stream. * Minimal entry class used when comparing/updating an existent stream.
*/ */
internal data class StreamCompareFeed( internal data class StreamCompareFeed(
@ColumnInfo(name = STREAM_ID) @ColumnInfo(name = STREAM_ID)
var uid: Long = 0, var uid: Long = 0,
@ColumnInfo(name = StreamEntity.STREAM_TYPE) @ColumnInfo(name = StreamEntity.STREAM_TYPE)
var streamType: StreamType, var streamType: StreamType,
@ColumnInfo(name = StreamEntity.STREAM_TEXTUAL_UPLOAD_DATE) @ColumnInfo(name = StreamEntity.STREAM_TEXTUAL_UPLOAD_DATE)
var textualUploadDate: String? = null, var textualUploadDate: String? = null,
@ColumnInfo(name = StreamEntity.STREAM_UPLOAD_DATE) @ColumnInfo(name = StreamEntity.STREAM_UPLOAD_DATE)
var uploadDate: Date? = null, var uploadDate: Date? = null,
@ColumnInfo(name = StreamEntity.STREAM_IS_UPLOAD_DATE_APPROXIMATION) @ColumnInfo(name = StreamEntity.STREAM_IS_UPLOAD_DATE_APPROXIMATION)
var isUploadDateApproximation: Boolean? = null, var isUploadDateApproximation: Boolean? = null,
@ColumnInfo(name = StreamEntity.STREAM_DURATION) @ColumnInfo(name = StreamEntity.STREAM_DURATION)
var duration: Long) var duration: Long
)
} }

View File

@ -5,6 +5,9 @@ import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import androidx.room.Index import androidx.room.Index
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import java.io.Serializable
import java.util.Calendar
import java.util.Date
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_TABLE import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_TABLE
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_URL import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_URL
@ -13,9 +16,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfo
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.extractor.stream.StreamType
import org.schabi.newpipe.player.playqueue.PlayQueueItem import org.schabi.newpipe.player.playqueue.PlayQueueItem
import java.io.Serializable
import java.util.Calendar
import java.util.Date
@Entity(tableName = STREAM_TABLE, @Entity(tableName = STREAM_TABLE,
indices = [ indices = [
@ -23,42 +23,42 @@ import java.util.Date
] ]
) )
data class StreamEntity( data class StreamEntity(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = STREAM_ID) @ColumnInfo(name = STREAM_ID)
var uid: Long = 0, var uid: Long = 0,
@ColumnInfo(name = STREAM_SERVICE_ID) @ColumnInfo(name = STREAM_SERVICE_ID)
var serviceId: Int, var serviceId: Int,
@ColumnInfo(name = STREAM_URL) @ColumnInfo(name = STREAM_URL)
var url: String, var url: String,
@ColumnInfo(name = STREAM_TITLE) @ColumnInfo(name = STREAM_TITLE)
var title: String, var title: String,
@ColumnInfo(name = STREAM_TYPE) @ColumnInfo(name = STREAM_TYPE)
var streamType: StreamType, var streamType: StreamType,
@ColumnInfo(name = STREAM_DURATION) @ColumnInfo(name = STREAM_DURATION)
var duration: Long, var duration: Long,
@ColumnInfo(name = STREAM_UPLOADER) @ColumnInfo(name = STREAM_UPLOADER)
var uploader: String, var uploader: String,
@ColumnInfo(name = STREAM_THUMBNAIL_URL) @ColumnInfo(name = STREAM_THUMBNAIL_URL)
var thumbnailUrl: String? = null, var thumbnailUrl: String? = null,
@ColumnInfo(name = STREAM_VIEWS) @ColumnInfo(name = STREAM_VIEWS)
var viewCount: Long? = null, var viewCount: Long? = null,
@ColumnInfo(name = STREAM_TEXTUAL_UPLOAD_DATE) @ColumnInfo(name = STREAM_TEXTUAL_UPLOAD_DATE)
var textualUploadDate: String? = null, var textualUploadDate: String? = null,
@ColumnInfo(name = STREAM_UPLOAD_DATE) @ColumnInfo(name = STREAM_UPLOAD_DATE)
var uploadDate: Date? = null, var uploadDate: Date? = null,
@ColumnInfo(name = STREAM_IS_UPLOAD_DATE_APPROXIMATION) @ColumnInfo(name = STREAM_IS_UPLOAD_DATE_APPROXIMATION)
var isUploadDateApproximation: Boolean? = null var isUploadDateApproximation: Boolean? = null
) : Serializable { ) : Serializable {
@Ignore @Ignore

View File

@ -7,6 +7,8 @@ import io.reactivex.Flowable
import io.reactivex.Maybe import io.reactivex.Maybe
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.util.Calendar
import java.util.Date
import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.MainActivity.DEBUG
import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.NewPipeDatabase
import org.schabi.newpipe.database.feed.model.FeedEntity import org.schabi.newpipe.database.feed.model.FeedEntity
@ -16,8 +18,6 @@ import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.extractor.stream.StreamType
import org.schabi.newpipe.local.subscription.FeedGroupIcon import org.schabi.newpipe.local.subscription.FeedGroupIcon
import java.util.Calendar
import java.util.Date
class FeedDatabaseManager(context: Context) { class FeedDatabaseManager(context: Context) {
private val database = NewPipeDatabase.getInstance(context) private val database = NewPipeDatabase.getInstance(context)
@ -70,8 +70,11 @@ class FeedDatabaseManager(context: Context) {
fun markAsOutdated(subscriptionId: Long) = feedTable fun markAsOutdated(subscriptionId: Long) = feedTable
.setLastUpdatedForSubscription(FeedLastUpdatedEntity(subscriptionId, null)) .setLastUpdatedForSubscription(FeedLastUpdatedEntity(subscriptionId, null))
fun upsertAll(subscriptionId: Long, items: List<StreamInfoItem>, fun upsertAll(
oldestAllowedDate: Date = FEED_OLDEST_ALLOWED_DATE.time) { subscriptionId: Long,
items: List<StreamInfoItem>,
oldestAllowedDate: Date = FEED_OLDEST_ALLOWED_DATE.time
) {
val itemsToInsert = ArrayList<StreamInfoItem>() val itemsToInsert = ArrayList<StreamInfoItem>()
loop@ for (streamItem in items) { loop@ for (streamItem in items) {
val uploadDate = streamItem.uploadDate val uploadDate = streamItem.uploadDate
@ -107,9 +110,9 @@ class FeedDatabaseManager(context: Context) {
if (DEBUG) Log.d(this::class.java.simpleName, "clear() → streamTable.deleteOrphans() → $deletedOrphans") if (DEBUG) Log.d(this::class.java.simpleName, "clear() → streamTable.deleteOrphans() → $deletedOrphans")
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Feed Groups // Feed Groups
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
fun subscriptionIdsForGroup(groupId: Long): Flowable<List<Long>> { fun subscriptionIdsForGroup(groupId: Long): Flowable<List<Long>> {
return feedGroupTable.getSubscriptionIdsFor(groupId) return feedGroupTable.getSubscriptionIdsFor(groupId)
@ -161,6 +164,5 @@ class FeedDatabaseManager(context: Context) {
FeedGroupEntity.GROUP_ALL_ID -> feedTable.oldestSubscriptionUpdateFromAll() FeedGroupEntity.GROUP_ALL_ID -> feedTable.oldestSubscriptionUpdateFromAll()
else -> feedTable.oldestSubscriptionUpdate(groupId) else -> feedTable.oldestSubscriptionUpdate(groupId)
} }
} }
} }

View File

@ -33,6 +33,7 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import icepick.State import icepick.State
import java.util.Calendar
import kotlinx.android.synthetic.main.error_retry.error_button_retry import kotlinx.android.synthetic.main.error_retry.error_button_retry
import kotlinx.android.synthetic.main.error_retry.error_message_view import kotlinx.android.synthetic.main.error_retry.error_message_view
import kotlinx.android.synthetic.main.fragment_feed.empty_state_view import kotlinx.android.synthetic.main.fragment_feed.empty_state_view
@ -50,7 +51,6 @@ import org.schabi.newpipe.local.feed.service.FeedLoadService
import org.schabi.newpipe.report.UserAction import org.schabi.newpipe.report.UserAction
import org.schabi.newpipe.util.AnimationUtils.animateView import org.schabi.newpipe.util.AnimationUtils.animateView
import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.Localization
import java.util.Calendar
class FeedFragment : BaseListFragment<FeedState, Unit>() { class FeedFragment : BaseListFragment<FeedState, Unit>() {
private lateinit var viewModel: FeedViewModel private lateinit var viewModel: FeedViewModel
@ -111,9 +111,9 @@ class FeedFragment : BaseListFragment<FeedState, Unit>() {
} }
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Menu // Menu
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
@ -163,9 +163,9 @@ class FeedFragment : BaseListFragment<FeedState, Unit>() {
activity?.supportActionBar?.subtitle = null activity?.supportActionBar?.subtitle = null
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Handling // Handling
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun showLoading() { override fun showLoading() {
animateView(refresh_root_view, false, 0) animateView(refresh_root_view, false, 0)
@ -272,7 +272,6 @@ class FeedFragment : BaseListFragment<FeedState, Unit>() {
} }
} }
private fun handleErrorState(errorState: FeedState.ErrorState): Boolean { private fun handleErrorState(errorState: FeedState.ErrorState): Boolean {
hideLoading() hideLoading()
errorState.error?.let { errorState.error?.let {
@ -296,9 +295,9 @@ class FeedFragment : BaseListFragment<FeedState, Unit>() {
refresh_text?.text = getString(R.string.feed_oldest_subscription_update, oldestSubscriptionUpdateText) refresh_text?.text = getString(R.string.feed_oldest_subscription_update, oldestSubscriptionUpdateText)
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Load Service Handling // Load Service Handling
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun doInitialLoadLogic() {} override fun doInitialLoadLogic() {}
override fun reloadContent() = triggerUpdate() override fun reloadContent() = triggerUpdate()

View File

@ -1,24 +1,24 @@
package org.schabi.newpipe.local.feed package org.schabi.newpipe.local.feed
import androidx.annotation.StringRes import androidx.annotation.StringRes
import org.schabi.newpipe.extractor.stream.StreamInfoItem
import java.util.Calendar import java.util.Calendar
import org.schabi.newpipe.extractor.stream.StreamInfoItem
sealed class FeedState { sealed class FeedState {
data class ProgressState( data class ProgressState(
val currentProgress: Int = -1, val currentProgress: Int = -1,
val maxProgress: Int = -1, val maxProgress: Int = -1,
@StringRes val progressMessage: Int = 0 @StringRes val progressMessage: Int = 0
) : FeedState() ) : FeedState()
data class LoadedState( data class LoadedState(
val items: List<StreamInfoItem>, val items: List<StreamInfoItem>,
val oldestUpdate: Calendar? = null, val oldestUpdate: Calendar? = null,
val notLoadedCount: Long, val notLoadedCount: Long,
val itemsErrors: List<Throwable> = emptyList() val itemsErrors: List<Throwable> = emptyList()
) : FeedState() ) : FeedState()
data class ErrorState( data class ErrorState(
val error: Throwable? = null val error: Throwable? = null
) : FeedState() ) : FeedState()
} }

View File

@ -9,6 +9,9 @@ import io.reactivex.Flowable
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Function4 import io.reactivex.functions.Function4
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.util.Calendar
import java.util.Date
import java.util.concurrent.TimeUnit
import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import org.schabi.newpipe.local.feed.service.FeedEventManager import org.schabi.newpipe.local.feed.service.FeedEventManager
@ -17,9 +20,6 @@ import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent
import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT
import java.util.Calendar
import java.util.Date
import java.util.concurrent.TimeUnit
class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() { class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() {
class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory { class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory {

View File

@ -3,8 +3,8 @@ package org.schabi.newpipe.local.feed.service
import androidx.annotation.StringRes import androidx.annotation.StringRes
import io.reactivex.Flowable import io.reactivex.Flowable
import io.reactivex.processors.BehaviorProcessor import io.reactivex.processors.BehaviorProcessor
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent
object FeedEventManager { object FeedEventManager {
private var processor: BehaviorProcessor<Event> = BehaviorProcessor.create() private var processor: BehaviorProcessor<Event> = BehaviorProcessor.create()
@ -34,5 +34,4 @@ object FeedEventManager {
data class SuccessResultEvent(val itemsErrors: List<Throwable> = emptyList()) : Event() data class SuccessResultEvent(val itemsErrors: List<Throwable> = emptyList()) : Event()
data class ErrorResultEvent(val error: Throwable) : Event() data class ErrorResultEvent(val error: Throwable) : Event()
} }
} }

View File

@ -40,6 +40,11 @@ import io.reactivex.functions.Consumer
import io.reactivex.functions.Function import io.reactivex.functions.Function
import io.reactivex.processors.PublishProcessor import io.reactivex.processors.PublishProcessor
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.io.IOException
import java.util.Calendar
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
import org.reactivestreams.Subscriber import org.reactivestreams.Subscriber
import org.reactivestreams.Subscription import org.reactivestreams.Subscription
import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.MainActivity.DEBUG
@ -57,11 +62,6 @@ import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent
import org.schabi.newpipe.local.subscription.SubscriptionManager import org.schabi.newpipe.local.subscription.SubscriptionManager
import org.schabi.newpipe.util.ExceptionUtils import org.schabi.newpipe.util.ExceptionUtils
import org.schabi.newpipe.util.ExtractorHelper import org.schabi.newpipe.util.ExtractorHelper
import java.io.IOException
import java.util.Calendar
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
class FeedLoadService : Service() { class FeedLoadService : Service() {
companion object { companion object {
@ -96,9 +96,9 @@ class FeedLoadService : Service() {
private var disposables = CompositeDisposable() private var disposables = CompositeDisposable()
private var notificationUpdater = PublishProcessor.create<String>() private var notificationUpdater = PublishProcessor.create<String>()
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Lifecycle // Lifecycle
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -153,9 +153,9 @@ class FeedLoadService : Service() {
return null return null
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Loading & Handling // Loading & Handling
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private class RequestException(val subscriptionId: Long, message: String, cause: Throwable) : Exception(message, cause) { private class RequestException(val subscriptionId: Long, message: String, cause: Throwable) : Exception(message, cause) {
companion object { companion object {
@ -314,7 +314,6 @@ class FeedLoadService : Service() {
feedResultsHolder.addErrors(RequestException.wrapList(subscriptionId, info)) feedResultsHolder.addErrors(RequestException.wrapList(subscriptionId, info))
feedDatabaseManager.markAsOutdated(subscriptionId) feedDatabaseManager.markAsOutdated(subscriptionId)
} }
} else if (notification.isOnError) { } else if (notification.isOnError) {
val error = notification.error!! val error = notification.error!!
feedResultsHolder.addError(error) feedResultsHolder.addError(error)
@ -327,7 +326,6 @@ class FeedLoadService : Service() {
} }
} }
private val errorHandlingConsumer: Consumer<Notification<Pair<Long, ListInfo<StreamInfoItem>>>> private val errorHandlingConsumer: Consumer<Notification<Pair<Long, ListInfo<StreamInfoItem>>>>
get() = Consumer { get() = Consumer {
if (it.isOnError) { if (it.isOnError) {
@ -356,9 +354,9 @@ class FeedLoadService : Service() {
broadcastProgress() broadcastProgress()
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Notification // Notification
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private lateinit var notificationManager: NotificationManagerCompat private lateinit var notificationManager: NotificationManagerCompat
private lateinit var notificationBuilder: NotificationCompat.Builder private lateinit var notificationBuilder: NotificationCompat.Builder
@ -414,9 +412,9 @@ class FeedLoadService : Service() {
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()) notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build())
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Notification Actions // Notification Actions
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private lateinit var broadcastReceiver: BroadcastReceiver private lateinit var broadcastReceiver: BroadcastReceiver
private val cancelSignal = AtomicBoolean() private val cancelSignal = AtomicBoolean()
@ -432,18 +430,18 @@ class FeedLoadService : Service() {
registerReceiver(broadcastReceiver, IntentFilter(ACTION_CANCEL)) registerReceiver(broadcastReceiver, IntentFilter(ACTION_CANCEL))
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Error handling // Error handling
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private fun handleError(error: Throwable) { private fun handleError(error: Throwable) {
postEvent(ErrorResultEvent(error)) postEvent(ErrorResultEvent(error))
stopService() stopService()
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Results Holder // Results Holder
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
class ResultsHolder { class ResultsHolder {
/** /**

View File

@ -7,15 +7,15 @@ import org.schabi.newpipe.R
import org.schabi.newpipe.util.ThemeHelper import org.schabi.newpipe.util.ThemeHelper
enum class FeedGroupIcon( enum class FeedGroupIcon(
/** /**
* The id that will be used to store and retrieve icons from some persistent storage (e.g. DB). * The id that will be used to store and retrieve icons from some persistent storage (e.g. DB).
*/ */
val id: Int, val id: Int,
/** /**
* The attribute that points to a drawable resource. "R.attr" is used here to support multiple themes. * The attribute that points to a drawable resource. "R.attr" is used here to support multiple themes.
*/ */
@AttrRes val drawableResourceAttr: Int @AttrRes val drawableResourceAttr: Int
) { ) {
ALL(0, R.attr.ic_asterisk), ALL(0, R.attr.ic_asterisk),
MUSIC(1, R.attr.ic_music_note), MUSIC(1, R.attr.ic_music_note),
@ -60,4 +60,4 @@ enum class FeedGroupIcon(
fun getDrawableRes(context: Context): Int { fun getDrawableRes(context: Context): Int {
return ThemeHelper.resolveResourceIdFromAttr(context, drawableResourceAttr) return ThemeHelper.resolveResourceIdFromAttr(context, drawableResourceAttr)
} }
} }

View File

@ -29,6 +29,12 @@ import com.xwray.groupie.Section
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import icepick.State import icepick.State
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import kotlin.math.floor
import kotlin.math.max
import kotlinx.android.synthetic.main.dialog_title.view.itemAdditionalDetails import kotlinx.android.synthetic.main.dialog_title.view.itemAdditionalDetails
import kotlinx.android.synthetic.main.dialog_title.view.itemTitleView import kotlinx.android.synthetic.main.dialog_title.view.itemTitleView
import kotlinx.android.synthetic.main.fragment_subscription.items_list import kotlinx.android.synthetic.main.fragment_subscription.items_list
@ -62,12 +68,6 @@ import org.schabi.newpipe.util.NavigationHelper
import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.OnClickGesture
import org.schabi.newpipe.util.ShareUtils import org.schabi.newpipe.util.ShareUtils
import org.schabi.newpipe.util.ThemeHelper import org.schabi.newpipe.util.ThemeHelper
import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import kotlin.math.floor
import kotlin.math.max
class SubscriptionFragment : BaseStateFragment<SubscriptionState>() { class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
private lateinit var viewModel: SubscriptionViewModel private lateinit var viewModel: SubscriptionViewModel
@ -97,9 +97,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
setHasOptionsMenu(true) setHasOptionsMenu(true)
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Fragment LifeCycle // Fragment LifeCycle
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -143,9 +143,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
disposables.dispose() disposables.dispose()
} }
////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
// Menu // Menu
////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
@ -173,7 +173,6 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
importExportItem.isExpanded = false importExportItem.isExpanded = false
importExportItem.notifyChanged(FeedImportExportItem.REFRESH_EXPANDED_STATUS) importExportItem.notifyChanged(FeedImportExportItem.REFRESH_EXPANDED_STATUS)
} }
} }
} }
@ -221,9 +220,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
} }
} }
////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
// Fragment Views // Fragment Views
////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////
private fun setupInitialLayout() { private fun setupInitialLayout() {
Section().apply { Section().apply {
@ -266,7 +265,6 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
{ onExportSelected() }, { onExportSelected() },
importExportItemExpandedState ?: false) importExportItemExpandedState ?: false)
groupAdapter.add(Section(importExportItem, listOf(subscriptionsSection))) groupAdapter.add(Section(importExportItem, listOf(subscriptionsSection)))
} }
override fun initViews(rootView: View, savedInstanceState: Bundle?) { override fun initViews(rootView: View, savedInstanceState: Bundle?) {
@ -389,9 +387,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
items_list.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } items_list.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) }
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Contract // Contract
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun showLoading() { override fun showLoading() {
super.showLoading() super.showLoading()
@ -403,9 +401,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
animateView(items_list, true, 200) animateView(items_list, true, 200)
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Fragment Error Handling // Fragment Error Handling
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
override fun onError(exception: Throwable): Boolean { override fun onError(exception: Throwable): Boolean {
if (super.onError(exception)) return true if (super.onError(exception)) return true
@ -414,9 +412,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
return true return true
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Grid Mode // Grid Mode
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// TODO: Move these out of this class, as it can be reused // TODO: Move these out of this class, as it can be reused
@ -428,8 +426,8 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
getString(R.string.list_view_mode_auto_key) -> { getString(R.string.list_view_mode_auto_key) -> {
val configuration = resources.configuration val configuration = resources.configuration
(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
&& configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE)) configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE))
} }
getString(R.string.list_view_mode_grid_key) -> true getString(R.string.list_view_mode_grid_key) -> true
else -> false else -> false

View File

@ -6,11 +6,11 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.xwray.groupie.Group import com.xwray.groupie.Group
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.feed.FeedDatabaseManager
import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.ChannelItem
import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem
import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT
import java.util.concurrent.TimeUnit
class SubscriptionViewModel(application: Application) : AndroidViewModel(application) { class SubscriptionViewModel(application: Application) : AndroidViewModel(application) {
private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application) private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application)

View File

@ -32,4 +32,4 @@ class FeedGroupCarouselDecoration(context: Context) : RecyclerView.ItemDecoratio
outRect.right = marginStartEnd outRect.right = marginStartEnd
} }
} }
} }

View File

@ -22,6 +22,7 @@ import com.xwray.groupie.Section
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import icepick.Icepick import icepick.Icepick
import icepick.State import icepick.State
import java.io.Serializable
import kotlinx.android.synthetic.main.dialog_feed_group_create.cancel_button import kotlinx.android.synthetic.main.dialog_feed_group_create.cancel_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.confirm_button import kotlinx.android.synthetic.main.dialog_feed_group_create.confirm_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.delete_button import kotlinx.android.synthetic.main.dialog_feed_group_create.delete_button
@ -51,7 +52,6 @@ import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem
import org.schabi.newpipe.local.subscription.item.PickerIconItem import org.schabi.newpipe.local.subscription.item.PickerIconItem
import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem
import org.schabi.newpipe.util.ThemeHelper import org.schabi.newpipe.util.ThemeHelper
import java.io.Serializable
class FeedGroupDialog : DialogFragment() { class FeedGroupDialog : DialogFragment() {
private lateinit var viewModel: FeedGroupDialogViewModel private lateinit var viewModel: FeedGroupDialogViewModel
@ -137,9 +137,9 @@ class FeedGroupDialog : DialogFragment() {
showScreen(currentScreen) showScreen(currentScreen)
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Setup // Setup
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private fun setupListeners() { private fun setupListeners() {
delete_button.setOnClickListener { showScreen(DeleteScreen) } delete_button.setOnClickListener { showScreen(DeleteScreen) }
@ -311,9 +311,9 @@ class FeedGroupDialog : DialogFragment() {
} }
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Screen Selector // Screen Selector
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private fun showScreen(screen: ScreenState) { private fun showScreen(screen: ScreenState) {
currentScreen = screen currentScreen = screen
@ -347,9 +347,9 @@ class FeedGroupDialog : DialogFragment() {
} }
} }
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
// Utils // Utils
/////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
private fun hideKeyboard() { private fun hideKeyboard() {
val inputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val inputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

View File

@ -16,7 +16,6 @@ import org.schabi.newpipe.local.feed.FeedDatabaseManager
import org.schabi.newpipe.local.subscription.FeedGroupIcon import org.schabi.newpipe.local.subscription.FeedGroupIcon
import org.schabi.newpipe.local.subscription.SubscriptionManager import org.schabi.newpipe.local.subscription.SubscriptionManager
class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() { class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() {
class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory { class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@ -84,4 +83,4 @@ class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long =
object ProcessingEvent : DialogEvent() object ProcessingEvent : DialogEvent()
object SuccessEvent : DialogEvent() object SuccessEvent : DialogEvent()
} }
} }

View File

@ -16,6 +16,7 @@ import com.xwray.groupie.TouchCallback
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import icepick.Icepick import icepick.Icepick
import icepick.State import icepick.State
import java.util.Collections
import kotlinx.android.synthetic.main.dialog_feed_group_reorder.confirm_button import kotlinx.android.synthetic.main.dialog_feed_group_reorder.confirm_button
import kotlinx.android.synthetic.main.dialog_feed_group_reorder.feed_groups_list import kotlinx.android.synthetic.main.dialog_feed_group_reorder.feed_groups_list
import org.schabi.newpipe.R import org.schabi.newpipe.R
@ -24,7 +25,6 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewMo
import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.SuccessEvent import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.SuccessEvent
import org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem import org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem
import org.schabi.newpipe.util.ThemeHelper import org.schabi.newpipe.util.ThemeHelper
import java.util.Collections
class FeedGroupReorderDialog : DialogFragment() { class FeedGroupReorderDialog : DialogFragment() {
private lateinit var viewModel: FeedGroupReorderDialogViewModel private lateinit var viewModel: FeedGroupReorderDialogViewModel
@ -93,8 +93,11 @@ class FeedGroupReorderDialog : DialogFragment() {
private fun getItemTouchCallback(): SimpleCallback { private fun getItemTouchCallback(): SimpleCallback {
return object : TouchCallback() { return object : TouchCallback() {
override fun onMove(recyclerView: RecyclerView, source: RecyclerView.ViewHolder, override fun onMove(
target: RecyclerView.ViewHolder): Boolean { recyclerView: RecyclerView,
source: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val sourceIndex = source.adapterPosition val sourceIndex = source.adapterPosition
val targetIndex = target.adapterPosition val targetIndex = target.adapterPosition

View File

@ -49,4 +49,4 @@ class FeedGroupReorderDialogViewModel(application: Application) : AndroidViewMod
object ProcessingEvent : DialogEvent() object ProcessingEvent : DialogEvent()
object SuccessEvent : DialogEvent() object SuccessEvent : DialogEvent()
} }
} }

View File

@ -14,12 +14,11 @@ import org.schabi.newpipe.util.ImageDisplayConstants
import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.Localization
import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.OnClickGesture
class ChannelItem( class ChannelItem(
private val infoItem: ChannelInfoItem, private val infoItem: ChannelInfoItem,
private val subscriptionId: Long = -1L, private val subscriptionId: Long = -1L,
var itemVersion: ItemVersion = ItemVersion.NORMAL, var itemVersion: ItemVersion = ItemVersion.NORMAL,
var gesturesListener: OnClickGesture<ChannelInfoItem>? = null var gesturesListener: OnClickGesture<ChannelInfoItem>? = null
) : Item() { ) : Item() {
override fun getId(): Long = if (subscriptionId == -1L) super.getId() else subscriptionId override fun getId(): Long = if (subscriptionId == -1L) super.getId() else subscriptionId

View File

@ -7,4 +7,4 @@ import org.schabi.newpipe.R
class EmptyPlaceholderItem : Item() { class EmptyPlaceholderItem : Item() {
override fun getLayout(): Int = R.layout.list_empty_view override fun getLayout(): Int = R.layout.list_empty_view
override fun bind(viewHolder: GroupieViewHolder, position: Int) {} override fun bind(viewHolder: GroupieViewHolder, position: Int) {}
} }

View File

@ -7,4 +7,4 @@ import org.schabi.newpipe.R
class FeedGroupAddItem : Item() { class FeedGroupAddItem : Item() {
override fun getLayout(): Int = R.layout.feed_group_add_new_item override fun getLayout(): Int = R.layout.feed_group_add_new_item
override fun bind(viewHolder: GroupieViewHolder, position: Int) {} override fun bind(viewHolder: GroupieViewHolder, position: Int) {}
} }

View File

@ -9,9 +9,9 @@ import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.local.subscription.FeedGroupIcon import org.schabi.newpipe.local.subscription.FeedGroupIcon
data class FeedGroupCardItem( data class FeedGroupCardItem(
val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,
val name: String, val name: String,
val icon: FeedGroupIcon val icon: FeedGroupIcon
) : Item() { ) : Item() {
constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon) constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon)

View File

@ -14,13 +14,13 @@ import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.local.subscription.FeedGroupIcon import org.schabi.newpipe.local.subscription.FeedGroupIcon
data class FeedGroupReorderItem( data class FeedGroupReorderItem(
val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,
val name: String, val name: String,
val icon: FeedGroupIcon, val icon: FeedGroupIcon,
val dragCallback: ItemTouchHelper val dragCallback: ItemTouchHelper
) : Item() { ) : Item() {
constructor (feedGroupEntity: FeedGroupEntity, dragCallback: ItemTouchHelper) constructor (feedGroupEntity: FeedGroupEntity, dragCallback: ItemTouchHelper) :
: this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon, dragCallback) this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon, dragCallback)
override fun getId(): Long { override fun getId(): Long {
return when (groupId) { return when (groupId) {

View File

@ -23,10 +23,10 @@ import org.schabi.newpipe.util.ThemeHelper
import org.schabi.newpipe.views.CollapsibleView import org.schabi.newpipe.views.CollapsibleView
class FeedImportExportItem( class FeedImportExportItem(
val onImportPreviousSelected: () -> Unit, val onImportPreviousSelected: () -> Unit,
val onImportFromServiceSelected: (Int) -> Unit, val onImportFromServiceSelected: (Int) -> Unit,
val onExportSelected: () -> Unit, val onExportSelected: () -> Unit,
var isExpanded: Boolean = false var isExpanded: Boolean = false
) : Item() { ) : Item() {
companion object { companion object {
const val REFRESH_EXPANDED_STATUS = 123 const val REFRESH_EXPANDED_STATUS = 123
@ -108,7 +108,6 @@ class FeedImportExportItem(
} catch (e: ExtractionException) { } catch (e: ExtractionException) {
throw RuntimeException("Services array contains an entry that it's not a valid service name ($serviceName)", e) throw RuntimeException("Services array contains an entry that it's not a valid service name ($serviceName)", e)
} }
} }
} }

View File

@ -11,11 +11,11 @@ import kotlinx.android.synthetic.main.header_with_menu_item.header_title
import org.schabi.newpipe.R import org.schabi.newpipe.R
class HeaderWithMenuItem( class HeaderWithMenuItem(
val title: String, val title: String,
@DrawableRes val itemIcon: Int = 0, @DrawableRes val itemIcon: Int = 0,
var showMenuItem: Boolean = true, var showMenuItem: Boolean = true,
private val onClickListener: (() -> Unit)? = null, private val onClickListener: (() -> Unit)? = null,
private val menuItemOnClickListener: (() -> Unit)? = null private val menuItemOnClickListener: (() -> Unit)? = null
) : Item() { ) : Item() {
companion object { companion object {
const val PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM = 1 const val PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM = 1

View File

@ -43,4 +43,4 @@ class DurationListPreference : ListPreference {
entries = newEntryTitles entries = newEntryTitles
} }
} }

View File

@ -79,4 +79,4 @@ class ExceptionUtils {
return false return false
} }
} }
} }

View File

@ -24,4 +24,4 @@ class UrlFinder {
return null return null
} }
} }
} }

View File

@ -27,4 +27,4 @@ class FeedGroupIconTest {
assertTrue("Repeated icon (current item: ${groupIcon.name} - ${groupIcon.id})", added) assertTrue("Repeated icon (current item: ${groupIcon.name} - ${groupIcon.id})", added)
} }
} }
} }

View File

@ -1,14 +1,14 @@
package org.schabi.newpipe.util package org.schabi.newpipe.util
import java.io.IOException
import java.io.InterruptedIOException
import java.net.SocketException
import javax.net.ssl.SSLException
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import org.schabi.newpipe.util.ExceptionUtils.Companion.hasAssignableCause import org.schabi.newpipe.util.ExceptionUtils.Companion.hasAssignableCause
import org.schabi.newpipe.util.ExceptionUtils.Companion.hasExactCause import org.schabi.newpipe.util.ExceptionUtils.Companion.hasExactCause
import java.io.IOException
import java.io.InterruptedIOException
import java.net.SocketException
import javax.net.ssl.SSLException
class ExceptionUtilsTest { class ExceptionUtilsTest {
@Test fun `assignable causes`() { @Test fun `assignable causes`() {
@ -66,4 +66,4 @@ class ExceptionUtilsTest {
assertFalse(hasExactCause(Exception(IllegalStateException(Exception(SocketException()))), IOException::class.java)) assertFalse(hasExactCause(Exception(IllegalStateException(Exception(SocketException()))), IOException::class.java))
assertFalse(hasExactCause(Exception(IllegalStateException(Exception(InterruptedIOException()))), IOException::class.java)) assertFalse(hasExactCause(Exception(IllegalStateException(Exception(InterruptedIOException()))), IOException::class.java))
} }
} }

View File

@ -96,4 +96,4 @@ class UrlFinderTest {
assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ",
UrlFinder.firstUrlFromInput("https://www.youtube.com/watch?v=dQw4w9WgXcQ\"Not PartOfTheUrl")) UrlFinder.firstUrlFromInput("https://www.youtube.com/watch?v=dQw4w9WgXcQ\"Not PartOfTheUrl"))
} }
} }