Merge pull request #5200 from TacoTheDank/plugin-updates

Update plugins and Gradle
This commit is contained in:
ByteHamster 2021-07-24 17:47:09 +02:00 committed by GitHub
commit dbac6cae46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 422 additions and 468 deletions

View File

@ -1,7 +1,7 @@
plugins {
id('com.android.application')
id('com.getkeepsafe.dexcount')
id('com.github.triplet.play') version '2.7.5' apply false
id('com.github.triplet.play') version '3.4.0' apply false
}
apply from: "../common.gradle"
apply from: "../playFlavor.gradle"
@ -170,8 +170,8 @@ dependencies {
if (project.hasProperty("antennaPodPlayPublisherCredentials")) {
apply plugin: 'com.github.triplet.play'
play {
track = 'alpha'
serviceAccountCredentials = file(antennaPodPlayPublisherCredentials)
track.set('alpha')
serviceAccountCredentials.set(file(antennaPodPlayPublisherCredentials))
}
}

View File

@ -20,7 +20,7 @@ import static java.util.Collections.singletonList;
/**
* Test class for GpodnetService
*/
@Ignore
@Ignore("Needs valid credentials to run")
@RunWith(AndroidJUnit4.class)
public class GPodnetServiceTest {

View File

@ -1,36 +0,0 @@
package de.test.antennapod.ui;
import android.content.Intent;
import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.VideoplayerActivity;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
/**
* Test class for VideoplayerActivity
*/
@MediumTest
@Ignore
public class VideoplayerActivityTest {
@Rule
public ActivityTestRule<VideoplayerActivity> activityTestRule = new ActivityTestRule<>(VideoplayerActivity.class, false, false);
/**
* Test if activity can be started.
*/
@Test
public void testStartActivity() throws Exception {
activityTestRule.launchActivity(new Intent());
onView(withId(R.id.videoPlayerContainer)).check(matches(isDisplayed()));
}
}

View File

@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="de.danoeh.antennapod"
android:installLocation="auto">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
@ -353,4 +355,11 @@
android:resource="@xml/actions" />
</application>
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="text/*" />
</intent>
</queries>
</manifest>

View File

@ -119,20 +119,19 @@ public class OpmlFeedChooserActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.select_all_item:
selectAll.setVisible(false);
selectAllItems(true);
deselectAll.setVisible(true);
return true;
case R.id.deselect_all_item:
deselectAll.setVisible(false);
selectAllItems(false);
selectAll.setVisible(true);
return true;
default:
return false;
final int itemId = item.getItemId();
if (itemId == R.id.select_all_item) {
selectAll.setVisible(false);
selectAllItems(true);
deselectAll.setVisible(true);
return true;
} else if (itemId == R.id.deselect_all_item) {
deselectAll.setVisible(false);
selectAllItems(false);
selectAll.setVisible(true);
return true;
}
return false;
}
private void selectAllItems(boolean b) {

View File

@ -88,30 +88,28 @@ public class PreferenceActivity extends AppCompatActivity implements SearchPrefe
}
public static int getTitleOfPage(int preferences) {
switch (preferences) {
case R.xml.preferences_network:
return R.string.network_pref;
case R.xml.preferences_autodownload:
return R.string.pref_automatic_download_title;
case R.xml.preferences_playback:
return R.string.playback_pref;
case R.xml.preferences_storage:
return R.string.storage_pref;
case R.xml.preferences_import_export:
return R.string.import_export_pref;
case R.xml.preferences_user_interface:
return R.string.user_interface_label;
case R.xml.preferences_gpodder:
return R.string.gpodnet_main_label;
case R.xml.preferences_notifications:
return R.string.notification_pref_fragment;
case R.xml.feed_settings:
return R.string.feed_settings_label;
case R.xml.preferences_swipe:
return R.string.swipeactions_label;
default:
return R.string.settings_label;
if (preferences == R.xml.preferences_network) {
return R.string.network_pref;
} else if (preferences == R.xml.preferences_autodownload) {
return R.string.pref_automatic_download_title;
} else if (preferences == R.xml.preferences_playback) {
return R.string.playback_pref;
} else if (preferences == R.xml.preferences_storage) {
return R.string.storage_pref;
} else if (preferences == R.xml.preferences_import_export) {
return R.string.import_export_pref;
} else if (preferences == R.xml.preferences_user_interface) {
return R.string.user_interface_label;
} else if (preferences == R.xml.preferences_gpodder) {
return R.string.gpodnet_main_label;
} else if (preferences == R.xml.preferences_notifications) {
return R.string.notification_pref_fragment;
} else if (preferences == R.xml.feed_settings) {
return R.string.feed_settings_label;
} else if (preferences == R.xml.preferences_swipe) {
return R.string.swipeactions_label;
}
return R.string.settings_label;
}
public PreferenceFragmentCompat openScreen(int screen) {

View File

@ -507,21 +507,21 @@ public class AudioPlayerFragment extends Fragment implements
if (feedItem != null && FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), feedItem)) {
return true;
}
switch (item.getItemId()) {
case R.id.disable_sleeptimer_item: // Fall-through
case R.id.set_sleeptimer_item:
new SleepTimerDialog().show(getChildFragmentManager(), "SleepTimerDialog");
return true;
case R.id.audio_controls:
PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance();
dialog.show(getChildFragmentManager(), "playback_controls");
return true;
case R.id.open_feed_item:
if (feedItem != null) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), feedItem.getFeedId());
startActivity(intent);
}
return true;
final int itemId = item.getItemId();
if (itemId == R.id.disable_sleeptimer_item || itemId == R.id.set_sleeptimer_item) {
new SleepTimerDialog().show(getChildFragmentManager(), "SleepTimerDialog");
return true;
} else if (itemId == R.id.audio_controls) {
PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance();
dialog.show(getChildFragmentManager(), "playback_controls");
return true;
} else if (itemId == R.id.open_feed_item) {
if (feedItem != null) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), feedItem.getFeedId());
startActivity(intent);
}
return true;
}
return false;
}

