2
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-08-29 05:37:49 +00:00

Show error panel in EmptyFragment

This commit is contained in:
Stypox 2025-07-19 19:41:13 +02:00
parent fe58ec85ed
commit 9697112db6
No known key found for this signature in database
GPG Key ID: 4BDF1B40A49FDD23
5 changed files with 59 additions and 14 deletions

View File

@ -35,7 +35,7 @@ import java.util.concurrent.TimeUnit
class ErrorPanelHelper( class ErrorPanelHelper(
private val fragment: Fragment, private val fragment: Fragment,
rootView: View, rootView: View,
onRetry: Runnable onRetry: Runnable?,
) { ) {
private val context: Context = rootView.context!! private val context: Context = rootView.context!!
@ -56,13 +56,16 @@ class ErrorPanelHelper(
errorPanelRoot.findViewById(R.id.error_open_in_browser) errorPanelRoot.findViewById(R.id.error_open_in_browser)
private var errorDisposable: Disposable? = null private var errorDisposable: Disposable? = null
private var retryShouldBeShown: Boolean = (onRetry != null)
init { init {
if (onRetry != null) {
errorDisposable = errorRetryButton.clicks() errorDisposable = errorRetryButton.clicks()
.debounce(300, TimeUnit.MILLISECONDS) .debounce(300, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe { onRetry.run() } .subscribe { onRetry.run() }
} }
}
private fun ensureDefaultVisibility() { private fun ensureDefaultVisibility() {
errorTextView.isVisible = true errorTextView.isVisible = true
@ -101,7 +104,7 @@ class ErrorPanelHelper(
errorActionButton.setOnClickListener(null) errorActionButton.setOnClickListener(null)
} }
errorRetryButton.isVisible = true errorRetryButton.isVisible = retryShouldBeShown
showAndSetOpenInBrowserButtonAction(errorInfo) showAndSetOpenInBrowserButtonAction(errorInfo)
} else if (errorInfo.throwable is AccountTerminatedException) { } else if (errorInfo.throwable is AccountTerminatedException) {
errorTextView.setText(R.string.account_terminated) errorTextView.setText(R.string.account_terminated)
@ -130,7 +133,7 @@ class ErrorPanelHelper(
errorInfo.throwable !is ContentNotSupportedException errorInfo.throwable !is ContentNotSupportedException
) { ) {
// show retry button only for content which is not unavailable or unsupported // show retry button only for content which is not unavailable or unsupported
errorRetryButton.isVisible = true errorRetryButton.isVisible = retryShouldBeShown
} }
showAndSetOpenInBrowserButtonAction(errorInfo) showAndSetOpenInBrowserButtonAction(errorInfo)
} }

View File

@ -32,7 +32,8 @@ public enum UserAction {
PREFERENCES_MIGRATION("migration of preferences"), PREFERENCES_MIGRATION("migration of preferences"),
SHARE_TO_NEWPIPE("share to newpipe"), SHARE_TO_NEWPIPE("share to newpipe"),
CHECK_FOR_NEW_APP_VERSION("check for new app version"), CHECK_FOR_NEW_APP_VERSION("check for new app version"),
OPEN_INFO_ITEM_DIALOG("open info item dialog"); OPEN_INFO_ITEM_DIALOG("open info item dialog"),
GETTING_MAIN_SCREEN_TAB("getting main screen tab");
private final String message; private final String message;

View File

@ -9,14 +9,52 @@ import androidx.annotation.Nullable;
import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.BaseFragment;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorPanelHelper;
public class BlankFragment extends BaseFragment { public class BlankFragment extends BaseFragment {
@Nullable
final ErrorInfo errorInfo;
@Nullable
ErrorPanelHelper errorPanel = null;
/**
* Builds a blank fragment that just says the app name and suggests clicking on search.
*/
public BlankFragment() {
this(null);
}
/**
* @param errorInfo if null acts like {@link BlankFragment}, else shows an error panel.
*/
public BlankFragment(@Nullable final ErrorInfo errorInfo) {
this.errorInfo = errorInfo;
}
@Nullable @Nullable
@Override @Override
public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container,
final Bundle savedInstanceState) { final Bundle savedInstanceState) {
setTitle("NewPipe"); setTitle("NewPipe");
return inflater.inflate(R.layout.fragment_blank, container, false); final View view = inflater.inflate(R.layout.fragment_blank, container, false);
if (errorInfo != null) {
errorPanel = new ErrorPanelHelper(this, view, null);
errorPanel.showError(errorInfo);
view.findViewById(R.id.blank_page_content).setVisibility(View.GONE);
}
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (errorPanel != null) {
errorPanel.dispose();
errorPanel = null;
}
} }
@Override @Override

View File

@ -36,7 +36,9 @@ import com.google.android.material.tabs.TabLayout;
import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.BaseFragment;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.FragmentMainBinding; import org.schabi.newpipe.databinding.FragmentMainBinding;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.local.playlist.LocalPlaylistFragment;
import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.Tab;
import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.settings.tabs.TabsManager;
@ -302,10 +304,9 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
final Fragment fragment; final Fragment fragment;
try { try {
fragment = tab.getFragment(context); fragment = tab.getFragment(context);
} catch (final Exception e) { } catch (final Throwable t) {
ErrorUtil.showUiErrorSnackbar(context, "Getting fragment item", e); return new BlankFragment(new ErrorInfo(t, UserAction.GETTING_MAIN_SCREEN_TAB,
// TODO: show an error fragment instead "Tab " + tab.getClass().getSimpleName() + ":" + tab.getTabName(context)));
return new BlankFragment();
} }
if (fragment instanceof BaseFragment) { if (fragment instanceof BaseFragment) {

View File

@ -4,7 +4,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<include layout="@layout/main_bg" /> <include
android:id="@+id/blank_page_content"
layout="@layout/main_bg" />
<include <include
android:id="@+id/error_panel" android:id="@+id/error_panel"