Merge pull request #1114 from nielsvanvelzen/playback-audio-intercept

Forward audio play requests to playback module
This commit is contained in:
Bill Thornton
2021-09-02 09:46:03 -07:00
committed by GitHub
7 changed files with 57 additions and 19 deletions

View File

@@ -177,6 +177,9 @@ public class TvApiEventListener extends ApiEventListener {
@Override
public void onResponse(ItemsResult response) {
if (response.getItems() != null && response.getItems().length > 0) {
PlaybackLauncher playbackLauncher = get(PlaybackLauncher.class);
if (playbackLauncher.interceptPlayRequest(TvApp.getApplication(), response.getItems()[0])) return;
//peek at first item to see what type it is
switch (response.getItems()[0].getMediaType()) {
case "Video":

View File

@@ -993,7 +993,7 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
TextUnderButton imix = new TextUnderButton(this, R.drawable.ic_mix, buttonSize, getString(R.string.lbl_instant_mix), new View.OnClickListener() {
@Override
public void onClick(View v) {
PlaybackHelper.playInstantMix(mBaseItem.getId());
PlaybackHelper.playInstantMix(FullDetailsActivity.this, mBaseItem);
}
});
mDetailsOverviewRow.addAction(imix);
@@ -1564,6 +1564,9 @@ public class FullDetailsActivity extends BaseActivity implements IRecordingIndic
PlaybackHelper.getItemsToPlay(item, pos == 0 && item.getBaseItemType() == BaseItemType.Movie, shuffle, new Response<List<BaseItemDto>>() {
@Override
public void onResponse(List<BaseItemDto> response) {
PlaybackLauncher playbackLauncher = get(PlaybackLauncher.class);
if (playbackLauncher.interceptPlayRequest(FullDetailsActivity.this, item)) return;
if (item.getBaseItemType() == BaseItemType.MusicArtist) {
mediaManager.getValue().playNow(response);
} else {

View File

@@ -321,7 +321,7 @@ public class ItemListActivity extends FragmentActivity {
mix.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
PlaybackHelper.playInstantMix(row.getItem().getId());
PlaybackHelper.playInstantMix(ItemListActivity.this, row.getItem());
return true;
}
});
@@ -511,6 +511,9 @@ public class ItemListActivity extends FragmentActivity {
}
private void play(List<BaseItemDto> items) {
PlaybackLauncher playbackLauncher = get(PlaybackLauncher.class);
if (playbackLauncher.interceptPlayRequest(this, items.size() > 0 ? items.get(0) : null)) return;
if ("Video".equals(mBaseItem.getMediaType())) {
Class activity = get(PlaybackLauncher.class).getPlaybackActivityClass(mBaseItem.getBaseItemType());
Intent intent = new Intent(mActivity, activity);
@@ -576,7 +579,7 @@ public class ItemListActivity extends FragmentActivity {
TextUnderButton mix = new TextUnderButton(this, R.drawable.ic_mix, buttonSize, 2, getString(R.string.lbl_instant_mix), new View.OnClickListener() {
@Override
public void onClick(final View v) {
PlaybackHelper.playInstantMix(mBaseItem.getId());
PlaybackHelper.playInstantMix(ItemListActivity.this, mBaseItem);
}
});
mButtonRow.addView(mix);

View File

@@ -1,18 +1,22 @@
package org.jellyfin.androidtv.ui.playback
import android.app.Activity
import android.content.Context
import android.content.Intent
import org.jellyfin.androidtv.preference.UserPreferences
import org.jellyfin.androidtv.preference.constant.PreferredVideoPlayer
import org.jellyfin.androidtv.ui.playback.rewrite.PlaybackForwardingActivity
import org.jellyfin.apiclient.model.dto.BaseItemDto
import org.jellyfin.apiclient.model.dto.BaseItemType
interface PlaybackLauncher {
fun useExternalPlayer(itemType: BaseItemType?): Boolean
fun getPlaybackActivityClass(itemType: BaseItemType?): Class<out Activity>
fun interceptPlayRequest(context: Context, item: BaseItemDto?): Boolean
}
class GarbagePlaybackLauncher(
private val userPreferences: UserPreferences
private val userPreferences: UserPreferences
) : PlaybackLauncher {
override fun useExternalPlayer(itemType: BaseItemType?) = when (itemType) {
BaseItemType.Movie,
@@ -31,9 +35,20 @@ class GarbagePlaybackLauncher(
useExternalPlayer(itemType) -> ExternalPlayerActivity::class.java
else -> PlaybackOverlayActivity::class.java
}
override fun interceptPlayRequest(context: Context, item: BaseItemDto?): Boolean = false
}
class RewritePlaybackLauncher : PlaybackLauncher {
override fun useExternalPlayer(itemType: BaseItemType?) = false
override fun getPlaybackActivityClass(itemType: BaseItemType?) = PlaybackForwardingActivity::class.java
override fun interceptPlayRequest(context: Context, item: BaseItemDto?): Boolean {
if (item == null) return false
val intent = Intent(context, PlaybackForwardingActivity::class.java)
intent.putExtra(PlaybackForwardingActivity.EXTRA_ITEM_ID, item.id)
context.startActivity(intent)
return true
}
}

View File

@@ -13,8 +13,13 @@ import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import org.koin.android.ext.android.get
import org.koin.android.ext.android.inject
import timber.log.Timber
import java.util.*
class PlaybackForwardingActivity : FragmentActivity() {
companion object {
const val EXTRA_ITEM_ID: String = "item_id"
}
private val mediaManager by inject<MediaManager>()
private val userLibraryApi by lazy {
UserLibraryApi(get(userApiClient))
@@ -24,13 +29,13 @@ class PlaybackForwardingActivity : FragmentActivity() {
super.onCreate(savedInstanceState)
// Try find the item id
val itemId = findItem()?.id?.toUUIDOrNull()
val itemId = findItemId()
if (itemId == null) {
Toast.makeText(
this,
"Could not find item to play (itemId=null)",
Toast.LENGTH_LONG
this,
"Could not find item to play (itemId=null)",
Toast.LENGTH_LONG
).show()
finishAfterTransition()
return
@@ -42,9 +47,9 @@ class PlaybackForwardingActivity : FragmentActivity() {
// Log info
Toast.makeText(
this@PlaybackForwardingActivity,
"Found item of type ${item.type} - ${item.name} (${item.id}",
Toast.LENGTH_LONG
this@PlaybackForwardingActivity,
"Found item of type ${item.type} - ${item.name} (${item.id}",
Toast.LENGTH_LONG
).show()
Timber.i(item.toString())
@@ -53,17 +58,19 @@ class PlaybackForwardingActivity : FragmentActivity() {
}
}
private fun findItem(): BaseItemDto? {
private fun findItemId(): UUID? {
val extra = intent.getStringExtra(EXTRA_ITEM_ID)?.toUUIDOrNull()
var first: BaseItemDto? = null
var best: BaseItemDto? = null
for (item in mediaManager.currentVideoQueue) {
for (item in mediaManager.currentVideoQueue ?: emptyList()) {
if (first == null) first = item
if (best == null && item.baseItemType !== BaseItemType.Trailer) best = item
if (first != null && best != null) break
}
return best ?: first
return extra ?: best?.id?.toUUIDOrNull() ?: first?.id?.toUUIDOrNull()
}
}

View File

@@ -437,7 +437,7 @@ public class KeyProcessor {
get(MediaManager.class).playFrom(mCurrentRowItemNdx);
return true;
case MENU_INSTANT_MIX:
PlaybackHelper.playInstantMix(mCurrentItemId);
PlaybackHelper.playInstantMix(mCurrentActivity, mCurrentItem);
return true;
}

View File

@@ -261,6 +261,9 @@ public class PlaybackHelper {
}
public static void play(final BaseItemDto item, final int pos, final boolean shuffle, final Context activity) {
PlaybackLauncher playbackLauncher = get(PlaybackLauncher.class);
if (playbackLauncher.interceptPlayRequest(activity, item)) return;
getItemsToPlay(item, pos == 0 && item.getBaseItemType() == BaseItemType.Movie, shuffle, new Response<List<BaseItemDto>>() {
@Override
public void onResponse(List<BaseItemDto> response) {
@@ -275,7 +278,7 @@ public class PlaybackHelper {
} else {
BaseItemType itemType = response.size() > 0 ? response.get(0).getBaseItemType() : null;
Class newActivity = get(PlaybackLauncher.class).getPlaybackActivityClass(itemType);
Class newActivity = playbackLauncher.getPlaybackActivityClass(itemType);
Intent intent = new Intent(activity, newActivity);
get(MediaManager.class).setCurrentVideoQueue(response);
intent.putExtra("Position", pos);
@@ -291,7 +294,7 @@ public class PlaybackHelper {
break;
default:
Class newActivity = get(PlaybackLauncher.class).getPlaybackActivityClass(item.getBaseItemType());
Class newActivity = playbackLauncher.getPlaybackActivityClass(item.getBaseItemType());
Intent intent = new Intent(activity, newActivity);
get(MediaManager.class).setCurrentVideoQueue(response);
intent.putExtra("Position", pos);
@@ -332,14 +335,18 @@ public class PlaybackHelper {
});
}
public static void playInstantMix(String seedId) {
public static void playInstantMix(Context context, BaseItemDto item) {
PlaybackLauncher playbackLauncher = get(PlaybackLauncher.class);
if (playbackLauncher.interceptPlayRequest(context, item)) return;
String seedId = item.getId();
getInstantMixAsync(seedId, new Response<BaseItemDto[]>() {
@Override
public void onResponse(BaseItemDto[] response) {
if (response.length > 0) {
get(MediaManager.class).playNow(Arrays.asList(response));
} else {
Utils.showToast(TvApp.getApplication(), R.string.msg_no_playable_items);
Utils.showToast(context, R.string.msg_no_playable_items);
}
}
});