View File

@ -122,43 +122,42 @@ public abstract class EpisodesListFragment extends Fragment {
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (!super.onOptionsItemSelected(item)) {
switch (item.getItemId()) {
case R.id.refresh_item:
AutoUpdateManager.runImmediate(requireContext());
return true;
case R.id.mark_all_read_item:
ConfirmationDialog markAllReadConfirmationDialog = new ConfirmationDialog(getActivity(),
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg) {
final int itemId = item.getItemId();
if (itemId == R.id.refresh_item) {
AutoUpdateManager.runImmediate(requireContext());
return true;
} else if (itemId == R.id.mark_all_read_item) {
ConfirmationDialog markAllReadConfirmationDialog = new ConfirmationDialog(getActivity(),
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.markAllItemsRead();
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.mark_all_read_msg, Toast.LENGTH_SHORT);
}
};
markAllReadConfirmationDialog.createNewDialog().show();
return true;
case R.id.remove_all_new_flags_item:
ConfirmationDialog removeAllNewFlagsConfirmationDialog = new ConfirmationDialog(getActivity(),
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.markAllItemsRead();
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.mark_all_read_msg, Toast.LENGTH_SHORT);
}
};
markAllReadConfirmationDialog.createNewDialog().show();
return true;
} else if (itemId == R.id.remove_all_new_flags_item) {
ConfirmationDialog removeAllNewFlagsConfirmationDialog = new ConfirmationDialog(getActivity(),
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.removeAllNewFlags();
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.removed_all_new_flags_msg, Toast.LENGTH_SHORT);
}
};
removeAllNewFlagsConfirmationDialog.createNewDialog().show();
return true;
default:
return false;
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.removeAllNewFlags();
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.removed_all_new_flags_msg, Toast.LENGTH_SHORT);
}
};
removeAllNewFlagsConfirmationDialog.createNewDialog().show();
return true;
}
return false;
} else {
return true;
}

