408 lines
16 KiB
TypeScript
408 lines
16 KiB
TypeScript
// Metro module 13590 (f13591).
|
|
import { NativeEventEmitter, NativeModules } from "react-native";
|
|
import EmbeddedActivitiesStore from "../../activities/EmbeddedActivitiesStore";
|
|
import VoicePanelStore from "../../voice_panel/VoicePanelStore";
|
|
import ChannelStore from "../../../stores/ChannelStore";
|
|
import MessageStore from "../../../stores/MessageStore";
|
|
import PermissionStore from "../../../stores/PermissionStore";
|
|
import AppStateStore from "../../../stores/native/AppStateStore";
|
|
import { AppStates } from "../../../Constants";
|
|
import { ActivityPanelModes } from "../../activities/panel/ActivityPanelConstants";
|
|
import { PLAYBACK_COMPLETION_DETECTION_TOLERANCE, PLAYBACK_PROGRESS_UPDATE_INTERVAL } from "../../media_panel/native/MediaPlaybackPanelConstants";
|
|
import { Permissions } from "../../../_bundle/Module505";
|
|
import Logger from "../../debug/Logger";
|
|
import { create } from "../../../_bundle/Module644";
|
|
import { batchUpdates } from "../../../_bundle/Module705";
|
|
import LifecycleManager from "../../../lib/LifecycleManager";
|
|
import { getRootNavigationRef } from "../../main_tabs_v2/RootNavigationRef.native";
|
|
import Dispatcher from "../../../Dispatcher";
|
|
import { isIOS } from "../../../utils/PlatformUtils";
|
|
import shallowEqual from "../../../_bundle/shallowEqual";
|
|
import MessageActionCreators from "../../../actions/MessageActionCreators";
|
|
import { getFocusedChannelId } from "../../panels/isChannelFocused.native";
|
|
import { $callWithNewTarget } from "../../../_hermes/prelude";
|
|
let c9437_16 = new Logger("MediaPlayerManager");
|
|
let c9437_17 = create((c20557_0) => ({
|
|
activeMediaPlayerSource: void 0,
|
|
mediaSourceMessage: void 0,
|
|
canAccessMedia: true,
|
|
isPlaying: false,
|
|
wasPipClosedByUser: false,
|
|
progress: void 0,
|
|
rate: 0,
|
|
showPip: false,
|
|
closePip: () => {
|
|
batchUpdates(() => c20557_0({
|
|
showPip: false
|
|
}));
|
|
},
|
|
displayedMediaItemIdsPerChannel: {},
|
|
currentlyDisplayedChannelId: void 0
|
|
}));
|
|
class MediaPlayerManager extends LifecycleManager {
|
|
subscriptions = [];
|
|
voicePanelStoreUnsubscribe = void 0;
|
|
showPipUnsubscribe = void 0;
|
|
pauseAndClosePip = this.pauseAndClosePip.bind(this);
|
|
handleVoicePanelStateUpdated = this.handleVoicePanelStateUpdated.bind(this);
|
|
handleEmbeddedActivitiesUpdated = this.handleEmbeddedActivitiesUpdated.bind(this);
|
|
handleMediaPlayerPlaybackRateChanged = this.handleMediaPlayerPlaybackRateChanged.bind(this);
|
|
handleMediaPlayerPlaybackSourceChanged = this.handleMediaPlayerPlaybackSourceChanged.bind(this);
|
|
handleMediaPlayerViewWillAppear = this.handleMediaPlayerViewWillAppear.bind(this);
|
|
handleMediaPlayerViewDidDisappear = this.handleMediaPlayerViewDidDisappear.bind(this);
|
|
updateDisplayState = this.updateDisplayState.bind(this);
|
|
updateMediaPermissions = this.updateMediaPermissions.bind(this);
|
|
constructor() {
|
|
super();
|
|
}
|
|
_initialize() {
|
|
const nativeEventEmitter = new NativeEventEmitter(NativeModules.MediaPlayerManager);
|
|
this.subscriptions = [nativeEventEmitter.addListener("MediaPlayerPlaybackSourceChanged", this.handleMediaPlayerPlaybackSourceChanged), nativeEventEmitter.addListener("MediaPlayerPlaybackProgressUpdated", this.handleMediaPlayerPlaybackProgressUpdated), nativeEventEmitter.addListener("MediaPlayerPlaybackRateChanged", this.handleMediaPlayerPlaybackRateChanged), nativeEventEmitter.addListener("MediaPlayerViewWillAppear", this.handleMediaPlayerViewWillAppear), nativeEventEmitter.addListener("MediaPlayerViewDidDisappear", this.handleMediaPlayerViewDidDisappear)];
|
|
NativeModules.MediaPlayerManager.subscribeToPlaybackEvents();
|
|
const rootNavigationRef = getRootNavigationRef();
|
|
if (rootNavigationRef != null) {
|
|
rootNavigationRef.addListener("state", this.updateDisplayState);
|
|
}
|
|
this.voicePanelStoreUnsubscribe = VoicePanelStore.subscribe(this.handleVoicePanelStateUpdated);
|
|
EmbeddedActivitiesStore.addChangeListener(this.handleEmbeddedActivitiesUpdated);
|
|
ChannelStore.addChangeListener(this.updateMediaPermissions);
|
|
PermissionStore.addChangeListener(this.updateMediaPermissions);
|
|
Dispatcher.subscribe("LOGOUT", this.userDidClosePip);
|
|
if (isIOS()) {
|
|
this.showPipUnsubscribe = c9437_17.subscribe((a0, a1) => {
|
|
if (a1.showPip && !a0.showPip) {
|
|
NativeModules.MediaPlayerManager.clearNowPlayingInfo();
|
|
} else if (a1.rate !== 0 && a0.rate === 0 && !a0.showPip && AppStateStore.getState() === AppStates.ACTIVE) {
|
|
NativeModules.MediaPlayerManager.clearNowPlayingInfo();
|
|
}
|
|
});
|
|
}
|
|
c9437_16.verbose("Initialized and subscribed to playback events");
|
|
}
|
|
updateMediaPermissions() {
|
|
batchUpdates(() => {
|
|
let r10 = c9437_17.getState().activeMediaPlayerSource?.channelId;
|
|
if (r10 == null) {
|
|
r10 = null;
|
|
}
|
|
const channel = ChannelStore.getChannel(r10);
|
|
if (channel != null && (!channel.isPrivate() && !PermissionStore.can(Permissions.VIEW_CHANNEL, channel))) {
|
|
c9437_17.setState({
|
|
canAccessMedia: false
|
|
});
|
|
this.pauseCurrentPlayer();
|
|
} else {
|
|
c9437_17.setState({
|
|
canAccessMedia: true
|
|
});
|
|
}
|
|
});
|
|
}
|
|
_terminate() {
|
|
this.subscriptions.forEach((subscription) => subscription.remove());
|
|
this.subscriptions = [];
|
|
const rootNavigationRef = getRootNavigationRef();
|
|
if (rootNavigationRef != null) {
|
|
rootNavigationRef.removeListener("state", this.updateDisplayState);
|
|
}
|
|
const voicePanelStoreUnsubscribe = this.voicePanelStoreUnsubscribe;
|
|
if (voicePanelStoreUnsubscribe != null) {
|
|
voicePanelStoreUnsubscribe.call(this);
|
|
}
|
|
const showPipUnsubscribe = this.showPipUnsubscribe;
|
|
if (showPipUnsubscribe != null) {
|
|
showPipUnsubscribe.call(this);
|
|
}
|
|
EmbeddedActivitiesStore.removeChangeListener(this.handleEmbeddedActivitiesUpdated);
|
|
ChannelStore.removeChangeListener(this.updateMediaPermissions);
|
|
PermissionStore.removeChangeListener(this.updateMediaPermissions);
|
|
Dispatcher.unsubscribe("LOGOUT", this.userDidClosePip);
|
|
}
|
|
pauseCurrentPlayer() {
|
|
NativeModules.MediaPlayerManager.pauseCurrentPlayer();
|
|
}
|
|
playCurrentPlayer() {
|
|
NativeModules.MediaPlayerManager.playCurrentPlayer();
|
|
}
|
|
userDidClosePip() {
|
|
batchUpdates(() => c9437_17.setState({
|
|
wasPipClosedByUser: true,
|
|
showPip: false
|
|
}));
|
|
}
|
|
pauseAndClosePip() {
|
|
batchUpdates(() => {
|
|
this.pauseCurrentPlayer();
|
|
c9437_17.setState({
|
|
wasPipClosedByUser: true,
|
|
showPip: false
|
|
});
|
|
});
|
|
}
|
|
handleVoicePanelStateUpdated() {
|
|
const state = VoicePanelStore.getState();
|
|
if (state.isVoicePanelFullscreen() || state.voicePanelsPIP.size > 0) {
|
|
this.pauseAndClosePip();
|
|
}
|
|
}
|
|
handleEmbeddedActivitiesUpdated() {
|
|
if (EmbeddedActivitiesStore.getActivityPanelMode() === ActivityPanelModes.PIP) {
|
|
this.pauseAndClosePip();
|
|
}
|
|
}
|
|
handleMediaPlayerPlaybackRateChanged({ source, rate }) {
|
|
batchUpdates(() => {
|
|
if (source == null) {
|
|
c9437_17.setState({
|
|
rate: 0,
|
|
isPlaying: false
|
|
});
|
|
}
|
|
c9437_16.verbose(`Playback rate changed to ${rate}: ${source?.id}`);
|
|
const state = c9437_17.getState();
|
|
const { activeMediaPlayerSource, isPlaying, wasPipClosedByUser } = state;
|
|
if (shallowEqual(activeMediaPlayerSource, source == null ? void 0 : source)) {
|
|
const r48 = isPlaying === false && rate > 0;
|
|
c9437_17.setState({
|
|
rate,
|
|
isPlaying: rate !== 0,
|
|
wasPipClosedByUser: r48 ? !r48 : wasPipClosedByUser
|
|
});
|
|
this.updateDisplayState();
|
|
return void 0;
|
|
}
|
|
this.handleMediaPlayerPlaybackSourceChanged({
|
|
source
|
|
});
|
|
this.handleMediaPlayerPlaybackRateChanged({
|
|
source,
|
|
rate
|
|
});
|
|
});
|
|
}
|
|
handleMediaPlayerPlaybackProgressUpdated({ source: source2, time, duration }) {
|
|
batchUpdates(() => {
|
|
const state = c9437_17.getState();
|
|
const activeMediaPlayerSource = state.activeMediaPlayerSource;
|
|
const r16 = source2 == null ? void 0 : source2;
|
|
L22: {
|
|
if (shallowEqual(activeMediaPlayerSource, r16)) {
|
|
const currentlyDisplayedChannelId = state.currentlyDisplayedChannelId;
|
|
if (!state.showPip) {
|
|
if (currentlyDisplayedChannelId == null) {
|
|
break L22;
|
|
}
|
|
if (currentlyDisplayedChannelId !== source2?.channelId) {
|
|
break L22;
|
|
}
|
|
}
|
|
const r22 = duration > 0;
|
|
let progress2 = void 0;
|
|
if (r22) {
|
|
let isCompleted = duration <= 0 ? void 0 : duration - time <= PLAYBACK_COMPLETION_DETECTION_TOLERANCE;
|
|
if (isCompleted == null) {
|
|
isCompleted = false;
|
|
}
|
|
progress2 = {
|
|
time,
|
|
duration,
|
|
isCompleted
|
|
};
|
|
}
|
|
const progress = state.progress;
|
|
if (!(progress != null && progress2 != null && Math.abs(progress2.time - progress.time) < PLAYBACK_PROGRESS_UPDATE_INTERVAL && progress2.time !== progress2.duration)) {
|
|
c9437_17.setState({
|
|
progress: progress2
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
handleMediaPlayerPlaybackSourceChanged({ source: source3 }) {
|
|
batchUpdates(() => {
|
|
const state = c9437_17.getState();
|
|
c9437_16.verbose(`Playback source changed: ${source3?.id}`);
|
|
let activeMediaPlayerSource = state.activeMediaPlayerSource;
|
|
if (activeMediaPlayerSource == null) {
|
|
activeMediaPlayerSource = void 0;
|
|
}
|
|
if (!shallowEqual(activeMediaPlayerSource, source3 == null ? void 0 : source3)) {
|
|
c9437_17.setState({
|
|
activeMediaPlayerSource: source3 == null ? void 0 : source3,
|
|
mediaSourceMessage: source3 != null ? this.getOrFetchMediaSourceMessage(source3) : void 0,
|
|
progress: void 0,
|
|
rate: 0,
|
|
isPlaying: false,
|
|
wasPipClosedByUser: false
|
|
});
|
|
this.updateMediaPermissions();
|
|
this.updateDisplayState();
|
|
}
|
|
});
|
|
}
|
|
getOrFetchMediaSourceMessage({ channelId: channelId3, messageId, assetUrl }) {
|
|
if (messageId != null && channelId3 != null) {
|
|
const message = MessageStore.getMessage(channelId3, messageId);
|
|
if (message != null) {
|
|
return message;
|
|
}
|
|
if (assetUrl != null) {
|
|
const r17 = MessageStore.getMessages(channelId3).toArray().find((item) => {
|
|
const contentMessage = item.getContentMessage();
|
|
const r2 = contentMessage == null;
|
|
let r8 = void 0;
|
|
if (!r2) {
|
|
const attachments = contentMessage.attachments;
|
|
r8 = attachments == null ? void 0 : attachments.some((attachment) => attachment.url === assetUrl);
|
|
}
|
|
return r8;
|
|
});
|
|
if (r17 != null) {
|
|
return r17;
|
|
}
|
|
}
|
|
MessageActionCreators.fetchMessage({
|
|
channelId: channelId3,
|
|
messageId
|
|
}).then((result) => {
|
|
if (result != null) {
|
|
this.handleMediaSourceMessageUpdated(result);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
handleMediaSourceMessageUpdated(mediaSourceMessage) {
|
|
batchUpdates(() => {
|
|
if (c9437_17.getState().activeMediaPlayerSource?.messageId === mediaSourceMessage.id) {
|
|
c9437_17.setState({
|
|
mediaSourceMessage
|
|
});
|
|
}
|
|
});
|
|
}
|
|
handleMediaPlayerViewWillAppear({ mediaItemIds, channelId }) {
|
|
batchUpdates(() => {
|
|
const displayedMediaItemIdsPerChannel = c9437_17.getState().displayedMediaItemIdsPerChannel;
|
|
let r7 = displayedMediaItemIdsPerChannel[channelId];
|
|
if (r7 == null) {
|
|
r7 = [];
|
|
}
|
|
displayedMediaItemIdsPerChannel[channelId] = new Set([...r7, ...mediaItemIds]);
|
|
c9437_17.setState({
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
this.updateDisplayState();
|
|
});
|
|
}
|
|
handleMediaPlayerViewDidDisappear({ mediaItemIds: mediaItemIds2, channelId: channelId2 }) {
|
|
batchUpdates(() => {
|
|
const displayedMediaItemIdsPerChannel = c9437_17.getState().displayedMediaItemIdsPerChannel;
|
|
const r9 = Set;
|
|
let r5 = displayedMediaItemIdsPerChannel[channelId2];
|
|
if (r5 == null) {
|
|
r5 = new Set();
|
|
}
|
|
const r27 = new r9([...r5].filter((item) => !mediaItemIds2.includes(item)));
|
|
if (r27.size === 0) {
|
|
delete displayedMediaItemIdsPerChannel[channelId2];
|
|
} else {
|
|
displayedMediaItemIdsPerChannel[channelId2] = r27;
|
|
}
|
|
c9437_17.setState({
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
this.updateDisplayState();
|
|
});
|
|
}
|
|
updateDisplayState() {
|
|
batchUpdates(() => {
|
|
const state = c9437_17.getState();
|
|
const { displayedMediaItemIdsPerChannel, currentlyDisplayedChannelId, activeMediaPlayerSource = {} } = state;
|
|
L27: {
|
|
const id = activeMediaPlayerSource.id;
|
|
const { wasPipClosedByUser, progress } = state;
|
|
let isPlaying = state.isPlaying;
|
|
const showPip = state.showPip;
|
|
if (wasPipClosedByUser) {
|
|
c9437_17.setState({
|
|
showPip: false
|
|
});
|
|
} else {
|
|
if (!isPlaying && !showPip) {
|
|
break L27;
|
|
}
|
|
if (!isPlaying) {
|
|
isPlaying = progress != null && !(progress.duration <= 0 ? void 0 : progress.duration - progress.time <= PLAYBACK_COMPLETION_DETECTION_TOLERANCE);
|
|
}
|
|
const focusedChannelId = getFocusedChannelId();
|
|
if (focusedChannelId != null && currentlyDisplayedChannelId !== focusedChannelId) {
|
|
for (const key in displayedMediaItemIdsPerChannel) {
|
|
if (key !== focusedChannelId) {
|
|
delete displayedMediaItemIdsPerChannel[key];
|
|
}
|
|
}
|
|
}
|
|
if (id != null) {
|
|
if (focusedChannelId != null) {
|
|
const r45 = displayedMediaItemIdsPerChannel[focusedChannelId];
|
|
if (r45 != null) {
|
|
if (isPlaying) {
|
|
isPlaying = !r45.has(id);
|
|
}
|
|
c9437_17.setState({
|
|
showPip: isPlaying,
|
|
currentlyDisplayedChannelId: focusedChannelId,
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
} else {
|
|
c9437_17.setState({
|
|
showPip: isPlaying,
|
|
currentlyDisplayedChannelId: focusedChannelId,
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
}
|
|
} else {
|
|
c9437_17.setState({
|
|
showPip: isPlaying,
|
|
currentlyDisplayedChannelId: focusedChannelId,
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
}
|
|
} else {
|
|
c9437_17.setState({
|
|
showPip: isPlaying,
|
|
currentlyDisplayedChannelId: focusedChannelId,
|
|
displayedMediaItemIdsPerChannel
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
const prototypeOf = Object.getPrototypeOf(MediaPlayerManager);
|
|
const r95 = Object.create(MediaPlayerManager.prototype);
|
|
const r97 = $callWithNewTarget(prototypeOf, r95, MediaPlayerManager);
|
|
const r98 = r97 instanceof Object ? r97 : r95;
|
|
r98.subscriptions = [];
|
|
r98.voicePanelStoreUnsubscribe = void 0;
|
|
r98.showPipUnsubscribe = void 0;
|
|
r98.pauseAndClosePip = r98.pauseAndClosePip.bind(r98);
|
|
r98.handleVoicePanelStateUpdated = r98.handleVoicePanelStateUpdated.bind(r98);
|
|
r98.handleEmbeddedActivitiesUpdated = r98.handleEmbeddedActivitiesUpdated.bind(r98);
|
|
r98.handleMediaPlayerPlaybackRateChanged = r98.handleMediaPlayerPlaybackRateChanged.bind(r98);
|
|
r98.handleMediaPlayerPlaybackSourceChanged = r98.handleMediaPlayerPlaybackSourceChanged.bind(r98);
|
|
r98.handleMediaPlayerViewWillAppear = r98.handleMediaPlayerViewWillAppear.bind(r98);
|
|
r98.handleMediaPlayerViewDidDisappear = r98.handleMediaPlayerViewDidDisappear.bind(r98);
|
|
r98.updateDisplayState = r98.updateDisplayState.bind(r98);
|
|
r98.updateMediaPermissions = r98.updateMediaPermissions.bind(r98);
|
|
export default r98;
|
|
export { c9437_17 as useMediaPlayerManagerStore };
|
|
export function isPlaybackComplete(a0) {
|
|
if (a0.duration <= 0) {
|
|
return void 0;
|
|
}
|
|
return a0.duration - a0.time <= PLAYBACK_COMPLETION_DETECTION_TOLERANCE;
|
|
}
|