正在查看: Glean v1.1.34 应用的 VideoPlaybackService.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Glean v1.1.34 应用的 VideoPlaybackService.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.brentvatne.exoplayer;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import androidx.core.app.NotificationCompat;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.session.CommandButton;
import androidx.media3.session.MediaSession;
import androidx.media3.session.MediaSessionService;
import androidx.media3.session.MediaStyleNotificationHelper;
import androidx.media3.session.SessionCommand;
import androidx.media3.ui.R;
import com.brentvatne.common.toolbox.DebugLog;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import kotlin.Metadata;
import kotlin.enums.EnumEntries;
import kotlin.enums.EnumEntriesKt;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import okhttp3.internal.Util;
@Metadata(d1 = {"\u0000n\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010%\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\b\n\u0002\b\u0006\n\u0002\u0010\u000b\n\u0002\b\u0005\u0018\u0000 /2\u00020\u0001:\u0001/B\u0005¢\u0006\u0002\u0010\u0002J\u0010\u0010\u0012\u001a\u00020\u00132\u0006\u0010\u0014\u001a\u00020\u000bH\u0002J\b\u0010\u0015\u001a\u00020\u0016H\u0002J\u0010\u0010\u0017\u001a\u00020\u00162\u0006\u0010\u0014\u001a\u00020\u000bH\u0002J\b\u0010\u0018\u001a\u00020\u0016H\u0002J\u0010\u0010\u0019\u001a\u00020\u00162\u0006\u0010\u001a\u001a\u00020\nH\u0002J\u0012\u0010\u001b\u001a\u00020\u001c2\b\u0010\u001d\u001a\u0004\u0018\u00010\u001eH\u0016J\b\u0010\u001f\u001a\u00020\u0016H\u0016J\u0012\u0010 \u001a\u0004\u0018\u00010\u000b2\u0006\u0010!\u001a\u00020\"H\u0016J\"\u0010#\u001a\u00020$2\b\u0010\u001d\u001a\u0004\u0018\u00010\u001e2\u0006\u0010%\u001a\u00020$2\u0006\u0010&\u001a\u00020$H\u0016J\u0012\u0010'\u001a\u00020\u00162\b\u0010(\u001a\u0004\u0018\u00010\u001eH\u0016J\u0018\u0010)\u001a\u00020\u00162\u0006\u0010\u0014\u001a\u00020\u000b2\u0006\u0010*\u001a\u00020+H\u0016J\u001c\u0010,\u001a\u00020\u00162\u0006\u0010\u001a\u001a\u00020\n2\f\u0010-\u001a\b\u0012\u0004\u0012\u00020\u00110\u0010J\u000e\u0010.\u001a\u00020\u00162\u0006\u0010\u001a\u001a\u00020\nR\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\u0006X\u0082\u0004¢\u0006\u0002\n\u0000R\u001a\u0010\b\u001a\u000e\u0012\u0004\u0012\u00020\n\u0012\u0004\u0012\u00020\u000b0\tX\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\f\u001a\u00020\r8\u0002X\u0083\u0004¢\u0006\u0002\n\u0000R\u0010\u0010\u000e\u001a\u00020\r8\u0002X\u0083\u0004¢\u0006\u0002\n\u0000R\u0016\u0010\u000f\u001a\n\u0012\u0004\u0012\u00020\u0011\u0018\u00010\u0010X\u0082\u000e¢\u0006\u0002\n\u0000¨\u00060"}, d2 = {"Lcom/brentvatne/exoplayer/VideoPlaybackService;", "Landroidx/media3/session/MediaSessionService;", "()V", "binder", "Lcom/brentvatne/exoplayer/PlaybackServiceBinder;", "commandSeekBackward", "Landroidx/media3/session/SessionCommand;", "commandSeekForward", "mediaSessionsList", "", "Landroidx/media3/exoplayer/ExoPlayer;", "Landroidx/media3/session/MediaSession;", "seekBackwardBtn", "Landroidx/media3/session/CommandButton;", "seekForwardBtn", "sourceActivity", "Ljava/lang/Class;", "Landroid/app/Activity;", "buildNotification", "Landroid/app/Notification;", "session", "cleanup", "", "createSessionNotification", "hideAllNotifications", "hidePlayerNotification", "player", "onBind", "Landroid/os/IBinder;", "intent", "Landroid/content/Intent;", "onDestroy", "onGetSession", "controllerInfo", "Landroidx/media3/session/MediaSession$ControllerInfo;", "onStartCommand", "", "flags", "startId", "onTaskRemoved", "rootIntent", "onUpdateNotification", "startInForegroundRequired", "", "registerPlayer", "from", "unregisterPlayer", "Companion", "react-native-video_release"}, k = 1, mv = {1, 9, 0}, xi = 48)
public final class VideoPlaybackService extends MediaSessionService {
public static final Companion INSTANCE = new Companion(null);
public static final String NOTIFICATION_CHANEL_ID = "RNVIDEO_SESSION_NOTIFICATION";
private static final long SEEK_INTERVAL_MS = 10000;
private static final String TAG = "VideoPlaybackService";
private final SessionCommand commandSeekBackward;
private final SessionCommand commandSeekForward;
private final CommandButton seekBackwardBtn;
private final CommandButton seekForwardBtn;
private Class<Activity> sourceActivity;
private Map<ExoPlayer, MediaSession> mediaSessionsList = new LinkedHashMap();
private PlaybackServiceBinder binder = new PlaybackServiceBinder(this);
@Override
public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) {
Intrinsics.checkNotNullParameter(controllerInfo, "controllerInfo");
return null;
}
public VideoPlaybackService() {
SessionCommand sessionCommand = new SessionCommand(Companion.COMMAND.SEEK_FORWARD.getStringValue(), Bundle.EMPTY);
this.commandSeekForward = sessionCommand;
SessionCommand sessionCommand2 = new SessionCommand(Companion.COMMAND.SEEK_BACKWARD.getStringValue(), Bundle.EMPTY);
this.commandSeekBackward = sessionCommand2;
CommandButton build = new CommandButton.Builder().setDisplayName("forward").setSessionCommand(sessionCommand).setIconResId(R.drawable.exo_notification_fastforward).build();
Intrinsics.checkNotNullExpressionValue(build, "build(...)");
this.seekForwardBtn = build;
CommandButton build2 = new CommandButton.Builder().setDisplayName("backward").setSessionCommand(sessionCommand2).setIconResId(R.drawable.exo_notification_rewind).build();
Intrinsics.checkNotNullExpressionValue(build2, "build(...)");
this.seekBackwardBtn = build2;
}
public final void registerPlayer(ExoPlayer player, Class<Activity> from) {
Intrinsics.checkNotNullParameter(player, "player");
Intrinsics.checkNotNullParameter(from, "from");
if (this.mediaSessionsList.containsKey(player)) {
return;
}
this.sourceActivity = from;
MediaSession build = new MediaSession.Builder(this, player).setId("RNVideoPlaybackService_" + player.hashCode()).setCallback((MediaSession.Callback) new VideoPlaybackCallback()).setCustomLayout(Util.immutableListOf(new CommandButton[]{this.seekForwardBtn, this.seekBackwardBtn})).build();
Intrinsics.checkNotNullExpressionValue(build, "build(...)");
this.mediaSessionsList.put(player, build);
addSession(build);
startForeground(build.getPlayer().hashCode(), buildNotification(build));
}
public final void unregisterPlayer(ExoPlayer player) {
Intrinsics.checkNotNullParameter(player, "player");
hidePlayerNotification(player);
MediaSession remove = this.mediaSessionsList.remove(player);
if (remove != null) {
remove.release();
}
if (this.mediaSessionsList.isEmpty()) {
cleanup();
stopSelf();
}
}
@Override
public IBinder onBind(Intent intent) {
super.onBind(intent);
return this.binder;
}
@Override
public void onUpdateNotification(MediaSession session, boolean startInForegroundRequired) {
Intrinsics.checkNotNullParameter(session, "session");
createSessionNotification(session);
}
@Override
public void onTaskRemoved(Intent rootIntent) {
cleanup();
stopSelf();
}
@Override
public void onDestroy() {
cleanup();
Object systemService = getSystemService("notification");
Intrinsics.checkNotNull(systemService, "null cannot be cast to non-null type android.app.NotificationManager");
((NotificationManager) systemService).deleteNotificationChannel(NOTIFICATION_CHANEL_ID);
super.onDestroy();
}
private final void createSessionNotification(MediaSession session) {
Object systemService = getSystemService("notification");
Intrinsics.checkNotNull(systemService, "null cannot be cast to non-null type android.app.NotificationManager");
NotificationManager notificationManager = (NotificationManager) systemService;
notificationManager.createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANEL_ID, NOTIFICATION_CHANEL_ID, 2));
if (session.getPlayer().getCurrentMediaItem() == null) {
notificationManager.cancel(session.getPlayer().hashCode());
} else {
notificationManager.notify(session.getPlayer().hashCode(), buildNotification(session));
}
}
private final Notification buildNotification(MediaSession session) {
int i;
VideoPlaybackService videoPlaybackService = this;
Class<?> cls = this.sourceActivity;
if (cls == null) {
cls = getClass();
}
Intent intent = new Intent(videoPlaybackService, cls);
intent.setFlags(603979776);
if (Build.VERSION.SDK_INT >= 33) {
Notification build = new NotificationCompat.Builder(videoPlaybackService, NOTIFICATION_CHANEL_ID).setSmallIcon(androidx.media3.session.R.drawable.media3_icon_circular_play).setStyle(new MediaStyleNotificationHelper.MediaStyle(session)).setContentIntent(PendingIntent.getActivity(videoPlaybackService, 0, intent, 201326592)).build();
Intrinsics.checkNotNull(build);
return build;
}
int hashCode = session.getPlayer().hashCode();
Intent intent2 = new Intent(videoPlaybackService, (Class<?>) VideoPlaybackService.class);
intent2.putExtra("PLAYER_ID", hashCode);
intent2.putExtra("ACTION", Companion.COMMAND.SEEK_BACKWARD.getStringValue());
int i2 = hashCode * 10;
PendingIntent service = PendingIntent.getService(videoPlaybackService, i2, intent2, 167772160);
Intent intent3 = new Intent(videoPlaybackService, (Class<?>) VideoPlaybackService.class);
intent3.putExtra("PLAYER_ID", hashCode);
intent3.putExtra("ACTION", Companion.COMMAND.TOGGLE_PLAY.getStringValue());
PendingIntent service2 = PendingIntent.getService(videoPlaybackService, i2 + 1, intent3, 167772160);
Intent intent4 = new Intent(videoPlaybackService, (Class<?>) VideoPlaybackService.class);
intent4.putExtra("PLAYER_ID", hashCode);
intent4.putExtra("ACTION", Companion.COMMAND.SEEK_FORWARD.getStringValue());
PendingIntent service3 = PendingIntent.getService(videoPlaybackService, i2 + 2, intent4, 167772160);
NotificationCompat.Builder addAction = new NotificationCompat.Builder(videoPlaybackService, NOTIFICATION_CHANEL_ID).setVisibility(1).setSmallIcon(androidx.media3.session.R.drawable.media3_icon_circular_play).addAction(androidx.media3.session.R.drawable.media3_icon_rewind, "Seek Backward", service);
if (session.getPlayer().isPlaying()) {
i = androidx.media3.session.R.drawable.media3_icon_pause;
} else {
i = androidx.media3.session.R.drawable.media3_icon_play;
}
NotificationCompat.Builder contentIntent = addAction.addAction(i, "Toggle Play", service2).addAction(androidx.media3.session.R.drawable.media3_icon_fast_forward, "Seek Forward", service3).setStyle(new MediaStyleNotificationHelper.MediaStyle(session).setShowActionsInCompactView(0, 1, 2)).setContentTitle(session.getPlayer().getMediaMetadata().title).setContentText(session.getPlayer().getMediaMetadata().description).setContentIntent(PendingIntent.getActivity(videoPlaybackService, 0, intent, 201326592));
Uri uri = session.getPlayer().getMediaMetadata().artworkUri;
Notification build2 = contentIntent.setLargeIcon(uri != null ? (Bitmap) session.getBitmapLoader().loadBitmap(uri).get() : null).setOngoing(true).build();
Intrinsics.checkNotNull(build2);
return build2;
}
private final void hidePlayerNotification(ExoPlayer player) {
Object systemService = getSystemService("notification");
Intrinsics.checkNotNull(systemService, "null cannot be cast to non-null type android.app.NotificationManager");
((NotificationManager) systemService).cancel(player.hashCode());
}
private final void hideAllNotifications() {
Object systemService = getSystemService("notification");
Intrinsics.checkNotNull(systemService, "null cannot be cast to non-null type android.app.NotificationManager");
((NotificationManager) systemService).cancelAll();
}
private final void cleanup() {
hideAllNotifications();
Iterator<Map.Entry<ExoPlayer, MediaSession>> it = this.mediaSessionsList.entrySet().iterator();
while (it.hasNext()) {
it.next().getValue().release();
}
this.mediaSessionsList.clear();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Object obj;
if (intent != null) {
int intExtra = intent.getIntExtra("PLAYER_ID", -1);
String stringExtra = intent.getStringExtra("ACTION");
if (intExtra < 0) {
DebugLog.w(TAG, "Received Command without playerId");
return super.onStartCommand(intent, flags, startId);
}
if (stringExtra == null) {
DebugLog.w(TAG, "Received Command without action command");
return super.onStartCommand(intent, flags, startId);
}
Iterator<T> it = this.mediaSessionsList.values().iterator();
while (true) {
if (!it.hasNext()) {
obj = null;
break;
}
obj = it.next();
if (((MediaSession) obj).getPlayer().hashCode() == intExtra) {
break;
}
}
MediaSession mediaSession = (MediaSession) obj;
if (mediaSession == null) {
return super.onStartCommand(intent, flags, startId);
}
Companion companion = INSTANCE;
companion.handleCommand(companion.commandFromString(stringExtra), mediaSession);
}
return super.onStartCommand(intent, flags, startId);
}
@Metadata(d1 = {"\u00002\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\t\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u0086\u0003\u0018\u00002\u00020\u0001:\u0001\u0010B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u000e\u0010\b\u001a\u00020\t2\u0006\u0010\n\u001a\u00020\u0004J\u0016\u0010\u000b\u001a\u00020\f2\u0006\u0010\r\u001a\u00020\t2\u0006\u0010\u000e\u001a\u00020\u000fR\u000e\u0010\u0003\u001a\u00020\u0004X\u0086T¢\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082T¢\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\u0004X\u0082T¢\u0006\u0002\n\u0000¨\u0006\u0011"}, d2 = {"Lcom/brentvatne/exoplayer/VideoPlaybackService$Companion;", "", "()V", "NOTIFICATION_CHANEL_ID", "", "SEEK_INTERVAL_MS", "", "TAG", "commandFromString", "Lcom/brentvatne/exoplayer/VideoPlaybackService$Companion$COMMAND;", "value", "handleCommand", "", "command", "session", "Landroidx/media3/session/MediaSession;", "COMMAND", "react-native-video_release"}, k = 1, mv = {1, 9, 0}, xi = 48)
public static final class Companion {
@Metadata(k = 3, mv = {1, 9, 0}, xi = 48)
public class WhenMappings {
public static final int[] $EnumSwitchMapping$0;
static {
int[] iArr = new int[COMMAND.values().length];
try {
iArr[COMMAND.SEEK_BACKWARD.ordinal()] = 1;
} catch (NoSuchFieldError unused) {
}
try {
iArr[COMMAND.SEEK_FORWARD.ordinal()] = 2;
} catch (NoSuchFieldError unused2) {
}
try {
iArr[COMMAND.TOGGLE_PLAY.ordinal()] = 3;
} catch (NoSuchFieldError unused3) {
}
try {
iArr[COMMAND.PLAY.ordinal()] = 4;
} catch (NoSuchFieldError unused4) {
}
try {
iArr[COMMAND.PAUSE.ordinal()] = 5;
} catch (NoSuchFieldError unused5) {
}
$EnumSwitchMapping$0 = iArr;
}
}
public Companion(DefaultConstructorMarker defaultConstructorMarker) {
this();
}
private Companion() {
}
@Metadata(d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0010\n\u0000\n\u0002\u0010\u000e\n\u0002\b\n\b\u0086\u0081\u0002\u0018\u00002\b\u0012\u0004\u0012\u00020\u00000\u0001B\u000f\b\u0002\u0012\u0006\u0010\u0002\u001a\u00020\u0003¢\u0006\u0002\u0010\u0004R\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006j\u0002\b\u0007j\u0002\b\bj\u0002\b\tj\u0002\b\nj\u0002\b\u000bj\u0002\b\f¨\u0006\r"}, d2 = {"Lcom/brentvatne/exoplayer/VideoPlaybackService$Companion$COMMAND;", "", "stringValue", "", "(Ljava/lang/String;ILjava/lang/String;)V", "getStringValue", "()Ljava/lang/String;", "NONE", "SEEK_FORWARD", "SEEK_BACKWARD", "TOGGLE_PLAY", "PLAY", "PAUSE", "react-native-video_release"}, k = 1, mv = {1, 9, 0}, xi = 48)
public static final class COMMAND {
private static final EnumEntries $ENTRIES;
private static final COMMAND[] $VALUES;
private final String stringValue;
public static final COMMAND NONE = new COMMAND("NONE", 0, "NONE");
public static final COMMAND SEEK_FORWARD = new COMMAND("SEEK_FORWARD", 1, "COMMAND_SEEK_FORWARD");
public static final COMMAND SEEK_BACKWARD = new COMMAND("SEEK_BACKWARD", 2, "COMMAND_SEEK_BACKWARD");
public static final COMMAND TOGGLE_PLAY = new COMMAND("TOGGLE_PLAY", 3, "COMMAND_TOGGLE_PLAY");
public static final COMMAND PLAY = new COMMAND("PLAY", 4, "COMMAND_PLAY");
public static final COMMAND PAUSE = new COMMAND("PAUSE", 5, "COMMAND_PAUSE");
private static final COMMAND[] $values() {
return new COMMAND[]{NONE, SEEK_FORWARD, SEEK_BACKWARD, TOGGLE_PLAY, PLAY, PAUSE};
}
public static EnumEntries<COMMAND> getEntries() {
return $ENTRIES;
}
public static COMMAND valueOf(String str) {
return (COMMAND) Enum.valueOf(COMMAND.class, str);
}
public static COMMAND[] values() {
return (COMMAND[]) $VALUES.clone();
}
private COMMAND(String str, int i, String str2) {
this.stringValue = str2;
}
public final String getStringValue() {
return this.stringValue;
}
static {
COMMAND[] $values = $values();
$VALUES = $values;
$ENTRIES = EnumEntriesKt.enumEntries($values);
}
}
public final COMMAND commandFromString(String value) {
Intrinsics.checkNotNullParameter(value, "value");
return Intrinsics.areEqual(value, COMMAND.SEEK_FORWARD.getStringValue()) ? COMMAND.SEEK_FORWARD : Intrinsics.areEqual(value, COMMAND.SEEK_BACKWARD.getStringValue()) ? COMMAND.SEEK_BACKWARD : Intrinsics.areEqual(value, COMMAND.TOGGLE_PLAY.getStringValue()) ? COMMAND.TOGGLE_PLAY : Intrinsics.areEqual(value, COMMAND.PLAY.getStringValue()) ? COMMAND.PLAY : Intrinsics.areEqual(value, COMMAND.PAUSE.getStringValue()) ? COMMAND.PAUSE : COMMAND.NONE;
}
public final void handleCommand(COMMAND command, MediaSession session) {
Intrinsics.checkNotNullParameter(command, "command");
Intrinsics.checkNotNullParameter(session, "session");
int i = WhenMappings.$EnumSwitchMapping$0[command.ordinal()];
if (i == 1) {
session.getPlayer().seekTo(session.getPlayer().getContentPosition() - 10000);
return;
}
if (i == 2) {
session.getPlayer().seekTo(session.getPlayer().getContentPosition() + 10000);
return;
}
if (i == 3) {
handleCommand(session.getPlayer().isPlaying() ? COMMAND.PAUSE : COMMAND.PLAY, session);
return;
}
if (i == 4) {
session.getPlayer().play();
} else if (i == 5) {
session.getPlayer().pause();
} else {
DebugLog.w(VideoPlaybackService.TAG, "Received COMMAND.NONE - was there an error?");
}
}
}
}