From c7d822e68a50f1b87f4b75af66bae7a6a954b2ac Mon Sep 17 00:00:00 2001 From: Synced Synapse Date: Thu, 22 Jan 2015 22:19:28 +0000 Subject: [PATCH] Check if fragment is attached to activity on API callbacks, to prevent crashes. --- .../kore2/ui/AddonDetailsFragment.java | 31 ++++++++-------- .../kore2/ui/AddonListFragment.java | 18 +++++----- .../kore2/ui/AlbumDetailsFragment.java | 6 ++++ .../kore2/ui/MovieDetailsFragment.java | 10 ++++-- .../kore2/ui/MusicVideoDetailsFragment.java | 36 +++++++++---------- .../kore2/ui/NowPlayingFragment.java | 12 +++++-- .../kore2/ui/PlaylistFragment.java | 4 +++ .../kore2/ui/RemoteFragment.java | 1 + .../kore2/ui/SettingsFragment.java | 2 +- .../ui/TVShowEpisodeDetailsFragment.java | 10 ++++-- 10 files changed, 79 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/AddonDetailsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/AddonDetailsFragment.java index 1678ea0..b14d319 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/AddonDetailsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/AddonDetailsFragment.java @@ -155,16 +155,16 @@ public class AddonDetailsFragment extends Fragment { action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(AddonType.Details result) { + if (!isAdded()) return; displayAddonDetails(result); } @Override public void onError(int errorCode, String description) { - if (isAdded()) { - Toast.makeText(getActivity(), - String.format(getString(R.string.error_getting_addon_info), description), - Toast.LENGTH_SHORT).show(); - } + if (!isAdded()) return; + Toast.makeText(getActivity(), + String.format(getString(R.string.error_getting_addon_info), description), + Toast.LENGTH_SHORT).show(); } }, callbackHandler); } @@ -199,6 +199,7 @@ public class AddonDetailsFragment extends Fragment { @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -213,21 +214,19 @@ public class AddonDetailsFragment extends Fragment { action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { - if (isAdded()) { - int messageResId = (!isEnabled) ? R.string.addon_enabled : R.string.addon_disabled; - Toast.makeText(getActivity(), messageResId, Toast.LENGTH_SHORT).show(); - setupEnableButton(!isEnabled); - } + if (!isAdded()) return; + int messageResId = (!isEnabled) ? R.string.addon_enabled : R.string.addon_disabled; + Toast.makeText(getActivity(), messageResId, Toast.LENGTH_SHORT).show(); + setupEnableButton(!isEnabled); } @Override public void onError(int errorCode, String description) { - if (isAdded()) { - Toast.makeText(getActivity(), - String.format(getString(R.string.general_error_executing_action), description), - Toast.LENGTH_SHORT) - .show(); - } + if (!isAdded()) return; + Toast.makeText(getActivity(), + String.format(getString(R.string.general_error_executing_action), description), + Toast.LENGTH_SHORT) + .show(); } }, callbackHandler); } diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/AddonListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/AddonListFragment.java index a9f88c3..4609513 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/AddonListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/AddonListFragment.java @@ -183,6 +183,8 @@ public class AddonListFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(List result) { + if (!isAdded()) return; + adapter.clear(); for (AddonType.Details addon : result) { if (addon.type.equals(AddonType.Types.UNKNOWN) || @@ -203,14 +205,14 @@ public class AddonListFragment extends Fragment @Override public void onError(int errorCode, String description) { - if (isAdded()) { - // To prevent the empty text from appearing on the first load, set it now - emptyView.setText(getString(R.string.no_addons_found_refresh)); - Toast.makeText(getActivity(), - String.format(getString(R.string.error_getting_addon_info), description), - Toast.LENGTH_SHORT).show(); - swipeRefreshLayout.setRefreshing(false); - } + if (!isAdded()) return; + + // To prevent the empty text from appearing on the first load, set it now + emptyView.setText(getString(R.string.no_addons_found_refresh)); + Toast.makeText(getActivity(), + String.format(getString(R.string.error_getting_addon_info), description), + Toast.LENGTH_SHORT).show(); + swipeRefreshLayout.setRefreshing(false); } }, callbackHandler); } diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumDetailsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumDetailsFragment.java index ceb4702..65e6e9f 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumDetailsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumDetailsFragment.java @@ -263,6 +263,7 @@ public class AlbumDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Check whether we should switch to the remote boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) @@ -277,6 +278,7 @@ public class AlbumDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -464,6 +466,7 @@ public class AlbumDetailsFragment extends Fragment getPlaylists.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(ArrayList result) { + if (!isAdded()) return; // Ok, loop through the playlists, looking for the audio one int audioPlaylistId = -1; for (PlaylistType.GetPlaylistsReturnType playlist : result) { @@ -484,6 +487,7 @@ public class AlbumDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) .show(); @@ -491,6 +495,7 @@ public class AlbumDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -504,6 +509,7 @@ public class AlbumDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/MovieDetailsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/MovieDetailsFragment.java index 7845949..6efbbfd 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/MovieDetailsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/MovieDetailsFragment.java @@ -341,6 +341,7 @@ public class MovieDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Check whether we should switch to the remote boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) @@ -355,6 +356,7 @@ public class MovieDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -369,6 +371,7 @@ public class MovieDetailsFragment extends Fragment getPlaylists.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(ArrayList result) { + if (!isAdded()) return; // Ok, loop through the playlists, looking for the video one int videoPlaylistId = -1; for (PlaylistType.GetPlaylistsReturnType playlist : result) { @@ -385,6 +388,7 @@ public class MovieDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) .show(); @@ -392,6 +396,7 @@ public class MovieDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -405,6 +410,7 @@ public class MovieDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -432,9 +438,9 @@ public class MovieDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Force a refresh, but don't show a message - if (isAdded()) - startSync(true); + startSync(true); } @Override diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoDetailsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoDetailsFragment.java index b48e82c..0a8ad2a 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoDetailsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoDetailsFragment.java @@ -300,6 +300,7 @@ public class MusicVideoDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Check whether we should switch to the remote boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) @@ -314,6 +315,7 @@ public class MusicVideoDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -328,6 +330,7 @@ public class MusicVideoDetailsFragment extends Fragment getPlaylists.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(ArrayList result) { + if (!isAdded()) return; // Ok, loop through the playlists, looking for the video one int videoPlaylistId = -1; for (PlaylistType.GetPlaylistsReturnType playlist : result) { @@ -344,37 +347,32 @@ public class MusicVideoDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { - if (isAdded()) { - // Got an error, show toast - Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) - .show(); - } + if (!isAdded()) return; + // Got an error, show toast + Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) + .show(); } @Override public void onError(int errorCode, String description) { - if (isAdded()) { - // Got an error, show toast - Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); - } + if (!isAdded()) return; + // Got an error, show toast + Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) + .show(); } }, callbackHandler); } else { - if (isAdded()) { - Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) - .show(); - } + Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) + .show(); } } @Override public void onError(int errorCode, String description) { - if (isAdded()) { - // Got an error, show toast - Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); - } + if (!isAdded()) return; + // Got an error, show toast + Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) + .show(); } }, callbackHandler); } diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/NowPlayingFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/NowPlayingFragment.java index 28f0aa2..f34bd68 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/NowPlayingFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/NowPlayingFragment.java @@ -245,6 +245,7 @@ public class NowPlayingFragment extends Fragment private ApiCallback defaultPlaySpeedChangedCallback = new ApiCallback() { @Override public void onSucess(Integer result) { + if (!isAdded()) return; UIUtils.setPlayPauseButtonIcon(getActivity(), playButton, result); } @@ -311,6 +312,7 @@ public class NowPlayingFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(Boolean result) { + if (!isAdded()) return; if (result) { Resources.Theme theme = getActivity().getTheme(); TypedArray styledAttributes = theme.obtainStyledAttributes(new int[] { @@ -324,9 +326,7 @@ public class NowPlayingFragment extends Fragment } @Override - public void onError(int errorCode, String description) { - - } + public void onError(int errorCode, String description) { } }, callbackHandler); } @@ -336,6 +336,7 @@ public class NowPlayingFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Force a refresh hostConnectionObserver.forceRefreshResults(); } @@ -351,6 +352,7 @@ public class NowPlayingFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; hostConnectionObserver.forceRefreshResults(); } @@ -445,6 +447,7 @@ public class NowPlayingFragment extends Fragment getProperties.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(ApplicationType.PropertyValue result) { + if (!isAdded()) return; // Ok, we've got a version, decide which method to call if (result.version.major < 13) { showDownloadSubtitlesPreGotham(); @@ -455,6 +458,7 @@ public class NowPlayingFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Something went wrong Toast.makeText(getActivity(), String.format(getString(R.string.error_getting_properties), description), @@ -481,12 +485,14 @@ public class NowPlayingFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Notify enclosing activity to switch panels nowPlayingListener.SwitchToRemotePanel(); } @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; Toast.makeText(getActivity(), String.format(getString(R.string.error_executing_subtitles), description), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/PlaylistFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/PlaylistFragment.java index 8694b09..ff8ff33 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/PlaylistFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/PlaylistFragment.java @@ -382,11 +382,13 @@ public class PlaylistFragment extends Fragment getPlaylists.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(ArrayList result) { + if (!isAdded()) return; getPlaylistItems(getActivePlayerResult, getItemResult, result); } @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Oops displayErrorGettingPlaylistMessage(description); } @@ -434,6 +436,7 @@ public class PlaylistFragment extends Fragment getItems.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(List result) { + if (!isAdded()) return; // Ok, we've got all the info, save and display playlist lastGetPlaylistItemsResult = result; displayPlaylist(getItemResult, result); @@ -441,6 +444,7 @@ public class PlaylistFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Oops displayErrorGettingPlaylistMessage(description); } diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/RemoteFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/RemoteFragment.java index 04a96a3..a2d2991 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/RemoteFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/RemoteFragment.java @@ -270,6 +270,7 @@ public class RemoteFragment extends Fragment private ApiCallback defaultPlaySpeedChangedCallback = new ApiCallback() { @Override public void onSucess(Integer result) { + if (!isAdded()) return; UIUtils.setPlayPauseButtonIcon(getActivity(), playButton, result); } diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/SettingsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/SettingsFragment.java index adf1161..29335fd 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/SettingsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/SettingsFragment.java @@ -228,7 +228,7 @@ public class SettingsFragment extends PreferenceFragment // update UI accordingly mSettings.hasBoughtCoffee = hasUpgrade; - setupPreferences(mSettings.hasBoughtCoffee); + if (isAdded()) setupPreferences(mSettings.hasBoughtCoffee); mSettings.save(); } }); diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowEpisodeDetailsFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowEpisodeDetailsFragment.java index 5243616..b670dfd 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowEpisodeDetailsFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowEpisodeDetailsFragment.java @@ -334,6 +334,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Check whether we should switch to the remote boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) @@ -348,6 +349,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); @@ -362,6 +364,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment getPlaylists.execute(hostManager.getConnection(), new ApiCallback>() { @Override public void onSucess(ArrayList result) { + if (!isAdded()) return; // Ok, loop through the playlists, looking for the video one int videoPlaylistId = -1; for (PlaylistType.GetPlaylistsReturnType playlist : result) { @@ -378,6 +381,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSucess(String result) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) .show(); @@ -385,12 +389,14 @@ public class TVShowEpisodeDetailsFragment extends Fragment @Override public void onError(int errorCode, String description) { + if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) .show(); } }, callbackHandler); } else { + if (!isAdded()) return; Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) .show(); } @@ -417,8 +423,8 @@ public class TVShowEpisodeDetailsFragment extends Fragment @Override public void onSucess(String result) { // Force a refresh, but don't show a message - if (isAdded()) - startSync(true); + if (!isAdded()) return; + startSync(true); } @Override