diff options
author | Martin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de> | 2015-04-18 12:16:45 +0200 |
---|---|---|
committer | Martin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de> | 2015-04-18 12:44:43 +0200 |
commit | 1bb1f0990f6b9fb6b30383083aa592fd40c4c72e (patch) | |
tree | 4116ea882052ab0b722d18ba9dd2d77fb1fdf14b /app/src/main/java/de/danoeh | |
parent | bf7e7d897bae3f58acaed76897359041bd620936 (diff) | |
parent | 001013ae9e0da2dea4bc7b04d4b83c90c55950e9 (diff) | |
download | AntennaPod-1bb1f0990f6b9fb6b30383083aa592fd40c4c72e.zip |
Prepare merge.
Diffstat (limited to 'app/src/main/java/de/danoeh')
16 files changed, 419 insertions, 199 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java index 821c86044..335958a40 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -29,7 +29,6 @@ import com.squareup.picasso.Picasso; import org.apache.commons.lang3.StringUtils; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.ChapterListAdapter; import de.danoeh.antennapod.adapter.NavListAdapter; @@ -96,30 +95,25 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc FragmentTransaction fT = getSupportFragmentManager().beginTransaction(); if (coverFragment != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Removing cover fragment"); + Log.d(TAG, "Removing cover fragment"); fT.remove(coverFragment); } if (descriptionFragment != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Removing description fragment"); + Log.d(TAG, "Removing description fragment"); fT.remove(descriptionFragment); } if (chapterFragment != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Removing chapter fragment"); + Log.d(TAG, "Removing chapter fragment"); fT.remove(chapterFragment); } if (currentlyShownFragment != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Removing currently shown fragment"); + Log.d(TAG, "Removing currently shown fragment"); fT.remove(currentlyShownFragment); } for (int i = 0; i < detachedFragments.length; i++) { Fragment f = detachedFragments[i]; if (f != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Removing detached fragment"); + Log.d(TAG, "Removing detached fragment"); fT.remove(f); } } @@ -135,11 +129,9 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc @Override protected void onStop() { super.onStop(); - if (BuildConfig.DEBUG) - Log.d(TAG, "onStop"); + Log.d(TAG, "onStop()"); cancelLoadTask(); EventDistributor.getInstance().unregister(contentUpdate); - } @Override @@ -154,8 +146,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc } private void savePreferences() { - if (BuildConfig.DEBUG) - Log.d(TAG, "Saving preferences"); + Log.d(TAG, "Saving preferences"); SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); if (currentlyShownPosition >= 0 && controller != null @@ -182,9 +173,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc @Override protected void onSaveInstanceState(Bundle outState) { // super.onSaveInstanceState(outState); would cause crash - if (BuildConfig.DEBUG) - Log.d(TAG, "onSaveInstanceState"); - + Log.d(TAG, "onSaveInstanceState"); } @Override @@ -207,8 +196,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc * @return true if restoreFromPrefernces changed the activity's state */ private boolean restoreFromPreferences() { - if (BuildConfig.DEBUG) - Log.d(TAG, "Restoring instance state"); + Log.d(TAG, "Restoring instance state"); SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE); int savedPosition = prefs.getInt(PREF_KEY_SELECTED_FRAGMENT_POSITION, -1); @@ -222,15 +210,10 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc switchToFragment(savedPosition); return true; } else if (controller == null || controller.getMedia() == null) { - if (BuildConfig.DEBUG) - Log.d(TAG, - "Couldn't restore from preferences: controller or media was null"); + Log.d(TAG, "Couldn't restore from preferences: controller or media was null"); } else { - if (BuildConfig.DEBUG) - Log.d(TAG, - "Couldn't restore from preferences: savedPosition was -1 or saved identifier and playable identifier didn't match.\nsavedPosition: " - + savedPosition + ", id: " + playableId - ); + Log.d(TAG, "Couldn't restore from preferences: savedPosition was -1 or saved identifier and playable identifier didn't match.\nsavedPosition: " + + savedPosition + ", id: " + playableId); } return false; @@ -241,9 +224,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc super.onResume(); if (StringUtils.equals(getIntent().getAction(), Intent.ACTION_VIEW)) { Intent intent = getIntent(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Received VIEW intent: " - + intent.getData().getPath()); + Log.d(TAG, "Received VIEW intent: " + intent.getData().getPath()); ExternalMedia media = new ExternalMedia(intent.getData().getPath(), MediaType.AUDIO); Intent launchIntent = new Intent(this, PlaybackService.class); @@ -271,8 +252,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc @Override protected void onAwaitingVideoSurface() { - if (BuildConfig.DEBUG) - Log.d(TAG, "onAwaitingVideoSurface was called in audio player -> switching to video player"); + Log.d(TAG, "onAwaitingVideoSurface was called in audio player -> switching to video player"); startActivity(new Intent(this, VideoplayerActivity.class)); } @@ -297,8 +277,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc * @param pos Must be POS_COVER, POS_DESCR, or POS_CHAPTERS */ private void switchToFragment(int pos) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Switching contentView to position " + pos); + Log.d(TAG, "Switching contentView to position " + pos); if (currentlyShownPosition != pos && controller != null) { Playable media = controller.getMedia(); if (media != null) { @@ -356,9 +335,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc lastShownPosition = currentlyShownPosition; currentlyShownPosition = pos; if (detachedFragments[pos] != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Reattaching fragment at position " - + pos); + Log.d(TAG, "Reattaching fragment at position " + pos); ft.attach(detachedFragments[pos]); } else { ft.add(R.id.contentView, currentlyShownFragment); @@ -632,9 +609,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc @Override protected void onReloadNotification(int notificationCode) { if (notificationCode == PlaybackService.EXTRA_CODE_VIDEO) { - if (BuildConfig.DEBUG) - Log.d(TAG, - "ReloadNotification received, switching to Videoplayer now"); + Log.d(TAG, "ReloadNotification received, switching to Videoplayer now"); finish(); startActivity(new Intent(this, VideoplayerActivity.class)); @@ -731,8 +706,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EventDistributor.FEED_LIST_UPDATE & arg) != 0) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received contentUpdate Intent."); + Log.d(TAG, "Received contentUpdate Intent."); loadData(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 6f6b68579..c5ad49f6d 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -25,11 +25,11 @@ import org.apache.commons.lang3.Validate; import java.util.List; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.NavListAdapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.StorageUtils; @@ -43,6 +43,7 @@ import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; import de.danoeh.antennapod.preferences.PreferenceController; +import de.greenrobot.event.EventBus; /** * The activity that is shown when the user launches the app. @@ -52,8 +53,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.FEED_LIST_UPDATE - | EventDistributor.UNREAD_ITEMS_UPDATE - | EventDistributor.QUEUE_UPDATE; + | EventDistributor.UNREAD_ITEMS_UPDATE; public static final String PREF_NAME = "MainActivityPrefs"; public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch"; @@ -343,6 +343,13 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } @Override + public void onStart() { + super.onStart(); + EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); + } + + @Override protected void onPause() { super.onPause(); } @@ -351,7 +358,6 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity protected void onResume() { super.onResume(); StorageUtils.checkStorageAvailability(this); - EventDistributor.getInstance().register(contentUpdate); Intent intent = getIntent(); if (navDrawerData != null && intent.hasExtra(EXTRA_NAV_INDEX) && intent.hasExtra(EXTRA_NAV_TYPE)) { @@ -366,6 +372,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity super.onStop(); cancelLoadTask(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); } @Override @@ -454,13 +461,17 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + loadData(); + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EVENTS & arg) != 0) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received contentUpdate Intent."); + Log.d(TAG, "Received contentUpdate Intent."); loadData(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 099e96be9..1dd535f2a 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -12,13 +12,13 @@ import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.Window; + +import android.view.View; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; @@ -48,7 +48,9 @@ public abstract class MediaplayerActivity extends ActionBarActivity protected SeekBar sbPosition; protected ImageButton butPlay; protected ImageButton butRev; + protected TextView txtvRev; protected ImageButton butFF; + protected TextView txtvFF; private PlaybackController newPlaybackController() { return new PlaybackController(this, false) { @@ -167,8 +169,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity chooseTheme(); super.onCreate(savedInstanceState); - if (BuildConfig.DEBUG) - Log.d(TAG, "Creating Activity"); + Log.d(TAG, "onCreate()"); StorageUtils.checkStorageAvailability(this); setVolumeControlStream(AudioManager.STREAM_MUSIC); @@ -224,8 +225,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity @Override protected void onStop() { super.onStop(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Activity stopped"); + Log.d(TAG, "onStop()"); if (controller != null) { controller.release(); } @@ -234,8 +234,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity @Override protected void onDestroy() { super.onDestroy(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Activity destroyed"); + Log.d(TAG, "onDestroy()"); } @Override @@ -358,8 +357,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity @Override protected void onResume() { super.onResume(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Resuming Activity"); + Log.d(TAG, "onResume()"); StorageUtils.checkStorageAvailability(this); controller.init(); } @@ -378,6 +376,8 @@ public abstract class MediaplayerActivity extends ActionBarActivity if (controller != null) { int currentPosition = controller.getPosition(); int duration = controller.getDuration(); + Log.d(TAG, "currentPosition " + Converter + .getDurationStringLong(currentPosition)); if (currentPosition != PlaybackService.INVALID_TIME && duration != PlaybackService.INVALID_TIME && controller.getMedia() != null) { @@ -386,15 +386,13 @@ public abstract class MediaplayerActivity extends ActionBarActivity txtvLength.setText(Converter.getDurationStringLong(duration)); updateProgressbarPosition(currentPosition, duration); } else { - Log.w(TAG, - "Could not react to position observer update because of invalid time"); + Log.w(TAG, "Could not react to position observer update because of invalid time"); } } } private void updateProgressbarPosition(int position, int duration) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Updating progressbar info"); + Log.d(TAG, "updateProgressbarPosition(" + position + ", " + duration +")"); float progress = ((float) position) / duration; sbPosition.setProgress((int) (progress * sbPosition.getMax())); } @@ -406,8 +404,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity * FeedMedia object. */ protected boolean loadMediaInfo() { - if (BuildConfig.DEBUG) - Log.d(TAG, "Loading media info"); + Log.d(TAG, "loadMediaInfo()"); Playable media = controller.getMedia(); if (media != null) { txtvPosition.setText(Converter.getDurationStringLong((media @@ -433,7 +430,11 @@ public abstract class MediaplayerActivity extends ActionBarActivity txtvLength = (TextView) findViewById(R.id.txtvLength); butPlay = (ImageButton) findViewById(R.id.butPlay); butRev = (ImageButton) findViewById(R.id.butRev); + txtvRev = (TextView) findViewById(R.id.txtvRev); + txtvRev.setText(String.valueOf(UserPreferences.getRewindSecs())); butFF = (ImageButton) findViewById(R.id.butFF); + txtvFF = (TextView) findViewById(R.id.txtvFF); + txtvFF.setText(String.valueOf(UserPreferences.getFastFowardSecs())); // SEEKBAR SETUP @@ -444,10 +445,100 @@ public abstract class MediaplayerActivity extends ActionBarActivity butPlay.setOnClickListener(controller.newOnPlayButtonClickListener()); if (butFF != null) { - butFF.setOnClickListener(controller.newOnFFButtonClickListener()); + butFF.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int curr = controller.getPosition(); + controller.seekTo(curr + UserPreferences.getFastFowardSecs() * 1000); + } + }); + butFF.setOnLongClickListener(new View.OnLongClickListener() { + + int choice; + + @Override + public boolean onLongClick(View v) { + int checked = 0; + int rewindSecs = UserPreferences.getFastFowardSecs(); + final int[] values = getResources().getIntArray(R.array.seek_delta_values); + final String[] choices = new String[values.length]; + for(int i=0; i < values.length; i++) { + if (rewindSecs == values[i]) { + checked = i; + } + choices[i] = String.valueOf(values[i]) + " " + + getString(R.string.time_unit_seconds); + } + choice = values[checked]; + AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this); + builder.setTitle(R.string.pref_fast_forward); + builder.setSingleChoiceItems(choices, checked, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + choice = values[which]; + } + }); + builder.setNegativeButton(R.string.cancel_label, null); + builder.setPositiveButton(R.string.confirm_label, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + UserPreferences.setPrefFastForwardSecs(choice); + txtvFF.setText(String.valueOf(choice)); + } + }); + builder.create().show(); + return true; + } + }); } if (butRev != null) { - butRev.setOnClickListener(controller.newOnRevButtonClickListener()); + butRev.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int curr = controller.getPosition(); + controller.seekTo(curr - UserPreferences.getRewindSecs() * 1000); + } + }); + butRev.setOnLongClickListener(new View.OnLongClickListener() { + + int choice; + + @Override + public boolean onLongClick(View v) { + int checked = 0; + int rewindSecs = UserPreferences.getRewindSecs(); + final int[] values = getResources().getIntArray(R.array.seek_delta_values); + final String[] choices = new String[values.length]; + for(int i=0; i < values.length; i++) { + if (rewindSecs == values[i]) { + checked = i; + } + choices[i] = String.valueOf(values[i]) + " " + + getString(R.string.time_unit_seconds); + } + choice = values[checked]; + AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this); + builder.setTitle(R.string.pref_rewind); + builder.setSingleChoiceItems(choices, checked, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + choice = values[which]; + } + }); + builder.setNegativeButton(R.string.cancel_label, null); + builder.setPositiveButton(R.string.confirm_label, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + UserPreferences.setPrefRewindSecs(choice); + txtvRev.setText(String.valueOf(choice)); + } + }); + builder.create().show(); + return true; + } + }); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index 14644dd68..d3843934a 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -11,6 +11,8 @@ import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; +import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; @@ -61,6 +63,19 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } else { if (!item.isRead()) { DBWriter.markItemRead(context, item, true, true); + + if(GpodnetPreferences.loggedIn()) { + // gpodder: send played action + FeedMedia media = item.getMedia(); + GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, GpodnetEpisodeAction.Action.PLAY) + .currentDeviceId() + .currentTimestamp() + .started(media.getDuration() / 1000) + .position(media.getDuration() / 1000) + .total(media.getDuration() / 1000) + .build(); + GpodnetPreferences.enqueueEpisodeAction(action); + } } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 58b6f734f..118196c8b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -49,10 +49,11 @@ import de.danoeh.antennapod.menuhandler.NavDrawerActivity; * Shows unread or recently published episodes */ public class AllEpisodesFragment extends Fragment { + private static final String TAG = "AllEpisodesFragment"; + private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; @@ -399,7 +400,7 @@ public class AllEpisodesFragment extends Fragment { private ItemLoader itemLoader; - private void startItemLoader() { + protected void startItemLoader() { if (itemLoader != null) { itemLoader.cancel(true); } @@ -429,9 +430,10 @@ public class AllEpisodesFragment extends Fragment { protected Object[] doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - return new Object[]{DBReader.getUnreadItemsList(context), + return new Object[]{ + DBReader.getUnreadItemsList(context), DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + DBReader.getQueueIDList(context)}; } else { return null; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index d63d66966..3ca5b3c89 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -8,6 +8,7 @@ import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ListView; +import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -17,7 +18,6 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.util.QueueAccess; /** * Displays all running downloads and provides a button to delete them @@ -26,11 +26,9 @@ public class CompletedDownloadsFragment extends ListFragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOADLOG_UPDATE | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE; private List<FeedItem> items; - private QueueAccess queue; private DownloadedEpisodesListAdapter listAdapter; private boolean viewCreated = false; @@ -155,7 +153,7 @@ public class CompletedDownloadsFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask<Void, Void, Object[]> { + private class ItemLoader extends AsyncTask<Void, Void, List<FeedItem>> { @Override protected void onPreExecute() { @@ -166,11 +164,10 @@ public class CompletedDownloadsFragment extends ListFragment { } @Override - protected void onPostExecute(Object[] results) { + protected void onPostExecute(List<FeedItem> results) { super.onPostExecute(results); if (results != null) { - items = (List<FeedItem>) results[0]; - queue = (QueueAccess) results[1]; + items = results; itemsLoaded = true; if (viewCreated && getActivity() != null) { onFragmentLoaded(); @@ -179,13 +176,12 @@ public class CompletedDownloadsFragment extends ListFragment { } @Override - protected Object[] doInBackground(Void... params) { + protected List<FeedItem> doInBackground(Void... params) { Context context = getActivity(); if (context != null) { - return new Object[]{DBReader.getDownloadedItems(context), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + return DBReader.getDownloadedItems(context); } - return null; + return Collections.emptyList(); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java index a42658057..fdb128f03 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java @@ -13,7 +13,6 @@ import android.widget.TextView; import com.squareup.picasso.Picasso; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.util.Converter; @@ -54,8 +53,7 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onClick(View v) { - if (BuildConfig.DEBUG) - Log.d(TAG, "layoutInfo was clicked"); + Log.d(TAG, "layoutInfo was clicked"); if (controller.getMedia() != null) { startActivity(PlaybackService.getPlayerActivityIntent( @@ -90,14 +88,10 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onBufferStart() { - // TODO Auto-generated method stub - } @Override public void onBufferEnd() { - // TODO Auto-generated method stub - } @Override @@ -153,7 +147,6 @@ public class ExternalPlayerFragment extends Fragment { butPlay.setOnClickListener(controller .newOnPlayButtonClickListener()); } - } @Override @@ -170,8 +163,6 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onPlaybackSpeedChange() { - // TODO Auto-generated method stub - } }; } @@ -185,8 +176,7 @@ public class ExternalPlayerFragment extends Fragment { @Override public void onDestroy() { super.onDestroy(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Fragment is about to be destroyed"); + Log.d(TAG, "Fragment is about to be destroyed"); if (controller != null) { controller.release(); } @@ -201,8 +191,7 @@ public class ExternalPlayerFragment extends Fragment { } private boolean loadMediaInfo() { - if (BuildConfig.DEBUG) - Log.d(TAG, "Loading media info"); + Log.d(TAG, "Loading media info"); if (controller.serviceAvailable()) { Playable media = controller.getMedia(); if (media != null) { @@ -221,13 +210,11 @@ public class ExternalPlayerFragment extends Fragment { } return true; } else { - Log.w(TAG, - "loadMediaInfo was called while the media object of playbackService was null!"); + Log.w(TAG, "loadMediaInfo was called while the media object of playbackService was null!"); return false; } } else { - Log.w(TAG, - "loadMediaInfo was called while playbackService was null!"); + Log.w(TAG, "loadMediaInfo was called while playbackService was null!"); return false; } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java index e80bf5f14..10409a421 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -17,6 +17,7 @@ import android.support.v7.widget.PopupMenu; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.text.format.DateUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -43,6 +44,7 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -51,18 +53,20 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.Converter; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.playback.Timeline; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; +import de.greenrobot.event.EventBus; /** * Displays information about a FeedItem and actions. */ -public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, QueueAccess>> { +public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, LongList>> { + + private static final String TAG = "ItemFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE; private static final String ARG_FEEDITEM = "feeditem"; @@ -84,7 +88,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba private boolean itemsLoaded = false; private long itemID; private FeedItem item; - private QueueAccess queue; + private LongList queue; private String webviewData; private DownloadObserver downloadObserver; private List<Downloader> downloaderList; @@ -124,6 +128,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); downloadObserver.onResume(); @@ -138,6 +143,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); } private void resetViewState() { @@ -387,25 +393,29 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + getLoaderManager().restartLoader(0, null, ItemFragment.this); + } @Override - public Loader<Pair<FeedItem, QueueAccess>> onCreateLoader(int id, Bundle args) { - return new DBTaskLoader<Pair<FeedItem, QueueAccess>>(getActivity()) { + public Loader<Pair<FeedItem,LongList>> onCreateLoader(int id, Bundle args) { + return new DBTaskLoader<Pair<FeedItem,LongList>>(getActivity()) { @Override - public Pair<FeedItem, QueueAccess> loadInBackground() { + public Pair<FeedItem,LongList> loadInBackground() { FeedItem data1 = DBReader.getFeedItem(getContext(), itemID); if (data1 != null) { Timeline t = new Timeline(getActivity(), data1); webviewData = t.processShownotes(false); } - QueueAccess data2 = QueueAccess.IDListAccess(DBReader.getQueueIDList(getContext())); + LongList data2 = DBReader.getQueueIDList(getContext()); return Pair.create(data1, data2); } }; } @Override - public void onLoadFinished(Loader<Pair<FeedItem, QueueAccess>> loader, Pair<FeedItem, QueueAccess> data) { + public void onLoadFinished(Loader<Pair<FeedItem,LongList>> loader, Pair<FeedItem,LongList> data) { if (data != null) { item = data.first; @@ -420,8 +430,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba } @Override - public void onLoaderReset(Loader<Pair<FeedItem, QueueAccess>> loader) { - + public void onLoaderReset(Loader<Pair<FeedItem,LongList>> loader) { } private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index acb07626c..a2cb8da18 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -9,6 +9,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; +import android.support.v4.util.Pair; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; import android.util.Log; @@ -29,7 +30,6 @@ import org.apache.commons.lang3.Validate; import java.util.List; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.FeedInfoActivity; import de.danoeh.antennapod.activity.MainActivity; @@ -44,17 +44,19 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.gui.MoreContentListFooterUtil; import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.greenrobot.event.EventBus; /** * Displays a list of FeedItems. @@ -65,7 +67,6 @@ public class ItemlistFragment extends ListFragment { private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED - | EventDistributor.QUEUE_UPDATE | EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; @@ -76,7 +77,7 @@ public class ItemlistFragment extends ListFragment { private long feedID; private Feed feed; - protected QueueAccess queue; + private LongList queue; private boolean itemsLoaded = false; private boolean viewsCreated = false; @@ -118,6 +119,7 @@ public class ItemlistFragment extends ListFragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); downloadObserver.onResume(); @@ -131,6 +133,7 @@ public class ItemlistFragment extends ListFragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); } @@ -283,13 +286,17 @@ public class ItemlistFragment extends ListFragment { } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + startItemLoader(); + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EVENTS & arg) != 0) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received contentUpdate Intent."); + Log.d(TAG, "Received contentUpdate Intent."); if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) { updateProgressBarVisibility(); } else { @@ -474,25 +481,26 @@ public class ItemlistFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask<Long, Void, Object[]> { + private class ItemLoader extends AsyncTask<Long, Void, Pair<Feed,LongList>> { @Override - protected Object[] doInBackground(Long... params) { + protected Pair<Feed,LongList> doInBackground(Long... params) { long feedID = params[0]; Context context = getActivity(); if (context != null) { - return new Object[]{DBReader.getFeed(context, feedID), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + Feed feed = DBReader.getFeed(context, feedID); + LongList queue = DBReader.getQueueIDList(context); + return Pair.create(feed, queue); } else { return null; } } @Override - protected void onPostExecute(Object[] res) { + protected void onPostExecute(Pair<Feed,LongList> res) { super.onPostExecute(res); if (res != null) { - feed = (Feed) res[0]; - queue = (QueueAccess) res[1]; + feed = res.first; + queue = res.second; itemsLoaded = true; if (viewsCreated) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index c2bbae42d..dda9dd8c7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -1,7 +1,7 @@ package de.danoeh.antennapod.fragment; +import android.content.Context; import android.os.Bundle; -import android.os.Parcelable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -11,17 +11,25 @@ import com.mobeta.android.dslv.DragSortListView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; import de.danoeh.antennapod.core.util.gui.UndoBarController; +import de.greenrobot.event.EventBus; + /** * Like 'EpisodesFragment' except that it only shows new episodes and * supports swiping to mark as read. */ + public class NewEpisodesFragment extends AllEpisodesFragment { private static final String TAG = "NewEpisodesFragment"; + private static final String PREF_NAME = "PrefNewEpisodesFragment"; private UndoBarController undoBarController; @@ -30,6 +38,25 @@ public class NewEpisodesFragment extends AllEpisodesFragment { super(true, PREF_NAME); } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + if(event.action == QueueEvent.Action.ADDED) { + startItemLoader(); + } + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + @Override protected void resetViewState() { super.resetViewState(); @@ -55,18 +82,30 @@ public class NewEpisodesFragment extends AllEpisodesFragment { } }); - undoBarController = new UndoBarController(root.findViewById(R.id.undobar), new UndoBarController.UndoListener() { + undoBarController = new UndoBarController<FeedItemUndoToken>(root.findViewById(R.id.undobar), new UndoBarController.UndoListener<FeedItemUndoToken>() { + + private final Context context = getActivity(); + @Override - public void onUndo(Parcelable token) { - // Perform the undo - FeedItemUndoToken undoToken = (FeedItemUndoToken) token; + public void onUndo(FeedItemUndoToken token) { if (token != null) { - long itemId = undoToken.getFeedItemId(); - int position = undoToken.getPosition(); - DBWriter.markItemRead(getActivity(), itemId, false); + long itemId = token.getFeedItemId(); + DBWriter.markItemRead(context, itemId, false); + } + } + @Override + public void onHide(FeedItemUndoToken token) { + if (token != null && context != null) { + long itemId = token.getFeedItemId(); + FeedItem item = DBReader.getFeedItem(context, itemId); + FeedMedia media = item.getMedia(); + if(media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) { + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } } } }); return root; } + } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index ab38af106..647fe550d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -7,7 +7,9 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; +import android.support.v4.util.Pair; import android.support.v4.view.MenuItemCompat; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -25,12 +27,14 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.greenrobot.event.EventBus; public class PlaybackHistoryFragment extends ListFragment { private static final String TAG = "PlaybackHistoryFragment"; @@ -38,7 +42,7 @@ public class PlaybackHistoryFragment extends ListFragment { EventDistributor.PLAYER_STATUS_UPDATE; private List<FeedItem> playbackHistory; - private QueueAccess queue; + private LongList queue; private FeedItemlistAdapter adapter; private boolean itemsLoaded = false; @@ -66,12 +70,14 @@ public class PlaybackHistoryFragment extends ListFragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); } @@ -165,6 +171,11 @@ public class PlaybackHistoryFragment extends ListFragment { } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + startItemLoader(); + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override @@ -251,27 +262,27 @@ public class PlaybackHistoryFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask<Void, Void, Object[]> { + private class ItemLoader extends AsyncTask<Void, Void, Pair<List<FeedItem>,LongList>> { @Override - protected Object[] doInBackground(Void... params) { + protected Pair<List<FeedItem>,LongList> doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - List<FeedItem> ph = DBReader.getPlaybackHistory(context); - DBReader.loadFeedDataOfFeedItemlist(context, ph); - return new Object[]{ph, - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + List<FeedItem> history = DBReader.getPlaybackHistory(context); + LongList queue = DBReader.getQueueIDList(context); + DBReader.loadFeedDataOfFeedItemlist(context, history); + return Pair.create(history, queue); } else { return null; } } @Override - protected void onPostExecute(Object[] res) { + protected void onPostExecute(Pair<List<FeedItem>,LongList> res) { super.onPostExecute(res); if (res != null) { - playbackHistory = (List<FeedItem>) res[0]; - queue = (QueueAccess) res[1]; + playbackHistory = res.first; + queue = res.second; itemsLoaded = true; if (viewsCreated) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 70a231cad..a3721d7b3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -7,7 +7,6 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; -import android.os.Parcelable; import android.support.v4.app.Fragment; import android.support.v7.widget.SearchView; import android.util.Log; @@ -37,6 +36,8 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -48,6 +49,7 @@ import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken; import de.danoeh.antennapod.core.util.gui.UndoBarController; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.greenrobot.event.EventBus; /** * Shows all items in the queue @@ -56,7 +58,6 @@ public class QueueFragment extends Fragment { private static final String TAG = "QueueFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | - EventDistributor.QUEUE_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; private DragSortListView listView; @@ -64,7 +65,7 @@ public class QueueFragment extends Fragment { private TextView txtvEmpty; private ProgressBar progLoading; - private UndoBarController undoBarController; + private UndoBarController<FeedItemUndoToken> undoBarController; private List<FeedItem> queue; private List<Downloader> downloaderList; @@ -104,6 +105,7 @@ public class QueueFragment extends Fragment { public void onStart() { super.onStart(); EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); this.activity.set((MainActivity) getActivity()); if (downloadObserver != null) { downloadObserver.setActivity(getActivity()); @@ -124,7 +126,11 @@ public class QueueFragment extends Fragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); stopItemLoader(); + if(undoBarController.isShowing()) { + undoBarController.close(); + } } @Override @@ -133,6 +139,15 @@ public class QueueFragment extends Fragment { this.activity.set((MainActivity) activity); } + public void onEventMainThread(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + if(event.action == QueueEvent.Action.REMOVED) { + undoBarController.showUndoBar(false, getString(R.string.removed_from_queue), + new FeedItemUndoToken(event.item, event.position)); + } + startItemLoader(); + } + private void saveScrollPosition() { SharedPreferences prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); @@ -295,7 +310,7 @@ public class QueueFragment extends Fragment { DBWriter.moveQueueItemToBottom(getActivity(), selectedItem.getId(), true); return true; case R.id.remove_from_queue_item: - DBWriter.removeQueueItem(getActivity(), selectedItem.getId(), false); + DBWriter.removeQueueItem(getActivity(), selectedItem, false); return true; default: return super.onContextItemSelected(item); @@ -343,29 +358,42 @@ public class QueueFragment extends Fragment { @Override public void remove(int which) { - Log.d(TAG, "remove("+which+")"); + Log.d(TAG, "remove(" + which + ")"); stopItemLoader(); FeedItem item = (FeedItem) listView.getAdapter().getItem(which); - DBWriter.removeQueueItem(getActivity(), item.getId(), true); - undoBarController.showUndoBar(false, - getString(R.string.removed_from_queue), new FeedItemUndoToken(item, - which) - ); + DBWriter.markItemRead(getActivity(), item.getId(), true); + DBWriter.removeQueueItem(getActivity(), item, true); } }); - undoBarController = new UndoBarController(root.findViewById(R.id.undobar), new UndoBarController.UndoListener() { - @Override - public void onUndo(Parcelable token) { - // Perform the undo - FeedItemUndoToken undoToken = (FeedItemUndoToken) token; - if (token != null) { - long itemId = undoToken.getFeedItemId(); - int position = undoToken.getPosition(); - DBWriter.addQueueItemAt(getActivity(), itemId, position, false); - } - } - }); + undoBarController = new UndoBarController<FeedItemUndoToken>(root.findViewById(R.id.undobar), + new UndoBarController.UndoListener<FeedItemUndoToken>() { + + private final Context context = getActivity(); + + @Override + public void onUndo(FeedItemUndoToken token) { + if (token != null) { + long itemId = token.getFeedItemId(); + int position = token.getPosition(); + DBWriter.markItemRead(context, itemId, false); + DBWriter.addQueueItemAt(context, itemId, position, false); + } + } + + @Override + public void onHide(FeedItemUndoToken token) { + if (token != null && context != null) { + long itemId = token.getFeedItemId(); + FeedItem item = DBReader.getFeedItem(context, itemId); + FeedMedia media = item.getMedia(); + if(media != null && media.hasAlmostEnded() && UserPreferences.isAutoDelete()) { + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } + } + } + + }); registerForContextMenu(listView); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index cf96bb094..3d6722370 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -13,6 +13,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.ListView; +import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -23,9 +24,7 @@ import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.SearchResult; -import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.FeedSearcher; -import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -44,8 +43,6 @@ public class SearchFragment extends ListFragment { private boolean viewCreated = false; private boolean itemsLoaded = false; - private QueueAccess queue; - /** * Create a new SearchFragment that searches all feeds. */ @@ -165,8 +162,7 @@ public class SearchFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & (EventDistributor.UNREAD_ITEMS_UPDATE - | EventDistributor.DOWNLOAD_HANDLED - | EventDistributor.QUEUE_UPDATE)) != 0) { + | EventDistributor.DOWNLOAD_HANDLED)) != 0) { startSearchTask(); } } @@ -209,17 +205,16 @@ public class SearchFragment extends ListFragment { } } - private class SearchTask extends AsyncTask<Bundle, Void, Object[]> { + private class SearchTask extends AsyncTask<Bundle, Void, List<SearchResult>> { @Override - protected Object[] doInBackground(Bundle... params) { + protected List<SearchResult> doInBackground(Bundle... params) { String query = params[0].getString(ARG_QUERY); long feed = params[0].getLong(ARG_FEED); Context context = getActivity(); if (context != null) { - return new Object[]{FeedSearcher.performSearch(context, query, feed), - QueueAccess.IDListAccess(DBReader.getQueueIDList(context))}; + return FeedSearcher.performSearch(context, query, feed); } else { - return null; + return Collections.emptyList(); } } @@ -232,12 +227,11 @@ public class SearchFragment extends ListFragment { } @Override - protected void onPostExecute(Object[] results) { + protected void onPostExecute(List<SearchResult> results) { super.onPostExecute(results); if (results != null) { itemsLoaded = true; - searchResults = (List<SearchResult>) results[0]; - queue = (QueueAccess) results[1]; + searchResults = results; if (viewCreated) { onFragmentLoaded(); } diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java index 8ccbdafc6..ebb0a9e58 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -4,15 +4,19 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; +import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction.Action; +import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.QueueAccess; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.ShareUtils; /** @@ -52,7 +56,7 @@ public class FeedItemMenuHandler { * @return Returns true if selectedItem is not null. */ public static boolean onPrepareMenu(MenuInterface mi, - FeedItem selectedItem, boolean showExtendedMenu, QueueAccess queueAccess) { + FeedItem selectedItem, boolean showExtendedMenu, LongList queueAccess) { if (selectedItem == null) { return false; } @@ -122,7 +126,7 @@ public class FeedItemMenuHandler { * @return true if selectedItem is not null. */ public static boolean onPrepareMenu(MenuInterface mi, - FeedItem selectedItem, boolean showExtendedMenu, QueueAccess queueAccess, int... excludeIds) { + FeedItem selectedItem, boolean showExtendedMenu, LongList queueAccess, int... excludeIds) { boolean rc = onPrepareMenu(mi, selectedItem, showExtendedMenu, queueAccess); if (rc && excludeIds != null) { for (int id : excludeIds) { @@ -156,15 +160,33 @@ public class FeedItemMenuHandler { break; case R.id.mark_read_item: DBWriter.markItemRead(context, selectedItem, true, true); + if(GpodnetPreferences.loggedIn()) { + FeedMedia media = selectedItem.getMedia(); + GpodnetEpisodeAction actionPlay = new GpodnetEpisodeAction.Builder(selectedItem, Action.PLAY) + .currentDeviceId() + .currentTimestamp() + .started(media.getDuration() / 1000) + .position(media.getDuration() / 1000) + .total(media.getDuration() / 1000) + .build(); + GpodnetPreferences.enqueueEpisodeAction(actionPlay); + } break; case R.id.mark_unread_item: DBWriter.markItemRead(context, selectedItem, false, true); + if(GpodnetPreferences.loggedIn()) { + GpodnetEpisodeAction actionNew = new GpodnetEpisodeAction.Builder(selectedItem, Action.NEW) + .currentDeviceId() + .currentTimestamp() + .build(); + GpodnetPreferences.enqueueEpisodeAction(actionNew); + } break; case R.id.add_to_queue_item: DBWriter.addQueueItem(context, selectedItem.getId()); break; case R.id.remove_from_queue_item: - DBWriter.removeQueueItem(context, selectedItem.getId(), true); + DBWriter.removeQueueItem(context, selectedItem, true); break; case R.id.stream_item: DBTasks.playMedia(context, selectedItem.getMedia(), true, true, diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java index 227ea8dfb..32683c65c 100644 --- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java +++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java @@ -343,6 +343,7 @@ public class PreferenceController { } }); buildUpdateIntervalPreference(); + buildSmartMarkAsPlayedPreference(); buildAutodownloadSelectedNetworsPreference(); setSelectedNetworksEnabled(UserPreferences .isEnableAutodownloadWifiFilter()); @@ -403,6 +404,24 @@ public class PreferenceController { } + private void buildSmartMarkAsPlayedPreference() { + final Resources res = ui.getActivity().getResources(); + + ListPreference pref = (ListPreference) ui.findPreference(UserPreferences.PREF_SMART_MARK_AS_PLAYED_SECS); + String[] values = res.getStringArray( + R.array.smart_mark_as_played_values); + String[] entries = new String[values.length]; + for (int x = 0; x < values.length; x++) { + if(x == 0) { + entries[x] = res.getString(R.string.pref_smart_mark_as_played_disabled); + } else { + Integer v = Integer.parseInt(values[x]); + entries[x] = v + " " + res.getString(R.string.time_unit_seconds); + } + } + pref.setEntries(entries); + } + private void setSelectedNetworksEnabled(boolean b) { if (selectedNetworks != null) { for (Preference p : selectedNetworks) { @@ -430,7 +449,6 @@ public class PreferenceController { .setEnabled(UserPreferences.isEnableAutodownload()); } - private void setParallelDownloadsText(int downloads) { final Resources res = ui.getActivity().getResources(); diff --git a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java index 55dfdc20b..1d9e8e412 100644 --- a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java +++ b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java @@ -12,14 +12,18 @@ import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.RemoteViews; -import de.danoeh.antennapod.core.BuildConfig; + import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; -import de.danoeh.antennapod.receiver.PlayerWidget; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.service.playback.PlayerStatus; +import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.playback.Playable; +import de.danoeh.antennapod.receiver.PlayerWidget; /** Updates the state of the player widget */ public class PlayerWidgetService extends Service { @@ -39,8 +43,7 @@ public class PlayerWidgetService extends Service { @Override public void onCreate() { super.onCreate(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Service created"); + Log.d(TAG, "Service created"); isUpdating = false; psLock = new Object(); } @@ -48,8 +51,24 @@ public class PlayerWidgetService extends Service { @Override public void onDestroy() { super.onDestroy(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Service is about to be destroyed"); + Log.d(TAG, "Service is about to be destroyed"); + + Playable playable = playbackService.getPlayable(); + if(playable != null && playable instanceof FeedMedia) { + FeedMedia media = (FeedMedia) playable; + if(media.hasAlmostEnded()) { + Log.d(TAG, "smart mark as read"); + FeedItem item = media.getItem(); + DBWriter.markItemRead(this, item, true, false); + DBWriter.removeQueueItem(this, item, false); + DBWriter.addItemToPlaybackHistory(this, media); + if (UserPreferences.isAutoDelete()) { + Log.d(TAG, "Delete " + media.toString()); + DBWriter.deleteFeedMediaOfItem(this, media.getId()); + } + } + } + try { unbindService(mConnection); } catch (IllegalArgumentException e) { @@ -72,9 +91,7 @@ public class PlayerWidgetService extends Service { startViewUpdaterIfNotRunning(); } } else { - if (BuildConfig.DEBUG) - Log.d(TAG, - "Service was called while updating. Ignoring update request"); + Log.d(TAG, "Service was called while updating. Ignoring update request"); } return Service.START_NOT_STICKY; } @@ -153,8 +170,7 @@ public class PlayerWidgetService extends Service { private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Connection to service established"); + Log.d(TAG, "Connection to service established"); synchronized (psLock) { playbackService = ((PlaybackService.LocalBinder) service) .getService(); @@ -166,8 +182,7 @@ public class PlayerWidgetService extends Service { public void onServiceDisconnected(ComponentName name) { synchronized (psLock) { playbackService = null; - if (BuildConfig.DEBUG) - Log.d(TAG, "Disconnected from service"); + Log.d(TAG, "Disconnected from service"); } } |