View File

@ -332,17 +332,16 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
if (feedMenuHandled) {
return true;
}
switch (item.getItemId()) {
case R.id.rename_item:
new RenameFeedDialog(getActivity(), feed).show();
return true;
case R.id.remove_item:
RemoveFeedDialog.show(getContext(), feed, () ->
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null));
return true;
default:
return false;
final int itemId = item.getItemId();
if (itemId == R.id.rename_item) {
new RenameFeedDialog(getActivity(), feed).show();
return true;
} else if (itemId == R.id.remove_item) {
RemoveFeedDialog.show(getContext(), feed, () ->
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null));
return true;
}
return false;
}
@Override

View File

@ -143,43 +143,42 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS
}
private boolean onFeedContextMenuClicked(Feed feed, MenuItem item) {
switch (item.getItemId()) {
case R.id.remove_all_new_flags_item:
ConfirmationDialog removeAllNewFlagsConfirmationDialog = new ConfirmationDialog(getContext(),
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.removeFeedNewFlag(feed.getId());
}
};
removeAllNewFlagsConfirmationDialog.createNewDialog().show();
return true;
case R.id.mark_all_read_item:
ConfirmationDialog markAllReadConfirmationDialog = new ConfirmationDialog(getContext(),
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg) {
final int itemId = item.getItemId();
if (itemId == R.id.remove_all_new_flags_item) {
ConfirmationDialog removeAllNewFlagsConfirmationDialog = new ConfirmationDialog(getContext(),
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.removeFeedNewFlag(feed.getId());
}
};
removeAllNewFlagsConfirmationDialog.createNewDialog().show();
return true;
} else if (itemId == R.id.mark_all_read_item) {
ConfirmationDialog markAllReadConfirmationDialog = new ConfirmationDialog(getContext(),
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.markFeedRead(feed.getId());
}
};
markAllReadConfirmationDialog.createNewDialog().show();
return true;
case R.id.rename_item:
new RenameFeedDialog(getActivity(), feed).show();
return true;
case R.id.remove_item:
RemoveFeedDialog.show(getContext(), feed, () -> {
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
});
return true;
default:
return super.onContextItemSelected(item);
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
dialog.dismiss();
DBWriter.markFeedRead(feed.getId());
}
};
markAllReadConfirmationDialog.createNewDialog().show();
return true;
} else if (itemId == R.id.rename_item) {
new RenameFeedDialog(getActivity(), feed).show();
return true;
} else if (itemId == R.id.remove_item) {
RemoveFeedDialog.show(getContext(), feed, () -> {
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
});
return true;
}
return super.onContextItemSelected(item);
}
@Subscribe(threadMode = ThreadMode.MAIN)

View File

