From b9cf32316dc173c100648272131944e90eb555a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 27 Feb 2026 09:04:24 -0500 Subject: [PATCH 1/2] News providers > re-enable for main app --- .../commons/provider/InstagramNewsProvider.kt | 13 +++++++----- .../commons/provider/TwitterNewsProvider.kt | 20 ++++++++++++------- .../commons/provider/YouTubeNewsProvider.kt | 15 +++++++++----- .../provider/news/rss/RssNewProviderUtils.kt | 13 ++++++------ 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt index f89c2dab..c9d1ba45 100644 --- a/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt @@ -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 @@ -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 @@ -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) { @@ -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 ) { @@ -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 ?: run { MTLog.w(this, "SKIP loading '$username': no target UUID!") return @@ -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 { @@ -521,7 +524,7 @@ class InstagramNewsProvider : NewsProvider() { return listOf( timelineMediaNode.displayUrl ?: timelineMediaNode.thumbnailSrc - ?: StringUtils.EMPTY + ?: EMPTY ) } @@ -690,7 +693,7 @@ class InstagramNewsProvider : NewsProvider() { PreferenceUtils.savePrefLclSync( context, PREF_KEY_AGENCY_LAST_UPDATE_LANG, - StringUtils.EMPTY, + EMPTY, ) initAllDbTables(db) } diff --git a/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt index 0a7cac7f..6857efac 100644 --- a/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt @@ -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 @@ -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 @@ -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" @@ -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) { @@ -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 ) { @@ -381,6 +384,7 @@ 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 @@ -388,7 +392,7 @@ class TwitterNewsProvider : NewsProvider() { val newNews: ArrayList? = 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() } @@ -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 -> @@ -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??? @@ -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 ?: run { MTLog.w(this, "SKIP loading '$username': no target UUID!") return @@ -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 ?: "" diff --git a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt index 85ed15db..465392d5 100644 --- a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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) { @@ -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 ) { @@ -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 @@ -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 ?: run { MTLog.w(this, "SKIP loading '$userLog': no target UUID!") return diff --git a/src/main/java/org/mtransit/android/commons/provider/news/rss/RssNewProviderUtils.kt b/src/main/java/org/mtransit/android/commons/provider/news/rss/RssNewProviderUtils.kt index a8aa72f3..508e4d0b 100644 --- a/src/main/java/org/mtransit/android/commons/provider/news/rss/RssNewProviderUtils.kt +++ b/src/main/java/org/mtransit/android/commons/provider/news/rss/RssNewProviderUtils.kt @@ -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 @@ -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", @@ -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? = null @@ -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) } From 79607019a544e9b4289bace11da49cbd81c54acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 27 Feb 2026 09:15:02 -0500 Subject: [PATCH 2/2] cleanup --- .../commons/provider/YouTubeNewsProvider.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt index 465392d5..410fc5ec 100644 --- a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt @@ -400,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 @@ -412,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) @@ -446,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 {