导航菜单

页面标题

页面副标题

Glean v1.1.34 - VideoPlaybackService.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?");
            }
        }
    }
}