@ -258,77 +258,76 @@ public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickLi
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.queue_lock:
toggleQueueLock();
return true;
case R.id.refresh_item:
AutoUpdateManager.runImmediate(requireContext());
return true;
case R.id.clear_queue:
// make sure the user really wants to clear the queue
ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
R.string.clear_queue_label,
R.string.clear_queue_confirmation_msg) {
final int itemId = item.getItemId();
if (itemId == R.id.queue_lock) {
toggleQueueLock();
return true;
} else if (itemId == R.id.refresh_item) {
AutoUpdateManager.runImmediate(requireContext());
return true;
} else if (itemId == R.id.clear_queue) {
// make sure the user really wants to clear the queue
ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
R.string.clear_queue_label,
R.string.clear_queue_confirmation_msg) {
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
DBWriter.clearQueue();
}
};
conDialog.createNewDialog().show();
return true;
case R.id.queue_sort_episode_title_asc:
setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
return true;
case R.id.queue_sort_episode_title_desc:
setSortOrder(SortOrder.EPISODE_TITLE_Z_A);
return true;
case R.id.queue_sort_date_asc:
setSortOrder(SortOrder.DATE_OLD_NEW);
return true;
case R.id.queue_sort_date_desc:
setSortOrder(SortOrder.DATE_NEW_OLD);
return true;
case R.id.queue_sort_duration_asc:
setSortOrder(SortOrder.DURATION_SHORT_LONG);
return true;
case R.id.queue_sort_duration_desc:
setSortOrder(SortOrder.DURATION_LONG_SHORT);
return true;
case R.id.queue_sort_feed_title_asc:
setSortOrder(SortOrder.FEED_TITLE_A_Z);
return true;
case R.id.queue_sort_feed_title_desc:
setSortOrder(SortOrder.FEED_TITLE_Z_A);
return true;
case R.id.queue_sort_random:
setSortOrder(SortOrder.RANDOM);
return true;
case R.id.queue_sort_smart_shuffle_asc:
setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW);
return true;
case R.id.queue_sort_smart_shuffle_desc:
setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD);
return true;
case R.id.queue_keep_sorted:
boolean keepSortedOld = UserPreferences.isQueueKeepSorted();
boolean keepSortedNew = !keepSortedOld;
UserPreferences.setQueueKeepSorted(keepSortedNew);
if (keepSortedNew) {
SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder();
DBWriter.reorderQueue(sortOrder, true);
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
DBWriter.clearQueue();
}
if (recyclerAdapter != null) {
recyclerAdapter.updateDragDropEnabled();
}
refreshToolbarState();
return true;
default:
return false;
};
conDialog.createNewDialog().show();
return true;
} else if (itemId == R.id.queue_sort_episode_title_asc) {
setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
return true;
} else if (itemId == R.id.queue_sort_episode_title_desc) {
setSortOrder(SortOrder.EPISODE_TITLE_Z_A);
return true;
} else if (itemId == R.id.queue_sort_date_asc) {
setSortOrder(SortOrder.DATE_OLD_NEW);
return true;
} else if (itemId == R.id.queue_sort_date_desc) {
setSortOrder(SortOrder.DATE_NEW_OLD);
return true;
} else if (itemId == R.id.queue_sort_duration_asc) {
setSortOrder(SortOrder.DURATION_SHORT_LONG);
return true;
} else if (itemId == R.id.queue_sort_duration_desc) {
setSortOrder(SortOrder.DURATION_LONG_SHORT);
return true;
} else if (itemId == R.id.queue_sort_feed_title_asc) {
setSortOrder(SortOrder.FEED_TITLE_A_Z);
return true;
} else if (itemId == R.id.queue_sort_feed_title_desc) {
setSortOrder(SortOrder.FEED_TITLE_Z_A);
return true;
} else if (itemId == R.id.queue_sort_random) {
setSortOrder(SortOrder.RANDOM);
return true;
} else if (itemId == R.id.queue_sort_smart_shuffle_asc) {
setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW);
return true;
} else if (itemId == R.id.queue_sort_smart_shuffle_desc) {
setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD);
return true;
} else if (itemId == R.id.queue_keep_sorted) {
boolean keepSortedOld = UserPreferences.isQueueKeepSorted();
boolean keepSortedNew = !keepSortedOld;
UserPreferences.setQueueKeepSorted(keepSortedNew);
if (keepSortedNew) {
SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder();
DBWriter.reorderQueue(sortOrder, true);
}
if (recyclerAdapter != null) {
recyclerAdapter.updateDragDropEnabled();
}
refreshToolbarState();
return true;
}
return false;
}
private void toggleQueueLock() {
@ -404,20 +403,19 @@ public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickLi
return true;
}
switch(item.getItemId()) {
case R.id.move_to_top_item:
queue.add(0, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, 0);
DBWriter.moveQueueItemToTop(selectedItem.getId(), true);
return true;
case R.id.move_to_bottom_item:
queue.add(queue.size()-1, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, queue.size()-1);
DBWriter.moveQueueItemToBottom(selectedItem.getId(), true);
return true;
default:
return FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem);
final int itemId = item.getItemId();
if (itemId == R.id.move_to_top_item) {
queue.add(0, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, 0);
DBWriter.moveQueueItemToTop(selectedItem.getId(), true);
return true;
} else if (itemId == R.id.move_to_bottom_item) {
queue.add(queue.size() - 1, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, queue.size() - 1);
DBWriter.moveQueueItemToBottom(selectedItem.getId(), true);
return true;
}
return FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem);
}
@Override

