Merge pull request #1615 from mfietz/issue/1606-player-skip-update

Fix player skip issues
This commit is contained in:
Tom Hennen 2016-01-26 17:46:37 -05:00
commit b53fe7874b
6 changed files with 108 additions and 39 deletions

View File

@ -6,11 +6,11 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout; import android.support.design.widget.AppBarLayout;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.ActionBarDrawerToggle;
@ -28,6 +28,7 @@ import android.widget.ListView;
import com.viewpagerindicator.CirclePageIndicator; import com.viewpagerindicator.CirclePageIndicator;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.ChaptersListAdapter; import de.danoeh.antennapod.adapter.ChaptersListAdapter;
@ -83,6 +84,8 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
AddFeedFragment.TAG AddFeedFragment.TAG
}; };
private AtomicBoolean isSetup = new AtomicBoolean(false);
private DrawerLayout drawerLayout; private DrawerLayout drawerLayout;
private NavListAdapter navAdapter; private NavListAdapter navAdapter;
private ListView navList; private ListView navList;
@ -107,6 +110,16 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
saveCurrentFragment(); saveCurrentFragment();
} }
@Override
public void onDestroy() {
super.onDestroy();
// don't risk creating memory leaks
navAdapter = null;
drawerToggle = null;
mPager = null;
mPagerAdapter = null;
}
@Override @Override
protected void chooseTheme() { protected void chooseTheme() {
setTheme(UserPreferences.getNoTitleTheme()); setTheme(UserPreferences.getNoTitleTheme());
@ -116,7 +129,6 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
if(mPager == null) { if(mPager == null) {
return; return;
} }
Log.d(TAG, "Saving preferences"); Log.d(TAG, "Saving preferences");
SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE); SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
prefs.edit() prefs.edit()
@ -156,10 +168,9 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
} }
if(mPagerAdapter != null && controller != null && controller.getMedia() != media) { if(mPagerAdapter != null && controller != null && controller.getMedia() != media) {
media = controller.getMedia(); media = controller.getMedia();
mPagerAdapter.notifyDataSetChanged(); mPagerAdapter.onMediaChanged(media);
} }
EventDistributor.getInstance().register(contentUpdate); EventDistributor.getInstance().register(contentUpdate);
loadData(); loadData();
} }
@ -193,6 +204,9 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
@Override @Override
protected void setupGUI() { protected void setupGUI() {
if(isSetup.getAndSet(true)) {
return;
}
super.setupGUI(); super.setupGUI();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
@ -242,13 +256,11 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
}); });
mPager = (ViewPager) findViewById(R.id.pager); mPager = (ViewPager) findViewById(R.id.pager);
if(mPager.getAdapter() == null) {
mPagerAdapter = new AudioplayerPagerAdapter(getSupportFragmentManager()); mPagerAdapter = new AudioplayerPagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter); mPager.setAdapter(mPagerAdapter);
CirclePageIndicator pageIndicator = (CirclePageIndicator) findViewById(R.id.page_indicator); CirclePageIndicator pageIndicator = (CirclePageIndicator) findViewById(R.id.page_indicator);
pageIndicator.setViewPager(mPager); pageIndicator.setViewPager(mPager);
loadLastFragment(); loadLastFragment();
}
mPager.onSaveInstanceState(); mPager.onSaveInstanceState();
} }
@ -265,18 +277,20 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
} }
if(controller.getMedia() != media) { if(controller.getMedia() != media) {
media = controller.getMedia(); media = controller.getMedia();
mPagerAdapter.notifyDataSetChanged(); mPagerAdapter.onMediaChanged(media);
} }
return true; return true;
} }
public void notifyMediaPositionChanged() { public void notifyMediaPositionChanged() {
ListFragment chapterFragment = (ListFragment) mPagerAdapter.getItem(POS_CHAPTERS); ChaptersFragment chaptersFragment = mPagerAdapter.getChaptersFragment();
ChaptersListAdapter adapter = (ChaptersListAdapter) chapterFragment.getListAdapter(); if(chaptersFragment != null) {
if(adapter != null) { ChaptersListAdapter adapter = (ChaptersListAdapter) chaptersFragment.getListAdapter();
if (adapter != null) {
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
} }
}
@Override @Override
protected void onReloadNotification(int notificationCode) { protected void onReloadNotification(int notificationCode) {
@ -510,7 +524,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
}; };
public interface AudioplayerContentFragment { public interface AudioplayerContentFragment {
void onDataSetChanged(Playable media); void onMediaChanged(Playable media);
} }
private class AudioplayerPagerAdapter extends FragmentStatePagerAdapter { private class AudioplayerPagerAdapter extends FragmentStatePagerAdapter {
@ -519,22 +533,51 @@ public class AudioplayerActivity extends MediaplayerActivity implements NavDrawe
super(fm); super(fm);
} }
private CoverFragment coverFragment;
private ItemDescriptionFragment itemDescriptionFragment;
private ChaptersFragment chaptersFragment;
public void onMediaChanged(Playable media) {
if(coverFragment != null) {
coverFragment.onMediaChanged(media);
}
if(itemDescriptionFragment != null) {
itemDescriptionFragment.onMediaChanged(media);
}
if(chaptersFragment != null) {
chaptersFragment.onMediaChanged(media);
}
}
@Nullable
public ChaptersFragment getChaptersFragment() {
return chaptersFragment;
}
@Override @Override
public Fragment getItem(int position) { public Fragment getItem(int position) {
Log.d(TAG, "getItem(" + position + ")"); Log.d(TAG, "getItem(" + position + ")");
switch (position) { switch (position) {
case POS_COVER: case POS_COVER:
return CoverFragment.newInstance(media); if(coverFragment == null) {
coverFragment = CoverFragment.newInstance(media);
}
return coverFragment;
case POS_DESCR: case POS_DESCR:
return ItemDescriptionFragment.newInstance(media, true, true); if(itemDescriptionFragment == null) {
itemDescriptionFragment = ItemDescriptionFragment.newInstance(media, true, true);
}
return itemDescriptionFragment;
case POS_CHAPTERS: case POS_CHAPTERS:
return ChaptersFragment.newInstance(media, controller); if(chaptersFragment == null) {
chaptersFragment = ChaptersFragment.newInstance(media, controller);
}
return chaptersFragment;
default: default:
return null; return null;
} }
} }
@Override @Override
public int getCount() { public int getCount() {
return NUM_CONTENT_FRAGMENTS; return NUM_CONTENT_FRAGMENTS;

View File

@ -20,6 +20,7 @@ import android.widget.ProgressBar;
import android.widget.SeekBar; import android.widget.SeekBar;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicBoolean;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.MediaType;
@ -43,6 +44,8 @@ public class VideoplayerActivity extends MediaplayerActivity {
private VideoControlsHider videoControlsHider = new VideoControlsHider(this); private VideoControlsHider videoControlsHider = new VideoControlsHider(this);
private AtomicBoolean isSetup = new AtomicBoolean(false);
private LinearLayout controls; private LinearLayout controls;
private LinearLayout videoOverlay; private LinearLayout videoOverlay;
private AspectRatioVideoView videoview; private AspectRatioVideoView videoview;
@ -115,6 +118,9 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
protected void setupGUI() { protected void setupGUI() {
if(isSetup.getAndSet(true)) {
return;
}
super.setupGUI(); super.setupGUI();
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
controls = (LinearLayout) findViewById(R.id.controls); controls = (LinearLayout) findViewById(R.id.controls);

View File

@ -55,8 +55,17 @@ public class ChaptersFragment extends ListFragment implements AudioplayerContent
} }
} }
public void onDestroy() {
super.onDestroy();
adapter = null;
}
@Override @Override
public void onDataSetChanged(Playable media) { public void onMediaChanged(Playable media) {
if(this.media == media || adapter == null) {
return;
}
this.media = media;
adapter.setMedia(media); adapter.setMedia(media);
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
if(media.getChapters() == null) { if(media.getChapters() == null) {

View File

@ -19,8 +19,8 @@ import de.danoeh.antennapod.core.util.playback.Playable;
/** /**
* Displays the cover and the title of a FeedItem. * Displays the cover and the title of a FeedItem.
*/ */
public class CoverFragment extends Fragment implements public class CoverFragment extends Fragment implements AudioplayerContentFragment {
AudioplayerContentFragment {
private static final String TAG = "CoverFragment"; private static final String TAG = "CoverFragment";
private static final String ARG_PLAYABLE = "arg.playable"; private static final String ARG_PLAYABLE = "arg.playable";
@ -71,14 +71,12 @@ public class CoverFragment extends Fragment implements
Log.d(TAG, "episode title: " + media.getEpisodeTitle()); Log.d(TAG, "episode title: " + media.getEpisodeTitle());
txtvPodcastTitle.setText(media.getFeedTitle()); txtvPodcastTitle.setText(media.getFeedTitle());
txtvEpisodeTitle.setText(media.getEpisodeTitle()); txtvEpisodeTitle.setText(media.getEpisodeTitle());
imgvCover.post(() -> {
Glide.with(this) Glide.with(this)
.load(media.getImageUri()) .load(media.getImageUri())
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
.dontAnimate() .dontAnimate()
.fitCenter() .fitCenter()
.into(imgvCover); .into(imgvCover);
});
} else { } else {
Log.w(TAG, "loadMediaInfo was called while media was null"); Log.w(TAG, "loadMediaInfo was called while media was null");
} }
@ -97,7 +95,17 @@ public class CoverFragment extends Fragment implements
} }
@Override @Override
public void onDataSetChanged(Playable media) { public void onDestroy() {
super.onDestroy();
// prevent memory leaks
root = null;
}
@Override
public void onMediaChanged(Playable media) {
if(this.media == media) {
return;
}
this.media = media; this.media = media;
loadMediaInfo(); loadMediaInfo();
} }

View File

@ -21,7 +21,7 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
import android.webkit.WebViewClient; import android.webkit.WebViewClient;
import android.widget.Toast; import android.widget.Toast;
@ -67,7 +67,6 @@ public class ItemDescriptionFragment extends Fragment implements AudioplayerCont
private ShownotesProvider shownotesProvider; private ShownotesProvider shownotesProvider;
private Playable media; private Playable media;
private Subscription webViewLoader; private Subscription webViewLoader;
/** /**
@ -124,7 +123,7 @@ public class ItemDescriptionFragment extends Fragment implements AudioplayerCont
ta.recycle(); ta.recycle();
webvDescription.setBackgroundColor(backgroundColor); webvDescription.setBackgroundColor(backgroundColor);
webvDescription.getSettings().setUseWideViewPort(false); webvDescription.getSettings().setUseWideViewPort(false);
webvDescription.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); webvDescription.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webvDescription.getSettings().setLoadWithOverviewMode(true); webvDescription.getSettings().setLoadWithOverviewMode(true);
webvDescription.setOnLongClickListener(webViewLongClickListener); webvDescription.setOnLongClickListener(webViewLongClickListener);
webvDescription.setWebViewClient(new WebViewClient() { webvDescription.setWebViewClient(new WebViewClient() {
@ -384,7 +383,10 @@ public class ItemDescriptionFragment extends Fragment implements AudioplayerCont
} }
@Override @Override
public void onDataSetChanged(Playable media) { public void onMediaChanged(Playable media) {
if(this.media == media) {
return;
}
this.media = media; this.media = media;
this.shownotesProvider = media; this.shownotesProvider = media;
load(); load();

View File

@ -24,7 +24,6 @@ import android.view.SurfaceHolder;
import android.view.WindowManager; import android.view.WindowManager;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.Target;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
@ -982,6 +981,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
playerLock.lock(); playerLock.lock();
releaseWifiLockIfNecessary(); releaseWifiLockIfNecessary();
boolean isPlaying = playerStatus == PlayerStatus.PLAYING;
if (playerStatus != PlayerStatus.INDETERMINATE) { if (playerStatus != PlayerStatus.INDETERMINATE) {
setPlayerStatus(PlayerStatus.INDETERMINATE, media); setPlayerStatus(PlayerStatus.INDETERMINATE, media);
} }
@ -990,7 +991,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
} }
audioManager.abandonAudioFocus(audioFocusChangeListener); audioManager.abandonAudioFocus(audioFocusChangeListener);
callback.endPlayback(true, wasSkipped); callback.endPlayback(isPlaying, wasSkipped);
playerLock.unlock(); playerLock.unlock();
}); });