mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-22 19:12:45 +01:00
Auto-format using Ktlint
This commit is contained in:
parent
ff7344438b
commit
b0415a5289
@ -116,4 +116,4 @@ class AppDatabaseTest {
|
|||||||
testHelper.closeWhenFinished(database)
|
testHelper.closeWhenFinished(database)
|
||||||
return database
|
return database
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
/**
|
/**
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -32,4 +32,4 @@ class FeedGroupCarouselDecoration(context: Context) : RecyclerView.ItemDecoratio
|
|||||||
outRect.right = marginStartEnd
|
outRect.right = marginStartEnd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -49,4 +49,4 @@ class FeedGroupReorderDialogViewModel(application: Application) : AndroidViewMod
|
|||||||
object ProcessingEvent : DialogEvent()
|
object ProcessingEvent : DialogEvent()
|
||||||
object SuccessEvent : DialogEvent()
|
object SuccessEvent : DialogEvent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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) {}
|
||||||
}
|
}
|
||||||
|
@ -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) {}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -43,4 +43,4 @@ class DurationListPreference : ListPreference {
|
|||||||
|
|
||||||
entries = newEntryTitles
|
entries = newEntryTitles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,4 +79,4 @@ class ExceptionUtils {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,4 +24,4 @@ class UrlFinder {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user