View File

@ -172,31 +172,30 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh_item:
AutoUpdateManager.runImmediate(requireContext());
return true;
case R.id.subscriptions_filter:
SubscriptionsFilterDialog.showDialog(requireContext());
return true;
case R.id.subscriptions_sort:
FeedSortDialog.showDialog(requireContext());
return true;
case R.id.subscription_num_columns_2:
setColumnNumber(2);
return true;
case R.id.subscription_num_columns_3:
setColumnNumber(3);
return true;
case R.id.subscription_num_columns_4:
setColumnNumber(4);
return true;
case R.id.subscription_num_columns_5:
setColumnNumber(5);
return true;
default:
return false;
final int itemId = item.getItemId();
if (itemId == R.id.refresh_item) {
AutoUpdateManager.runImmediate(requireContext());
return true;
} else if (itemId == R.id.subscriptions_filter) {
SubscriptionsFilterDialog.showDialog(requireContext());
return true;
} else if (itemId == R.id.subscriptions_sort) {
FeedSortDialog.showDialog(requireContext());
return true;
} else if (itemId == R.id.subscription_num_columns_2) {
setColumnNumber(2);
return true;
} else if (itemId == R.id.subscription_num_columns_3) {
setColumnNumber(3);
return true;
} else if (itemId == R.id.subscription_num_columns_4) {
setColumnNumber(4);
return true;
} else if (itemId == R.id.subscription_num_columns_5) {
setColumnNumber(5);
return true;
}
return false;
}
private void setColumnNumber(int columns) {
@ -315,28 +314,27 @@ public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItem
Feed feed = selectedFeed;
selectedFeed = null;
switch (item.getItemId()) {
case R.id.remove_all_new_flags_item:
displayConfirmationDialog(
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg,
() -> DBWriter.removeFeedNewFlag(feed.getId()));
return true;
case R.id.mark_all_read_item:
displayConfirmationDialog(
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg,
() -> DBWriter.markFeedRead(feed.getId()));
return true;
case R.id.rename_item:
new RenameFeedDialog(getActivity(), feed).show();
return true;
case R.id.remove_item:
RemoveFeedDialog.show(getContext(), feed, null);
return true;
default:
return super.onContextItemSelected(item);
final int itemId = item.getItemId();
if (itemId == R.id.remove_all_new_flags_item) {
displayConfirmationDialog(
R.string.remove_all_new_flags_label,
R.string.remove_all_new_flags_confirmation_msg,
() -> DBWriter.removeFeedNewFlag(feed.getId()));
return true;
} else if (itemId == R.id.mark_all_read_item) {
displayConfirmationDialog(
R.string.mark_all_read_label,
R.string.mark_all_read_confirmation_msg,
() -> DBWriter.markFeedRead(feed.getId()));
return true;
} else if (itemId == R.id.rename_item) {
new RenameFeedDialog(getActivity(), feed).show();
return true;
} else if (itemId == R.id.remove_item) {
RemoveFeedDialog.show(getContext(), feed, null);
return true;
}
return super.onContextItemSelected(item);
}
private <T> void displayConfirmationDialog(@StringRes int title, @StringRes int message, Callable<? extends T> task) {

View File

@ -142,73 +142,60 @@ public class FeedItemMenuHandler {
@NonNull FeedItem selectedItem) {
@NonNull Context context = fragment.requireContext();
switch (menuItemId) {
case R.id.skip_episode_item:
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
break;
case R.id.remove_item:
DBWriter.deleteFeedMediaOfItem(context, selectedItem.getMedia().getId());
break;
case R.id.remove_new_flag_item:
removeNewFlagWithUndo(fragment, selectedItem);
break;
case R.id.mark_read_item:
selectedItem.setPlayed(true);
DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, true);
if (GpodnetPreferences.loggedIn()) {
FeedMedia media = selectedItem.getMedia();
// not all items have media, Gpodder only cares about those that do
if (media != null) {
EpisodeAction actionPlay = new EpisodeAction.Builder(selectedItem, EpisodeAction.PLAY)
.currentTimestamp()
.started(media.getDuration() / 1000)
.position(media.getDuration() / 1000)
.total(media.getDuration() / 1000)
.build();
SyncService.enqueueEpisodeAction(context, actionPlay);
}
}
break;
case R.id.mark_unread_item:
selectedItem.setPlayed(false);
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false);
if (GpodnetPreferences.loggedIn() && selectedItem.getMedia() != null) {
EpisodeAction actionNew = new EpisodeAction.Builder(selectedItem, EpisodeAction.NEW)
if (menuItemId == R.id.skip_episode_item) {
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
} else if (menuItemId == R.id.remove_item) {
DBWriter.deleteFeedMediaOfItem(context, selectedItem.getMedia().getId());
} else if (menuItemId == R.id.remove_new_flag_item) {
removeNewFlagWithUndo(fragment, selectedItem);
} else if (menuItemId == R.id.mark_read_item) {
selectedItem.setPlayed(true);
DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, true);
if (GpodnetPreferences.loggedIn()) {
FeedMedia media = selectedItem.getMedia();
// not all items have media, Gpodder only cares about those that do
if (media != null) {
EpisodeAction actionPlay = new EpisodeAction.Builder(selectedItem, EpisodeAction.PLAY)
.currentTimestamp()
.started(media.getDuration() / 1000)
.position(media.getDuration() / 1000)
.total(media.getDuration() / 1000)
.build();
SyncService.enqueueEpisodeAction(context, actionNew);
SyncService.enqueueEpisodeAction(context, actionPlay);
}
break;
case R.id.add_to_queue_item:
DBWriter.addQueueItem(context, selectedItem);
break;
case R.id.remove_from_queue_item:
DBWriter.removeQueueItem(context, true, selectedItem);
break;
case R.id.add_to_favorites_item:
DBWriter.addFavoriteItem(selectedItem);
break;
case R.id.remove_from_favorites_item:
DBWriter.removeFavoriteItem(selectedItem);
break;
case R.id.reset_position:
selectedItem.getMedia().setPosition(0);
if (PlaybackPreferences.getCurrentlyPlayingFeedMediaId() == selectedItem.getMedia().getId()) {
PlaybackPreferences.writeNoMediaPlaying();
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
}
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true);
break;
case R.id.visit_website_item:
IntentUtils.openInBrowser(context, FeedItemUtil.getLinkWithFallback(selectedItem));
break;
case R.id.share_item:
ShareDialog shareDialog = ShareDialog.newInstance(selectedItem);
shareDialog.show((fragment.getActivity().getSupportFragmentManager()), "ShareEpisodeDialog");
break;
default:
Log.d(TAG, "Unknown menuItemId: " + menuItemId);
return false;
}
} else if (menuItemId == R.id.mark_unread_item) {
selectedItem.setPlayed(false);
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false);
if (GpodnetPreferences.loggedIn() && selectedItem.getMedia() != null) {
EpisodeAction actionNew = new EpisodeAction.Builder(selectedItem, EpisodeAction.NEW)
.currentTimestamp()
.build();
SyncService.enqueueEpisodeAction(context, actionNew);
}
} else if (menuItemId == R.id.add_to_queue_item) {
DBWriter.addQueueItem(context, selectedItem);
} else if (menuItemId == R.id.remove_from_queue_item) {
DBWriter.removeQueueItem(context, true, selectedItem);
} else if (menuItemId == R.id.add_to_favorites_item) {
DBWriter.addFavoriteItem(selectedItem);
} else if (menuItemId == R.id.remove_from_favorites_item) {
DBWriter.removeFavoriteItem(selectedItem);
} else if (menuItemId == R.id.reset_position) {
selectedItem.getMedia().setPosition(0);
if (PlaybackPreferences.getCurrentlyPlayingFeedMediaId() == selectedItem.getMedia().getId()) {
PlaybackPreferences.writeNoMediaPlaying();
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
}
DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true);
} else if (menuItemId == R.id.visit_website_item) {
IntentUtils.openInBrowser(context, FeedItemUtil.getLinkWithFallback(selectedItem));
} else if (menuItemId == R.id.share_item) {
ShareDialog shareDialog = ShareDialog.newInstance(selectedItem);
shareDialog.show((fragment.getActivity().getSupportFragmentManager()), "ShareEpisodeDialog");
} else {
Log.d(TAG, "Unknown menuItemId: " + menuItemId);
return false;
}
// Refresh menu state

