Merge pull request #1114 from nielsvanvelzen/playback-audio-intercept
Forward audio play requests to playback module
This commit is contained in:
@@ -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":
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user