1
0
mirror of https://github.com/TeamNewPipe/NewPipe.git synced 2024-11-22 11:02:35 +01:00

Avoid issues if context is a ContextWrapper

This commit is contained in:
Isira Seneviratne 2024-09-11 21:57:51 +05:30
parent 5017f4f05a
commit 3177ca6e8a
6 changed files with 27 additions and 16 deletions

View File

@ -0,0 +1,13 @@
package org.schabi.newpipe.ktx
import android.content.Context
import android.content.ContextWrapper
import androidx.fragment.app.FragmentActivity
tailrec fun Context.findFragmentActivity(): FragmentActivity {
return when (this) {
is FragmentActivity -> this
is ContextWrapper -> baseContext.findFragmentActivity()
else -> throw IllegalStateException("Unable to find FragmentActivity")
}
}

View File

@ -15,7 +15,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.window.core.layout.WindowWidthSizeClass import androidx.window.core.layout.WindowWidthSizeClass
import my.nanihadesuka.compose.LazyColumnScrollbar import my.nanihadesuka.compose.LazyColumnScrollbar
@ -25,6 +24,7 @@ import org.schabi.newpipe.extractor.InfoItem
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.info_list.ItemViewMode
import org.schabi.newpipe.ktx.findFragmentActivity
import org.schabi.newpipe.ui.components.items.playlist.PlaylistListItem import org.schabi.newpipe.ui.components.items.playlist.PlaylistListItem
import org.schabi.newpipe.ui.components.items.stream.StreamListItem import org.schabi.newpipe.ui.components.items.stream.StreamListItem
import org.schabi.newpipe.ui.theme.md_theme_dark_primary import org.schabi.newpipe.ui.theme.md_theme_dark_primary
@ -40,7 +40,7 @@ fun ItemList(
val context = LocalContext.current val context = LocalContext.current
val onClick = remember { val onClick = remember {
{ item: InfoItem -> { item: InfoItem ->
val fragmentManager = (context as FragmentActivity).supportFragmentManager val fragmentManager = context.findFragmentActivity().supportFragmentManager
if (item is StreamInfoItem) { if (item is StreamInfoItem) {
NavigationHelper.openVideoDetailFragment( NavigationHelper.openVideoDetailFragment(
context, fragmentManager, item.serviceId, item.url, item.name, null, false context, fragmentManager, item.serviceId, item.url, item.name, null, false

View File

@ -8,12 +8,12 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import org.schabi.newpipe.R import org.schabi.newpipe.R
import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.download.DownloadDialog import org.schabi.newpipe.download.DownloadDialog
import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamInfoItem
import org.schabi.newpipe.ktx.findFragmentActivity
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog import org.schabi.newpipe.local.dialog.PlaylistAppendDialog
import org.schabi.newpipe.local.dialog.PlaylistDialog import org.schabi.newpipe.local.dialog.PlaylistDialog
import org.schabi.newpipe.player.helper.PlayerHolder import org.schabi.newpipe.player.helper.PlayerHolder
@ -84,7 +84,7 @@ fun StreamMenu(
) { info -> ) { info ->
// TODO: Use an AlertDialog composable instead. // TODO: Use an AlertDialog composable instead.
val downloadDialog = DownloadDialog(context, info) val downloadDialog = DownloadDialog(context, info)
val fragmentManager = (context as FragmentActivity).supportFragmentManager val fragmentManager = context.findFragmentActivity().supportFragmentManager
downloadDialog.show(fragmentManager, "downloadDialog") downloadDialog.show(fragmentManager, "downloadDialog")
} }
} }
@ -97,7 +97,7 @@ fun StreamMenu(
PlaylistDialog.createCorrespondingDialog(context, list) { dialog -> PlaylistDialog.createCorrespondingDialog(context, list) { dialog ->
val tag = if (dialog is PlaylistAppendDialog) "append" else "create" val tag = if (dialog is PlaylistAppendDialog) "append" else "create"
dialog.show( dialog.show(
(context as FragmentActivity).supportFragmentManager, context.findFragmentActivity().supportFragmentManager,
"StreamDialogEntry@${tag}_playlist" "StreamDialogEntry@${tag}_playlist"
) )
} }
@ -131,7 +131,8 @@ fun StreamMenu(
SparseItemUtil.fetchUploaderUrlIfSparse( SparseItemUtil.fetchUploaderUrlIfSparse(
context, stream.serviceId, stream.url, stream.uploaderUrl context, stream.serviceId, stream.url, stream.uploaderUrl
) { url -> ) { url ->
NavigationHelper.openChannelFragment(context as FragmentActivity, stream, url) val activity = context.findFragmentActivity()
NavigationHelper.openChannelFragment(activity, stream, url)
} }
} }
) )

View File

@ -38,7 +38,6 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.fragment.app.FragmentActivity
import coil.compose.AsyncImage import coil.compose.AsyncImage
import org.schabi.newpipe.R import org.schabi.newpipe.R
import org.schabi.newpipe.extractor.Page import org.schabi.newpipe.extractor.Page
@ -84,9 +83,7 @@ fun Comment(comment: CommentsInfoItem) {
.size(42.dp) .size(42.dp)
.clip(CircleShape) .clip(CircleShape)
.clickable { .clickable {
NavigationHelper.openCommentAuthorIfPresent( NavigationHelper.openCommentAuthorIfPresent(context, comment)
context as FragmentActivity, comment
)
} }
) )

View File

@ -22,7 +22,6 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.fragment.app.FragmentActivity
import coil.compose.AsyncImage import coil.compose.AsyncImage
import org.schabi.newpipe.R import org.schabi.newpipe.R
import org.schabi.newpipe.extractor.comments.CommentsInfoItem import org.schabi.newpipe.extractor.comments.CommentsInfoItem
@ -45,8 +44,7 @@ fun CommentRepliesHeader(comment: CommentsInfoItem) {
) { ) {
Row( Row(
modifier = Modifier.clickable { modifier = Modifier.clickable {
val activity = context as FragmentActivity NavigationHelper.openCommentAuthorIfPresent(context, comment)
NavigationHelper.openCommentAuthorIfPresent(activity, comment)
}, },
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically

View File

@ -48,6 +48,7 @@ import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment;
import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;
import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment;
import org.schabi.newpipe.ktx.ContextKt;
import org.schabi.newpipe.local.bookmark.BookmarkFragment; import org.schabi.newpipe.local.bookmark.BookmarkFragment;
import org.schabi.newpipe.local.feed.FeedFragment; import org.schabi.newpipe.local.feed.FeedFragment;
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment; import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
@ -483,19 +484,20 @@ public final class NavigationHelper {
* Opens the comment author channel fragment, if the {@link CommentsInfoItem#getUploaderUrl()} * Opens the comment author channel fragment, if the {@link CommentsInfoItem#getUploaderUrl()}
* of {@code comment} is non-null. Shows a UI-error snackbar if something goes wrong. * of {@code comment} is non-null. Shows a UI-error snackbar if something goes wrong.
* *
* @param activity the activity with the fragment manager and in which to show the snackbar * @param context the context to use for opening the fragment
* @param comment the comment whose uploader/author will be opened * @param comment the comment whose uploader/author will be opened
*/ */
public static void openCommentAuthorIfPresent(@NonNull final FragmentActivity activity, public static void openCommentAuthorIfPresent(@NonNull final Context context,
@NonNull final CommentsInfoItem comment) { @NonNull final CommentsInfoItem comment) {
if (isEmpty(comment.getUploaderUrl())) { if (isEmpty(comment.getUploaderUrl())) {
return; return;
} }
try { try {
final var activity = ContextKt.findFragmentActivity(context);
openChannelFragment(activity.getSupportFragmentManager(), comment.getServiceId(), openChannelFragment(activity.getSupportFragmentManager(), comment.getServiceId(),
comment.getUploaderUrl(), comment.getUploaderName()); comment.getUploaderUrl(), comment.getUploaderName());
} catch (final Exception e) { } catch (final Exception e) {
ErrorUtil.showUiErrorSnackbar(activity, "Opening channel fragment", e); ErrorUtil.showUiErrorSnackbar(context, "Opening channel fragment", e);
} }
} }