View File

@ -60,44 +60,36 @@ public class FeedMenuHandler {
*/
public static boolean onOptionsItemClicked(final Context context, final MenuItem item,
final Feed selectedFeed) throws DownloadRequestException {
switch (item.getItemId()) {
case R.id.refresh_item:
DBTasks.forceRefreshFeed(context, selectedFeed, true);
break;
case R.id.refresh_complete_item:
DBTasks.forceRefreshCompleteFeed(context, selectedFeed);
break;
case R.id.sort_items:
showSortDialog(context, selectedFeed);
break;
case R.id.filter_items:
showFilterDialog(context, selectedFeed);
break;
case R.id.mark_all_read_item:
ConfirmationDialog conDialog = new ConfirmationDialog(context,
R.string.mark_all_read_label,
R.string.mark_all_read_feed_confirmation_msg) {
final int itemId = item.getItemId();
if (itemId == R.id.refresh_item) {
DBTasks.forceRefreshFeed(context, selectedFeed, true);
} else if (itemId == R.id.refresh_complete_item) {
DBTasks.forceRefreshCompleteFeed(context, selectedFeed);
} else if (itemId == R.id.sort_items) {
showSortDialog(context, selectedFeed);
} else if (itemId == R.id.filter_items) {
showFilterDialog(context, selectedFeed);
} else if (itemId == R.id.mark_all_read_item) {
ConfirmationDialog conDialog = new ConfirmationDialog(context,
R.string.mark_all_read_label,
R.string.mark_all_read_feed_confirmation_msg) {
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
DBWriter.markFeedRead(selectedFeed.getId());
}
};
conDialog.createNewDialog().show();
break;
case R.id.visit_website_item:
IntentUtils.openInBrowser(context, selectedFeed.getLink());
break;
case R.id.share_link_item:
ShareUtils.shareFeedlink(context, selectedFeed);
break;
case R.id.share_download_url_item:
ShareUtils.shareFeedDownloadLink(context, selectedFeed);
break;
default:
return false;
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
DBWriter.markFeedRead(selectedFeed.getId());
}
};
conDialog.createNewDialog().show();
} else if (itemId == R.id.visit_website_item) {
IntentUtils.openInBrowser(context, selectedFeed.getLink());
} else if (itemId == R.id.share_link_item) {
ShareUtils.shareFeedlink(context, selectedFeed);
} else if (itemId == R.id.share_download_url_item) {
ShareUtils.shareFeedDownloadLink(context, selectedFeed);
} else {
return false;
}
return true;
}

