Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
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 @@ -29,6 +29,8 @@
import org.mtransit.android.commons.UriUtils;
import org.mtransit.android.commons.data.News;
import org.mtransit.android.commons.helpers.MTDefaultHandler;
import org.mtransit.android.commons.provider.config.news.DefaultNewsProviderConfig;
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig;
import org.mtransit.android.commons.provider.news.NewsTextFormatter;
import org.mtransit.commons.SourceUtils;
import org.xml.sax.Attributes;
Expand Down Expand Up @@ -160,6 +162,12 @@ private static String getNEWS_TARGET_AUTHORITY(@NonNull Context context) {
return newsTargetAuthority;
}

@NonNull
@Override
public NewsProviderConfig getNewsConfig() {
return new DefaultNewsProviderConfig();
}

/**
* Override if multiple {@link CaSTOProvider} implementations in same app.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,7 @@ public final class ContentProviderConstants {
//
public static final int NEWS = 115;
//
public static final int CONFIG = 555;
//
public static final int ALL = 999;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.mtransit.android.commons.data.News
import org.mtransit.android.commons.provider.InstagramNewsProvider.InstagramApi.JEdgeOwnerToTimelineMediaNode
import org.mtransit.android.commons.provider.InstagramNewsProvider.InstagramApi.JProfileUser
import org.mtransit.android.commons.provider.agency.AgencyUtils
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
Expand Down Expand Up @@ -138,6 +139,9 @@ class InstagramNewsProvider : NewsProvider() {
)
}

override fun getNewsConfig(): NewsProviderConfig {
}
Comment thread
mmathieum marked this conversation as resolved.
Outdated

override fun getLogTag() = LOG_TAG

override fun getURI_MATCHER() = _uriMatcher
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.mtransit.android.commons.StringUtils;
import org.mtransit.android.commons.TimeUtils;
import org.mtransit.android.commons.data.News;
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig;
import org.mtransit.commons.CollectionUtils;
import org.mtransit.commons.sql.SQLCreateBuilder;
import org.mtransit.commons.sql.SQLInsertBuilder;
Expand Down Expand Up @@ -52,6 +53,7 @@ public static UriMatcher getNewUriMatcher(@NonNull String authority) {
public static void append(@NonNull UriMatcher uriMatcher, @NonNull String authority) {
uriMatcher.addURI(authority, NewsProviderContract.PING_PATH, ContentProviderConstants.PING);
uriMatcher.addURI(authority, NewsProviderContract.NEWS_PATH, ContentProviderConstants.NEWS);
uriMatcher.addURI(authority, NewsProviderContract.CONFIG_PATH, ContentProviderConstants.CONFIG);
}

@Nullable
Expand Down Expand Up @@ -142,11 +144,19 @@ public static Cursor queryS(@NonNull NewsProviderContract provider, @NonNull Uri
return ContentProviderConstants.EMPTY_CURSOR; // empty cursor = processed
case ContentProviderConstants.NEWS:
return getNews(provider, selection);
case ContentProviderConstants.CONFIG:
return getNewsConfig(provider);
default:
return null; // not processed
}
}

@Nullable
private static Cursor getNewsConfig(@NonNull NewsProviderContract provider) {
final NewsProviderConfig providerNewsConfig = provider.getNewsConfig();
return providerNewsConfig.toCursor();
}

@Nullable
private static Cursor getNews(@NonNull NewsProviderContract provider, @Nullable String selection) {
NewsProviderContract.Filter newsFilter = NewsProviderContract.Filter.fromJSONString(selection);
Expand Down Expand Up @@ -318,7 +328,9 @@ public String getTypeMT(@NonNull Uri uri) {
@Nullable
public static String getTypeS(@NonNull NewsProviderContract provider, @NonNull Uri uri) {
switch (provider.getURI_MATCHER().match(uri)) {
case ContentProviderConstants.PING:
case ContentProviderConstants.NEWS:
case ContentProviderConstants.CONFIG:
return StringUtils.EMPTY; // empty string = processed
default:
return null; // not processed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.mtransit.android.commons.data.News;
import org.mtransit.android.commons.data.POI;
import org.mtransit.android.commons.data.RouteTripStop;
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig;
import org.mtransit.commons.CollectionUtils;

import java.util.ArrayList;
Expand All @@ -30,6 +31,7 @@
public interface NewsProviderContract extends ProviderContract {

String NEWS_PATH = "news";
String CONFIG_PATH = "config"; // TODO move to ProviderContract once implemented everywhere

boolean REMOVE_IMAGE_FROM_TEXT = false; // TODO later

Expand Down Expand Up @@ -74,6 +76,9 @@ public interface NewsProviderContract extends ProviderContract {
@NonNull
Collection<String> getNewsLanguages();

@NonNull
NewsProviderConfig getNewsConfig();

interface Columns {
String T_NEWS_K_ID = BaseColumns._ID;
String T_NEWS_K_AUTHORITY_META = "authority";
Expand Down Expand Up @@ -133,6 +138,27 @@ interface Columns {
Columns.T_NEWS_K_IMAGE_URL_INDEX + 9, //
};

interface FeedConfigColumns {
String T_NEWS_FEED_CONFIG_K_TARGET = "target";
String T_NEWS_FEED_CONFIG_K_LANG = "lang";
String T_NEWS_FEED_CONFIG_K_COLOR = "color";
String T_NEWS_FEED_CONFIG_K_SEVERITY = "severity";
String T_NEWS_FEED_CONFIG_K_NOTEWORTHY = "noteworthy";

String T_NEWS_FEED_CONFIG_K_EXTRA = "extra";

}

String[] PROJECTION_NEWS_FEED_CONFIG = new String[]{
FeedConfigColumns.T_NEWS_FEED_CONFIG_K_TARGET,
FeedConfigColumns.T_NEWS_FEED_CONFIG_K_LANG,
FeedConfigColumns.T_NEWS_FEED_CONFIG_K_COLOR,
FeedConfigColumns.T_NEWS_FEED_CONFIG_K_SEVERITY,
FeedConfigColumns.T_NEWS_FEED_CONFIG_K_NOTEWORTHY,

FeedConfigColumns.T_NEWS_FEED_CONFIG_K_EXTRA,
};

@SuppressWarnings("WeakerAccess")
class Filter implements MTLog.Loggable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import org.mtransit.android.commons.UriUtils;
import org.mtransit.android.commons.data.News;
import org.mtransit.android.commons.helpers.MTDefaultHandler;
import org.mtransit.android.commons.provider.config.news.DefaultNewsProviderConfig;
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig;
import org.mtransit.android.commons.provider.news.NewsTextFormatter;
import org.mtransit.android.commons.provider.news.rss.RssNewProviderUtils;
import org.mtransit.commons.CleanUtils;
Expand Down Expand Up @@ -234,6 +236,11 @@ private static java.util.List<String> getFEEDS_LABEL(@NonNull Context context) {
return feedsLabel;
}

@NonNull
@Override
public NewsProviderConfig getNewsConfig() {
}
Comment thread
mmathieum marked this conversation as resolved.

@NonNull
@Override
public UriMatcher getURI_MATCHER() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import org.mtransit.android.commons.TimeUtils
import org.mtransit.android.commons.UriUtils
import org.mtransit.android.commons.data.News
import org.mtransit.android.commons.provider.agency.AgencyUtils
import org.mtransit.android.commons.provider.config.news.twitter.TwitterNewsFeedConfig
import org.mtransit.android.commons.provider.config.news.twitter.TwitterNewsProviderConfig
import org.mtransit.android.commons.provider.news.NewsTextFormatter
import org.mtransit.android.commons.provider.news.twitter.TwitterNewsDbHelper
import org.mtransit.android.commons.provider.news.twitter.TwitterStorage
Expand Down Expand Up @@ -203,6 +205,21 @@ class TwitterNewsProvider : NewsProvider() {
)
}

override fun getNewsConfig() = TwitterNewsProviderConfig(
newsFeedConfigs = _userNames.mapIndexed { i, username ->
TwitterNewsFeedConfig(
username = username,
userId = _userNamesId.getOrNull(i), // optional (saved 1 request)
lang = _userNamesLang.getOrNull(i) ?: LocaleUtils.UNKNOWN,
color = _userNamesColors.getOrNull(i) ?: _color.takeIf { it.isNotBlank() }, // optional (fallback: agency color)
target = _userNamesTarget.getOrNull(i)?.takeIf { it.isNotBlank() }
?: _targetAuthority.takeIf { it.isNotBlank() }, // optional (fallback: agency UUID)
severity = _userNamesSeverity.getOrNull(i) ?: TwitterNewsFeedConfig.SEVERITY_DEFAULT,
noteworthy = _userNamesNoteworthy.getOrNull(i) ?: TwitterNewsFeedConfig.NOTEWORTHY_DEFAULT,
)
}
)

override fun getLogTag() = LOG_TAG

override fun getURI_MATCHER() = _uriMatcher
Expand Down Expand Up @@ -395,7 +412,7 @@ class TwitterNewsProvider : NewsProvider() {
val newNews = ArrayList<News>()
val maxValidityInMs = newsMaxValidityInMs
val authority = _authority
for ((i, userName) in _userNames.withIndex()) {
_userNames.forEachIndexed { i, userName ->
loadUserTimeline(
context,
twitterApi,
Expand Down Expand Up @@ -495,10 +512,16 @@ class TwitterNewsProvider : NewsProvider() {
val tweetsResp = response.data
val tweetsRespIncludedExpansions = response.includes
var newSinceId: String? = null
val colorString = _userNamesColors.getOrNull(i)
?: _color.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyColor(context)
?: ColorUtils.BLACK
.also {
MTLog.w(this, "No color found for '$username'! (used fallback)")
}
tweetsResp
?.forEach { tweet ->
readNews(
context,
tweet,
tweetsRespIncludedExpansions,
authority,
Expand All @@ -509,7 +532,8 @@ class TwitterNewsProvider : NewsProvider() {
targetUUID,
userId,
username,
userLang
userLang,
colorString,
)?.apply {
if (newSinceId == null) {
newSinceId = tweet.id
Expand All @@ -531,7 +555,6 @@ class TwitterNewsProvider : NewsProvider() {

@RequiresApi(Build.VERSION_CODES.O)
private fun readNews(
context: Context,
tweet: Tweet,
includedExpansions: Expansions?,
authority: String,
Expand All @@ -543,6 +566,7 @@ class TwitterNewsProvider : NewsProvider() {
userId: String,
userName: String,
userLang: String,
colorString: String,
): News? {
if (tweet.inReplyToUserId != null && tweet.inReplyToUserId != userId) {
MTLog.d(this, "readNews() > SKIP (in reply to screen name: '%s').", tweet.inReplyToUserId)
Expand All @@ -565,13 +589,6 @@ class TwitterNewsProvider : NewsProvider() {
val lang: String = getLang(tweet, userLang)
val createdAtInMs = tweet.createdAt?.toInstant()?.toEpochMilli()
?: newLastUpdateInMs // should never happen
val colorString = _userNamesColors.getOrNull(_userNames.indexOf(authorUserName))
?: _color.takeIf { it.isNotBlank() }
?: AgencyUtils.getAgencyColor(context)
?: ColorUtils.BLACK
.also {
MTLog.w(this, "No color found for '$userName'! (used fallback)")
}
return News(
null,
authority,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
import org.mtransit.android.commons.data.RouteTripStop;
import org.mtransit.android.commons.data.Schedule;
import org.mtransit.android.commons.data.Trip;
import org.mtransit.android.commons.provider.config.news.DefaultNewsProviderConfig;
import org.mtransit.android.commons.provider.config.news.NewsProviderConfig;
import org.mtransit.commons.CleanUtils;
import org.mtransit.commons.FeatureFlags;
import org.mtransit.commons.SourceUtils;
Expand Down Expand Up @@ -181,6 +183,11 @@ private static String getNEWS_TARGET_AUTHORITY(@NonNull Context context) {
return newsTargetAuthority;
}

@NonNull
@Override
public NewsProviderConfig getNewsConfig() {
}
Comment thread
mmathieum marked this conversation as resolved.

private static final long WEB_SERVICE_STATUS_MAX_VALIDITY_IN_MS = TimeUnit.HOURS.toMillis(1L);
private static final long WEB_SERVICE_STATUS_VALIDITY_IN_MS = TimeUnit.MINUTES.toMillis(10L);
private static final long WEB_SERVICE_STATUS_VALIDITY_IN_FOCUS_IN_MS = TimeUnit.MINUTES.toMillis(1L);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import org.mtransit.android.commons.UriUtils
import org.mtransit.android.commons.data.News
import org.mtransit.android.commons.linkifyAllURLs
import org.mtransit.android.commons.provider.agency.AgencyUtils
import org.mtransit.android.commons.provider.config.news.youtube.YouTubeNewsFeedConfig
import org.mtransit.android.commons.provider.config.news.youtube.YouTubeNewsProviderConfig
import org.mtransit.android.commons.provider.news.NewsTextFormatter
import org.mtransit.android.commons.provider.news.youtube.YouTubeNewsDbHelper
import org.mtransit.android.commons.provider.news.youtube.YouTubeStorage
Expand Down Expand Up @@ -164,6 +166,22 @@ class YouTubeNewsProvider : NewsProvider() {
)
}

override fun getNewsConfig() = YouTubeNewsProviderConfig(
newsFeedConfigs = _authorUrls.mapIndexed { i, authorUrl ->
YouTubeNewsFeedConfig(
authorUrl = authorUrl,
username = _userNames.getOrNull(i),
userHandle = _userNamesHandles.getOrNull(i),
channelId = _userNamesChannelsId.getOrNull(i),
lang = _userNamesLang.getOrNull(i) ?: LocaleUtils.UNKNOWN,
color = _userNamesColors.getOrNull(i),
target = _userNamesTarget.getOrNull(i),
severity = _userNamesSeverity.getOrNull(i) ?: YouTubeNewsFeedConfig.SEVERITY_DEFAULT,
noteworthy = _userNamesNoteworthy.getOrNull(i) ?: YouTubeNewsFeedConfig.NOTEWORTHY_DEFAULT,
)
}
)

override fun getLogTag() = LOG_TAG

override fun getURI_MATCHER() = _uriMatcher
Expand Down Expand Up @@ -346,7 +364,7 @@ class YouTubeNewsProvider : NewsProvider() {
val newNews = ArrayList<News>()
val maxValidityInMs = newsMaxValidityInMs
val authority = _authority
for ((i, authorUrl) in _authorUrls.withIndex()) {
_authorUrls.forEachIndexed { i, authorUrl ->
loadUserUploadsPlaylist(
context,
youtubeService,
Expand Down Expand Up @@ -393,10 +411,11 @@ class YouTubeNewsProvider : NewsProvider() {
.list(CHANNEL_PARTS)
.apply {
when {
// from author URL
username?.isNotBlank() == true -> setForUsername(username)
userHandle?.isNotBlank() == true -> setForHandle(userHandle)
channelId?.isNotBlank() == true -> setId(listOf(channelId))

// provided in config
_userNames.getOrNull(i)?.isNotBlank() == true -> setForUsername(_userNames[i])
_userNamesHandles.getOrNull(i)?.isNotBlank() == true -> setForHandle(_userNamesHandles[i])
_userNamesChannelsId.getOrNull(i)?.isNotBlank() == true -> setId(listOf(_userNamesChannelsId[i]))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.mtransit.android.commons.provider.config

interface ProviderConfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.mtransit.android.commons.provider.config.news

data class DefaultNewsProviderConfig @JvmOverloads constructor(
override val newsFeedConfigs: List<NewsFeedConfig> = emptyList()
) : NewsProviderConfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.mtransit.android.commons.provider.config.news

import org.mtransit.android.commons.LocaleUtils

interface NewsFeedConfig {
val target: String? get() = null // target the entire agency
val lang: String get() = LocaleUtils.UNKNOWN // show all
val color: String? get() = null // same as agency (target?) color
val severity: Int get() = 1 // news_provider_severity_info_unknown
val noteworthy: Long get() = 86_400_000L // news_provider_noteworthy_info // 1 days

/**
* See [org.mtransit.android.commons.provider.NewsProviderContract.FeedConfigColumns]
* See [org.mtransit.android.commons.provider.NewsProviderContract.PROJECTION_NEWS_FEED_CONFIG]
*/
fun toCursorRow(): Array<Any> {
return makeCursorRow()
}

fun makeCursorRow(extra: String? = null): Array<Any> {
return arrayOf<Any>(
target.orEmpty(),
lang,
color.orEmpty(),
severity,
noteworthy,
extra.orEmpty(),
)
}
}
Loading