diff --git a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java index 0a43c0525..73f63b131 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java @@ -1,9 +1,11 @@ package org.schabi.newpipe.fragments; +import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ProgressBar; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -135,7 +137,12 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC public void handleError() { isLoading.set(false); InfoCache.getInstance().clearCache(); - hideLoading(); + if (emptyStateView != null) { + animateView(emptyStateView, false, 150); + } + if (loadingProgressBar != null) { + animateView(loadingProgressBar, false, 0); + } } /*////////////////////////////////////////////////////////////////////////// @@ -178,7 +185,7 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC /** * Show a SnackBar and only call - * {@link ErrorActivity.reportErrorInSnackbar(androidx.fragment.app.Fragment, ErrorInfo)} + * {@link ErrorActivity#reportErrorInSnackbar(androidx.fragment.app.Fragment, ErrorInfo)} * IF we a find a valid view (otherwise the error screen appears). * * @param errorInfo The error information diff --git a/app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java index 62f823c73..fbf2711bc 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java @@ -11,9 +11,18 @@ import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; public class EmptyFragment extends BaseFragment { + final boolean showMessage; + + public EmptyFragment(final boolean showMessage) { + this.showMessage = showMessage; + } + @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_empty, container, false); + final View view = inflater.inflate(R.layout.fragment_empty, container, false); + view.findViewById(R.id.empty_state_view).setVisibility( + showMessage ? View.VISIBLE : View.GONE); + return view; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index dc35a86f0..797aa2a03 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -41,7 +41,6 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.google.android.exoplayer2.ExoPlaybackException; @@ -71,6 +70,7 @@ import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; +import org.schabi.newpipe.fragments.EmptyFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment; import org.schabi.newpipe.ktx.AnimationType; @@ -926,18 +926,22 @@ public final class VideoDetailFragment } if (showRelatedStreams && binding.relatedStreamsLayout == null) { - //temp empty fragment. will be updated in handleResult - pageAdapter.addFragment(new Fragment(), RELATED_TAB_TAG); + // temp empty fragment. will be updated in handleResult + pageAdapter.addFragment(new EmptyFragment(false), RELATED_TAB_TAG); tabIcons.add(R.drawable.ic_art_track_white_24dp); tabContentDescriptions.add(R.string.related_streams_tab_description); } if (showDescription) { // temp empty fragment. will be updated in handleResult - pageAdapter.addFragment(new Fragment(), DESCRIPTION_TAB_TAG); + pageAdapter.addFragment(new EmptyFragment(false), DESCRIPTION_TAB_TAG); tabIcons.add(R.drawable.ic_description_white_24dp); tabContentDescriptions.add(R.string.description_tab_description); } + + if (pageAdapter.getCount() == 0) { + pageAdapter.addFragment(new EmptyFragment(true), EMPTY_TAB_TAG); + } pageAdapter.notifyDataSetUpdate(); if (pageAdapter.getCount() >= 2) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 257ccde43..3c37bd128 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.Queue; import static org.schabi.newpipe.ktx.ViewUtils.animate; +import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; public abstract class BaseListFragment extends BaseStateFragment implements ListViewContract, StateSaver.WriteRead, @@ -407,6 +408,12 @@ public abstract class BaseListFragment extends BaseStateFragment // Contract //////////////////////////////////////////////////////////////////////////*/ + @Override + public void showLoading() { + super.showLoading(); + animateHideRecyclerViewAllowingScrolling(itemsList); + } + @Override public void hideLoading() { super.hideLoading(); @@ -417,6 +424,7 @@ public abstract class BaseListFragment extends BaseStateFragment public void showEmptyState() { super.showEmptyState(); showListFooter(false); + animateHideRecyclerViewAllowingScrolling(itemsList); } @Override @@ -437,7 +445,7 @@ public abstract class BaseListFragment extends BaseStateFragment public void handleError() { super.handleError(); showListFooter(false); - animate(itemsList, false, 200); + animateHideRecyclerViewAllowingScrolling(itemsList); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 3184ba442..882bb021d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -29,8 +29,6 @@ import org.schabi.newpipe.util.Localization; import icepick.State; import io.reactivex.rxjava3.core.Single; -import static org.schabi.newpipe.ktx.ViewUtils.animate; - /** * Created by Christian Schabesberger on 23.09.17. *
@@ -160,12 +158,6 @@ public class KioskFragment extends BaseListInfoFragment