Show social comment icon on playing screen (#7127)

This commit is contained in:
Tony Tam
2025-02-21 11:34:31 -10:00
committed by GitHub
parent c3b7006308
commit ba56f5c76e
8 changed files with 66 additions and 10 deletions

View File

@ -10,6 +10,7 @@ import android.view.MenuItem;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import java.util.Arrays; import java.util.Arrays;
@ -71,6 +72,7 @@ public class FeedItemMenuHandler {
boolean canAddFavorite = false; boolean canAddFavorite = false;
boolean canRemoveFavorite = false; boolean canRemoveFavorite = false;
boolean canShowTranscript = false; boolean canShowTranscript = false;
boolean canShowSocialInteract = false;
for (FeedItem item : selectedItems) { for (FeedItem item : selectedItems) {
boolean hasMedia = item.getMedia() != null; boolean hasMedia = item.getMedia() != null;
@ -88,12 +90,14 @@ public class FeedItemMenuHandler {
canAddFavorite |= !item.isTagged(FeedItem.TAG_FAVORITE); canAddFavorite |= !item.isTagged(FeedItem.TAG_FAVORITE);
canRemoveFavorite |= item.isTagged(FeedItem.TAG_FAVORITE); canRemoveFavorite |= item.isTagged(FeedItem.TAG_FAVORITE);
canShowTranscript |= item.hasTranscript(); canShowTranscript |= item.hasTranscript();
canShowSocialInteract |= item.getSocialInteractUrl() != null;
} }
if (selectedItems.size() > 1) { if (selectedItems.size() > 1) {
canVisitWebsite = false; canVisitWebsite = false;
canShare = false; canShare = false;
canShowTranscript = false; canShowTranscript = false;
canShowSocialInteract = false;
} }
setItemVisibility(menu, R.id.skip_episode_item, canSkip); setItemVisibility(menu, R.id.skip_episode_item, canSkip);
@ -105,6 +109,7 @@ public class FeedItemMenuHandler {
setItemVisibility(menu, R.id.mark_read_item, canMarkPlayed); setItemVisibility(menu, R.id.mark_read_item, canMarkPlayed);
setItemVisibility(menu, R.id.mark_unread_item, canMarkUnplayed); setItemVisibility(menu, R.id.mark_unread_item, canMarkUnplayed);
setItemVisibility(menu, R.id.reset_position, canResetPosition); setItemVisibility(menu, R.id.reset_position, canResetPosition);
setItemVisibility(menu, R.id.open_social_interact_url, canShowSocialInteract);
// Display proper strings when item has no media // Display proper strings when item has no media
if (selectedItems.size() == 1 && selectedItems.get(0).getMedia() == null) { if (selectedItems.size() == 1 && selectedItems.get(0).getMedia() == null) {
@ -225,6 +230,15 @@ public class FeedItemMenuHandler {
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true); DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true);
} else if (menuItemId == R.id.visit_website_item) { } else if (menuItemId == R.id.visit_website_item) {
IntentUtils.openInBrowser(context, selectedItem.getLinkWithFallback()); IntentUtils.openInBrowser(context, selectedItem.getLinkWithFallback());
} else if (menuItemId == R.id.open_social_interact_url) {
new MaterialAlertDialogBuilder(context)
.setTitle(R.string.visit_social_interact_query_title)
.setMessage(context.getString(R.string.visit_social_interact_query_message,
selectedItem.getSocialInteractUrl()))
.setPositiveButton(R.string.confirm_label, (dialog, which) ->
IntentUtils.openInBrowser(context, selectedItem.getSocialInteractUrl()))
.setNegativeButton(R.string.cancel_label, null)
.show();
} else if (menuItemId == R.id.share_item) { } else if (menuItemId == R.id.share_item) {
ShareDialog shareDialog = ShareDialog.newInstance(selectedItem); ShareDialog shareDialog = ShareDialog.newInstance(selectedItem);
shareDialog.show((fragment.getActivity().getSupportFragmentManager()), "ShareEpisodeDialog"); shareDialog.show((fragment.getActivity().getSupportFragmentManager()), "ShareEpisodeDialog");

View File

@ -2,12 +2,6 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"> xmlns:custom="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/transcript_item"
android:icon="@drawable/transcript"
android:title="@string/show_transcript"
custom:showAsAction="ifRoom">
</item>
<item <item
android:id="@+id/add_to_favorites_item" android:id="@+id/add_to_favorites_item"
android:icon="@drawable/ic_star_border" android:icon="@drawable/ic_star_border"
@ -78,6 +72,20 @@
android:visible="false"> android:visible="false">
</item> </item>
<item
android:id="@+id/transcript_item"
android:icon="@drawable/transcript"
android:title="@string/show_transcript"
custom:showAsAction="never">
</item>
<item
android:id="@+id/open_social_interact_url"
android:icon="@drawable/ic_chat"
custom:showAsAction="never"
android:title="@string/visit_social_interact_label">
</item>
<item <item
android:id="@+id/share_item" android:id="@+id/share_item"
android:icon="@drawable/ic_share" android:icon="@drawable/ic_share"

View File

@ -42,6 +42,7 @@ public class FeedItem implements Serializable {
private transient Feed feed; private transient Feed feed;
private long feedId; private long feedId;
private String podcastIndexChapterUrl; private String podcastIndexChapterUrl;
private String socialInteractUrl;
private String podcastIndexTranscriptUrl; private String podcastIndexTranscriptUrl;
private String podcastIndexTranscriptType; private String podcastIndexTranscriptType;
private String podcastIndexTranscriptText; private String podcastIndexTranscriptText;
@ -87,7 +88,7 @@ public class FeedItem implements Serializable {
public FeedItem(long id, String title, String link, Date pubDate, String paymentLink, long feedId, public FeedItem(long id, String title, String link, Date pubDate, String paymentLink, long feedId,
boolean hasChapters, String imageUrl, int state, boolean hasChapters, String imageUrl, int state,
String itemIdentifier, boolean autoDownloadEnabled, String podcastIndexChapterUrl, String itemIdentifier, boolean autoDownloadEnabled, String podcastIndexChapterUrl,
String transcriptType, String transcriptUrl) { String transcriptType, String transcriptUrl, String socialInteractUrl) {
this.id = id; this.id = id;
this.title = title; this.title = title;
this.link = link; this.link = link;
@ -100,6 +101,7 @@ public class FeedItem implements Serializable {
this.itemIdentifier = itemIdentifier; this.itemIdentifier = itemIdentifier;
this.autoDownloadEnabled = autoDownloadEnabled; this.autoDownloadEnabled = autoDownloadEnabled;
this.podcastIndexChapterUrl = podcastIndexChapterUrl; this.podcastIndexChapterUrl = podcastIndexChapterUrl;
this.socialInteractUrl = socialInteractUrl;
if (transcriptUrl != null) { if (transcriptUrl != null) {
this.podcastIndexTranscriptUrl = transcriptUrl; this.podcastIndexTranscriptUrl = transcriptUrl;
this.podcastIndexTranscriptType = transcriptType; this.podcastIndexTranscriptType = transcriptType;
@ -170,6 +172,9 @@ public class FeedItem implements Serializable {
if (other.podcastIndexChapterUrl != null) { if (other.podcastIndexChapterUrl != null) {
podcastIndexChapterUrl = other.podcastIndexChapterUrl; podcastIndexChapterUrl = other.podcastIndexChapterUrl;
} }
if (other.socialInteractUrl != null) {
socialInteractUrl = other.socialInteractUrl;
}
if (other.getTranscriptUrl() != null) { if (other.getTranscriptUrl() != null) {
podcastIndexTranscriptUrl = other.podcastIndexTranscriptUrl; podcastIndexTranscriptUrl = other.podcastIndexTranscriptUrl;
} }
@ -430,6 +435,14 @@ public class FeedItem implements Serializable {
podcastIndexChapterUrl = url; podcastIndexChapterUrl = url;
} }
public void setSocialInteractUrl(String url) {
socialInteractUrl = url;
}
public String getSocialInteractUrl() {
return socialInteractUrl;
}
public void setTranscriptUrl(String type, String url) { public void setTranscriptUrl(String type, String url) {
updateTranscriptPreferredFormat(type, url); updateTranscriptPreferredFormat(type, url);
} }

View File

@ -12,8 +12,10 @@ public class PodcastIndex extends Namespace {
public static final String NSURI = "https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md"; public static final String NSURI = "https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md";
public static final String NSURI2 = "https://podcastindex.org/namespace/1.0"; public static final String NSURI2 = "https://podcastindex.org/namespace/1.0";
private static final String URL = "url"; private static final String URL = "url";
private static final String URI = "uri";
private static final String FUNDING = "funding"; private static final String FUNDING = "funding";
private static final String CHAPTERS = "chapters"; private static final String CHAPTERS = "chapters";
private static final String SOCIAL_INTERACT = "socialInteract";
private static final String TRANSCRIPT = "transcript"; private static final String TRANSCRIPT = "transcript";
private static final String TYPE = "type"; private static final String TYPE = "type";
@ -30,6 +32,11 @@ public class PodcastIndex extends Namespace {
if (!TextUtils.isEmpty(href)) { if (!TextUtils.isEmpty(href)) {
state.getCurrentItem().setPodcastIndexChapterUrl(href); state.getCurrentItem().setPodcastIndexChapterUrl(href);
} }
} else if (SOCIAL_INTERACT.equals(localName)) {
String href = attributes.getValue(URI);
if (!TextUtils.isEmpty(href) && state.getCurrentItem() != null) {
state.getCurrentItem().setSocialInteractUrl(href);
}
} else if (TRANSCRIPT.equals(localName)) { } else if (TRANSCRIPT.equals(localName)) {
String href = attributes.getValue(URL); String href = attributes.getValue(URL);
String type = attributes.getValue(TYPE); String type = attributes.getValue(TYPE);

View File

@ -349,6 +349,10 @@ class DBUpgrader {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_TYPE + " TEXT"); + " ADD COLUMN " + PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_TYPE + " TEXT");
} }
if (oldVersion < 3080000) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + PodDBAdapter.KEY_SOCIAL_INTERACT_URL + " TEXT");
}
} }
} }

View File

@ -52,7 +52,7 @@ public class PodDBAdapter {
private static final String TAG = "PodDBAdapter"; private static final String TAG = "PodDBAdapter";
public static final String DATABASE_NAME = "Antennapod.db"; public static final String DATABASE_NAME = "Antennapod.db";
public static final int VERSION = 3050000; public static final int VERSION = 3080000;
/** /**
* Maximum number of arguments for IN-operator. * Maximum number of arguments for IN-operator.
@ -121,6 +121,7 @@ public class PodDBAdapter {
public static final String KEY_EPISODE_NOTIFICATION = "episode_notification"; public static final String KEY_EPISODE_NOTIFICATION = "episode_notification";
public static final String KEY_NEW_EPISODES_ACTION = "new_episodes_action"; public static final String KEY_NEW_EPISODES_ACTION = "new_episodes_action";
public static final String KEY_PODCASTINDEX_CHAPTER_URL = "podcastindex_chapter_url"; public static final String KEY_PODCASTINDEX_CHAPTER_URL = "podcastindex_chapter_url";
public static final String KEY_SOCIAL_INTERACT_URL = "social_interact_url";
public static final String KEY_STATE = "state"; public static final String KEY_STATE = "state";
public static final String KEY_PODCASTINDEX_TRANSCRIPT_URL = "podcastindex_transcript_url"; public static final String KEY_PODCASTINDEX_TRANSCRIPT_URL = "podcastindex_transcript_url";
public static final String KEY_PODCASTINDEX_TRANSCRIPT_TYPE = "podcastindex_transcript_type"; public static final String KEY_PODCASTINDEX_TRANSCRIPT_TYPE = "podcastindex_transcript_type";
@ -188,7 +189,8 @@ public class PodDBAdapter {
+ KEY_AUTO_DOWNLOAD_ENABLED + " INTEGER," + KEY_AUTO_DOWNLOAD_ENABLED + " INTEGER,"
+ KEY_PODCASTINDEX_CHAPTER_URL + " TEXT," + KEY_PODCASTINDEX_CHAPTER_URL + " TEXT,"
+ KEY_PODCASTINDEX_TRANSCRIPT_TYPE + " TEXT," + KEY_PODCASTINDEX_TRANSCRIPT_TYPE + " TEXT,"
+ KEY_PODCASTINDEX_TRANSCRIPT_URL + " TEXT" + ")"; + KEY_PODCASTINDEX_TRANSCRIPT_URL + " TEXT,"
+ KEY_SOCIAL_INTERACT_URL + " TEXT)";
private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE " private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE "
+ TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + KEY_DURATION + TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + KEY_DURATION
@ -277,6 +279,7 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_ITEMS + "." + KEY_IMAGE_URL + ", " + TABLE_NAME_FEED_ITEMS + "." + KEY_IMAGE_URL + ", "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_AUTO_DOWNLOAD_ENABLED + ", " + TABLE_NAME_FEED_ITEMS + "." + KEY_AUTO_DOWNLOAD_ENABLED + ", "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_CHAPTER_URL + ", " + TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_CHAPTER_URL + ", "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_SOCIAL_INTERACT_URL + ", "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_TRANSCRIPT_TYPE + ", " + TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_TRANSCRIPT_TYPE + ", "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_TRANSCRIPT_URL; + TABLE_NAME_FEED_ITEMS + "." + KEY_PODCASTINDEX_TRANSCRIPT_URL;
@ -680,6 +683,7 @@ public class PodDBAdapter {
values.put(KEY_AUTO_DOWNLOAD_ENABLED, item.isAutoDownloadEnabled()); values.put(KEY_AUTO_DOWNLOAD_ENABLED, item.isAutoDownloadEnabled());
values.put(KEY_IMAGE_URL, item.getImageUrl()); values.put(KEY_IMAGE_URL, item.getImageUrl());
values.put(KEY_PODCASTINDEX_CHAPTER_URL, item.getPodcastIndexChapterUrl()); values.put(KEY_PODCASTINDEX_CHAPTER_URL, item.getPodcastIndexChapterUrl());
values.put(KEY_SOCIAL_INTERACT_URL, item.getSocialInteractUrl());
// We only store one transcript url, we prefer JSON if it exists // We only store one transcript url, we prefer JSON if it exists
String type = item.getTranscriptType(); String type = item.getTranscriptType();

View File

@ -25,6 +25,7 @@ public class FeedItemCursor extends CursorWrapper {
private final int indexAutoDownload; private final int indexAutoDownload;
private final int indexImageUrl; private final int indexImageUrl;
private final int indexPodcastIndexChapterUrl; private final int indexPodcastIndexChapterUrl;
private final int indexSocialInteractUrl;
private final int indexMediaId; private final int indexMediaId;
private final int indexPodcastIndexTranscriptType; private final int indexPodcastIndexTranscriptType;
private final int indexPodcastIndexTranscriptUrl; private final int indexPodcastIndexTranscriptUrl;
@ -45,6 +46,7 @@ public class FeedItemCursor extends CursorWrapper {
indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL); indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
indexPodcastIndexChapterUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_CHAPTER_URL); indexPodcastIndexChapterUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_CHAPTER_URL);
indexMediaId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID); indexMediaId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID);
indexSocialInteractUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SOCIAL_INTERACT_URL);
indexPodcastIndexTranscriptType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_TYPE); indexPodcastIndexTranscriptType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_TYPE);
indexPodcastIndexTranscriptUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_URL); indexPodcastIndexTranscriptUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_TRANSCRIPT_URL);
} }
@ -68,7 +70,8 @@ public class FeedItemCursor extends CursorWrapper {
getLong(indexAutoDownload) > 0, getLong(indexAutoDownload) > 0,
getString(indexPodcastIndexChapterUrl), getString(indexPodcastIndexChapterUrl),
getString(indexPodcastIndexTranscriptType), getString(indexPodcastIndexTranscriptType),
getString(indexPodcastIndexTranscriptUrl)); getString(indexPodcastIndexTranscriptUrl),
getString(indexSocialInteractUrl));
if (!isNull(indexMediaId)) { if (!isNull(indexMediaId)) {
item.setMedia(feedMediaCursor.getFeedMedia()); item.setMedia(feedMediaCursor.getFeedMedia());
} }

View File

@ -280,6 +280,9 @@
<string name="no_transcript_label">No transcript</string> <string name="no_transcript_label">No transcript</string>
<string name="remove_from_favorite_label">Remove from favorites</string> <string name="remove_from_favorite_label">Remove from favorites</string>
<string name="visit_website_label">Visit website</string> <string name="visit_website_label">Visit website</string>
<string name="visit_social_interact_label">Show comments</string>
<string name="visit_social_interact_query_title">You are leaving AntennaPod</string>
<string name="visit_social_interact_query_message">Please make sure that you trust the website \"%1$s\".</string>
<string name="skip_episode_label">Skip episode</string> <string name="skip_episode_label">Skip episode</string>
<string name="reset_position">Reset playback position</string> <string name="reset_position">Reset playback position</string>
<string name="no_items_selected">No items selected</string> <string name="no_items_selected">No items selected</string>