Fixed sharing ViewModel with multiple feeds

This commit is contained in:
ByteHamster 2019-09-30 19:28:51 +02:00
parent 31c746684b
commit 940e03bcc7
5 changed files with 50 additions and 57 deletions

View File

@ -139,10 +139,6 @@ dependencies {
implementation "com.android.support:recyclerview-v7:$supportVersion" implementation "com.android.support:recyclerview-v7:$supportVersion"
compileOnly 'com.google.android.wearable:wearable:2.2.0' compileOnly 'com.google.android.wearable:wearable:2.2.0'
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
implementation "org.apache.commons:commons-lang3:$commonslangVersion" implementation "org.apache.commons:commons-lang3:$commonslangVersion"
implementation "commons-io:commons-io:$commonsioVersion" implementation "commons-io:commons-io:$commonsioVersion"
implementation "org.jsoup:jsoup:$jsoupVersion" implementation "org.jsoup:jsoup:$jsoupVersion"

View File

@ -1,6 +1,5 @@
package de.danoeh.antennapod.fragment; package de.danoeh.antennapod.fragment;
import android.arch.lifecycle.ViewModelProviders;
import android.content.ClipData; import android.content.ClipData;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -21,18 +20,11 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.joanzapata.iconify.Iconify; import com.joanzapata.iconify.Iconify;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.viewmodel.FeedLoaderViewModel;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.glide.ApGlideSettings;
@ -48,6 +40,9 @@ import io.reactivex.MaybeOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
/** /**
* Displays information about a feed. * Displays information about a feed.
@ -56,8 +51,9 @@ public class FeedInfoFragment extends Fragment {
private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId"; private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId";
private static final String TAG = "FeedInfoActivity"; private static final String TAG = "FeedInfoActivity";
private Feed feed;
private Feed feed;
private Disposable disposable;
private ImageView imgvCover; private ImageView imgvCover;
private TextView txtvTitle; private TextView txtvTitle;
private TextView txtvDescription; private TextView txtvDescription;
@ -69,8 +65,6 @@ public class FeedInfoFragment extends Fragment {
private TextView txtvAuthorHeader; private TextView txtvAuthorHeader;
private ImageView imgvBackground; private ImageView imgvBackground;
private Disposable disposable;
public static FeedInfoFragment newInstance(Feed feed) { public static FeedInfoFragment newInstance(Feed feed) {
FeedInfoFragment fragment = new FeedInfoFragment(); FeedInfoFragment fragment = new FeedInfoFragment();
Bundle arguments = new Bundle(); Bundle arguments = new Bundle();
@ -131,12 +125,21 @@ public class FeedInfoFragment extends Fragment {
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
long feedId = getArguments().getLong(EXTRA_FEED_ID); long feedId = getArguments().getLong(EXTRA_FEED_ID);
ViewModelProviders.of(getActivity()).get(FeedLoaderViewModel.class).getFeed(feedId) disposable = Maybe.create((MaybeOnSubscribe<Feed>) emitter -> {
Feed feed = DBReader.getFeed(feedId);
if (feed != null) {
emitter.onSuccess(feed);
} else {
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { .subscribe(result -> {
feed = result; feed = result;
showFeed(); showFeed();
startPostponedEnterTransition(); }, error -> Log.d(TAG, Log.getStackTraceString(error)),
}).dispose(); this::startPostponedEnterTransition);
} }
private void showFeed() { private void showFeed() {

View File

@ -1,12 +1,12 @@
package de.danoeh.antennapod.fragment; package de.danoeh.antennapod.fragment;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.ListPreference; import android.support.v7.preference.ListPreference;
import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceFragmentCompat;
import android.util.Log;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
@ -14,15 +14,23 @@ import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedFilter; import de.danoeh.antennapod.core.feed.FeedFilter;
import de.danoeh.antennapod.core.feed.FeedPreferences; import de.danoeh.antennapod.core.feed.FeedPreferences;
import de.danoeh.antennapod.core.preferences.UserPreferences; 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.storage.DBWriter;
import de.danoeh.antennapod.dialog.AuthenticationDialog; import de.danoeh.antennapod.dialog.AuthenticationDialog;
import de.danoeh.antennapod.dialog.EpisodeFilterDialog; import de.danoeh.antennapod.dialog.EpisodeFilterDialog;
import de.danoeh.antennapod.viewmodel.FeedLoaderViewModel; import io.reactivex.Maybe;
import io.reactivex.MaybeOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class FeedSettingsFragment extends PreferenceFragmentCompat { public class FeedSettingsFragment extends PreferenceFragmentCompat {
private static final CharSequence PREF_EPISODE_FILTER = "episodeFilter"; private static final CharSequence PREF_EPISODE_FILTER = "episodeFilter";
private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId"; private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId";
private static final String TAG = "FeedSettingsFragment";
private Feed feed; private Feed feed;
private Disposable disposable;
private FeedPreferences feedPreferences; private FeedPreferences feedPreferences;
public static FeedSettingsFragment newInstance(Feed feed) { public static FeedSettingsFragment newInstance(Feed feed) {
@ -39,7 +47,16 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat {
postponeEnterTransition(); postponeEnterTransition();
long feedId = getArguments().getLong(EXTRA_FEED_ID); long feedId = getArguments().getLong(EXTRA_FEED_ID);
ViewModelProviders.of(getActivity()).get(FeedLoaderViewModel.class).getFeed(feedId) disposable = Maybe.create((MaybeOnSubscribe<Feed>) emitter -> {
Feed feed = DBReader.getFeed(feedId);
if (feed != null) {
emitter.onSuccess(feed);
} else {
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { .subscribe(result -> {
feed = result; feed = result;
feedPreferences = feed.getPreferences(); feedPreferences = feed.getPreferences();
@ -52,8 +69,8 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat {
updateAutoDeleteSummary(); updateAutoDeleteSummary();
updateAutoDownloadEnabled(); updateAutoDownloadEnabled();
startPostponedEnterTransition(); }, error -> Log.d(TAG, Log.getStackTraceString(error)),
}).dispose(); this::startPostponedEnterTransition);
} }
@Override @Override
@ -62,6 +79,14 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat {
((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.feed_settings_label); ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.feed_settings_label);
} }
@Override
public void onDestroy() {
super.onDestroy();
if (disposable != null) {
disposable.dispose();
}
}
private void setupEpisodeFilterPreference() { private void setupEpisodeFilterPreference() {
findPreference(PREF_EPISODE_FILTER).setOnPreferenceClickListener(preference -> { findPreference(PREF_EPISODE_FILTER).setOnPreferenceClickListener(preference -> {
new EpisodeFilterDialog(getContext(), feedPreferences.getFilter()) { new EpisodeFilterDialog(getContext(), feedPreferences.getFilter()) {

View File

@ -1,30 +0,0 @@
package de.danoeh.antennapod.viewmodel;
import android.arch.lifecycle.ViewModel;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.storage.DBReader;
import io.reactivex.Maybe;
public class FeedLoaderViewModel extends ViewModel {
private Feed feed;
public Maybe<Feed> getFeed(long feedId) {
if (feed == null) {
return loadFeed(feedId);
} else {
return Maybe.just(feed);
}
}
private Maybe<Feed> loadFeed(long feedId) {
return Maybe.create(emitter -> {
Feed feed = DBReader.getFeed(feedId);
if (feed != null) {
this.feed = feed;
emitter.onSuccess(feed);
} else {
emitter.onComplete();
}
});
}
}

View File

@ -45,7 +45,6 @@ project.ext {
targetSdkVersion = 28 targetSdkVersion = 28
supportVersion = "27.1.1" supportVersion = "27.1.1"
lifecycle_version = "1.1.1"
workManagerVersion = "1.0.1" workManagerVersion = "1.0.1"
awaitilityVersion = "3.1.2" awaitilityVersion = "3.1.2"
commonsioVersion = "2.5" commonsioVersion = "2.5"