Replace Response<T> usages with local type

This commit is contained in:
Niels van Velzen
2025-02-13 21:29:30 +01:00
committed by Niels van Velzen
parent a4d2f0a030
commit 1ed6611b7d
17 changed files with 42 additions and 98 deletions

View File

@ -24,7 +24,7 @@ import org.jellyfin.androidtv.data.model.DataRefreshService;
import org.jellyfin.androidtv.ui.livetv.LiveTvGuide;
import org.jellyfin.androidtv.ui.livetv.TvManager;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.koin.java.KoinJavaComponent;
@ -48,13 +48,13 @@ public class LiveProgramDetailPopup {
private Button mFirstButton;
private Button mSeriesSettingsButton;
private EmptyLifecycleAwareResponse mTuneAction;
private EmptyResponse mTuneAction;
private View mAnchor;
private int mPosLeft;
private int mPosTop;
public LiveProgramDetailPopup(Context context, LifecycleOwner lifecycleOwner, LiveTvGuide tvGuide, int width, EmptyLifecycleAwareResponse tuneAction) {
public LiveProgramDetailPopup(Context context, LifecycleOwner lifecycleOwner, LiveTvGuide tvGuide, int width, EmptyResponse tuneAction) {
mContext = context;
lifecycle = lifecycleOwner.getLifecycle();
mTvGuide = tvGuide;
@ -247,7 +247,7 @@ public class LiveProgramDetailPopup {
tune.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTuneAction != null && mTuneAction.getActive()) mTuneAction.onResponse();
if (mTuneAction != null) mTuneAction.onResponse();
mPopup.dismiss();
}
});

View File

