1 package expo.modules.av.player;
2 
3 import android.os.Bundle;
4 import androidx.annotation.NonNull;
5 import android.widget.MediaController;
6 
7 public class PlayerDataControl implements MediaController.MediaPlayerControl {
8   private final PlayerData mPlayerData;
9 
PlayerDataControl(final @NonNull PlayerData playerData)10   public PlayerDataControl(final @NonNull PlayerData playerData) {
11     mPlayerData = playerData;
12   }
13 
14   @Override
start()15   public void start() {
16     final Bundle map = new Bundle();
17     map.putBoolean(PlayerData.STATUS_SHOULD_PLAY_KEY_PATH, true);
18     mPlayerData.setStatus(map, null);
19   }
20 
21   @Override
pause()22   public void pause() {
23     final Bundle map = new Bundle();
24     map.putBoolean(PlayerData.STATUS_SHOULD_PLAY_KEY_PATH, false);
25     mPlayerData.setStatus(map, null);
26   }
27 
28   @Override
getDuration()29   public int getDuration() {
30     final Bundle status = mPlayerData.getStatus();
31     return (status.getBoolean(PlayerData.STATUS_IS_LOADED_KEY_PATH)
32         && status.containsKey(PlayerData.STATUS_DURATION_MILLIS_KEY_PATH))
33         ? status.getInt(PlayerData.STATUS_DURATION_MILLIS_KEY_PATH) : 0;
34   }
35 
36   @Override
getCurrentPosition()37   public int getCurrentPosition() {
38     final Bundle status = mPlayerData.getStatus();
39     return status.getBoolean(PlayerData.STATUS_IS_LOADED_KEY_PATH)
40         ? status.getInt(PlayerData.STATUS_POSITION_MILLIS_KEY_PATH) : 0;
41   }
42 
43   @Override
seekTo(final int msec)44   public void seekTo(final int msec) {
45     final Bundle map = new Bundle();
46     map.putDouble(PlayerData.STATUS_POSITION_MILLIS_KEY_PATH, (double) msec);
47     mPlayerData.setStatus(map, null);
48   }
49 
50   @Override
isPlaying()51   public boolean isPlaying() {
52     final Bundle status = mPlayerData.getStatus();
53     return status.getBoolean(PlayerData.STATUS_IS_LOADED_KEY_PATH)
54         && status.getBoolean(PlayerData.STATUS_IS_PLAYING_KEY_PATH);
55   }
56 
57   @Override
getBufferPercentage()58   public int getBufferPercentage() {
59     final Bundle status = mPlayerData.getStatus();
60     if (status.getBoolean(PlayerData.STATUS_IS_LOADED_KEY_PATH)
61         && status.containsKey(PlayerData.STATUS_DURATION_MILLIS_KEY_PATH)
62         && status.containsKey(PlayerData.STATUS_PLAYABLE_DURATION_MILLIS_KEY_PATH)) {
63       final double duration = status.getInt(PlayerData.STATUS_DURATION_MILLIS_KEY_PATH);
64       final double playableDuration = status.getInt(PlayerData.STATUS_PLAYABLE_DURATION_MILLIS_KEY_PATH);
65       return (int) (playableDuration / duration * 100.0);
66     } else {
67       return 0;
68     }
69   }
70 
71   @Override
canPause()72   public boolean canPause() {
73     return true;
74   }
75 
76   @Override
canSeekBackward()77   public boolean canSeekBackward() {
78     return true;
79   }
80 
81   @Override
canSeekForward()82   public boolean canSeekForward() {
83     return true;
84   }
85 
86   @Override
getAudioSessionId()87   public int getAudioSessionId() {
88     return mPlayerData.getAudioSessionId();
89   }
90 
isFullscreen()91   public boolean isFullscreen() {
92     return mPlayerData.isPresentedFullscreen();
93   }
94 
toggleFullscreen()95   public void toggleFullscreen() {
96     mPlayerData.toggleFullscreen();
97   }
98 }
99