Merge pull request #683 from nielsvanvelzen/tvapp-direct-utils

Remove a lot of TvApp.getApplication() usages from utils package
This commit is contained in:
Bill Thornton
2021-01-20 00:51:24 -05:00
committed by GitHub
23 changed files with 115 additions and 136 deletions

View File

@@ -33,7 +33,7 @@ import org.jellyfin.apiclient.model.querying.NextUpQuery
* More info: https://developer.android.com/training/tv/discovery/recommendations-channel
*/
class LeanbackChannelWorker(
context: Context,
private val context: Context,
val workerParams: WorkerParameters,
private val apiClient: ApiClient
) : CoroutineWorker(context, workerParams) {
@@ -47,13 +47,11 @@ class LeanbackChannelWorker(
const val PERIODIC_UPDATE_REQUEST_NAME = "LeanbackChannelPeriodicUpdateRequest"
}
private val application = TvApp.getApplication()
/**
* Check if the app can use Leanback features and is API level 26 or higher
*/
private val isSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
&& application.packageManager.hasSystemFeature("android.software.leanback")
&& context.packageManager.hasSystemFeature("android.software.leanback")
/**
* Update all channels for the currently authenticated user
@@ -62,7 +60,7 @@ class LeanbackChannelWorker(
// Fail when not supported
!isSupported -> Result.failure()
// Retry later if no authenticated user is found
application.currentUser == null -> Result.retry()
TvApp.getApplication().currentUser == null -> Result.retry()
else -> {
// Update various channels
updateMyMedia()
@@ -79,16 +77,16 @@ class LeanbackChannelWorker(
* The [name] parameter is used to store the id and should be unique.
*/
private fun getChannelUri(name: String, settings: Channel): Uri {
val store = application.getSharedPreferences("leanback_channels", Context.MODE_PRIVATE)
val store = context.getSharedPreferences("leanback_channels", Context.MODE_PRIVATE)
val uri = if (store.contains(name)) {
// Retrieve uri and update content resolver
Uri.parse(store.getString(name, null)).also { uri ->
application.contentResolver.update(uri, settings.toContentValues(), null, null)
context.contentResolver.update(uri, settings.toContentValues(), null, null)
}
} else {
// Create new channel and save uri
application.contentResolver.insert(TvContractCompat.Channels.CONTENT_URI, settings.toContentValues())!!.also { uri ->
context.contentResolver.insert(TvContractCompat.Channels.CONTENT_URI, settings.toContentValues())!!.also { uri ->
store.edit().putString(name, uri.toString()).apply()
}
@@ -98,8 +96,8 @@ class LeanbackChannelWorker(
}
// Update logo
ResourcesCompat.getDrawable(application.resources, R.drawable.ic_jellyfin, null)?.let {
ChannelLogoUtils.storeChannelLogo(application, ContentUris.parseId(uri), it.toBitmap(80.dp, 80.dp))
ResourcesCompat.getDrawable(context.resources, R.drawable.ic_jellyfin, null)?.let {
ChannelLogoUtils.storeChannelLogo(context, ContentUris.parseId(uri), it.toBitmap(80.dp, 80.dp))
}
return uri
@@ -112,19 +110,19 @@ class LeanbackChannelWorker(
// Get channel
val channelUri = getChannelUri("my_media", Channel.Builder()
.setType(TvContractCompat.Channels.TYPE_PREVIEW)
.setDisplayName(application.getString(R.string.lbl_my_media))
.setAppLinkIntent(Intent(application, StartupActivity::class.java))
.setDisplayName(context.getString(R.string.lbl_my_media))
.setAppLinkIntent(Intent(context, StartupActivity::class.java))
.build())
val response = apiClient.getUserViews() ?: return
// Delete current items
application.contentResolver.delete(TvContractCompat.PreviewPrograms.CONTENT_URI, null, null)
context.contentResolver.delete(TvContractCompat.PreviewPrograms.CONTENT_URI, null, null)
// Add new items
application.contentResolver.bulkInsert(TvContractCompat.PreviewPrograms.CONTENT_URI, response.items.map { item ->
context.contentResolver.bulkInsert(TvContractCompat.PreviewPrograms.CONTENT_URI, response.items.map { item ->
val imageUri = if (item.hasPrimaryImage) Uri.parse(apiClient.GetImageUrl(item, ImageOptions()))
else Uri.parse(ImageUtils.getResourceUrl(R.drawable.tile_land_tv))
else Uri.parse(ImageUtils.getResourceUrl(context, R.drawable.tile_land_tv))
PreviewProgram.Builder()
.setChannelId(ContentUris.parseId(channelUri))
@@ -132,7 +130,7 @@ class LeanbackChannelWorker(
.setTitle(item.name)
.setPosterArtUri(imageUri)
.setPosterArtAspectRatio(TvContractCompat.PreviewPrograms.ASPECT_RATIO_16_9)
.setIntent(Intent(application, StartupActivity::class.java).apply {
.setIntent(Intent(context, StartupActivity::class.java).apply {
putExtra(StartupActivity.ITEM_ID, item.id)
putExtra(StartupActivity.ITEM_IS_USER_VIEW, true)
})
@@ -146,10 +144,10 @@ class LeanbackChannelWorker(
*/
private suspend fun updateWatchNext() = withContext(Dispatchers.Default) {
// Delete current items
application.contentResolver.delete(WatchNextPrograms.CONTENT_URI, null, null)
context.contentResolver.delete(WatchNextPrograms.CONTENT_URI, null, null)
// Get user or return if no user is found (not authenticated)
val user = application.currentUser ?: return@withContext
val user = TvApp.getApplication().currentUser ?: return@withContext
// Get new items
val response = apiClient.getNextUpEpisodes(NextUpQuery().apply {
@@ -161,7 +159,7 @@ class LeanbackChannelWorker(
// Add new items
response?.items?.let { items ->
application.contentResolver.bulkInsert(
context.contentResolver.bulkInsert(
WatchNextPrograms.CONTENT_URI,
items.map { item -> getBaseItemAsWatchNextProgram(item).toContentValues() }.toTypedArray()
)
@@ -210,7 +208,7 @@ class LeanbackChannelWorker(
}
// Set intent to open the episode
setIntent(Intent(application, StartupActivity::class.java).apply {
setIntent(Intent(context, StartupActivity::class.java).apply {
putExtra(StartupActivity.ITEM_ID, item.id)
})
}.build()

View File

@@ -27,7 +27,7 @@ public class FriendlyDateButton extends FrameLayout {
dateVal = thisDate;
Date date = new Date(thisDate);
((TextView)v.findViewById(R.id.friendlyName)).setText(TimeUtils.getFriendlyDate(date, true));
((TextView)v.findViewById(R.id.friendlyName)).setText(TimeUtils.getFriendlyDate(context, date, true));
((TextView)v.findViewById(R.id.date)).setText(android.text.format.DateFormat.getDateFormat(context).format(date));
}

View File

@@ -410,7 +410,7 @@ public class LiveProgramDetailPopup {
apiClient.getValue().GetLiveTvSeriesTimerAsync(mProgram.getSeriesTimerId(), new Response<SeriesTimerInfoDto>() {
@Override
public void onResponse(SeriesTimerInfoDto response) {
mRecordPopup.setContent(mProgram, response, mSelectedProgramView, recordSeries);
mRecordPopup.setContent(mActivity, mProgram, response, mSelectedProgramView, recordSeries);
mRecordPopup.show();
}
});

View File

@@ -190,7 +190,7 @@ public class RecordPopup {
return (mPopup != null && mPopup.isShowing());
}
public void setContent(BaseItemDto program, SeriesTimerInfoDto current, IRecordingIndicatorView selectedView, boolean recordSeries) {
public void setContent(Context context, BaseItemDto program, SeriesTimerInfoDto current, IRecordingIndicatorView selectedView, boolean recordSeries) {
mProgramId = program.getId();
mCurrentOptions = current;
mRecordSeries = recordSeries;
@@ -199,7 +199,7 @@ public class RecordPopup {
mDTitle.setText(program.getName());
// build timeline info
setTimelineRow(mDTimeline, program);
setTimelineRow(context, mDTimeline, program);
// set defaults
mPrePadding.setSelection(getPaddingNdx(current.getPrePaddingSeconds()));
@@ -239,7 +239,7 @@ public class RecordPopup {
if (mPopup != null && mPopup.isShowing()) mPopup.dismiss();
}
private void setTimelineRow(LinearLayout timelineRow, BaseItemDto program) {
private void setTimelineRow(Context context, LinearLayout timelineRow, BaseItemDto program) {
timelineRow.removeAllViews();
if (program.getStartDate() == null) return;
@@ -253,7 +253,7 @@ public class RecordPopup {
channel.setTextColor(mActivity.getResources().getColor(android.R.color.holo_blue_light));
timelineRow.addView(channel);
TextView datetime = new TextView(mActivity);
datetime.setText(TimeUtils.getFriendlyDate(local)+ " @ "+android.text.format.DateFormat.getTimeFormat(mActivity).format(local)+ " ("+ DateUtils.getRelativeTimeSpanString(local.getTime())+")");
datetime.setText(TimeUtils.getFriendlyDate(context, local)+ " @ "+android.text.format.DateFormat.getTimeFormat(mActivity).format(local)+ " ("+ DateUtils.getRelativeTimeSpanString(local.getTime())+")");
timelineRow.addView(datetime);
}

View File

@@ -2,7 +2,6 @@ package org.jellyfin.androidtv.ui.browsing;
import org.jellyfin.androidtv.ui.livetv.TvManager;
import org.jellyfin.androidtv.ui.presentation.CardPresenter;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.livetv.TimerQuery;
@@ -15,7 +14,7 @@ public class BrowseScheduleFragment extends EnhancedBrowseFragment {
@Override
protected void setupQueries(final IRowLoader rowLoader) {
TvManager.getScheduleRowsAsync(new TimerQuery(), new CardPresenter(true), mRowsAdapter, new Response<Integer>() {
TvManager.getScheduleRowsAsync(requireContext(), new TimerQuery(), new CardPresenter(true), mRowsAdapter, new Response<Integer>() {
@Override
public void onResponse(Integer response) {
if (response == 0) mActivity.setTitle("No Scheduled Recordings");

View File

@@ -588,7 +588,7 @@ public class EnhancedBrowseFragment extends Fragment implements IRowLoader {
if (mCurrentItem == null) return;
mTitle.setText(mCurrentItem.getName());
String summary = mCurrentItem.getSummary();
String summary = mCurrentItem.getSummary(requireContext());
if (summary != null) mSummary.setText(TextUtilsKt.toHtmlSpanned(summary));
else mSummary.setText(null);

View File

@@ -188,7 +188,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
@Override
public void onResponse(SeriesTimerInfoDto response) {
mSeriesTimerInfo = response;
mBaseItem.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo));
mBaseItem.setOverview(BaseItemUtils.getSeriesOverview(mActivity, mSeriesTimerInfo));
mDorPresenter.getSummaryView().setText(mBaseItem.getOverview());
}
});
@@ -335,16 +335,6 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
private static List<BaseItemType> buttonTypeList = Arrays.asList(buttonTypes);
private static String[] directPlayableTypes = new String[] {"Episode","Movie","Video","Recording","Program"};
private static List<String> directPlayableTypeList = Arrays.asList(directPlayableTypes);
private void updatePoster() {
if (isFinishing()) return;
Glide.with(mActivity)
.load(ImageUtils.getPrimaryImageUrl(mBaseItem, apiClient.getValue(), true, false, false, posterHeight))
.override(posterWidth, posterHeight)
.centerInside()
.into(mDorPresenter.getPosterView());
}
private void updateWatched() {
if (mWatchedToggleButton != null && mBaseItem != null && mBaseItem.getUserData() != null && !isFinishing()) {
@@ -372,7 +362,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
item.setSeriesTimerId(mSeriesTimerInfo.getId());
item.setBaseItemType(BaseItemType.SeriesTimer);
item.setName(mSeriesTimerInfo.getName());
item.setOverview(BaseItemUtils.getSeriesOverview(mSeriesTimerInfo));
item.setOverview(BaseItemUtils.getSeriesOverview(this, mSeriesTimerInfo));
setBaseItem(item);
} else {
@@ -415,7 +405,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
String primaryImageUrl = ImageUtils.getLogoImageUrl(mBaseItem, apiClient.getValue(), 600);
if (primaryImageUrl == null) {
primaryImageUrl = ImageUtils.getPrimaryImageUrl(mBaseItem, apiClient.getValue(), false, posterHeight);
primaryImageUrl = ImageUtils.getPrimaryImageUrl(mActivity, mBaseItem, apiClient.getValue(), false, posterHeight);
if (item.getRunTimeTicks() != null && item.getRunTimeTicks() > 0 && item.getUserData() != null && item.getUserData().getPlaybackPositionTicks() > 0)
mDetailsOverviewRow.setProgress(((int) (item.getUserData().getPlaybackPositionTicks() * 100.0 / item.getRunTimeTicks())));
}
@@ -724,7 +714,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
case SeriesTimer:
TimerQuery scheduled = new TimerQuery();
scheduled.setSeriesTimerId(mSeriesTimerInfo.getId());
TvManager.getScheduleRowsAsync(scheduled, new CardPresenter(true), adapter, new Response<Integer>());
TvManager.getScheduleRowsAsync(this, scheduled, new CardPresenter(true), adapter, new Response<Integer>());
break;
}
@@ -1409,7 +1399,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
@Override
public void onResponse(SeriesTimerInfoDto response) {
if (recordSeries || Utils.isTrue(program.getIsSports())){
mRecordPopup.setContent(program, response, mActivity, recordSeries);
mRecordPopup.setContent(mActivity, program, response, mActivity, recordSeries);
mRecordPopup.show();
} else {
//just record with defaults

View File

@@ -506,7 +506,7 @@ public class ItemListActivity extends BaseActivity {
int posterWidth = (int)((aspect) * posterHeight);
if (posterHeight < 10) posterWidth = Utils.convertDpToPixel(this, 150); //Guard against zero size images causing picasso to barf
String primaryImageUrl = ImageUtils.getPrimaryImageUrl(mBaseItem, apiClient.getValue(), false, posterHeight);
String primaryImageUrl = ImageUtils.getPrimaryImageUrl(this, mBaseItem, apiClient.getValue(), false, posterHeight);
Glide.with(this)

View File

@@ -1,5 +1,6 @@
package org.jellyfin.androidtv.ui.itemhandling;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.format.DateUtils;
@@ -222,30 +223,30 @@ public class BaseRowItem {
}
}
public String getImageUrl(String imageType, int maxHeight) {
public String getImageUrl(Context context, String imageType, int maxHeight) {
switch (type) {
case BaseItem:
case LiveTvProgram:
case LiveTvRecording:
switch (imageType) {
case org.jellyfin.androidtv.constant.ImageType.BANNER:
return ImageUtils.getBannerImageUrl(baseItem, apiClient.getValue(), maxHeight);
return ImageUtils.getBannerImageUrl(context, baseItem, apiClient.getValue(), maxHeight);
case org.jellyfin.androidtv.constant.ImageType.THUMB:
return ImageUtils.getThumbImageUrl(baseItem, apiClient.getValue(), maxHeight);
return ImageUtils.getThumbImageUrl(context, baseItem, apiClient.getValue(), maxHeight);
default:
return getPrimaryImageUrl(maxHeight);
return getPrimaryImageUrl(context, maxHeight);
}
default:
return getPrimaryImageUrl(maxHeight);
return getPrimaryImageUrl(context, maxHeight);
}
}
public String getPrimaryImageUrl(int maxHeight) {
public String getPrimaryImageUrl(Context context, int maxHeight) {
switch (type) {
case BaseItem:
case LiveTvProgram:
case LiveTvRecording:
return ImageUtils.getPrimaryImageUrl(baseItem, apiClient.getValue(), preferParentThumb, maxHeight);
return ImageUtils.getPrimaryImageUrl(context, baseItem, apiClient.getValue(), preferParentThumb, maxHeight);
case Person:
return ImageUtils.getPrimaryImageUrl(person, apiClient.getValue(), maxHeight);
case User:
@@ -255,11 +256,11 @@ public class BaseRowItem {
case LiveTvChannel:
return ImageUtils.getPrimaryImageUrl(channelInfo, apiClient.getValue());
case Server:
return ImageUtils.getResourceUrl(R.drawable.tile_port_server);
return ImageUtils.getResourceUrl(context, R.drawable.tile_port_server);
case GridButton:
return ImageUtils.getResourceUrl(gridButton.getImageIndex());
return ImageUtils.getResourceUrl(context, gridButton.getImageIndex());
case SeriesTimer:
return ImageUtils.getResourceUrl(R.drawable.tile_land_series_timer);
return ImageUtils.getResourceUrl(context, R.drawable.tile_land_series_timer);
case SearchHint:
if (Utils.isNonEmpty(searchHint.getPrimaryImageTag())) {
return ImageUtils.getImageUrl(searchHint.getItemId(), ImageType.Primary, searchHint.getPrimaryImageTag(), apiClient.getValue());
@@ -400,10 +401,10 @@ public class BaseRowItem {
return null;
}
public String getSubText() {
public String getSubText(Context context) {
switch (type) {
case BaseItem:
return BaseItemUtils.getSubName(baseItem);
return BaseItemUtils.getSubName(context, baseItem);
case Person:
return person.getRole();
case Chapter:
@@ -439,7 +440,7 @@ public class BaseRowItem {
return null;
}
public String getSummary() {
public String getSummary(Context context) {
switch (type) {
case BaseItem:
case LiveTvRecording:
@@ -454,7 +455,7 @@ public class BaseRowItem {
case GridButton:
break;
case SeriesTimer:
return BaseItemUtils.getSeriesOverview(seriesTimerInfo);
return BaseItemUtils.getSeriesOverview(context, seriesTimerInfo);
}
return "";

View File

@@ -955,7 +955,7 @@ public class LiveTvGuideActivity extends BaseActivity implements ILiveTvGuide {
mCurrentGuideStart.set(Calendar.MILLISECOND, 0);
mCurrentLocalGuideStart = mCurrentGuideStart.getTimeInMillis();
mDisplayDate.setText(TimeUtils.getFriendlyDate(mCurrentGuideStart.getTime()));
mDisplayDate.setText(TimeUtils.getFriendlyDate(this, mCurrentGuideStart.getTime()));
Calendar current = (Calendar) mCurrentGuideStart.clone();
mCurrentGuideEnd = (Calendar) mCurrentGuideStart.clone();
int oneHour = 60 * PIXELS_PER_MINUTE;
@@ -1011,7 +1011,7 @@ public class LiveTvGuideActivity extends BaseActivity implements ILiveTvGuide {
InfoLayoutHelper.addInfoRow(mActivity, mSelectedProgram, mInfoRow, false, false);
if (mSelectedProgram.getId() != null) {
mDisplayDate.setText(TimeUtils.getFriendlyDate(TimeUtils.convertToLocalDate(mSelectedProgram.getStartDate())));
mDisplayDate.setText(TimeUtils.getFriendlyDate(this, TimeUtils.convertToLocalDate(mSelectedProgram.getStartDate())));
String url = ImageUtils.getPrimaryImageUrl(mSelectedProgram, get(ApiClient.class));
Glide.with(mActivity).load(url).override(IMAGE_SIZE, IMAGE_SIZE).centerInside().into(mImage);

View File

@@ -1,6 +1,7 @@
package org.jellyfin.androidtv.ui.livetv;
import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.text.format.DateUtils;
import android.widget.LinearLayout;
@@ -360,7 +361,7 @@ public class TvManager {
channel.setTextColor(activity.getResources().getColor(android.R.color.holo_blue_light));
timelineRow.addView(channel);
TextView datetime = new TextView(activity);
datetime.setText(TimeUtils.getFriendlyDate(local)+ " @ "+android.text.format.DateFormat.getTimeFormat(activity).format(local)+ " ("+ DateUtils.getRelativeTimeSpanString(local.getTime())+")");
datetime.setText(TimeUtils.getFriendlyDate(activity, local)+ " @ "+android.text.format.DateFormat.getTimeFormat(activity).format(local)+ " ("+ DateUtils.getRelativeTimeSpanString(local.getTime())+")");
timelineRow.addView(datetime);
}
@@ -395,7 +396,7 @@ public class TvManager {
return null;
}
public static void getScheduleRowsAsync(TimerQuery query, final Presenter presenter, final ArrayObjectAdapter rowAdapter, final Response<Integer> outerResponse) {
public static void getScheduleRowsAsync(Context context, TimerQuery query, final Presenter presenter, final ArrayObjectAdapter rowAdapter, final Response<Integer> outerResponse) {
get(ApiClient.class).GetLiveTvTimersAsync(query, new Response<TimerInfoDtoResult>() {
@Override
public void onResponse(TimerInfoDtoResult response) {
@@ -407,7 +408,7 @@ public class TvManager {
if (thisDay != currentDay) {
if (currentDay > 0 && currentTimers.size() > 0) {
//Add the last set of timers as a row
addRow(currentTimers, presenter, rowAdapter);
addRow(context, currentTimers, presenter, rowAdapter);
currentTimers.clear();
}
currentDay = thisDay;
@@ -430,7 +431,7 @@ public class TvManager {
}
if (currentTimers.size() > 0) addRow(currentTimers, presenter, rowAdapter);
if (currentTimers.size() > 0) addRow(context, currentTimers, presenter, rowAdapter);
outerResponse.onResponse(rowAdapter.size());
}
@@ -445,10 +446,10 @@ public class TvManager {
}
private static void addRow(List<BaseItemDto> timers, Presenter presenter, ArrayObjectAdapter rowAdapter) {
private static void addRow(Context context, List<BaseItemDto> timers, Presenter presenter, ArrayObjectAdapter rowAdapter) {
ItemRowAdapter scheduledAdapter = new ItemRowAdapter(timers, presenter, rowAdapter, true);
scheduledAdapter.Retrieve();
ListRow scheduleRow = new ListRow(new HeaderItem(TimeUtils.getFriendlyDate(TimeUtils.convertToLocalDate(timers.get(0).getStartDate()), true)), scheduledAdapter);
ListRow scheduleRow = new ListRow(new HeaderItem(TimeUtils.getFriendlyDate(context, TimeUtils.convertToLocalDate(timers.get(0).getStartDate()), true)), scheduledAdapter);
rowAdapter.add(scheduleRow);
}

View File

@@ -390,7 +390,7 @@ public class AudioNowPlayingActivity extends BaseActivity {
if (posterHeight < 10)
posterWidth = Utils.convertDpToPixel(mActivity, 150); //Guard against zero size images causing picasso to barf
String primaryImageUrl = ImageUtils.getPrimaryImageUrl(mBaseItem, apiClient.getValue(), false, posterHeight);
String primaryImageUrl = ImageUtils.getPrimaryImageUrl(this, mBaseItem, apiClient.getValue(), false, posterHeight);
Timber.d("Audio Poster url: %s", primaryImageUrl);
Glide.with(mActivity)
.load(primaryImageUrl)

View File

@@ -1031,7 +1031,7 @@ public class CustomPlaybackOverlayFragment extends Fragment implements IPlayback
mCurrentGuideStart.set(Calendar.MILLISECOND, 0);
mCurrentLocalGuideStart = mCurrentGuideStart.getTimeInMillis();
mDisplayDate.setText(TimeUtils.getFriendlyDate(mCurrentGuideStart.getTime()));
mDisplayDate.setText(TimeUtils.getFriendlyDate(requireContext(), mCurrentGuideStart.getTime()));
Calendar current = (Calendar) mCurrentGuideStart.clone();
mCurrentGuideEnd = (Calendar) mCurrentGuideStart.clone();
int oneHour = 60 * PIXELS_PER_MINUTE;
@@ -1080,7 +1080,7 @@ public class CustomPlaybackOverlayFragment extends Fragment implements IPlayback
//info row
InfoLayoutHelper.addInfoRow(mActivity, mSelectedProgram, mGuideInfoRow, false, false);
if (mSelectedProgram.getId() != null) {
mDisplayDate.setText(TimeUtils.getFriendlyDate(TimeUtils.convertToLocalDate(mSelectedProgram.getStartDate())));
mDisplayDate.setText(TimeUtils.getFriendlyDate(mActivity, TimeUtils.convertToLocalDate(mSelectedProgram.getStartDate())));
}
}
@@ -1164,16 +1164,6 @@ public class CustomPlaybackOverlayFragment extends Fragment implements IPlayback
}
};
private void updatePoster(BaseItemDto item, ImageView target, boolean preferSeries) {
if (getActivity() != null && !getActivity().isFinishing()) {
int height = Utils.convertDpToPixel(getActivity(), 300);
int width = Utils.convertDpToPixel(getActivity(), 150);
String posterImageUrl = ImageUtils.getPrimaryImageUrl(item, apiClient.getValue(), false, false, preferSeries, height);
if (posterImageUrl != null)
Glide.with(getActivity()).load(posterImageUrl).override(width, height).centerInside().into(target);
}
}
private void updateLogo(BaseItemDto item, ImageView target) {
if (getActivity() != null && !getActivity().isFinishing()) {
int height = Utils.convertDpToPixel(getActivity(), 60);

View File

@@ -11,7 +11,7 @@ fun OptionsScreen.aboutCategory() = category {
info {
setTitle(R.string.lbl_version)
content = Utils.getVersionString()
content = Utils.getVersionString(context)
}
info {

View File

@@ -6,8 +6,8 @@ import org.jellyfin.androidtv.R
import org.jellyfin.androidtv.preference.UserPreferences
import org.jellyfin.androidtv.preference.constant.AudioBehavior
import org.jellyfin.androidtv.preference.constant.PreferredVideoPlayer
import org.jellyfin.androidtv.ui.preference.dsl.*
import org.jellyfin.androidtv.ui.preference.custom.DurationSeekBarPreference
import org.jellyfin.androidtv.ui.preference.dsl.*
import org.jellyfin.androidtv.util.DeviceUtils
import org.jellyfin.androidtv.util.TimeUtils
@@ -72,7 +72,7 @@ fun OptionsScreen.playbackCategory(
120, 300
).map {
val value = if (it == 0) activity.getString(R.string.lbl_none)
else TimeUtils.formatSeconds(it)
else TimeUtils.formatSeconds(context, it)
it.toString() to value
}.toMap()

View File

@@ -373,7 +373,7 @@ public class CardPresenter extends Presenter {
holder.setItem(rowItem, mImageType, 260, 300, mStaticHeight);
holder.mCardView.setTitleText(rowItem.getCardName());
holder.mCardView.setContentText(rowItem.getSubText());
holder.mCardView.setContentText(rowItem.getSubText(holder.mCardView.getContext()));
if (ImageType.DEFAULT.equals(mImageType)) {
holder.mCardView.setOverlayInfo(rowItem);
}
@@ -399,7 +399,7 @@ public class CardPresenter extends Presenter {
}
}
holder.updateCardViewImage(rowItem.getImageUrl(mImageType, holder.getCardHeight()));
holder.updateCardViewImage(rowItem.getImageUrl(holder.mCardView.getContext(), mImageType, holder.getCardHeight()));
}
@Override

View File

@@ -7,7 +7,6 @@ import android.os.Handler;
import androidx.annotation.NonNull;
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
public class DelayedMessage {
private final String title;
@@ -21,8 +20,8 @@ public class DelayedMessage {
}
public DelayedMessage(@NonNull final Context activity, int delay) {
title = TvApp.getApplication().getString(R.string.lbl_please_wait);
message = TvApp.getApplication().getString(R.string.msg_little_longer);
title = activity.getString(R.string.lbl_please_wait);
message = activity.getString(R.string.msg_little_longer);
handler = new Handler(activity.getMainLooper());
runnable = new Runnable() {

View File

@@ -1,12 +1,12 @@
package org.jellyfin.androidtv.util;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.AnyRes;
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import org.jellyfin.apiclient.interaction.ApiClient;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.dto.BaseItemPerson;
@@ -121,9 +121,9 @@ public class ImageUtils {
return apiClient.GetImageUrl(itemId, options);
}
public static String getBannerImageUrl(BaseItemDto item, ApiClient apiClient, int maxHeight) {
public static String getBannerImageUrl(Context context, BaseItemDto item, ApiClient apiClient, int maxHeight) {
if (!item.getHasBanner()) {
return getPrimaryImageUrl(item, apiClient, false, maxHeight);
return getPrimaryImageUrl(context, item, apiClient, false, maxHeight);
}
ImageOptions options = new ImageOptions();
@@ -144,9 +144,9 @@ public class ImageUtils {
return apiClient.GetImageUrl(item.getId(), options);
}
public static String getThumbImageUrl(BaseItemDto item, ApiClient apiClient, int maxHeight) {
public static String getThumbImageUrl(Context context, BaseItemDto item, ApiClient apiClient, int maxHeight) {
if (!item.getHasThumb()) {
return getPrimaryImageUrl(item, apiClient, true, maxHeight);
return getPrimaryImageUrl(context, item, apiClient, true, maxHeight);
}
ImageOptions options = new ImageOptions();
@@ -155,13 +155,13 @@ public class ImageUtils {
return apiClient.GetImageUrl(item.getId(), options);
}
public static String getPrimaryImageUrl(BaseItemDto item, ApiClient apiClient, boolean preferParentThumb, int maxHeight) {
return getPrimaryImageUrl(item, apiClient, false, preferParentThumb, false, maxHeight);
public static String getPrimaryImageUrl(Context context, BaseItemDto item, ApiClient apiClient, boolean preferParentThumb, int maxHeight) {
return getPrimaryImageUrl(context, item, apiClient, false, preferParentThumb, false, maxHeight);
}
public static String getPrimaryImageUrl(BaseItemDto item, ApiClient apiClient, boolean showProgress, boolean preferParentThumb, boolean preferSeriesPoster, int maxHeight) {
public static String getPrimaryImageUrl(Context context, BaseItemDto item, ApiClient apiClient, boolean showProgress, boolean preferParentThumb, boolean preferSeriesPoster, int maxHeight) {
if (item.getBaseItemType() == BaseItemType.SeriesTimer) {
return getResourceUrl(R.drawable.tile_land_series_timer);
return getResourceUrl(context, R.drawable.tile_land_series_timer);
}
ImageOptions options = new ImageOptions();
@@ -279,8 +279,8 @@ public class ImageUtils {
* @param resourceId The id of the image resource
* @return The URL of the image resource
*/
public static String getResourceUrl(@AnyRes int resourceId) {
Resources resources = TvApp.getApplication().getApplicationContext().getResources();
public static String getResourceUrl(Context context, @AnyRes int resourceId) {
Resources resources = context.getResources();
return String.format("%s://%s/%s/%s", ContentResolver.SCHEME_ANDROID_RESOURCE, resources.getResourcePackageName(resourceId), resources.getResourceTypeName(resourceId), resources.getResourceEntryName(resourceId));
}

View File

@@ -7,10 +7,11 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.google.android.flexbox.FlexboxLayout;
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import org.jellyfin.androidtv.ui.itemhandling.BaseRowItem;
import org.jellyfin.androidtv.util.apiclient.BaseItemUtils;
import org.jellyfin.androidtv.util.apiclient.StreamHelper;
@@ -26,7 +27,6 @@ import java.util.Date;
public class InfoLayoutHelper {
private static int textSize = 16;
private static int BTMARGIN = Utils.convertDpToPixel(TvApp.getApplication(), -2);
public static void addInfoRow(Activity activity, BaseRowItem item, LinearLayout layout, boolean includeRuntime, boolean includeEndtime) {
switch (item.getItemType()) {
@@ -169,21 +169,21 @@ public class InfoLayoutHelper {
layout.addView(name);
}
private static void addProgramInfo(Activity activity, BaseItemDto item, LinearLayout layout) {
private static void addProgramInfo(@NonNull Activity activity, BaseItemDto item, LinearLayout layout) {
TextView name = new TextView(activity);
name.setTextSize(textSize);
name.setText(BaseItemUtils.getProgramSubText(item)+" ");
name.setText(BaseItemUtils.getProgramSubText(activity, item)+" ");
layout.addView(name);
if (BaseItemUtils.isNew(item)) {
addBlockText(activity, layout, TvApp.getApplication().getString(R.string.lbl_new), 12, Color.GRAY, R.drawable.dark_green_gradient);
addBlockText(activity, layout, activity.getString(R.string.lbl_new), 12, Color.GRAY, R.drawable.dark_green_gradient);
addSpacer(activity, layout, " ");
} else if (Utils.isTrue(item.getIsSeries()) && !Utils.isTrue(item.getIsNews())) {
addBlockText(activity, layout, TvApp.getApplication().getString(R.string.lbl_repeat), 12, Color.GRAY, R.color.lb_default_brand_color);
addBlockText(activity, layout, activity.getString(R.string.lbl_repeat), 12, Color.GRAY, R.color.lb_default_brand_color);
addSpacer(activity, layout, " ");
}
if (Utils.isTrue(item.getIsLive())) {
addBlockText(activity, layout, TvApp.getApplication().getString(R.string.lbl_live), 12, Color.GRAY, R.color.lb_default_brand_color);
addBlockText(activity, layout, activity.getString(R.string.lbl_live), 12, Color.GRAY, R.color.lb_default_brand_color);
addSpacer(activity, layout, " ");
}
@@ -193,7 +193,7 @@ public class InfoLayoutHelper {
layout.removeAllViews();
TextView text = new TextView(activity);
text.setTextSize(textSize);
text.setText(item.getSubText() + " ");
text.setText(item.getSubText(activity) + " ");
layout.addView(text);
}
@@ -261,14 +261,14 @@ public class InfoLayoutHelper {
if (hasSomething) addSpacer(activity, layout, " ");
}
private static void addDate(Activity activity, BaseItemDto item, LinearLayout layout) {
private static void addDate(@NonNull Activity activity, BaseItemDto item, LinearLayout layout) {
TextView date = new TextView(activity);
date.setTextSize(textSize);
switch (item.getBaseItemType()) {
case Person:
StringBuilder sb = new StringBuilder();
if (item.getPremiereDate() != null) {
sb.append(TvApp.getApplication().getString(R.string.lbl_born));
sb.append(activity.getString(R.string.lbl_born));
sb.append(new SimpleDateFormat("d MMM y").format(TimeUtils.convertToLocalDate(item.getPremiereDate())));
}
if (item.getEndDate() != null) {
@@ -291,8 +291,8 @@ public class InfoLayoutHelper {
case Program:
case TvChannel:
if (item.getStartDate() != null && item.getEndDate() != null) {
date.setText(android.text.format.DateFormat.getTimeFormat(TvApp.getApplication()).format(TimeUtils.convertToLocalDate(item.getStartDate()))
+ "-"+ android.text.format.DateFormat.getTimeFormat(TvApp.getApplication()).format(TimeUtils.convertToLocalDate(item.getEndDate())));
date.setText(android.text.format.DateFormat.getTimeFormat(activity).format(TimeUtils.convertToLocalDate(item.getStartDate()))
+ "-"+ android.text.format.DateFormat.getTimeFormat(activity).format(TimeUtils.convertToLocalDate(item.getEndDate())));
layout.addView(date);
addSpacer(activity, layout, " ");
}
@@ -382,7 +382,7 @@ public class InfoLayoutHelper {
view.setText(" " + text + " ");
view.setBackgroundResource(backgroundRes);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
params.setMargins(0,BTMARGIN,0,0);
params.setMargins(0,Utils.convertDpToPixel(activity, -2),0,0);
view.setLayoutParams(params);
layout.addView(view);

View File

@@ -434,7 +434,7 @@ public class KeyProcessor {
toggleLikes(null);
return true;
case MENU_GOTO_NOW_PLAYING:
Intent nowPlaying = new Intent(TvApp.getApplication(), AudioNowPlayingActivity.class);
Intent nowPlaying = new Intent(mCurrentActivity, AudioNowPlayingActivity.class);
mCurrentActivity.startActivity(nowPlaying);
return true;
case MENU_REMOVE_FROM_QUEUE:

View File

@@ -1,10 +1,10 @@
package org.jellyfin.androidtv.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.format.DateFormat;
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import java.util.Calendar;
import java.util.Date;
@@ -56,10 +56,10 @@ public class TimeUtils {
}
}
public static String formatSeconds(int seconds) {
public static String formatSeconds(Context context, int seconds) {
// Seconds
if (seconds < SECS_PER_MIN) {
return seconds + " " + TvApp.getApplication().getString(R.string.lbl_seconds);
return seconds + " " + context.getString(R.string.lbl_seconds);
}
StringBuilder builder = new StringBuilder();
@@ -68,9 +68,9 @@ public class TimeUtils {
builder.append(seconds / SECS_PER_MIN)
.append(" ");
if (seconds < 2 * SECS_PER_MIN) {
builder.append(TvApp.getApplication().getString(R.string.lbl_minute));
builder.append(context.getString(R.string.lbl_minute));
} else {
builder.append(TvApp.getApplication().getString(R.string.lbl_minutes));
builder.append(context.getString(R.string.lbl_minutes));
}
return builder.toString();
}
@@ -79,9 +79,9 @@ public class TimeUtils {
builder.append(seconds / SECS_PER_HR)
.append(" ");
if (seconds < 2 * SECS_PER_HR) {
builder.append(TvApp.getApplication().getString(R.string.lbl_hour));
builder.append(context.getString(R.string.lbl_hour));
} else {
builder.append(TvApp.getApplication().getString(R.string.lbl_hours));
builder.append(context.getString(R.string.lbl_hours));
}
return builder.toString();
}
@@ -141,29 +141,29 @@ public class TimeUtils {
return age;
}
public static String getFriendlyDate(Date date) {
return getFriendlyDate(date, false);
public static String getFriendlyDate(Context context, Date date) {
return getFriendlyDate(context, date, false);
}
public static String getFriendlyDate(Date date, boolean relative) {
public static String getFriendlyDate(Context context, Date date, boolean relative) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar now = Calendar.getInstance();
if (cal.get(Calendar.YEAR) == now.get(Calendar.YEAR)) {
if (cal.get(Calendar.DAY_OF_YEAR) == now.get(Calendar.DAY_OF_YEAR)) {
return TvApp.getApplication().getString(R.string.lbl_today);
return context.getString(R.string.lbl_today);
}
if (cal.get(Calendar.DAY_OF_YEAR) == now.get(Calendar.DAY_OF_YEAR) + 1) {
return TvApp.getApplication().getString(R.string.lbl_tomorrow);
return context.getString(R.string.lbl_tomorrow);
}
if (cal.get(Calendar.DAY_OF_YEAR) < now.get(Calendar.DAY_OF_YEAR) + 7 && cal.get(Calendar.DAY_OF_YEAR) > now.get(Calendar.DAY_OF_YEAR)) {
return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
}
if (relative) {
return TvApp.getApplication().getString(R.string.lbl_in_x_days, cal.get(Calendar.DAY_OF_YEAR) - now.get(Calendar.DAY_OF_YEAR));
return context.getString(R.string.lbl_in_x_days, cal.get(Calendar.DAY_OF_YEAR) - now.get(Calendar.DAY_OF_YEAR));
}
}
return DateFormat.getDateFormat(TvApp.getApplication()).format(date);
return DateFormat.getDateFormat(context).format(date);
}
}

View File

@@ -69,8 +69,8 @@ public class Utils {
return value != null && value;
}
public static String getVersionString() {
return TvApp.getApplication().getString(R.string.lbl_version) + BuildConfig.VERSION_NAME;
public static String getVersionString(Context context) {
return context.getString(R.string.lbl_version) + BuildConfig.VERSION_NAME;
}
public static String firstToUpper(String value) {

View File

@@ -1,5 +1,6 @@
package org.jellyfin.androidtv.util.apiclient;
import android.content.Context;
import android.text.format.DateFormat;
import org.jellyfin.androidtv.R;
@@ -55,10 +56,10 @@ public class BaseItemUtils {
}
}
public static String getSubName(BaseItemDto item) {
public static String getSubName(Context context, BaseItemDto item) {
switch (item.getBaseItemType()) {
case Episode:
String addendum = item.getLocationType().equals(LocationType.Virtual) && item.getPremiereDate() != null ? " (" + TimeUtils.getFriendlyDate(TimeUtils.convertToLocalDate(item.getPremiereDate())) + ")" : "";
String addendum = item.getLocationType().equals(LocationType.Virtual) && item.getPremiereDate() != null ? " (" + TimeUtils.getFriendlyDate(context, TimeUtils.convertToLocalDate(item.getPremiereDate())) + ")" : "";
return item.getName() + addendum;
case Season:
return item.getChildCount() != null && item.getChildCount() > 0 ? item.getChildCount() + " " + TvApp.getApplication().getString(R.string.lbl_episodes) : "";
@@ -76,7 +77,7 @@ public class BaseItemUtils {
return TvManager.getChannel(TvManager.getAllChannelsIndex(baseItem.getChannelId())).getName();
}
public static String getProgramSubText(BaseItemDto baseItem) {
public static String getProgramSubText(Context context, BaseItemDto baseItem) {
StringBuilder builder = new StringBuilder();
// Add the channel name if set
if (baseItem.getChannelName() != null) {
@@ -93,7 +94,7 @@ public class BaseItemUtils {
startTime.setTime(TimeUtils.convertToLocalDate(baseItem.getStartDate()));
// If the start time is on a different day, add the date
if (startTime.get(Calendar.DAY_OF_YEAR) != Calendar.getInstance().get(Calendar.DAY_OF_YEAR)) {
builder.append(TimeUtils.getFriendlyDate(startTime.getTime()))
builder.append(TimeUtils.getFriendlyDate(context, startTime.getTime()))
.append(" ");
}
// Add the start and end time
@@ -142,7 +143,7 @@ public class BaseItemUtils {
return Utils.isTrue(program.getIsSeries()) && !Utils.isTrue(program.getIsNews()) && !Utils.isTrue(program.getIsRepeat());
}
public static String getSeriesOverview(SeriesTimerInfoDto timer) {
public static String getSeriesOverview(Context context, SeriesTimerInfoDto timer) {
StringBuilder builder = new StringBuilder();
builder.append(TvApp.getApplication().getString(R.string.msg_will_record))
.append(" ");
@@ -168,14 +169,14 @@ public class BaseItemUtils {
builder.append("\n")
.append("Starting");
if (timer.getPrePaddingSeconds() > 0) {
builder.append(TimeUtils.formatSeconds(timer.getPrePaddingSeconds()))
builder.append(TimeUtils.formatSeconds(context, timer.getPrePaddingSeconds()))
.append(" Early");
} else {
builder.append("On Schedule");
}
builder.append(" And Ending ");
if (timer.getPostPaddingSeconds() > 0) {
builder.append(TimeUtils.formatSeconds(timer.getPostPaddingSeconds()))
builder.append(TimeUtils.formatSeconds(context, timer.getPostPaddingSeconds()))
.append(" After Schedule");
} else {
builder.append("On Schedule");