diff options
author | ByteHamster <info@bytehamster.com> | 2019-04-10 00:52:49 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2019-04-10 01:05:36 +0200 |
commit | 0e3cabb86d27c9d17b9dc4e19794153d5f72b495 (patch) | |
tree | a69127ea798952942b70ac6beb3f8b28a928af23 /app | |
parent | 3fdf6af1a3a7fdcf97cf234ed1ac3b5af52fa75f (diff) | |
download | AntennaPod-0e3cabb86d27c9d17b9dc4e19794153d5f72b495.zip |
Do not hold state in fragments
Diffstat (limited to 'app')
5 files changed, 151 insertions, 314 deletions
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 f3b83638d..aaab579a2 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -239,7 +239,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements getWindow().setFormat(PixelFormat.TRANSPARENT); setupGUI(); - loadMediaInfo(); } @Override @@ -283,6 +282,8 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements controller.release(); } controller = newPlaybackController(); + controller.init(); + loadMediaInfo(); onPositionObserverUpdate(); } @@ -661,9 +662,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements super.onResume(); Log.d(TAG, "onResume()"); StorageUtils.checkStorageAvailability(this); - if (controller != null) { - controller.init(); - } } public void onEventMainThread(ServiceEvent event) { diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java index 3db00edc9..4a1dae3e9 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java @@ -102,7 +102,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem private ActionBarDrawerToggle drawerToggle; private int mPosition = -1; - private Playable media; private ViewPager pager; private MediaplayerInfoPagerAdapter pagerAdapter; @@ -124,9 +123,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem protected void onStop() { super.onStop(); Log.d(TAG, "onStop()"); - if(pagerAdapter != null) { - pagerAdapter.setController(null); - } if (disposable != null) { disposable.dispose(); } @@ -182,11 +178,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem @Override protected void onResume() { super.onResume(); - if(pagerAdapter != null && controller != null && controller.getMedia() != media) { - media = controller.getMedia(); - pagerAdapter.onMediaChanged(media); - pagerAdapter.setController(controller); - } AutoUpdateManager.checkShouldRefreshFeeds(getApplicationContext()); EventDistributor.getInstance().register(contentUpdate); @@ -279,8 +270,7 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem pager = findViewById(R.id.pager); pager.setOffscreenPageLimit(3); - pagerAdapter = new MediaplayerInfoPagerAdapter(getSupportFragmentManager(), media); - pagerAdapter.setController(controller); + pagerAdapter = new MediaplayerInfoPagerAdapter(getSupportFragmentManager()); pager.setAdapter(pagerAdapter); CirclePageIndicator pageIndicator = findViewById(R.id.page_indicator); pageIndicator.setViewPager(pager); @@ -291,37 +281,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem } @Override - protected void onPositionObserverUpdate() { - super.onPositionObserverUpdate(); - notifyMediaPositionChanged(); - } - - @Override - protected boolean loadMediaInfo() { - if (!super.loadMediaInfo()) { - return false; - } - if(controller != null && controller.getMedia() != media) { - media = controller.getMedia(); - pagerAdapter.onMediaChanged(media); - } - return true; - } - - private void notifyMediaPositionChanged() { - if(pagerAdapter == null) { - return; - } - ChaptersFragment chaptersFragment = pagerAdapter.getChaptersFragment(); - if(chaptersFragment != null) { - ChaptersListAdapter adapter = (ChaptersListAdapter) chaptersFragment.getListAdapter(); - if (adapter != null) { - adapter.notifyDataSetChanged(); - } - } - } - - @Override protected void onReloadNotification(int notificationCode) { if (notificationCode == PlaybackService.EXTRA_CODE_VIDEO) { Log.d(TAG, "ReloadNotification received, switching to Videoplayer now"); @@ -567,50 +526,11 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem } }; - public interface MediaplayerInfoContentFragment { - void onMediaChanged(Playable media); - } - private static class MediaplayerInfoPagerAdapter extends FragmentStatePagerAdapter { - private static final String TAG = "MPInfoPagerAdapter"; - private Playable media; - private PlaybackController controller; - - public MediaplayerInfoPagerAdapter(FragmentManager fm, Playable media) { + public MediaplayerInfoPagerAdapter(FragmentManager fm) { super(fm); - this.media = media; - } - - private CoverFragment coverFragment; - private ItemDescriptionFragment itemDescriptionFragment; - private ChaptersFragment chaptersFragment; - - public void onMediaChanged(Playable media) { - Log.d(TAG, "media changing to " + ((media != null) ? media.getEpisodeTitle() : "null")); - this.media = media; - if(coverFragment != null) { - coverFragment.onMediaChanged(media); - } - if(itemDescriptionFragment != null) { - itemDescriptionFragment.onMediaChanged(media); - } - if(chaptersFragment != null) { - chaptersFragment.onMediaChanged(media); - } - } - - public void setController(PlaybackController controller) { - this.controller = controller; - if(chaptersFragment != null) { - chaptersFragment.setController(controller); - } - } - - @Nullable - public ChaptersFragment getChaptersFragment() { - return chaptersFragment; } @Override @@ -618,21 +538,11 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem Log.d(TAG, "getItem(" + position + ")"); switch (position) { case POS_COVER: - if(coverFragment == null) { - coverFragment = CoverFragment.newInstance(media); - } - return coverFragment; + return new CoverFragment(); case POS_DESCR: - if(itemDescriptionFragment == null) { - itemDescriptionFragment = ItemDescriptionFragment.newInstance(media, true, true); - } - return itemDescriptionFragment; + return new ItemDescriptionFragment(); case POS_CHAPTERS: - if(chaptersFragment == null) { - chaptersFragment = ChaptersFragment.newInstance(media); - chaptersFragment.setController(controller); - } - return chaptersFragment; + return new ChaptersFragment(); default: return null; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java index 4d34d076d..8f2073ed0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java @@ -2,32 +2,23 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; import android.support.v4.app.ListFragment; -import android.util.Log; import android.view.View; import android.widget.ListView; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.activity.MediaplayerInfoActivity.MediaplayerInfoContentFragment; import de.danoeh.antennapod.adapter.ChaptersListAdapter; +import de.danoeh.antennapod.core.event.ServiceEvent; import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; +import de.greenrobot.event.EventBus; -public class ChaptersFragment extends ListFragment implements MediaplayerInfoContentFragment { - +public class ChaptersFragment extends ListFragment { private static final String TAG = "ChaptersFragment"; - - private Playable media; + private ChaptersListAdapter adapter; private PlaybackController controller; - private ChaptersListAdapter adapter; - - public static ChaptersFragment newInstance(Playable media) { - ChaptersFragment f = new ChaptersFragment(); - f.media = media; - return f; - } @Override public void onViewCreated(View view, Bundle savedInstanceState) { @@ -39,10 +30,6 @@ public class ChaptersFragment extends ListFragment implements MediaplayerInfoCon lv.setPadding(0, vertPadding, 0, vertPadding); adapter = new ChaptersListAdapter(getActivity(), 0, pos -> { - if(controller == null) { - Log.d(TAG, "controller is null"); - return; - } Chapter chapter = (Chapter) getListAdapter().getItem(pos); controller.seekToChapter(chapter); }); @@ -50,42 +37,51 @@ public class ChaptersFragment extends ListFragment implements MediaplayerInfoCon } @Override - public void onResume() { - super.onResume(); - adapter.setMedia(media); - adapter.notifyDataSetChanged(); - if(media == null || media.getChapters() == null) { - setEmptyText(getString(R.string.no_chapters_label)); - } else { - setEmptyText(null); - } + public void onStart() { + super.onStart(); + controller = new PlaybackController(getActivity(), false) { + @Override + public boolean loadMediaInfo() { + if (getMedia() == null) { + return false; + } + onMediaChanged(getMedia()); + return true; + } + + @Override + public void onPositionObserverUpdate() { + adapter.notifyDataSetChanged(); + } + }; + controller.init(); + onMediaChanged(controller.getMedia()); + EventBus.getDefault().register(this); } - public void onDestroy() { - super.onDestroy(); - adapter = null; + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + controller.release(); controller = null; } - @Override - public void onMediaChanged(Playable media) { - if(this.media == media) { - return; + public void onEventMainThread(ServiceEvent event) { + if (event.action == ServiceEvent.Action.SERVICE_STARTED && controller != null) { + controller.init(); } - this.media = media; + } + + private void onMediaChanged(Playable media) { if (adapter != null) { adapter.setMedia(media); adapter.notifyDataSetChanged(); - if(media == null || media.getChapters() == null || media.getChapters().size() == 0) { - setEmptyText(getString(R.string.no_items_label)); + if (media == null || media.getChapters() == null || media.getChapters().size() == 0) { + setEmptyText(getString(R.string.no_chapters_label)); } else { setEmptyText(null); } } } - - public void setController(PlaybackController controller) { - this.controller = controller; - } - } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java index ef65a5755..88d748c5a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java @@ -13,37 +13,24 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.activity.MediaplayerInfoActivity.MediaplayerInfoContentFragment; +import de.danoeh.antennapod.core.event.ServiceEvent; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.util.playback.Playable; +import de.danoeh.antennapod.core.util.playback.PlaybackController; +import de.greenrobot.event.EventBus; /** * Displays the cover and the title of a FeedItem. */ -public class CoverFragment extends Fragment implements MediaplayerInfoContentFragment { +public class CoverFragment extends Fragment { private static final String TAG = "CoverFragment"; - private Playable media; - private View root; private TextView txtvPodcastTitle; private TextView txtvEpisodeTitle; private ImageView imgvCover; - - public static CoverFragment newInstance(Playable item) { - CoverFragment f = new CoverFragment(); - f.media = item; - return f; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (media == null) { - Log.e(TAG, TAG + " was called without media"); - } - } + private PlaybackController controller; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -57,31 +44,20 @@ public class CoverFragment extends Fragment implements MediaplayerInfoContentFra } private void loadMediaInfo() { - if (media != null) { - txtvPodcastTitle.setText(media.getFeedTitle()); - txtvEpisodeTitle.setText(media.getEpisodeTitle()); - Glide.with(this) - .load(media.getImageLocation()) - .apply(new RequestOptions() - .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) - .dontAnimate() - .fitCenter()) - .into(imgvCover); - } else { + Playable media = controller.getMedia(); + if (media == null) { Log.w(TAG, "loadMediaInfo was called while media was null"); + return; } - } - - @Override - public void onStart() { - Log.d(TAG, "On Start"); - super.onStart(); - if (media != null) { - Log.d(TAG, "Loading media info"); - loadMediaInfo(); - } else { - Log.w(TAG, "Unable to load media info: media was null"); - } + txtvPodcastTitle.setText(media.getFeedTitle()); + txtvEpisodeTitle.setText(media.getEpisodeTitle()); + Glide.with(this) + .load(media.getImageLocation()) + .apply(new RequestOptions() + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .dontAnimate() + .fitCenter()) + .into(imgvCover); } @Override @@ -92,14 +68,35 @@ public class CoverFragment extends Fragment implements MediaplayerInfoContentFra } @Override - public void onMediaChanged(Playable media) { - if(this.media == media) { - return; - } - this.media = media; - if (isAdded()) { - loadMediaInfo(); + public void onStart() { + super.onStart(); + controller = new PlaybackController(getActivity(), false) { + @Override + public boolean loadMediaInfo() { + if (getMedia() == null) { + return false; + } + CoverFragment.this.loadMediaInfo(); + return true; + } + + }; + controller.init(); + loadMediaInfo(); + EventBus.getDefault().register(this); + } + + public void onEventMainThread(ServiceEvent event) { + if (event.action == ServiceEvent.Action.SERVICE_STARTED && controller != null) { + controller.init(); } } + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + controller.release(); + controller = null; + } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java index 0faf450aa..27ffb0a70 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java @@ -28,18 +28,15 @@ import android.widget.Toast; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MediaplayerInfoActivity; -import de.danoeh.antennapod.activity.MediaplayerInfoActivity.MediaplayerInfoContentFragment; -import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.event.ServiceEvent; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.ShareUtils; -import de.danoeh.antennapod.core.util.ShownotesProvider; -import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; import de.danoeh.antennapod.core.util.playback.Timeline; +import de.greenrobot.event.EventBus; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -48,7 +45,7 @@ import io.reactivex.schedulers.Schedulers; /** * Displays the description of a Playable object in a Webview. */ -public class ItemDescriptionFragment extends Fragment implements MediaplayerInfoContentFragment { +public class ItemDescriptionFragment extends Fragment { private static final String TAG = "ItemDescriptionFragment"; @@ -56,56 +53,15 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo private static final String PREF_SCROLL_Y = "prefScrollY"; private static final String PREF_PLAYABLE_ID = "prefPlayableId"; - private static final String ARG_PLAYABLE = "arg.playable"; - private static final String ARG_FEEDITEM_ID = "arg.feeditem"; - - private static final String ARG_SAVE_STATE = "arg.saveState"; - private static final String ARG_HIGHLIGHT_TIMECODES = "arg.highlightTimecodes"; - private WebView webvDescription; - - private ShownotesProvider shownotesProvider; - private Playable media; - private Disposable webViewLoader; + private PlaybackController controller; /** * URL that was selected via long-press. */ private String selectedURL; - /** - * True if Fragment should save its state (e.g. scrolling position) in a - * shared preference. - */ - private boolean saveState; - - /** - * True if Fragment should highlight timecodes (e.g. time codes in the HH:MM:SS format). - */ - private boolean highlightTimecodes; - - public static ItemDescriptionFragment newInstance(Playable media, - boolean saveState, - boolean highlightTimecodes) { - ItemDescriptionFragment f = new ItemDescriptionFragment(); - Bundle args = new Bundle(); - args.putParcelable(ARG_PLAYABLE, media); - args.putBoolean(ARG_SAVE_STATE, saveState); - args.putBoolean(ARG_HIGHLIGHT_TIMECODES, highlightTimecodes); - f.setArguments(args); - return f; - } - - public static ItemDescriptionFragment newInstance(FeedItem item, boolean saveState, boolean highlightTimecodes) { - ItemDescriptionFragment f = new ItemDescriptionFragment(); - Bundle args = new Bundle(); - args.putLong(ARG_FEEDITEM_ID, item.getId()); - args.putBoolean(ARG_SAVE_STATE, saveState); - args.putBoolean(ARG_HIGHLIGHT_TIMECODES, highlightTimecodes); - f.setArguments(args); - return f; - } @SuppressLint("NewApi") @Override @@ -176,39 +132,6 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo } } - @SuppressLint("NewApi") - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Log.d(TAG, "Creating fragment"); - Bundle args = getArguments(); - saveState = args.getBoolean(ARG_SAVE_STATE, false); - highlightTimecodes = args.getBoolean(ARG_HIGHLIGHT_TIMECODES, false); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - Bundle args = getArguments(); - if (args.containsKey(ARG_PLAYABLE)) { - if (media == null) { - media = args.getParcelable(ARG_PLAYABLE); - shownotesProvider = media; - } - load(); - } else if (args.containsKey(ARG_FEEDITEM_ID)) { - long id = getArguments().getLong(ARG_FEEDITEM_ID); - Observable.defer(() -> Observable.just(DBReader.getFeedItem(id))) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(feedItem -> { - shownotesProvider = feedItem; - load(); - }, error -> Log.e(TAG, Log.getStackTraceString(error))); - } - } - - private final View.OnLongClickListener webViewLongClickListener = new View.OnLongClickListener() { @Override @@ -301,9 +224,6 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo if(webViewLoader != null) { webViewLoader.dispose(); } - if(shownotesProvider == null) { - return; - } webViewLoader = Observable.fromCallable(this::loadData) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -316,8 +236,8 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo @NonNull private String loadData() { - Timeline timeline = new Timeline(getActivity(), shownotesProvider); - return timeline.processShownotes(highlightTimecodes); + Timeline timeline = new Timeline(getActivity(), controller.getMedia()); + return timeline.processShownotes(true); } @Override @@ -327,42 +247,38 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo } private void savePreference() { - if (saveState) { - Log.d(TAG, "Saving preferences"); - SharedPreferences prefs = getActivity().getSharedPreferences(PREF, - Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = prefs.edit(); - if (media != null && webvDescription != null) { - Log.d(TAG, "Saving scroll position: " + webvDescription.getScrollY()); - editor.putInt(PREF_SCROLL_Y, webvDescription.getScrollY()); - editor.putString(PREF_PLAYABLE_ID, media.getIdentifier() - .toString()); - } else { - Log.d(TAG, "savePreferences was called while media or webview was null"); - editor.putInt(PREF_SCROLL_Y, -1); - editor.putString(PREF_PLAYABLE_ID, ""); - } - editor.commit(); + Log.d(TAG, "Saving preferences"); + SharedPreferences prefs = getActivity().getSharedPreferences(PREF, + Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + if (controller.getMedia() != null && webvDescription != null) { + Log.d(TAG, "Saving scroll position: " + webvDescription.getScrollY()); + editor.putInt(PREF_SCROLL_Y, webvDescription.getScrollY()); + editor.putString(PREF_PLAYABLE_ID, controller.getMedia().getIdentifier() + .toString()); + } else { + Log.d(TAG, "savePreferences was called while media or webview was null"); + editor.putInt(PREF_SCROLL_Y, -1); + editor.putString(PREF_PLAYABLE_ID, ""); } + editor.commit(); } private boolean restoreFromPreference() { - if (saveState) { - Log.d(TAG, "Restoring from preferences"); - Activity activity = getActivity(); - if (activity != null) { - SharedPreferences prefs = activity.getSharedPreferences( - PREF, Activity.MODE_PRIVATE); - String id = prefs.getString(PREF_PLAYABLE_ID, ""); - int scrollY = prefs.getInt(PREF_SCROLL_Y, -1); - if (scrollY != -1 && media != null - && id.equals(media.getIdentifier().toString()) - && webvDescription != null) { - Log.d(TAG, "Restored scroll Position: " + scrollY); - webvDescription.scrollTo(webvDescription.getScrollX(), - scrollY); - return true; - } + Log.d(TAG, "Restoring from preferences"); + Activity activity = getActivity(); + if (activity != null) { + SharedPreferences prefs = activity.getSharedPreferences( + PREF, Activity.MODE_PRIVATE); + String id = prefs.getString(PREF_PLAYABLE_ID, ""); + int scrollY = prefs.getInt(PREF_SCROLL_Y, -1); + if (scrollY != -1 && controller.getMedia() != null + && id.equals(controller.getMedia().getIdentifier().toString()) + && webvDescription != null) { + Log.d(TAG, "Restored scroll Position: " + scrollY); + webvDescription.scrollTo(webvDescription.getScrollX(), + scrollY); + return true; } } return false; @@ -379,15 +295,35 @@ public class ItemDescriptionFragment extends Fragment implements MediaplayerInfo } @Override - public void onMediaChanged(Playable media) { - if(this.media == media) { - return; - } - this.media = media; - this.shownotesProvider = media; - if (webvDescription != null) { - load(); + public void onStart() { + super.onStart(); + controller = new PlaybackController(getActivity(), false) { + @Override + public boolean loadMediaInfo() { + if (getMedia() == null) { + return false; + } + load(); + return true; + } + + }; + controller.init(); + load(); + EventBus.getDefault().register(this); + } + + public void onEventMainThread(ServiceEvent event) { + if (event.action == ServiceEvent.Action.SERVICE_STARTED && controller != null) { + controller.init(); } } + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + controller.release(); + controller = null; + } } |