@ -59,7 +59,7 @@ import org.jellyfin.androidtv.util.ImageHelper;
import org.jellyfin.androidtv.util.InfoLayoutHelper;
import org.jellyfin.androidtv.util.KeyProcessor;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.sdk.api.client.ApiClient;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemKind;
@ -659,11 +659,9 @@ public class BrowseGridFragment extends Fragment implements View.OnKeyListener {
filters.setFavoriteOnly(libraryPreferences.get(LibraryPreferences.Companion.getFilterFavoritesOnly()));
filters.setUnwatchedOnly(libraryPreferences.get(LibraryPreferences.Companion.getFilterUnwatchedOnly()));
mAdapter.setRetrieveFinishedListener(new EmptyLifecycleAwareResponse(getLifecycle()) {
mAdapter.setRetrieveFinishedListener(new EmptyResponse() {
@Override
public void onResponse() {
if (!getActive()) return;
setStatusText(mFolder.getName());
if (mCurrentItem == null) { // don't mess-up pos via loadMoreItemsIfNeeded
setItem(null);

View File

@ -77,7 +77,7 @@ import org.jellyfin.androidtv.util.PlaybackHelper;
import org.jellyfin.androidtv.util.TimeUtils;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.BaseItemUtils;
import org.jellyfin.androidtv.util.apiclient.LifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.Response;
import org.jellyfin.androidtv.util.sdk.BaseItemExtensionsKt;
import org.jellyfin.androidtv.util.sdk.TrailerUtils;
import org.jellyfin.androidtv.util.sdk.compat.JavaCompat;
@ -714,11 +714,9 @@ public class FullDetailsFragment extends Fragment implements RecordingIndicatorV
BaseItemDto baseItem = mBaseItem;
if (baseItem.getType() == BaseItemKind.AUDIO || baseItem.getType() == BaseItemKind.MUSIC_ALBUM || baseItem.getType() == BaseItemKind.MUSIC_ARTIST) {
if (baseItem.getType() == BaseItemKind.MUSIC_ALBUM || baseItem.getType() == BaseItemKind.MUSIC_ARTIST) {
playbackHelper.getValue().getItemsToPlay(getContext(), baseItem, false, false, new LifecycleAwareResponse<List<BaseItemDto>>(getLifecycle()) {
playbackHelper.getValue().getItemsToPlay(getContext(), baseItem, false, false, new Response<List<BaseItemDto>>() {
@Override
public void onResponse(List<BaseItemDto> response) {
if (!getActive()) return;
mediaManager.getValue().addToAudioQueue(response);
}
});
@ -1196,10 +1194,9 @@ public class FullDetailsFragment extends Fragment implements RecordingIndicatorV
}
void play(final BaseItemDto item, final int pos, final boolean shuffle) {
playbackHelper.getValue().getItemsToPlay(getContext(), item, pos == 0 && item.getType() == BaseItemKind.MOVIE, shuffle, new LifecycleAwareResponse<List<BaseItemDto>>(getLifecycle()) {
playbackHelper.getValue().getItemsToPlay(getContext(), item, pos == 0 && item.getType() == BaseItemKind.MOVIE, shuffle, new Response<List<BaseItemDto>>() {
@Override
public void onResponse(List<BaseItemDto> response) {
if (!getActive()) return;
if (response.isEmpty()) {
Timber.e("No items to play - ignoring play request.");
return;

View File

@ -17,8 +17,8 @@ import org.jellyfin.androidtv.ui.playback.PlaybackLauncher;
import org.jellyfin.androidtv.ui.playback.VideoQueueManager;
import org.jellyfin.androidtv.util.PlaybackHelper;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.Response;
import org.jellyfin.androidtv.util.sdk.compat.JavaCompat;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemKind;
import org.jellyfin.sdk.model.api.CollectionType;

View File

@ -3,7 +3,7 @@ package org.jellyfin.androidtv.ui.itemhandling
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.jellyfin.apiclient.interaction.Response
import org.jellyfin.androidtv.util.apiclient.Response
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.extensions.userLibraryApi

View File

@ -31,7 +31,7 @@ import org.jellyfin.androidtv.ui.browsing.EnhancedBrowseFragment;
import org.jellyfin.androidtv.ui.presentation.MutableObjectAdapter;
import org.jellyfin.androidtv.ui.presentation.TextItemPresenter;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemPerson;
import org.jellyfin.sdk.model.api.ItemSortBy;
@ -78,7 +78,7 @@ public class ItemRowAdapter extends MutableObjectAdapter<Object> {
private SortOrder sortOrder;
private FilterOptions mFilters;
private EmptyLifecycleAwareResponse mRetrieveFinishedListener;
private EmptyResponse mRetrieveFinishedListener;
private ChangeTriggerType[] reRetrieveTriggers = new ChangeTriggerType[]{};
private Instant lastFullRetrieve;
@ -720,13 +720,13 @@ public class ItemRowAdapter extends MutableObjectAdapter<Object> {
protected void notifyRetrieveFinished(@Nullable Exception exception) {
setCurrentlyRetrieving(false);
if (mRetrieveFinishedListener != null && mRetrieveFinishedListener.getActive()) {
if (mRetrieveFinishedListener != null) {
if (exception == null) mRetrieveFinishedListener.onResponse();
else mRetrieveFinishedListener.onError(exception);
}
}
public void setRetrieveFinishedListener(EmptyLifecycleAwareResponse response) {
public void setRetrieveFinishedListener(EmptyResponse response) {
this.mRetrieveFinishedListener = response;
}

View File

@ -49,7 +49,7 @@ import org.jellyfin.androidtv.util.PlaybackHelper;
import org.jellyfin.androidtv.util.TextUtilsKt;
import org.jellyfin.androidtv.util.TimeUtils;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.sdk.model.api.BaseItemDto;
import java.time.LocalDateTime;
@ -426,11 +426,9 @@ public class LiveTvGuideFragment extends Fragment implements LiveTvGuide, View.O
public void showProgramOptions() {
if (mSelectedProgram == null) return;
if (mDetailPopup == null) {
mDetailPopup = new LiveProgramDetailPopup(requireActivity(), this, this, mSummary.getWidth()+20, new EmptyLifecycleAwareResponse(getLifecycle()) {
mDetailPopup = new LiveProgramDetailPopup(requireActivity(), this, this, mSummary.getWidth()+20, new EmptyResponse() {
@Override
public void onResponse() {
if (!getActive()) return;
playbackHelper.getValue().retrieveAndPlay(mSelectedProgram.getChannelId(), false, requireContext());
}
});
@ -475,11 +473,9 @@ public class LiveTvGuideFragment extends Fragment implements LiveTvGuide, View.O
mChannels.removeAllViews();
mChannelStatus.setText("");
mFilterStatus.setText("");
TvManager.getProgramsAsync(this, mCurrentDisplayChannelStartNdx, mCurrentDisplayChannelEndNdx, mCurrentGuideStart, mCurrentGuideEnd, new EmptyLifecycleAwareResponse(getLifecycle()) {
TvManager.getProgramsAsync(this, mCurrentDisplayChannelStartNdx, mCurrentDisplayChannelEndNdx, mCurrentGuideStart, mCurrentGuideEnd, new EmptyResponse() {
@Override
public void onResponse() {
if (!getActive()) return;
Timber.d("*** Programs response");
if (mDisplayProgramsTask != null) mDisplayProgramsTask.cancel(true);
mDisplayProgramsTask = new DisplayProgramsTask();

View File

@ -20,7 +20,7 @@ import org.jellyfin.androidtv.ui.presentation.MutableObjectAdapter;
import org.jellyfin.androidtv.util.DateTimeExtensionsKt;
import org.jellyfin.androidtv.util.TimeUtils;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.koin.java.KoinJavaComponent;
@ -121,7 +121,7 @@ public class TvManager {
return ndx;
}
public static void getProgramsAsync(Fragment fragment, int startNdx, int endNdx, final LocalDateTime startTime, LocalDateTime endTime, final EmptyLifecycleAwareResponse outerResponse) {
public static void getProgramsAsync(Fragment fragment, int startNdx, int endNdx, final LocalDateTime startTime, LocalDateTime endTime, final EmptyResponse outerResponse) {
LocalDateTime startTimeRounded = startTime.withMinute(startTime.getMinute() >= 30 ? 30 : 0).withSecond(0).withNano(0);
LocalDateTime endTimeRounded = endTime.minusSeconds(1);
@ -136,7 +136,7 @@ public class TvManager {
buildProgramsDict(programs, startTimeRounded);
Timber.d("*** Programs retrieval finished");
if (outerResponse.getActive()) outerResponse.onResponse();
outerResponse.onResponse();
} else {
outerResponse.onResponse();
}

View File

@ -71,7 +71,7 @@ import org.jellyfin.androidtv.util.InfoLayoutHelper;
import org.jellyfin.androidtv.util.TextUtilsKt;
import org.jellyfin.androidtv.util.TimeUtils;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.EmptyLifecycleAwareResponse;
import org.jellyfin.androidtv.util.apiclient.EmptyResponse;
import org.jellyfin.androidtv.util.sdk.BaseItemExtensionsKt;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemKind;
@ -796,11 +796,9 @@ public class CustomPlaybackOverlayFragment extends Fragment implements LiveTvGui
tvGuideBinding.channelsStatus.setText("");
tvGuideBinding.filterStatus.setText("");
final CustomPlaybackOverlayFragment self = this;
TvManager.getProgramsAsync(this, mCurrentDisplayChannelStartNdx, mCurrentDisplayChannelEndNdx, mCurrentGuideStart, mCurrentGuideEnd, new EmptyLifecycleAwareResponse(getLifecycle()) {
TvManager.getProgramsAsync(this, mCurrentDisplayChannelStartNdx, mCurrentDisplayChannelEndNdx, mCurrentGuideStart, mCurrentGuideEnd, new EmptyResponse() {
@Override
public void onResponse() {
if (!getActive()) return;
Timber.d("*** Programs response");
if (mDisplayProgramsTask != null) mDisplayProgramsTask.cancel(true);
mDisplayProgramsTask = new DisplayProgramsTask(self);
@ -1077,11 +1075,9 @@ public class CustomPlaybackOverlayFragment extends Fragment implements LiveTvGui
public void showProgramOptions() {
if (mSelectedProgram == null) return;
if (mDetailPopup == null)
mDetailPopup = new LiveProgramDetailPopup(requireActivity(), this, this, Utils.convertDpToPixel(requireContext(), 600), new EmptyLifecycleAwareResponse(getLifecycle()) {
mDetailPopup = new LiveProgramDetailPopup(requireActivity(), this, this, Utils.convertDpToPixel(requireContext(), 600), new EmptyResponse() {
@Override
public void onResponse() {
if (!getActive()) return;
switchChannel(mSelectedProgram.getChannelId());
}
});

View File

@ -27,9 +27,9 @@ import org.jellyfin.androidtv.ui.livetv.TvManager;
import org.jellyfin.androidtv.util.TimeUtils;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.ReportingHelper;
import org.jellyfin.androidtv.util.apiclient.Response;
import org.jellyfin.androidtv.util.profile.DeviceProfileKt;
import org.jellyfin.androidtv.util.sdk.compat.JavaCompat;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemKind;
import org.jellyfin.sdk.model.api.DeviceProfile;

View File

@ -6,7 +6,7 @@ import kotlinx.coroutines.launch
import org.jellyfin.androidtv.data.compat.PlaybackException
import org.jellyfin.androidtv.data.compat.StreamInfo
import org.jellyfin.androidtv.data.compat.VideoOptions
import org.jellyfin.apiclient.interaction.Response
import org.jellyfin.androidtv.util.apiclient.Response
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.extensions.hlsSegmentApi
import org.jellyfin.sdk.api.client.extensions.mediaInfoApi

View File

@ -18,8 +18,8 @@ import org.jellyfin.androidtv.ui.itemhandling.BaseRowType;
import org.jellyfin.androidtv.ui.navigation.Destinations;
import org.jellyfin.androidtv.ui.navigation.NavigationRepository;
import org.jellyfin.androidtv.ui.playback.MediaManager;
import org.jellyfin.androidtv.util.apiclient.Response;
import org.jellyfin.androidtv.util.sdk.BaseItemExtensionsKt;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.sdk.model.api.BaseItemDto;
import org.jellyfin.sdk.model.api.BaseItemKind;
import org.jellyfin.sdk.model.api.ItemSortBy;

View File

@ -1,7 +1,7 @@
package org.jellyfin.androidtv.util
import android.content.Context
import org.jellyfin.apiclient.interaction.Response
import org.jellyfin.androidtv.util.apiclient.Response
import org.jellyfin.sdk.model.api.BaseItemDto
import java.util.UUID

View File

@ -1,28 +0,0 @@
package org.jellyfin.androidtv.util.apiclient
import androidx.lifecycle.Lifecycle
import org.jellyfin.apiclient.interaction.EmptyResponse
abstract class EmptyLifecycleAwareResponse(
private val lifecycle: Lifecycle,
) : EmptyResponse() {
val active get() = lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
override fun triggerInnerResponse() {
if (!active) return
super.triggerInnerResponse()
}
override fun onResponse() {
if (!active) return
super.onResponse()
}
override fun onError(ex: Exception?) {
if (!active) return
super.onError(ex)
}
}

View File

@ -1,28 +0,0 @@
package org.jellyfin.androidtv.util.apiclient
import androidx.lifecycle.Lifecycle
import org.jellyfin.apiclient.interaction.Response
abstract class LifecycleAwareResponse<T>(
private val lifecycle: Lifecycle,
) : Response<T>() {
val active get() = lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
override fun triggerInnerResponse() {
if (!active) return
super.triggerInnerResponse()
}
override fun onResponse(response: T) {
if (!active) return
super.onResponse(response)
}
override fun onError(exception: Exception?) {
if (!active) return
super.onError(exception)
}
}

View File

@ -0,0 +1,13 @@
package org.jellyfin.androidtv.util.apiclient
@Deprecated("Utility class for callbacks used inside Java code. Do not use for new code.")
abstract class Response<T> {
abstract fun onResponse(response: T)
open fun onError(exception: Exception) = Unit
}
@Deprecated("Utility class for callbacks used inside Java code. Do not use for new code.")
abstract class EmptyResponse : Response<Unit>() {
override fun onResponse(response: Unit) = onResponse()
abstract fun onResponse()
}

View File

@ -15,7 +15,7 @@ import org.jellyfin.androidtv.ui.playback.PlaybackControllerContainer
import org.jellyfin.androidtv.ui.playback.PlaybackLauncher
import org.jellyfin.androidtv.ui.playback.VideoQueueManager
import org.jellyfin.androidtv.util.PlaybackHelper
import org.jellyfin.apiclient.interaction.Response
import org.jellyfin.androidtv.util.apiclient.Response
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.extensions.instantMixApi
import org.jellyfin.sdk.api.client.extensions.itemsApi