From 1171a5ce7db7c714db2733229321eb129a985cee Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sun, 30 Apr 2023 19:17:26 +0200 Subject: [PATCH] added image description, version upgrade, removed social media icons --- app/build.gradle | 4 +- .../api/mastodon/impl/MastodonMedia.java | 33 +++++-- .../backend/api/twitter/v1/impl/MediaV1.java | 20 ++-- .../backend/api/twitter/v2/impl/MediaV2.java | 20 ++-- .../twidda/backend/utils/AppStyles.java | 8 +- .../twidda/database/DatabaseAdapter.java | 23 ++++- .../twidda/database/impl/DatabaseMedia.java | 24 +++-- .../org/nuclearfog/twidda/model/Media.java | 22 +++-- .../twidda/ui/activities/ImageViewer.java | 14 +++ .../twidda/ui/activities/ProfileEditor.java | 7 +- .../twidda/ui/activities/StatusActivity.java | 1 + .../twidda/ui/adapter/NetworkAdapter.java | 8 +- .../twidda/ui/views/DescriptionView.java | 91 +++++++++++++++++++ app/src/main/res/drawable/mastodon.xml | 12 --- app/src/main/res/drawable/twitter.xml | 9 -- app/src/main/res/layout/page_image.xml | 15 ++- app/src/main/res/values/dimens.xml | 2 + 17 files changed, 235 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/org/nuclearfog/twidda/ui/views/DescriptionView.java delete mode 100644 app/src/main/res/drawable/mastodon.xml delete mode 100644 app/src/main/res/drawable/twitter.xml diff --git a/app/build.gradle b/app/build.gradle index 21ae26d6..ab83ea8b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId 'org.nuclearfog.twidda' minSdkVersion 21 targetSdkVersion 33 - versionCode 83 - versionName '3.1.3' + versionCode 84 + versionName '3.1.4' resConfigs 'en', 'de-rDE', 'zh-rCN' } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java index df07d96c..4347bb36 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java @@ -33,10 +33,16 @@ public class MastodonMedia implements Media { */ private static final String TYPE_VIDEO = "video"; + /** + * Mastodon audio type + */ + private static final String TYPE_AUDIO = "audio"; + private String key; private String url; private String preview = ""; - private int type = NONE; + private String description = ""; + private int type = UNDEFINED; /** * @param json Mastodon status JSON format @@ -59,6 +65,10 @@ public class MastodonMedia implements Media { case TYPE_VIDEO: type = VIDEO; break; + + case TYPE_AUDIO: + type = AUDIO; + break; } if (Patterns.WEB_URL.matcher(url).matches()) { this.url = url; @@ -68,6 +78,9 @@ public class MastodonMedia implements Media { if (Patterns.WEB_URL.matcher(preview).matches()) { this.preview = preview; } + if (json.has("description") && !json.isNull("description")) { + description = json.getString("description"); + } } @@ -95,6 +108,12 @@ public class MastodonMedia implements Media { } + @Override + public String getDescription() { + return description; + } + + @Override public boolean equals(@Nullable Object obj) { return obj instanceof Media && ((Media) obj).getKey().equals(getKey()); @@ -104,24 +123,24 @@ public class MastodonMedia implements Media { @NonNull @Override public String toString() { - String tostring; + String tostring = "type="; switch (getMediaType()) { case PHOTO: - tostring = "photo:"; + tostring += "photo"; break; case VIDEO: - tostring = "video:"; + tostring += "video"; break; case GIF: - tostring = "gif:"; + tostring += "gif"; break; default: - tostring = "none:"; + tostring += "none"; break; } - return tostring + "url=\"" + getUrl() + "\""; + return tostring + " url=\"" + getUrl() + "\""; } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java index 1077b23e..b31ab075 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java @@ -39,7 +39,7 @@ public class MediaV1 implements Media { */ private static final String TYPE_VIDEO = "video"; - private int type = NONE; + private int type = UNDEFINED; private String url = ""; private String previewUrl = ""; private String key; @@ -127,6 +127,12 @@ public class MediaV1 implements Media { } + @Override + public String getDescription() { + return ""; + } + + @Override public boolean equals(@Nullable Object obj) { return obj instanceof Media && ((Media) obj).getKey().equals(getKey()); @@ -136,24 +142,24 @@ public class MediaV1 implements Media { @NonNull @Override public String toString() { - String tostring; + String tostring = "type="; switch (getMediaType()) { case PHOTO: - tostring = "photo:"; + tostring += "photo"; break; case VIDEO: - tostring = "video:"; + tostring += "video"; break; case GIF: - tostring = "gif:"; + tostring += "gif"; break; default: - tostring = "none:"; + tostring += "none"; break; } - return tostring + "url=\"" + getUrl() + "\""; + return tostring + " url=\"" + getUrl() + "\""; } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java index 63744cf5..8a716d93 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java @@ -47,7 +47,7 @@ public class MediaV2 implements Media { private String key; private String preview; private String url = ""; - private int type = NONE; + private int type = UNDEFINED; /** * @param mediaItem Twitter media json format @@ -133,6 +133,12 @@ public class MediaV2 implements Media { } + @Override + public String getDescription() { + return ""; + } + + @Override public boolean equals(@Nullable Object obj) { return obj instanceof Media && ((Media) obj).getKey().equals(getKey()); @@ -142,24 +148,24 @@ public class MediaV2 implements Media { @NonNull @Override public String toString() { - String tostring; + String tostring = "type="; switch (getMediaType()) { case PHOTO: - tostring = "photo:"; + tostring += "photo"; break; case VIDEO: - tostring = "video:"; + tostring += "video"; break; case GIF: - tostring = "gif:"; + tostring += "gif"; break; default: - tostring = "none:"; + tostring += "none"; break; } - return tostring + "url=\"" + getUrl() + "\""; + return tostring + " url=\"" + getUrl() + "\""; } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java index 57f4d745..dfd5e957 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java @@ -7,7 +7,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; -import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.BitmapDrawable; @@ -251,10 +250,9 @@ public class AppStyles { } image = crop.transform(image); } - Point displaySize = new Point(); - activity.getWindowManager().getDefaultDisplay().getSize(displaySize); - int blurRadius = Math.max(Math.round(displaySize.x * 10.0f / image.getWidth()), 10); - float toolbarRatio = activity.getResources().getDimension(R.dimen.profile_toolbar_height) / displaySize.x; + int widthPixels = Resources.getSystem().getDisplayMetrics().widthPixels; + int blurRadius = Math.max(Math.round(widthPixels * 10.0f / image.getWidth()), 10); + float toolbarRatio = activity.getResources().getDimension(R.dimen.profile_toolbar_height) / widthPixels; // do final transformations (crop first image to toolbar background size, then blur) BlurTransformation blur = new BlurTransformation(activity.getApplicationContext(), blurRadius); CropTransformation crop = new CropTransformation(image.getWidth(), (int) (image.getWidth() * toolbarRatio), GravityHorizontal.CENTER, GravityVertical.TOP); diff --git a/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java b/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java index 16413d6e..6de828a6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/DatabaseAdapter.java @@ -20,7 +20,7 @@ public class DatabaseAdapter { /** * database version */ - private static final int DB_VERSION = 17; + private static final int DB_VERSION = 18; /** * database file name @@ -129,6 +129,7 @@ public class DatabaseAdapter { + MediaTable.KEY + " TEXT PRIMARY KEY," + MediaTable.TYPE + " INTEGER," + MediaTable.URL + " TEXT," + + MediaTable.DESCRIPTION + " TEXT," + MediaTable.PREVIEW + " TEXT);"; /** @@ -314,6 +315,11 @@ public class DatabaseAdapter { */ private static final String UPDATE_STATUS_ADD_MENTIONS = "ALTER TABLE " + StatusTable.NAME + " ADD " + StatusTable.MENTIONS + " TEXT;"; + /** + * add mediatable description + */ + private static final String UPDATE_MEDIA_ADD_DESCRIPTION = "ALTER TABLE " + MediaTable.NAME + " ADD " + MediaTable.DESCRIPTION + " TEXT;"; + /** * singleton instance */ @@ -360,7 +366,9 @@ public class DatabaseAdapter { // set initial version if (db.getVersion() == 0) { db.setVersion(DB_VERSION); - } else { + } + // update table + else if (db.getVersion() != DB_VERSION) { if (db.getVersion() < 6) { db.execSQL(UPDATE_ACCOUNT_ADD_HOST); db.execSQL(UPDATE_ACCOUNT_ADD_CLIENT_ID); @@ -403,8 +411,12 @@ public class DatabaseAdapter { db.execSQL(UPDATE_USER_ADD_EMOJI); db.setVersion(16); } - if (db.getVersion() < DB_VERSION) { + if (db.getVersion() < 17) { db.execSQL(UPDATE_STATUS_ADD_MENTIONS); + db.setVersion(17); + } + if (db.getVersion() < DB_VERSION) { + db.execSQL(UPDATE_MEDIA_ADD_DESCRIPTION); db.setVersion(DB_VERSION); } } @@ -964,6 +976,11 @@ public class DatabaseAdapter { * url for the media thumbnail */ String PREVIEW = "media_preview_url"; + + /** + * description of the media + */ + String DESCRIPTION = "media_description"; } /** diff --git a/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java b/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java index e8c70a4f..7b564d61 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java @@ -20,12 +20,13 @@ public class DatabaseMedia implements Media, MediaTable { /** * */ - public static final String[] PROJECTION = {KEY, URL, PREVIEW, TYPE}; + public static final String[] PROJECTION = {KEY, URL, PREVIEW, TYPE, DESCRIPTION}; private int mediaType; private String key = ""; private String url = ""; private String preview = ""; + private String description = ""; /** @@ -35,6 +36,7 @@ public class DatabaseMedia implements Media, MediaTable { String key = cursor.getString(0); String url = cursor.getString(1); String preview = cursor.getString(2); + String description = cursor.getString(3); mediaType = cursor.getInt(3); if (key != null) this.key = key; @@ -42,6 +44,8 @@ public class DatabaseMedia implements Media, MediaTable { this.url = url; if (preview != null) this.preview = preview; + if (description != null) + this.description = description; } @@ -69,6 +73,12 @@ public class DatabaseMedia implements Media, MediaTable { } + @Override + public String getDescription() { + return description; + } + + @Override public boolean equals(@Nullable Object obj) { return obj instanceof Media && ((Media) obj).getKey().equals(getKey()); @@ -78,24 +88,24 @@ public class DatabaseMedia implements Media, MediaTable { @NonNull @Override public String toString() { - String tostring; + String tostring = "type="; switch (getMediaType()) { case PHOTO: - tostring = "photo:"; + tostring += "photo"; break; case VIDEO: - tostring = "video:"; + tostring += "video"; break; case GIF: - tostring = "gif:"; + tostring += "gif"; break; default: - tostring = "none:"; + tostring += "none"; break; } - return tostring + "url=\"" + getUrl() + "\""; + return tostring + " url=\"" + getUrl() + "\""; } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/model/Media.java b/app/src/main/java/org/nuclearfog/twidda/model/Media.java index b0651aa8..5dff484f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/model/Media.java +++ b/app/src/main/java/org/nuclearfog/twidda/model/Media.java @@ -10,32 +10,37 @@ import java.io.Serializable; public interface Media extends Serializable, Comparable { /** - * returned when the status doesn't contain any media + * media is undefined */ - int NONE = -1; + int UNDEFINED = -1; /** - * returned when the status contains one or more images + * media is a image */ int PHOTO = 800; /** - * returned when the status contains a video + * media is a video */ int VIDEO = 801; /** - * returned when the status contains an animated gif + * media is an animated gif */ int GIF = 802; + /** + * media is an audio + */ + int AUDIO = 803; + /** * @return media key */ String getKey(); /** - * @return type of media e.g. video or image {@link #NONE,#GIF,#PHOTO,#VIDEO} + * @return type of media e.g. video or image {@link #UNDEFINED ,#GIF,#PHOTO,#VIDEO} */ int getMediaType(); @@ -49,6 +54,11 @@ public interface Media extends Serializable, Comparable { */ String getPreviewUrl(); + /** + * @return additional media description + */ + String getDescription(); + @Override default int compareTo(Media o) { diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java index 9cee4ffd..5a76e22e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java @@ -22,6 +22,7 @@ import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.ui.views.AnimatedImageView; +import org.nuclearfog.twidda.ui.views.DescriptionView; import org.nuclearfog.zoomview.ZoomView; import java.io.File; @@ -56,6 +57,12 @@ public class ImageViewer extends MediaActivity implements AsyncCallback - - - diff --git a/app/src/main/res/drawable/twitter.xml b/app/src/main/res/drawable/twitter.xml deleted file mode 100644 index 077d99c0..00000000 --- a/app/src/main/res/drawable/twitter.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/page_image.xml b/app/src/main/res/layout/page_image.xml index a0b11db4..59d8fc98 100644 --- a/app/src/main/res/layout/page_image.xml +++ b/app/src/main/res/layout/page_image.xml @@ -31,8 +31,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 48da406f..2c812835 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -302,4 +302,6 @@ 18sp 8dp + + 5dp \ No newline at end of file