View File

@ -123,33 +123,28 @@ public class ShownotesWebView extends WebView implements View.OnLongClickListene
return false;
}
switch (item.getItemId()) {
case R.id.open_in_browser_item:
IntentUtils.openInBrowser(getContext(), selectedUrl);
break;
case R.id.share_url_item:
ShareUtils.shareLink(getContext(), selectedUrl);
break;
case R.id.copy_url_item:
ClipData clipData = ClipData.newPlainText(selectedUrl, selectedUrl);
android.content.ClipboardManager cm = (android.content.ClipboardManager) getContext()
.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(clipData);
Snackbar s = Snackbar.make(this, R.string.copied_url_msg, Snackbar.LENGTH_LONG);
ViewCompat.setElevation(s.getView(), 100);
s.show();
break;
case R.id.go_to_position_item:
if (Timeline.isTimecodeLink(selectedUrl) && timecodeSelectedListener != null) {
timecodeSelectedListener.accept(Timeline.getTimecodeLinkTime(selectedUrl));
} else {
Log.e(TAG, "Selected go_to_position_item, but URL was no timecode link: " + selectedUrl);
}
break;
default:
selectedUrl = null;
return false;
final int itemId = item.getItemId();
if (itemId == R.id.open_in_browser_item) {
IntentUtils.openInBrowser(getContext(), selectedUrl);
} else if (itemId == R.id.share_url_item) {
ShareUtils.shareLink(getContext(), selectedUrl);
} else if (itemId == R.id.copy_url_item) {
ClipData clipData = ClipData.newPlainText(selectedUrl, selectedUrl);
ClipboardManager cm = (ClipboardManager) getContext()
.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(clipData);
Snackbar s = Snackbar.make(this, R.string.copied_url_msg, Snackbar.LENGTH_LONG);
ViewCompat.setElevation(s.getView(), 100);
s.show();
} else if (itemId == R.id.go_to_position_item) {
if (Timeline.isTimecodeLink(selectedUrl) && timecodeSelectedListener != null) {
timecodeSelectedListener.accept(Timeline.getTimecodeLinkTime(selectedUrl));
} else {
Log.e(TAG, "Selected go_to_position_item, but URL was no timecode link: " + selectedUrl);
}
} else {
selectedUrl = null;
return false;
}
selectedUrl = null;
return true;

View File

@ -1,28 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:viewBindingIgnore="true">
<FrameLayout
android:id="@+id/navDrawerFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical" />
android:id="@+id/navDrawerFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?android:attr/listDivider" />
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?android:attr/listDivider" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/overview_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/overview_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_view"
@ -33,14 +34,14 @@
tools:background="@android:color/holo_red_dark" />
<FrameLayout
android:elevation="8dp"
android:id="@+id/audioplayerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
android:elevation="8dp"
android:visibility="gone"
app:layout_behavior="de.danoeh.antennapod.view.LockableBottomSheetBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>
</LinearLayout>

View File

@ -1,18 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="InconsistentLayout">
<!-- InconsistentLayout: Tablet layout does not have a drawer -->
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="InconsistentLayout"
tools:viewBindingIgnore="true">
<!-- InconsistentLayout: Tablet layout does not have a drawer -->
<!-- viewBindingIgnore: Configurations for main.xml must
agree on the root element's ID -->
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/overview_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/overview_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_view"
@ -23,21 +26,21 @@
tools:background="@android:color/holo_red_dark" />
<FrameLayout
android:elevation="8dp"
android:id="@+id/audioplayerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
android:elevation="8dp"
android:visibility="gone"
app:layout_behavior="de.danoeh.antennapod.view.LockableBottomSheetBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<FrameLayout
android:id="@+id/navDrawerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical" />
android:id="@+id/navDrawerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical" />
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View File

@ -2,12 +2,12 @@ buildscript {
repositories {
google()
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
gradlePluginPortal()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:1.0.2'
classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:1.0.4'
classpath 'de.timfreiheit.resourceplaceholders:placeholders:0.3'
classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.0"
}

View File

@ -52,8 +52,8 @@ android {
checkGeneratedSources = true
}
viewBinding {
enabled = true
buildFeatures {
viewBinding true
}
}

View File

@ -2,7 +2,8 @@
xmlns:tools="http://schemas.android.com/tools" package="de.danoeh.antennapod.core">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@ -52,4 +53,16 @@
android:exported="true"/>
</application>
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
</queries>
</manifest>