summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java185
1 files changed, 185 insertions, 0 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
new file mode 100644
index 000000000..27419c8a2
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
@@ -0,0 +1,185 @@
+package de.danoeh.antennapod.ui.home;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentContainerView;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.core.event.DownloadEvent;
+import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
+import de.danoeh.antennapod.core.service.download.DownloadService;
+import de.danoeh.antennapod.core.storage.DBReader;
+import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
+import de.danoeh.antennapod.databinding.HomeFragmentBinding;
+import de.danoeh.antennapod.event.FeedListUpdateEvent;
+import de.danoeh.antennapod.fragment.SearchFragment;
+import de.danoeh.antennapod.ui.home.sections.DownloadsSection;
+import de.danoeh.antennapod.ui.home.sections.EpisodesSurpriseSection;
+import de.danoeh.antennapod.ui.home.sections.InboxSection;
+import de.danoeh.antennapod.ui.home.sections.QueueSection;
+import de.danoeh.antennapod.ui.home.sections.SubscriptionsSection;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Shows unread or recently published episodes
+ */
+public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
+
+ public static final String TAG = "HomeFragment";
+ public static final String PREF_NAME = "PrefHomeFragment";
+ public static final String PREF_HIDDEN_SECTIONS = "PrefHomeSectionsString";
+
+ private static final String KEY_UP_ARROW = "up_arrow";
+ private boolean displayUpArrow;
+ private HomeFragmentBinding viewBinding;
+ private boolean isUpdatingFeeds = false;
+ private Disposable disposable;
+
+ @NonNull
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ viewBinding = HomeFragmentBinding.inflate(inflater);
+ viewBinding.toolbar.inflateMenu(R.menu.home);
+ viewBinding.toolbar.setOnMenuItemClickListener(this);
+ if (savedInstanceState != null) {
+ displayUpArrow = savedInstanceState.getBoolean(KEY_UP_ARROW);
+ }
+ ((MainActivity) requireActivity()).setupToolbarToggle(viewBinding.toolbar, displayUpArrow);
+ refreshToolbarState();
+ populateSectionList();
+ updateWelcomeScreenVisibility();
+ return viewBinding.getRoot();
+ }
+
+ private void populateSectionList() {
+ viewBinding.homeContainer.removeAllViews();
+
+ List<String> hiddenSections = getHiddenSections(getContext());
+ String[] sectionTags = getResources().getStringArray(R.array.home_section_tags);
+ for (String sectionTag : sectionTags) {
+ if (hiddenSections.contains(sectionTag)) {
+ continue;
+ }
+ addSection(getSection(sectionTag));
+ }
+ }
+
+ private void addSection(Fragment section) {
+ FragmentContainerView containerView = new FragmentContainerView(getContext());
+ containerView.setId(View.generateViewId());
+ viewBinding.homeContainer.addView(containerView);
+ getChildFragmentManager().beginTransaction().add(containerView.getId(), section).commit();
+ }
+
+ private Fragment getSection(String tag) {
+ switch (tag) {
+ case QueueSection.TAG:
+ return new QueueSection();
+ case InboxSection.TAG:
+ return new InboxSection();
+ case EpisodesSurpriseSection.TAG:
+ return new EpisodesSurpriseSection();
+ case SubscriptionsSection.TAG:
+ return new SubscriptionsSection();
+ case DownloadsSection.TAG:
+ return new DownloadsSection();
+ default:
+ return null;
+ }
+ }
+
+ public static List<String> getHiddenSections(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(HomeFragment.PREF_NAME, Context.MODE_PRIVATE);
+ String hiddenSectionsString = prefs.getString(HomeFragment.PREF_HIDDEN_SECTIONS, "");
+ return new ArrayList<>(Arrays.asList(TextUtils.split(hiddenSectionsString, ",")));
+ }
+
+ private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker =
+ () -> DownloadService.isRunning && DownloadService.isDownloadingFeeds();
+
+ private void refreshToolbarState() {
+ isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(viewBinding.toolbar.getMenu(),
+ R.id.refresh_item, updateRefreshMenuItemChecker);
+ }
+
+ @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
+ public void onEventMainThread(DownloadEvent event) {
+ Log.d(TAG, "onEventMainThread() called with DownloadEvent");
+ if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
+ refreshToolbarState();
+ }
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ if (item.getItemId() == R.id.homesettings_items) {
+ HomeSectionsSettingsDialog.open(getContext(), (dialogInterface, i) -> populateSectionList());
+ return true;
+ } else if (item.getItemId() == R.id.refresh_item) {
+ AutoUpdateManager.runImmediate(requireContext());
+ return true;
+ } else if (item.getItemId() == R.id.action_search) {
+ ((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance());
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ outState.putBoolean(KEY_UP_ARROW, displayUpArrow);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ EventBus.getDefault().register(this);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ EventBus.getDefault().unregister(this);
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onFeedListChanged(FeedListUpdateEvent event) {
+ updateWelcomeScreenVisibility();
+ }
+
+ private void updateWelcomeScreenVisibility() {
+ if (disposable != null) {
+ disposable.dispose();
+ }
+ disposable = Observable.fromCallable(() -> DBReader.getNavDrawerData().items.size())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(numSubscriptions -> {
+ viewBinding.welcomeContainer.setVisibility(numSubscriptions == 0 ? View.VISIBLE : View.GONE);
+ viewBinding.homeContainer.setVisibility(numSubscriptions == 0 ? View.GONE : View.VISIBLE);
+ }, error -> Log.e(TAG, Log.getStackTraceString(error)));
+ }
+
+}