Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.core.text.toHtml
import androidx.core.text.toSpanned
import com.google.gson.annotations.SerializedName
import org.mtransit.android.commons.ColorUtils
import org.mtransit.android.commons.Constants
import org.mtransit.android.commons.HtmlUtils
import org.mtransit.android.commons.LocaleUtils
import org.mtransit.android.commons.MTLog
Expand All @@ -20,6 +21,7 @@ import org.mtransit.android.commons.PreferenceUtils
import org.mtransit.android.commons.R
import org.mtransit.android.commons.SqlUtils
import org.mtransit.android.commons.StringUtils
import org.mtransit.android.commons.StringUtils.EMPTY
import org.mtransit.android.commons.TimeUtils
import org.mtransit.android.commons.UriUtils
import org.mtransit.android.commons.data.News
Expand Down Expand Up @@ -251,7 +253,7 @@ class InstagramNewsProvider : NewsProvider() {
val lastUpdateInMs =
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_MS, 0L)
val lastUpdateLang =
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_LANG, StringUtils.EMPTY)
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_LANG, EMPTY)
val minUpdateMs = newsMaxValidityInMs.coerceAtMost(getNewsValidityInMs(inFocus))
val nowInMs = TimeUtils.currentTimeMillis()
if (lastUpdateInMs + minUpdateMs > nowInMs && LocaleUtils.getDefaultLanguage() == lastUpdateLang) {
Expand All @@ -269,7 +271,7 @@ class InstagramNewsProvider : NewsProvider() {
val lastUpdateInMs =
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_MS, 0L)
val lastUpdateLang =
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_LANG, StringUtils.EMPTY)
PreferenceUtils.getPrefLcl(context, PREF_KEY_AGENCY_LAST_UPDATE_LANG, EMPTY)
if (lastUpdateInMs > lastLastUpdateInMs // IF new more recent last update DO
&& LocaleUtils.getDefaultLanguage() == lastUpdateLang
) {
Expand Down Expand Up @@ -372,6 +374,7 @@ class InstagramNewsProvider : NewsProvider() {
val targetUUID = _userNamesTarget.getOrNull(i)?.takeIf { it.isNotBlank() }
?: _targetAuthority.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyAuthority(context)
?: EMPTY.takeIf { context.packageName == Constants.MAIN_APP_PACKAGE_NAME } // target all allowed for main app
Comment thread
mmathieum marked this conversation as resolved.
?: run {
MTLog.w(this, "SKIP loading '$username': no target UUID!")
return
Expand Down Expand Up @@ -435,7 +438,7 @@ class InstagramNewsProvider : NewsProvider() {
mediaToCaptions
?.map { edge -> edge?.node?.text }
?.first { text -> text?.isNotEmpty() == true }
?: StringUtils.EMPTY
?: EMPTY
val createdAtInMs = if (timelineMedia.takenAtTimestampInSec != null) {
TimeUnit.SECONDS.toMillis(timelineMedia.takenAtTimestampInSec)
} else {
Expand Down Expand Up @@ -521,7 +524,7 @@ class InstagramNewsProvider : NewsProvider() {
return listOf(
timelineMediaNode.displayUrl
?: timelineMediaNode.thumbnailSrc
?: StringUtils.EMPTY
?: EMPTY
)
}

Expand Down Expand Up @@ -690,7 +693,7 @@ class InstagramNewsProvider : NewsProvider() {
PreferenceUtils.savePrefLclSync(
context,
PREF_KEY_AGENCY_LAST_UPDATE_LANG,
StringUtils.EMPTY,
EMPTY,
)
initAllDbTables(db)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.core.content.ContentProviderCompat
import com.google.gson.GsonBuilder
import org.mtransit.android.commons.BuildConfig
import org.mtransit.android.commons.ColorUtils
import org.mtransit.android.commons.Constants
import org.mtransit.android.commons.HtmlUtils
import org.mtransit.android.commons.KeysIds
import org.mtransit.android.commons.LocaleUtils
Expand All @@ -22,6 +23,7 @@ import org.mtransit.android.commons.R
import org.mtransit.android.commons.SecureStringUtils
import org.mtransit.android.commons.SqlUtils
import org.mtransit.android.commons.StringUtils
import org.mtransit.android.commons.StringUtils.EMPTY
import org.mtransit.android.commons.TimeUtils
import org.mtransit.android.commons.UriUtils
import org.mtransit.android.commons.data.News
Expand Down Expand Up @@ -118,6 +120,7 @@ class TwitterNewsProvider : NewsProvider() {
)

// https://developer.x.com/en/docs/x-api/data-dictionary/object-model/user
@Suppress("SpellCheckingInspection")
private val USER_FIELDS = setOf(
"id", // like "329993645"
"name", // like "MonTransit"
Expand Down Expand Up @@ -337,10 +340,10 @@ class TwitterNewsProvider : NewsProvider() {
private fun updateAgencyNewsDataIfRequired(context: Context, inFocus: Boolean) {
if (FORCE_REFRESH) {
TwitterStorage.saveLastUpdateMs(context, 0L) // force refresh
TwitterStorage.saveLastUpdateLang(context, StringUtils.EMPTY) // force refresh
TwitterStorage.saveLastUpdateLang(context, EMPTY) // force refresh
}
val lastUpdateInMs = TwitterStorage.getLastUpdateMs(context, 0L)
val lastUpdateLang = TwitterStorage.getLastUpdateLang(context, StringUtils.EMPTY)
val lastUpdateLang = TwitterStorage.getLastUpdateLang(context, EMPTY)
val minUpdateMs = newsMaxValidityInMs.coerceAtMost(getNewsValidityInMs(inFocus))
val nowInMs = TimeUtils.currentTimeMillis()
if (lastUpdateInMs + minUpdateMs > nowInMs && LocaleUtils.getDefaultLanguage() == lastUpdateLang) {
Expand All @@ -357,7 +360,7 @@ class TwitterNewsProvider : NewsProvider() {
inFocus: Boolean,
) {
val lastUpdateInMs = TwitterStorage.getLastUpdateMs(context, 0L)
val lastUpdateLang = TwitterStorage.getLastUpdateLang(context, StringUtils.EMPTY)
val lastUpdateLang = TwitterStorage.getLastUpdateLang(context, EMPTY)
if (lastUpdateInMs > lastLastUpdateInMs // IF new more recent last update DO
&& LocaleUtils.getDefaultLanguage() == lastUpdateLang
) {
Expand All @@ -381,14 +384,15 @@ class TwitterNewsProvider : NewsProvider() {
@RequiresApi(Build.VERSION_CODES.O)
private fun updateAllAgencyNewsDataFromWWW(context: Context, deleteAllRequired: Boolean) {
var deleteAllDone = false
@Suppress("SimplifyBooleanWithConstants")
if (deleteAllRequired || FORCE_REFRESH) {
deleteAllAgencyNewsData()
deleteAllDone = true
}
val newNews: ArrayList<News>? = loadAgencyNewsDataFromWWW(context)
if (newNews != null) { // empty is OK
val nowInMs = TimeUtils.currentTimeMillis()
@Suppress("KotlinConstantConditions", "KotlinUnreachableCode") // incremental data load, never delete old data
@Suppress("KotlinConstantConditions", "KotlinUnreachableCode", "SimplifyBooleanWithConstants") // incremental data load, never delete old data
if (false && !deleteAllDone) {
deleteAllAgencyNewsData()
}
Expand Down Expand Up @@ -477,7 +481,7 @@ class TwitterNewsProvider : NewsProvider() {
}
// 1- load user ID
val userId = _userNamesId.getOrNull(i)?.takeIf { it.isNotBlank() } // provided (optional)
?: TwitterStorage.getUserNameId(context, username, StringUtils.EMPTY)
?: TwitterStorage.getUserNameId(context, username, EMPTY)
.takeIf { it.isNotBlank() }
?: loadUserNameIdFromApi(twitterApi, token, username)
.also { userId ->
Expand All @@ -493,9 +497,9 @@ class TwitterNewsProvider : NewsProvider() {
val newLastUpdateInMs = TimeUtils.currentTimeMillis()
MTLog.i(this, "Loading '@$username' posts from '$AGENCY_SOURCE_LABEL'...")
if (FORCE_REFRESH) {
TwitterStorage.saveUserNameSinceId(context, username, StringUtils.EMPTY) // reset
TwitterStorage.saveUserNameSinceId(context, username, EMPTY) // reset
}
val sinceId = TwitterStorage.getUserNameSinceId(context, username, StringUtils.EMPTY).takeIf { it.isNotBlank() }
val sinceId = TwitterStorage.getUserNameSinceId(context, username, EMPTY).takeIf { it.isNotBlank() }
// FIXME WARNING: The following parameters are not supported on all ANDROID OS versions
val startTime: Date? = null
// val startTime: OffsetDateTime? = OffsetDateTime.now().minusDays(31L) // format issue???
Expand Down Expand Up @@ -524,6 +528,7 @@ class TwitterNewsProvider : NewsProvider() {
val targetUUID = _userNamesTarget.getOrNull(i)?.takeIf { it.isNotBlank() }
?: _targetAuthority.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyAuthority(context)
?: EMPTY.takeIf { context.packageName == Constants.MAIN_APP_PACKAGE_NAME } // target all allowed for main app
Comment thread
mmathieum marked this conversation as resolved.
?: run {
MTLog.w(this, "SKIP loading '$username': no target UUID!")
return
Expand Down Expand Up @@ -598,6 +603,7 @@ class TwitterNewsProvider : NewsProvider() {
return null
}
val author = includedExpansions?.users?.find { it.id == tweet.authorId }
@Suppress("SpellCheckingInspection")
val authorUserName = author?.username ?: userName // "montransit"
val authorName = author?.name ?: authorUserName // "MonTransit"
val userProfileImageUrl = author?.profileImageUrl ?: ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.annotation.StringRes
import androidx.core.content.ContentProviderCompat
import com.google.gson.GsonBuilder
import org.mtransit.android.commons.ColorUtils
import org.mtransit.android.commons.Constants
import org.mtransit.android.commons.HtmlUtils
import org.mtransit.android.commons.KeysIds
import org.mtransit.android.commons.LocaleUtils
Expand All @@ -17,7 +18,7 @@ import org.mtransit.android.commons.NetworkUtils
import org.mtransit.android.commons.R
import org.mtransit.android.commons.SecureStringUtils
import org.mtransit.android.commons.SqlUtils
import org.mtransit.android.commons.StringUtils
import org.mtransit.android.commons.StringUtils.EMPTY
import org.mtransit.android.commons.TimeUtils
import org.mtransit.android.commons.UriUtils
import org.mtransit.android.commons.data.News
Expand All @@ -27,10 +28,10 @@ import org.mtransit.android.commons.provider.news.NewsProvider
import org.mtransit.android.commons.provider.news.NewsProviderContract
import org.mtransit.android.commons.provider.news.NewsTextFormatter
import org.mtransit.android.commons.provider.news.youtube.YouTubeDateAdapter
import org.mtransit.android.commons.provider.news.youtube.YouTubeV3Api
import org.mtransit.android.commons.provider.news.youtube.YouTubeNewsDbHelper
import org.mtransit.android.commons.provider.news.youtube.YouTubeStorage
import org.mtransit.android.commons.provider.news.youtube.YouTubeUtils
import org.mtransit.android.commons.provider.news.youtube.YouTubeV3Api
import retrofit2.create
import java.io.IOException
import java.util.Date
Expand Down Expand Up @@ -171,6 +172,7 @@ class YouTubeNewsProvider : NewsProvider() {
R.array.youtube_channels_severity
).toList()
}

@get:IntegerRes
private val _userNamesSeverityDefaultResId: Int get() = R.integer.news_provider_severity_info_agency

Expand All @@ -179,6 +181,7 @@ class YouTubeNewsProvider : NewsProvider() {
R.array.youtube_channels_noteworthy
).toList().map { it.toLong() }
}

@get:StringRes
private val _userNamesNoteworthyDefaultResId: Int get() = R.string.news_provider_noteworthy_long_term

Expand Down Expand Up @@ -291,10 +294,10 @@ class YouTubeNewsProvider : NewsProvider() {
private fun updateAgencyNewsDataIfRequired(context: Context, inFocus: Boolean) {
if (FORCE_REFRESH) {
YouTubeStorage.saveLastUpdateMs(context, 0L) // force refresh
YouTubeStorage.saveLastUpdateLang(context, StringUtils.EMPTY) // force refresh
YouTubeStorage.saveLastUpdateLang(context, EMPTY) // force refresh
}
val lastUpdateInMs = YouTubeStorage.getLastUpdateMs(context, 0L)
val lastUpdateLang = YouTubeStorage.getLastUpdateLang(context, StringUtils.EMPTY)
val lastUpdateLang = YouTubeStorage.getLastUpdateLang(context, EMPTY)
val minUpdateMs = newsMaxValidityInMs.coerceAtMost(getNewsValidityInMs(inFocus))
val nowInMs = TimeUtils.currentTimeMillis()
if (lastUpdateInMs + minUpdateMs > nowInMs && LocaleUtils.getDefaultLanguage() == lastUpdateLang) {
Expand All @@ -310,7 +313,7 @@ class YouTubeNewsProvider : NewsProvider() {
inFocus: Boolean,
) {
val lastUpdateInMs = YouTubeStorage.getLastUpdateMs(context, 0L)
val lastUpdateLang = YouTubeStorage.getLastUpdateLang(context, StringUtils.EMPTY)
val lastUpdateLang = YouTubeStorage.getLastUpdateLang(context, EMPTY)
if (lastUpdateInMs > lastLastUpdateInMs // IF new more recent last update DO
&& LocaleUtils.getDefaultLanguage() == lastUpdateLang
) {
Expand All @@ -333,6 +336,7 @@ class YouTubeNewsProvider : NewsProvider() {

private fun updateAllAgencyNewsDataFromWWW(context: Context, deleteAllRequired: Boolean) {
var deleteAllDone = false
@Suppress("SimplifyBooleanWithConstants")
if (deleteAllRequired || FORCE_REFRESH) {
deleteAllAgencyNewsData()
deleteAllDone = true
Expand Down Expand Up @@ -396,8 +400,8 @@ class YouTubeNewsProvider : NewsProvider() {
i: Int,
authorUrl: String,
) {
val (username, userHandle, channelId) = YouTubeUtils.pickChannelIdFromAuthorUrl(authorUrl)
val userLog = username ?: userHandle ?: channelId ?: authorUrl
val (usernameFromAuthorUrl, userHandleFromAuthorUrl, channelIdFromAuthorUrl) = YouTubeUtils.pickChannelIdFromAuthorUrl(authorUrl)
val userLog = usernameFromAuthorUrl ?: userHandleFromAuthorUrl ?: channelIdFromAuthorUrl ?: authorUrl
val userLang = _userNamesLang.getOrNull(i) ?: LocaleUtils.UNKNOWN
if (LocaleUtils.MULTIPLE != userLang
&& LocaleUtils.UNKNOWN != userLang
Expand All @@ -408,9 +412,9 @@ class YouTubeNewsProvider : NewsProvider() {
}
// 1 - load user channel uploads
val (id, forUsername, forHandle) = when {
username?.isNotBlank() == true -> Triple(null, username, null)
userHandle?.isNotBlank() == true -> Triple(null, null, userHandle)
channelId?.isNotBlank() == true -> Triple(channelId, null, null)
usernameFromAuthorUrl?.isNotBlank() == true -> Triple(null, usernameFromAuthorUrl, null)
userHandleFromAuthorUrl?.isNotBlank() == true -> Triple(null, null, userHandleFromAuthorUrl)
channelIdFromAuthorUrl?.isNotBlank() == true -> Triple(channelIdFromAuthorUrl, null, null)
_userNames.getOrNull(i)?.isNotBlank() == true -> Triple(null, _userNames[i], null)
_userNamesHandles.getOrNull(i)?.isNotBlank() == true -> Triple(null, null, _userNamesHandles[i])
_userNamesChannelsId.getOrNull(i)?.isNotBlank() == true -> Triple(_userNamesChannelsId[i], null, null)
Expand Down Expand Up @@ -442,8 +446,8 @@ class YouTubeNewsProvider : NewsProvider() {
val authorUsername = channelSnippet?.customUrl
val authorName = channelSnippet?.localized?.title
?: channelSnippet?.title
?: username
?: userHandle
?: usernameFromAuthorUrl
?: userHandleFromAuthorUrl
?: _userNames.getOrNull(i)?.takeIf { it.isNotBlank() }
?: _userNamesHandles.getOrNull(i)?.takeIf { it.isNotBlank() }
?: run {
Expand Down Expand Up @@ -527,6 +531,7 @@ class YouTubeNewsProvider : NewsProvider() {
val targetUUID = _userNamesTarget.getOrNull(i)?.takeIf { it.isNotBlank() }
?: _targetAuthority.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyAuthority(context)
?: EMPTY.takeIf { context.packageName == Constants.MAIN_APP_PACKAGE_NAME } // target all allowed for main app
Comment thread
mmathieum marked this conversation as resolved.
?: run {
MTLog.w(this, "SKIP loading '$userLog': no target UUID!")
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.mtransit.android.commons.Constants
import org.mtransit.android.commons.LocaleUtils
import org.mtransit.android.commons.MTLog
import org.mtransit.android.commons.R
import org.mtransit.android.commons.StringUtils.EMPTY
import org.mtransit.android.commons.provider.agency.AgencyUtils
import org.mtransit.commons.dropWhile
import java.net.URL
Expand Down Expand Up @@ -53,6 +54,7 @@ object RssNewProviderUtils : MTLog.Loggable {
getFeedsAuthorName(context).getOrNull(i)?.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyShortName(context)

@Suppress("SpellCheckingInspection")
private val LABEL_BLACK_LIST = listOf(
"api",
"assets",
Expand Down Expand Up @@ -117,12 +119,11 @@ object RssNewProviderUtils : MTLog.Loggable {
.also { _feedsTarget = it }

@JvmStatic
fun pickTarget(context: Context, i: Int): String? {
return getFeedsTarget(context).getOrNull(i)?.takeIf { it.isNotBlank() }
fun pickTarget(context: Context, i: Int) =
getFeedsTarget(context).getOrNull(i)?.takeIf { it.isNotBlank() }
?: getTargetAuthority(context).takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyAuthority(context)
.takeIf { context.packageName != Constants.MAIN_APP_PACKAGE_NAME }.orEmpty()
}
?: EMPTY.takeIf { context.packageName == Constants.MAIN_APP_PACKAGE_NAME } // target all allowed for main app

private var _feedsSeverity: List<Int>? = null

Expand Down Expand Up @@ -205,7 +206,7 @@ object RssNewProviderUtils : MTLog.Loggable {
}
.also { _feedsDateLinkFallback = it }

@JvmStatic
@JvmStatic
fun pickDateLinkFallback(context: Context, i: Int) =
getFeedsDateLinkFallback(context).getOrNull(i)
getFeedsDateLinkFallback(context).getOrNull(i)
}