diff options
author | David Luhmer <david-dev@live.de> | 2020-07-23 18:01:07 +0300 |
---|---|---|
committer | David Luhmer <david-dev@live.de> | 2020-07-23 18:01:07 +0300 |
commit | 4645b04779bbb18ee63d44a09b1973cfff0e5910 (patch) | |
tree | 5795ece6a5e7c79841998ffb7e0bff4c3aa7841b | |
parent | 5e2c96e4170a39b3286ce9ee14785688a8e988e2 (diff) |
add support for media thumbnails
Signed-off-by: David Luhmer <david-dev@live.de>
-rw-r--r-- | News-Android-App/build.gradle | 22 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java | 2 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ViewHolder.java | 25 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java | 2 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version7.java (renamed from News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version6.java) | 11 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java | 4 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java | 32 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java | 31 | ||||
-rw-r--r-- | News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java | 15 |
9 files changed, 115 insertions, 29 deletions
diff --git a/News-Android-App/build.gradle b/News-Android-App/build.gradle index 7541a00f..13c39047 100644 --- a/News-Android-App/build.gradle +++ b/News-Android-App/build.gradle @@ -121,12 +121,12 @@ repositories { maven { url "https://dl.bintray.com/lukaville/maven" } //Needed for com.nbsp:library:1.8 in Material File Picker } -final DAGGER_VERSION = '2.26' +final DAGGER_VERSION = '2.27' final BUTTERKNIFE_VERSION = '10.2.1' final ESPRESSO_VERSION = '3.2.0' final OKHTTP_VERSION = '3.12.10' -final MOCKITO_VERSION = '3.3.1' -final RETROFIT_VERSION = '2.6.4' +final MOCKITO_VERSION = '3.3.3' +final RETROFIT_VERSION = '2.9.0' dependencies { // core android studio module @@ -134,18 +134,18 @@ dependencies { // You must install or update the Google Repository through the SDK manager to use this dependency. // The Google Repository (separate from the corresponding library) can be found in the Extras category. // implementation 'com.google.android.gms:play-services:4.2.42' - // implementation project(':Android-SingleSignOn') + implementation project(':Android-SingleSignOn') // implementation project(path: ':MaterialShowcaseView:library', configuration: 'default') - implementation 'com.github.nextcloud:Android-SingleSignOn:0.5.0' + // implementation 'com.github.nextcloud:Android-SingleSignOn:0.5.0' implementation 'com.github.David-Development:MaterialShowcaseView:bf6afa225d' - implementation "androidx.core:core:1.2.0" + implementation "androidx.core:core:1.3.1" implementation 'androidx.annotation:annotation:1.1.0' implementation "androidx.appcompat:appcompat:1.1.0" - implementation "androidx.preference:preference:1.1.0" + implementation "androidx.preference:preference:1.1.1" // https://mvnrepository.com/artifact/com.google.android.material/material - implementation "com.google.android.material:material:1.2.0-alpha05" + implementation "com.google.android.material:material:1.3.0-alpha01" //implementation "com.google.android.material:material:1.0.0" implementation "androidx.palette:palette:1.0.0" implementation "androidx.recyclerview:recyclerview:1.1.0" @@ -165,7 +165,7 @@ dependencies { implementation ('de.greenrobot:greendao-generator:2.0.0') { exclude group: 'org.freemarker' } - //implementation 'org.freemarker:freemarker:2.3.23' //Required for DAO generation + //implementation 'org.freemarker:freemarker:2.3.23' // Required for DAO generation //implementation 'org.apache.commons:commons-lang3:3.4' implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0' implementation 'org.jsoup:jsoup:1.13.1' @@ -180,7 +180,7 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. - implementation 'io.reactivex.rxjava2:rxjava:2.2.18' + implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation "com.squareup.retrofit2:adapter-rxjava2:$RETROFIT_VERSION" implementation "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION" @@ -208,7 +208,7 @@ dependencies { //androidTestImplementation "com.squareup.okhttp3:mockwebserver:${OKHTTP_VERSION}" - androidTestImplementation 'tools.fastlane:screengrab:1.2.0' + androidTestImplementation 'tools.fastlane:screengrab:2.0.0' //androidTestImplementation "org.mockito:mockito-core:MOCKITO_VERSION" androidTestImplementation "org.mockito:mockito-android:$MOCKITO_VERSION" diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java index 0c932a8c..e158faa1 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java @@ -440,7 +440,7 @@ public class LoginDialogActivity extends AppCompatActivity { public static void ShowAlertDialog(String title, String text, Activity activity) { // Linkify the message - final SpannableString s = new SpannableString(text); + final SpannableString s = new SpannableString(text != null ? text : activity.getString(R.string.select_account_unknown_error_toast)); Linkify.addLinks(s, Linkify.ALL); AlertDialog aDialog = new AlertDialog.Builder(activity) diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ViewHolder.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ViewHolder.java index 1b703ca5..7af3614f 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ViewHolder.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ViewHolder.java @@ -29,6 +29,7 @@ import com.nostra13.universalimageloader.core.ImageLoader; import org.greenrobot.eventbus.Subscribe; +import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; @@ -280,19 +281,21 @@ public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickL } if(textViewBody != null) { - String body = rssItem.getBody(); + String body = rssItem.getMediaDescription(); + if(body == null || body.isEmpty()) { + body = rssItem.getBody(); + } + + boolean limitLength = true; // Strip html from String if(selectedListLayout == 0) { textViewBody.setMaxLines(scaleTextLines(mPrefs)); - body = getBodyText(body, false); - + limitLength = false; } else if(selectedListLayout == 3) { textViewBody.setMaxLines(200); - body = getBodyText(body, false); - - } else { - body = getBodyText(body, true); + limitLength = false; } + body = getBodyText(body, limitLength); textViewBody.setText(Html.fromHtml(body)); scaleTextSize(textViewBody, textSizeBody, false, mPrefs); } @@ -311,7 +314,13 @@ public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickL if(imgViewThumbnail != null) { imgViewThumbnail.setColorFilter(null); String body = rssItem.getBody(); - List<String> images = ImageHandler.getImageLinksFromText(body); + List<String> images; + if(rssItem.getMediaThumbnail() != null && !rssItem.getMediaThumbnail().isEmpty()) { + images = new ArrayList(); + images.add(rssItem.getMediaThumbnail()); + } else { + images = ImageHandler.getImageLinksFromText(body); + } if(images.size() > 0) { imgViewThumbnail.setVisibility(View.VISIBLE); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java index b88eeda8..ef5ef537 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java @@ -26,7 +26,7 @@ public class DatabaseOrmGenerator { public static void main(String[] args) throws Exception { List<SchemaVersion> versions = new ArrayList<>(); - versions.add(new Version6(true)); + versions.add(new Version7(true)); validateSchemas(versions); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version6.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version7.java index 3c88aae1..06c144e0 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version6.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/Version7.java @@ -4,14 +4,14 @@ import de.greenrobot.daogenerator.Entity; import de.greenrobot.daogenerator.Property; import de.greenrobot.daogenerator.Schema; -public class Version6 extends SchemaVersion { +public class Version7 extends SchemaVersion { /** * Constructor * * @param current */ - public Version6(boolean current) { + public Version7(boolean current) { super(current); Schema schema = getSchema(); @@ -23,7 +23,7 @@ public class Version6 extends SchemaVersion { */ @Override public int getVersionNumber() { - return 6; + return 7; } @SuppressWarnings("unused") // id properties (folderId, etc.) need to be in database @@ -69,6 +69,11 @@ public class Version6 extends SchemaVersion { rssItem.addStringProperty("enclosureLink"); rssItem.addStringProperty("enclosureMime"); + rssItem.addStringProperty("mediaThumbnail"); + rssItem.addStringProperty("mediaDescription"); + + rssItem.addBooleanProperty("rtl"); + feed.addToOne(folder, folderIdProperty); folder.addToMany(feed, folderIdProperty); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java index 42431f6b..90b1e600 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java @@ -11,10 +11,10 @@ import de.greenrobot.dao.identityscope.IdentityScopeType; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. /** - * Master of DAO (schema version 6): knows all DAOs. + * Master of DAO (schema version 7): knows all DAOs. */ public class DaoMaster extends AbstractDaoMaster { - public static final int SCHEMA_VERSION = 6; + public static final int SCHEMA_VERSION = 7; /** Creates underlying database table using DAOs. */ public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) { diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java index 3fc9d5be..43916ef2 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java @@ -33,6 +33,9 @@ public class RssItem implements HasId<Long> { private java.util.Date pubDate; private String enclosureLink; private String enclosureMime; + private String mediaThumbnail; + private String mediaDescription; + private Boolean rtl; /** Used to resolve relations */ private transient DaoSession daoSession; @@ -54,7 +57,7 @@ public class RssItem implements HasId<Long> { this.id = id; } - public RssItem(long id, long feedId, String link, String title, String body, Boolean read, Boolean starred, String author, String guid, String guidHash, String fingerprint, Boolean read_temp, Boolean starred_temp, java.util.Date lastModified, java.util.Date pubDate, String enclosureLink, String enclosureMime) { + public RssItem(long id, long feedId, String link, String title, String body, Boolean read, Boolean starred, String author, String guid, String guidHash, String fingerprint, Boolean read_temp, Boolean starred_temp, java.util.Date lastModified, java.util.Date pubDate, String enclosureLink, String enclosureMime, String mediaThumbnail, String mediaDescription, Boolean rtl) { this.id = id; this.feedId = feedId; this.link = link; @@ -72,6 +75,9 @@ public class RssItem implements HasId<Long> { this.pubDate = pubDate; this.enclosureLink = enclosureLink; this.enclosureMime = enclosureMime; + this.mediaThumbnail = mediaThumbnail; + this.mediaDescription = mediaDescription; + this.rtl = rtl; } /** called by internal mechanisms, do not call yourself. */ @@ -224,6 +230,30 @@ public class RssItem implements HasId<Long> { this.enclosureMime = enclosureMime; } + public String getMediaThumbnail() { + return mediaThumbnail; + } + + public void setMediaThumbnail(String mediaThumbnail) { + this.mediaThumbnail = mediaThumbnail; + } + + public String getMediaDescription() { + return mediaDescription; + } + + public void setMediaDescription(String mediaDescription) { + this.mediaDescription = mediaDescription; + } + + public Boolean getRtl() { + return rtl; + } + + public void setRtl(Boolean rtl) { + this.rtl = rtl; + } + /** To-one relationship, resolved on first access. */ public Feed getFeed() { long __key = this.feedId; diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java index f5fd6922..ba4e1139 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java @@ -44,6 +44,9 @@ public class RssItemDao extends AbstractDao<RssItem, Long> { public final static Property PubDate = new Property(14, java.util.Date.class, "pubDate", false, "PUB_DATE"); public final static Property EnclosureLink = new Property(15, String.class, "enclosureLink", false, "ENCLOSURE_LINK"); public final static Property EnclosureMime = new Property(16, String.class, "enclosureMime", false, "ENCLOSURE_MIME"); + public final static Property MediaThumbnail = new Property(17, String.class, "mediaThumbnail", false, "MEDIA_THUMBNAIL"); + public final static Property MediaDescription = new Property(18, String.class, "mediaDescription", false, "MEDIA_DESCRIPTION"); + public final static Property Rtl = new Property(19, Boolean.class, "rtl", false, "RTL"); }; private DaoSession daoSession; @@ -79,7 +82,10 @@ public class RssItemDao extends AbstractDao<RssItem, Long> { "\"LAST_MODIFIED\" INTEGER," + // 13: lastModified "\"PUB_DATE\" INTEGER," + // 14: pubDate "\"ENCLOSURE_LINK\" TEXT," + // 15: enclosureLink - "\"ENCLOSURE_MIME\" TEXT);"); // 16: enclosureMime + "\"ENCLOSURE_MIME\" TEXT," + // 16: enclosureMime + "\"MEDIA_THUMBNAIL\" TEXT," + // 17: mediaThumbnail + "\"MEDIA_DESCRIPTION\" TEXT," + // 18: mediaDescription + "\"RTL\" INTEGER);"); // 19: rtl // Add Indexes db.execSQL("CREATE INDEX " + constraint + "IDX_RSS_ITEM_FEED_ID ON RSS_ITEM" + " (\"FEED_ID\");"); @@ -156,6 +162,21 @@ public class RssItemDao extends AbstractDao<RssItem, Long> { if (enclosureMime != null) { stmt.bindString(17, enclosureMime); } + + String mediaThumbnail = entity.getMediaThumbnail(); + if (mediaThumbnail != null) { + stmt.bindString(18, mediaThumbnail); + } + + String mediaDescription = entity.getMediaDescription(); + if (mediaDescription != null) { + stmt.bindString(19, mediaDescription); + } + + Boolean rtl = entity.getRtl(); + if (rtl != null) { + stmt.bindLong(20, rtl ? 1L: 0L); + } } @Override @@ -190,7 +211,10 @@ public class RssItemDao extends AbstractDao<RssItem, Long> { cursor.isNull(offset + 13) ? null : new java.util.Date(cursor.getLong(offset + 13)), // lastModified cursor.isNull(offset + 14) ? null : new java.util.Date(cursor.getLong(offset + 14)), // pubDate cursor.isNull(offset + 15) ? null : cursor.getString(offset + 15), // enclosureLink - cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16) // enclosureMime + cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16), // enclosureMime + cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17), // mediaThumbnail + cursor.isNull(offset + 18) ? null : cursor.getString(offset + 18), // mediaDescription + cursor.isNull(offset + 19) ? null : cursor.getShort(offset + 19) != 0 // rtl ); return entity; } @@ -215,6 +239,9 @@ public class RssItemDao extends AbstractDao<RssItem, Long> { entity.setPubDate(cursor.isNull(offset + 14) ? null : new java.util.Date(cursor.getLong(offset + 14))); entity.setEnclosureLink(cursor.isNull(offset + 15) ? null : cursor.getString(offset + 15)); entity.setEnclosureMime(cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16)); + entity.setMediaThumbnail(cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17)); + entity.setMediaDescription(cursor.isNull(offset + 18) ? null : cursor.getString(offset + 18)); + entity.setRtl(cursor.isNull(offset + 19) ? null : cursor.getShort(offset + 19) != 0); } /** @inheritdoc */ diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java index 4d524dc2..27c270b8 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java @@ -51,6 +51,11 @@ class InsertRssItemIntoDatabase { String enclosureLink = getStringOrEmpty("enclosureLink", e); String enclosureMime = getStringOrEmpty("enclosureMime", e); + String mediaThumbnail = getStringOrEmpty("mediaThumbnail", e); + String mediaDescription = getStringOrEmpty("mediaDescription", e); + + Boolean rtl = getBooleanOrDefault("rtl", false, e); + if(enclosureLink.trim().equals("") && url.matches("^https?://(www.)?youtube.com/.*")) { enclosureLink = url; enclosureMime = "youtube"; @@ -69,6 +74,7 @@ class InsertRssItemIntoDatabase { rssItem.setStarred(e.get("starred").getAsBoolean()); rssItem.setStarred_temp(rssItem.getStarred()); rssItem.setPubDate(pubDate); + rssItem.setRtl(rtl); //Possible XSS fields rssItem.setTitle(e.get("title").getAsString()); @@ -76,6 +82,8 @@ class InsertRssItemIntoDatabase { rssItem.setLink(url); rssItem.setEnclosureLink(enclosureLink); rssItem.setEnclosureMime(enclosureMime); + rssItem.setMediaDescription(mediaDescription); + rssItem.setMediaThumbnail(mediaThumbnail); if(rssItem.getFingerprint() == null) { rssItem.setFingerprint(UUID.randomUUID().toString()); @@ -96,4 +104,11 @@ class InsertRssItemIntoDatabase { } } + private static Boolean getBooleanOrDefault(String key, Boolean defaultValue, JsonObject jObj) { + if(jObj.has(key) && !jObj.get(key).isJsonNull()) { + return jObj.get(key).getAsBoolean(); + } else { + return defaultValue; + } + } } |